Skip to main content

prepareTransfer — Private transfer

Move value inside Protocol private settlement. Recipient discovery uses private transfer links (not the privacy mechanism — privacy is client-side ZK Proofs (Noir) on protocol state).

Cross-wallet (preferred)

Sender pastes a transfer link (Quickstart · Transfer) → core.resolveTransferLink (GET ticket from publicAppOrigin) → core.prepareTransferFromLink:

plugin.core.resolveTransferLink(args: {
transferLink: string;
}): Promise<{ assetTransferLink: AssetTransferLinkSenderView }>

plugin.core.prepareTransferFromLink(args: {
asset: AssetAmount;
assetTransferLink: AssetTransferLinkSenderView;
}): Promise<PrivateOperation>
const { assetTransferLink } = await plugin.core.resolveTransferLink({
transferLink, // pasted URL — not prepareTransfer(asset, to)
});
const transferOp = await plugin.core.prepareTransferFromLink({
asset,
assetTransferLink,
});
const txHash = await plugin.broadcast.privateOperation(transferOp);

Requires publicAppOrigin on SDK Plugin Config (same pin as core.createTransferLink). Ticket GET is GET \{publicAppOrigin\}/api/asset-transfer-links/\{hash\} (public, unauthenticated).

Create the shareable URL with core.createTransferLink on the recipient wallet first.

Sandbox Send sketches teach core.resolveTransferLinkcore.prepareTransferFromLink. Lab Prepare substitutes an orientation sender-view ticket (cannot GET a live ticket on the docs origin).

Self-transfer (Kohaku Address verb)

plugin.prepareTransfer(asset: AssetAmount, to: Address): Promise<PrivateOperation>
ParameterTypeRequiredDescription
assetAssetAmountyesAmount that stays private
toAddressyesConnected wallet only — not a transfer-link URL

prepareTransfer(asset, to) is self-transfer only (to must equal the connected wallet). It still builds a transfer-link-shaped recipient from local control material. Cross-wallet EOAs use core.prepareTransferFromLink.

// Self-transfer Address surface — not cross-wallet paste
const transferOp = await plugin.prepareTransfer(asset, WALLET_ADDRESS);
const txHash = await plugin.broadcast.privateOperation(transferOp);

Shared shape: Asset amount.


Next