UNPKG

@fairmint/canton-node-sdk

Version:
106 lines 4.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getAmuletsForTransfer = getAmuletsForTransfer; /** * Gets unlocked amulets owned by the sender party that can be used for transfers * * @param params - Parameters for getting amulets * @returns Promise resolving to array of amulets suitable for transfer */ async function getAmuletsForTransfer(params) { const { jsonApiClient, readAs } = params; // Query ledger for active contracts for this party (unlocked amulets) if (!readAs?.[0]) { return []; } const senderParty = readAs[0]; const filtersByParty = { [senderParty]: {} }; const activeContracts = await jsonApiClient.getActiveContracts({ filter: { filtersByParty }, verbose: true, activeAtOffset: (await jsonApiClient.getLedgerEnd(undefined)).offset, }); const allAmulets = []; const contractsArr = Array.isArray(activeContracts) ? activeContracts : []; contractsArr.forEach((ctr) => { let payload, templateId, contractId; console.log('ctr: ', ctr); if (ctr.contractEntry && ctr.contractEntry.JsActiveContract && ctr.contractEntry.JsActiveContract.createdEvent) { const created = ctr.contractEntry.JsActiveContract.createdEvent; payload = created.createArgument; templateId = created.templateId; contractId = created.contractId; } else if (ctr.contract) { payload = ctr.contract.payload; templateId = ctr.contract.contract?.template_id || ctr.contract.template_id; contractId = ctr.contract.contract?.contract_id || ctr.contract.contract_id; } console.log('payload: ', payload); console.log('templateId: ', templateId); console.log('contractId: ', contractId); if (!payload || !templateId || !contractId) return; const isUnlockedAmulet = templateId.includes('Splice.Amulet:Amulet') && !templateId.includes('LockedAmulet'); if (!isUnlockedAmulet) return; allAmulets.push({ contractId, templateId, payload }); }); // Helper to extract owner and numeric amount from diverse amulet shapes const extract = (amulet) => { const payload = amulet?.payload ?? amulet?.contract?.contract?.payload ?? {}; const ownerFull = payload.owner ?? amulet.owner ?? amulet.partyId ?? amulet.party_id ?? ''; const rawAmountCandidate = payload.amount ?? amulet.amount ?? amulet.effective_amount ?? amulet.effectiveAmount ?? amulet.initialAmount ?? '0'; let rawAmount = rawAmountCandidate; if (typeof rawAmountCandidate === 'object' && rawAmountCandidate !== null) { rawAmount = rawAmountCandidate.initialAmount ?? '0'; } const numericAmount = parseFloat(rawAmount); return { owner: ownerFull, numericAmount }; }; // Note: Processing amulets to extract contract information // Keep amulets owned by sender (readAs[0]) and with positive balance const partyAmulets = allAmulets.filter(a => { const { owner, numericAmount } = extract(a); return numericAmount > 0 && owner === senderParty; }); if (partyAmulets.length === 0) { return []; } // Sort biggest → smallest so we pick high-value amulets first partyAmulets.sort((a, b) => extract(b).numericAmount - extract(a).numericAmount); // Note: partyAmulets is now sorted by amount (biggest first) // Map to the structure expected by buildAmuletInputs const result = partyAmulets.map(a => { const inner = a.contract?.contract ?? {}; const payload = inner.payload ?? {}; const amtObj = payload.amount ?? {}; const intAmount = typeof amtObj === 'object' ? amtObj.initialAmount : amtObj; return { contractId: inner.contract_id ?? a.contractId ?? a.contract_id, templateId: inner.template_id ?? a.templateId ?? a.template_id ?? 'splice-amulet:Splice.Amulet:Amulet', effectiveAmount: a.effective_amount ?? intAmount ?? '0', owner: payload.owner ?? extract(a).owner, }; }); return result; } //# sourceMappingURL=get-amulets-for-transfer.js.map