UNPKG

@fairmint/canton-node-sdk

Version:
98 lines 5.07 kB
"use strict"; 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