UNPKG

@ledgerhq/coin-canton

Version:
48 lines 2.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.signTransaction = signTransaction; const hw_app_canton_1 = require("@ledgerhq/hw-app-canton"); /** * Sign a Canton transaction - handles both prepared transactions and untyped versioned messages */ async function signTransaction(signer, derivationPath, transactionData) { let signPayload; // OnboardingPrepareResponse — sign topology transactions as untyped versioned messages if ("transactions" in transactionData && transactionData.transactions) { const challenge = getTransactionChallenge(transactionData); const { transactions } = transactionData; signPayload = { transactions: [ transactions.namespace_transaction.serialized, transactions.party_to_key_transaction.serialized, transactions.party_to_participant_transaction.serialized, ], ...(challenge && { challenge }), }; } else { // PrepareTransferResponse / PrepareTransactionResponse (.json) or raw JSON from craftTransaction const rawTransactionData = "json" in transactionData ? transactionData.json : transactionData; signPayload = (0, hw_app_canton_1.splitTransaction)(rawTransactionData); } const signature = await signer.signTransaction(derivationPath, signPayload); if (!signature?.signature) { throw new Error("Device returned empty signature"); } return signature; } const getTransactionChallenge = ({ challenge_nonce, challenge_deadline, }) => { if (!challenge_nonce || !challenge_deadline) { return undefined; } try { const deadlineHex = Buffer.alloc(8); deadlineHex.writeBigInt64BE(BigInt(challenge_deadline), 0); // Format: [length (1B) = 0x18][challenge (16 bytes)][deadline (8 bytes)] return "18" + challenge_nonce.toLowerCase() + deadlineHex.toString("hex"); } catch { return undefined; } }; //# sourceMappingURL=sign.js.map