🚀 [멤버십]
상위 1% 수익률 도전! 코인 텐베거 클럽 가입하기 →
예금, 대출 스마트컨트랙트 예제 샘플입니다.
코드에 결함이 있을 수 있으니 참고 예시로만 활용하시기 바랍니다.
// 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;
}
}
댓글