import { JsonRpcProvider } from 'ethers'; import { TokenDataFlat, DistributionEntryDetailed, ReadConfig, TokenIdentifier } from './types/token-data'; /** * Standard Multicall3 address deployed on most EVM chains. * Verified at https://github.com/mds1/multicall * * @example * ```typescript * import { checkMulticall3Available, STANDARD_MULTICALL3_ADDRESS } from '@escapehub/token-creator'; * * const available = await checkMulticall3Available(provider, STANDARD_MULTICALL3_ADDRESS); * ``` */ export declare const STANDARD_MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11"; /** * Multicall3 ABI - only the aggregate3 function needed for batched reads. * This is the minimal ABI required for efficient multi-call operations. */ export declare const MULTICALL3_ABI: readonly [{ readonly inputs: readonly [{ readonly components: readonly [{ readonly name: "target"; readonly type: "address"; }, { readonly name: "allowFailure"; readonly type: "bool"; }, { readonly name: "callData"; readonly type: "bytes"; }]; readonly name: "calls"; readonly type: "tuple[]"; }]; readonly name: "aggregate3"; readonly outputs: readonly [{ readonly components: readonly [{ readonly name: "success"; readonly type: "bool"; }, { readonly name: "returnData"; readonly type: "bytes"; }]; readonly name: "returnData"; readonly type: "tuple[]"; }]; readonly stateMutability: "payable"; readonly type: "function"; }]; /** * Human-readable ABI strings for all token read functions. * Uses ethers v6 human-readable ABI format for clarity. */ export declare const TOKEN_READ_ABI: readonly ["function name() view returns (string)", "function symbol() view returns (string)", "function decimals() view returns (uint8)", "function totalSupply() view returns (uint256)", "function owner() view returns (address)", "function metadataMutable() view returns (bool)", "function socialsMutable() view returns (bool)", "function website() view returns (string)", "function telegram() view returns (string)", "function xHandle() view returns (string)", "function discord() view returns (string)", "function mintingEnabled() view returns (bool)", "function pausable() view returns (bool)", "function rescueEnabled() view returns (bool)", "function burnEnabled() view returns (bool)", "function hardCap() view returns (uint256)", "function feesModuleEnabled() view returns (bool)", "function limitsModuleEnabled() view returns (bool)", "function cooldownModuleEnabled() view returns (bool)", "function blacklistModuleEnabled() view returns (bool)", "function whitelistModuleEnabled() view returns (bool)", "function antiDumpModuleEnabled() view returns (bool)", "function deadblocksEnabled() view returns (bool)", "function maxBuyFeeBps() view returns (uint16)", "function maxSellFeeBps() view returns (uint16)", "function maxTransferFeeBps() view returns (uint16)", "function maxCooldownSeconds() view returns (uint32)", "function feesEnabled() view returns (bool)", "function buyFeeBps() view returns (uint16)", "function sellFeeBps() view returns (uint16)", "function transferFeeBps() view returns (uint16)", "function feeRecipient() view returns (address)", "function feeBurnShareBps() view returns (uint16)", "function maxWalletAmount() view returns (uint256)", "function maxTxAmount() view returns (uint256)", "function limitsEndTime() view returns (uint48)", "function cooldownSeconds() view returns (uint32)", "function tradingEnabled() view returns (bool)", "function tradingEnabledAt() view returns (uint48)", "function router() view returns (address)", "function routerProtectionEnabled() view returns (bool)", "function blacklistFrozen() view returns (bool)", "function whitelistMode() view returns (uint8)", "function whitelistAutoDisable() view returns (bool)", "function whitelistMutable() view returns (bool)", "function whitelistActive() view returns (bool)", "function antiDumpType() view returns (uint8)", "function antiDumpLimit() view returns (uint256)", "function antiDumpPeriod() view returns (uint32)", "function antiDumpEndTime() view returns (uint48)", "function deadBlocks() view returns (uint8)", "function deadblockMode() view returns (uint8)", "function batchTransferAccess() view returns (uint8)", "function batchTransferFees() view returns (uint8)", "function maxBatchSize() view returns (uint16)", "function paused() view returns (bool)", "function permitEnabled() view returns (bool)", "function feesFrozen() view returns (bool)", "function limitsFrozen() view returns (bool)", "function cooldownFrozen() view returns (bool)", "function antiDumpFrozen() view returns (bool)", "function ownershipTransferBlocked() view returns (bool)"]; /** * Factory ABI for reading InitialDistribution events. */ export declare const FACTORY_EVENT_ABI: readonly ["event InitialDistribution(address indexed token, address[] recipients, uint256[] amounts, string[] labels)"]; /** * Ordered list of token function names to call. * The order MUST match the destructuring in buildTokenData. */ export declare const TOKEN_FUNCTION_NAMES: readonly ["name", "symbol", "decimals", "totalSupply", "owner", "metadataMutable", "socialsMutable", "website", "telegram", "xHandle", "discord", "mintingEnabled", "pausable", "rescueEnabled", "burnEnabled", "hardCap", "feesModuleEnabled", "limitsModuleEnabled", "cooldownModuleEnabled", "blacklistModuleEnabled", "maxBuyFeeBps", "maxSellFeeBps", "maxTransferFeeBps", "maxCooldownSeconds", "deadblocksEnabled", "deadBlocks", "deadblockMode", "whitelistModuleEnabled", "whitelistMode", "whitelistAutoDisable", "whitelistMutable", "whitelistActive", "antiDumpModuleEnabled", "antiDumpType", "antiDumpLimit", "antiDumpPeriod", "antiDumpEndTime", "batchTransferAccess", "batchTransferFees", "maxBatchSize", "feesEnabled", "buyFeeBps", "sellFeeBps", "transferFeeBps", "feeRecipient", "feeBurnShareBps", "tradingEnabled", "tradingEnabledAt", "router", "routerProtectionEnabled", "maxWalletAmount", "maxTxAmount", "limitsEndTime", "cooldownSeconds", "blacklistFrozen", "paused", "permitEnabled", "feesFrozen", "limitsFrozen", "cooldownFrozen", "antiDumpFrozen", "ownershipTransferBlocked"]; /** * Format a token amount to human-readable string. * * @param amount - Amount in smallest units (wei) * @param decimals - Token decimals * @returns Formatted string representation * * @example * ```typescript * formatAmount(1000000000000000000n, 18); // "1.0" * formatAmount(0n, 18); // "0" * ``` */ export declare function formatAmount(amount: bigint, decimals: number): string; /** * Calculate percentage of total supply. * * @param amount - Amount in smallest units * @param totalSupply - Total supply in smallest units * @returns Percentage with 2 decimal precision (e.g., 5.25 for 5.25%) * * @example * ```typescript * calcPercent(1000n, 10000n); // 10.0 * calcPercent(525n, 10000n); // 5.25 * ``` */ export declare function calcPercent(amount: bigint, totalSupply: bigint): number; /** * Build TokenData object from decoded multicall/individual call results. * * @param tokenAddress - Token contract address * @param decoded - Array of decoded values in order of TOKEN_FUNCTION_NAMES * @param decimals - Token decimals for formatting * @returns Complete TokenDataFlat object * * @example * ```typescript * const decoded = [...]; // From multicall or individual calls * const tokenData = buildTokenData('0x1234...', decoded, 18); * ``` */ export declare function buildTokenData(tokenAddress: string, decoded: unknown[], decimals: number): TokenDataFlat; /** * Create a JsonRpcProvider from configuration. * * @param config - Configuration with rpcUrl and optional chainId * @returns Configured JsonRpcProvider instance * * @example * ```typescript * const provider = createProvider({ * rpcUrl: 'https://rpc.sepolia.org', * chainId: 11155111 * }); * ``` */ export declare function createProvider(config: { rpcUrl: string; chainId?: number; }): JsonRpcProvider; /** * Check if Multicall3 is available at the given address. * * @param provider - JsonRpcProvider instance * @param multicallAddress - Address to check (defaults to STANDARD_MULTICALL3_ADDRESS) * @returns True if Multicall3 contract exists at address * * @example * ```typescript * const available = await checkMulticall3Available(provider); * if (available) { * // Use batched reads * } else { * // Fall back to individual calls * } * ``` */ export declare function checkMulticall3Available(provider: JsonRpcProvider, multicallAddress?: string): Promise; /** * Read token data using Multicall3 - batches all calls into a single RPC request. * This is approximately 60x more efficient than individual calls. * * @param provider - JsonRpcProvider instance * @param tokenAddress - Token contract address * @param multicallAddress - Multicall3 contract address * @returns Complete TokenDataFlat object * @throws Error if any multicall fails * * @example * ```typescript * const provider = createProvider({ rpcUrl: 'https://rpc.sepolia.org' }); * const tokenData = await readTokenDataViaMulticall( * provider, * '0x1234...5678', * STANDARD_MULTICALL3_ADDRESS * ); * ``` */ export declare function readTokenDataViaMulticall(provider: JsonRpcProvider, tokenAddress: string, multicallAddress: string): Promise; /** * Read token data using individual calls - fallback for chains without Multicall3. * Makes approximately 60 parallel RPC requests. * * @param provider - JsonRpcProvider instance * @param tokenAddress - Token contract address * @returns Complete TokenDataFlat object * * @example * ```typescript * const provider = createProvider({ rpcUrl: 'https://rpc.pepeunchained.com' }); * const tokenData = await readTokenDataIndividual(provider, '0x1234...5678'); * ``` */ export declare function readTokenDataIndividual(provider: JsonRpcProvider, tokenAddress: string): Promise; /** * Read all token data from the blockchain. * Automatically uses Multicall3 if available, otherwise falls back to individual calls. * * @param provider - JsonRpcProvider instance * @param tokenAddress - Token contract address * @param chainId - Chain ID (used for logging/debugging) * @param config - Optional configuration with multicall3Address * @returns Complete TokenDataFlat object * * @example * ```typescript * // With Multicall3 (recommended) * const provider = createProvider({ rpcUrl: 'https://rpc.sepolia.org', chainId: 11155111 }); * const tokenData = await readTokenData( * provider, * '0x1234...5678', * 11155111, * { multicall3Address: STANDARD_MULTICALL3_ADDRESS } * ); * * // Without Multicall3 (falls back to individual calls) * const tokenData = await readTokenData( * provider, * '0x1234...5678', * 97741 // Pepe Unchained - no Multicall3 * ); * ``` */ export declare function readTokenData(provider: JsonRpcProvider, tokenAddress: string, _chainId: number, config?: ReadConfig): Promise; /** * Read multiple tokens in parallel. * Useful for fetching data for a list of tokens (e.g., launchpad). * * @param tokens - Array of token identifiers (address + chainId) * @param configs - Map of chainId to ReadConfig (with multicall3Address) * @param providerFactory - Function to create/retrieve provider for a chain * @returns Array of TokenDataFlat (in same order as input tokens) * * @example * ```typescript * const tokens = [ * { address: '0x1234...', chainId: 11155111 }, * { address: '0x5678...', chainId: 11155111 }, * { address: '0x9abc...', chainId: 1 }, * ]; * * const configs = { * 11155111: { multicall3Address: STANDARD_MULTICALL3_ADDRESS }, * 1: { multicall3Address: STANDARD_MULTICALL3_ADDRESS }, * }; * * const providerCache = new Map(); * const getProvider = (chainId: number) => { * if (!providerCache.has(chainId)) { * providerCache.set(chainId, createProvider({ rpcUrl: RPC_URLS[chainId], chainId })); * } * return providerCache.get(chainId)!; * }; * * const results = await readMultipleTokens(tokens, configs, getProvider); * ``` */ export declare function readMultipleTokens(tokens: TokenIdentifier[], configs: Record, providerFactory: (chainId: number) => JsonRpcProvider): Promise; /** * Fetch initial distribution data from the factory's InitialDistribution event. * Also calculates and includes the owner's remainder if any tokens weren't explicitly distributed. * * @param provider - JsonRpcProvider instance * @param tokenAddress - Token contract address * @param factoryAddress - LaunchERC20Factory contract address * @param decimals - Token decimals for formatting * @param totalSupply - Total supply for percentage calculations * @param ownerAddress - Optional owner address to calculate remainder * @param lookbackBlocks - Number of blocks to look back (default: 10000) * @returns Array of DistributionEntryDetailed objects * * @example * ```typescript * const distribution = await fetchInitialDistribution( * provider, * '0x1234...5678', * '0xfactory...', * 18, * 1000000000000000000000000n, * '0xowner...' * ); * * for (const entry of distribution) { * console.log(`${entry.label}: ${entry.percent}% (${entry.amountFormatted})`); * } * ``` */ export declare function fetchInitialDistribution(provider: JsonRpcProvider, tokenAddress: string, factoryAddress: string, decimals: number, totalSupply: bigint, ownerAddress?: string, lookbackBlocks?: number): Promise; export type { TokenDataFlat, DistributionEntryDetailed, ReadConfig, TokenIdentifier, }; //# sourceMappingURL=read.d.ts.map