UNPKG

@fairmint/canton-node-sdk

Version:
110 lines 5.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.preApproveTransfers = preApproveTransfers; const disclosed_contracts_1 = require("../contracts/disclosed-contracts"); const mining_rounds_1 = require("../mining/mining-rounds"); const get_amulets_for_transfer_1 = require("./get-amulets-for-transfer"); /** * Creates a TransferPreapproval contract to enable pre-approved transfers for a party * * @param ledgerClient - Ledger JSON API client for submitting commands * @param validatorClient - Validator API client for getting network information * @param params - Parameters for creating the pre-approval * @returns Promise resolving to the pre-approval result */ async function preApproveTransfers(ledgerClient, validatorClient, params) { console.log('🔍 Fetching network information...'); // Get network information const [amuletRules, dsoPartyId, miningRoundContext, featuredAppRight] = await Promise.all([ validatorClient.getAmuletRules(), validatorClient.getDsoPartyId(), (0, mining_rounds_1.getCurrentMiningRoundContext)(validatorClient), validatorClient.lookupFeaturedAppRight({ partyId: params.receiverPartyId }) ]); console.log('📊 Network information fetched:'); console.log(` Amulet Rules Contract ID: ${amuletRules.amulet_rules.contract.contract_id}`); console.log(` DSO Party ID: ${dsoPartyId.dso_party_id}`); console.log(` Open Mining Rounds: 1`); console.log(` Issuing Mining Rounds: ${miningRoundContext.issuingMiningRounds.length}`); console.log(` Featured App Right: ${featuredAppRight.featured_app_right ? 'Found' : 'Not found'}`); // Derive current mining round context (handles opensAt logic) const { openMiningRound: openMiningRoundContractId, openMiningRoundContract } = miningRoundContext; console.log(`✅ Using open mining round: ${openMiningRoundContractId}`); // Build disclosed contracts 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: (0, disclosed_contracts_1.createContractInfo)(openMiningRoundContract.contractId, openMiningRoundContract.createdEventBlob, openMiningRoundContract.synchronizerId, openMiningRoundContract.templateId), }; if (featuredAppRight.featured_app_right) { disclosedContractsParams.featuredAppRight = (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); } const disclosedContracts = (0, disclosed_contracts_1.buildAmuletDisclosedContracts)(disclosedContractsParams); console.log(`📋 Built ${disclosedContracts.length} disclosed contracts`); // Get amulet inputs for the receiver party console.log('🔍 Fetching amulet inputs for receiver party...'); const amulets = await (0, get_amulets_for_transfer_1.getAmuletsForTransfer)({ jsonApiClient: ledgerClient, readAs: [params.receiverPartyId] }); if (amulets.length === 0) { throw new Error(`No unlocked amulets found for provider party ${params.receiverPartyId}`); } // 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 TransferPreapproval contract using AmuletRules_CreateTransferPreapproval const createCommand = { ExerciseCommand: { templateId: amuletRules.amulet_rules.contract.template_id, contractId: amuletRules.amulet_rules.contract.contract_id, choice: 'AmuletRules_CreateTransferPreapproval', choiceArgument: { context: { amuletRules: amuletRules.amulet_rules.contract.contract_id, context: { openMiningRound: openMiningRoundContractId, issuingMiningRounds: [], validatorRights: [], featuredAppRight: featuredAppRight.featured_app_right?.contract_id || null } }, inputs, receiver: params.receiverPartyId, provider: params.receiverPartyId, expiresAt: params.expiresAt.toISOString() } } }; console.log('📝 Created exercise command for TransferPreapproval'); // Submit the command const submitParams = { commands: [createCommand], commandId: `create-preapproval-${Date.now()}`, actAs: [params.receiverPartyId], disclosedContracts, }; console.log('🚀 Submitting command to ledger...'); const result = await ledgerClient.submitAndWaitForTransactionTree(submitParams); // Extract the created TransferPreapproval contract ID from the result const events = result.transactionTree.eventsById; let contractId; for (const eventKey in events) { const event = events[eventKey]; if (event && 'CreatedTreeEvent' in event && event.CreatedTreeEvent?.value?.templateId?.includes('TransferPreapproval')) { contractId = event.CreatedTreeEvent.value.contractId; break; } } if (!contractId) { throw new Error('Failed to create TransferPreapproval contract'); } return { contractId, domainId: amuletRules.amulet_rules.domain_id || '', amuletPaid: '0' // This would be extracted from the transfer result }; } //# sourceMappingURL=pre-approve-transfers.js.map