목표 : 간단한 토큰발행과 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);
}
}