@ledgerhq/coin-tron
Version:
Ledger Tron Coin integration
111 lines (103 loc) • 3.31 kB
text/typescript
import { rejectBalanceOptions } from "@ledgerhq/coin-module-framework/api/getBalance/rejectBalanceOptions";
import {
CoinModuleApi,
Balance,
CraftedTransaction,
Cursor,
FeeEstimation,
ListOperationsOptions,
Operation,
Page,
Reward,
Stake,
TransactionIntent,
TransactionValidation,
Validator,
BalanceOptions,
} from "@ledgerhq/coin-module-framework/api/index";
import { craftTransactionData } from "@ledgerhq/coin-module-framework/logic/craftTransactionData";
import coinConfig, { type TronConfig } from "../config";
import {
broadcast,
combine,
craftTransaction,
estimateFees,
getBalance,
getBlock,
getBlockInfo,
lastBlock,
listOperations as listOperationsLogic,
validateAddress,
} from "../logic";
import { defaultFetchParams, getBlock as getBlockNetwork } from "../network";
import type { TronMemo } from "../types";
const MAX_TRONGRID_LIMIT = 200;
export function createApi(config: TronConfig): CoinModuleApi<TronMemo> {
coinConfig.setCoinConfig(() => ({ ...config, status: { type: "active" } }));
return {
broadcast,
combine,
craftTransaction,
craftRawTransaction: (
_transaction: string,
_sender: string,
_publicKey: string,
_sequence: bigint,
): Promise<CraftedTransaction> => {
throw new Error("craftRawTransaction is not supported");
},
estimateFees: estimate,
getBalance: (address: string, options?: BalanceOptions) =>
rejectBalanceOptions(() => getBalance(address), options),
lastBlock,
listOperations,
getBlock,
getBlockInfo,
getStakes(_address: string, _cursor?: Cursor): Promise<Page<Stake>> {
throw new Error("getStakes is not supported");
},
getRewards(_address: string, _cursor?: Cursor): Promise<Page<Reward>> {
throw new Error("getRewards is not supported");
},
getValidators(_cursor?: Cursor): Promise<Page<Validator>> {
throw new Error("getValidators is not supported");
},
validateIntent: async (
_transactionIntent: TransactionIntent,
_balances: Balance[],
_customFees?: FeeEstimation,
): Promise<TransactionValidation> => {
throw new Error("validateIntent is not supported");
},
getNextSequence: async (_address: string) => {
throw new Error("getNextSequence is not supported");
},
validateAddress,
craftTransactionData,
};
}
async function estimate(transactionIntent: TransactionIntent<TronMemo>): Promise<FeeEstimation> {
const fees = await estimateFees(transactionIntent);
return { value: fees };
}
async function listOperations(
address: string,
{ minHeight, order, cursor, limit }: ListOperationsOptions,
): Promise<Page<Operation>> {
if (limit !== undefined && limit > MAX_TRONGRID_LIMIT) {
throw new Error(`limit must be <= ${MAX_TRONGRID_LIMIT} for Tron (TronGrid API restriction)`);
}
const effectiveLimit = limit ?? MAX_TRONGRID_LIMIT;
const effectiveOrder = order ?? "asc";
let minTimestamp = defaultFetchParams.minTimestamp;
if (minHeight > 0) {
const block = await getBlockNetwork(minHeight);
minTimestamp = block.time?.getTime() ?? defaultFetchParams.minTimestamp;
}
return listOperationsLogic(address, {
limit: effectiveLimit,
minTimestamp,
order: effectiveOrder,
cursor,
});
}