@ledgerhq/coin-cardano
Version:
Ledger Cardano Coin integration
57 lines • 2.43 kB
JavaScript
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