Sepolia での手動テスト計画
このページは、ウォレットを持つ人が Sepolia テストネットワーク上で手作業で実行できるチェックリストです。各ケースには T-01 形式の固定番号が付いており、報告で引用できます。
始める前に。 この計画は新バージョンを対象とします。リポジトリの公開マニフェストは LP 手数料
100の稼働中の Sepolia デプロイを記述しており、この計画はそれに適用されます。テスト対象の版に該当しないケースは「版の対象範囲外」と記録し、決して「失敗」とは記録しません。
記載する値は、contracts/src/ にある新バージョンのコードと、2026 年 9 月 14 日の設計上の決定に基づきます。確認できなかった動作には「テスト時に要確認」と記しています。
この計画の使い方
各セクションは、ケースを 6 列の表で示します。最後の 2 列は受入検証中に記入します。
| 列 | 記入内容 |
|---|---|
| ケース | 固定の識別子、T-01 から T-110 |
| 前提条件 | 開始前に満たされているべきこと |
| 手順 | 実行する操作(順番どおり) |
| 想定結果 | コードと決定が想定すること |
| 観察結果 | 実際に起きたこと。取引 hash または読取りブロックを添える |
| 重大度 | 適合なら空欄。そうでなければブロッカー、重大、軽微、外観のいずれか |
| 重大度 | 基準 |
|---|---|
| ブロッカー | 資金の損失または凍結、税の未徴収、買い壁の喪失、元本からの報酬支払い |
| 重大 | ソースに反する動作、あるべき拒否の欠如、表示される数値の誤り |
| 軽微 | チェーンに影響しない表示の差異、不正確なメッセージ |
| 外観 | 文字表記、レイアウト、ラベル |
拒否ケースのとおりに拒否された取引は成功です。hash は取引が提出されたことを示すだけで、成功はレシートでのみ判断できます。
一部のケースは画面を通しません。 現在のソースでは、dapp は稼働中のバージョンの ABI を読んでおり、exact-output 注文も claimTeam() も買い壁の詳細な読取りも提供していません。これらのケースには「直接呼出し」と記しており、テスト対象デプロイのマニフェストにあるアドレスに対して、コントラクト呼出しツールで実行します。
1. 準備
最初のスワップの前に、次の項目を記録します。以降のすべての比較の基準になります。
- ネットワーク:Sepolia、チェーン ID
11155111。 - テスト対象デプロイのアドレス(マニフェストから読む):トークン、フック、PoolManager、
poolId、ルーター、Lens、V2 レジストリ、Vault、ローンチャー。ローンチパッドの追加後は、ガバナンス Vault と Forge。秘密鍵をメモにコピーしないでください。 - 固定パラメーター:
fee、tickSpacing、LAUNCH_ETH、MIN_POOL_SUPPLY、launchTimestamp、moduleRevision。 - 初期状態:Lens の
snapshot()、フックのband()、トークンのtotalSupply()とtotalBurned()、pendingFloorEth、pendingAbsorbedTokens、wallCount()、activeWallCount()、teamAccrued、teamPaidCumulative、Vault のrewardReserve()、および読取りのブロック番号。
交換する金額に加えてテスト用 ETH を用意してください。各取引は gas を支払い、いくつかのケースでは拒否される取引が必要で、それらも gas を消費します。
| ケース | 前提条件 | 手順 | 想定結果 | 観察結果 | 重大度 |
|---|---|---|---|---|---|
| T-01 | ウォレットをインストール済み | Sepolia を選択し、テスト対象の版に接続した dapp を開く | ネットワークが認識される。別チェーンでの署名を求められない | ||
| T-02 | 新しいアカウント | Sepolia の faucet でテスト用 ETH を入手する | 更新後、ウォレットと dapp に残高が表示される | ||
| T-03 | マニフェストを手元に用意 | 表示される各アドレスをマニフェストのアドレスと比較する | 識別情報が一致し、poolId、fee、tickSpacing も一致する |
||
| T-04 | まだスワップを送信していない | snapshot() を読み、ブロックを記録する |
基準値が記録され、ブロックが特定されている | ||
| T-05 | 直接呼出し | フックの poolKey() を読む |
currency0 がゼロアドレス、fee = 100、tickSpacing = 10、hooks がフックと一致 |
||
| T-06 | V2 レジストリが読める | moduleRevision() とモジュールのアドレスを読む |
改訂を記録する。受入検証中に変化があれば、各署名の前に再確認が必要 |
2. ローンチとバンド
プールの初期化時、フックは預入れの全額を、BAND_SALT で識別される単一のポジション [minUsableTick, tickUpper] に配置します。tickUpper は開始 tick を間隔に合わせて切り下げた値なので、ポジションには CUBIT しか含まれません。フックは MIN_POOL_SUPPLY(供給量の 80 %)未満の預入れを拒否し、丸めによる端数をバーンします。
完全なローンチでは、供給量の 20 % も Vault の準備金に入れ、同じトランザクションで 0.1 ETH の購入を行います。
| ケース | 前提条件 | 手順 | 想定結果 | 観察結果 | 重大度 |
|---|---|---|---|---|---|
| T-07 | ローンチ済み、直接呼出し | band() を読む |
lower = −887 270。upper は開始 tick を 10 の倍数に切り下げた値で、FDV 3.75 ETH なら 155 390。流動性はゼロでない |
||
| T-08 | ローンチ取引が判明している | そのイベントを読む | BandBootstrapped(lower, upper, liquidity, tokens) が一度だけ発行され、値は band() と一致する。tokens は預入額から丸めの端数を引いた値 |
||
| T-09 | 初回購入なしのローンチ | スワップ前に snapshot() の bandEth と bandTokens を読む |
bandEth = 0。bandTokens は丸めを除き預入額と等しい |
||
| T-10 | ローンチ済み、直接呼出し | token.balanceOf(hook) を読む |
第三者による直接送金を除きゼロ。初期化後、フックは CUBIT トークンそのものを保持しない | ||
| T-11 | 直接呼出し | プールに流動性を追加しようとする | ExternalLiquidityForbidden で拒否される。フックが唯一の流動性提供者 |
||
| T-12 | リハーサル用デプロイ | MIN_POOL_SUPPLY 未満の預入れでプールを初期化する |
SupplyNotDeposited で拒否される。バンドは置かれない |
||
| T-13 | 完全なローンチ | ローンチ取引の後に Vault の rewardReserve() を読む |
準備金は供給量の 20 %、すなわち 420万 CUBIT。チームへの割当てもエアドロップもない | ||
| T-14 | 完全なローンチ | ローンチ取引内のデプロイヤー購入を読む | 0.1 ETH の購入。BuyTaxed でチームに 3 %。受け取った CUBIT は自由に譲渡できる |
||
| T-15 | 購入確定、直接呼出し | バンドの仮想準備金から想定出力を再計算する | 出力は 3 % の税と LP 手数料の後の x·y=k 曲線と整合する。開始時は 1,680万 CUBIT 対仮想 3 ETH — テスト時に要確認 | ||
| T-16 | 購入し、購入した CUBIT を売り戻す | 前、途中、後に bandEth を読む |
bandEth は購入で増え、その後開始値に戻っていく。購入で実際に持ち込まれた ETH を超えることはない |
3. 購入と売却の手順
ルーターは swapExactIn(key, zeroForOne, amountIn, amountOutMin, recipient, deadline) と swapExactOut(key, zeroForOne, amountOut, amountInMax, recipient, deadline) を公開しています。zeroForOne = true は ETH で CUBIT を購入します。
dapp の現在のソースでは、画面は exact-input しか使いません。 利用者は常に支払う金額を入力し、受取数量は読取り専用の欄です。したがって exact-output の手順は、ルーターへの直接呼出しでテストする必要があります。
購入は msg.value でネイティブ ETH を送ります。売却は value ゼロで送り、ルーターに対する CUBIT の ERC-20 承認が必要です。画面はちょうどその金額の承認を求め、無制限の承認は求めないため、より大きな売却には新しい承認が必要です。
ルーターは部分約定を拒否します。全額消費されない exact-input は IncompleteInput、全量提供されない exact-output は InsufficientOutput になります。税は要求額に基づいて計算されるため、取り消しは利用者を保護します。
dapp のソースから読んだ画面設定(受入検証で確認する):スリッページ許容度は既定値 1.0 %、入力は小数 2 桁までかつ 0 から 99.99 の範囲。最低受取量は整数で計算し、wei 単位で切り上げ。見積もりは 30 秒間有効。オンチェーン期限 = チェーンの timestamp + 120 秒 − 見積もりの経過時間。
| ケース | 前提条件 | 手順 | 想定結果 | 観察結果 | 重大度 |
|---|---|---|---|---|---|
| T-17 | ETH 残高が十分 | 少額を購入する(例:0.001 ETH) | 成功レシート。CUBIT が入金される。BuyTaxed イベントが発行される |
||
| T-18 | ETH 残高が多い | 高額を購入する | 成功レシート。価格影響は見積もりに現れ、税率には現れない | ||
| T-19 | CUBIT を保有 | 承認してから売却する | 別々の 2 取引。手取り ETH を受け取る。SellTaxed が発行される |
||
| T-20 | 前回の売却が確定 | 前回より大きい額を売却する | 新しい承認が求められる。承認はちょうどその金額に対するものだった | ||
| T-21 | スワップ画面を開いている | 何も触らずに提示された許容度を読む | 既定値 1.0 % | ||
| T-22 | スワップ画面を開いている | 0.005、100、負の値を順に入力する |
入力が拒否され、0–99.99 の範囲と小数 2 桁に関するメッセージが表示される | ||
| T-23 | 新しい見積もり | 許容度を受け付けられる最小値にし、価格変動を待ってから署名する | TooLittleReceived(received, minimum) で拒否。トークンは失われない。画面は保護の解除を促さない |
||
| T-24 | 見積もりが表示されている | 何もせず 30 秒以上待ってから署名しようとする | 見積もりは期限切れとみなされ、署名の前に再計算される | ||
| T-25 | 見積もりが期限切れ間近 | 期限直前に署名し、送信された期限を読む | 期限は 120 秒から見積もりの経過時間を引いた値。30 秒経過した見積もりなら約 90 秒 | ||
| T-26 | 直接呼出し | 期限が過ぎた状態で swapExactIn を呼ぶ |
Expired で拒否。資金は動かない |
||
| T-27 | 直接呼出し | 余裕のある入力上限で購入の swapExactOut を呼ぶ |
正確な数量を受け取る。余剰 ETH は同じ取引内で caller に返金される | ||
| T-28 | 直接呼出し | 必要額より 1 wei 少ない入力上限で swapExactOut を呼ぶ |
TooMuchRequested(required, maximum) で拒否 |
||
| T-29 | バンドと買い壁が買い戻せる量を超える CUBIT 残高(例:報酬で受け取った CUBIT) | ルーター経由の exact-input でこの残高を売却する | IncompleteInput で拒否。税は取引とともに取り消される — テスト時に要確認 |
||
| T-30 | 直接呼出し | オーダーブックが提供できる以上の ETH を exact-output で要求する | InsufficientOutput で拒否。部分決済はない |
||
| T-31 | 直接呼出し | ゼロ額、ゼロの受取人、整合しない msg.value、別のプールキーを順に送る |
それぞれ InvalidAmount、ZeroRecipient、WrongValue、WrongPool で拒否 |
||
| T-32 | 互換性のある外部ルーター | 外部ルートで購入してから売却する | フックの税が適用される | ||
| T-33 | 呼出しコントラクトまたは取引バッチ | 同じ取引内で購入と売却を続けて行う | 両方の部分がそれぞれ課税される |
4. 税と会計
| 操作 | 基準 | 配分 |
|---|---|---|
| 購入 | ETH 総額部分の 3 % | 100 % チーム分。買い壁への配分は明示的にゼロ |
| 売却 | 総出力 ETH の 15 % | 12 % を買い壁へ、3 % をチームへ |
exact-input では、購入税は渡された金額に含まれ、wei 単位で切り上げられます。exact-output では、プール部分の上に加算されるため、合計に対する税の割合は 3 % のままです。
exact-output の売却では、税は ceil(sortie × 1500 / 8500) です。プールは要求された出力に加えて税を生み出します。exact-input の売却では、税は ceil(brut × 15 %) です。配分ではチーム分が切り捨てられ、wei 単位の残りはすべて買い壁に入ります。
dapp の現在のソースでは、画面はスワップを許可する前にこれらの税率をチェーン上で読むことを要求します。確認されるまで、ボタンは待機状態のままです。
| ケース | 前提条件 | 手順 | 想定結果 | 観察結果 | 重大度 |
|---|---|---|---|---|---|
| T-34 | 購入確定 | BuyTaxed(ethIn, toFloor, toTeam) を読む |
toFloor はゼロ。toTeam は総入力の 3 %(wei 単位で切り上げ) |
||
| T-35 | 購入確定 | 前後の teamAccrued を比較する |
増加額はチーム分と等しい | ||
| T-36 | 売却確定 | SellTaxed(ethOut, toFloor, toTeam) を読む |
toFloor + toTeam は総額の 15 %。toTeam は総額の 3 %。合計は wei 単位まで正確 |
||
| T-37 | teamAccrued がゼロでない、直接呼出し |
任意のアカウントから claimTeam() を呼ぶ |
資金は固定されたチームアドレスへ送られる。TeamPaid(amount, cumulative) が発行される。teamAccrued はゼロに戻る |
||
| T-38 | teamAccrued がゼロ、直接呼出し |
claimTeam() を呼ぶ |
呼出しはエラーにならず、何も送金しない | ||
| T-39 | 同額の購入と売却を 1 回ずつ | gas を除き、開始時と終了時の ETH を比較する | 残る比率は 0.97 × 0.85 = 0.8245 に近い。差は LP 手数料、価格影響、丸めで説明できる |
||
| T-40 | 大きさが大きく異なる 2 回の売却 | 総額に対する税の割合を比較する | どちらも税率は 15 %。段階や免除はない |
5. 自動買い壁
exact-input でも exact-output でも、売却のたびにフックは _collectCrossedWalls() を呼び、次に _placeWall() を呼びます。まず価格が完全に通過したすべての買い壁を近いものから遠いものへ順に空にし、次にすべての待機中の ETH を目標 0.4 × prix courant + 0.6 × prix de lancement に配置します。目標は売却後の価格で計算し、tick に丸めます。ローンチ価格以下のようにこの目標がプールの tick より厳密に上にない場合は、買い壁を現在価格の 1 % 下に配置します。
空にされた買い壁は、その CUBIT を pendingAbsorbedTokens に加え、残りの ETH(手数料と端数)を pendingFloorEth に戻します。一部消費されただけの買い壁はその場にとどまります。流動性を作るには小さすぎる金額と、価格が tick 範囲の最上端にあり価格の下に買い壁を置く余地がない極端な場合だけが、資金を pendingFloorEth で待機させます。これを理由に売却が拒否されることは決してありません。その後、CUBIT ルーターが try/catch の中で deliverAbsorbed() を呼び出します。
Lens の参照値 floorPrice() は最後に資金供給された買い壁を示し、全体の最低価格ではありません。通過される買い壁 1 つにつき約 185 000 gas かかるため、1 トランザクションの上限 16 777 216 gas の範囲内で 1 回の売却が通過できる買い壁は最大で約 88 です。
| ケース | 前提条件 | 手順 | 想定結果 | 観察結果 | 重大度 |
|---|---|---|---|---|---|
| T-41 | 価格がローンチ価格より上 | 売却し、買い壁を読む | WallFunded(id, lower, addedEth, liquidity) が発行される。丸めを除き、売却の 12 % を含む待機中の ETH で目標 tick に買い壁が作られるか厚くなる。pendingFloorEth には配置されなかった残余だけが残る |
||
| T-42 | 前のケースの状態 | 売却後の価格とローンチ価格から目標を再計算する | 買い壁の lower は、この価格で計算して tick に丸めた 40/60 の目標に対応する |
||
| T-43 | 目標が同じ tick に当たる 2 回の売却 | wallCount() と walls(id) を読む |
買い壁は一つだけ。二つの WallFunded は同じ id を持ち、流動性が増え、識別子は新たに作られない |
||
| T-44 | 異なる tick に複数の買い壁 | 売却と購入を何度か繰り返し、walls(id) を読み直す |
各買い壁の lower は変わらない。移動した買い壁はない |
||
| T-45 | 価格より下に有効な買い壁 | 買い壁を通過せずに一部消費する額を売却する | 買い壁は ETH と CUBIT を含んだまま有効。WallAbsorbed は発行されない。pendingAbsorbedTokens は変わらない |
||
| T-46 | 一部消費された買い壁 | 買い壁より上に戻るまで購入する | 買い壁は CUBIT を売り戻して ETH を回復している。識別子と tick は変わらない | ||
| T-47 | 有効な買い壁、CUBIT ルーター経由の売却 | 買い壁を完全に通過する額を売却する | 同じ取引内で WallAbsorbed(id, cubit, ethRemaining) と TokensAbsorbed(amount, pendingAbsorbedTokens)、続いて AbsorbedDelivered(sink, amount) と RewardReserveFunded が発行される。rewardReserve() がその CUBIT 分増える。pendingAbsorbedTokens はゼロに戻る。totalSupply() と totalBurned() は変わらない |
||
| T-48 | 価格がローンチ価格に近く、40/60 の目標が市場より下にない | 約定可能な少額を売却し、買い壁を読む | 売却は成功する。WallFunded が発行される。買い壁は売却後の価格の 1 % 下に tick へ丸めて配置される。pendingFloorEth には配置されなかった残余だけが残る |
||
| T-49 | T-48 の状況 | 約定可能な少額を再び売却し、pendingFloorEth を読む |
新しい価格の 1 % 下で WallFunded が発行される。pendingFloorEth には丸めの端数だけが残り、売却から売却へ滞留分が積み上がらない |
||
| T-50 | 互換性のある外部ルーター | 外部ルートで買い壁を完全に通過する売却を行い、その後任意のアカウントから deliverAbsorbed() を呼ぶ |
税が適用される。TokensAbsorbed が発行され、CUBIT は呼出しまで pendingAbsorbedTokens に残る。呼出しは AbsorbedDelivered を発行する |
||
| T-51 | 複数の買い壁に資金供給済み | Lens の floorPrice() と netFloorPrice() を読み、続けて wallAmountsPage(0, 500) 以降のページを activeWallCount まで、すべて同じブロックで読む |
最後に資金供給された買い壁の参照値であり、そのとおりに示される。買い壁の CUBIT は各ページの合計に pendingAbsorbedTokens を一度だけ加えた値 |
||
| T-52 | Forge の子市場、完全に通過された買い壁 | 子市場のフックの absorbedTokenSink() を読み、次に売却のイベントを読む |
送付先は Forge の governanceVault() と等しい。AbsorbedDelivered が発行される。Deposited(token, from, amount, unlockAt) で記録されたロットが 30 日間ロックされる |
||
| T-106 | 1 回の売却で通過する買い壁が多数 | 売却の gas を見積もり、その後送信する | 通過される買い壁 1 つにつき約 185 000 gas。約 88 を超えると売却は 16 777 216 gas を超え、損失なしに失敗する。売却を分割する | ||
| T-107 | CUBIT の送付先が受取りを拒否するリハーサル用デプロイ | CUBIT ルーター経由で買い壁を通過する売却を行い、その後 deliverAbsorbed() を再度呼ぶ |
売却は成功する。CUBIT は pendingAbsorbedTokens に残る。呼出しはどのアカウントにも開かれており、送付先が拒否する間は失敗する |
6. mCUBIT Vault
Vault は rewardReserve からのみ引き出される CUBIT 建ての報酬を支払います。報酬は DAILY_REWARD_BPS = 300、すなわち 24 時間の期間(REWARD_PERIOD)あたり預入額の 3 % で、比例計算され、1 期間分が上限です。それを超えた分は失われます。準備金の残高を超えることはなく、元本から支払われることもありません。
各預入れは、ウォレットの全ポジションについて 24 時間のロック(LOCK_DURATION)を再開します。期限前の引出しは Locked で拒否されます。預入れ、引出し、請求はまず獲得済みの報酬を支払い、期間を新たに開始します。どのアカウントも fundRewardReserve(amount) で準備金に資金を追加できます。期限はブラウザーの時計ではなく、チェーンの timestamp で判断します。
報酬は CUBIT のみで、claimCubit() で請求します。Vault は WETH 報酬の関数を一切公開していません。
| ケース | 前提条件 | 手順 | 想定結果 | 観察結果 | 重大度 |
|---|---|---|---|---|---|
| T-53 | Vault が利用可能、CUBIT を保有 | 承認してから預け入れる | Staked(user, amount, unlockAt) が発行される。unlockAt はブロックの timestamp + 24 時間 |
||
| T-54 | 既存のポジション | 期限前に再度預け入れる | ロックはポジション全体について再開する。獲得済み報酬がゼロでなければ CubitRewardClaimed とともに支払われ、期間が新たに始まる |
||
| T-55 | ロック期間中 | 引出しを要求する | Locked で拒否 |
||
| T-56 | ロック期限切れ | 預入れの一部を引き出す | 一部引出しが受け付けられる。Withdrawn が発行される。獲得済み報酬が先に支払われる。残りは預け入れたまま |
||
| T-57 | 1 000 CUBIT を預入れ、準備金は十分 | 12 時間後、次に 24 時間後に pendingCubit を読む |
約 15 CUBIT、次に 30 CUBIT | ||
| T-58 | 前のケースの状態 | 請求せずに 48 時間待ち、pendingCubit を読む |
30 CUBIT のまま。2 日目の分は失われる | ||
| T-59 | 獲得済みの報酬 | claimCubit() を呼ぶ |
CUBIT が送金される。CubitRewardClaimed が発行される。rewardReserve が支払額だけ減る。pendingCubit はゼロに戻る |
||
| T-60 | 小さな準備金でのリハーサル用デプロイ | 準備金より大きい報酬を請求する | 準備金の残高だけが支払われる。準備金はゼロになる。元本には手を付けない | ||
| T-61 | 直接呼出し | fundRewardReserve(0) を呼び、次に承認後に任意のアカウントから fundRewardReserve(x) を呼ぶ |
InvalidAmount で拒否、その後 RewardReserveFunded(from, x)。rewardReserve が x 増える |
||
| T-62 | 直接呼出し | 複数の時点で token.balanceOf(vault) と totalStaked + rewardReserve を比較する |
Vault の残高がこの合計を下回ることはない | ||
| T-63 | ゼロ額、直接呼出し | stake(0)、次に withdraw(0) を呼ぶ |
どちらも InvalidAmount で拒否 |
||
| T-64 | 現行レジストリに接続されていない Vault | 預入れを試みる | Inactive で拒否 |
||
| T-65 | ポジションあり | 表示されるロック期間を読む | LOCK_DURATION から導いた時間単位の表示:24 時間 |
||
| T-66 | dapp を開いている | WETH 報酬の手順を探す | ない。CUBIT 報酬だけが提示される |
7. ローンチパッドのガバナンス Vault
ガバナンス Vault は、Forge のローンチ手数料(ETH)と、Forge の子市場の買い壁が吸収したトークンを受け取ります。各預入れは、それぞれの受領時から 30 日間ロックされます(LOCK_DURATION)。請求できるのはデプロイヤーだけで、この権利は恒久的で譲渡できません。期日を過ぎたロットのみを古い順に請求できます。ETH はキー ETH()(ゼロアドレス)で記帳されます。受入検証の前にテスト対象デプロイの ABI を読み直してください。デプロイヤーは extendLock で現在と将来のすべての預入れのロックを延長でき、lockExtension() は増えるだけで各期日に加算されます。
子市場の買い壁からの自動送付は T-52 で、ローンチ手数料の預入れは T-81 で確認します。T-67 から T-73 のケースでは直接呼出しでテスト用トークンを預け入れ、T-108 では手数料の ETH を請求します。
| ケース | 前提条件 | 手順 | 想定結果 | 観察結果 | 重大度 |
|---|---|---|---|---|---|
| T-67 | テスト用トークン、直接呼出し | 承認してから deposit(token, amount) を呼ぶ |
Deposited(token, from, amount, unlockAt) が発行される。unlockAt はブロックの timestamp + 30 日。held(token) が同額増える |
||
| T-68 | 30 日未満の預入れ | デプロイヤーから claim(token, n) を呼ぶ |
NothingToClaim で拒否 |
||
| T-69 | ロック解除済みのロット | 別のアカウントから claim(token, n) を呼ぶ |
NotDeployer で拒否 |
||
| T-70 | 7 日間、毎日 1 回の預入れ | 最初の預入れから 30 日目以降、毎日請求する | 1 日に 1 ロットずつ古い順に払い出される。最後のロットは 7 回目の預入れの 30 日後。請求のたびに Claimed(token, amount, tranches) |
||
| T-71 | ロック解除済みのロットが複数 | claim(token, 1) を呼ぶ |
支払われるのは 1 ロットだけ。次のロットは請求可能なまま | ||
| T-72 | 単純な送金で送られたトークン | lockUntracked(token) を呼び、新たな送金なしに再度呼ぶ |
最初の呼出しから 30 日間ロックされる新しいロット。2 回目の呼出しは NothingToLock で拒否 |
||
| T-73 | ロック中とロック解除済みのロット | claimable(token) と locked(token) を読む |
請求可能額とロック額の合計が held(token) に等しい |
||
| T-108 | T-81 のローンチ手数料の預入れから 30 日超 | 別のアカウントから、次にデプロイヤーから claim(address(0), 1) を呼び出す |
まず NotDeployer で拒否され、次に ETH がデプロイヤーに支払われる。Claimed(address(0), amount, 1) が発行される。held(address(0)) が支払額だけ減る |
||
| T-109 | ロック中のロット | 別のアカウントから、次にデプロイヤーから extendLock(extra) を呼び出す |
まず NotDeployer で拒否され、次に LockExtended(extra, lockExtension) が発行される。tranche(token, i) で読む各期日が extra だけ後ろにずれる。ロックを短縮する関数はない |
8. Forge
Forge は将来のリリースとして紹介する公開ローンチパッドです。CUBIT のローンチには含まれず、後からガバナンス Vault とともに追加されます。ローンチパッドの追加後にそのアドレスを記録してください。
どのアカウントも正確な手数料を支払えば子市場をローンチできます。Forge の子市場は供給量の全額を自身のバンドに預け入れ、Forge は構築時にガバナンス Vault のアドレスを受け取り、各ローンチは 0.005 ETH の手数料をこの Vault に支払い、Vault がそれを保持します。ローンチした側に返金されることはありません。デプロイ salt はローンチするアカウントに結び付けられます。
| ケース | 前提条件 | 手順 | 想定結果 | 観察結果 | 重大度 |
|---|---|---|---|---|---|
| T-81 | Forge が利用可能、任意のアカウント | 0.005 ETH の正確な手数料で子市場をローンチする | ChildLaunched(token, hook, launcher, team, fee) が発行される。子市場の BandBootstrapped は、丸めを除き供給量の全額に等しい預入れを示す。ガバナンス Vault が Deposited(address(0), forge, fee, unlockAt) を発行し、unlockAt はブロックのタイムスタンプに 30 日と延長分を加えた値。親フックの pendingFloorEth は変わらない |
||
| T-82 | Forge が利用可能 | 誤った value、空の名前、ゼロのチーム、または別のテンプレートでローンチを試みる | 拒否:wrong launch fee、invalid name、invalid team、または template mismatch |
||
| T-110 | 別のアカウントに見られたローンチの salt | 同じ salt で二つ目のアカウントからローンチする | 最初のローンチのアドレスは奪われない。salt はローンチするアカウントに結び付き、フックのアドレスが権限を持たない場合、二つ目のローンチは child deployment failed で拒否される |
9. 交換と権限
レジストリの authority は、Vault、ルーター、Lens、Forge の四つの周辺アドレスをいつでも遅延なく交換できます。交換のたびに ModuleUpdated が発行され、moduleRevision が増え、該当する機能(Vault、Momentum、Forge)はチームが再び公開するまで閉じます。ルーターの交換で閉じる機能はありません。登録済みの候補、別のフックや別のトークンに接続された候補、既に stake のある候補は InvalidModule で拒否されます。
フックには管理者がいません。誰もスワップや買い壁の仕組みを一時停止できません。チームアドレスは恒久的な権限を保持し、チーム分の税を受け取り、レジストリのモジュールを交換してから有効化します。
| ケース | 前提条件 | 手順 | 想定結果 | 観察結果 | 重大度 |
|---|---|---|---|---|---|
| T-83 | 現行 Vault に預入れと準備金がある | Vault を交換する | 預け入れた CUBIT、報酬準備金、期限は旧 Vault に残る。資金は移動しない | ||
| T-84 | Vault が交換済み | 旧 Vault で請求と引出しを行い、次に預入れを試みる | 請求と引出しは引き続き可能。新しい預入れは Inactive で拒否 |
||
| T-85 | 登録済みの候補、または stake のある候補 | 交換を試みる | InvalidModule で拒否 |
||
| T-86 | 交換を実施済み | moduleRevision() とイベントを読む。Vault の交換後は新しい Vault への預入れを試す |
改訂が増えている。ModuleUpdated(module, previous, current, revision) が一致する。Vault が再び有効化されるまで預入れは Inactive で拒否される |
||
| T-87 | 旧ルーターに承認を与えている | ルーターを交換し、売却を試みる | 旧承認は新しい spender には有効でない。新しい承認が求められる | ||
| T-88 | ルーター交換済み | 旧ルーターでスワップする | スワップは引き続き可能で、フックの税が適用される。dapp は新しいルーターを使う | ||
| T-89 | 直接呼出し | デプロイされたフックの ABI を確認する | スワップや買い壁の仕組みを停止できる関数はない。フックには管理者がいない | ||
| T-90 | 直接呼出し | Lens の snapshot() を読み、同じブロックで買い壁のページを読む |
snapshot に含まれるのは、市場、バンド、買い壁、会計のフィールド、総供給量、報酬準備金、有効な買い壁の数、読取りブロックと最良の買い壁だけで、買い壁の合計は含まれず、その費用は買い壁の数に依存しない。流通供給量は totalSupply から買い壁の CUBIT と rewardReserve を引いた値で、保有 CUBIT はその供給量から bandTokens を引いた値 |
||
| T-91 | ローンチ後の任意の時点 | 購入と売却を行う | スワップは通常どおり動作する。どのアカウントもスワップを止められない |
10. 想定される拒否ケース
この表は受入検証全体を通じた参照用です。自動買い壁は売却に拒否を追加しません。買い壁を配置できない場合は資金が待機し、失敗した送付は CUBIT を待機させたままにします。
注意点。 dapp の現在のソースでは、コントラクトのエラーは翻訳されていません。オンチェーンの拒否が、表示上切り詰められた生のメッセージとして表示される場合があります。発生させた拒否ごとに、表示された正確なテキストを記録し、理解できる内容か判断してください。
| エラー | 発生条件 | アプリが示すべき内容 |
|---|---|---|
ExternalLiquidityForbidden |
第三者による流動性の追加 | 操作不可:プロトコルが唯一の流動性提供者 |
SupplyNotDeposited |
供給量の 80 % 未満の預入れでの初期化 | ローンチ不可、預入れ不足 |
Expired |
取引期限切れ | 見積もりの期限切れ、再計算が必要 |
TooLittleReceived(received, minimum) |
出力が受け付けた最低額を下回る | スリッページ保護が作動 |
TooMuchRequested(required, maximum) |
入力が受け付けた上限を超える | 入力上限の保護が作動 |
IncompleteInput |
exact-input が全額消費されない | 利用可能な流動性に対して金額が大きすぎる |
InsufficientOutput |
exact-output が全量提供されない | オーダーブックがこの出力を提供できない |
InvalidAmount, ZeroRecipient, WrongValue, WrongPool |
無効な注文パラメーター、または Vault へのゼロ額 | 入力エラーとして表示し、生のコードは出さない |
Inactive, Locked |
現行レジストリに接続されていない Vault、または期限前の引出し | モジュール利用不可、またはロック解除日 |
NotDeployer, NothingToClaim, NothingToLock, NothingToExtend |
第三者によるガバナンス Vault への請求や延長、期限前の請求、新しい残高のないロック、ゼロの延長 | 限定された操作、請求するものなし、ロックするものなし、または延長するものなし |
NotAuthority, InvalidModule |
第三者による交換要求、または互換性のない候補 | 交換の拒否とその理由 |
アプリ側だけの拒否も記録します:期限切れの見積もり、変更されたスワップ状態、別チェーン上のウォレット、変更されたアカウント、変更されたモジュール改訂、まだ確認されていない税率。
11. アプリケーション
これらのケースは dapp で実施します。記載する画面の動作はソースに基づくもので、受入検証で確認します。
| ケース | 前提条件 | 手順 | 想定結果 | 観察結果 | 重大度 |
|---|---|---|---|---|---|
| T-92 | dapp を開いている | 言語セレクターの 10 言語を順に表示する | 各言語で翻訳済みの内容が表示され、欠落テキストやはみ出しがない。製品名は方針により英語のまま | ||
| T-93 | 言語を選択済み | 再読み込みし、ウィンドウ幅を 640 px 未満に縮める | 選択はセッションをまたいで保持される。640 px 未満ではセレクターに旗だけが表示される | ||
| T-94 | 英語以外の言語 | トップ画面の見出しを英語版と比べる | 英語以外では見出しを意図的に小さくしている。はみ出したり切れたりしてはいけない | ||
| T-95 | 約 400 px の画面 | 各画面を順に表示する | 横方向のはみ出しがない。幅の広い領域はそれぞれのコンテナ内でスクロールする。ボタンに手が届く | ||
| T-96 | 768 px から 1279 px の間のウィンドウ | ナビゲーションを開く | 1279 px まではコンパクトメニューを使う。移動後にメニューが閉じる | ||
| T-97 | 取引確定 | 表示される各金額を同じブロックのオンチェーン値と比較する | 金額が一致する。表示上の丸めは署名される金額を変えない | ||
| T-98 | 操作を準備中 | 手順の途中でウォレットのネットワークを切り替える | 見積もりは無効になり、想定外のネットワークでは署名が拒否される。ボタンはまずネットワーク切替を提案し、交換には 2 回目の操作を求める | ||
| T-99 | 操作を準備中 | 手順の途中でウォレットのアカウントを切り替える | 残高、承認、見積もりが新しいアカウントについて再計算される。旧アカウント向けに準備した署名は拒否される | ||
| T-100 | 承認済み、スワップ未署名 | その間にモジュール改訂が変わるようにする | アプリは状態を再検証し、新しい spender へ黙って進まない | ||
| T-101 | RPC 利用不可または古い読取り | RPC への接続を切って観察する | 状態が未確認と表示され、操作が無効化される | ||
| T-102 | 取引を送信済み | hash、次にレシートを追跡する | 画面は「提出済み」と「成功」を区別する。イベントは Sepolia エクスプローラーで確認できる | ||
| T-103 | オンチェーンの拒否を発生させた | 表示されたテキストを全文記録する | メッセージは利用者に理解できる必要がある。生の技術コードや切り詰められたメッセージはすべて記録する | ||
| T-104 | 中国語、韓国語、日本語 | 外部フォントサービスにアクセスせずにこれらの言語を表示する | 文字が正しく表示される。フォントはサイトから提供される | ||
| T-105 | Proof 画面を開いている | バンド、買い壁、待機資金を読む | bandEth、bandTokens、買い壁、待機 ETH、送付待ちの CUBIT が別々に表示される。ラダー、keeper、買い壁のバーンを示す画面はない |
12. 記録シート
前のセクションの各表が、そのセクションの記録シートそのものです。ケースを進めながら「観察結果」と「重大度」の列を記入してください。観察結果には少なくとも取引 hash または読取りブロックを記し、そのうえで確認した内容を書きます。
報告に添付する集計:
| セクション | ケース | 適合 | 差異 | 最大重大度 |
|---|---|---|---|---|
| 1. 準備 | T-01 から T-06 | |||
| 2. ローンチとバンド | T-07 から T-16 | |||
| 3. 購入と売却 | T-17 から T-33 | |||
| 4. 税と会計 | T-34 から T-40 | |||
| 5. 自動買い壁 | T-41 から T-52、T-106 と T-107 | |||
| 6. mCUBIT Vault | T-53 から T-66 | |||
| 7. ガバナンス Vault | T-67 から T-73、T-108、T-109 | |||
| 8. Forge | T-81、T-82、T-110 | |||
| 9. 交換と権限 | T-83 から T-91 | |||
| 10. 拒否ケース | 横断的な参照 | |||
| 11. アプリケーション | T-92 から T-105 |
差異は必ずケース番号に対して報告し、スクリーンショットだけで報告してはいけません。ネットワーク、デプロイのアドレス、ブロック、hash、アプリのバージョンを添えてください。
この計画の限界
この計画は、新バージョンのコードと 2026 年 9 月 14 日の決定が想定することを記述したものです。検証そのものではありません。Sepolia での受入検証が成功しても、テストキャンペーンの代わりにはなりません。
「テスト時に要確認」の項目は、観察したうえでこのページに反映する必要があります。
出典: contracts/src/CubitHook.sol, CubitLens.sol, interfaces/ICubitHook.sol, interfaces/ICubitLens.sol, libraries/BandLib.sol, libraries/WallLib.sol, periphery/CubitRouter.sol, CubitV2.sol, CubitVault.sol, CubitGovernanceVault.sol, CubitForge.sol, CubitLaunch.sol、 dapp/src の現在の手順、および contracts/docs/REDESIGN_HANDOFF.md に記録された 2026 年 9 月 14 日の設計上の決定。