OpenZepplin의 ERC155 비고(제작 중)
요컨대
설명
우선 중요한 점.
// Mapping from token ID to account balances
mapping(uint256 => mapping(address => uint256)) private _balances;
tokenID에 대한 (address=>uint256) 맵이 있습니다.이런 인상
ERC1155
ERC20, ERC721 이미지
ERC20
ERC721
코드
Batch 정보
ERC 721 등과 비교하면 ERC 1155는 코드에 Batch가 있는 함수가 몇 개 존재한다.
ERC 1155의 목적은 하나의 프레임으로 여러 종류의 영패를 처리할 수 있는 동시에 한 번에 여러 종류의 영패를 송금하고 옮길 수 있기 때문에 기체를 절약할 수 있다는 것이다.
그걸 실현하기 위해 Batch라는 방법을 정의했어요.
URI
cons tructor에 ui를 설정했습니다.
constructor(string memory uri_) {
_setURI(uri_);
}
설정된 URI를 uri()
를 통해 가져옵니다.doc에 적힌 것처럼 id를 설정하고 되돌려주는 등 조금만 바꿔야 합니다.
/**
* @dev See {IERC1155MetadataURI-uri}.
*
* This implementation returns the same URI for *all* token types. It relies
* on the token type ID substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256) public view virtual override returns (string memory) {
return _uri;
}
이런 느낌.set한 ui와 영패의 ID를 결합시켜 되돌려줍니다.
function uri(uint256 id) public view virtual override returns (string memory) {
return Strings.strConnect(_uri, Strings.toString(id));
}
/**
* 引数の文字列を結合して返す
* @param str1 string
* @param str2 string
* @return string memory
*/
function strConnect(string memory str1, string memory str2) internal pure returns (string memory) {
bytes memory strbyte1 = bytes(str1);
bytes memory strbyte2 = bytes(str2);
bytes memory str = new bytes(strbyte1.length + strbyte2.length);
uint8 point = 0;
for(uint8 j = 0; j < strbyte1.length;j++){
str[point] = strbyte1[j];
point++;
}
for(uint8 k = 0; k < strbyte2.length;k++){
str[point] = strbyte2[k];
point++;
}
return string(str);
}
balanceOf
balance Of 보유 수량만 반환
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
require(account != address(0), "ERC1155: address zero is not a valid owner");
return _balances[id][account];
}
그나저나 balanceOfBatch
도 준비됐어요. 차이점은address와 id에 맡길 수 있는 곳이에요. function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
public
view
virtual
override
returns (uint256[] memory)
{
require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
mint
function _mint(
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
_balances[id][to] += amount;
emit TransferSingle(operator, address(0), to, id, amount);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
}
Reference
이 문제에 관하여(OpenZepplin의 ERC155 비고(제작 중)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/mkurita/articles/9b64ede2d4e919텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)