Skip to content

Instantly share code, notes, and snippets.

@jennharw
Created January 16, 2022 10:16
Show Gist options
  • Save jennharw/16f1041407226b79b8d0069db5bb24e7 to your computer and use it in GitHub Desktop.
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=
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