UNPKG

@ledgerhq/coin-hedera

Version:
123 lines 5.42 kB
"use strict"; 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 helpers_1 = require("@ledgerhq/ledger-wallet-framework/account/helpers"); const rxjs_1 = require("rxjs"); const config_1 = __importDefault(require("../config")); const constants_1 = require("../constants"); const combine_1 = require("../logic/combine"); const craftTransaction_1 = require("../logic/craftTransaction"); const utils_1 = require("../logic/utils"); const buildOptimisticOperation_1 = require("./buildOptimisticOperation"); const buildSignOperation = (signerContext) => ({ account, transaction, deviceId }) => new rxjs_1.Observable(o => { void (async function () { try { o.next({ type: "device-signature-requested", }); let type; let asset; let data; const accountAddress = account.freshAddress; const accountPublicKey = account.seedIdentifier; const coinConfig = config_1.default.getCoinConfig(account.currency.id); const subAccount = (0, helpers_1.findSubAccountById)(account, transaction.subAccountId || ""); const isHTSTokenTransaction = transaction.mode === constants_1.HEDERA_TRANSACTION_MODES.Send && subAccount?.token.tokenType === "hts"; const isERC20TokenTransaction = transaction.mode === constants_1.HEDERA_TRANSACTION_MODES.Send && subAccount?.token.tokenType === "erc20"; if ((0, utils_1.isTokenAssociateTransaction)(transaction)) { type = constants_1.HEDERA_TRANSACTION_MODES.TokenAssociate; asset = { type: transaction.properties.token.tokenType, assetReference: transaction.properties.token.contractAddress, }; } else if (isHTSTokenTransaction) { type = constants_1.HEDERA_TRANSACTION_MODES.Send; asset = { type: subAccount.token.tokenType, assetReference: subAccount.token.contractAddress, assetOwner: accountAddress, }; } else if (isERC20TokenTransaction) { type = constants_1.HEDERA_TRANSACTION_MODES.Send; asset = { type: subAccount.token.tokenType, assetReference: subAccount.token.contractAddress, assetOwner: accountAddress, }; data = { type: "erc20", gasLimit: BigInt((transaction.gasLimit ?? constants_1.DEFAULT_GAS_LIMIT).toString()), }; } else if ((0, utils_1.isStakingTransaction)(transaction)) { type = transaction.mode; asset = { type: "native", }; data = { type: "staking", stakingNodeId: transaction.properties?.stakingNodeId, }; } else { type = constants_1.HEDERA_TRANSACTION_MODES.Send; asset = { type: "native", }; } const customFees = transaction.maxFee ? { value: BigInt(transaction.maxFee.toString()) } : undefined; const signedTx = await signerContext(deviceId, async (signer) => { const { tx } = await (0, craftTransaction_1.craftTransaction)({ txIntent: { intentType: "transaction", type, asset, amount: BigInt(transaction.amount.toString()), sender: accountAddress, recipient: transaction.recipient, memo: { kind: "text", type: "string", value: transaction.memo ?? "", }, ...(data && { data }), }, ...(customFees && { customFees }), config: coinConfig, }); const txBodyBytes = (0, utils_1.getHederaTransactionBodyBytes)(tx); const signatureBytes = await signer.signTransaction(txBodyBytes); return (0, combine_1.combine)((0, utils_1.serializeTransaction)(tx), (0, utils_1.serializeSignature)(signatureBytes), accountPublicKey); }); o.next({ type: "device-signature-granted", }); const operation = await (0, buildOptimisticOperation_1.buildOptimisticOperation)({ account, transaction, }); o.next({ type: "signed", signedOperation: { operation, signature: signedTx, }, }); o.complete(); } catch (err) { o.error(err); } })(); }); exports.buildSignOperation = buildSignOperation; //# sourceMappingURL=signOperation.js.map