ERC721
MUST
- erc165를 반드시 따라야 한다 (supportsInterface)
Transfer이벤트: 토큰 이동, 소각, 발행 시 이벤트를 발생시켜야 한다. 예외적으로, 컨트랙트 생성 시점에 NFT를 발행한다면 이벤트를 발생하지 않아도 된다. 토큰 이동 시 기존 approval을 해제해야 한다.balanceOf: 해당 주소가 가지고 있는 NFT 개수를 리턴함.address(0)는 invalid 로 취급하여 에러를 던져야 한다.ownerOf:address(0)소유의 tokenId는 주인이 없는(invalid) 것으로 취급하여 에러를 던져야 한다.transfer:address(0)에게는 토큰을 전송할 수 없다.safeTransferFrom: 수신자가 컨트랙트라면onERC721Received훅을 호출한다. 훅에서bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))를 리턴하지 않으면 revert 시킨다.- NFT를 받을 컨트랙트는
safeTransferFrom을 지원하려면 반드시ERC721TokenReceiver인터페이스를 따라야 한다. 즉, 리시브 훅을 구현해야 한다.
- NFT를 받을 컨트랙트는
approve: NFT 소유자 또는 (전체 권한) 허용된 유저만 호출 가능해야 한다.setApprovalForAll: 해당 계정의 모든 NFT 권한을 위임할 수 있다. 한 명의 owner가 여러명의 operator를 가질 수 있어야 한다.getApproved: 유효하지 않은 tokenId로 쿼리할 경우 revert 해야 한다.- NFT ID는
uint256타입이며, ID는 블랙박스 취급(규칙 예측 X)해야 한다.
SHALL
- 각 NFT의 ID는 컨트랙트 수명 동안 변경되지 않는다.
- NFT ID 번호에 패턴이 있다고 가정해서는 안된다. (보통 0부터 시작하여 1씩 증가하는 값을 사용하지만)
MAY
- NFT는 invalid 될 수 있다 (소각될 수 있다.)
OPTIONAL
- Metadata extension 을 구현하여 NFT의 이름, 심볼, tokenURI 을 제공한다.
tokenURI조회 시tokenId가 유효하지 않다면 revert 한다.
tags: blockchain, nft, smart contract