Skip to main content

Prerequisites

  • Sender wallet funded with native asset (ETH or SOL)
  • Recipient registered on the target chain (or pass their meta-address directly)
  • ethereumWalletClient / ethereumProvider (EVM) or solanaWallet (Solana)

High-level: one method

Solana bundles transfer + announce in one transaction (unless the announcement is delayed, see below). Ethereum submits the transfer first, then the announce (two tx hashes).

Delayed announcement (anonymity set)

Set delayAnnouncement (ms) to decouple the transfer from the announcement and break the timing correlation between the two on-chain events:
See Anonymity utilities for dummy-announcement noise as well.

Cross-chain send

Starknet sends

Starknet is supported at testnet-preview maturity. sendStealthPayment handles Ethereum and Solana only — Starknet sends go through a dedicated builder that returns unsigned transfer + announce calls for the app’s Starknet wallet to broadcast:
Enable Starknet with the starknet: {} client option. See Starknet for the full send flow, custody model, and preview caveats.

Low-level: prepare + submit yourself

Use this when you need custom gas, batching, or UI control.

Cross-chain relay (manual)

On Solana, buildAnnounceWithRelay returns instructions + extra signers (Wormhole message keypair):

Sending tokens (ERC-20 / SPL)

Set token to send an ERC-20 (Ethereum) or SPL mint (Solana) instead of the native asset. amount is the token’s smallest unit (decimals-aware). The announcement is identical to a native send, so the recipient discovers it the same way.
A fresh stealth address holds the token but no native gas, so the recipient cannot move it without help. Either set gasDrop to also send a little native asset to the stealth address, or have the recipient withdraw via a gasless sweep.

Recipient resolution

recipient accepts every identity form client.resolveRecipient understands: See resolveRecipient for setup details.