UNPKG

@ledgerhq/coin-hedera

Version:
66 lines 2.62 kB
import { getEnv } from "@ledgerhq/live-env"; import network from "@ledgerhq/live-network"; import { pad } from "viem"; import { HEDERA_MAINNET_CHAIN_ID, ERC20_TRANSFER_EVENT_TOPIC } from "../constants"; import { toEVMAddress } from "../logic/utils"; const API_URL = getEnv("API_HEDERA_THIRDWEB_URL"); async function fetchERC20Transactions(contractAddress, options) { const transactions = []; const params = new URLSearchParams(options); let page = 1; let hasMorePages = true; while (hasMorePages) { params.set("page", page.toString()); const response = await network({ method: "GET", url: `${API_URL}/v1/contracts/${HEDERA_MAINNET_CHAIN_ID}/${contractAddress}/events?${params.toString()}`, }); const newTransactions = response.data.result.events; transactions.push(...newTransactions); // stop if we received fewer items than the limit or no items if (newTransactions.length < Number(options.limit) || newTransactions.length === 0) { hasMorePages = false; } else { page++; } } return transactions; } async function getERC20TransactionsForAccount({ address, contractAddresses, transactionFetcher = fetchERC20Transactions, since, }) { const allTransactions = []; const evmAddress = await toEVMAddress(address); if (contractAddresses.length === 0) { return allTransactions; } if (!evmAddress) { return allTransactions; } const baseParams = { limit: "1000", filterTopic0: ERC20_TRANSFER_EVENT_TOPIC, ...(since && { filterBlockTimestampGte: since }), }; for (const contractAddress of contractAddresses) { const outTransactionOptions = { ...baseParams, filterTopic1: pad(evmAddress).toString(), }; const inTransactionOptions = { ...baseParams, filterTopic2: pad(evmAddress).toString(), }; const outgoingTxs = await transactionFetcher(contractAddress, outTransactionOptions); const incomingTxs = await transactionFetcher(contractAddress, inTransactionOptions); allTransactions.push(...outgoingTxs, ...incomingTxs); } return allTransactions; } // Thirdweb API is used in addition to mirror node because: // - mirror node has a 1-week range limitation for ERC20 events queries // - mirror node has rate limits that we could exceed with ERC20 integration export const thirdwebClient = { fetchERC20Transactions, getERC20TransactionsForAccount, }; //# sourceMappingURL=thirdweb.js.map