ERC721

EIP 문서

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 인터페이스를 따라야 한다. 즉, 리시브 훅을 구현해야 한다.
  • 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