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

예금, 대출 스마트컨트랙트

by Danny_Kim 2026. 10. 9.

예금, 대출 스마트컨트랙트 예제 샘플입니다.

코드에 결함이 있을 수 있으니 참고 예시로만 활용하시기 바랍니다.

 

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

contract CollateralBank {
    mapping(address => uint256) public deposits;
    mapping(address => uint256) public loans;

    // 1. 예금: 이더리움을 컨트랙트에 예치
    function deposit() public payable {
        require(msg.value > 0, "Must send ETH");
        deposits[msg.sender] += msg.value;
    }

    // 2. 인출: 대출 담보로 잡힌 금액을 제외하고 인출
    function withdraw(uint256 amount) public {
        require(deposits[msg.sender] >= amount, "Insufficient deposit");
        require(deposits[msg.sender] - loans[msg.sender] >= amount, "Collateral locked for loan");
        
        deposits[msg.sender] -= amount; 
        
        (bool success, ) = msg.sender.call{value: amount}("");
        require(success, "ETH transfer failed");
    }

    // 3. 대출: 내 예금(담보) 총액을 넘지 않는 선에서 이더리움을 빌려감
    function borrow(uint256 amount) public {
        require(address(this).balance >= amount, "Bank lacks ETH");
        require(deposits[msg.sender] >= loans[msg.sender] + amount, "Borrow amount exceeds collateral");
        
        loans[msg.sender] += amount;
        
        (bool success, ) = msg.sender.call{value: amount}("");
        require(success, "ETH transfer failed");
    }

    // 4. 상환 (입금 처리): 외부 지갑에서 이더리움(ETH)을 직접 전송하여 대출을 갚음
    function repay() public payable {
        require(msg.value > 0, "Must send ETH to repay");
        require(loans[msg.sender] >= msg.value, "Repayment exceeds loan");
        
        // 사용자가 보낸 이더리움(msg.value)만큼 대출 장부에서 차감
        loans[msg.sender] -= msg.value;
    }

    // [테스트 도우미] 컨트랙트에 보관된 총 ETH 확인
    function getContractBalance() public view returns (uint256) {
        return address(this).balance;
    }
}

🔑🔑🔑 추천 링크 🔑🔑🔑

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

댓글