memo-circle-infoContract 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 です。

主な機能

  1. Proof のアンカリング(基準点として記録)のためにハッシュチェーンのチェックポイントを記録

  2. 転送ルートの遷移に Nova Proof を検証

  3. 引き出しに Nova / Groth16 Proof を検証

  4. 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 はすべてのチェーン間で流動性の均衡を保ち、手数料パラメータを自動的に更新します:

これにより手動でのパラメータ調整が不要になり、チェーン間での流動性の移動に合わせてインセンティブが自動調整されます。

動作の流れ

  1. 残高の取得:各 LiquidityManager から原資産トークンの残高(balance - feeSurplus)を取得

  2. ターゲットの計算targetLiquidity = total / chain_count * target_ratio_bps / 10000 を計算

  3. パラメータの更新:各 LiquidityManager に対して setFeeParams({ targetLiquidity, k }) を呼び出す

  4. 繰り返し:設定したインターバル(デフォルト: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 パターンとオーナー専用アップグレードを採用

最終更新