Created
January 16, 2022 10:16
-
-
Save jennharw/16f1041407226b79b8d0069db5bb24e7 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.5.5+commit.47a71e8f.js&optimize=false&runs=200&gist=
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity >=0.4.24 <0.5.6; | |
//0.5.6 | |
contract NFTSimple { //Simple NFG | |
string public name = "KlayLion"; | |
string public symbol = "KL"; // 단위 | |
//mint 발행 (tokenId, uri, owner) | |
//transform 전송 (from, to , uri) | |
mapping (uint256 => address) public tokenOwner; | |
mapping (uint256 => string) public tokenURIs; //map | |
//배열 소유한 토큰 리스트 | |
mapping(address => uint256[]) private _ownedTokens; | |
//onKIP17Received bytes value | |
bytes4 private constant _KIP17_RECEIVED = 0x6745782b; | |
function mintWithTokenUri(address to, uint256 tokenId, string memory tokenURI) public returns (bool) { | |
tokenOwner[tokenId] = to; //msg.sender 에게 토큰 id 발행 | |
tokenURIs[tokenId] = tokenURI; //글자 | |
_ownedTokens[to].push(tokenId); //add Token to the list | |
return true; | |
} | |
function safeTransferform(address from, address to, uint256 tokenId, bytes memory _data) public { | |
require(from == msg.sender, "from != msg.sender"); //조건 | |
require(from == tokenOwner[tokenId], "you are not the owner of the token"); | |
_removeTokenFromList(from, tokenId); | |
_ownedTokens[to].push(tokenId); | |
tokenOwner[tokenId] = to; | |
//전송했을 때 받는 쪽이 실행할 코드가 있는 스마트컨트랙트라면 코드를 실행할 것 | |
require( | |
_checkOnKIP17Received(from, to, tokenId, _data), "KIP17: transfer to non KIP17Receiver implementer" | |
); | |
} | |
function _checkOnKIP17Received(address from , address to, uint256 tokenId, bytes memory _data) internal returns (bool){ | |
bool success; | |
bytes memory returndata; | |
//스마트 컨트랙트인지 확인 | |
if (!isContract(to)){ | |
return true; | |
} | |
//to //NFTMarket의 onKIP17Received | |
(success, returndata) = to.call( | |
abi.encodeWithSelector( | |
_KIP17_RECEIVED, | |
msg.sender, | |
from, | |
tokenId, | |
_data | |
) | |
); | |
if ( | |
returndata.length != 0 && | |
abi.decode(returndata, (bytes4)) == _KIP17_RECEIVED | |
) { | |
return true; | |
} | |
return false; | |
} | |
//주소에 code 가 있으면 스마트 컨트랙트 | |
function isContract(address account) internal view returns (bool){ | |
uint256 size; | |
assembly { size := extcodesize(account) } | |
return size > 0; | |
} | |
function _removeTokenFromList(address from, uint256 tokenId) private{ | |
//_ownedTokens[from] | |
//맨 뒤랑 바꾸고, 자르기 | |
uint256 lastTokenIdex = _ownedTokens[from].length-1; | |
for (uint256 i = 0 ; i <= _ownedTokens[from].length; i ++){ | |
if (tokenId == _ownedTokens[from][i]) { | |
// var temp = _ownedTokens[from][i]; //swap | |
_ownedTokens[from][i] = _ownedTokens[from][lastTokenIdex]; | |
_ownedTokens[from][lastTokenIdex] = tokenId ; | |
break; | |
} | |
} | |
_ownedTokens[from].length--; | |
} | |
function ownedTokens(address owner) public view returns (uint256[] memory) { | |
return _ownedTokens[owner]; | |
} | |
function setTokenUri(uint256 id, string memory uri) public { | |
tokenURIs[id] = uri; | |
} | |
} | |
contract NFTMarket { | |
//nft 미술품 | |
//판매자(누가 NFT를 마켓에 보냈는가) 기록 sell | |
mapping(uint256 => address) public seller; | |
function buyNFT(uint256 tokenId, address NFTAddress) public payable returns (bool) { | |
//구매? 판매? 사람한테 0.01 klay 보내야, 전송 | |
address payable receiver = address(uint160(seller[tokenId])); | |
receiver.transfer(10 ** 16); //buyNFT실행한 사람이 보내야 | |
// // // 10 ** 18 PEB = 1 Klay | |
// 10 ** 16 PEB = 0.01 | |
NFTSimple(NFTAddress).safeTransferform(address(this), msg.sender, tokenId, "0x00"); | |
return true; //구매자 (token이 구매자에게 간다. (buy) | |
} | |
//Market이 Token을 받았을 때(판매대에 올라왔을 때), 판매자가 누구인지 기록해야 | |
function onKIP17Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4){ | |
seller[tokenId] = from; | |
return bytes4(keccak256("onKIP17Received(address,address,uint256,bytes)")); //실행 할 함수 0x6745782b 를 보면 토큰 받았을 경우 실행할 함수 가 존재함을확인? | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment