본문 바로가기
개발 학습/블록체인

S4: ERC-721 함수

by StelthPark 2021. 11. 30.

ownerOf(uint256 tokenId)

tokenId가 반드시 존재해야하며,tokenId에 해당하는 nft소유자를 리턴한다.

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

 

setApprovalForAll(address operator, bool _approved)

오퍼레이터의 모든자산을 관리할수 있는 권한을 부여/제거할 수 있다.

   function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

오퍼레이터 주소와 권한(true/false)를 인자로 받아 _setApprovalForAll에 오너주소와, 오퍼레이터주소, 권한값을 보낸다

    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

require 구문으로 owner와 operator가 같은지 검사한다. 오너는 자신을 제외한 다른 주소에게 권한을 주므로 이를 검증한뒤 _operatorApprovals객체는 오너와 오퍼레이터를 매칭해주고 권한을 준 상태면 true 아니면 false를 담고있다. 마지막으로 emit을 통해 이벤트를 발생시킨다.

 

isApprovedForAll(address owner, address operator)

오퍼레이터에게 오너의 모든 자산을 관리할 수 있는 권한 여부 를 리턴한다.

 

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

 

getApproved(unit256 tokenId)

tokenId가 반드시 존재해야하며 현재 오너로 부터 권한을 받은 오퍼레이터의 주소(account)를 반환해준다.

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

 

ERC-165

ERC165는 ERC-721스마트 컨트랙트를 생성 할 때 반드시 구현해야하는 Interface를 검사하고 언제사용하는지 감지한다.

supportsInterface(bytes4 interfaceID)bool 만 가지고 있습니다. 이 함수의 파라미터ERC-721의 인터페이스 ID를 입력해야만, ERC-721 스마트 컨트랙트가 정상적으로 동작합니다

pragma solidity ^0.4.20;

interface ERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

 

ERC-721의 인터페이스 ID 생성

    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor () public {
        // ERC165를 통한 ERC721의 확인을 위한 지원 인터페이스 등록
        _registerInterface(_INTERFACE_ID_ERC721);
    }

 

tokenURI(uint256 tokenId)

이 함수는 IERC721Metadata에 작성되어 있는 함수로 tokenId를 입력받아 URI를 리턴한다

NFT에는 이름,설명,이미지URI등 을 포함하는 JSON파일의 형태를 저장한 URI를 입력한다.

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

tokenId가 있는지 검사하고 있다면 함수 _baseURI를 실행하여 baseURI 가 있는지 length길이로 검사한뒤 baseURI와 tokenId를 합친 문자열을 삼항연산자에 따라 나타낸다.

 

tokenByIndex(uint256 index)

이 함수는 IERC721Enumerable에 작성되어 있는 함수로 컨트랙트에 의해 저장된 모든 토큰을 index 기반으로 tokenID를 리턴한다.

즉 저장된 모든 토큰중 n번째 토큰의 ID 리턴

*totalSupply와 함께 사용하여 모든 토큰 열거

 

tokenOfOwnerByIndex(address owner, uint256 index)

이 함수는 IERC721Enumerable에 작성되어 있는 INDEX기반으로 오너가 소유한 토큰의 tokenID를 리턴한다.

즉 오너가 소유한 N번째 토큰의 ID를 리턴

*balanceOf와 함께 사용하여 오너의 모든 토큰 열거

댓글