• Duel オープン Robinhood Chain で稼働中
  • デュエルをローンチ 2つのトークン、3つのプール、1回のトランザクション
  • ラウンド終了まで --:--:--
  • 4時間ごとのラウンド 勝者の買い戻しには価格上限あり
  • 流動性ロック 永久に、チーム保有トークンなし

セキュリティ

価値を持つもの

  • プールの ETH とトークン。誰も引き出せないポジションに入っています。陣営の ETH がプールから出ていくのは、その陣営がそのプールに売られたときだけです:トレーダーが売ったとき、または取引で3つの価格が離れた後に hook の再調整が売ったときです。
  • ポット、クリエイター手数料、プロトコル手数料。Uniswap V4 の PoolManager 内の ETH 請求権として hook が保有し、デュエルごとに別々に管理されています。

それを守るもの

  • ロックされた流動性。 登録されたプールを開いたり、ローンチ時の流動性を追加したりできるのはファクトリーだけです。引き出しと寄付はリバートします。
  • 限定された受取先。 ポットが買えるのは自分のデュエルの勝者だけです。クリエイター手数料は、デュエルのクリエイター(ローンチしたウォレット、または役割を譲られて承諾したアドレス)にしか届きません。プロトコル手数料は現在のトレジャリーに入ります。トレジャリーはファクトリーのオーナーが48時間後に変更でき、すでに貯まったプロトコル手数料にも適用されます。
  • 上限付きのファクトリー権限。 トークンにはオーナーもミント機能もなく、hook はアップグレードも一時停止もできません。ファクトリーのオーナーにできるのは、新しいローンチの一時停止、今後のデュエル向けの上限付き条件の提案、待機期間後のトレジャリーの変更です。また、オーナーは、すべてのデュエルのスワップ手数料におけるプロトコルの取り分をすぐにゼロまで下げたり、戻したりすることもできますが、デュエルの条件を超えることはありません。プロトコルが受け取らない分はポットに入ります。オーナーはこの役割を完全に放棄することができます(renounceOwnership)。その場合、条件、トレジャリー、プロトコルが受け取る割合、一時停止の状態はそのまま変わらず、すでに提案済みの変更だけは待機期間後に誰でも適用できます。
  • スワップの前に精算。 終了後の最初のスワップは、取引の前に、終わったラウンドをその平均で精算します。買い戻しの上限は、tick の端数まで精密に保持される参照価格の約10%上です。参照価格は ETH プールの tick の30分指数平均で、現在の tick を下限とするため、価格の下落にはすぐに追随します。
  • ETH だけで決まるラウンド。 比率とラウンドの平均は2つの ETH プールを使います。どの ETH 価格も動かさない A/B 乗り換えは、シグナルも、本来静かなラウンドの活動も変えません。
  • 完全に成立したときだけの手数料。 事前に手数料を取るスワップは、指定額を完全に満たせなければリバートします。ネットワークのガス代は別です。
  • 隔離された再調整。 利益の出るループだけを残し、売り側のプールの ETH で上限をかけます。失敗した試行は巻き戻されてスキップされます。ガス不足で失敗した場合はスワップが ArbitrageStarved でリバートするため、呼び出し元がガスを絞って再調整をスキップさせることはできません。これは価格の一致や、あらゆる取引損失からの保護を保証するものではありません。
  • どのルートでも同じルール。 ルーターが Duel のものでもほかの V4 ルーターでも、hook は手数料、税、バーンを徴収します。

ファクトリーはローンチを一時停止した状態で開始します。paused() が true の間は owner() だけがデュエルをローンチでき、他の呼び出し元は CreationPaused でリバートします。オーナーは setPaused(false) でローンチを開放します。既存デュエルの取引は継続します。

サイトが表示するもの

  • サイト経由の画像だけ。 ページには、Duel 自身のアドレスから、サイトが処理した画像だけが表示されます。JPEG、PNG、WebP をまずヘッダーから読み(最大 1536 × 1536 ピクセル、5 MB)、WebAssembly でデコードし、1024 ピクセル以内に収めて、メタデータを除いた WebP として再エンコードします。ページのセキュリティポリシーにより、ほかの場所から画像を読み込むことはできません。
  • 分離されたコーデック。 画像は専用の Worker でデコードされます。この Worker にアクセスできるのはサイトだけで、鍵もストレージも何も持っていません。コーデックに欠陥があっても、影響は読み込んだ画像だけにとどまります。サイトは Worker の応答(期待どおりのサイズの静止 WebP)を確認してから保存し、C のデコーダーは画像ごとに新しく起動されます。
  • コントラクトから直接ローンチされたデュエル。 その詳細には任意のアドレスを書けます。サイトは https の画像を表示しません。IPFS の画像は公開ゲートウェイから一度だけ取得し(最大 5 MB、10秒)、アップロードと同じように処理して自前のコピーを表示するか、陣営の頭文字を表示します。
  • 制限付きのアップロード。 サイトは自分のページからの画像だけを受け付けます。1つのアドレスから1分あたり10件まで、1日あたりの件数にも上限があります。どのデュエルにも使われていない画像は1日後に削除されます。

検証方法

  • 自動テストは、コントラクトの動作、Web アプリ、アラートボットをカバーしています。カバレッジはテストの指標であり、あらゆる動作が安全である証明ではありません。
  • フォークテストでは、Universal Router、Permit2、V4 Quoter を含む、Robinhood Chain にデプロイ済みの Uniswap V4 コントラクトとの統合を検証します。
  • 回帰テストには、手数料の会計、ローンチ時の境界ケース、精算、枯渇したプールなど、社内レビューで見つかったケースが残されています。
  • 不変条件テストは、ランダムな取引、精算、受け取りの連続を通して会計を確認します。ETH 請求権は支払うべき額と一致し、中間トークンが hook、ファクトリー、ルーターに残ってはいけません。設定された回数のテストに合格しても、あらゆる連続に対して安全であることにはなりません。

社内レビューでは、出力額指定のルートでアンチスナイプ税を回避できる問題、単独で買われた陣営に比率が追随しない問題、売り切れたプールを買い戻しの参照価格が誤って読む問題、デュエルのメタデータ内の安全でないリンクが見つかり、修正されました。

脆弱性の報告

脆弱性を見つけたと思ったら、報告に時間を割いていただきありがとうございます。Telegram の @chatwithdivine に非公開で、見つけた内容と、できれば再現方法を書いて送ってください。公に共有する前に、調査の時間をください。すぐに返信し、進捗をお知らせします。

こちらから先に連絡することは決してありません。信頼してよいのは @chatwithdivine だけです。