OnchainVerifiable 컨트랙트 개발하기
isVerified
function isVerified(address addr, DojangAttesterId attesterId) external view returns (bool);배포 된 OnchainVerifiable 컨트랙트
Network
OnchainVerifier contract Address
Verfier ID
Example
Verified ERC20
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
type DojangAttesterId is bytes32;
interface IVerifier {
function isVerified(address primaryAddress, DojangAttesterId attesterId) external view returns (bool);
}
contract VerifiedERC20 is ERC20 {
IVerifier public immutable verifier;
DojangAttesterId public immutable attesterId;
error NotVerified(address addr);
constructor(
string memory name_,
string memory symbol_,
address verifier_,
DojangAttesterId attesterId_,
uint256 initialSupply
) ERC20(name_, symbol_) {
require(verifier_ != address(0), "verifier is zero");
verifier = IVerifier(verifier_);
attesterId = attesterId_;
_mint(msg.sender, initialSupply);
}
// OZ v5 단일 훅: 모든 이동(mint/burn/transfer)이 이 경로를 탑니다.
function _update(address from, address to, uint256 value) internal override {
// 일반 transfer(= 양쪽 모두 비제로)에서만 검증
if (from != address(0) && to != address(0)) {
// 토큰 보유자(from)가 검증되어야 함
if (!verifier.isVerified(from, attesterId)) revert NotVerified(from);
// 필요 시 호출자(transferFrom의 spender)도 검증
if (!verifier.isVerified(_msgSender(), attesterId)) revert NotVerified(_msgSender());
// 필요 시 수신자(to)도 검증
if (!verifier.isVerified(to, attesterId)) revert NotVerified(to);
}
super._update(from, to, value);
}
}
Verified ERC721
Last updated