@ledgerhq/coin-hedera
Version:
Ledger Hedera Coin integration
77 lines (62 loc) • 2.02 kB
text/typescript
import BigNumber from "bignumber.js";
import type { Transaction as HederaTransaction, TransactionResponse } from "@hashgraph/sdk";
import {
Client,
TransferTransaction,
Hbar,
AccountId,
TransactionId,
AccountBalanceQuery,
HbarUnit,
} from "@hashgraph/sdk";
import { Account } from "@ledgerhq/types-live";
import { HederaAddAccountError } from "../errors";
import { Transaction } from "../types";
export function broadcastTransaction(transaction: HederaTransaction): Promise<TransactionResponse> {
return transaction.execute(getClient());
}
export async function buildUnsignedTransaction({
account,
transaction,
}: {
account: Account;
transaction: Transaction;
}): Promise<TransferTransaction> {
const hbarAmount = Hbar.fromTinybars(transaction.amount);
const accountId = account.freshAddress;
return new TransferTransaction()
.setNodeAccountIds([new AccountId(3)])
.setTransactionId(TransactionId.generate(accountId))
.setTransactionMemo(transaction.memo ?? "")
.addHbarTransfer(accountId, hbarAmount.negated())
.addHbarTransfer(transaction.recipient, hbarAmount)
.freeze();
}
export interface AccountBalance {
balance: BigNumber;
}
export async function getAccountBalance(address: string): Promise<AccountBalance> {
const accountId = AccountId.fromString(address);
let accountBalance;
try {
accountBalance = await new AccountBalanceQuery({
accountId,
}).execute(getBalanceClient());
} catch {
throw new HederaAddAccountError();
}
return {
balance: accountBalance.hbars.to(HbarUnit.Tinybar),
};
}
let _hederaClient: Client | null = null;
let _hederaBalanceClient: Client | null = null;
function getClient(): Client {
_hederaClient ??= Client.forMainnet().setMaxNodesPerTransaction(1);
//_hederaClient.setNetwork({ mainnet: "https://hedera.coin.ledger.com" });
return _hederaClient;
}
function getBalanceClient(): Client {
_hederaBalanceClient ??= Client.forMainnet();
return _hederaBalanceClient;
}