본문 바로가기
블록체인교육/솔리디티

체인링크(오라클) 활용한 스테이블 코인 - 이더 교환 스마트컨트랙트

by Danny_Kim 2026. 10. 9.

체인링크 오라클 활용한 스테이블 코인- 이더 교환 스마트컨트랙트 기본 코드입니다.

교육을 위한 자료이므로, 참고용으로만 활용하시기 바랍니다.

 

// 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");
    }
}

 

🔑🔑🔑 추천 링크 🔑🔑🔑

  1. 쉽게 이해하고 따라하는 블록체인 마스터 과정
  2. 알트코인 투자 정석 및 2026 암호화폐 시장 주목할 섹터

댓글