Contract Specification
コントラクトシステム概要
概要
zERC20 コントラクトシステムは以下で構成されます:
zERC20:プライバシー機能を備えた ERC-20 トークン
Verifier:Proof 検証と Teleport の実行
Hub:クロスチェーンルートの集約
LiquidityManager:流動性の入出金ポリシー管理
Adaptor:Stargate 経由のクロスチェーン出金
Fee Manager(オフチェーン):流動性ターゲットの動的調整
zERC20
ファイル: contracts/src/zERC20.sol
ZKP(Zero-Knowledge Proof)検証のためにすべての転送をハッシュチェーンで追跡する、アップグレード可能な ERC-20 コントラクトです。
主な機能
すべての転送に対して
IndexedTransfer(index, from, to, value)イベントを発行SHA-256 の切り捨てハッシュチェーンを維持:
hashChain = SHA256(hashChain || from || to || value)[0:248]Verifier が起動する Mint のために
teleportを公開
関数
イベント
制約
すべての転送量は ≤ 2^248 - 1 でなければならない(BN254 スカラーフィールドに収まる必要がある)
超過した場合は
ValueTooLargeでリバート
Verifier
ファイル: contracts/src/Verifier.sol
ZK Proof を検証し、Teleport を管理する LayerZero OApp です。
主な機能
Proof のアンカリング(基準点として記録)のためにハッシュチェーンのチェックポイントを記録
転送ルートの遷移に Nova Proof を検証
引き出しに Nova / Groth16 Proof を検証
LayerZero 経由で Hub にルートを中継
関数
ステート
GeneralRecipient
引き出しを特定の送金先に紐付けます:
緊急時の対応
Proof の不整合(同一インデックスに対してルートが一致しない)が検出された場合、コントラクトは自動的に停止します。 再開するにはオーナーが Verifier をローテートし、deactivateEmergency を呼び出す必要があります。
Hub
ファイル: contracts/src/Hub.sol
クロスチェーン転送ルートの中央集約コントラクトです。
主な機能
LayerZero 経由ですべてのチェーンの Verifier からルートを受信
Poseidon ツリー(最大 64 リーフ)に集約
グローバルルートをすべての Verifier にブロードキャスト
関数
イベント
LiquidityManager
ファイル: contracts/src/liquidity/LiquidityManager.sol
インセンティブカーブを用いて流動性の入出金を管理するコントラクトです。
主な機能
原資産トークンを zERC20 に Wrap
zERC20 を原資産トークンに Unwrap
流動性ターゲットに基づいたインセンティブ手数料の適用
関数
インセンティブカーブ(Incentive Curve)
線形インセンティブ密度:density(x) = k * (1 - x / T)(x < T の場合)
ターゲット未満:Wrap に報酬、Unwrap に手数料を適用
ターゲット以上:報酬・手数料なし
手数料は
feeSurplusに蓄積され、将来のインセンティブとして使用
Fee Manager
ファイル: fee-manager/(オフチェーンサービス)
すべてのチェーンの LiquidityManager コントラクトに対して targetLiquidity を動的に調整する定期メンテナンスワーカーです。
目的
Fee Manager はすべてのチェーン間で流動性の均衡を保ち、手数料パラメータを自動的に更新します:
これにより手動でのパラメータ調整が不要になり、チェーン間での流動性の移動に合わせてインセンティブが自動調整されます。
動作の流れ
残高の取得:各 LiquidityManager から原資産トークンの残高(
balance - feeSurplus)を取得ターゲットの計算:
targetLiquidity = total / chain_count * target_ratio_bps / 10000を計算パラメータの更新:各 LiquidityManager に対して
setFeeParams({ targetLiquidity, k })を呼び出す繰り返し:設定したインターバル(デフォルト:1 時間)スリープ後に繰り返す
FeeParams 構造体
targetLiquidity:Wrap 報酬と Unwrap 手数料がゼロに近づく流動性レベルk:インセンティブカーブの傾きを制御(値が高いほど、流動性がターゲットから乖離した際のインセンティブが強くなる)
設定
FEE_MANAGER_PRIVATE_KEY
—
各 LiquidityManager の FEE_MANAGER_ROLE を持つ秘密鍵
FEE_MANAGER_INTERVAL_SECS
3600
更新間隔(秒)
FEE_MANAGER_K_BPS
1000
インセンティブ係数 k(ベーシスポイント、1000 = 10%)
FEE_MANAGER_TARGET_RATIO_BPS
8000
ターゲット流動性比率(ベーシスポイント、8000 = 80%)
ネイティブトークンのサポート
Fee Manager は LiquidityManager がネイティブ ETH を使っているか ERC20 を使っているかを自動的に検出します:
ネイティブ ETH:ERC-7528 センチネルアドレス
0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeEで検出ERC20:原資産トークンの
balanceOf()で残高を取得
権限
Fee Manager は各 LiquidityManager に対して FEE_MANAGER_ROLE が必要です:
主要フロー
1. 転送ルートの証明
2. ローカル Teleport
3. グローバル Teleport(クロスチェーン)
セキュリティに関する注記
値の範囲:すべての値を 248 ビット制限で検証
二重支払い防止:
totalTeleportedが受信者ごとの累積 Mint 量を追跡LayerZero セキュリティ:既知のエンドポイントからのメッセージのみ受け付ける
アップグレードの安全性:UUPS パターンとオーナー専用アップグレードを採用
最終更新