Skip to content

feat: express execution#36

Open
Deiadara wants to merge 9 commits into
mainfrom
feat/express-execution
Open

feat: express execution#36
Deiadara wants to merge 9 commits into
mainfrom
feat/express-execution

Conversation

@Deiadara

@Deiadara Deiadara commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

Deiadara added 9 commits July 8, 2026 13:38
Observe-only monitor for Axelar express-execution reimbursement via the
Axelarscan GMP API. Two modes: scan recent express transfers per chain, or
watch a single source tx through both phases (express-executed → executor
reimbursed). Adds the CLI subcommand, the test_express module (gmp_api +
types + orchestrator), a workflow-dispatch CI workflow, and AXE_STATE docs.
v1 is monitor-only; originating a qualifying express transfer is a follow-up.
…med-out txs

Before marking a non-Done tx failed at the inactivity timeout, query the
Axelarscan GMP API once; if the message executed on-chain, reclassify it as
successful and flag recovered_via_api. Best-effort and non-fatal (15s bound).
Promote the searchGMP client + ExpressRecord to a shared crate::gmp_api module
and reuse it from load_test and test_express.
Phase 2 now decodes the executor EOA's outbound ERC-20 Transfer in the
express tx (fronted) and its inbound Transfer in the execute tx
(reimbursed) from the GMP-API receipt logs, and asserts they are equal.
Mismatch or missing inbound is surfaced as an error and fails the
single-tx watch; fronted/reimbursed base-unit amounts are printed in both
modes. Closes the MOU-26 manual-check gap (MOU-27).
The poll path's EVM gateway checks (isMessageApproved / isMessageExecuted /
isCommandExecuted) called .call().await? directly. A single transient RPC
blip (5xx / 429 / dropped connection) in any poll cycle propagated up through
poll_pipeline and aborted the whole verification run, marking every in-flight
tx failed. The cosmos LCD, Sui, Solana and XRPL paths already have
fallback/retry; EVM (the dominant mainnet destination class) did not.

Wrap all three read-only, idempotent view-calls in retry_all (3 attempts,
geometric backoff) — the exact use case the retry module documents for alloy
provider calls.
…rors

The load-test verifier polls is_message_approved / is_message_executed on the
Stellar gateway through simulate_view, which called simulate_transaction_envelope
with no retry. A transient Stellar RPC hiccup (connection reset / 5xx) in any
poll cycle aborted the whole verification run — observed live on a mainnet
hyperliquid->stellar route that had already executed on-chain (the message was
delivered, but the verifier crashed on a connection reset at rpc.rs:746).

Wrap the read-only simulation in retry_all (3 attempts, geometric backoff),
mirroring the EVM destination view-call retry and the existing XRPL account_info
retry. Same bug class as the EVM fix, now closed for Stellar too.
@Deiadara Deiadara force-pushed the feat/express-execution branch from 6806994 to 47b9656 Compare July 8, 2026 10:41
@Deiadara Deiadara requested a review from MakisChristou July 8, 2026 10:42
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.

2 participants