UNPKG

@ledgerhq/coin-cardano

Version:
57 lines 2.43 kB
import { Observable } from "rxjs"; import { FeeNotLoaded } from "@ledgerhq/errors"; import { buildOptimisticOperation } from "./buildOptimisticOperation"; import { getExtendedPublicKeyFromHex } from "./logic"; import { buildTransaction } from "./buildTransaction"; import { getNetworkParameters } from "./networks"; import typhonSerializer from "./typhonSerializer"; import { CardanoInvalidProtoParams } from "./errors"; /** * Sign Transaction with Ledger hardware */ export const buildSignOperation = (signerContext) => ({ account, deviceId, transaction }) => new Observable(o => { async function main() { o.next({ type: "device-signature-requested" }); if (!transaction.fees) { throw new FeeNotLoaded(); } if (!transaction.protocolParams) { throw new CardanoInvalidProtoParams(); } const unsignedTransaction = await buildTransaction(account, transaction); const signerTransaction = typhonSerializer(unsignedTransaction, account.index); const networkParams = getNetworkParameters(account.currency.id); const signedData = await signerContext(deviceId, signer => signer.sign({ transaction: signerTransaction, networkParams, })); const accountPubKey = getExtendedPublicKeyFromHex(account.xpub); const signed = signTx(unsignedTransaction, accountPubKey, signedData.witnesses); o.next({ type: "device-signature-granted" }); const operation = buildOptimisticOperation(account, unsignedTransaction, transaction); o.next({ type: "signed", signedOperation: { operation, signature: signed.payload, }, }); } main().then(() => o.complete(), e => o.error(e)); }); /** * Adds signatures to unsigned transaction */ const signTx = (unsignedTransaction, accountKey, witnesses) => { witnesses.forEach(witness => { const [, , , chainType, index] = witness.path; const publicKey = accountKey.derive(chainType).derive(index).toPublicKey().toBytes(); const vKeyWitness = { signature: Buffer.from(witness.witnessSignatureHex, "hex"), publicKey: Buffer.from(publicKey), }; unsignedTransaction.addWitness(vKeyWitness); }); return unsignedTransaction.buildTransaction(); }; //# sourceMappingURL=signOperation.js.map