Skip to content

Instantly share code, notes, and snippets.

@dwook
Last active February 5, 2022 13:17
Show Gist options
  • Save dwook/49c0444ee8814d055bbedf8f7262e98c to your computer and use it in GitHub Desktop.
Save dwook/49c0444ee8814d055bbedf8f7262e98c to your computer and use it in GitHub Desktop.
팀부문 Smart Contract
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