fix: F-2026-18184 | [Dual Defense] Empty SVM CEA Recipient Encodes to Invalid Address and Strands Outbound - #341
Merged
Merged
Conversation
Honours the gateway's bytes("") parking convention on withdraw instead of rejecting "0x" pre-sign, which stranded the outbound PENDING with the PRC20 already burned. F-2026-18184.
Aman035
approved these changes
Aug 26, 2026
Keeps both sides: #338's removal of the recipient-ATA create and its NoRecipientATACreate test, plus this branch's parked-recipient sentinel resolution and tests.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
An empty recipient is the gateway's sentinel for parking funds in the caller's CEA. Core hex-encodes the raw event bytes, so it reaches the SVM builder as
"0x", which was rejected pre-sign. The outbound sat PENDING with the PRC20 already burned.The fix is to do what the user asked for, not to abort.
What changed
universalClient/chains/svm/tx_builder.goonly. All three recipient parses go through oneresolveRecipient.["push_identity", sender], the derivation this file already uses forcea_authority. The gateway short-circuits its withdraw when recipient == CEA, since finalize has already staged vault to CEA.Rollout
All UVs must be upgraded before a parked outbound can sign. A mixed fleet leaves un-upgraded UVs rejecting
"0x"while upgraded ones sign, which can hold the signing set below quorum.Tests
cea_authority.cea_authorityand recipient slots.Simulations are now gated on
RUN_SVM_SIM=1instead of a hard skip, matching develop. They need the dummy gateway's TSS PDA set to0xc681e7bdacfe4dc7209a15ff052f897c3d87008f; it currently holds a different key, so they fail on TSS auth on every branch including develop.Fixes F-2026-18184.