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를 전송