Disclosure policy
Sender may be public or private. Private sender and this escrow send both require Protocol Relay. Recipient, asset, and amount stay private.Transact environment hooks
Unregistered recipients needresolveTransferRecipientAtExecute on transactEnvironment. The default chain resolver (resolveTransferRecipientFromChain) looks up the registry, then derives an escrow key from a random nonce and the recipient’s Stellar G-address. That pins exactly one recipient to the note. Public escrow recipient limbs stay zero on send, so the transaction matches an ordinary private transfer.
The hook is registered during client bootstrap (see Setup). Use a client slot assigned after createStellarPrivacyClient — do not close over client before it exists. Custom resolvers should return escrowSend with the derived nonce and G-address limbs rather than a temporary private address.
escrow_relay_unconfigured and wallet submission is not offered. operation.execute() is Direct Submission and does not complete an escrow send.
Example
Calltransfer with a public Stellar to address and the same private disclosure as a registered transfer.
Seed state
Run operation
relayOperation from operation.prepared (prepareRelayTransactPackageFromPrepared + serializeRelayPackage, submissionPath: 'relay'). Complete port implementations: Examples.
The SDK derives the escrow note owner at execute-time resolution. It does not put the recipient G-address in pool calldata or the relay package on send.
Discover notes sent before registration
A recipient who registers later can still find notes that were sent to their public wallet. Escrow discovery uses blinded recipient tags, not the retired pending-claim client API. Your stand may provide a tag-issuance / storage origin. Production apps often fetch the challenge and issued tags from that service, then sign the challenge with the wallet. When your app builds the challenge string locally, usebuildBlindedRecipientTagChallengeMessage so the UTF-8 bytes match issuance (same labeled-line shape as a private-note spend key).
Sign the message with a current account signer, then present the signature to your tag-issuance integration. Issued blinded recipient tags (one per tag epoch) are how the recipient looks up notes without revealing their address to the index.
To claim a discovered note, fetchEscrowOutputNoteEvents reads the output-note ciphertexts through the existing transact environment (do not pass an RPC URL). After proving the sweep, submit it with Direct Submission: the claimant wallet is from and signs the transaction envelope. Protocol Relay is not used for sweeps.
Related
Examples
Explore the frontend and backend reference applications.
State methods
Seed state is a doc fixture; production data flows.
Disclosure policy
Private escrow disclosure constraints.