UNPKG

@ledgerhq/coin-internet_computer

Version:
88 lines 3.98 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.deriveAddressFromPubkey = exports.broadcastTxn = exports.getTxnExpirationDate = exports.getTxnMetadata = exports.signICPTransaction = exports.getUnsignedTransaction = void 0; const api_1 = require("../../../api"); const utils_1 = require("./utils"); const agent_1 = require("@dfinity/agent"); const principal_1 = require("@dfinity/principal"); const bignumber_js_1 = __importDefault(require("bignumber.js")); const consts_1 = require("../../../consts"); const getUnsignedTransaction = async (transaction, account) => { const ops = (0, utils_1.generateOperations)(transaction, account); const pubkeys = [ { hex_bytes: account.xpub ?? "", curve_type: "secp256k1", }, ]; const reqOpts = { ...(0, api_1.getICPRosettaNetworkIdentifier)(), operations: ops, public_keys: pubkeys, metadata: { memo: parseInt(transaction.memo ?? "0"), }, }; const { payloads, unsigned_transaction } = await (0, api_1.constructionInvoke)(reqOpts, "payloads"); return { unsignedTxn: unsigned_transaction, payloads }; }; exports.getUnsignedTransaction = getUnsignedTransaction; const signICPTransaction = async ({ signerContext, deviceId, unsignedTxn, path, payloads, pubkey, }) => { const decodedTxn = agent_1.Cbor.decode(Buffer.from(unsignedTxn, "hex")); const txnReqFromCbor = decodedTxn.updates[0][1]; const expiry = new utils_1.ingressExpiry((0, bignumber_js_1.default)(decodedTxn.ingress_expiries[0].toString())); const submitReq = { request_type: "call", canister_id: principal_1.Principal.fromUint8Array(txnReqFromCbor.canister_id), method_name: txnReqFromCbor.method_name, arg: txnReqFromCbor.arg, sender: principal_1.Principal.fromUint8Array(txnReqFromCbor.sender), ingress_expiry: expiry, }; const txnBlobToSign = agent_1.Cbor.encode({ content: submitReq, }); const { r } = await signerContext(deviceId, async (signer) => { const r = await signer.sign(path, Buffer.from(txnBlobToSign), consts_1.ICP_SEND_TXN_TYPE); return { r }; }); const result = { signatures: { readSig: "", txnSig: Buffer.from(r.signatureRS ?? "").toString("hex"), }, }; const signaturesPayload = (0, utils_1.generateSignaturesPayload)(result.signatures, payloads, pubkey); const { signed_transaction: signedTxn } = await (0, api_1.constructionInvoke)({ ...(0, api_1.getICPRosettaNetworkIdentifier)(), signatures: signaturesPayload, unsigned_transaction: unsignedTxn, }, "combine"); return { ...result, signedTxn }; }; exports.signICPTransaction = signICPTransaction; const getTxnMetadata = async (signedTxn) => { const { transaction_identifier: { hash }, } = await (0, api_1.constructionInvoke)({ ...(0, api_1.getICPRosettaNetworkIdentifier)(), signed_transaction: signedTxn }, "hash"); return { hash }; }; exports.getTxnMetadata = getTxnMetadata; const getTxnExpirationDate = (_unsignedTxn) => { return new Date(); }; exports.getTxnExpirationDate = getTxnExpirationDate; const broadcastTxn = async (signedTxn) => { await (0, api_1.constructionInvoke)({ ...(0, api_1.getICPRosettaNetworkIdentifier)(), signed_transaction: signedTxn }, "submit"); }; exports.broadcastTxn = broadcastTxn; const deriveAddressFromPubkey = async (pubkey) => { const res = await (0, api_1.constructionInvoke)({ ...(0, api_1.getICPRosettaNetworkIdentifier)(), public_key: { curve_type: "secp256k1", hex_bytes: pubkey }, }, "derive"); return res.account_identifier.address; }; exports.deriveAddressFromPubkey = deriveAddressFromPubkey; //# sourceMappingURL=index.js.map