번개멍
_mint vs _safeMint 차이점 본문
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