반응형
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "MintAnimalToken.sol";
contract SaleAnimalToken {
MintAnimalToken public mintAnimalTokenAddress;
//디플로이 주소값을 담는다.
constructor (address _mintAnimalTokenAddress) {
mintAnimalTokenAddress = MintAnimalToken(_mintAnimalTokenAddress);
}
mapping(uint256 => uint256) public animalTokenPrices;
//가격관리 맵핑
uint256[] public onSaleAnimalTokenArray;
//FE 에서 사용할 배열. 판매중이 토큰 확인용
function setForSaleAnimalToken(uint256 _animalTokenId, uint256 _price) public {
//판매 등록 함수
address animalTokenOwner = mintAnimalTokenAddress.ownerOf(_animalTokenId);
require(animalTokenOwner == msg.sender, "Caller is not animal token owner");
//함수 실행 사람이 토큰의 주인이 맞는지
require(_price > 0 , "Price is zero or lower");
require(animalTokenPrices[_animalTokenId] == 0, "This animal token is already on sale.");
require(mintAnimalTokenAddress.isApprovedForAll(animalTokenOwner, address(this)), "Animal token owner did not approve token.");
//스마트컨트랙트 판매권한 여부를 확인
animalTokenPrices[_animalTokenId] = _price;
onSaleAnimalTokenArray.push(_animalTokenId);
}
}
알고리즘
- MintAnimalToken 장부를 먼저 Deploy 해야한다.
- Deploy 된 장부의 주소값을 인자로 등록한다.
- setForSaleAnimalToken 함수
- 등록할 토큰의 ID 를 가진 주인의 주소를 불러온다.
- 함수를 실행하는 사람이 msg.sender 가 주인이 맞는지 확인한다.
- 가격이 0 초과인지 확인한다.
- 판매등록이 되지 않은 상품인지 확인한다.
- 해당 장부가 판매등록이 허가가 된 장부인지 확인한다.
- 배열에 판매등록을 한다.
function purchaseAnimalToken(uint256 _animalTokenId) public payable {
//payble 을 붙여야 matic 이 왔다갔다하는 함수를 실행할 수 있다.
uint256 price = animalTokenPrices[_animalTokenId];
address animalTokenOwner = mintAnimalTokenAddress.ownerOf(_animalTokenId);
require(price > 0, "Animal Token not sale.");
require(price <= msg.value, "Caller sent lower than price.");
//함수를 실행할때 보내는 MATIC 의 양이 같거나 큰지 확인
require(animalTokenOwner != msg.sender, "Caller is animal Token owner");
payable(animalTokenOwner).transfer(msg.value);
//가격만큼의 양이 돈의 주인으로 보내진다.
mintAnimalTokenAddress.safeTransferFrom(animalTokenOwner, msg.sender, _animalTokenId);
animalTokenPrices[_animalTokenId] = 0;
for(uint256 i = 0; i<onSaleAnimalTokenArray.length;i++){
if(animalTokenPrices[onSaleAnimalTokenArray[i]] == 0){
onSaleAnimalTokenArray[i] = onSaleAnimalTokenArray[onSaleAnimalTokenArray.length -1];
onSaleAnimalTokenArray.pop();
//맨뒤랑 바꿔서 맨뒤 삭제
}
}
}
//읽기 전용 FE 함수
//판매중인 리스트 확인용
function getOnSaleAnimalTokenArrayLength() view public returns (uint256){
return onSaleAnimalTokenArray.length;
}
알고리즘
- payable 을 사용해야 구입 판매 함수를 사용할 수 있다.
- 구매할 토큰의 ID 와 토큰 주인의 주소를 불러온다.
- 토큰의 판매여부를 확인
- 구매자가 보낸 금액이 토큰 가격보다 크거나 같은지 확인
- 구매자가 판매자와 동일한지 확인
- payable 함수를 이용해 msg.value 에 저장된 금액을 판매자로 송금
- 판매된 토큰을 배열에서 제거
후기
- Solidity 언어를 많이 다룰줄 알았는데 아닌것같다. 그래도 대충 하는 법을 익힌듯 해서 얼른 만들어버리고 다른 강의 들어야겠다.
전체 알고리즘
반응형
'BlockChain > Solidity' 카테고리의 다른 글
[DP/NFT] 4. 리액트 세팅 (0) | 2022.09.05 |
---|---|
[DP/NFT] 2. Minting contract 작성 (0) | 2022.09.05 |
[DP/NFT] 1. Install Solidity & Metamask (0) | 2022.08.25 |