テストと検証
レベル
| レベル | 検出するもの |
|---|---|
| Foundryのユニットテスト | コントラクトごとの期待される挙動 |
| ファジング | 誰も想定しなかった入力 |
| 不変条件 | どのような操作の連続の後でも成り立たなければならない性質 |
| フォークテスト | 実際の状態のもとでの、本物のコントラクトに対する挙動 |
| 形式検証 | サンプリングではなく、すべての経路で証明された性質 |
| 静的解析 | 既知の危険なパターン |
| 文言監査 | 禁止語彙と視覚上の禁止事項 |
経済的な不変条件
以下は、常に成り立たなければならない等式です。
- 4つの取り分の合計は、課されたタックス(デフォルトで500ベーシスポイント)にちょうど等しく、weiの取りこぼしもありません
- 誰もボールトの資産を自分の選んだアドレスへ引き出すことはできません。資産が減少しうるのは、変換、ホルダーへのエアドロップ、オーナーによる緊急移転だけです
- バスケットのウェイトの合計は100 %であり、決して変わりません
- 両方のポジションは作成時に預け入れられ、取り除くことができるのは、告知から30日後の終了モードによってだけです
- 流動性はロックされています。その唯一の出口は終了モードであり、オーナーはそれを30日前に告知します
$STOCKFUNバイバックは、購入したトークンをバーンアドレス以外に送ることはできません- すべてのマーケットで、クリエイターの供給量はゼロです
- ボールトは、自身のバスケットの資産しか購入できません
- ボールトが取得するのは、ETH、USDC、USDG、自身のバスケットの株式、そして任意のOndoレールにおけるUSDonの払い戻しだけです
- エアドロップのサイクルは、株式ごとに見て、保有する量を超えて支払うことは決してなく、どのホルダーも比例配分による自分の取り分を超えて受け取りません。エアドロップのコントラクトが負っている額は、サイクルと保留された株式を合わせても、その残高を決して超えません。2026-09-27以降必須であり、2026-10-04以降、状態を持つ不変条件のテストで検証されています。2026-10-05以降は、緊急時においても、それらの帳簿を裏付けるものは常にコントラクトが実際に保有しているトークンで構成され、まだ計上されていないトークンで構成されることは決してありません。これは2つ目の状態を持つ不変条件のテストで検証されています
- StockFunのプールに流動性を追加するのは、流動性のロックだけです
- 取引が支払う相手はマーケットのボールトだけで、他の取り分は請求されるまでフック上で待機します。2026-10-05以降、自身の取り分を拒否するボールトには、その取り分がフック上の未払い分として残り、取引は続きます
- バスケットの各株式は、その株式のために確保された資金だけを使います
これらは現在の実装に対してチェックされています。アップグレードは、それらがチェックされるコードを置き換えます。
サイズの制約
EIP-170の上限は、ランタイムコードで24,576バイトです。これは手作業の確認ではなく、テストスイートを失敗させるテストによって強制されています。
ここではこれが現実の制約です。ファクトリーは分割しなければなりませんでした。2026-10-02までは、TreasuryVaultの作成コードを埋め込んでいたボールトのデプロイヤーが、上限に最も近いコントラクトでした。ボールトに追加される1行1行が、その余裕を削っていました。2026-09-28にクリエイターバイバックを削除したことで、ボールトのデプロイヤーは23,055バイトから14,965バイトになりました。資金を株式ごとに確保する2026-10-01の修正で、15,954バイトになりました。2026-10-02以降、ボールトのデプロイヤーはプロキシをデプロイしており、上限に収まらなければならないのは各モジュールの実装です。
2026-10-05には、エアドロップのコントラクトが上限に最も近いコントラクトになりました。4回目の監査ループの請求の変更で上限を超えましたが、ビュー関数の一部をprivateにし、1つのサイクルの負担とする緊急移転を取りやめたことで、24,432バイトに戻りました。上限より144バイト少ない値です。
2026-09-29の監査の後
2026-09-29のセキュリティ監査の後に修正された各指摘には、監査対象のコードでは失敗する回帰テストがあります。その大半は、監査の概念実証を反転させ、修正後の挙動をチェックするようにしたものです。
2026-10-01のセキュリティパイプライン
独立した2者の監査人による監査の第2ラウンドと、それに続く、修正後のコードに対するすべてのチェックのやり直しです。そこで行われたコントラクトとキーパーへの各修正には回帰テストがあります。2026-10-01の時点で、これらの修正の後の結果は次のとおりです。
- Foundry。フォークテストのスイート以外の421件のテストが合格し、deepプロファイルも合格しています:20,000回のファズ実行と、深さ128で512回の実行による不変条件です。フォークテストのスイートは実行されませんでした。利用できるRPCのURLがなかったためです。
- ミューテーションテスト。slither-mutateを5つのコントラクトで実行しました。対象は、手数料を分配するコントラクト、保有量の記録、トレジャリーのボールト、Robinhood Chainの株式ルーター、リモートハブです。1,301個のミュータント(コードへの小さな意図的な変更)を生成し、テストはそのうち1,118個を検出しました。生き残った183個のうち、107個は元のコードと等価で、どんな入力でも区別できません。残りの76個は、テストが行っていなかったチェックを明らかにしました。現在、テストはそのすべてをカバーしています。バグを明らかにしたミュータントはありませんでした。
- 形式検証。すべてのCertoraジョブを、修正後のコードに対してプローバーで再実行しました(certora-cli 8.8.1、基本的なサニティチェック)。違反したルールはありませんでした。
LiquidityLockの7つのルールは、1つのメソッドlockProtocolLiquidityについて未決のままです。制限時間を超え、より長い制限時間での再実行も結論が出ないまま終わりました。他のすべてのメソッドではこれらのルールは成り立ちます。このメソッドはオーナー専用で、$STOCKFUNのために1回だけ実行され、Foundryのテストがそのアクセス制御、1回限りの使用、ロックの形をカバーしています。検証済みにならなかったその他の結果は、既知の空虚性(vacuity)のケースです。すべてのメソッドに対して実行されるルールのうち、検証の設定では決して成功しえないメソッドに対するものです。最初のTreasuryVaultの実行での失敗は、仕様の2つのアーティファクトから生じたもので、どちらもバグではありませんでした。仕様は修正されました。 - ファジングとシンボリック実行。Medusaは、保有量の記録の5つの性質を10分間実行し、失敗はありませんでした。その最初の実行では、時計が0時間目から始まるチェーン(テストチェーン)で、記録供給量の最初の正時の記録点が欠けていることが判明しました。実際のチェーンは影響を受けておらず、現在、トークンはその記録点をデプロイ時に記録します。Halmosは、範囲内のすべての入力について、3つのシンボリックなチェックに合格しています。手数料の配分が正確であること、記録供給量が任意の2回の転送に追従すること、そして次の正時におけるその積分が正しいことです。Mythrilは、デプロイの外ではプロトコルのコントラクトを探索できず、カバレッジは約14 %です。自己完結した保有量の記録では、15分で31 %に達し、何も報告しませんでした。
- 静的解析。Slither、Aderyn、Solhintは、新たなものを何も検出しませんでした。
- 新しいローカルチェーン上で。完全なデプロイ、実際のキーパーサイクル、10件のユースケースが合格しています。本番用のスクリプトをランブックの順序で実行するデプロイのリハーサルは、スクリプトを1つ修正した後に合格しています。モックレールのスクリプトが、初期資金を、デプロイを行う鍵ではなく、forgeのデフォルトの送信者にミントしていたためです。
| Certoraジョブ | 検証済み |
|---|---|
BuybackBurner |
12 |
Fees |
5 |
LiquidityLock |
13 |
StockFunFactory |
23 |
StockFunHook |
36 |
StockFunProtocolToken |
9 |
StockFunSwapRouter |
8 |
StockFunToken |
11 |
TreasuryOracle |
8 |
TreasuryVault |
32 |
UniswapV4StockRouter |
12 |
その実行では、TeamVestingの11のルールも検証されました。このコントラクトは2026-10-05に、その仕様とともに削除されています。プローバーは、Robinhood Chain側をカバーしていません。リモートハブ、ミラーボールト、株式ルーターです。
2026-10-02のアップグレード対応の再設計
モジュールをアップグレード可能にした再設計は、上記のすべてのチェックの後に行われました。2026-10-02の時点で、新しいコードに対する結果は次のとおりです。
- Foundry。フォークテストのスイート以外の458件のテストが合格しています。新しいスイートが、Ethereum上とRobinhood Chain上でのアップグレード(誰がアップグレードできるか、新しい実装が維持しなければならない権限の管理元と
PoolManager、ボールトの1つずつのアップグレード)と、終了モードをカバーしています。保有量の記録のスイートは、記録とともに保有量レコーダーへ移りました。 - ストレージレイアウト。アップグレード可能な各モジュールのストレージレイアウトは
contracts/storage-layouts/に記録されており、contracts/script/check-storage-layouts.shは、追加以外の変更があれば失敗します。このスクリプトは、アップグレードのたびにその前に実行することを想定しています。2026-10-05以降は、すべての構造体のあらゆる深さを確認します。デプロイを参照してください。 - 新しいローカルチェーン上で。
LocalRunスクリプトが合格しています。 - 形式検証。Certoraの仕様は、新しいコードに合わせて更新中です。プローバーでの最後の完全な実行は2026-10-01で、再設計より前のものです。上の表はその実行を示しています。
上で説明したdeepプロファイル、ミューテーションテスト、ファジングとシンボリック実行、静的解析は、2026-10-01に、再設計前のコードに対して実行されたものです。
2026-10-04のエアドロップ
エアドロップのコントラクトと2つのsendToAirdropの経路は、2026-10-04にコード化されましたが、デプロイされていません。同日の時点で、新しいコードに対する結果は次のとおりです。
- Foundry。フォークテストのスイート以外の514件のテストが合格しています。エアドロップ以前は459件でした。新しいスイートは3つです:
AirdropDistributorTestが38件、LayerZeroをモックに置き換えたAirdropCrossChainTestが15件、そして状態を持つ不変条件を中心とするAirdropInvariantsTestが2件です。この不変条件は、ランダムな送付、請求、割り当て、サイクルの開始、除外とサイクルの時刻の変更のもとで、2つのマーケットにまたがる保存則と支払い能力を確認するもので、64回の呼び出しを128回実行します。取り分の計算のファズテストは512回実行されます。 - ガス。2つまたは3つの株式からなるサイクルの請求は、テストでの測定でおよそ120,000〜210,000ガスです。テストはウォームストレージで実行されるため、実際のトランザクションのコストはこれより多少多くなります。Robinhood Chainからの配信は、Ethereum上で、コールドの状態で測定して約85,000〜1,016,000ガスです。デプロイを参照してください。
- ローカルチェーン上で。Anvil上で、
LocalRunに続いてLocalAirdrop:2人のホルダーで、13:00 UTCより前に株式が保留され、その後に割り当てられて請求されます。各請求は、その取り分をちょうど切り捨てた額で、株式ごとに1 weiのダストが残ります。 - 形式検証。変更されたコントラクトに関わる5つのCertoraの仕様は、型チェックに合格しています。プローバーは実行されておらず、エアドロップのコントラクトをカバーする仕様はありません。
- オフチェーン。キーパーの93件、sharedパッケージの43件、バックエンドの9件、ワーカーの58件のテストが合格しています。
- レビュー。Codex(gpt-6-astra)が設計を、続いてコードをレビューしました。保留された株式のタイミングについてMediumが1件、ローカルのスクリプトについてLowが1件あり、どちらも修正されました。修正の再レビューでは、除外の編集のタイミングについてMediumが1件、ローカルのスクリプトの順序についてLowが1件見つかり、どちらも修正されました。時間枠は、それが閉じた時点で有効だった除外リストに対して測定され、スクリプトは保留された株式を最初に割り当てます。この2つの修正の最終確認では、述べられた保証のもとでバグは見つかりませんでした。その保証とは、その間にサイクルの時刻が変わらず、トークンの保有量レコーダーが置き換えられない限り、保留された株式は、誰がいつ呼び出しても、対象となる保有量を持つ最初の時間枠に渡るというものです。レポートは
projet/docs/audit-2026-10-04/にあります。
2026-10-05の変更
チームへの割り当ての廃止、即時の緊急モード、そしてすべての数値のオーナーの設定化で、2026-10-05にコード化されましたが、デプロイされていません。同日の時点で、新しいコードに対する結果は次のとおりです。
- Foundry。スイートが合格しています(520件のテスト)。2つの新しいスイート、
SettingsとSettingsCrossChainが、各設定について、誰が設定できるか、どの値を拒否するか、そして変更後の次の操作をカバーしています。その中には、タックスとアンチスナイプ、ローンチの形状、各プールが自身のキーを保持すること、ロックされたポジションが回収するものの取り分が含まれます。手数料の性質は、ファジングでもシンボリックにも、受け入れられるあらゆる設定のもとで成り立ちます。緊急モードのテストは即時の移転に合わせて更新され、ベスティングコントラクトのテストはそのコントラクトとともになくなりました。 - ガス。タックスの設定の読み取りによって、スワップのガスはウォームの状態で約1,200増えます。
- 形式検証。手数料、フック、ロック、ファクトリー、トークン、オラクルの仕様は設定に合わせて更新され、ローカルで型チェックに合格しています。プローバーは実行されていません。
2026-10-05の監査ループ
同じ日に、デプロイされていないコードに対して5回のレビューのループが行われました。4回目以降は、1つの失敗が残りを決して止めないというファウンダーのルールへの違反が、欠陥として数えられます(アーキテクチャを参照してください)。各修正には回帰テストがあります。各ループのコードに対する結果は次のとおりです。
- Foundry。4回目のループの後で602件、5回目の後で613件のテストが合格しています。その日の終わりには614件が合格しており、RPCがないため3つのフォークテストのスイートはスキップされています。すべてのコントラクトがEIP-170の上限に収まり、ストレージレイアウトが拡張されたのは、修正が状態を追加した箇所だけです。
- 不変条件。3回目のループの後、エアドロップの不変条件はdeepプロファイルのもとで、深さ128で512回の実行に合格しています。2つ目の状態を持つ不変条件は、エアドロップに緊急時の状況を通過させます:最後のステップが遅れて実行される配信、紛れ込んだトークン、持ち出し、戻し入れ、償却、一時停止、そして5回目のループ以降は、発行体によって凍結された株式と
claimManyです。 - 形式検証。ループによって、フック(ボールトへの債務、紛れ込んだ資金)、ロック(保持している取り分、レスキュー)、バーナーとトークン(それらのレスキュー)についてのルールと、ルーター、オラクル、ファクトリーでレスキューを行えるのはプロトコルオーナーだけであるというルールが追加されました。4回目のループの後で11の仕様に213のルールと不変条件があり、5回目の後でトークンのレスキューについてのルールが1つ追加されました。変更されたすべての仕様はローカルで型チェックに合格しています。プローバーには何も送られておらず、その最後の実行は依然として2026-10-01のものです。
- オフチェーン。キーパーのエアドロップのステップ、dappの請求画面、そして4回目のループでのオフチェーンの見直しの後で、キーパーの191件、sharedパッケージの51件、バックエンドの9件、ワーカーの90件のテストが合格しており、アプリは型チェックとリントに合格しています。
- ローカルチェーン上で。Anvil上で、
LocalRunに続いて、キーパー、ワーカーのエンジン、アプリの請求の準備を実行しました。デプロイの時間枠ではキーパーは何も送らず、次の時間枠では2つのサイクルを開いて2つのボールトの株式を送り、1回のclaimManyが2つのサイクルにわたって5つの株式を約421,000ガスで支払い、その後claimableはゼロを示しました。
5回目のループでのオフチェーンの見直し、2026-10-06
5回目のループでのキーパー、ワーカー、アプリ、スクリプトの見直しでは、重大度が中程度の問題が3つ、低い問題が16見つかり、それぞれ回帰テストとともに修正されました。デプロイはされていません。2026-10-06に実行:
- Foundry。その日のコードで619件のテストが合格し、3つのフォークのスイートはRPCがないためスキップされました。Lensの新しいフィールド、5つの株式というバスケットの上限、再開された
$STOCKFUNのローンチには、それぞれテストがあります。ストレージのレイアウトは変わっていません。 - オフチェーン。キーパーの210件、sharedパッケージの51件、バックエンドの9件、ワーカーの111件のテストが合格しました。キーパーの各修正のテストは、その修正を取り除くと失敗します。アプリは型チェックとlintに合格しています。アプリにはテストランナーがなく、その請求の準備はワーカーのエンジンに移り、そのテストでカバーされています。
- ローカルチェーン上で。プライベートなAnvil上でのリハーサルは、6つのシナリオに合格しました。
LocalRun(そのドライランはデプロイファイルを書き込みません)。2つの時間枠にわたるキーパー(各ボールトのETHを時間枠ごとに1回変換し、続いてエアドロップの割り当て、オープン、送付を1回ずつ行い、すべての請求がweiまで正確でした)。ETHを拒否するボールト(フックとロック上のその債務は、ボールトが復旧した後に支払われました)。状態ファイルとそのロックファイルを伴う処理途中での停止(何も二度送られず、置き換えられたトランザクションと破棄されたトランザクションが処理されました)。レスキューと、LP手数料の日次の回収。ブリッジのレール、アプリ、ワーカーは対象外でした。
リハーサルの後、2026-10-06
リハーサルでの発見は同日に修正されました。デプロイはされていません。キーパーは、マーケットのボールトに新たに送るものがない場合でも、エアドロップのコントラクトがそのマーケットのために保留している株式を割り当て、しきい値を下回っていたボールトを、自身の時計ではなく、確認の対象となった時間枠によって記録します。また、保留された送付を別に数え、ボールトの最後の購入レッグでは決して使えない数単位のUSDCには手をつけず、ログにプールのIDを表示します。6回目の見直しのループの最初の領域では、コントラクトには何も見つからず、ローカルのスクリプトに重大度の低い問題が1つ見つかり、修正されました。ローカルのデプロイファイルは、キーパー、アプリ、ワーカーが使う前にチェーンと照合されます。そのコードで:
- Foundry。620件のテストが合格し、3つのフォークのスイートはRPCがないためスキップされました。1件増えたのは、別のバスケットの株式を保有するボールトを、再開された
$STOCKFUNのローンチが拒否したテストです - オフチェーン。キーパーの218件、sharedパッケージの51件、バックエンドの9件、ワーカーの111件のテストが合格しました。キーパーの各修正のテストは、その修正より前のキーパーでは失敗します。ローカルのデプロイファイルの確認には自動テストがありません。プライベートなAnvil上で手作業で実行され、新規のデプロイを通し、2つのコントラクトの役割を入れ替えたファイルを拒否しました
6回目と7回目の監査ループの後、2026-10-06
6回目のループと7回目のループのキーパーとワーカーの修正は同日に行われました。デプロイはされていません。どちらでもコントラクトのコードは変わっておらず、コントラクトのコメントが1つ修正されただけです。2026-10-06に、コミット415dcae上で実行(他のコントラクトの作業が進行中だったため、コントラクトはそのコミットのクリーンなコピーから):
- Foundry。620件のテストが合格しています。フォークファイル以外の615件と、公開RPCに対するRobinhood Chainのフォークスイートの5件です。RPCがないため、Ethereumの3つのフォークスイートはスキップされました。リハーサルの後と同じ件数で、コントラクトのテストは変わっていません
- オフチェーン。キーパーの277件、sharedパッケージの51件、バックエンドの9件、ワーカーの137件のテストが、11のファイルで合格しました。7回目のループの各概念実証は回帰テストになっており、各修正の新しいテストは、その修正より前のコードでは失敗します。ただし、古いコードがすでに行っていたことを固定する少数のテスト(キーパーが評価できない送付は以前と同様に送られる、古い状態ファイルが読み込まれる)と、関数が新しいチャートのテストは例外です。6回目のループより前のキーパーが書き込んだ状態ファイルは、テストのフィクスチャとして保持されており、新しいキーパーで読み込まれます
- アプリ。型チェック、lint、ビルドに合格し、事前レンダリングされたデモのチャートはプロット領域全体に広がっています。テストランナーはなく、ブラウザでのテストは実行されていません。チャートの配置はワーカーのエンジンのコードを実行しており、それはワーカーのテストがカバーしています
価格フィードの保護と8回目の監査ループ、2026-10-06
Robinhood Chainのためのオラクルの2つの価格フィードの保護は2026-10-06に書かれ、8回目のループのキーパー、ワーカー、アプリの修正も同日に行われました。デプロイはされていません。コントラクトは、ループではなく保護とともに変わりました。2026-10-06に、コミット6586d40上で実行(他のコントラクトの作業が進行中だったため、コントラクトはそのコミットのクリーンなコピーから):
- Foundry。640件のテストが合格しています。82のスイートにまたがるフォークファイル以外の633件と、公開RPCに対するRobinhood Chainのフォークファイルの7件です。RPCがないため、Ethereumの3つのフォークスイートはスキップされました。保護によって、フォークファイル以外に18件のテストが加わりました。モックのフィードとトークンを使ったオラクル単体のテストが16件(各ガードのオフ、次にオン、フィードやトークンが応答しないあらゆる場合、一時停止と見なされるあらゆる回答、ガスの足りない読み取り、オーナーの設定、デプロイスクリプトの拒否)と、クロスチェーンのレールのテストが2件(一時停止された株式のレッグは単独で失敗し、一時停止が解除されると購入する。シーケンサーの停止は、猶予期間が終わるまですべてのレッグを止める)です。2つの新しいフォークテストは実際の株式のトークンを読み取ります。20のトークンはそれぞれ、オラクルが読み取るとおりに一時停止のシグナルに応答し、1回の読み取りにかかった最大のガスは13,288でした。また、実際のコードがフラグを保持する場所で一時停止されたトークンは、自身の価格だけを差し止めます
- ストレージと仕様。アップグレード可能な17のモジュールのストレージレイアウトは、オラクルの追加を除いて変わっていません。オラクルの形式仕様(25のルールと不変条件)は型チェックに合格していますが、プローバーでは実行されていません
- オフチェーン。キーパーの306件、sharedパッケージの51件、バックエンドの9件、ワーカーの155件のテストが、12のファイルで合格しました。8回目のループの各概念実証は回帰テストになっており、各修正の新しいテストは、新しい関数のテストを除き、その修正より前のコードでは失敗します
- アプリ。型チェック、lint、エンジンのチェック、ビルドに合格しています。テストランナーはなく、ブラウザでのテストは実行されていません。ローンチのフォームのバスケットの確認と、取引パネルのタックスはワーカーのエンジンのコードを実行しており、それはワーカーのテストがカバーしています
9回目の監査ループ、GlamsterdamとLayerZeroのテストネット実行、2026-10-06
9回目のループの修正、EthereumのGlamsterdamアップグレードのもとでのエアドロップ配信のガス、そして滞留した配信のキーパーによる再実行は、2026-10-06に行われました。メインネットにはデプロイされていません。それらとともに、コントラクトの変更が1つありました(リモートハブのガスのポリシーと、ミラーボールトの3つの引数を取る送付と見積もり)。これは、クロスチェーンのレールの9件の新しいテスト(測定値に対するデフォルト値、両端での範囲への収め込み、送付のオプションとそれに一致する見積もり、1つの引数の形、セッターの拒否、そのOFTが強制するガスより重い配信、ポリシーのないハブが株式を手元に残すこと、バイト単位でのオプション)と、デプロイスクリプトの4件のテストで検証されています。株式のOFTのモックは今では、ガスのオプションを合算し、ガスが不足した配信を、LayerZeroのエンドポイントと同じように、より多くのガスでの実行を待つ状態に残します。このループ以降、2つ目のエージェントが、各修正の変更をプッシュの前に見直し(検証者ゲート)、その発見も同じように修正され、テストされます。2026-10-06に、コミット92a1904上で実行(他の作業が進行中だったため、コントラクトはそのコミットのクリーンなコピーから):
- Foundry。653件のテストが合格しています。83のスイートにまたがるフォークファイル以外の646件と、公開RPCに対するRobinhood Chainのフォークファイルの7件です。RPCがないため、Ethereumの3つのフォークスイートはスキップされました。FoundryはCancunのガスのスケジュールで動作するため、そのガスの数値は古い価格であり、新しい価格はSepoliaから得ています
- ストレージ。アップグレード可能な17のモジュールのストレージレイアウトは、リモートハブの追加(そのガスのポリシー、スロット21〜23)を除いて変わっていません
- オフチェーン。キーパーの370件、sharedパッケージの51件、バックエンドの9件、ワーカーの189件のテストが、14のファイルで合格しました(ゲートの最後の修正の後のe1dd5f6では、キーパーは372件、その他は変わらず)。キーパーとワーカーは型チェックに合格しています。各修正の新しいテストは、新しい関数のテストを除き、その修正より前のコードでは失敗します。アプリの書き込みトランザクションごとの新しいガスの上限はワーカーのエンジンのコードを実行しており、それはワーカーのテストがカバーしています
- アプリ。型チェック、lint、エンジンのチェックに合格しています。テストランナーはありません。そのほかの2つの修正、つまり推定値として印が付くトレジャリーの額と、読み取れなかった承認は、一時的なコピーの中でアプリ自身のコードを実行することで確認されました
- Glamsterdamの後のSepolia上で。コントラクトとスクリプトの固定のガスの数値はすべて、実際のチェーン上で測定し直されました。ガスのポリシーで修正されたエアドロップ配信の2つを除いて、すべて余裕をもって成り立っています。10回目の監査ループは、さらに2つを見つけました。デプロイスクリプト自身のガス(forgeが古い価格での自身のシミュレーションから取るもの。今ではすべてのブロードキャストがノードの見積もりを使います)と、バッチではなく1つのマーケットに合わせて決められていたブリッジのcomposeのガスです。LayerZeroのテストネット実行のデプロイ上で読み取り専用で実行したキーパーのプリフライトは、68件のチェックに合格しています
- LayerZeroのテストネット実行。プロトコルは、LayerZeroの実際のテストネットのエンドポイント、DVN、エグゼキューターの上で、SepoliaとRobinhood Chainのテストネットでエンドツーエンドで実行されました。1時間ごとの時間枠7つとエアドロップのサイクル6つで、すべての請求は保有量レコーダーから計算した取り分とぴったり一致しました。Robinhoodレールを参照してください。その最後の時間枠は、9回目のループのキーパーで、シミュレーションから選んだ配信のガスを使って実行されました
10回目の監査ループ、2026-10-06
10回目のループの修正は2026-10-06に行われ、メインネットにはデプロイされておらず、それぞれマージの前に2つ目のエージェントによって見直されました。変更されたコントラクトは1つ、USDGのブリッジアダプターです。ブリッジバッチのRobinhood Chain上の最後のステップは、今では基本分にマーケットごとの分を加えたガスを受け取り、1つのバッチが運ぶマーケットは最大17です。これを9件の新しいテストがカバーしています。5つの株式からなる新しいマーケット4つ、17マーケットの満杯のバッチ、2つのバッチとして送られる30マーケットで、それぞれちょうどそのガスでコールドの状態で実行します。メッセージのサイズのために拒否される18マーケット。バッチとともに増える手数料。上限を超えたバッチが丸ごと拒否され、次のバッチは通ること。新しい設定より前にセットアップされたアダプターが、設定されるまで何もブリッジしないこと。そして設定の範囲です。USDGトークンのブリッジのモックは今では、LayerZeroと同じように、LayerZeroのサイズ制限を超えるメッセージを拒否し、ガスに価格を付けます。デプロイ手順にはテストがありません。その変更はSepoliaで実地に確認され、そこでは、デプロイツール自身のガスで送られた作成はガスが尽き、ノードの見積もりで送られた同じ作成は通りました。2026-10-07に、コミット5ea8bf0上で実行(コントラクトはそのコミットのクリーンなコピーから):
- Foundry。662件のテストが合格しています。84のスイートにまたがるフォークファイル以外の655件と、公開RPCに対するRobinhood Chainのフォークファイルの7件です。RPCがないため、Ethereumの3つのフォークスイートはスキップされます。LayerZeroのテストネットのプロジェクトの2件のテストは、LayerZero自身のコントラクト上で合格しています
- ストレージ。アップグレード可能な17のモジュールのストレージレイアウトは、ブリッジアダプターの追加(その2つのバッチ設定)を除いて変わっていません
- オフチェーン。キーパーの400件、sharedパッケージの51件、バックエンドの9件、ワーカーの210件のテストが、15のファイルで合格しています。キーパーとワーカーは型チェックに合格しています。各レビュアーの概念実証は回帰テストになっており、各修正の新しいテストは、新しい関数のテストを除き、その修正より前のコードでは失敗します。ウォレットがキャンセルまたは置き換えたトランザクションのアプリによる追跡と、自身の最後のトランザクションのブロック以降のブロックでの読み取りは、ワーカーのエンジンのコードを実行しており、それはワーカーのテストがカバーしています
- アプリ。型チェック、lint、エンジンのチェックに合格しています。テストランナーはありません
- テストネット上で。LayerZeroのテストネット実行のブリッジアダプターは2026-10-06にSepolia上でアップグレードされ、その次のバッチ(1マーケット)は、LayerZeroのエグゼキューターによって新しいガス600,000で配信され、composeされました。そのうち115,990が使われました
テストが証明しないこと
これは重要なことであり、プロジェクト自身のレポートもはっきりと述べています。
ローカルテストはクロスチェーンの配信をシミュレートします。実際のLayerZeroによる配信を証明するものではありません。エアドロップのクロスチェーンのテストは、LayerZeroと、メインネット用のものはリポジトリにない株式アダプターのモックに対して実行されます。公開エンドポイントがHTTPエラーを返したため、少なくとも1回の実行ではフォークテストのスイートが除外されました。そのレポートは、スイートが合格したかのように示すのではなく、そのことを明記しています。
2026-10-06のLayerZeroのテストネット実行は、テスト用の株式、テスト用のアダプター、テスト用のUSDG、モックのフィードを使って、2つのテストネットの間で実際のLayerZeroのメッセージを運びました。この実行は、LayerZeroの転送の上でStockFunのコードが動くことを証明しますが、PaxosのUSDGのペア、Robinhoodの株式とそのアダプター、実際のフィードと流動性、メインネットのガス、手数料、ファイナリティは証明しません。
どの実行でも、次のことは証明されません:メインネットでのLayerZeroによる転送、外部レビュー、現在のレールをカバーする形式証明。テストネット実行は実際のウォレットで署名しており、その請求のうち3つはアプリを通じて行われました。
ローカル環境
完全なシナリオは4つのターミナルで実行します。チェーン、デプロイとシミュレーション、価格サービス、dappです。続いて、キーパーとブラウザハーネスです。
正確な手順はprojet/docs/LOCAL_TESTING.mdにあります。