🚀 [멤버십]
상위 1% 수익률 도전! 코인 텐베거 클럽 가입하기 →
체인링크 오라클 활용한 스테이블 코인- 이더 교환 스마트컨트랙트 기본 코드입니다.
교육을 위한 자료이므로, 참고용으로만 활용하시기 바랍니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// 1. IERC20 기능만 직접 선언
interface IERC20 {
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// 2. 체인링크 오라클 인터페이스만 직접 선언
interface AggregatorV3Interface {
function latestRoundData() external view returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
}
// ETH <-> 스테이블코인 스왑 컨트랙트 본문
contract StablecoinSwap {
IERC20 public stablecoin;
AggregatorV3Interface public priceFeed;
uint8 public constant STABLECOIN_DECIMALS = 6;
constructor(address _stablecoin, address _priceFeed) {
stablecoin = IERC20(_stablecoin);
priceFeed = AggregatorV3Interface(_priceFeed);
}
// 1. 최신 이더리움 달러(USD) 가격 가져오기
function getLatestEthPrice() public view returns (uint256) {
(
/* uint80 roundID */,
int256 price,
/* uint startedAt */,
/* uint timeStamp */,
/* uint80 answeredInRound */
) = priceFeed.latestRoundData();
require(price > 0, "Invalid price data");
return uint256(price);
}
// 2. 이더리움을 내고 스테이블코인을 받아감 (ETH -> USDC)
function swapEthForStablecoin() public payable {
require(msg.value > 0, "Must send ETH");
uint256 ethPrice = getLatestEthPrice();
// ETH(18자리)의 달러 가치 계산 후 스테이블코인(6자리) 단위로 변환
uint256 usdValue = (msg.value * ethPrice) / (10 ** 8);
uint256 stablecoinAmount = usdValue / (10 ** 12);
require(stablecoin.balanceOf(address(this)) >= stablecoinAmount, "Insufficient stablecoin liquidity");
// 고객에게 스테이블코인 전송
require(stablecoin.transfer(msg.sender, stablecoinAmount), "Stablecoin transfer failed");
}
// 3. 스테이블코인을 내고 이더리움을 받아감 (USDC -> ETH)
function swapStablecoinForEth(uint256 stablecoinAmount) public {
require(stablecoinAmount > 0, "Must send Stablecoin");
uint256 ethPrice = getLatestEthPrice();
// 스테이블코인(6자리)을 18자리 달러 가치로 맞춘 후, ETH 수량으로 역산
uint256 usdValue = stablecoinAmount * (10 ** 12);
uint256 ethAmount = (usdValue * (10 ** 8)) / ethPrice;
require(address(this).balance >= ethAmount, "Insufficient ETH liquidity");
// 고객 지갑에서 컨트랙트로 스테이블코인 인출 (사전에 지갑에서 Approve 필요)
require(stablecoin.transferFrom(msg.sender, address(this), stablecoinAmount), "Stablecoin transferFrom failed");
// 고객에게 이더리움(ETH) 전송
(bool success, ) = msg.sender.call{value: ethAmount}("");
require(success, "ETH transfer failed");
}
}
댓글