@ledgerhq/coin-hedera
Version:
Ledger Hedera Coin integration
123 lines • 5.42 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 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