メインコンテンツまでスキップ

デモ — 準拠 dApp の作成

MIZUHIKI Verified(本人認証済み)ソウルバウンドトークンを使用することで、認証済みユーザーのみにサービスを提供することができます。転送やその他の操作を完了する前に、ユーザーのウォレットが MIZUHIKI Verified(本人認証済み)ソウルバウンドトークンを保有しているかどうかを簡単に確認できます。

コントラクトアドレス

ネットワーク環境コントラクトアドレス
Awaji テストネット開発0x7828549D695777Bb01567aE7954F7586243bd294
MIZUHIKI メインネット本番2026年6月にローンチ予定

コントラクトインターフェース

MIZUHIKI Verified(本人認証済み)ソウルバウンドトークンは ERC-5484 規格を実装しています:

interface IMizuhikiVerifiedSBT {
/**
* @dev Returns the number of SBTs owned by `account`
* @param account The address to query
* @return The number of SBTs owned (0 or 1 for soulbound tokens)
*/
function balanceOf(address account) external view returns (uint256);

/**
* @dev Returns true if the account has a verified SBT
* @param account The address to check
* @return True if verified, false otherwise
*/
function isVerified(address account) external view returns (bool);

/**
* @dev Burn authorization - who can burn the token
*/
enum BurnAuth {
IssuerOnly, // Only the MIZUHIKI project can burn
OwnerOnly, // Only token holder can burn
Both, // Both the MIZUHIKI project and holder can burn
Neither // Token is permanently bound
}
}

認証済みユーザー専用 ERC20 トークンの作成

  1. ERC20 トークンの SBT コントラクトアドレスを設定します:
CompliantERC20.sol
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract CompliantERC20 is ERC20, Ownable {
/**
* @notice MIZUHIKI SBT contract address
*/
address public mizuhikiSbtContract;

/**
* @notice Whitelist of addresses that can facilitate transfers without SBT e.g. DEX router addresses
*/
mapping(address => bool) public dexWhitelist;

// Events
event MizuhikiSbtContractUpdated(address indexed newContract);
event DexWhitelistUpdated(address indexed dexRouter, bool whitelisted);

// Errors
error NotVerified(address account, string message);

/**
* @notice Update the MIZUHIKI SBT contract address (only owner)
* @param _mizuhikiSbtContract New SBT contract address
*/
function updateMizuhikiSbtContract(address _mizuhikiSbtContract)
external
onlyOwner
{
mizuhikiSbtContract = _mizuhikiSbtContract;
emit MizuhikiSbtContractUpdated(_mizuhikiSbtContract);
}

/**
* @notice Add or remove a DEX router from the whitelist (only owner)
* @param _dexRouter DEX router address
* @param _whitelisted Whether the DEX should be whitelisted
*/
function updateDexWhitelist(address _dexRouter, bool _whitelisted)
external
onlyOwner
{
dexWhitelist[_dexRouter] = _whitelisted;
emit DexWhitelistUpdated(_dexRouter, _whitelisted);
}
}
  1. 送信者と受信者の MIZUHIKI Verified(本人認証済み)ソウルバウンドトークン残高を確認する onlyVerified モディファイアを作成します:
CompliantERC20.sol
modifier onlyVerified(address account) {
if (IERC721(mizuhikiSbtContract).balanceOf(account) == 0 && !dexWhitelist[account]) {
revert NotVerified(account, "Receiver must be a MIZUHIKI Verified SBT holder or a whitelisted account");
}
if (IERC721(mizuhikiSbtContract).balanceOf(msg.sender) == 0 && !dexWhitelist[msg.sender]) {
revert NotVerified(msg.sender, "Sender must be a MIZUHIKI Verified SBT holder or a whitelisted account");
}
_;
}
  1. 認証済みユーザーのみに制限したい操作に onlyVerified モディファイアを追加します:
CompliantERC20.sol
function _update(address from, address to, uint256 value)
internal
override(ERC20)
onlyVerified(to)
{
super._update(from, to, value);
}
Swap confirmationSwap error, missing SBT

ERC20 トークンコントラクトレベルでの KYC 要件の適用

注記

この例でのトークン転送制限は、トークンコントラクトのみに追加されています。DeFi コントラクト(Uniswap コントラクト)を変更する必要はありません。