Sicherheit
Was Wert hat
- Das ETH und die Token der Pools, in Positionen, die niemand abziehen kann. Das ETH einer Seite verlässt ihren Pool nur, wenn diese Seite in ihn verkauft wird: von einem Trader oder von der Neuausrichtung des Hooks, nachdem ein Trade die drei Preise auseinandergezogen hat.
- Die Pots, die Creator-Gebühren und die Protokollgebühren, die der Hook als ETH-Ansprüche im PoolManager von Uniswap V4 hält, für jedes Duell getrennt verbucht.
Was es schützt
- Gesperrte Liquidität. Nur die Factory kann registrierte Pools eröffnen oder ihre Launch-Liquidität hinzufügen; Abhebungen und Spenden werden rückgängig gemacht.
- Begrenzte Empfänger. Ein Pot kauft nur den Gewinner seines Duells; Creator-Gebühren gehen nur an den Creator des Duells: die Wallet, die es gestartet hat, oder eine Adresse, an die sie ihre Rolle übergeben hat und die sie angenommen hat. Protokollgebühren gehen an die aktuelle Treasury, die der Owner der Factory nach 48 Stunden ändern kann, auch für bereits angesammelte Protokollgebühren.
- Begrenzte Befugnisse der Factory. Token haben keinen Owner und keine Mint-Funktion, und der Hook kann weder upgegradet noch pausiert werden. Der Owner der Factory kann neue Launches pausieren, begrenzte Konditionen für künftige Duelle vorschlagen oder nach der Wartezeit die Treasury ändern. Er kann außerdem den Anteil des Protokolls an der Swap-Gebühr aller Duelle sofort senken, bis auf null, oder wieder anheben, nie über die Konditionen des Duells: Was das Protokoll nicht nimmt, geht in die Pots. Der Owner kann die Rolle endgültig aufgeben (
renounceOwnership): Konditionen, Treasury, der Satz des Protokolls und eine Pause bleiben dann, wie sie sind, außer einer bereits vorgeschlagenen Änderung, die jeder nach ihrer Wartezeit noch anwenden kann. - Abrechnung vor dem Swap. Der erste Swap nach einem Schluss rechnet den abgeschlossenen Durchschnitt ab, bevor gehandelt wird. Die Obergrenze eines Rückkaufs liegt etwa 10 % über einer Referenz, die mit Bruchteil-Tick-Genauigkeit gehalten wird: ein exponentieller 30-Minuten-Durchschnitt der Ticks des ETH-Pools, auf höchstens den aktuellen Tick begrenzt, sodass sie dem Preis sofort nach unten folgt.
- Runden nur in ETH. Die Verteilung und der Durchschnitt der Runde nutzen die beiden ETH-Pools. Ein A/B-Wechsel, der keinen ETH-Preis bewegt, ändert weder das Signal noch die Aktivität einer sonst ruhigen Runde.
- Gebühren nur bei vollständiger Ausführung. Vorab belastete Swaps werden rückgängig gemacht, wenn sie den angefragten Betrag nicht vollständig ausführen können. Netzwerk-Gas kommt hinzu.
- Isolierte Neuausrichtung. Nur profitable Schleifen werden behalten, begrenzt durch das ETH des verkaufenden Pools. Ein fehlgeschlagener Versuch wird zurückgerollt und übersprungen; bei Gasmangel wird der Swap rückgängig gemacht (
ArbitrageStarved), damit ein Aufrufer sie nicht durch zurückgehaltenes Gas überspringen kann. Das garantiert weder übereinstimmende Preise noch Schutz vor allen Handelsverlusten. - Dieselben Regeln auf allen Routen. Der Hook erhebt Gebühren, Steuern und Burns, ob der Router der von Duel ist oder ein anderer V4-Router.
Die Factory startet mit pausierten Launches. Solange paused() true ist, kann nur owner() ein Duell starten; Aufrufe anderer werden mit CreationPaused rückgängig gemacht. Der Owner öffnet die Launches mit setPaused(false). Bestehende Duelle werden weiter gehandelt.
Was die Website zeigt
- Bilder nur von der Website. Die Seiten zeigen die Bilder eines Duells nur von Duels eigener Adresse und nur Bilder, die die Website verarbeitet hat: ein JPEG, PNG oder WebP, zuerst anhand seines Headers gelesen (höchstens 1536 × 1536 Pixel und 5 MB), in WebAssembly dekodiert, auf höchstens 1024 Pixel eingepasst und erneut als WebP kodiert, ohne seine Metadaten. Die Sicherheitsrichtlinie der Seiten erlaubt ihnen nicht, Bilder von anderswo zu laden.
- Getrennte Codecs. Die Bilder werden in einem eigenen Worker dekodiert, den nur die Website erreicht und der nichts hält: keinen Schlüssel, keinen Speicher. Ein Fehler in einem Codec würde nur das Bild erreichen, das er liest. Die Website prüft, was dieser Worker zurückgibt (ein statisches WebP in der erwarteten Größe), bevor sie es behält, und die C-Decoder starten für jedes Bild neu.
- Direkt über den Vertrag gestartete Duelle. Ihre Angaben können jede Adresse nennen. Die Website zeigt keine https-Bilder; ein IPFS-Bild holt sie einmal von einem öffentlichen Gateway (höchstens 5 MB und 10 Sekunden), verarbeitet es wie einen Upload und zeigt ihre eigene Kopie oder die Initialen der Seite.
- Begrenzte Uploads. Die Website nimmt Bilder nur von ihren eigenen Seiten an: zehn pro Minute von einer Adresse und eine begrenzte Anzahl pro Tag. Ein Bild, das kein Duell nennt, wird nach einem Tag entfernt.
Wie es geprüft wurde
- Automatisierte Tests decken das Verhalten der Verträge, die Web-App und den Alert-Bot ab. Coverage ist eine Testmetrik, kein Beweis, dass jedes mögliche Verhalten sicher ist.
- Fork-Tests prüfen die Integration mit den auf Robinhood Chain deployten Uniswap-V4-Verträgen, einschließlich Universal Router, Permit2 und V4 Quoter.
- Regressionstests bewahren Fälle, die bei der internen Prüfung gefunden wurden, darunter Gebührenbuchhaltung, Randfälle beim Launch, die Abrechnung und leergekaufte Pools.
- Invariantentests prüfen die Buchhaltung über zufällige Abfolgen von Trades, Abrechnungen und Abholungen: ETH-Ansprüche müssen den geschuldeten Beträgen entsprechen, und Zwischentoken dürfen nicht im Hook, in der Factory oder im Router zurückbleiben. Das Bestehen der konfigurierten Durchläufe belegt keine Sicherheit für jede mögliche Abfolge.
Die interne Prüfung fand und behob eine Exact-Output-Route um die Anti-Snipe-Steuer herum, eine Verteilung, die einer allein gekauften Seite nicht folgte, leergekaufte Pools, die der Referenzpreis des Rückkaufs falsch las, und unsichere Links in den Metadaten eines Duells.
Eine Schwachstelle melden
Wenn du glaubst, eine Schwachstelle gefunden zu haben, danke, dass du dir die Zeit nimmst, sie zu melden. Schreib uns privat auf Telegram an @chatwithdivine, was du gefunden hast und, wenn möglich, wie man es reproduziert, und gib uns Zeit, es zu prüfen, bevor du etwas öffentlich teilst. Wir antworten schnell und halten dich auf dem Laufenden.
Wir schreiben nie zuerst: Vertraue nur @chatwithdivine.