Rescoped — the CRITICAL fund-loss bug no longer exists
This issue originally described hardcoded zero-address HTLC params in CryptoPayment.tsx sending funds to the burn address. That code is gone — the crypto checkout has since been rebuilt on Circle CCTP V2:
CryptoPayment.tsx calls useCryptoSelect → POST /v1/checkout/:paymentId/select-crypto, which returns server-generated wallet.approve and wallet.burn calldata (the API is the only place that knows the CCTP V2 ABI).
- The client signs
approve(USDC, TokenMessengerV2, amount) then the burn using the addresses/calldata the server provides. Nothing is hardcoded; there is no client-side HTLC param construction.
- Verified (2026-07): no
0x0000… zero addresses and no htlcAddress / hashlock / timelock construction remain anywhere in apps/checkout.
The fund-loss vulnerability is resolved. Downgraded from CRITICAL/security to a minor cleanup.
Remaining work (minor)
Vestigial HTLC-era references linger and should be purged so the UI matches the CCTP model:
apps/checkout/components/ErrorCard.tsx — an HTLC_TIMEOUT error entry
apps/checkout/components/ConfirmPageClient.tsx — treats HTLC_TIMEOUT as a terminal status
Replace these with the CCTP flow's real failure modes (attestation timeout, quote expired), then do a one-off end-to-end pass of the crypto checkout on testnet (approve → burn → settle) to confirm.
Acceptance
- No
HTLC_* strings remain in apps/checkout.
- Crypto checkout approve → burn → settle verified once on testnet.
Rescoped — the CRITICAL fund-loss bug no longer exists
This issue originally described hardcoded zero-address HTLC params in
CryptoPayment.tsxsending funds to the burn address. That code is gone — the crypto checkout has since been rebuilt on Circle CCTP V2:CryptoPayment.tsxcallsuseCryptoSelect→POST /v1/checkout/:paymentId/select-crypto, which returns server-generatedwallet.approveandwallet.burncalldata (the API is the only place that knows the CCTP V2 ABI).approve(USDC, TokenMessengerV2, amount)then the burn using the addresses/calldata the server provides. Nothing is hardcoded; there is no client-side HTLC param construction.0x0000…zero addresses and nohtlcAddress/hashlock/timelockconstruction remain anywhere inapps/checkout.The fund-loss vulnerability is resolved. Downgraded from CRITICAL/security to a minor cleanup.
Remaining work (minor)
Vestigial HTLC-era references linger and should be purged so the UI matches the CCTP model:
apps/checkout/components/ErrorCard.tsx— anHTLC_TIMEOUTerror entryapps/checkout/components/ConfirmPageClient.tsx— treatsHTLC_TIMEOUTas a terminal statusReplace these with the CCTP flow's real failure modes (attestation timeout, quote expired), then do a one-off end-to-end pass of the crypto checkout on testnet (approve → burn → settle) to confirm.
Acceptance
HTLC_*strings remain inapps/checkout.