-
-
Save dwook/49c0444ee8814d055bbedf8f7262e98c to your computer and use it in GitHub Desktop.
팀부문 Smart Contract
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; | |
contract LoveChainSimple { | |
string public name = "LoveChain"; | |
string public symbol = "LC"; | |
mapping (uint256 => address) public tokenOwner; | |
mapping (uint256 => string) public tokenCoupleName; | |
mapping (uint256 => uint256) public tokenLevel; | |
mapping (uint256 => string) private _tokenImageURIs; | |
mapping (address => uint256[]) private _ownerTokens; | |
bytes4 private constant _KIP17_RECEIVED = 0x6745782b; | |
function mintWithImageURI(address to, uint256 tokenId, uint256 level, string memory imageURI) public returns (bool) { | |
tokenOwner[tokenId] = address(to); | |
_tokenImageURIs[tokenId] = imageURI; | |
tokenLevel[tokenId] = level; | |
_ownerTokens[address(to)].push(tokenId); | |
return true; | |
} | |
function safeTransferFromLevelOneToken(address from, address to, uint256 tokenId, string memory name1, string memory name2, bytes memory _data) public { | |
// 기본 (이름만 기록할 수 있는) 토큰(레벨 1) 전송 함수 | |
require(from == msg.sender, "from != msg.sender"); | |
require(from == tokenOwner[tokenId], "you are not the owner of the token"); | |
require(tokenLevel[tokenId] == 1, "you are not level 1 token's owner"); | |
_removeTokenFromList(from, tokenId); | |
_ownerTokens[to].push(tokenId); | |
tokenOwner[tokenId] = to; | |
_lockingCoupleName(tokenId, name1, name2); | |
require( | |
_checkOnKIP17Received(from, to, tokenId, _data), "KIP17: transfer to non KIPReceiver 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; | |
} | |
(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 { | |
for (uint256 i = 0; i < _ownerTokens[from].length; i++) { | |
if (tokenId == _ownerTokens[from][i]) { | |
_ownerTokens[from][i] = _ownerTokens[from][_ownerTokens[from].length - 1]; | |
break; | |
} | |
} | |
_ownerTokens[from].length--; | |
} | |
function _lockingCoupleName(uint256 tokenId, string memory name1, string memory name2) private { | |
tokenCoupleName[tokenId] = string(abi.encodePacked(name1, "&", name2)); | |
} | |
function ownedTokens(address owner) public view returns (uint256[] memory) { | |
return _ownerTokens[owner]; | |
} | |
function coupleNamesOf(uint256 tokenId) public view returns (string memory) { | |
// 토큰 소유 커플의 이름을 보여주는 함수 | |
return tokenCoupleName[tokenId]; | |
} | |
} | |
contract NSeoulTowerMarket { | |
mapping (uint256 => address) public seller; | |
function buyLevelOneLoveChain(uint256 tokenId, address NFTAddress, string memory name1, string memory name2) public payable returns (bool) { | |
// 기본 (이름만 기록할 수 있는) 토큰(레벨 1) 구매 함수 | |
// name1, name2 를 입력받아서 스마트 컨트랙트 LoveChainSimple에 기록한다. | |
address payable receiver = address(uint256(seller[tokenId])); | |
receiver.transfer(10 ** 16); | |
LoveChainSimple(NFTAddress).safeTransferFromLevelOneToken(address(this), msg.sender, tokenId, name1, name2, "0x00"); | |
return true; | |
} | |
function onKIP17Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4) { | |
require(tokenId <= 500, "This token is not placed in NSeoulTower"); // 마켓이 받은 NFT가 남산타워의 것이 맞는지? | |
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