transferToPreapproved resolves Amulet rules plus mining-round context once, gathers sender inputs via getAmuletsForTransfer, then for each TransferRequest loads recipient lookupTransferPreapprovalByParty and lookupFeaturedAppRight, assembles TransferPreapproval_Send, and submits sequentially (one command per iteration) with disclosed Amulet rules, open mining round, featured app right, and transfer preapproval contracts.
Setup
import { transferToPreapproved } from '@fairmint/canton-node-sdk';
const canton = new Canton({
network: 'NETWORK_NAME',
partyId: 'SENDER_PARTY_ID',
});
Minimal example
const { transferResults } = await transferToPreapproved(canton.ledger, canton.validator, {
senderPartyId: 'SENDER_PARTY_ID',
transfers: [
{
recipientPartyId: 'RECIPIENT_A',
amount: '10',
description: 'Invoice 42',
},
],
});
console.log(transferResults[0]?.transferResult.transactionTree.updateId);
Parameters
TransferToPreapprovedParams:
senderPartyId(required) — Acts as sender; must align withreadAsinputs for amulet selection.transfers(required, non-empty array) — Each item hasrecipientPartyId,amount, optionaldescription.
Throws ValidationError if transfers is empty.
Returns
Promise<TransferToPreapprovedResult> — Array of recipientPartyId, contractId, domainId, and the per-leg transaction tree responses.
Errors
INSUFFICIENT_FUNDSwhen sender has no unlocked Amulets.MISSING_DOMAIN_ID/MISSING_CONTRACTwhen validator lookups omit data (for example missing featured app right).
Auth and party
Each submission actAs is senderPartyId. Recipients must already have TransferPreapproval and FeaturedAppRight contracts discoverable via validator APIs.