@ledgerhq/coin-icon
Version:
Ledger Icon Coin integration
90 lines • 3.39 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildSignOperation = void 0;
const bignumber_js_1 = require("bignumber.js");
const rxjs_1 = require("rxjs");
const operation_1 = require("@ledgerhq/coin-framework/operation");
const buildTransaction_1 = require("./buildTransaction");
const logic_1 = require("./logic");
const errors_1 = require("@ledgerhq/errors");
const icon_sdk_js_1 = __importDefault(require("icon-sdk-js"));
const { IconUtil, IconConverter } = icon_sdk_js_1.default;
const buildOptimisticOperation = (account, transaction, fee) => {
const type = "OUT";
const value = new bignumber_js_1.BigNumber(transaction.amount).plus(fee);
const operation = {
id: (0, operation_1.encodeOperationId)(account.id, "", type),
hash: "",
type,
value,
fee,
blockHash: null,
blockHeight: null,
senders: [account.freshAddress],
recipients: [transaction.recipient].filter(Boolean),
accountId: account.id,
transactionSequenceNumber: new bignumber_js_1.BigNumber((0, logic_1.getNonce)(account)),
date: new Date(),
extra: {},
};
return operation;
};
/**
* Adds signature to unsigned transaction. Will likely be a call to Icon SDK
*/
const addSignature = (rawTransaction, signature) => {
return {
rawTransaction: {
...rawTransaction,
signature: signature,
},
signature,
};
};
/**
* Sign Transaction with Ledger hardware
*/
const buildSignOperation = (signerContext) => ({ account, transaction, deviceId, }) => new rxjs_1.Observable(o => {
let cancelled = false;
async function main() {
if (!transaction.fees) {
throw new errors_1.FeeNotLoaded();
}
const transactionToSign = {
...transaction,
amount: (0, logic_1.calculateAmount)({
account: account,
transaction: transaction,
}),
};
const { unsigned } = await (0, buildTransaction_1.buildTransaction)(account, transactionToSign, transactionToSign.stepLimit);
o.next({ type: "device-signature-requested" });
const res = (await signerContext(deviceId, signer => signer.signTransaction(account.freshAddressPath, IconUtil.generateHashKey(IconConverter.toRawTransaction(unsigned)))));
const signed = addSignature(unsigned, res.signedRawTxBase64);
if (cancelled)
return;
o.next({ type: "device-signature-granted" });
if (!signed.signature) {
throw new Error("No signature");
}
const operation = buildOptimisticOperation(account, transactionToSign, transactionToSign.fees ?? new bignumber_js_1.BigNumber(0));
o.next({
type: "signed",
signedOperation: {
operation,
signature: signed.signature,
rawData: signed.rawTransaction,
},
});
}
main().then(() => o.complete(), e => o.error(e));
return () => {
cancelled = true;
};
});
exports.buildSignOperation = buildSignOperation;
exports.default = exports.buildSignOperation;
//# sourceMappingURL=signOperation.js.map