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와 함께 사용하여 오너의 모든 토큰 열거
'개발 학습 > 블록체인' 카테고리의 다른 글
S4: KIP17 ganache와 baobab에 배포 (0) | 2021.12.01 |
---|---|
S4: mintNFT함수 (NFT 발행) (0) | 2021.11.30 |
S4: 토큰 LOCK 설정 및 제거 (0) | 2021.11.29 |
S4: public 함수 중 관리자만 접근가능함수 OwnerHelper (0) | 2021.11.26 |
S4: Over/Under flow를 막아주는 SafeMath (0) | 2021.11.26 |
댓글