Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

번개멍

_mint vs _safeMint 차이점 본문

코딩이야기/blockchain

_mint vs _safeMint 차이점

번개멍 2022. 12. 23. 17:51

 

 function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

둘의 차이는 safeMint의 경우 mint 하려고 하는 address가 실제로 존재하는지 체크 하는 로직이 구현되어있다.

_safeMint가 실행 되면 토큰이 전송된 후에 _checkOnERC721Received 함수가 호출되고 정상적으로 이루어지지 않을경우에는 트랜잭션을 되돌리게 됩니다.

   function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }
    
    
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

 

 

'코딩이야기 > blockchain' 카테고리의 다른 글

Web3j  (0) 2023.10.24
SmartContract 프레임워크 선택  (0) 2022.12.13
ERC20 토큰 발행 및 ERC721 NFT 발행  (0) 2022.11.21
Comments