OpenZepplin의 ERC155 비고(제작 중)

4590 단어 Solidityerc1155tech

요컨대


https://github.com/mk1018/openzeppelin-contracts/tree/master/contracts/token/ERC1155

설명


우선 중요한 점.


// 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);
    }

좋은 웹페이지 즐겨찾기