@ledgerhq/coin-canton
Version:
48 lines • 2.05 kB
JavaScript
;
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