🚀 [멤버십]
상위 1% 수익률 도전! 코인 텐베거 클럽 가입하기 →
실물자산 토큰화 및 KYC 기반 송금제어 스마트컨트랙트 샘플 코드입니다.
교육용이니 참고용으로만 활용하세요!
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// KYC 화이트리스트 기반 실물자산(부동산/채권) 토큰
contract RWAToken {
string public name = "Real Estate Asset Token"; // 토큰 이름 (예: 부동산 조각투자 토큰)
string public symbol = "REA";
uint8 public decimals = 18;
uint256 public totalSupply;
address public bankOwner; // 금융기관(관리자) 주소
// 고객들의 토큰 잔고를 기록하는 장부
mapping(address => uint256) public balanceOf;
// ★ [핵심] KYC(신원 인증)를 통과한 고객인지 기록하는 화이트리스트 장부
mapping(address => bool) public isWhitelisted;
// 이벤트 로그 (블록체인에 기록을 남김)
event Transfer(address indexed from, address indexed to, uint256 value);
event KYCAdded(address indexed account);
event KYCRemoved(address indexed account);
// 오직 관리자(은행)만 실행할 수 있도록 제한하는 권한 설정
modifier onlyOwner() {
require(msg.sender == bankOwner, "Only bank admin can call this");
_;
}
constructor(uint256 initialSupply) {
bankOwner = msg.sender; // 컨트랙트를 배포한 은행을 관리자로 설정
// 은행 자신은 화이트리스트에 기본으로 등록
isWhitelisted[msg.sender] = true;
// 초기 자산 발행
totalSupply = initialSupply * (10 ** uint256(decimals));
balanceOf[msg.sender] = totalSupply;
emit Transfer(address(0), msg.sender, totalSupply);
}
// -----------------------------------------------------------
// [관리자 기능] KYC(신원 인증) 관리
// -----------------------------------------------------------
// 1. 고객 신원 확인 후 화이트리스트에 추가 (계좌 개설 승인)
function addKYC(address account) public onlyOwner {
isWhitelisted[account] = true;
emit KYCAdded(account);
}
// 2. 문제 발생 시 고객의 자격 박탈 (계좌 동결)
function removeKYC(address account) public onlyOwner {
isWhitelisted[account] = false;
emit KYCRemoved(account);
}
// -----------------------------------------------------------
// [사용자 기능] 통제된 토큰 전송 (Transfer)
// -----------------------------------------------------------
// 3. 토큰 송금: 보내는 사람과 받는 사람 모두 KYC를 통과해야만 송금 가능
function transfer(address to, uint256 amount) public returns (bool) {
require(balanceOf[msg.sender] >= amount, "Insufficient token balance");
// ★ [핵심 규제 로직] 송금인과 수취인의 KYC 상태 검증
require(isWhitelisted[msg.sender], "Sender is not KYC verified");
require(isWhitelisted[to], "Receiver is not KYC verified");
// 잔고 변경
balanceOf[msg.sender] -= amount;
balanceOf[to] += amount;
emit Transfer(msg.sender, to, amount);
return true;
}
}
댓글