@ledgerhq/coin-hedera
Version:
Ledger Hedera Coin integration
182 lines • 7.33 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildOptimisticOperation = void 0;
const helpers_1 = require("@ledgerhq/ledger-wallet-framework/account/helpers");
const operation_1 = require("@ledgerhq/ledger-wallet-framework/operation");
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const invariant_1 = __importDefault(require("invariant"));
const constants_1 = require("../constants");
const utils_1 = require("../logic/utils");
const buildOptimisticTokenAssociateOperation = async ({ account, transaction, }) => {
(0, invariant_1.default)((0, utils_1.isTokenAssociateTransaction)(transaction), "invalid transaction properties");
const fee = transaction.maxFee ?? new bignumber_js_1.default(0);
const type = "ASSOCIATE_TOKEN";
const operation = {
id: (0, operation_1.encodeOperationId)(account.id, "", type),
hash: "",
type,
value: fee,
fee,
blockHash: null,
blockHeight: null,
senders: [account.freshAddress.toString()],
recipients: [transaction.recipient],
accountId: account.id,
date: new Date(),
extra: {
associatedTokenId: transaction.properties.token.contractAddress,
},
};
return operation;
};
const buildOptimisticCoinOperation = async ({ account, transaction, transactionType, }) => {
const fee = transactionType === "FEES" ? transaction.amount : (transaction.maxFee ?? new bignumber_js_1.default(0));
const value = transaction.amount;
const type = transactionType ?? "OUT";
const [_, recipientAddress] = await (0, utils_1.safeParseAccountId)(transaction.recipient);
const recipientWithoutChecksum = recipientAddress?.accountId ?? transaction.recipient;
const memo = transaction.memo;
const operation = {
id: (0, operation_1.encodeOperationId)(account.id, "", type),
hash: "",
type,
value,
fee,
blockHash: null,
blockHeight: null,
senders: [account.freshAddress.toString()],
recipients: [recipientWithoutChecksum],
accountId: account.id,
date: new Date(),
extra: {
...(memo && { memo }),
},
};
return operation;
};
const buildOptimisticHTSTokenOperation = async ({ account, tokenAccount, transaction, }) => {
const fee = transaction.maxFee ?? new bignumber_js_1.default(0);
const value = transaction.amount;
const type = "OUT";
const [_, recipientAddress] = await (0, utils_1.safeParseAccountId)(transaction.recipient);
const recipientWithoutChecksum = recipientAddress?.accountId ?? transaction.recipient;
const memo = transaction.memo;
const coinOperation = await buildOptimisticCoinOperation({
account,
transaction: {
...transaction,
amount: fee,
},
transactionType: "FEES",
});
const operation = {
...coinOperation,
subOperations: [
{
id: (0, operation_1.encodeOperationId)(tokenAccount.id, "", type),
hash: "",
type,
value,
fee,
blockHash: null,
blockHeight: null,
senders: [account.freshAddress.toString()],
recipients: [recipientWithoutChecksum],
accountId: tokenAccount.id,
date: new Date(),
extra: {
...(memo && { memo }),
},
},
],
};
return operation;
};
const buildOptimisticERC20TokenOperation = async ({ account, tokenAccount, transaction, }) => {
const fee = transaction.maxFee ?? new bignumber_js_1.default(0);
const value = transaction.amount;
const type = "OUT";
const memo = transaction.memo;
const coinOperation = await buildOptimisticCoinOperation({
account,
transaction: {
...transaction,
amount: fee,
},
transactionType: "FEES",
});
const operation = {
...coinOperation,
subOperations: [
{
id: (0, operation_1.encodeOperationId)(tokenAccount.id, "", type),
hash: "",
type,
value,
fee,
blockHash: null,
blockHeight: null,
senders: [account.freshAddress.toString()],
recipients: [transaction.recipient],
accountId: tokenAccount.id,
date: new Date(),
extra: {
...(memo && { memo }),
},
},
],
};
return operation;
};
const buildOptimisticUpdateAccountOperation = async ({ account, transaction, }) => {
(0, invariant_1.default)((0, utils_1.isStakingTransaction)(transaction), "invalid transaction properties");
const fee = transaction.maxFee ?? new bignumber_js_1.default(0);
const value = transaction.amount;
const type = constants_1.MAP_STAKING_MODE_TO_OPERATION_TYPE[transaction.mode];
const operation = {
id: (0, operation_1.encodeOperationId)(account.id, "", type),
hash: "",
type,
value,
fee,
blockHash: null,
blockHeight: null,
senders: [account.freshAddress.toString()],
recipients: [transaction.recipient],
accountId: account.id,
date: new Date(),
extra: {
memo: transaction.memo ?? null,
targetStakingNodeId: transaction.properties?.stakingNodeId ?? null,
previousStakingNodeId: account.hederaResources?.delegation?.nodeId ?? null,
},
};
return operation;
};
const buildOptimisticOperation = async ({ account, transaction, }) => {
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)) {
return buildOptimisticTokenAssociateOperation({ account, transaction });
}
else if (isHTSTokenTransaction) {
return buildOptimisticHTSTokenOperation({ account, tokenAccount: subAccount, transaction });
}
else if (isERC20TokenTransaction) {
return buildOptimisticERC20TokenOperation({ account, tokenAccount: subAccount, transaction });
}
else if (transaction.mode === constants_1.HEDERA_TRANSACTION_MODES.Redelegate ||
transaction.mode === constants_1.HEDERA_TRANSACTION_MODES.Undelegate ||
transaction.mode === constants_1.HEDERA_TRANSACTION_MODES.Delegate) {
return buildOptimisticUpdateAccountOperation({ account, transaction });
}
else {
return buildOptimisticCoinOperation({ account, transaction });
}
};
exports.buildOptimisticOperation = buildOptimisticOperation;
//# sourceMappingURL=buildOptimisticOperation.js.map