@ledgerhq/coin-internet_computer
Version:
Ledger Internet Computer integration
88 lines • 3.98 kB
JavaScript
;
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