@ledgerhq/coin-internet_computer
Version:
Ledger Internet Computer integration
73 lines • 3.61 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 rxjs_1 = require("rxjs");
const addresses_1 = require("./bridgeHelpers/addresses");
const utils_1 = require("@zondax/ledger-live-icp/utils");
const agent_1 = require("@zondax/ledger-live-icp/agent");
const buildOptimisticOperation_1 = require("./buildOptimisticOperation");
const common_logic_1 = require("../common-logic");
const logs_1 = require("@ledgerhq/logs");
const invariant_1 = __importDefault(require("invariant"));
const signICPTransaction = async (unsignedTxn, derivationPath, signerContext, account, deviceId) => {
const blob = agent_1.Cbor.encode({ content: unsignedTxn });
(0, logs_1.log)("debug", "[signICPTransaction] blob", Buffer.from(blob).toString("hex"));
const signatures = await signerContext(deviceId, signer => signer.sign(derivationPath, Buffer.from(blob)));
(0, invariant_1.default)(signatures.signatureRS, "[ICP](signICPTransaction) Signature not found");
(0, invariant_1.default)(account.xpub, "[ICP](signICPTransaction) Account xpub is required");
return {
signature: Buffer.from(signatures.signatureRS).toString("hex"),
callBody: {
content: unsignedTxn,
sender_pubkey: (0, utils_1.pubkeyToDer)(account.xpub),
sender_sig: signatures.signatureRS,
},
};
};
const buildSignOperation = (signerContext) => ({ account, transaction, deviceId }) => new rxjs_1.Observable(o => {
async function main() {
(0, logs_1.log)("debug", "[signOperation] icp start fn");
(0, logs_1.log)("debug", "[signOperation] transaction", transaction);
const { xpub } = account;
(0, invariant_1.default)(xpub, "[ICP](signOperation) Account xpub is required");
const { derivationPath } = (0, addresses_1.getAddress)(account);
const { unsignedTransaction, transferRawRequest } = (0, utils_1.createUnsignedSendTransaction)(transaction, xpub);
o.next({
type: "device-signature-requested",
});
let signature = "";
let encodedSignedCallBlob = "";
const res = await signICPTransaction(unsignedTransaction, (0, common_logic_1.getPath)(derivationPath), signerContext, account, deviceId);
signature = res.signature;
encodedSignedCallBlob = Buffer.from(agent_1.Cbor.encode(res.callBody)).toString("hex");
(0, invariant_1.default)(signature, "[ICP](signOperation) Signature not found");
o.next({
type: "device-signature-granted",
});
const hash = (0, utils_1.hashTransaction)({
from: account.freshAddress,
to: transaction.recipient,
amount: transferRawRequest.amount.e8s,
fee: transferRawRequest.fee.e8s,
memo: transferRawRequest.memo,
created_at_time: transferRawRequest.created_at_time[0]["timestamp_nanos"],
});
const operation = await (0, buildOptimisticOperation_1.buildOptimisticOperation)(account, transaction, hash);
o.next({
type: "signed",
signedOperation: {
operation,
signature,
rawData: {
encodedSignedCallBlob,
},
},
});
}
main().then(() => o.complete(), e => o.error(e));
});
exports.buildSignOperation = buildSignOperation;
//# sourceMappingURL=signOperation.js.map