Skip to content

ci(abi-gate): cover OutboxDiscovery and bump the asc-contracts pin - #59

Open
DylanVerstraete wants to merge 1 commit into
mainfrom
ci/abi-gate-outbox-discovery
Open

ci(abi-gate): cover OutboxDiscovery and bump the asc-contracts pin#59
DylanVerstraete wants to merge 1 commit into
mainfrom
ci/abi-gate-outbox-discovery

Conversation

@DylanVerstraete

Copy link
Copy Markdown
Collaborator

Relayer twin of creditcoin3 #1316. asc-contracts #38 merged OutboxDiscovery with the automatic timelock (a4d05d7); our ABI drift gate was pinned at e300c166, main @ 2026-08-17 — before the contract existed.

What this adds

IOutboxDiscovery mirrored in write-ability (only the surface we read), asserted against the compiled artifact:

Events (5)OutboxRegistered, OutboxRemovalScheduled, DefaultOutboxChangeScheduled, PendingDefaultCancelled, PendingRemovalCancelled
Reads (6)defaultOutbox(uint32), activeOutboxes(uint32), isActiveOutbox, defaultDeployer(), pendingDefaultOutbox, pendingRemovalTime

A moved topic0 silently blinds a subscription, and the timelock events are our only advance notice before a default changes or an Outbox is removed. A moved selector makes a read revert with empty returndata, which the registry-first resolver cannot distinguish from "no Outbox for this chain key" — it would resolve to nothing and idle.

Notes captured in doc comments

  • effectiveTime is a unix timestamp, not a block number. Our listeners are block-indexed, so there is a conversion to write.
  • activeOutboxes() filters an Outbox out the moment its scheduled removal time passes, before cleanup runs. Membership disappearing is not the signal to stop watching one — we drain on our own in-flight state.

Deliberately not asserted

activeOutboxCount — present in the revision of #38 I reviewed, dropped before merge.

Pre-existing assertion unaffected

OutboxDeployer.outboxOf(uint32) still exists at a4d05d7, so the existing RegistryResolver assertion passes on the new pin. Separately (not this PR): outboxOf is a per-deployer mapping, and the confirmed cross-generation truth is OutboxDiscovery.defaultOutbox — that is the resolver rescope for #50, which this mirror now makes possible.

Verification

Gate run in strict mode (ABI_GATE_STRICT=1) against a fresh npx hardhat compile of a4d05d7: passes. cargo test --workspace 171 pass / 0 fail, clippy -D warnings clean, fmt clean, ci.yml parses, pinned SHA verified to resolve to the #38 merge commit on main.

https://claude.ai/code/session_01Kv6y52MHgtgkWmnJhdXbHB

asc-contracts #38 merged OutboxDiscovery with the automatic timelock. Our ABI
drift gate was pinned at main @ 2026-08-17, before the contract existed, so
nothing was checking the surface the registry-first resolver is about to read.

Mirror IOutboxDiscovery (only what we read) and assert it against the compiled
artifact: five events and six reads. A moved topic0 silently blinds a
subscription, and the timelock events are the only advance notice we get before
a default changes or an Outbox is removed. A moved selector makes a read revert
with empty returndata, which the resolver cannot distinguish from "no Outbox for
this chain key" - it would resolve to nothing and idle.

Captured in the mirror's doc comments because both are easy to get wrong later:
effectiveTime is a unix timestamp, not a block number; and activeOutboxes()
drops an Outbox the moment its scheduled removal time passes, so membership
disappearing is NOT the signal to stop watching one.

Deliberately not asserting activeOutboxCount: it existed in the reviewed
revision of #38 and was dropped before merge.

The pre-existing outboxOf assertion stays: OutboxDeployer.outboxOf still exists
at a4d05d7, so the bump is clean there too. Verified by running the gate in
strict mode against a fresh hardhat compile of a4d05d7.

Claude-Session: https://claude.ai/code/session_01Kv6y52MHgtgkWmnJhdXbHB
@cursor

cursor Bot commented Sep 3, 2026

Copy link
Copy Markdown

PR Summary

Low Risk
Adds ABI bindings and CI drift checks only; no relayer runtime or resolver behavior changes in this diff.

Overview
Aligns the Solidity↔Rust ABI drift gate with asc-contracts #38 by pinning CI’s asc-contracts checkout to a4d05d7 (post–OutboxDiscovery + automatic timelock) instead of the pre-#38 commit.

Adds IOutboxDiscovery to write-ability — a hand-maintained sol! mirror of the registry surface the relayer will read: five timelock/registration events and six view calls (defaultOutbox, activeOutboxes, isActiveOutbox, defaultDeployer, pendingDefaultOutbox, pendingRemovalTime). Doc comments note that effectiveTime is a unix timestamp and that activeOutboxes membership alone is not a reliable “stop watching” signal.

Extends abi_surface tests to assert every mirrored event topic0 and function selector against OutboxDiscovery.json from compiled artifacts (same strict CI path as other contracts). OutboxDeployer.outboxOf assertions stay; comments point default resolution at defaultOutbox for a future resolver change. activeOutboxCount is intentionally not pinned (dropped before #38 merged).

Reviewed by Cursor Bugbot for commit ac4450c. Bugbot is set up for automated code reviews on this repo. Configure here.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant