-
-
Save restart916/47ec3e6e7653fb86c7b3dbd86bbecb12 to your computer and use it in GitHub Desktop.
2차과제_공통_이용상_2팀
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; | |
contract NFTSimple { | |
uint256 private totalSypply = 10; | |
string public name = "willy"; | |
string public symbol = "WL"; | |
mapping (uint256 => address) public tokenOwner; | |
mapping (uint256 => string) public tokenURIs; | |
// 소유한 토근 리스트 | |
mapping (address => uint256[]) private _ownedTokens; | |
// onKIP17Received bytes value | |
bytes4 private constant _KIP17_RECEIVED = 0x6745782b; | |
// mint (tokenId, uri, owner | |
// transferfrom (from, to, tokenId) -> owner 가 바뀌는것 (from -> to) | |
function mintWithTokenIRI(address to, uint256 tokenId, string memory tokenURI) public returns (bool) { | |
// to 에게 kokenId를 발행하겠다 | |
// 적힐 글자는 tokenURI | |
tokenOwner[tokenId] = to; | |
tokenURIs[tokenId] = tokenURI; | |
// add token to the list | |
_ownedTokens[to].push(tokenId); | |
return true; | |
} | |
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { | |
require(from == msg.sender, "from != msg.sender"); | |
require(from == tokenOwner[tokenId], "not the owner of the token"); | |
_removeTokenFromList(from, tokenId); | |
_ownedTokens[to].push(tokenId); | |
tokenOwner[tokenId] = to; | |
// 만약에 받는 쪽이 실행할 코드가 있는 스마트 컨트랙트이면 코드를 실행할 것 | |
require( | |
_checkOnKIP17Received(from, to, tokenId, _data), "KIP17: ~~" | |
); | |
} | |
function _checkOnKIP17Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { | |
bool success; | |
bytes memory returndata; | |
if (!isContract(to)) { | |
return true; | |
} | |
(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; | |
} | |
function isContract(address account) internal view returns (bool) { | |
uint256 size; | |
assembly { size := extcodesize(account)} | |
return size > 0; | |
} | |
function _removeTokenFromList(address from, uint256 tokenId) private { | |
uint256 lastTokenIndex = _ownedTokens[from].length - 1; | |
for (uint256 i=0; i<_ownedTokens[from].length; i ++ ) { | |
if (tokenId == _ownedTokens[from][i]) { | |
// swap | |
_ownedTokens[from][i] = _ownedTokens[from][lastTokenIndex]; | |
_ownedTokens[from][lastTokenIndex] = 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; | |
} | |
function balanceOf(address owner) public view returns (uint256) { | |
require( | |
owner != address(0), | |
"KIP17: balance query for the zero address" | |
); | |
return _ownedTokens[owner].length; | |
} | |
} | |
contract NFTMarket { | |
mapping (uint256 => address) public seller; | |
function buyNFT(uint256 tokenId, address NFTaddress) public payable returns (bool) { | |
// 구매한 사람에게 0.01 klay 전송 | |
address payable receiver = address(uint256(seller[tokenId])); | |
// send 0.01 KLAY to receiver | |
// 10 ** 18 PEB = 1 KLAY | |
// 10 ** 16 PEB = 0.01 KLAY | |
receiver.transfer(10 ** 16); | |
NFTSimple(NFTaddress).safeTransferFrom(address(this), msg.sender, tokenId, "0x00"); | |
return true; | |
} | |
// market 이 토큰을 받았을때, 판매자가 누구인지 기록해야함 | |
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)")); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment