Bug: Transfer status page stuck at step 4 after successful withdraw_execute #106
Labels
No labels
agent:implement
agent:ready
backend
bug
cannot-reproduce
confirmed
desktop
docs
documentation
duplicate
enhancement
feature
frontend
good first issue
help wanted
high-risk
in-review
invalid
mobile
needs-triage
P0-critical
P1-high
P2-medium
P3-low
qa
QA
question
ready
report
responsive
security
security-escalate
smart-contract
solana
tablet
test-pass
ux
wallet-issue
wallet:keplr
wallet:metamask
wallet:station
wallet:walletconnect
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-bridge-monorepo#106
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Mainnet v0.1.82 (
7cb18b3+ operator hotfix 4/10)BSC->Solana 0.995 testa nonce 41 (hash 0xf443ffa5d976107d...). Full flow completed -- tokens received in Backpack wallet (confirmed 0.995 testa SPL). But the transfer status page remains at step 4/5 (EXECUTE ON SOLANA active), never flips to step 5 COMPLETE. Waited 10+ minutes.
Likely cause: TransferStatusPage polls on-chain state via api.mainnet.solana.com (wallet default RPC) which returns 403. Frontend cannot detect the completed withdrawal. Related to #102 (SolanaRecipientExecutePanel RPC 403 issue).
Acceptance criteria:
mentioned in issue #107
@brouie Triage (repo
main):TransferStatusPagealready pollsuseMultiChainLookup→querySolanaPendingWithdrawwithwithSolanaReadFallbackover merged bridge RPC URLs. We also extendeduseTransferStatusRefreshso homepage recent transfers poll Solana destinations the same way (parity with #106 / #102). Please re-test the status page and home badges on a current build; close if step 5 / lifecycle updates correctly afterwithdraw_execute.mentioned in commit
5fc9eb4b50mentioned in issue #102
Retested on new deploy (main-CHZ1ahQz, 4/13). Active transfers (nonce 42, Approved state) now show full dest data on verify page -- RPC reads working. But completed transfers (nonce 41, already executed on 4/10) show 'HASH NOT SUBMITTED' with all dest fields blank. The pending-withdraw PDA is closed after execute, so there's no on-chain record left for the frontend to read. This is a design issue -- Solana has no post-execution state to query unlike EVM/Terra.
Confirmed again on 4/13 with BSC->Solana 1.99 testa nonce 43. Execute succeeded -- tokens received in Backpack (11.94 testa).
Hash: 0x52f4af7a5a1d01fd747342a0a22a0357f998928e3c7263c9da8989337cce39fa
Transfer status page: stuck at step 4/5, never advances to Complete.
Verify page: shows PENDING + 'Pending verification'. Source deposit data populated (nonce 43, amount 1990000000000000000, timestamp 4/13/2026 1:07:33 PM). All dest fields show dashes. 'HASH NOT SUBMITTED TO DESTINATION' even though withdrawSubmit, approval, and execute all succeeded.
Root cause: pending-withdraw PDA closes on execute, no on-chain record left for frontend to read. Affects both transfer status and verify pages for all completed Solana transfers. Confirmed on nonces 41 and 43.
Additional finding: signatureSubscribe websocket returns malformed responses on every Solana transfer tested today. Console error: 'Server response malformed. Response must include either result or error, but not both.' This may be contributing to the step 4->5 detection failure -- the frontend subscribes to the execute tx signature but the subscription response is broken, so it never gets the confirmation callback.
mentioned in commit
f227b6fb64Update (signatureSubscribe / malformed WebSocket JSON-RPC)
Root cause for the console error "Server response malformed. Response must include either result or error, but not both" was in
rpc-websockets(used by@solana/web3.jsforConnectionWebSockets). The library treated("error" in msg) === ("result" in msg)as invalid. That is true when both keys exist — includingerror: nullplusresult, which some Solana RPCs return — soconfirmTransaction/ signature subscription could fail even though the tx succeeded.Fix:
packages/frontend/patches/rpc-websockets+9.3.3.patch— only reject when neithererrornorresultis present, and return after the malformed path so the queue is not settled twice. Regression tests:src/services/solana/jsonRpcWebsocketResponse.test.ts. README note in the frontend package.Commit:
f227b6fonmain.@brouie — please review the patch and re-test transfer status step 4→5 after deploy; the pending-withdraw PDA closed after execute issue remains a separate UX/data concern for verify/history, but this should unblock WebSocket confirmation when the RPC sends
error: nullalongsideresult.Leaving open until you confirm on mainnet.
@PlasticDigits Retested on build
f227b6f(websocket patch). 3 fresh transfers (BSC nonce 47, opBNB nonce 26, Terra nonce 59) all executed successfully -- tokens received in Backpack (19.6 testa). But UI still stuck at step 4/5 on all 3. signatureSubscribe malformed error still appearing in console. The websocket patch did not resolve the step detection issue.@PlasticDigits Re-test on build v0.1.82 -
f227b6f(frontend bundle main-CvcBOh67), 4/20 mainnet. Providing complete debug payload per new standard.Failing transfer (Solana destination) -- step 5 stuck
XChain Hash ID: 0x082a0e1b9884e276b7f8205e976bda32412d6dcb918e81b1e8e1668bcbc4fdef
Path: BSC -> Solana
Amount: 1.99 testa
Nonce: 47
Source TX: 0x9cb56f9c9483d99e14f1f25c479127c4e349e129c2553cb17311d5666b10867c
Recipient: 0xb0c8dccbb82263d1524de950d2e9d32af183d80636cc82713844803a3827a234
Wallet: Backpack (Cu6Q...aDBy)
Result: tokens received in wallet, UI stuck 1hr+ at step 4/5
UX state (step 4/5 stuck)
Note: tokens confirmed delivered to Backpack immediately after execute sign. UI never reflects completion.
Console logs (Solana failing)
Both the signatureSubscribe malformed error and block height exceeded still present after rpc-websockets+9.3.3.patch.
Passing transfer (EVM destination) -- clean step flip
XChain Hash ID: 0x63de51f92e688611b84f5f207bb01bd74730786d2d842f10d12e38038bde6074
Path: Terra -> BSC
Amount: 1.994 testa
Nonce: 60
Source TX: E63833E65A427C17428A33B0B2E0FEF4A85E04C2A0CBC1F1D56D8E11EE9726E5
Destination TX: 0xea5c94af24fa261afc0cabb8a776561f5779354cdc51898f5c0b90742d404699
Result: step 4/4 COMPLETE reached normally, cancel window visible with countdown (4:31 remaining)
Console logs (EVM passing)
No signatureSubscribe errors, no block height exceeded. Clean sequential flow.
Structural observation
EVM destinations show 4 steps (COMPLETE = step 4). Solana destinations show 5 steps (COMPLETE = step 5, after EXECUTE ON SOLANA). The extra Solana step is the user-initiated withdraw_execute. Step 5 transition is where the UI hangs -- the PDA closes on execute and there's no post-execution on-chain state for the frontend to poll for COMPLETE detection. Additionally the signatureSubscribe websocket subscription for the execute tx doesn't fire a clean callback due to the malformed response issue.
Summary
mentioned in issue #110
mentioned in issue #111
Fix landed on
main(commitf554a52)Root cause
On Solana,
withdraw_executecloses thePendingWithdrawPDA (rent returned to the recipient) and creates anExecutedHashmarker account so the hash cannot be reused. The frontend only queriedPendingWithdrawviaquerySolanaPendingWithdraw. After a successful execute, that account is gone, so the RPC returnednulland the UI never treated the transfer as finished — even when tokens had already arrived. This matches the stuck step 4/5 behavior independent of which RPC is used for the read.What we changed
packages/frontend/src/services/solana/solanaBridgeQueries.ts: ifPendingWithdrawis missing, we derive the["executed", hash]PDA and, when the account exists and matches the AnchorExecutedHashlayout, we return a syntheticPendingWithdrawDatawithexecuted: truesouseMultiChainLookup,useTransferStatusRefresh,useApprovalCountdown, andTransferStatusPagecan advance lifecycle to completed.packages/frontend/src/services/solana/solanaBridgeQueries.test.ts(discriminator checks for the executed marker).Related
api.mainnet.solana.comand using bridge RPCs — that is still worth tracking for wallet-driven paths (#102), but the completion detection gap above was the structural reason the stepper could stay on “Execute on Solana” forever after a good execute.@Brouie — can you verify on mainnet after the next frontend deploy that a BSC → Solana transfer reaches step 5 COMPLETE once
withdraw_executesucceeds? If anything still fails, a concrete xchain hash + wallet RPC in use would help narrow RPC vs UI.@PlasticDigits Fix verified on build v0.1.82 -
dae31d3(frontend bundle main-CSMgjCa4), 4/20 mainnet.Fresh BSC -> Solana testa 1.99 test:
XChain Hash ID: 0x3a9cd67d15d34b9e0bed012e3615770b160fd9c596d62c132535a7be3a0c34c2
Source TX (BSC): 0x5a6ca5771b4e70863085babdb6d7d70ddd24aa49c8d3451c4a81ba010ffba96f
Recipient: 0xb0c8dccbb82263d1524de950d2e9d32af183d80636cc82713844803a3827a234
Nonce: 49
Result: All 5 steps flipped through to COMPLETE automatically
UX state after execute:
Commit
f554a52(detect Solana transfer completion via ExecutedHash PDA) resolves the step 4 -> 5 hang. ExecutedHash PDA polling now provides the completion signal, bypassing the broken websocket subscription. History tab also confirms -- all Solana-destination transfers in recent history now show 'Complete' badge (previously stuck at 'Approved').Note: signatureSubscribe malformed and block height exceeded errors still present in console but no longer block completion detection. Those are cosmetic and can be tracked separately if needed.
Closing #106.