Skip to content

Reference

transferToPreapproved

Iterate multi-recipient TransferPreapproval_Send commands with shared mining round and AmuletRules disclosures for parties that already exposed preapproval contracts.

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 with readAs inputs for amulet selection.
  • transfers (required, non-empty array) — Each item has recipientPartyId, amount, optional description.

Throws ValidationError if transfers is empty.

Returns

Promise<TransferToPreapprovedResult> — Array of recipientPartyId, contractId, domainId, and the per-leg transaction tree responses.

Errors

  • INSUFFICIENT_FUNDS when sender has no unlocked Amulets.
  • MISSING_DOMAIN_ID / MISSING_CONTRACT when 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.

See also

Source

src/utils/amulet/transfer-to-preapproved.ts