간단한 토큰 스왑

0

블록체인

목록 보기
5/5
post-thumbnail

목표 : 간단한 토큰발행과 erc20 스왑기능 컨트렉트를 상호작용하는 것을 목표로 진행하였다.

CA : 계약계정. 스마트컨트렉트 역할 가능
Ex) EOA가 보낸 메세지를 CA가 수신할 때마다 자신의 코드를 활성화

토큰컨트렉트는 이더리움 네트워크에 배포를 하고 후에 스왑컨트렉트와 상호작용을 합니다.

(참고: 솔리디티에서 함수는 언제나 컨트랙트 외부에서 호출됩니다. 컨트랙트는 누군가가 컨트랙트의 함수를 호출할 때까지 블록체인 상에서 아무 것도 하지 않고 있어, 외부에서 함수를 호출하기 위해 msg.sender가 필요합니다.)

원리: ethswap CA컨트렉트에 일정량 이상의 토큰을 넣고 다시 지급하는 역할로 스왑을 담당한다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";

contract Ethswap {

    ERC20 public token;     //ERC20 token이라는 토큰 변수
    uint public  rate = 100;
    
    constructor(ERC20 _token){
        token = _token;
    }

    function getToken() public view returns(address) {
        //getToken은 CA값을 리턴하는 함수, token상태변수를 address형으로 변경
        return address(token); //Aiden token CA
    }

    function getSwapBalance() public view returns (uint) {
        return token.balanceOf(msg.sender); //토큰 CA와 상호작용으로 토큰 자체 balanceOf함수로 잔액호출
    }

    function getThisAddress() public view returns (address) {
        return address(this); //this = ethswap CA를 구하기 위함
    }
    
    function getMsgSender() public view returns (address){
        return msg.sender; //이더를 실행시킨사람, txObject 참고
    }

    // function getTokenOwner() public view returns(address){
    //     return token.getTokenOwner(msg.sender);
    // }
    function buytoken() public payable {
        uint256 tokenAmount = msg.value * rate;
        require(token.balanceOf(address(this)) >= tokenAmount, "ERROR [1]");
        token.transfer(msg.sender, tokenAmount);
    }

    function sellToke(uint256 _amount) public  payable {
        require(token.balanceOf(msg.sender) >= _amount);
        uint256 etherAmount = _amount / rate ;
        require(address(this).balance >= etherAmount); // EthSwap이 가지고 있는 이더가 etherAmount보다 많은가?
        token.transferFrom(msg.sender, address(this), _amount);  // accoun1 -> EthSwap token 전송
        payable(msg.sender).transfer(etherAmount);
    }
}

<참조>
https://bitkunst.tistory.com/entry/Ethereum%EC%9D%B4%EB%8D%94%EB%A6%AC%EC%9B%80-OpenZeppelin-%ED%86%A0%ED%81%B0-%EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8-%EC%8A%A4%EC%99%91-%EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8?category=1033877

0개의 댓글