@fairmint/canton-node-sdk
Version:
Canton Node SDK
98 lines • 5.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.transferToPreapproved = transferToPreapproved;
const mining_rounds_1 = require("../mining/mining-rounds");
const disclosed_contracts_1 = require("../contracts/disclosed-contracts");
const get_amulets_for_transfer_1 = require("./get-amulets-for-transfer");
/**
* Transfers coins to a party that has pre-approved transfers enabled
*
* @param ledgerClient - Ledger JSON API client for submitting commands
* @param validatorClient - Validator API client for getting network information
* @param params - Parameters for the transfer
* @returns Promise resolving to the transfer result
*/
async function transferToPreapproved(ledgerClient, validatorClient, params) {
// Get network information
const [amuletRules, miningRoundContext, featuredAppRight] = await Promise.all([
validatorClient.getAmuletRules(),
(0, mining_rounds_1.getCurrentMiningRoundContext)(validatorClient),
validatorClient.lookupFeaturedAppRight({ partyId: params.recipientPartyId })
]);
const { openMiningRound: openMiningRoundContractId, } = miningRoundContext;
if (!featuredAppRight.featured_app_right?.contract_id) {
throw new Error('No featured app right found');
}
const featuredAppRightContractId = featuredAppRight.featured_app_right.contract_id;
// Get amulet inputs for the sender party
console.log('🔍 Fetching amulet inputs for sender party...');
const amulets = await (0, get_amulets_for_transfer_1.getAmuletsForTransfer)({
jsonApiClient: ledgerClient,
readAs: [params.senderPartyId]
});
if (amulets.length === 0) {
throw new Error(`No unlocked amulets found for sender party ${params.senderPartyId}`);
}
// Convert amulets to input format
const inputs = amulets.map(amulet => ({
tag: 'InputAmulet',
value: amulet.contractId
}));
console.log(`📦 Found ${amulets.length} amulets for transfer`);
// Create the transfer command using TransferPreapproval_Send
const transferCommand = {
ExerciseCommand: {
templateId: '#splice-amulet:Splice.AmuletRules:TransferPreapproval',
contractId: params.transferPreapproval.contractId,
choice: 'TransferPreapproval_Send',
choiceArgument: {
context: {
amuletRules: amuletRules.amulet_rules.contract.contract_id,
context: {
openMiningRound: openMiningRoundContractId,
issuingMiningRounds: [],
validatorRights: [],
featuredAppRight: featuredAppRightContractId
}
},
inputs,
amount: params.amount,
sender: params.senderPartyId,
description: params.description || null
}
}
};
// Build disclosed contracts (TransferPreapproval contract details are provided explicitly)
const transferPreapprovalContractInfo = (0, disclosed_contracts_1.createContractInfo)(params.transferPreapproval.contractId, params.transferPreapproval.createdEventBlob, params.transferPreapproval.synchronizerId, params.transferPreapproval.templateId);
if (!amuletRules.amulet_rules.domain_id) {
throw new Error('Amulet rules domain ID is required');
}
// Build the full disclosed contracts list
const disclosedContractsParams = {
amuletRules: (0, disclosed_contracts_1.createContractInfo)(amuletRules.amulet_rules.contract.contract_id, amuletRules.amulet_rules.contract.created_event_blob, amuletRules.amulet_rules.domain_id, amuletRules.amulet_rules.contract.template_id),
openMiningRound: miningRoundContext.openMiningRoundContract,
};
if (featuredAppRight.featured_app_right) {
const featuredAppRightContractInfo = (0, disclosed_contracts_1.createContractInfo)(featuredAppRight.featured_app_right.contract_id, featuredAppRight.featured_app_right.created_event_blob, amuletRules.amulet_rules.domain_id, featuredAppRight.featured_app_right.template_id);
disclosedContractsParams.featuredAppRight = featuredAppRightContractInfo;
}
if (transferPreapprovalContractInfo) {
disclosedContractsParams.additionalContracts = [transferPreapprovalContractInfo];
}
const disclosedContracts = (0, disclosed_contracts_1.buildAmuletDisclosedContracts)(disclosedContractsParams);
// Submit the command
const submitParams = {
commands: [transferCommand],
commandId: `transfer-preapproved-${Date.now()}`,
actAs: [params.senderPartyId],
disclosedContracts,
};
const result = await ledgerClient.submitAndWaitForTransactionTree(submitParams);
const finalResult = {
contractId: params.transferPreapproval.contractId,
domainId: amuletRules.amulet_rules.domain_id,
transferResult: result,
};
return finalResult;
}
//# sourceMappingURL=transfer-to-preapproved.js.map