Skip to content

watchtower: no autonomous claim is reachable on ANY chain — track the three gates that would arm it #519

Description

@Zyrtnin

src/pyrxd/gravity/watch/README.md states it plainly:

NOT REACHABLE FROM ANY ENTRYPOINT — there is no way to arm it today. watchtower_run.py builds only the RefundExecutor; no --arm-claim / --claim-rxd-wallet flag exists anywhere in the repo (this README previously documented both, which was wrong).

This is a deliberate deferral, not an oversight, and the mechanism itself is built, tested and correct — typed discriminator, dormancy, value-vs-reorg cap, low_corroboration hard-stop, and a fresh assess_claim_finality SAFE re-assert plus covenant-still-unspent check immediately before broadcasting.

Why this needs an issue rather than a README paragraph

Arming is gated on three preconditions that today live only in prose:

  1. an independent ≥2-source RXD quorum deployment (not just the code path — the actual endpoints)
  2. a dust proof (P3)
  3. the external audit (P4)

A precondition recorded only in a README is a claim that can decay, and this repo has now produced three instances of exactly that in one review: is_debug documented as wired while the code read the global directly; a coverage exemption whose stated rationale had become false; and this README, which previously documented both executors as wired when neither claim held.

Scope note that matters for the release story

decide() sets autonomous_asset_claim only on the BTC↔RXD SAFE branch, never on ETH. But since nothing can arm the executor on either chain, the accurate statement today is "there is no autonomous claim on any chain" — the BTC/ETH split gates a path nothing reaches. Worth stating that way in release notes, because "the watchtower will catch it" reads stronger than what ships.

Current exposure

Alert-only. On a two-party ERC-20 swap: the maker claims the counter leg, p becomes public, and the taker must claim the RXD covenant before the maker's CSV refund matures. A human has to act inside t_rxd. That is a legitimate design — but a two-party run conducted this way proves the protocol, not the unattended safety story, and the distinction should be explicit in whatever that run reports.

What would close this

Either arm it behind an explicit flag once the three gates are met, or record a decision that it stays dormant and adjust the docs that lean on it. ETH parity looks structurally cheap if it is armed at all — the RXD covenant spend is identical, and _taker_claim_eth_from_vulnerable already scrapes p from an ETH claim tx.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    securitySecurity-related work

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions