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 resolveTransferLinkSenderView → prepareTransferViaTransferLink (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>
| Parameter | Type | Required | Description |
|---|---|---|---|
asset | AssetAmount | yes | Amount that stays private |
to | Address | yes | Connected 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.