@fairmint/canton-node-sdk
Version:
Canton Node SDK
110 lines • 5.93 kB
JavaScript
;
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