BlockChain
(BlockChain) Token Swap
JJeongHyun
2023. 3. 13. 16:12
반응형
TokenSwap
- 토큰을 다른 토큰으로 변경하는 것
- 보통 이전 토큰을 새로운 토큰으로 교환
- 거래소에서 '스왑기간', '스왑 지원 거래소', '마이그레이션 지원' 등으로 토큰 스왑 기능 지원을 표기
- 토큰 업데이트 및 재정적 이익을 얻을 수 있다
- 한 블록체인에서 다른 블록체인으로 두 당사자간의 토큰 유형 교환
- 이러한 교환은 토큰 교환 플랫폼에서 가능
폴더 및 라이브러리 설치
mkdir swap
cd swap
npm init -y
npm i truffle @openzeppelin/contracts
npm i -D prettier-plugin-solidity
contract EthSwap
- 토큰의 변경을 위해 사용하기에 거래 관련 내용만 존재
- address(스마트 컨트랙트) : 전달된 스마트 컨트랙트의 CA를 반환
ERC20 public token;
- 기존에 만든 토큰을 저장하여 사용
uint public rate = 100;
- 1Ether = 100 Token
constructor(ERC20 _token) {
token = _token;
}
- ERC20 토큰 생성 시 CA를 받아서 바로 생성
- 컨트랙트 CA를 EthSwap 컨트랙트 생성자 매개변수로 전달되어서 배포 시 token 변수에 CA값을 할당
- deployer.deploy("token", "CA 전달")
function getToken() public view returns (address) {
return address (token);
}
- 토큰을 받아 온다, CA 반환
- EthSwap 컨트랙트와 상호작용 중인 컨트랙트의 CA를 반환
function getSwapBalance() public view returns (uint) {
return token.balanceOf(msg.sender);
}
- 트랜잭션 보낸 계정의 토큰 잔액을 확인
function getThisAddress() public view returns (address) {
return msg.sender;
}
- EthSwap 컨트랙트를 실행 시킨 사람의 계정 주소값을 반환
function getTokenOwner public view returns (address) {
return token._owner;
}
- 토큰 배포자를 반환, 즉 토큰에 대한 스마트 컨트랙트 등록
function buyToken() public payable {
uint256 tokenAmount = msg.value * rate;
require(token.balanceOf(address(this)) >= tokenAmount);
token.transfer(msg.sender, tokenAmount);
}
- function buyToken() :Ether를 통해 토큰을 구매
- uint256 tokenAmount = msg.value * rate : Ether를 토큰으로 바꿔주다
require(token.balanceOf(address(this)) >= tokenAmount) : 현재 컨트랙트의 토큰이 트랜잭션 보낸 계정에 줄 만큼 확인 - token.transfer(msg.sender, tokenAmount) : 토큰을 보낸다
function sellToken(uint256 _amount) public payable {
require(token.balanceOf(msg.sender) >= _amount);
uint256 etherAmount = _amount / rate;
require(address(this).balance >= etherAmount);
token.transferFrom(msg.sender, address(this), _amount);
payable(msg.sender).transfer(etherAmount);
}
- function sellToken(uint256 _amount) : 토큰으로 Ether를 구매
- require(token.balanceOf((msg.sener) >= _amount) : 구매 전 보낸 계정쪽으로 구매할 수 있는 잔액이 있는지 확인
- uint 256 etherAmount = _amount / rate : 토큰을 기준으로 Ether를 계산
- require(address(this).balance >= etherAmount)
token.transferFrom(msg.sender, address(this), _amount)
payable(msg.sender).transfer(etherAmount) : 현재 컨트랙트에 ether가 있는지 확인하고 트랜잭션을 보낸 계정에서 컨트랙트로 토큰을 발송, 이후 Ether를 전송