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)

Host pastes a transfer link (Quickstart · Transfer) → resolveTransferLinkSenderView (GET ticket from publicAppOrigin) → prepareTransferViaTransferLink:

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

plugin.prepareTransferViaTransferLink(args: {
asset: AssetAmount;
assetTransferLink: AssetTransferLinkSenderView;
}): Promise<PrivateOperation>
const { assetTransferLink } = await plugin.resolveTransferLinkSenderView({
transferLink, // pasted URL — not prepareTransfer(asset, to)
});
const transferOp = await plugin.prepareTransferViaTransferLink({
asset,
assetTransferLink,
});
const txHash = await plugin.broadcastPrivateOperation(transferOp);

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

Create the shareable URL with createTransferLink on the recipient Host first.

Sandbox Send sketches teach resolveTransferLinkSenderViewprepareTransferViaTransferLink (Lifecycle bind). 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 Host wallet only — not a transfer-link URL

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

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

Shared shape: Asset amount.


Next