04 / 開発する読了 8 分

コントラクトと連携

連携ではチェーン、プール中核、ABI、モジュール改訂を特定します。旧報告のルーターは交換され得て、新ローカル ABI は既存プールと非互換の場合があります。

以下の複数買い壁ビューは準備中の API で、旧 Sepolia で提供済みとはしていません。接続前に検証済み版の ABI を出力し runtime を確認します。

プールの識別

PoolKeycurrency0currency1feetickSpacinghooks を含みます。CUBIT ではネイティブ ETH が currency0、CUBIT が currency1 です。

フィールド 想定値
currency0 ネイティブ ETH を表すゼロアドレス
currency1 特定したデプロイのトークン
fee 目標新版 100、旧 Sepolia 3000
tickSpacing 確認ソースでは 10
hooks 特定したデプロイの hook

poolId は key 全体に依存します。画面の fee だけ変えても旧プールは新デプロイにはなりません。

同じブロックでモジュールを解決

まず hook.v2() に固定されたレジストリを読み、同ブロックで利用可能モジュールのアドレスと moduleRevision を解決し、中核への接続を検証します。

以下は読取り専用の断片で、設定済み viem クライアントと確認済みレジストリアドレスを使用します:

import { parseAbi, type Address, type PublicClient } from "viem";

const registryAbi = parseAbi([
  "function router() view returns (address)",
  "function moduleRevision() view returns (uint256)",
]);

export async function readRelease(
  client: PublicClient,
  registry: Address,
) {
  const blockNumber = await client.getBlockNumber();
  const [router, revision] = await Promise.all([
    client.readContract({ address: registry, abi: registryAbi,
      functionName: "router", blockNumber }),
    client.readContract({ address: registry, abi: registryAbi,
      functionName: "moduleRevision", blockNumber }),
  ]);
  return { blockNumber, router, revision };
}

この断片だけでは全接続を検証せず、署名も許可しません。リポジトリ画面は resolveReleasereadReleaseassertCurrentDeployment で確認します。

署名前にモジュールと改訂を利用者の確認済み状態と比較します。承認先を無断で切り替えてはいけません。

複数の買い壁を読む

予定 hook ビュー 結果 / 用途
wallCount() 過去 ID 数。有効ポジション数とは異なる
activeWallCount() 読取り状態の有効買い壁数
activeWallId(index) 現在の有効一覧 index にある永続 ID
latestWallId() 最新資金配置買い壁 ID。先に存在確認
walls(id) (int24 lower, uint128 liquidity, uint256 idleEth, uint256 fundedEth)
wallIdleEth() 買い壁に帰属する ETH 残余合計

吸収後は有効一覧の index が変わり得ます。走査 index でなく買い壁 ID を識別子にします。 count と要素は同ブロックで読みます。

fundedEth はその tick に実際に配置した新規資金の累計で、残りの厚みではありません。idleEth は配置流動性とは別の、その買い壁に紐付く残余です。

範囲上端は lower + tickSpacing です。現在資産は配置形状と現価格、または版対応 Lens で計算します。未配置の新手数料は pendingFloorEth に分離します。

従来の floorPricenetFloorPrice は全水準を表しません。現在目標が下がれば最新買い壁の参照値も下がり得ますが、既存の tick は固定です。

単位と方向

CUBIT と ETH は小数 18 桁です。Lens 派生価格は 1e18 スケールの CUBIT 当たり ETHです。v4 tick は ETH 当たり CUBIT の向きなので、CUBIT の ETH 価格が上がると下がります。

整形前の金額・計算は整数 bigint を使います。早い Number 変換は精度を失います。「7k」は 2,100万 CUBIT 基準の FDV 7 000 USD で、ETH 換算を事前記録し初期価格を固定します。USD、wei、トークン単位を混ぜないでください。

ルーターのメソッド

swapExactIn(
    PoolKey key, bool zeroForOne,
    uint256 amountIn, uint256 amountOutMin,
    address recipient, uint256 deadline
)

swapExactOut(
    PoolKey key, bool zeroForOne,
    uint256 amountOut, uint256 amountInMax,
    address recipient, uint256 deadline
)

zeroForOne = true は ETH で CUBIT を買います。exact-input は value に amountIn、exact-output 購入は amountInMax を渡して余剰返金を受けます。売却は zeroForOne = false、value ゼロ、ルーターへの CUBIT 承認を使います。

戻り額はルーターの手取り・総額区分に従い、exact-input は手取り出力、exact-output は総入力です。不完全約定を検査し、正しいプール key と版で模擬見積もりが必要です。

イベントとエラー

旧イベントには BuyTaxedSellTaxedFloorRaisedSweepExecutedTokensBurnedBountyPaid があります。ModuleUpdated は交換を追跡し、ReferralBound は紹介紐付けを示します。

新ライブラリは対象 ID 付きの WallFundedWallAbsorbed を加えます。hook コンテキストのライブラリログは hook 発行アドレスと対応 ABI シグネチャで索引化します。

FloorRaised は旧名であり、名前だけで全水準の上昇とは言えません。中継は対象買い壁への資金配置と版のポリシーを解釈する必要があります。

ルーターでは特に ExpiredWrongPoolTooLittleReceivedTooMuchRequestedInsufficientOutputIncompleteInput を処理します。保守資格エラーと RPC エラーは別です。複数買い壁検証後にコードと ABI を再確認します。

出典: interfaces/ICubitHook.sol, interfaces/ICubitLens.sol, WallLib.sol, CubitRouter.sol および dapp/src/chain。買い壁 API は実装中の 2026 年 9 月 10 日に記述しました。

CUBIT / 2026 年 9 月 10 日 出典と方法