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