Blocking
Migration tooling is broken; the repo is not the source of truth for the prod schema
Migration tooling is broken; the repo is not the source of truth for the prod schema
supabase db reset and npx supabase test db fail: migration 20260529090000 references public.rate_limits before any migration creates it. Two duplicate version timestamps were fixed, but that was only the first blocker.Production tracks 86 migrations and does not record the local colliding versions. The pgTAP test supabase/tests/quotes_anon_write_lockout.sql cannot run until this is repaired.Consequence: no local reproduction of the production schema, and no database tests.Mainnet keeper wallet is unfunded on every chain
Mainnet keeper wallet is unfunded on every chain
Three inconsistent forwarder gas measurements
Three inconsistent forwarder gas measurements
DEM attribution is unknown
DEM attribution is unknown
CALL, and neither the TIP nor the docs resolve it.Consequence: blocks the per-customer forwarder design. The decision is irreversible once proxies are deployed.Correctness
railEconomics floor values are 62–127x wrong
railEconomics floor values are 62–127x wrong
Late payments to settled forwarders are invisible
Late payments to settled forwarders are invisible
WATCH_STATUSES in pool-indexer-poll omits swept and settled. Once an intent terminalises, its forwarder stops being watched forever — no event, no status change, no webhook, nothing on any dashboard. Funds are recoverable because the forwarder is re-callable, but nothing surfaces them.Connect rail waits for the sweep before confirming
Connect rail waits for the sweep before confirming
payment_confirmed event and the done state gate on the subsequent keeper sweep. The UX is stricter than the policy, delaying the merchant’s completion signal.Underpaid invoices have no exit path
Underpaid invoices have no exit path
refund() removed, a partial payment sits in a forwarder with no way to complete or return it without manual intervention. Needs a customer top-up prompt plus a merchant sweep-and-refund action.Late payments honour the expired quote's amount
Late payments honour the expired quote's amount
Payment links: single-use not enforced, amount overridable
Payment links: single-use not enforced, amount overridable
payment_links.status is never flipped to paid server-side, so a settled link keeps opening a working checkout. The checkout page feeds the wizard from editable URL parameters rather than the resolved link row, so a fixed amount is not authoritative. Comma-locale amounts parse as NaN.RouterFee V3_SWAP_EXACT_OUT mis-encoding
RouterFee V3_SWAP_EXACT_OUT mis-encoding
0x09, which is V2’s opcode. Requires a redeploy. Phase 2 only, so not currently on the default path — but do not build on payWithSwap.Visibility and trust surfaces
Partner earnings always display $0.00
Partner earnings always display $0.00
Webhook 'none' secret and signature mismatch
Webhook 'none' secret and signature mismatch
'none' secret option exists, and test and live signatures do not match.TRON has no on-chain recipient anchor
TRON has no on-chain recipient anchor
Legacy atomic rail is outside the trust anchor
Legacy atomic rail is outside the trust anchor
Contract source links disabled
Contract source links disabled
VITE_CONTRACTS_REPO_URL is unset because the marketed repository URL 404s. The audit PDF was also being served as SPA fallback HTML. Both dead trust links were removed rather than left broken.Documented and accepted
paymentIdreplay keyed onpaymentIdalone, not(merchant, paymentId). Infeasible to exploit at 128 bits of randomness (~2⁻⁶⁴). Deferred to a future redeploy.- TRON keeper drops expired intents.
- Two flaky tests —
App.test.tsx,LandingFooter— pass in isolation. - Chunk-size build warnings are pre-existing.