Add core-side synthetic destination for swap-to-address#730
Open
j0ntz wants to merge 1 commit into
Open
Conversation
Contributor
Author
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit edc8fbd. Configure here.
6 tasks
- EdgeSwapRequest accepts an optional toAddressInfo descriptor (toPluginId, toAddress, toMemos) as an alternative to toWallet, with exactly one of the two required. The core builds a synthetic, bridgified destination wallet backed by the real currencyConfig, so swap plugins receive an EdgeCurrencyWallet unchanged. - Destination memos (e.g. an XRP destination tag) use the descriptor only as GUI-to-core transport; plugins read them off the synthetic wallet's getMemos method (EdgeSyntheticDestinationWallet). - EdgeTxActionSwap.payoutWalletId and EdgeTxSwap.payoutWalletId become optional, since a swap-to-address destination has no payout wallet. - The pasted destination address and memo values are redacted from swap-quote logs.
j0ntz
force-pushed
the
jon/stealth-send-swap
branch
from
July 3, 2026 03:13
edc8fbd to
c12ad45
Compare
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.



CHANGELOG
Does this branch warrant an entry to the CHANGELOG?
Dependencies
none
Description
Asana task
Production implementation of swap-to-address (the core piece of Stealth Send / send-to-any-asset).
EdgeSwapRequestaccepts an optionaltoAddressInfodescriptor as an alternative totoWallet(exactly one of the two required); the core builds a synthetic, bridgified destination wallet from it, backed by the realcurrencyConfig, so swap plugins receive anEdgeCurrencyWalletunchanged. Nothing Houdini-specific lives in core: the same mechanism powers provider-agnostic send-to-any-asset (verified in-app with a ChangeNOW-routed cross-chain send).Judgement calls, with alternates:
EdgeSwapToAddressInfocarries onlytoPluginId,toAddress, and optionaltoMemos.toPluginIdselects thecurrencyConfig(not derivable from the request);toAddressis the payload; the destination token comes from the request's owntoTokenId. Alternate (descriptor carryingtoTokenId) was rejected as a two-sources-of-truth hazard.getMemoson the synthetic wallet. For memo-required payout chains (e.g. an XRP destination tag), the descriptor'stoMemosis only the GUI-to-core transport; plugins never read the descriptor. The synthetic wallet exposesgetMemos()(EdgeSyntheticDestinationWallet), so the plugin-facing mechanism stays wallet-shaped. Alternate (plugins reading a tag field off the request descriptor) was rejected to keep the plugin interface generic. A pure no-descriptor design is not physically possible: the value must cross the GUI-core bridge somewhere, and the descriptor is the plain-data channel that crosses yaob cleanly.EdgeTxActionSwap.payoutWalletIdandEdgeTxSwap.payoutWalletIdare both optional now. A swap-to-address destination has no payout wallet;payoutAddresscarries the destination. Making only the action type optional (the prototype state) left a latent inconsistency inEdgeTxSwap. Alternate (keeping them required and writing the syntheticsynthetic://<pluginId>id) was rejected: it embeds fake wallet ids in persistent tx metadata.The yaob bridge-crossing proof test covers descriptor-only construction, plugin-faithful reads, memo round-trip via
getMemos, and the synthetic surviving the wire format back to the GUI.Testing:
tscclean, 166 mocha tests pass (3 new), eslint clean. In-app verification (linked into edge-react-gui with the Stealth Send UI): a real cross-chain send-to-address executed on the iOS sim through this mechanism (Base ETH to an Ethereum address via ChangeNOW, deposit broadcast on-chain, swap success scene reached).Note
Medium Risk
Touches the central swap quote path and public API types (
EdgeSwapRequest, swap tx metadata); plugins unchanged but GUI consumers assumingpayoutWalletIdis always set need updates.Overview
Enables swap-to-address (private send / send-to-any-asset) by letting
EdgeSwapRequestspecify eithertoWalletor a newtoAddressInfodescriptor (toPluginId,toAddress, optionaltoMemos). The core validates exactly one destination, thenresolveSwapRequestinfetchSwapQuotesbuilds a bridgified syntheticEdgeCurrencyWalletfrom realcurrencyConfigso existing swap plugins still see a normaltoWallet(addresses/receive address return the pasted destination; optionalgetMemosonEdgeSyntheticDestinationWalletfor tags).payoutWalletIdonEdgeTxActionSwapandEdgeTxSwapis now optional when there is no payout wallet;payoutAddressholds the destination. Disk cleaners andSwapCurrencyErrorwere updated for optionaltoWallet/toAddressInfo. Swap quote logging redacts pasted addresses and memo values.New tests cover synthetic wallet behavior across the yaob bridge.
Reviewed by Cursor Bugbot for commit c12ad45. Bugbot is set up for automated code reviews on this repo. Configure here.