@lumiapassport/core 1.14.1 → 1.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45,7 +45,7 @@ function initSdkErrorTracking() {
45
45
  // Don't track performance for SDK (only errors)
46
46
  tracesSampleRate: 0,
47
47
  // Release version from package.json
48
- release: `@lumiapassport/core@${"1.14.1"}`,
48
+ release: `@lumiapassport/core@${"1.14.2"}`,
49
49
  environment: "production",
50
50
  // Filter to only track SDK errors
51
51
  beforeSend(event) {
@@ -23,7 +23,7 @@ function initSdkErrorTracking() {
23
23
  // Don't track performance for SDK (only errors)
24
24
  tracesSampleRate: 0,
25
25
  // Release version from package.json
26
- release: `@lumiapassport/core@${"1.14.1"}`,
26
+ release: `@lumiapassport/core@${"1.14.2"}`,
27
27
  environment: "production",
28
28
  // Filter to only track SDK errors
29
29
  beforeSend(event) {
@@ -288,6 +288,17 @@ var ChainNotSupportedError = class extends ReadLayerError {
288
288
  this.name = "ChainNotSupportedError";
289
289
  }
290
290
  };
291
+ var TransactionReceiptTimeoutError = class extends ReadLayerError {
292
+ constructor(hash, timeout) {
293
+ super(
294
+ `Transaction receipt not found within ${timeout}ms: ${hash}`,
295
+ "TRANSACTION_RECEIPT_TIMEOUT"
296
+ );
297
+ this.hash = hash;
298
+ this.timeout = timeout;
299
+ this.name = "TransactionReceiptTimeoutError";
300
+ }
301
+ };
291
302
 
292
303
  // src/read/public-client.ts
293
304
  var PublicReadClientImpl = class {
@@ -456,6 +467,77 @@ var PublicReadClientImpl = class {
456
467
  eventName: "eventName" in log ? log.eventName : void 0
457
468
  }));
458
469
  }
470
+ async getTransactionReceipt(params) {
471
+ const { hash } = params;
472
+ try {
473
+ const receipt = await this.viemClient.getTransactionReceipt({ hash });
474
+ return this.mapReceipt(receipt);
475
+ } catch (error) {
476
+ if (error instanceof Error && (error.message.includes("could not be found") || error.message.includes("not found"))) {
477
+ return null;
478
+ }
479
+ throw error;
480
+ }
481
+ }
482
+ async waitForTransactionReceipt(params) {
483
+ const {
484
+ hash,
485
+ confirmations = 1,
486
+ pollingInterval = 4e3,
487
+ timeout = 6e4,
488
+ onReplaced
489
+ } = params;
490
+ try {
491
+ const receipt = await this.viemClient.waitForTransactionReceipt({
492
+ hash,
493
+ confirmations,
494
+ pollingInterval,
495
+ timeout,
496
+ onReplaced: onReplaced ? (response) => {
497
+ onReplaced({
498
+ reason: response.reason,
499
+ replacedTransaction: { hash: response.replacedTransaction.hash },
500
+ transaction: { hash: response.transaction.hash },
501
+ transactionReceipt: this.mapReceipt(response.transactionReceipt)
502
+ });
503
+ } : void 0
504
+ });
505
+ return this.mapReceipt(receipt);
506
+ } catch (error) {
507
+ if (error instanceof Error && error.message.includes("timed out")) {
508
+ throw new TransactionReceiptTimeoutError(hash, timeout);
509
+ }
510
+ throw error;
511
+ }
512
+ }
513
+ mapReceipt(receipt) {
514
+ return {
515
+ blockHash: receipt.blockHash,
516
+ blockNumber: receipt.blockNumber,
517
+ contractAddress: receipt.contractAddress,
518
+ cumulativeGasUsed: receipt.cumulativeGasUsed,
519
+ effectiveGasPrice: receipt.effectiveGasPrice,
520
+ from: receipt.from,
521
+ gasUsed: receipt.gasUsed,
522
+ logs: receipt.logs.map((log) => ({
523
+ address: log.address,
524
+ topics: log.topics,
525
+ data: log.data,
526
+ blockNumber: log.blockNumber,
527
+ blockHash: log.blockHash,
528
+ transactionHash: log.transactionHash,
529
+ transactionIndex: log.transactionIndex,
530
+ logIndex: log.logIndex,
531
+ removed: log.removed
532
+ })),
533
+ logsBloom: receipt.logsBloom,
534
+ status: receipt.status,
535
+ to: receipt.to,
536
+ transactionHash: receipt.transactionHash,
537
+ transactionIndex: receipt.transactionIndex,
538
+ type: receipt.type
539
+ };
540
+ }
459
541
  clearCache() {
460
542
  this.cache?.clear();
461
543
  }
@@ -534,6 +616,7 @@ exports.MULTICALL3_ADDRESS = MULTICALL3_ADDRESS;
534
616
  exports.RateLimitedError = RateLimitedError;
535
617
  exports.ReadLayerError = ReadLayerError;
536
618
  exports.RpcConnectionError = RpcConnectionError;
619
+ exports.TransactionReceiptTimeoutError = TransactionReceiptTimeoutError;
537
620
  exports.generateCacheKey = generateCacheKey;
538
621
  exports.getChainConfig = getChainConfig;
539
622
  exports.getPublicClient = getPublicClient;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/read/cache.ts","../../src/read/rpc-fallback.ts","../../src/read/constants.ts","../../src/read/errors.ts","../../src/read/public-client.ts"],"names":["createPublicClient","http","fallback"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * LRU Cache implementation for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport type { CacheConfig, CacheStats, BlockTag } from './types';\nimport type { Address } from 'viem';\n\n/**\n * Internal cache entry structure\n */\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n}\n\n/**\n * Default cache configuration\n */\nexport const DEFAULT_CACHE_CONFIG: CacheConfig = {\n maxSize: 1000,\n ttl: 12000, // 12 seconds (~1 block)\n};\n\n/**\n * LRU Cache with TTL support for blockchain read operations\n */\nexport class LRUCache<T = unknown> {\n private cache: Map<string, CacheEntry<T>>;\n private readonly maxSize: number;\n private readonly ttl: number;\n private hits = 0;\n private misses = 0;\n\n constructor(config: Partial<CacheConfig> = {}) {\n this.maxSize = config.maxSize ?? DEFAULT_CACHE_CONFIG.maxSize;\n this.ttl = config.ttl ?? DEFAULT_CACHE_CONFIG.ttl;\n this.cache = new Map();\n }\n\n /**\n * Get a value from cache\n * Returns undefined if not found or expired\n */\n get(key: string): T | undefined {\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.misses++;\n return undefined;\n }\n\n // Check if expired\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n this.misses++;\n return undefined;\n }\n\n // Move to end (most recently used) by deleting and re-adding\n this.cache.delete(key);\n this.cache.set(key, entry);\n this.hits++;\n\n return entry.value;\n }\n\n /**\n * Set a value in cache with optional custom TTL\n */\n set(key: string, value: T, customTtl?: number): void {\n // If key exists, delete it first to update position\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // Evict oldest entries if at capacity\n while (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n }\n }\n\n const ttlToUse = customTtl ?? this.ttl;\n this.cache.set(key, {\n value,\n expiresAt: Date.now() + ttlToUse,\n });\n }\n\n /**\n * Check if key exists and is not expired\n */\n has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Delete a specific key\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.cache.clear();\n this.hits = 0;\n this.misses = 0;\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n // Clean expired entries before reporting\n this.cleanExpired();\n\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hits: this.hits,\n misses: this.misses,\n };\n }\n\n /**\n * Remove expired entries\n */\n private cleanExpired(): void {\n const now = Date.now();\n for (const [key, entry] of this.cache.entries()) {\n if (now > entry.expiresAt) {\n this.cache.delete(key);\n }\n }\n }\n}\n\n/**\n * Generate a deterministic cache key for contract reads\n */\nexport function generateCacheKey(params: {\n chainId: number;\n address: Address;\n functionName: string;\n args: readonly unknown[];\n blockTag: BlockTag;\n from?: Address;\n}): string {\n const keyParts = {\n c: params.chainId,\n a: params.address.toLowerCase(),\n f: params.functionName,\n r: params.args,\n b: serializeBlockTag(params.blockTag),\n s: params.from?.toLowerCase(),\n };\n\n return JSON.stringify(keyParts);\n}\n\n/**\n * Serialize block tag for cache key\n */\nfunction serializeBlockTag(blockTag: BlockTag): string {\n if (typeof blockTag === 'bigint') {\n return `n:${blockTag.toString()}`;\n }\n return blockTag;\n}\n","/**\n * RPC Fallback Transport for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport {\n createPublicClient,\n fallback,\n http,\n type Chain,\n type PublicClient,\n} from 'viem';\n\n/**\n * Configuration for fallback transport\n */\nexport interface FallbackTransportConfig {\n /**\n * RPC URLs in priority order\n */\n urls: string[];\n\n /**\n * Number of retries per endpoint before failover\n * @default 1\n */\n retriesPerEndpoint?: number;\n\n /**\n * Request timeout in ms\n * @default 10000\n */\n timeout?: number;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG = {\n retriesPerEndpoint: 1,\n timeout: 10000,\n};\n\n/**\n * Create a viem public client with fallback RPC support\n */\nexport function createFallbackClient(\n chain: Chain,\n config: FallbackTransportConfig,\n): PublicClient {\n const {\n urls,\n retriesPerEndpoint = DEFAULT_CONFIG.retriesPerEndpoint,\n timeout = DEFAULT_CONFIG.timeout,\n } = config;\n\n if (urls.length === 0) {\n throw new Error('At least one RPC URL is required');\n }\n\n // For single URL, use simple http transport\n if (urls.length === 1) {\n return createPublicClient({\n chain,\n transport: http(urls[0], { timeout }),\n }) as PublicClient;\n }\n\n // For multiple URLs, use viem's built-in fallback transport\n const transports = urls.map((url) =>\n http(url, {\n timeout,\n retryCount: retriesPerEndpoint,\n retryDelay: 150,\n }),\n );\n\n return createPublicClient({\n chain,\n transport: fallback(transports, {\n rank: true, // Automatically rank transports by latency\n retryCount: 1,\n }),\n }) as PublicClient;\n}\n\n/**\n * Check if an error is recoverable (worth retrying)\n */\nexport function isRecoverableError(error: Error): boolean {\n const message = error.message.toLowerCase();\n\n // Network errors are recoverable\n if (\n message.includes('network') ||\n message.includes('timeout') ||\n message.includes('econnrefused') ||\n message.includes('econnreset') ||\n message.includes('socket')\n ) {\n return true;\n }\n\n // Server errors are recoverable\n if (\n message.includes('500') ||\n message.includes('502') ||\n message.includes('503') ||\n message.includes('504')\n ) {\n return true;\n }\n\n // Rate limits are recoverable with backoff\n if (isRateLimitError(error)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if error is a rate limit error\n */\nfunction isRateLimitError(error: Error): boolean {\n const message = error.message.toLowerCase();\n return (\n message.includes('rate limit') ||\n message.includes('too many requests') ||\n message.includes('429') ||\n message.includes('throttle')\n );\n}\n","/**\n * Blockchain Read Layer - Constants and Chain Configurations\n * @module @lumiapassport/core/read\n */\n\nimport type { Address } from 'viem';\nimport type { ChainConfig } from './types';\n\n/**\n * Well-known Multicall3 contract address\n * Deployed at the same address on most EVM chains\n */\nexport const MULTICALL3_ADDRESS: Address = '0xcA11bde05977b3631167028862bE2a173976CA11';\n\n/**\n * Lumia Mainnet chain ID\n */\nexport const LUMIA_MAINNET_CHAIN_ID = 994873017;\n\n/**\n * Lumia Testnet chain ID\n */\nexport const LUMIA_TESTNET_CHAIN_ID = 1952959480;\n\n/**\n * Lumia Mainnet configuration\n */\nexport const LUMIA_MAINNET: ChainConfig = {\n id: LUMIA_MAINNET_CHAIN_ID,\n name: 'Lumia',\n rpcUrls: ['https://rpc.lumia.org'],\n multicall3: MULTICALL3_ADDRESS,\n blockTime: 2, // ~2 seconds per block\n};\n\n/**\n * Lumia Testnet configuration\n */\nexport const LUMIA_TESTNET: ChainConfig = {\n id: LUMIA_TESTNET_CHAIN_ID,\n name: 'Lumia Testnet',\n rpcUrls: ['https://testnet-rpc.lumia.org'],\n multicall3: MULTICALL3_ADDRESS,\n blockTime: 2,\n};\n\n/**\n * All supported chains with built-in configurations\n */\nexport const SUPPORTED_CHAINS: Map<number, ChainConfig> = new Map([\n [LUMIA_MAINNET_CHAIN_ID, LUMIA_MAINNET],\n [LUMIA_TESTNET_CHAIN_ID, LUMIA_TESTNET],\n]);\n\n/**\n * Get chain configuration by chain ID\n * Returns undefined for unsupported chains\n */\nexport function getChainConfig(chainId: number): ChainConfig | undefined {\n return SUPPORTED_CHAINS.get(chainId);\n}\n\n/**\n * Check if a chain is supported with built-in configuration\n */\nexport function isChainSupported(chainId: number): boolean {\n return SUPPORTED_CHAINS.has(chainId);\n}\n\n/**\n * Default cache TTL in milliseconds (12 seconds, ~1 block)\n */\nexport const DEFAULT_CACHE_TTL = 12000;\n\n/**\n * Default maximum cache entries\n */\nexport const DEFAULT_CACHE_MAX_SIZE = 1000;\n\n/**\n * Default maximum calls per multicall batch\n */\nexport const DEFAULT_MULTICALL_BATCH_SIZE = 100;\n\n/**\n * Default block range for getLogs queries (to avoid RPC limits)\n */\nexport const DEFAULT_LOGS_BLOCK_RANGE = 2000n;\n\n/**\n * Maximum block range for a single getLogs query\n */\nexport const MAX_LOGS_BLOCK_RANGE = 10000n;\n","/**\n * Blockchain Read Layer - Error Classes\n * @module @lumiapassport/core/read\n */\n\nimport type { Address } from 'viem';\n\n/**\n * Base error class for read layer errors\n */\nexport class ReadLayerError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n ) {\n super(message);\n this.name = 'ReadLayerError';\n }\n}\n\n/**\n * Contract does not exist at the specified address\n */\nexport class ContractNotFoundError extends ReadLayerError {\n constructor(\n public readonly address: Address,\n public readonly chainId: number,\n ) {\n super(\n `Contract not found at ${address} on chain ${chainId}`,\n 'CONTRACT_NOT_FOUND',\n );\n this.name = 'ContractNotFoundError';\n }\n}\n\n/**\n * Contract call reverted with a reason\n */\nexport class ContractRevertError extends ReadLayerError {\n constructor(\n public readonly address: Address,\n public readonly functionName: string,\n public readonly reason: string,\n ) {\n super(\n `Contract call to ${functionName} at ${address} reverted: ${reason}`,\n 'CONTRACT_REVERTED',\n );\n this.name = 'ContractRevertError';\n }\n}\n\n/**\n * Failed to connect to RPC endpoint\n */\nexport class RpcConnectionError extends ReadLayerError {\n constructor(\n public readonly url: string,\n public readonly cause?: Error,\n ) {\n super(`Failed to connect to RPC: ${url}`, 'RPC_CONNECTION_FAILED');\n this.name = 'RpcConnectionError';\n }\n}\n\n/**\n * All configured RPC endpoints failed\n */\nexport class AllRpcsFailedError extends ReadLayerError {\n constructor(\n public readonly urls: string[],\n public readonly errors: Error[],\n ) {\n super(\n `All ${urls.length} RPC endpoint(s) failed`,\n 'ALL_RPCS_FAILED',\n );\n this.name = 'AllRpcsFailedError';\n }\n}\n\n/**\n * RPC returned rate limit response\n */\nexport class RateLimitedError extends ReadLayerError {\n constructor(\n public readonly url: string,\n public readonly retryAfter?: number,\n ) {\n super(\n `Rate limited by RPC: ${url}${retryAfter ? `, retry after ${retryAfter}s` : ''}`,\n 'RATE_LIMITED',\n );\n this.name = 'RateLimitedError';\n }\n}\n\n/**\n * Requested block has been pruned from RPC node\n */\nexport class BlockPrunedError extends ReadLayerError {\n constructor(public readonly blockNumber: bigint) {\n super(\n `Block ${blockNumber} has been pruned and is not available`,\n 'BLOCK_PRUNED',\n );\n this.name = 'BlockPrunedError';\n }\n}\n\n/**\n * Invalid ABI provided - function not found\n */\nexport class InvalidAbiError extends ReadLayerError {\n constructor(\n public readonly functionName: string,\n public readonly address: Address,\n ) {\n super(\n `Function '${functionName}' not found in ABI for contract at ${address}`,\n 'INVALID_ABI',\n );\n this.name = 'InvalidAbiError';\n }\n}\n\n/**\n * Chain configuration not found\n */\nexport class ChainNotSupportedError extends ReadLayerError {\n constructor(public readonly chainId: number) {\n super(\n `Chain ${chainId} is not supported. Please provide an RPC URL.`,\n 'CHAIN_NOT_SUPPORTED',\n );\n this.name = 'ChainNotSupportedError';\n }\n}\n","/**\n * Public Client Factory for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport {\n createPublicClient,\n http,\n type Chain,\n type PublicClient as ViemPublicClient,\n type BlockTag as ViemBlockTag,\n} from 'viem';\nimport { LRUCache, generateCacheKey } from './cache';\nimport { createFallbackClient } from './rpc-fallback';\nimport {\n getChainConfig,\n DEFAULT_CACHE_TTL,\n DEFAULT_CACHE_MAX_SIZE,\n MULTICALL3_ADDRESS,\n} from './constants';\nimport { ChainNotSupportedError } from './errors';\nimport type {\n PublicReadClientConfig,\n PublicReadClient,\n ReadContractParams,\n MulticallParams,\n MulticallResult,\n GetLogsParams,\n LogEntry,\n CacheStats,\n ContractCall,\n BlockTag,\n} from './types';\nimport type { Abi, Address } from 'viem';\n\n/**\n * Internal client implementation\n */\nclass PublicReadClientImpl implements PublicReadClient {\n readonly chainId: number;\n private readonly viemClient: ViemPublicClient;\n private readonly cache: LRUCache | null;\n private readonly multicall3Address: Address | null;\n\n constructor(\n chainId: number,\n viemClient: ViemPublicClient,\n cache: LRUCache | null,\n multicall3Address: Address | null,\n ) {\n this.chainId = chainId;\n this.viemClient = viemClient;\n this.cache = cache;\n this.multicall3Address = multicall3Address;\n }\n\n async readContract<TAbi extends Abi, TFunctionName extends string>(\n params: ReadContractParams<TAbi, TFunctionName>,\n ): Promise<unknown> {\n const {\n address,\n abi,\n functionName,\n args = [],\n blockTag = 'latest',\n from,\n forceRefresh = false,\n } = params;\n\n // Check cache first (unless forceRefresh)\n if (this.cache && !forceRefresh) {\n const cacheKey = generateCacheKey({\n chainId: this.chainId,\n address,\n functionName,\n args,\n blockTag,\n from,\n });\n\n const cached = this.cache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n }\n\n // Make the RPC call\n const result = await this.viemClient.readContract({\n address,\n abi,\n functionName,\n args: args as unknown[],\n blockTag: normalizeBlockTag(blockTag),\n account: from,\n } as Parameters<typeof this.viemClient.readContract>[0]);\n\n // Store in cache\n if (this.cache) {\n const cacheKey = generateCacheKey({\n chainId: this.chainId,\n address,\n functionName,\n args,\n blockTag,\n from,\n });\n this.cache.set(cacheKey, result);\n }\n\n return result;\n }\n\n async multicall<TContracts extends readonly ContractCall[]>(\n params: MulticallParams<TContracts>,\n ): Promise<MulticallResult[]> {\n const {\n contracts,\n allowFailure = true,\n blockTag = 'latest',\n batchSize = 100,\n } = params;\n\n // If no multicall3 or only one contract, use sequential calls\n if (!this.multicall3Address || contracts.length === 1) {\n return this.sequentialMulticall(contracts, allowFailure, blockTag);\n }\n\n // Chunk large batches\n const results: MulticallResult[] = [];\n for (let i = 0; i < contracts.length; i += batchSize) {\n const chunk = contracts.slice(i, i + batchSize);\n const chunkResults = await this.executeMulticallBatch(\n chunk,\n allowFailure,\n blockTag,\n );\n results.push(...chunkResults);\n }\n\n return results;\n }\n\n private async executeMulticallBatch(\n contracts: readonly ContractCall[],\n allowFailure: boolean,\n blockTag: BlockTag,\n ): Promise<MulticallResult[]> {\n try {\n const results = await this.viemClient.multicall({\n contracts: contracts.map((c) => ({\n address: c.address,\n abi: c.abi,\n functionName: c.functionName,\n args: c.args as unknown[],\n })),\n allowFailure,\n blockTag: blockTag as ViemBlockTag,\n multicallAddress: this.multicall3Address!,\n });\n\n // Cast results to known shape - viem returns either success or failure objects\n const typedResults = results as Array<\n { status: 'success'; result: unknown } | { status: 'failure'; error: Error }\n >;\n\n return typedResults.map((r) => {\n if (r.status === 'success') {\n return { status: 'success' as const, result: r.result };\n } else {\n return { status: 'failure' as const, error: r.error };\n }\n });\n } catch (error) {\n // If multicall fails entirely, fall back to sequential\n return this.sequentialMulticall(contracts, allowFailure, blockTag);\n }\n }\n\n private async sequentialMulticall(\n contracts: readonly ContractCall[],\n allowFailure: boolean,\n blockTag: BlockTag,\n ): Promise<MulticallResult[]> {\n const results: MulticallResult[] = [];\n\n for (const contract of contracts) {\n try {\n const result = await this.readContract({\n address: contract.address,\n abi: contract.abi,\n functionName: contract.functionName,\n args: contract.args,\n blockTag,\n });\n results.push({ status: 'success', result });\n } catch (error) {\n if (allowFailure) {\n results.push({\n status: 'failure',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n } else {\n throw error;\n }\n }\n }\n\n return results;\n }\n\n async getLogs(params: GetLogsParams): Promise<LogEntry[]> {\n const { address, event, args, fromBlock, toBlock, blockHash } = params;\n\n // Build parameters conditionally based on what's provided\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const logsParams: any = {};\n\n if (address !== undefined) {\n logsParams.address = address;\n }\n\n if (event !== undefined) {\n logsParams.event = event;\n }\n\n if (args !== undefined) {\n logsParams.args = args;\n }\n\n if (blockHash !== undefined) {\n logsParams.blockHash = blockHash;\n } else {\n if (fromBlock !== undefined) {\n logsParams.fromBlock = normalizeBlockTag(fromBlock);\n }\n if (toBlock !== undefined) {\n logsParams.toBlock = normalizeBlockTag(toBlock);\n }\n }\n\n const logs = await this.viemClient.getLogs(logsParams);\n\n return logs.map((log) => ({\n address: log.address,\n topics: log.topics as [Address, ...Address[]] | [],\n data: log.data,\n blockNumber: log.blockNumber,\n blockHash: log.blockHash,\n transactionHash: log.transactionHash,\n transactionIndex: log.transactionIndex,\n logIndex: log.logIndex,\n removed: log.removed,\n // These properties only exist when an event ABI is provided\n args: 'args' in log ? (log.args as Record<string, unknown>) : undefined,\n eventName: 'eventName' in log ? (log.eventName as string) : undefined,\n }));\n }\n\n clearCache(): void {\n this.cache?.clear();\n }\n\n getCacheStats(): CacheStats {\n if (!this.cache) {\n return { size: 0, maxSize: 0, hits: 0, misses: 0 };\n }\n return this.cache.getStats();\n }\n}\n\n/**\n * Create a public read client for blockchain queries\n *\n * @example\n * ```typescript\n * // Using Lumia mainnet defaults\n * const client = getPublicClient({ chainId: 994873017 });\n *\n * // Using custom RPC with fallbacks\n * const client = getPublicClient({\n * chainId: 1,\n * rpcUrls: ['https://primary.rpc', 'https://fallback.rpc'],\n * });\n * ```\n */\nexport function getPublicClient(config: PublicReadClientConfig): PublicReadClient {\n const {\n chainId,\n rpcUrls,\n multicall3Address,\n cacheTtl = DEFAULT_CACHE_TTL,\n cacheMaxSize = DEFAULT_CACHE_MAX_SIZE,\n disableCache = false,\n } = config;\n\n // Get RPC URLs\n const urls = resolveRpcUrls(chainId, rpcUrls);\n\n // Create chain object for viem\n const chainConfig = getChainConfig(chainId);\n const chain: Chain = {\n id: chainId,\n name: chainConfig?.name ?? `Chain ${chainId}`,\n nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: urls },\n },\n };\n\n // Create viem client with fallback support\n let viemClient: ViemPublicClient;\n if (urls.length === 1) {\n viemClient = createPublicClient({\n chain,\n transport: http(urls[0]),\n });\n } else {\n viemClient = createFallbackClient(chain, { urls });\n }\n\n // Create cache if enabled\n const cache = disableCache\n ? null\n : new LRUCache({ maxSize: cacheMaxSize, ttl: cacheTtl });\n\n // Determine multicall3 address\n const resolvedMulticall3 =\n multicall3Address ?? chainConfig?.multicall3 ?? MULTICALL3_ADDRESS;\n\n return new PublicReadClientImpl(chainId, viemClient, cache, resolvedMulticall3);\n}\n\n/**\n * Resolve RPC URLs from config or chain defaults\n */\nfunction resolveRpcUrls(\n chainId: number,\n rpcUrls?: string | string[],\n): string[] {\n // If URLs provided, use them\n if (rpcUrls) {\n return Array.isArray(rpcUrls) ? rpcUrls : [rpcUrls];\n }\n\n // Try to get from chain config\n const chainConfig = getChainConfig(chainId);\n if (chainConfig) {\n return chainConfig.rpcUrls;\n }\n\n // Chain not supported and no URLs provided\n throw new ChainNotSupportedError(chainId);\n}\n\n/**\n * Normalize block tag for viem\n */\nfunction normalizeBlockTag(\n blockTag: BlockTag | bigint,\n): 'latest' | 'pending' | 'safe' | 'finalized' | 'earliest' | bigint {\n if (typeof blockTag === 'bigint') {\n return blockTag;\n }\n return blockTag;\n}\n"]}
1
+ {"version":3,"sources":["../../src/read/cache.ts","../../src/read/rpc-fallback.ts","../../src/read/constants.ts","../../src/read/errors.ts","../../src/read/public-client.ts"],"names":["createPublicClient","http","fallback"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * LRU Cache implementation for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport type { CacheConfig, CacheStats, BlockTag } from './types';\nimport type { Address } from 'viem';\n\n/**\n * Internal cache entry structure\n */\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n}\n\n/**\n * Default cache configuration\n */\nexport const DEFAULT_CACHE_CONFIG: CacheConfig = {\n maxSize: 1000,\n ttl: 12000, // 12 seconds (~1 block)\n};\n\n/**\n * LRU Cache with TTL support for blockchain read operations\n */\nexport class LRUCache<T = unknown> {\n private cache: Map<string, CacheEntry<T>>;\n private readonly maxSize: number;\n private readonly ttl: number;\n private hits = 0;\n private misses = 0;\n\n constructor(config: Partial<CacheConfig> = {}) {\n this.maxSize = config.maxSize ?? DEFAULT_CACHE_CONFIG.maxSize;\n this.ttl = config.ttl ?? DEFAULT_CACHE_CONFIG.ttl;\n this.cache = new Map();\n }\n\n /**\n * Get a value from cache\n * Returns undefined if not found or expired\n */\n get(key: string): T | undefined {\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.misses++;\n return undefined;\n }\n\n // Check if expired\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n this.misses++;\n return undefined;\n }\n\n // Move to end (most recently used) by deleting and re-adding\n this.cache.delete(key);\n this.cache.set(key, entry);\n this.hits++;\n\n return entry.value;\n }\n\n /**\n * Set a value in cache with optional custom TTL\n */\n set(key: string, value: T, customTtl?: number): void {\n // If key exists, delete it first to update position\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // Evict oldest entries if at capacity\n while (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n }\n }\n\n const ttlToUse = customTtl ?? this.ttl;\n this.cache.set(key, {\n value,\n expiresAt: Date.now() + ttlToUse,\n });\n }\n\n /**\n * Check if key exists and is not expired\n */\n has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Delete a specific key\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.cache.clear();\n this.hits = 0;\n this.misses = 0;\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n // Clean expired entries before reporting\n this.cleanExpired();\n\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hits: this.hits,\n misses: this.misses,\n };\n }\n\n /**\n * Remove expired entries\n */\n private cleanExpired(): void {\n const now = Date.now();\n for (const [key, entry] of this.cache.entries()) {\n if (now > entry.expiresAt) {\n this.cache.delete(key);\n }\n }\n }\n}\n\n/**\n * Generate a deterministic cache key for contract reads\n */\nexport function generateCacheKey(params: {\n chainId: number;\n address: Address;\n functionName: string;\n args: readonly unknown[];\n blockTag: BlockTag;\n from?: Address;\n}): string {\n const keyParts = {\n c: params.chainId,\n a: params.address.toLowerCase(),\n f: params.functionName,\n r: params.args,\n b: serializeBlockTag(params.blockTag),\n s: params.from?.toLowerCase(),\n };\n\n return JSON.stringify(keyParts);\n}\n\n/**\n * Serialize block tag for cache key\n */\nfunction serializeBlockTag(blockTag: BlockTag): string {\n if (typeof blockTag === 'bigint') {\n return `n:${blockTag.toString()}`;\n }\n return blockTag;\n}\n","/**\n * RPC Fallback Transport for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport {\n createPublicClient,\n fallback,\n http,\n type Chain,\n type PublicClient,\n} from 'viem';\n\n/**\n * Configuration for fallback transport\n */\nexport interface FallbackTransportConfig {\n /**\n * RPC URLs in priority order\n */\n urls: string[];\n\n /**\n * Number of retries per endpoint before failover\n * @default 1\n */\n retriesPerEndpoint?: number;\n\n /**\n * Request timeout in ms\n * @default 10000\n */\n timeout?: number;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG = {\n retriesPerEndpoint: 1,\n timeout: 10000,\n};\n\n/**\n * Create a viem public client with fallback RPC support\n */\nexport function createFallbackClient(\n chain: Chain,\n config: FallbackTransportConfig,\n): PublicClient {\n const {\n urls,\n retriesPerEndpoint = DEFAULT_CONFIG.retriesPerEndpoint,\n timeout = DEFAULT_CONFIG.timeout,\n } = config;\n\n if (urls.length === 0) {\n throw new Error('At least one RPC URL is required');\n }\n\n // For single URL, use simple http transport\n if (urls.length === 1) {\n return createPublicClient({\n chain,\n transport: http(urls[0], { timeout }),\n }) as PublicClient;\n }\n\n // For multiple URLs, use viem's built-in fallback transport\n const transports = urls.map((url) =>\n http(url, {\n timeout,\n retryCount: retriesPerEndpoint,\n retryDelay: 150,\n }),\n );\n\n return createPublicClient({\n chain,\n transport: fallback(transports, {\n rank: true, // Automatically rank transports by latency\n retryCount: 1,\n }),\n }) as PublicClient;\n}\n\n/**\n * Check if an error is recoverable (worth retrying)\n */\nexport function isRecoverableError(error: Error): boolean {\n const message = error.message.toLowerCase();\n\n // Network errors are recoverable\n if (\n message.includes('network') ||\n message.includes('timeout') ||\n message.includes('econnrefused') ||\n message.includes('econnreset') ||\n message.includes('socket')\n ) {\n return true;\n }\n\n // Server errors are recoverable\n if (\n message.includes('500') ||\n message.includes('502') ||\n message.includes('503') ||\n message.includes('504')\n ) {\n return true;\n }\n\n // Rate limits are recoverable with backoff\n if (isRateLimitError(error)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if error is a rate limit error\n */\nfunction isRateLimitError(error: Error): boolean {\n const message = error.message.toLowerCase();\n return (\n message.includes('rate limit') ||\n message.includes('too many requests') ||\n message.includes('429') ||\n message.includes('throttle')\n );\n}\n","/**\n * Blockchain Read Layer - Constants and Chain Configurations\n * @module @lumiapassport/core/read\n */\n\nimport type { Address } from 'viem';\nimport type { ChainConfig } from './types';\n\n/**\n * Well-known Multicall3 contract address\n * Deployed at the same address on most EVM chains\n */\nexport const MULTICALL3_ADDRESS: Address = '0xcA11bde05977b3631167028862bE2a173976CA11';\n\n/**\n * Lumia Mainnet chain ID\n */\nexport const LUMIA_MAINNET_CHAIN_ID = 994873017;\n\n/**\n * Lumia Testnet chain ID\n */\nexport const LUMIA_TESTNET_CHAIN_ID = 1952959480;\n\n/**\n * Lumia Mainnet configuration\n */\nexport const LUMIA_MAINNET: ChainConfig = {\n id: LUMIA_MAINNET_CHAIN_ID,\n name: 'Lumia',\n rpcUrls: ['https://rpc.lumia.org'],\n multicall3: MULTICALL3_ADDRESS,\n blockTime: 2, // ~2 seconds per block\n};\n\n/**\n * Lumia Testnet configuration\n */\nexport const LUMIA_TESTNET: ChainConfig = {\n id: LUMIA_TESTNET_CHAIN_ID,\n name: 'Lumia Testnet',\n rpcUrls: ['https://testnet-rpc.lumia.org'],\n multicall3: MULTICALL3_ADDRESS,\n blockTime: 2,\n};\n\n/**\n * All supported chains with built-in configurations\n */\nexport const SUPPORTED_CHAINS: Map<number, ChainConfig> = new Map([\n [LUMIA_MAINNET_CHAIN_ID, LUMIA_MAINNET],\n [LUMIA_TESTNET_CHAIN_ID, LUMIA_TESTNET],\n]);\n\n/**\n * Get chain configuration by chain ID\n * Returns undefined for unsupported chains\n */\nexport function getChainConfig(chainId: number): ChainConfig | undefined {\n return SUPPORTED_CHAINS.get(chainId);\n}\n\n/**\n * Check if a chain is supported with built-in configuration\n */\nexport function isChainSupported(chainId: number): boolean {\n return SUPPORTED_CHAINS.has(chainId);\n}\n\n/**\n * Default cache TTL in milliseconds (12 seconds, ~1 block)\n */\nexport const DEFAULT_CACHE_TTL = 12000;\n\n/**\n * Default maximum cache entries\n */\nexport const DEFAULT_CACHE_MAX_SIZE = 1000;\n\n/**\n * Default maximum calls per multicall batch\n */\nexport const DEFAULT_MULTICALL_BATCH_SIZE = 100;\n\n/**\n * Default block range for getLogs queries (to avoid RPC limits)\n */\nexport const DEFAULT_LOGS_BLOCK_RANGE = 2000n;\n\n/**\n * Maximum block range for a single getLogs query\n */\nexport const MAX_LOGS_BLOCK_RANGE = 10000n;\n","/**\n * Blockchain Read Layer - Error Classes\n * @module @lumiapassport/core/read\n */\n\nimport type { Address } from 'viem';\n\n/**\n * Base error class for read layer errors\n */\nexport class ReadLayerError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n ) {\n super(message);\n this.name = 'ReadLayerError';\n }\n}\n\n/**\n * Contract does not exist at the specified address\n */\nexport class ContractNotFoundError extends ReadLayerError {\n constructor(\n public readonly address: Address,\n public readonly chainId: number,\n ) {\n super(\n `Contract not found at ${address} on chain ${chainId}`,\n 'CONTRACT_NOT_FOUND',\n );\n this.name = 'ContractNotFoundError';\n }\n}\n\n/**\n * Contract call reverted with a reason\n */\nexport class ContractRevertError extends ReadLayerError {\n constructor(\n public readonly address: Address,\n public readonly functionName: string,\n public readonly reason: string,\n ) {\n super(\n `Contract call to ${functionName} at ${address} reverted: ${reason}`,\n 'CONTRACT_REVERTED',\n );\n this.name = 'ContractRevertError';\n }\n}\n\n/**\n * Failed to connect to RPC endpoint\n */\nexport class RpcConnectionError extends ReadLayerError {\n constructor(\n public readonly url: string,\n public readonly cause?: Error,\n ) {\n super(`Failed to connect to RPC: ${url}`, 'RPC_CONNECTION_FAILED');\n this.name = 'RpcConnectionError';\n }\n}\n\n/**\n * All configured RPC endpoints failed\n */\nexport class AllRpcsFailedError extends ReadLayerError {\n constructor(\n public readonly urls: string[],\n public readonly errors: Error[],\n ) {\n super(\n `All ${urls.length} RPC endpoint(s) failed`,\n 'ALL_RPCS_FAILED',\n );\n this.name = 'AllRpcsFailedError';\n }\n}\n\n/**\n * RPC returned rate limit response\n */\nexport class RateLimitedError extends ReadLayerError {\n constructor(\n public readonly url: string,\n public readonly retryAfter?: number,\n ) {\n super(\n `Rate limited by RPC: ${url}${retryAfter ? `, retry after ${retryAfter}s` : ''}`,\n 'RATE_LIMITED',\n );\n this.name = 'RateLimitedError';\n }\n}\n\n/**\n * Requested block has been pruned from RPC node\n */\nexport class BlockPrunedError extends ReadLayerError {\n constructor(public readonly blockNumber: bigint) {\n super(\n `Block ${blockNumber} has been pruned and is not available`,\n 'BLOCK_PRUNED',\n );\n this.name = 'BlockPrunedError';\n }\n}\n\n/**\n * Invalid ABI provided - function not found\n */\nexport class InvalidAbiError extends ReadLayerError {\n constructor(\n public readonly functionName: string,\n public readonly address: Address,\n ) {\n super(\n `Function '${functionName}' not found in ABI for contract at ${address}`,\n 'INVALID_ABI',\n );\n this.name = 'InvalidAbiError';\n }\n}\n\n/**\n * Chain configuration not found\n */\nexport class ChainNotSupportedError extends ReadLayerError {\n constructor(public readonly chainId: number) {\n super(\n `Chain ${chainId} is not supported. Please provide an RPC URL.`,\n 'CHAIN_NOT_SUPPORTED',\n );\n this.name = 'ChainNotSupportedError';\n }\n}\n\n/**\n * Transaction receipt not found within timeout period\n */\nexport class TransactionReceiptTimeoutError extends ReadLayerError {\n constructor(\n public readonly hash: string,\n public readonly timeout: number,\n ) {\n super(\n `Transaction receipt not found within ${timeout}ms: ${hash}`,\n 'TRANSACTION_RECEIPT_TIMEOUT',\n );\n this.name = 'TransactionReceiptTimeoutError';\n }\n}\n","/**\n * Public Client Factory for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport {\n createPublicClient,\n http,\n type Chain,\n type PublicClient as ViemPublicClient,\n type BlockTag as ViemBlockTag,\n} from 'viem';\nimport { LRUCache, generateCacheKey } from './cache';\nimport { createFallbackClient } from './rpc-fallback';\nimport {\n getChainConfig,\n DEFAULT_CACHE_TTL,\n DEFAULT_CACHE_MAX_SIZE,\n MULTICALL3_ADDRESS,\n} from './constants';\nimport { ChainNotSupportedError, TransactionReceiptTimeoutError } from './errors';\nimport type {\n PublicReadClientConfig,\n PublicReadClient,\n ReadContractParams,\n MulticallParams,\n MulticallResult,\n GetLogsParams,\n LogEntry,\n CacheStats,\n ContractCall,\n BlockTag,\n GetTransactionReceiptParams,\n WaitForTransactionReceiptParams,\n TransactionReceipt,\n ReplacedTransactionResponse,\n} from './types';\nimport type { Abi, Address } from 'viem';\n\n/**\n * Internal client implementation\n */\nclass PublicReadClientImpl implements PublicReadClient {\n readonly chainId: number;\n private readonly viemClient: ViemPublicClient;\n private readonly cache: LRUCache | null;\n private readonly multicall3Address: Address | null;\n\n constructor(\n chainId: number,\n viemClient: ViemPublicClient,\n cache: LRUCache | null,\n multicall3Address: Address | null,\n ) {\n this.chainId = chainId;\n this.viemClient = viemClient;\n this.cache = cache;\n this.multicall3Address = multicall3Address;\n }\n\n async readContract<TAbi extends Abi, TFunctionName extends string>(\n params: ReadContractParams<TAbi, TFunctionName>,\n ): Promise<unknown> {\n const {\n address,\n abi,\n functionName,\n args = [],\n blockTag = 'latest',\n from,\n forceRefresh = false,\n } = params;\n\n // Check cache first (unless forceRefresh)\n if (this.cache && !forceRefresh) {\n const cacheKey = generateCacheKey({\n chainId: this.chainId,\n address,\n functionName,\n args,\n blockTag,\n from,\n });\n\n const cached = this.cache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n }\n\n // Make the RPC call\n const result = await this.viemClient.readContract({\n address,\n abi,\n functionName,\n args: args as unknown[],\n blockTag: normalizeBlockTag(blockTag),\n account: from,\n } as Parameters<typeof this.viemClient.readContract>[0]);\n\n // Store in cache\n if (this.cache) {\n const cacheKey = generateCacheKey({\n chainId: this.chainId,\n address,\n functionName,\n args,\n blockTag,\n from,\n });\n this.cache.set(cacheKey, result);\n }\n\n return result;\n }\n\n async multicall<TContracts extends readonly ContractCall[]>(\n params: MulticallParams<TContracts>,\n ): Promise<MulticallResult[]> {\n const {\n contracts,\n allowFailure = true,\n blockTag = 'latest',\n batchSize = 100,\n } = params;\n\n // If no multicall3 or only one contract, use sequential calls\n if (!this.multicall3Address || contracts.length === 1) {\n return this.sequentialMulticall(contracts, allowFailure, blockTag);\n }\n\n // Chunk large batches\n const results: MulticallResult[] = [];\n for (let i = 0; i < contracts.length; i += batchSize) {\n const chunk = contracts.slice(i, i + batchSize);\n const chunkResults = await this.executeMulticallBatch(\n chunk,\n allowFailure,\n blockTag,\n );\n results.push(...chunkResults);\n }\n\n return results;\n }\n\n private async executeMulticallBatch(\n contracts: readonly ContractCall[],\n allowFailure: boolean,\n blockTag: BlockTag,\n ): Promise<MulticallResult[]> {\n try {\n const results = await this.viemClient.multicall({\n contracts: contracts.map((c) => ({\n address: c.address,\n abi: c.abi,\n functionName: c.functionName,\n args: c.args as unknown[],\n })),\n allowFailure,\n blockTag: blockTag as ViemBlockTag,\n multicallAddress: this.multicall3Address!,\n });\n\n // Cast results to known shape - viem returns either success or failure objects\n const typedResults = results as Array<\n { status: 'success'; result: unknown } | { status: 'failure'; error: Error }\n >;\n\n return typedResults.map((r) => {\n if (r.status === 'success') {\n return { status: 'success' as const, result: r.result };\n } else {\n return { status: 'failure' as const, error: r.error };\n }\n });\n } catch (error) {\n // If multicall fails entirely, fall back to sequential\n return this.sequentialMulticall(contracts, allowFailure, blockTag);\n }\n }\n\n private async sequentialMulticall(\n contracts: readonly ContractCall[],\n allowFailure: boolean,\n blockTag: BlockTag,\n ): Promise<MulticallResult[]> {\n const results: MulticallResult[] = [];\n\n for (const contract of contracts) {\n try {\n const result = await this.readContract({\n address: contract.address,\n abi: contract.abi,\n functionName: contract.functionName,\n args: contract.args,\n blockTag,\n });\n results.push({ status: 'success', result });\n } catch (error) {\n if (allowFailure) {\n results.push({\n status: 'failure',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n } else {\n throw error;\n }\n }\n }\n\n return results;\n }\n\n async getLogs(params: GetLogsParams): Promise<LogEntry[]> {\n const { address, event, args, fromBlock, toBlock, blockHash } = params;\n\n // Build parameters conditionally based on what's provided\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const logsParams: any = {};\n\n if (address !== undefined) {\n logsParams.address = address;\n }\n\n if (event !== undefined) {\n logsParams.event = event;\n }\n\n if (args !== undefined) {\n logsParams.args = args;\n }\n\n if (blockHash !== undefined) {\n logsParams.blockHash = blockHash;\n } else {\n if (fromBlock !== undefined) {\n logsParams.fromBlock = normalizeBlockTag(fromBlock);\n }\n if (toBlock !== undefined) {\n logsParams.toBlock = normalizeBlockTag(toBlock);\n }\n }\n\n const logs = await this.viemClient.getLogs(logsParams);\n\n return logs.map((log) => ({\n address: log.address,\n topics: log.topics as [Address, ...Address[]] | [],\n data: log.data,\n blockNumber: log.blockNumber,\n blockHash: log.blockHash,\n transactionHash: log.transactionHash,\n transactionIndex: log.transactionIndex,\n logIndex: log.logIndex,\n removed: log.removed,\n // These properties only exist when an event ABI is provided\n args: 'args' in log ? (log.args as Record<string, unknown>) : undefined,\n eventName: 'eventName' in log ? (log.eventName as string) : undefined,\n }));\n }\n\n async getTransactionReceipt(\n params: GetTransactionReceiptParams,\n ): Promise<TransactionReceipt | null> {\n const { hash } = params;\n\n try {\n const receipt = await this.viemClient.getTransactionReceipt({ hash });\n return this.mapReceipt(receipt);\n } catch (error) {\n // Transaction not found or pending\n if (\n error instanceof Error &&\n (error.message.includes('could not be found') ||\n error.message.includes('not found'))\n ) {\n return null;\n }\n throw error;\n }\n }\n\n async waitForTransactionReceipt(\n params: WaitForTransactionReceiptParams,\n ): Promise<TransactionReceipt> {\n const {\n hash,\n confirmations = 1,\n pollingInterval = 4000,\n timeout = 60000,\n onReplaced,\n } = params;\n\n try {\n const receipt = await this.viemClient.waitForTransactionReceipt({\n hash,\n confirmations,\n pollingInterval,\n timeout,\n onReplaced: onReplaced\n ? (response) => {\n onReplaced({\n reason: response.reason,\n replacedTransaction: { hash: response.replacedTransaction.hash },\n transaction: { hash: response.transaction.hash },\n transactionReceipt: this.mapReceipt(response.transactionReceipt),\n } as ReplacedTransactionResponse);\n }\n : undefined,\n });\n return this.mapReceipt(receipt);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes('timed out')\n ) {\n throw new TransactionReceiptTimeoutError(hash, timeout);\n }\n throw error;\n }\n }\n\n private mapReceipt(\n receipt: Awaited<ReturnType<typeof this.viemClient.getTransactionReceipt>>,\n ): TransactionReceipt {\n return {\n blockHash: receipt.blockHash,\n blockNumber: receipt.blockNumber,\n contractAddress: receipt.contractAddress,\n cumulativeGasUsed: receipt.cumulativeGasUsed,\n effectiveGasPrice: receipt.effectiveGasPrice,\n from: receipt.from,\n gasUsed: receipt.gasUsed,\n logs: receipt.logs.map((log) => ({\n address: log.address,\n topics: log.topics as [Address, ...Address[]] | [],\n data: log.data,\n blockNumber: log.blockNumber,\n blockHash: log.blockHash,\n transactionHash: log.transactionHash,\n transactionIndex: log.transactionIndex,\n logIndex: log.logIndex,\n removed: log.removed,\n })),\n logsBloom: receipt.logsBloom,\n status: receipt.status,\n to: receipt.to,\n transactionHash: receipt.transactionHash,\n transactionIndex: receipt.transactionIndex,\n type: receipt.type,\n };\n }\n\n clearCache(): void {\n this.cache?.clear();\n }\n\n getCacheStats(): CacheStats {\n if (!this.cache) {\n return { size: 0, maxSize: 0, hits: 0, misses: 0 };\n }\n return this.cache.getStats();\n }\n}\n\n/**\n * Create a public read client for blockchain queries\n *\n * @example\n * ```typescript\n * // Using Lumia mainnet defaults\n * const client = getPublicClient({ chainId: 994873017 });\n *\n * // Using custom RPC with fallbacks\n * const client = getPublicClient({\n * chainId: 1,\n * rpcUrls: ['https://primary.rpc', 'https://fallback.rpc'],\n * });\n * ```\n */\nexport function getPublicClient(config: PublicReadClientConfig): PublicReadClient {\n const {\n chainId,\n rpcUrls,\n multicall3Address,\n cacheTtl = DEFAULT_CACHE_TTL,\n cacheMaxSize = DEFAULT_CACHE_MAX_SIZE,\n disableCache = false,\n } = config;\n\n // Get RPC URLs\n const urls = resolveRpcUrls(chainId, rpcUrls);\n\n // Create chain object for viem\n const chainConfig = getChainConfig(chainId);\n const chain: Chain = {\n id: chainId,\n name: chainConfig?.name ?? `Chain ${chainId}`,\n nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: urls },\n },\n };\n\n // Create viem client with fallback support\n let viemClient: ViemPublicClient;\n if (urls.length === 1) {\n viemClient = createPublicClient({\n chain,\n transport: http(urls[0]),\n });\n } else {\n viemClient = createFallbackClient(chain, { urls });\n }\n\n // Create cache if enabled\n const cache = disableCache\n ? null\n : new LRUCache({ maxSize: cacheMaxSize, ttl: cacheTtl });\n\n // Determine multicall3 address\n const resolvedMulticall3 =\n multicall3Address ?? chainConfig?.multicall3 ?? MULTICALL3_ADDRESS;\n\n return new PublicReadClientImpl(chainId, viemClient, cache, resolvedMulticall3);\n}\n\n/**\n * Resolve RPC URLs from config or chain defaults\n */\nfunction resolveRpcUrls(\n chainId: number,\n rpcUrls?: string | string[],\n): string[] {\n // If URLs provided, use them\n if (rpcUrls) {\n return Array.isArray(rpcUrls) ? rpcUrls : [rpcUrls];\n }\n\n // Try to get from chain config\n const chainConfig = getChainConfig(chainId);\n if (chainConfig) {\n return chainConfig.rpcUrls;\n }\n\n // Chain not supported and no URLs provided\n throw new ChainNotSupportedError(chainId);\n}\n\n/**\n * Normalize block tag for viem\n */\nfunction normalizeBlockTag(\n blockTag: BlockTag | bigint,\n): 'latest' | 'pending' | 'safe' | 'finalized' | 'earliest' | bigint {\n if (typeof blockTag === 'bigint') {\n return blockTag;\n }\n return blockTag;\n}\n"]}
@@ -229,6 +229,79 @@ interface CacheConfig {
229
229
  */
230
230
  ttl: number;
231
231
  }
232
+ /**
233
+ * Parameters for getting a transaction receipt
234
+ */
235
+ interface GetTransactionReceiptParams {
236
+ /**
237
+ * Transaction hash to get receipt for
238
+ */
239
+ hash: Hash;
240
+ }
241
+ /**
242
+ * Parameters for waiting for a transaction receipt
243
+ */
244
+ interface WaitForTransactionReceiptParams {
245
+ /**
246
+ * Transaction hash to wait for
247
+ */
248
+ hash: Hash;
249
+ /**
250
+ * Number of block confirmations to wait for
251
+ * @default 1
252
+ */
253
+ confirmations?: number;
254
+ /**
255
+ * Polling interval in milliseconds
256
+ * @default 4000
257
+ */
258
+ pollingInterval?: number;
259
+ /**
260
+ * Timeout in milliseconds
261
+ * @default 60000
262
+ */
263
+ timeout?: number;
264
+ /**
265
+ * Callback when transaction is replaced (speed-up or cancelled)
266
+ */
267
+ onReplaced?: (response: ReplacedTransactionResponse) => void;
268
+ }
269
+ /**
270
+ * Transaction type
271
+ */
272
+ type TransactionType = 'legacy' | 'eip2930' | 'eip1559' | 'eip4844' | 'eip7702' | (string & {});
273
+ /**
274
+ * Transaction receipt
275
+ */
276
+ interface TransactionReceipt {
277
+ blockHash: Hash;
278
+ blockNumber: bigint;
279
+ contractAddress: Address | null | undefined;
280
+ cumulativeGasUsed: bigint;
281
+ effectiveGasPrice: bigint;
282
+ from: Address;
283
+ gasUsed: bigint;
284
+ logs: LogEntry[];
285
+ logsBloom: Hex;
286
+ status: 'success' | 'reverted';
287
+ to: Address | null;
288
+ transactionHash: Hash;
289
+ transactionIndex: number;
290
+ type: TransactionType;
291
+ }
292
+ /**
293
+ * Response when a transaction is replaced (speed-up or cancelled)
294
+ */
295
+ interface ReplacedTransactionResponse {
296
+ reason: 'replaced' | 'repriced' | 'cancelled';
297
+ replacedTransaction: {
298
+ hash: Hash;
299
+ };
300
+ transaction: {
301
+ hash: Hash;
302
+ };
303
+ transactionReceipt: TransactionReceipt;
304
+ }
232
305
  /**
233
306
  * Public read client interface - the main API surface
234
307
  */
@@ -249,6 +322,16 @@ interface PublicReadClient {
249
322
  * Query historical event logs
250
323
  */
251
324
  getLogs(params: GetLogsParams): Promise<LogEntry[]>;
325
+ /**
326
+ * Get transaction receipt by hash
327
+ * Returns null if transaction is pending or not found
328
+ */
329
+ getTransactionReceipt(params: GetTransactionReceiptParams): Promise<TransactionReceipt | null>;
330
+ /**
331
+ * Wait for transaction to be mined and return receipt
332
+ * Throws TransactionReceiptTimeoutError if timeout exceeded
333
+ */
334
+ waitForTransactionReceipt(params: WaitForTransactionReceiptParams): Promise<TransactionReceipt>;
252
335
  /**
253
336
  * Clear all cached entries
254
337
  */
@@ -356,6 +439,14 @@ declare class ChainNotSupportedError extends ReadLayerError {
356
439
  readonly chainId: number;
357
440
  constructor(chainId: number);
358
441
  }
442
+ /**
443
+ * Transaction receipt not found within timeout period
444
+ */
445
+ declare class TransactionReceiptTimeoutError extends ReadLayerError {
446
+ readonly hash: string;
447
+ readonly timeout: number;
448
+ constructor(hash: string, timeout: number);
449
+ }
359
450
 
360
451
  /**
361
452
  * Blockchain Read Layer - Constants and Chain Configurations
@@ -466,4 +557,4 @@ declare function generateCacheKey(params: {
466
557
  from?: Address;
467
558
  }): string;
468
559
 
469
- export { type AbiEventDefinition, AllRpcsFailedError, BlockPrunedError, type BlockTag, type CacheConfig, type CacheStats, type ChainConfig, ChainNotSupportedError, type ContractCall, ContractNotFoundError, ContractRevertError, DEFAULT_CACHE_CONFIG, DEFAULT_CACHE_MAX_SIZE, DEFAULT_CACHE_TTL, DEFAULT_MULTICALL_BATCH_SIZE, type EventArgs, type GetLogsParams, InvalidAbiError, LRUCache, LUMIA_MAINNET, LUMIA_MAINNET_CHAIN_ID, LUMIA_TESTNET, LUMIA_TESTNET_CHAIN_ID, type LogEntry, MULTICALL3_ADDRESS, type MulticallFailure, type MulticallParams, type MulticallResult, type MulticallSuccess, type PublicReadClient, type PublicReadClientConfig, RateLimitedError, type ReadContractParams, ReadLayerError, RpcConnectionError, generateCacheKey, getChainConfig, getPublicClient, isChainSupported };
560
+ export { type AbiEventDefinition, AllRpcsFailedError, BlockPrunedError, type BlockTag, type CacheConfig, type CacheStats, type ChainConfig, ChainNotSupportedError, type ContractCall, ContractNotFoundError, ContractRevertError, DEFAULT_CACHE_CONFIG, DEFAULT_CACHE_MAX_SIZE, DEFAULT_CACHE_TTL, DEFAULT_MULTICALL_BATCH_SIZE, type EventArgs, type GetLogsParams, type GetTransactionReceiptParams, InvalidAbiError, LRUCache, LUMIA_MAINNET, LUMIA_MAINNET_CHAIN_ID, LUMIA_TESTNET, LUMIA_TESTNET_CHAIN_ID, type LogEntry, MULTICALL3_ADDRESS, type MulticallFailure, type MulticallParams, type MulticallResult, type MulticallSuccess, type PublicReadClient, type PublicReadClientConfig, RateLimitedError, type ReadContractParams, ReadLayerError, type ReplacedTransactionResponse, RpcConnectionError, type TransactionReceipt, TransactionReceiptTimeoutError, type TransactionType, type WaitForTransactionReceiptParams, generateCacheKey, getChainConfig, getPublicClient, isChainSupported };
@@ -229,6 +229,79 @@ interface CacheConfig {
229
229
  */
230
230
  ttl: number;
231
231
  }
232
+ /**
233
+ * Parameters for getting a transaction receipt
234
+ */
235
+ interface GetTransactionReceiptParams {
236
+ /**
237
+ * Transaction hash to get receipt for
238
+ */
239
+ hash: Hash;
240
+ }
241
+ /**
242
+ * Parameters for waiting for a transaction receipt
243
+ */
244
+ interface WaitForTransactionReceiptParams {
245
+ /**
246
+ * Transaction hash to wait for
247
+ */
248
+ hash: Hash;
249
+ /**
250
+ * Number of block confirmations to wait for
251
+ * @default 1
252
+ */
253
+ confirmations?: number;
254
+ /**
255
+ * Polling interval in milliseconds
256
+ * @default 4000
257
+ */
258
+ pollingInterval?: number;
259
+ /**
260
+ * Timeout in milliseconds
261
+ * @default 60000
262
+ */
263
+ timeout?: number;
264
+ /**
265
+ * Callback when transaction is replaced (speed-up or cancelled)
266
+ */
267
+ onReplaced?: (response: ReplacedTransactionResponse) => void;
268
+ }
269
+ /**
270
+ * Transaction type
271
+ */
272
+ type TransactionType = 'legacy' | 'eip2930' | 'eip1559' | 'eip4844' | 'eip7702' | (string & {});
273
+ /**
274
+ * Transaction receipt
275
+ */
276
+ interface TransactionReceipt {
277
+ blockHash: Hash;
278
+ blockNumber: bigint;
279
+ contractAddress: Address | null | undefined;
280
+ cumulativeGasUsed: bigint;
281
+ effectiveGasPrice: bigint;
282
+ from: Address;
283
+ gasUsed: bigint;
284
+ logs: LogEntry[];
285
+ logsBloom: Hex;
286
+ status: 'success' | 'reverted';
287
+ to: Address | null;
288
+ transactionHash: Hash;
289
+ transactionIndex: number;
290
+ type: TransactionType;
291
+ }
292
+ /**
293
+ * Response when a transaction is replaced (speed-up or cancelled)
294
+ */
295
+ interface ReplacedTransactionResponse {
296
+ reason: 'replaced' | 'repriced' | 'cancelled';
297
+ replacedTransaction: {
298
+ hash: Hash;
299
+ };
300
+ transaction: {
301
+ hash: Hash;
302
+ };
303
+ transactionReceipt: TransactionReceipt;
304
+ }
232
305
  /**
233
306
  * Public read client interface - the main API surface
234
307
  */
@@ -249,6 +322,16 @@ interface PublicReadClient {
249
322
  * Query historical event logs
250
323
  */
251
324
  getLogs(params: GetLogsParams): Promise<LogEntry[]>;
325
+ /**
326
+ * Get transaction receipt by hash
327
+ * Returns null if transaction is pending or not found
328
+ */
329
+ getTransactionReceipt(params: GetTransactionReceiptParams): Promise<TransactionReceipt | null>;
330
+ /**
331
+ * Wait for transaction to be mined and return receipt
332
+ * Throws TransactionReceiptTimeoutError if timeout exceeded
333
+ */
334
+ waitForTransactionReceipt(params: WaitForTransactionReceiptParams): Promise<TransactionReceipt>;
252
335
  /**
253
336
  * Clear all cached entries
254
337
  */
@@ -356,6 +439,14 @@ declare class ChainNotSupportedError extends ReadLayerError {
356
439
  readonly chainId: number;
357
440
  constructor(chainId: number);
358
441
  }
442
+ /**
443
+ * Transaction receipt not found within timeout period
444
+ */
445
+ declare class TransactionReceiptTimeoutError extends ReadLayerError {
446
+ readonly hash: string;
447
+ readonly timeout: number;
448
+ constructor(hash: string, timeout: number);
449
+ }
359
450
 
360
451
  /**
361
452
  * Blockchain Read Layer - Constants and Chain Configurations
@@ -466,4 +557,4 @@ declare function generateCacheKey(params: {
466
557
  from?: Address;
467
558
  }): string;
468
559
 
469
- export { type AbiEventDefinition, AllRpcsFailedError, BlockPrunedError, type BlockTag, type CacheConfig, type CacheStats, type ChainConfig, ChainNotSupportedError, type ContractCall, ContractNotFoundError, ContractRevertError, DEFAULT_CACHE_CONFIG, DEFAULT_CACHE_MAX_SIZE, DEFAULT_CACHE_TTL, DEFAULT_MULTICALL_BATCH_SIZE, type EventArgs, type GetLogsParams, InvalidAbiError, LRUCache, LUMIA_MAINNET, LUMIA_MAINNET_CHAIN_ID, LUMIA_TESTNET, LUMIA_TESTNET_CHAIN_ID, type LogEntry, MULTICALL3_ADDRESS, type MulticallFailure, type MulticallParams, type MulticallResult, type MulticallSuccess, type PublicReadClient, type PublicReadClientConfig, RateLimitedError, type ReadContractParams, ReadLayerError, RpcConnectionError, generateCacheKey, getChainConfig, getPublicClient, isChainSupported };
560
+ export { type AbiEventDefinition, AllRpcsFailedError, BlockPrunedError, type BlockTag, type CacheConfig, type CacheStats, type ChainConfig, ChainNotSupportedError, type ContractCall, ContractNotFoundError, ContractRevertError, DEFAULT_CACHE_CONFIG, DEFAULT_CACHE_MAX_SIZE, DEFAULT_CACHE_TTL, DEFAULT_MULTICALL_BATCH_SIZE, type EventArgs, type GetLogsParams, type GetTransactionReceiptParams, InvalidAbiError, LRUCache, LUMIA_MAINNET, LUMIA_MAINNET_CHAIN_ID, LUMIA_TESTNET, LUMIA_TESTNET_CHAIN_ID, type LogEntry, MULTICALL3_ADDRESS, type MulticallFailure, type MulticallParams, type MulticallResult, type MulticallSuccess, type PublicReadClient, type PublicReadClientConfig, RateLimitedError, type ReadContractParams, ReadLayerError, type ReplacedTransactionResponse, RpcConnectionError, type TransactionReceipt, TransactionReceiptTimeoutError, type TransactionType, type WaitForTransactionReceiptParams, generateCacheKey, getChainConfig, getPublicClient, isChainSupported };
@@ -286,6 +286,17 @@ var ChainNotSupportedError = class extends ReadLayerError {
286
286
  this.name = "ChainNotSupportedError";
287
287
  }
288
288
  };
289
+ var TransactionReceiptTimeoutError = class extends ReadLayerError {
290
+ constructor(hash, timeout) {
291
+ super(
292
+ `Transaction receipt not found within ${timeout}ms: ${hash}`,
293
+ "TRANSACTION_RECEIPT_TIMEOUT"
294
+ );
295
+ this.hash = hash;
296
+ this.timeout = timeout;
297
+ this.name = "TransactionReceiptTimeoutError";
298
+ }
299
+ };
289
300
 
290
301
  // src/read/public-client.ts
291
302
  var PublicReadClientImpl = class {
@@ -454,6 +465,77 @@ var PublicReadClientImpl = class {
454
465
  eventName: "eventName" in log ? log.eventName : void 0
455
466
  }));
456
467
  }
468
+ async getTransactionReceipt(params) {
469
+ const { hash } = params;
470
+ try {
471
+ const receipt = await this.viemClient.getTransactionReceipt({ hash });
472
+ return this.mapReceipt(receipt);
473
+ } catch (error) {
474
+ if (error instanceof Error && (error.message.includes("could not be found") || error.message.includes("not found"))) {
475
+ return null;
476
+ }
477
+ throw error;
478
+ }
479
+ }
480
+ async waitForTransactionReceipt(params) {
481
+ const {
482
+ hash,
483
+ confirmations = 1,
484
+ pollingInterval = 4e3,
485
+ timeout = 6e4,
486
+ onReplaced
487
+ } = params;
488
+ try {
489
+ const receipt = await this.viemClient.waitForTransactionReceipt({
490
+ hash,
491
+ confirmations,
492
+ pollingInterval,
493
+ timeout,
494
+ onReplaced: onReplaced ? (response) => {
495
+ onReplaced({
496
+ reason: response.reason,
497
+ replacedTransaction: { hash: response.replacedTransaction.hash },
498
+ transaction: { hash: response.transaction.hash },
499
+ transactionReceipt: this.mapReceipt(response.transactionReceipt)
500
+ });
501
+ } : void 0
502
+ });
503
+ return this.mapReceipt(receipt);
504
+ } catch (error) {
505
+ if (error instanceof Error && error.message.includes("timed out")) {
506
+ throw new TransactionReceiptTimeoutError(hash, timeout);
507
+ }
508
+ throw error;
509
+ }
510
+ }
511
+ mapReceipt(receipt) {
512
+ return {
513
+ blockHash: receipt.blockHash,
514
+ blockNumber: receipt.blockNumber,
515
+ contractAddress: receipt.contractAddress,
516
+ cumulativeGasUsed: receipt.cumulativeGasUsed,
517
+ effectiveGasPrice: receipt.effectiveGasPrice,
518
+ from: receipt.from,
519
+ gasUsed: receipt.gasUsed,
520
+ logs: receipt.logs.map((log) => ({
521
+ address: log.address,
522
+ topics: log.topics,
523
+ data: log.data,
524
+ blockNumber: log.blockNumber,
525
+ blockHash: log.blockHash,
526
+ transactionHash: log.transactionHash,
527
+ transactionIndex: log.transactionIndex,
528
+ logIndex: log.logIndex,
529
+ removed: log.removed
530
+ })),
531
+ logsBloom: receipt.logsBloom,
532
+ status: receipt.status,
533
+ to: receipt.to,
534
+ transactionHash: receipt.transactionHash,
535
+ transactionIndex: receipt.transactionIndex,
536
+ type: receipt.type
537
+ };
538
+ }
457
539
  clearCache() {
458
540
  this.cache?.clear();
459
541
  }
@@ -513,6 +595,6 @@ function normalizeBlockTag(blockTag) {
513
595
  return blockTag;
514
596
  }
515
597
 
516
- export { AllRpcsFailedError, BlockPrunedError, ChainNotSupportedError, ContractNotFoundError, ContractRevertError, DEFAULT_CACHE_CONFIG, DEFAULT_CACHE_MAX_SIZE, DEFAULT_CACHE_TTL, DEFAULT_MULTICALL_BATCH_SIZE, InvalidAbiError, LRUCache, LUMIA_MAINNET, LUMIA_MAINNET_CHAIN_ID, LUMIA_TESTNET, LUMIA_TESTNET_CHAIN_ID, MULTICALL3_ADDRESS, RateLimitedError, ReadLayerError, RpcConnectionError, generateCacheKey, getChainConfig, getPublicClient, isChainSupported };
598
+ export { AllRpcsFailedError, BlockPrunedError, ChainNotSupportedError, ContractNotFoundError, ContractRevertError, DEFAULT_CACHE_CONFIG, DEFAULT_CACHE_MAX_SIZE, DEFAULT_CACHE_TTL, DEFAULT_MULTICALL_BATCH_SIZE, InvalidAbiError, LRUCache, LUMIA_MAINNET, LUMIA_MAINNET_CHAIN_ID, LUMIA_TESTNET, LUMIA_TESTNET_CHAIN_ID, MULTICALL3_ADDRESS, RateLimitedError, ReadLayerError, RpcConnectionError, TransactionReceiptTimeoutError, generateCacheKey, getChainConfig, getPublicClient, isChainSupported };
517
599
  //# sourceMappingURL=index.js.map
518
600
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/read/cache.ts","../../src/read/rpc-fallback.ts","../../src/read/constants.ts","../../src/read/errors.ts","../../src/read/public-client.ts"],"names":["createPublicClient","http"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * LRU Cache implementation for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport type { CacheConfig, CacheStats, BlockTag } from './types';\nimport type { Address } from 'viem';\n\n/**\n * Internal cache entry structure\n */\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n}\n\n/**\n * Default cache configuration\n */\nexport const DEFAULT_CACHE_CONFIG: CacheConfig = {\n maxSize: 1000,\n ttl: 12000, // 12 seconds (~1 block)\n};\n\n/**\n * LRU Cache with TTL support for blockchain read operations\n */\nexport class LRUCache<T = unknown> {\n private cache: Map<string, CacheEntry<T>>;\n private readonly maxSize: number;\n private readonly ttl: number;\n private hits = 0;\n private misses = 0;\n\n constructor(config: Partial<CacheConfig> = {}) {\n this.maxSize = config.maxSize ?? DEFAULT_CACHE_CONFIG.maxSize;\n this.ttl = config.ttl ?? DEFAULT_CACHE_CONFIG.ttl;\n this.cache = new Map();\n }\n\n /**\n * Get a value from cache\n * Returns undefined if not found or expired\n */\n get(key: string): T | undefined {\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.misses++;\n return undefined;\n }\n\n // Check if expired\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n this.misses++;\n return undefined;\n }\n\n // Move to end (most recently used) by deleting and re-adding\n this.cache.delete(key);\n this.cache.set(key, entry);\n this.hits++;\n\n return entry.value;\n }\n\n /**\n * Set a value in cache with optional custom TTL\n */\n set(key: string, value: T, customTtl?: number): void {\n // If key exists, delete it first to update position\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // Evict oldest entries if at capacity\n while (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n }\n }\n\n const ttlToUse = customTtl ?? this.ttl;\n this.cache.set(key, {\n value,\n expiresAt: Date.now() + ttlToUse,\n });\n }\n\n /**\n * Check if key exists and is not expired\n */\n has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Delete a specific key\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.cache.clear();\n this.hits = 0;\n this.misses = 0;\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n // Clean expired entries before reporting\n this.cleanExpired();\n\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hits: this.hits,\n misses: this.misses,\n };\n }\n\n /**\n * Remove expired entries\n */\n private cleanExpired(): void {\n const now = Date.now();\n for (const [key, entry] of this.cache.entries()) {\n if (now > entry.expiresAt) {\n this.cache.delete(key);\n }\n }\n }\n}\n\n/**\n * Generate a deterministic cache key for contract reads\n */\nexport function generateCacheKey(params: {\n chainId: number;\n address: Address;\n functionName: string;\n args: readonly unknown[];\n blockTag: BlockTag;\n from?: Address;\n}): string {\n const keyParts = {\n c: params.chainId,\n a: params.address.toLowerCase(),\n f: params.functionName,\n r: params.args,\n b: serializeBlockTag(params.blockTag),\n s: params.from?.toLowerCase(),\n };\n\n return JSON.stringify(keyParts);\n}\n\n/**\n * Serialize block tag for cache key\n */\nfunction serializeBlockTag(blockTag: BlockTag): string {\n if (typeof blockTag === 'bigint') {\n return `n:${blockTag.toString()}`;\n }\n return blockTag;\n}\n","/**\n * RPC Fallback Transport for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport {\n createPublicClient,\n fallback,\n http,\n type Chain,\n type PublicClient,\n} from 'viem';\n\n/**\n * Configuration for fallback transport\n */\nexport interface FallbackTransportConfig {\n /**\n * RPC URLs in priority order\n */\n urls: string[];\n\n /**\n * Number of retries per endpoint before failover\n * @default 1\n */\n retriesPerEndpoint?: number;\n\n /**\n * Request timeout in ms\n * @default 10000\n */\n timeout?: number;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG = {\n retriesPerEndpoint: 1,\n timeout: 10000,\n};\n\n/**\n * Create a viem public client with fallback RPC support\n */\nexport function createFallbackClient(\n chain: Chain,\n config: FallbackTransportConfig,\n): PublicClient {\n const {\n urls,\n retriesPerEndpoint = DEFAULT_CONFIG.retriesPerEndpoint,\n timeout = DEFAULT_CONFIG.timeout,\n } = config;\n\n if (urls.length === 0) {\n throw new Error('At least one RPC URL is required');\n }\n\n // For single URL, use simple http transport\n if (urls.length === 1) {\n return createPublicClient({\n chain,\n transport: http(urls[0], { timeout }),\n }) as PublicClient;\n }\n\n // For multiple URLs, use viem's built-in fallback transport\n const transports = urls.map((url) =>\n http(url, {\n timeout,\n retryCount: retriesPerEndpoint,\n retryDelay: 150,\n }),\n );\n\n return createPublicClient({\n chain,\n transport: fallback(transports, {\n rank: true, // Automatically rank transports by latency\n retryCount: 1,\n }),\n }) as PublicClient;\n}\n\n/**\n * Check if an error is recoverable (worth retrying)\n */\nexport function isRecoverableError(error: Error): boolean {\n const message = error.message.toLowerCase();\n\n // Network errors are recoverable\n if (\n message.includes('network') ||\n message.includes('timeout') ||\n message.includes('econnrefused') ||\n message.includes('econnreset') ||\n message.includes('socket')\n ) {\n return true;\n }\n\n // Server errors are recoverable\n if (\n message.includes('500') ||\n message.includes('502') ||\n message.includes('503') ||\n message.includes('504')\n ) {\n return true;\n }\n\n // Rate limits are recoverable with backoff\n if (isRateLimitError(error)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if error is a rate limit error\n */\nfunction isRateLimitError(error: Error): boolean {\n const message = error.message.toLowerCase();\n return (\n message.includes('rate limit') ||\n message.includes('too many requests') ||\n message.includes('429') ||\n message.includes('throttle')\n );\n}\n","/**\n * Blockchain Read Layer - Constants and Chain Configurations\n * @module @lumiapassport/core/read\n */\n\nimport type { Address } from 'viem';\nimport type { ChainConfig } from './types';\n\n/**\n * Well-known Multicall3 contract address\n * Deployed at the same address on most EVM chains\n */\nexport const MULTICALL3_ADDRESS: Address = '0xcA11bde05977b3631167028862bE2a173976CA11';\n\n/**\n * Lumia Mainnet chain ID\n */\nexport const LUMIA_MAINNET_CHAIN_ID = 994873017;\n\n/**\n * Lumia Testnet chain ID\n */\nexport const LUMIA_TESTNET_CHAIN_ID = 1952959480;\n\n/**\n * Lumia Mainnet configuration\n */\nexport const LUMIA_MAINNET: ChainConfig = {\n id: LUMIA_MAINNET_CHAIN_ID,\n name: 'Lumia',\n rpcUrls: ['https://rpc.lumia.org'],\n multicall3: MULTICALL3_ADDRESS,\n blockTime: 2, // ~2 seconds per block\n};\n\n/**\n * Lumia Testnet configuration\n */\nexport const LUMIA_TESTNET: ChainConfig = {\n id: LUMIA_TESTNET_CHAIN_ID,\n name: 'Lumia Testnet',\n rpcUrls: ['https://testnet-rpc.lumia.org'],\n multicall3: MULTICALL3_ADDRESS,\n blockTime: 2,\n};\n\n/**\n * All supported chains with built-in configurations\n */\nexport const SUPPORTED_CHAINS: Map<number, ChainConfig> = new Map([\n [LUMIA_MAINNET_CHAIN_ID, LUMIA_MAINNET],\n [LUMIA_TESTNET_CHAIN_ID, LUMIA_TESTNET],\n]);\n\n/**\n * Get chain configuration by chain ID\n * Returns undefined for unsupported chains\n */\nexport function getChainConfig(chainId: number): ChainConfig | undefined {\n return SUPPORTED_CHAINS.get(chainId);\n}\n\n/**\n * Check if a chain is supported with built-in configuration\n */\nexport function isChainSupported(chainId: number): boolean {\n return SUPPORTED_CHAINS.has(chainId);\n}\n\n/**\n * Default cache TTL in milliseconds (12 seconds, ~1 block)\n */\nexport const DEFAULT_CACHE_TTL = 12000;\n\n/**\n * Default maximum cache entries\n */\nexport const DEFAULT_CACHE_MAX_SIZE = 1000;\n\n/**\n * Default maximum calls per multicall batch\n */\nexport const DEFAULT_MULTICALL_BATCH_SIZE = 100;\n\n/**\n * Default block range for getLogs queries (to avoid RPC limits)\n */\nexport const DEFAULT_LOGS_BLOCK_RANGE = 2000n;\n\n/**\n * Maximum block range for a single getLogs query\n */\nexport const MAX_LOGS_BLOCK_RANGE = 10000n;\n","/**\n * Blockchain Read Layer - Error Classes\n * @module @lumiapassport/core/read\n */\n\nimport type { Address } from 'viem';\n\n/**\n * Base error class for read layer errors\n */\nexport class ReadLayerError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n ) {\n super(message);\n this.name = 'ReadLayerError';\n }\n}\n\n/**\n * Contract does not exist at the specified address\n */\nexport class ContractNotFoundError extends ReadLayerError {\n constructor(\n public readonly address: Address,\n public readonly chainId: number,\n ) {\n super(\n `Contract not found at ${address} on chain ${chainId}`,\n 'CONTRACT_NOT_FOUND',\n );\n this.name = 'ContractNotFoundError';\n }\n}\n\n/**\n * Contract call reverted with a reason\n */\nexport class ContractRevertError extends ReadLayerError {\n constructor(\n public readonly address: Address,\n public readonly functionName: string,\n public readonly reason: string,\n ) {\n super(\n `Contract call to ${functionName} at ${address} reverted: ${reason}`,\n 'CONTRACT_REVERTED',\n );\n this.name = 'ContractRevertError';\n }\n}\n\n/**\n * Failed to connect to RPC endpoint\n */\nexport class RpcConnectionError extends ReadLayerError {\n constructor(\n public readonly url: string,\n public readonly cause?: Error,\n ) {\n super(`Failed to connect to RPC: ${url}`, 'RPC_CONNECTION_FAILED');\n this.name = 'RpcConnectionError';\n }\n}\n\n/**\n * All configured RPC endpoints failed\n */\nexport class AllRpcsFailedError extends ReadLayerError {\n constructor(\n public readonly urls: string[],\n public readonly errors: Error[],\n ) {\n super(\n `All ${urls.length} RPC endpoint(s) failed`,\n 'ALL_RPCS_FAILED',\n );\n this.name = 'AllRpcsFailedError';\n }\n}\n\n/**\n * RPC returned rate limit response\n */\nexport class RateLimitedError extends ReadLayerError {\n constructor(\n public readonly url: string,\n public readonly retryAfter?: number,\n ) {\n super(\n `Rate limited by RPC: ${url}${retryAfter ? `, retry after ${retryAfter}s` : ''}`,\n 'RATE_LIMITED',\n );\n this.name = 'RateLimitedError';\n }\n}\n\n/**\n * Requested block has been pruned from RPC node\n */\nexport class BlockPrunedError extends ReadLayerError {\n constructor(public readonly blockNumber: bigint) {\n super(\n `Block ${blockNumber} has been pruned and is not available`,\n 'BLOCK_PRUNED',\n );\n this.name = 'BlockPrunedError';\n }\n}\n\n/**\n * Invalid ABI provided - function not found\n */\nexport class InvalidAbiError extends ReadLayerError {\n constructor(\n public readonly functionName: string,\n public readonly address: Address,\n ) {\n super(\n `Function '${functionName}' not found in ABI for contract at ${address}`,\n 'INVALID_ABI',\n );\n this.name = 'InvalidAbiError';\n }\n}\n\n/**\n * Chain configuration not found\n */\nexport class ChainNotSupportedError extends ReadLayerError {\n constructor(public readonly chainId: number) {\n super(\n `Chain ${chainId} is not supported. Please provide an RPC URL.`,\n 'CHAIN_NOT_SUPPORTED',\n );\n this.name = 'ChainNotSupportedError';\n }\n}\n","/**\n * Public Client Factory for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport {\n createPublicClient,\n http,\n type Chain,\n type PublicClient as ViemPublicClient,\n type BlockTag as ViemBlockTag,\n} from 'viem';\nimport { LRUCache, generateCacheKey } from './cache';\nimport { createFallbackClient } from './rpc-fallback';\nimport {\n getChainConfig,\n DEFAULT_CACHE_TTL,\n DEFAULT_CACHE_MAX_SIZE,\n MULTICALL3_ADDRESS,\n} from './constants';\nimport { ChainNotSupportedError } from './errors';\nimport type {\n PublicReadClientConfig,\n PublicReadClient,\n ReadContractParams,\n MulticallParams,\n MulticallResult,\n GetLogsParams,\n LogEntry,\n CacheStats,\n ContractCall,\n BlockTag,\n} from './types';\nimport type { Abi, Address } from 'viem';\n\n/**\n * Internal client implementation\n */\nclass PublicReadClientImpl implements PublicReadClient {\n readonly chainId: number;\n private readonly viemClient: ViemPublicClient;\n private readonly cache: LRUCache | null;\n private readonly multicall3Address: Address | null;\n\n constructor(\n chainId: number,\n viemClient: ViemPublicClient,\n cache: LRUCache | null,\n multicall3Address: Address | null,\n ) {\n this.chainId = chainId;\n this.viemClient = viemClient;\n this.cache = cache;\n this.multicall3Address = multicall3Address;\n }\n\n async readContract<TAbi extends Abi, TFunctionName extends string>(\n params: ReadContractParams<TAbi, TFunctionName>,\n ): Promise<unknown> {\n const {\n address,\n abi,\n functionName,\n args = [],\n blockTag = 'latest',\n from,\n forceRefresh = false,\n } = params;\n\n // Check cache first (unless forceRefresh)\n if (this.cache && !forceRefresh) {\n const cacheKey = generateCacheKey({\n chainId: this.chainId,\n address,\n functionName,\n args,\n blockTag,\n from,\n });\n\n const cached = this.cache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n }\n\n // Make the RPC call\n const result = await this.viemClient.readContract({\n address,\n abi,\n functionName,\n args: args as unknown[],\n blockTag: normalizeBlockTag(blockTag),\n account: from,\n } as Parameters<typeof this.viemClient.readContract>[0]);\n\n // Store in cache\n if (this.cache) {\n const cacheKey = generateCacheKey({\n chainId: this.chainId,\n address,\n functionName,\n args,\n blockTag,\n from,\n });\n this.cache.set(cacheKey, result);\n }\n\n return result;\n }\n\n async multicall<TContracts extends readonly ContractCall[]>(\n params: MulticallParams<TContracts>,\n ): Promise<MulticallResult[]> {\n const {\n contracts,\n allowFailure = true,\n blockTag = 'latest',\n batchSize = 100,\n } = params;\n\n // If no multicall3 or only one contract, use sequential calls\n if (!this.multicall3Address || contracts.length === 1) {\n return this.sequentialMulticall(contracts, allowFailure, blockTag);\n }\n\n // Chunk large batches\n const results: MulticallResult[] = [];\n for (let i = 0; i < contracts.length; i += batchSize) {\n const chunk = contracts.slice(i, i + batchSize);\n const chunkResults = await this.executeMulticallBatch(\n chunk,\n allowFailure,\n blockTag,\n );\n results.push(...chunkResults);\n }\n\n return results;\n }\n\n private async executeMulticallBatch(\n contracts: readonly ContractCall[],\n allowFailure: boolean,\n blockTag: BlockTag,\n ): Promise<MulticallResult[]> {\n try {\n const results = await this.viemClient.multicall({\n contracts: contracts.map((c) => ({\n address: c.address,\n abi: c.abi,\n functionName: c.functionName,\n args: c.args as unknown[],\n })),\n allowFailure,\n blockTag: blockTag as ViemBlockTag,\n multicallAddress: this.multicall3Address!,\n });\n\n // Cast results to known shape - viem returns either success or failure objects\n const typedResults = results as Array<\n { status: 'success'; result: unknown } | { status: 'failure'; error: Error }\n >;\n\n return typedResults.map((r) => {\n if (r.status === 'success') {\n return { status: 'success' as const, result: r.result };\n } else {\n return { status: 'failure' as const, error: r.error };\n }\n });\n } catch (error) {\n // If multicall fails entirely, fall back to sequential\n return this.sequentialMulticall(contracts, allowFailure, blockTag);\n }\n }\n\n private async sequentialMulticall(\n contracts: readonly ContractCall[],\n allowFailure: boolean,\n blockTag: BlockTag,\n ): Promise<MulticallResult[]> {\n const results: MulticallResult[] = [];\n\n for (const contract of contracts) {\n try {\n const result = await this.readContract({\n address: contract.address,\n abi: contract.abi,\n functionName: contract.functionName,\n args: contract.args,\n blockTag,\n });\n results.push({ status: 'success', result });\n } catch (error) {\n if (allowFailure) {\n results.push({\n status: 'failure',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n } else {\n throw error;\n }\n }\n }\n\n return results;\n }\n\n async getLogs(params: GetLogsParams): Promise<LogEntry[]> {\n const { address, event, args, fromBlock, toBlock, blockHash } = params;\n\n // Build parameters conditionally based on what's provided\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const logsParams: any = {};\n\n if (address !== undefined) {\n logsParams.address = address;\n }\n\n if (event !== undefined) {\n logsParams.event = event;\n }\n\n if (args !== undefined) {\n logsParams.args = args;\n }\n\n if (blockHash !== undefined) {\n logsParams.blockHash = blockHash;\n } else {\n if (fromBlock !== undefined) {\n logsParams.fromBlock = normalizeBlockTag(fromBlock);\n }\n if (toBlock !== undefined) {\n logsParams.toBlock = normalizeBlockTag(toBlock);\n }\n }\n\n const logs = await this.viemClient.getLogs(logsParams);\n\n return logs.map((log) => ({\n address: log.address,\n topics: log.topics as [Address, ...Address[]] | [],\n data: log.data,\n blockNumber: log.blockNumber,\n blockHash: log.blockHash,\n transactionHash: log.transactionHash,\n transactionIndex: log.transactionIndex,\n logIndex: log.logIndex,\n removed: log.removed,\n // These properties only exist when an event ABI is provided\n args: 'args' in log ? (log.args as Record<string, unknown>) : undefined,\n eventName: 'eventName' in log ? (log.eventName as string) : undefined,\n }));\n }\n\n clearCache(): void {\n this.cache?.clear();\n }\n\n getCacheStats(): CacheStats {\n if (!this.cache) {\n return { size: 0, maxSize: 0, hits: 0, misses: 0 };\n }\n return this.cache.getStats();\n }\n}\n\n/**\n * Create a public read client for blockchain queries\n *\n * @example\n * ```typescript\n * // Using Lumia mainnet defaults\n * const client = getPublicClient({ chainId: 994873017 });\n *\n * // Using custom RPC with fallbacks\n * const client = getPublicClient({\n * chainId: 1,\n * rpcUrls: ['https://primary.rpc', 'https://fallback.rpc'],\n * });\n * ```\n */\nexport function getPublicClient(config: PublicReadClientConfig): PublicReadClient {\n const {\n chainId,\n rpcUrls,\n multicall3Address,\n cacheTtl = DEFAULT_CACHE_TTL,\n cacheMaxSize = DEFAULT_CACHE_MAX_SIZE,\n disableCache = false,\n } = config;\n\n // Get RPC URLs\n const urls = resolveRpcUrls(chainId, rpcUrls);\n\n // Create chain object for viem\n const chainConfig = getChainConfig(chainId);\n const chain: Chain = {\n id: chainId,\n name: chainConfig?.name ?? `Chain ${chainId}`,\n nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: urls },\n },\n };\n\n // Create viem client with fallback support\n let viemClient: ViemPublicClient;\n if (urls.length === 1) {\n viemClient = createPublicClient({\n chain,\n transport: http(urls[0]),\n });\n } else {\n viemClient = createFallbackClient(chain, { urls });\n }\n\n // Create cache if enabled\n const cache = disableCache\n ? null\n : new LRUCache({ maxSize: cacheMaxSize, ttl: cacheTtl });\n\n // Determine multicall3 address\n const resolvedMulticall3 =\n multicall3Address ?? chainConfig?.multicall3 ?? MULTICALL3_ADDRESS;\n\n return new PublicReadClientImpl(chainId, viemClient, cache, resolvedMulticall3);\n}\n\n/**\n * Resolve RPC URLs from config or chain defaults\n */\nfunction resolveRpcUrls(\n chainId: number,\n rpcUrls?: string | string[],\n): string[] {\n // If URLs provided, use them\n if (rpcUrls) {\n return Array.isArray(rpcUrls) ? rpcUrls : [rpcUrls];\n }\n\n // Try to get from chain config\n const chainConfig = getChainConfig(chainId);\n if (chainConfig) {\n return chainConfig.rpcUrls;\n }\n\n // Chain not supported and no URLs provided\n throw new ChainNotSupportedError(chainId);\n}\n\n/**\n * Normalize block tag for viem\n */\nfunction normalizeBlockTag(\n blockTag: BlockTag | bigint,\n): 'latest' | 'pending' | 'safe' | 'finalized' | 'earliest' | bigint {\n if (typeof blockTag === 'bigint') {\n return blockTag;\n }\n return blockTag;\n}\n"]}
1
+ {"version":3,"sources":["../../src/read/cache.ts","../../src/read/rpc-fallback.ts","../../src/read/constants.ts","../../src/read/errors.ts","../../src/read/public-client.ts"],"names":["createPublicClient","http"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * LRU Cache implementation for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport type { CacheConfig, CacheStats, BlockTag } from './types';\nimport type { Address } from 'viem';\n\n/**\n * Internal cache entry structure\n */\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n}\n\n/**\n * Default cache configuration\n */\nexport const DEFAULT_CACHE_CONFIG: CacheConfig = {\n maxSize: 1000,\n ttl: 12000, // 12 seconds (~1 block)\n};\n\n/**\n * LRU Cache with TTL support for blockchain read operations\n */\nexport class LRUCache<T = unknown> {\n private cache: Map<string, CacheEntry<T>>;\n private readonly maxSize: number;\n private readonly ttl: number;\n private hits = 0;\n private misses = 0;\n\n constructor(config: Partial<CacheConfig> = {}) {\n this.maxSize = config.maxSize ?? DEFAULT_CACHE_CONFIG.maxSize;\n this.ttl = config.ttl ?? DEFAULT_CACHE_CONFIG.ttl;\n this.cache = new Map();\n }\n\n /**\n * Get a value from cache\n * Returns undefined if not found or expired\n */\n get(key: string): T | undefined {\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.misses++;\n return undefined;\n }\n\n // Check if expired\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n this.misses++;\n return undefined;\n }\n\n // Move to end (most recently used) by deleting and re-adding\n this.cache.delete(key);\n this.cache.set(key, entry);\n this.hits++;\n\n return entry.value;\n }\n\n /**\n * Set a value in cache with optional custom TTL\n */\n set(key: string, value: T, customTtl?: number): void {\n // If key exists, delete it first to update position\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // Evict oldest entries if at capacity\n while (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n }\n }\n\n const ttlToUse = customTtl ?? this.ttl;\n this.cache.set(key, {\n value,\n expiresAt: Date.now() + ttlToUse,\n });\n }\n\n /**\n * Check if key exists and is not expired\n */\n has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Delete a specific key\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.cache.clear();\n this.hits = 0;\n this.misses = 0;\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n // Clean expired entries before reporting\n this.cleanExpired();\n\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hits: this.hits,\n misses: this.misses,\n };\n }\n\n /**\n * Remove expired entries\n */\n private cleanExpired(): void {\n const now = Date.now();\n for (const [key, entry] of this.cache.entries()) {\n if (now > entry.expiresAt) {\n this.cache.delete(key);\n }\n }\n }\n}\n\n/**\n * Generate a deterministic cache key for contract reads\n */\nexport function generateCacheKey(params: {\n chainId: number;\n address: Address;\n functionName: string;\n args: readonly unknown[];\n blockTag: BlockTag;\n from?: Address;\n}): string {\n const keyParts = {\n c: params.chainId,\n a: params.address.toLowerCase(),\n f: params.functionName,\n r: params.args,\n b: serializeBlockTag(params.blockTag),\n s: params.from?.toLowerCase(),\n };\n\n return JSON.stringify(keyParts);\n}\n\n/**\n * Serialize block tag for cache key\n */\nfunction serializeBlockTag(blockTag: BlockTag): string {\n if (typeof blockTag === 'bigint') {\n return `n:${blockTag.toString()}`;\n }\n return blockTag;\n}\n","/**\n * RPC Fallback Transport for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport {\n createPublicClient,\n fallback,\n http,\n type Chain,\n type PublicClient,\n} from 'viem';\n\n/**\n * Configuration for fallback transport\n */\nexport interface FallbackTransportConfig {\n /**\n * RPC URLs in priority order\n */\n urls: string[];\n\n /**\n * Number of retries per endpoint before failover\n * @default 1\n */\n retriesPerEndpoint?: number;\n\n /**\n * Request timeout in ms\n * @default 10000\n */\n timeout?: number;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG = {\n retriesPerEndpoint: 1,\n timeout: 10000,\n};\n\n/**\n * Create a viem public client with fallback RPC support\n */\nexport function createFallbackClient(\n chain: Chain,\n config: FallbackTransportConfig,\n): PublicClient {\n const {\n urls,\n retriesPerEndpoint = DEFAULT_CONFIG.retriesPerEndpoint,\n timeout = DEFAULT_CONFIG.timeout,\n } = config;\n\n if (urls.length === 0) {\n throw new Error('At least one RPC URL is required');\n }\n\n // For single URL, use simple http transport\n if (urls.length === 1) {\n return createPublicClient({\n chain,\n transport: http(urls[0], { timeout }),\n }) as PublicClient;\n }\n\n // For multiple URLs, use viem's built-in fallback transport\n const transports = urls.map((url) =>\n http(url, {\n timeout,\n retryCount: retriesPerEndpoint,\n retryDelay: 150,\n }),\n );\n\n return createPublicClient({\n chain,\n transport: fallback(transports, {\n rank: true, // Automatically rank transports by latency\n retryCount: 1,\n }),\n }) as PublicClient;\n}\n\n/**\n * Check if an error is recoverable (worth retrying)\n */\nexport function isRecoverableError(error: Error): boolean {\n const message = error.message.toLowerCase();\n\n // Network errors are recoverable\n if (\n message.includes('network') ||\n message.includes('timeout') ||\n message.includes('econnrefused') ||\n message.includes('econnreset') ||\n message.includes('socket')\n ) {\n return true;\n }\n\n // Server errors are recoverable\n if (\n message.includes('500') ||\n message.includes('502') ||\n message.includes('503') ||\n message.includes('504')\n ) {\n return true;\n }\n\n // Rate limits are recoverable with backoff\n if (isRateLimitError(error)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if error is a rate limit error\n */\nfunction isRateLimitError(error: Error): boolean {\n const message = error.message.toLowerCase();\n return (\n message.includes('rate limit') ||\n message.includes('too many requests') ||\n message.includes('429') ||\n message.includes('throttle')\n );\n}\n","/**\n * Blockchain Read Layer - Constants and Chain Configurations\n * @module @lumiapassport/core/read\n */\n\nimport type { Address } from 'viem';\nimport type { ChainConfig } from './types';\n\n/**\n * Well-known Multicall3 contract address\n * Deployed at the same address on most EVM chains\n */\nexport const MULTICALL3_ADDRESS: Address = '0xcA11bde05977b3631167028862bE2a173976CA11';\n\n/**\n * Lumia Mainnet chain ID\n */\nexport const LUMIA_MAINNET_CHAIN_ID = 994873017;\n\n/**\n * Lumia Testnet chain ID\n */\nexport const LUMIA_TESTNET_CHAIN_ID = 1952959480;\n\n/**\n * Lumia Mainnet configuration\n */\nexport const LUMIA_MAINNET: ChainConfig = {\n id: LUMIA_MAINNET_CHAIN_ID,\n name: 'Lumia',\n rpcUrls: ['https://rpc.lumia.org'],\n multicall3: MULTICALL3_ADDRESS,\n blockTime: 2, // ~2 seconds per block\n};\n\n/**\n * Lumia Testnet configuration\n */\nexport const LUMIA_TESTNET: ChainConfig = {\n id: LUMIA_TESTNET_CHAIN_ID,\n name: 'Lumia Testnet',\n rpcUrls: ['https://testnet-rpc.lumia.org'],\n multicall3: MULTICALL3_ADDRESS,\n blockTime: 2,\n};\n\n/**\n * All supported chains with built-in configurations\n */\nexport const SUPPORTED_CHAINS: Map<number, ChainConfig> = new Map([\n [LUMIA_MAINNET_CHAIN_ID, LUMIA_MAINNET],\n [LUMIA_TESTNET_CHAIN_ID, LUMIA_TESTNET],\n]);\n\n/**\n * Get chain configuration by chain ID\n * Returns undefined for unsupported chains\n */\nexport function getChainConfig(chainId: number): ChainConfig | undefined {\n return SUPPORTED_CHAINS.get(chainId);\n}\n\n/**\n * Check if a chain is supported with built-in configuration\n */\nexport function isChainSupported(chainId: number): boolean {\n return SUPPORTED_CHAINS.has(chainId);\n}\n\n/**\n * Default cache TTL in milliseconds (12 seconds, ~1 block)\n */\nexport const DEFAULT_CACHE_TTL = 12000;\n\n/**\n * Default maximum cache entries\n */\nexport const DEFAULT_CACHE_MAX_SIZE = 1000;\n\n/**\n * Default maximum calls per multicall batch\n */\nexport const DEFAULT_MULTICALL_BATCH_SIZE = 100;\n\n/**\n * Default block range for getLogs queries (to avoid RPC limits)\n */\nexport const DEFAULT_LOGS_BLOCK_RANGE = 2000n;\n\n/**\n * Maximum block range for a single getLogs query\n */\nexport const MAX_LOGS_BLOCK_RANGE = 10000n;\n","/**\n * Blockchain Read Layer - Error Classes\n * @module @lumiapassport/core/read\n */\n\nimport type { Address } from 'viem';\n\n/**\n * Base error class for read layer errors\n */\nexport class ReadLayerError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n ) {\n super(message);\n this.name = 'ReadLayerError';\n }\n}\n\n/**\n * Contract does not exist at the specified address\n */\nexport class ContractNotFoundError extends ReadLayerError {\n constructor(\n public readonly address: Address,\n public readonly chainId: number,\n ) {\n super(\n `Contract not found at ${address} on chain ${chainId}`,\n 'CONTRACT_NOT_FOUND',\n );\n this.name = 'ContractNotFoundError';\n }\n}\n\n/**\n * Contract call reverted with a reason\n */\nexport class ContractRevertError extends ReadLayerError {\n constructor(\n public readonly address: Address,\n public readonly functionName: string,\n public readonly reason: string,\n ) {\n super(\n `Contract call to ${functionName} at ${address} reverted: ${reason}`,\n 'CONTRACT_REVERTED',\n );\n this.name = 'ContractRevertError';\n }\n}\n\n/**\n * Failed to connect to RPC endpoint\n */\nexport class RpcConnectionError extends ReadLayerError {\n constructor(\n public readonly url: string,\n public readonly cause?: Error,\n ) {\n super(`Failed to connect to RPC: ${url}`, 'RPC_CONNECTION_FAILED');\n this.name = 'RpcConnectionError';\n }\n}\n\n/**\n * All configured RPC endpoints failed\n */\nexport class AllRpcsFailedError extends ReadLayerError {\n constructor(\n public readonly urls: string[],\n public readonly errors: Error[],\n ) {\n super(\n `All ${urls.length} RPC endpoint(s) failed`,\n 'ALL_RPCS_FAILED',\n );\n this.name = 'AllRpcsFailedError';\n }\n}\n\n/**\n * RPC returned rate limit response\n */\nexport class RateLimitedError extends ReadLayerError {\n constructor(\n public readonly url: string,\n public readonly retryAfter?: number,\n ) {\n super(\n `Rate limited by RPC: ${url}${retryAfter ? `, retry after ${retryAfter}s` : ''}`,\n 'RATE_LIMITED',\n );\n this.name = 'RateLimitedError';\n }\n}\n\n/**\n * Requested block has been pruned from RPC node\n */\nexport class BlockPrunedError extends ReadLayerError {\n constructor(public readonly blockNumber: bigint) {\n super(\n `Block ${blockNumber} has been pruned and is not available`,\n 'BLOCK_PRUNED',\n );\n this.name = 'BlockPrunedError';\n }\n}\n\n/**\n * Invalid ABI provided - function not found\n */\nexport class InvalidAbiError extends ReadLayerError {\n constructor(\n public readonly functionName: string,\n public readonly address: Address,\n ) {\n super(\n `Function '${functionName}' not found in ABI for contract at ${address}`,\n 'INVALID_ABI',\n );\n this.name = 'InvalidAbiError';\n }\n}\n\n/**\n * Chain configuration not found\n */\nexport class ChainNotSupportedError extends ReadLayerError {\n constructor(public readonly chainId: number) {\n super(\n `Chain ${chainId} is not supported. Please provide an RPC URL.`,\n 'CHAIN_NOT_SUPPORTED',\n );\n this.name = 'ChainNotSupportedError';\n }\n}\n\n/**\n * Transaction receipt not found within timeout period\n */\nexport class TransactionReceiptTimeoutError extends ReadLayerError {\n constructor(\n public readonly hash: string,\n public readonly timeout: number,\n ) {\n super(\n `Transaction receipt not found within ${timeout}ms: ${hash}`,\n 'TRANSACTION_RECEIPT_TIMEOUT',\n );\n this.name = 'TransactionReceiptTimeoutError';\n }\n}\n","/**\n * Public Client Factory for blockchain read operations\n * @module @lumiapassport/core/read\n */\n\nimport {\n createPublicClient,\n http,\n type Chain,\n type PublicClient as ViemPublicClient,\n type BlockTag as ViemBlockTag,\n} from 'viem';\nimport { LRUCache, generateCacheKey } from './cache';\nimport { createFallbackClient } from './rpc-fallback';\nimport {\n getChainConfig,\n DEFAULT_CACHE_TTL,\n DEFAULT_CACHE_MAX_SIZE,\n MULTICALL3_ADDRESS,\n} from './constants';\nimport { ChainNotSupportedError, TransactionReceiptTimeoutError } from './errors';\nimport type {\n PublicReadClientConfig,\n PublicReadClient,\n ReadContractParams,\n MulticallParams,\n MulticallResult,\n GetLogsParams,\n LogEntry,\n CacheStats,\n ContractCall,\n BlockTag,\n GetTransactionReceiptParams,\n WaitForTransactionReceiptParams,\n TransactionReceipt,\n ReplacedTransactionResponse,\n} from './types';\nimport type { Abi, Address } from 'viem';\n\n/**\n * Internal client implementation\n */\nclass PublicReadClientImpl implements PublicReadClient {\n readonly chainId: number;\n private readonly viemClient: ViemPublicClient;\n private readonly cache: LRUCache | null;\n private readonly multicall3Address: Address | null;\n\n constructor(\n chainId: number,\n viemClient: ViemPublicClient,\n cache: LRUCache | null,\n multicall3Address: Address | null,\n ) {\n this.chainId = chainId;\n this.viemClient = viemClient;\n this.cache = cache;\n this.multicall3Address = multicall3Address;\n }\n\n async readContract<TAbi extends Abi, TFunctionName extends string>(\n params: ReadContractParams<TAbi, TFunctionName>,\n ): Promise<unknown> {\n const {\n address,\n abi,\n functionName,\n args = [],\n blockTag = 'latest',\n from,\n forceRefresh = false,\n } = params;\n\n // Check cache first (unless forceRefresh)\n if (this.cache && !forceRefresh) {\n const cacheKey = generateCacheKey({\n chainId: this.chainId,\n address,\n functionName,\n args,\n blockTag,\n from,\n });\n\n const cached = this.cache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n }\n\n // Make the RPC call\n const result = await this.viemClient.readContract({\n address,\n abi,\n functionName,\n args: args as unknown[],\n blockTag: normalizeBlockTag(blockTag),\n account: from,\n } as Parameters<typeof this.viemClient.readContract>[0]);\n\n // Store in cache\n if (this.cache) {\n const cacheKey = generateCacheKey({\n chainId: this.chainId,\n address,\n functionName,\n args,\n blockTag,\n from,\n });\n this.cache.set(cacheKey, result);\n }\n\n return result;\n }\n\n async multicall<TContracts extends readonly ContractCall[]>(\n params: MulticallParams<TContracts>,\n ): Promise<MulticallResult[]> {\n const {\n contracts,\n allowFailure = true,\n blockTag = 'latest',\n batchSize = 100,\n } = params;\n\n // If no multicall3 or only one contract, use sequential calls\n if (!this.multicall3Address || contracts.length === 1) {\n return this.sequentialMulticall(contracts, allowFailure, blockTag);\n }\n\n // Chunk large batches\n const results: MulticallResult[] = [];\n for (let i = 0; i < contracts.length; i += batchSize) {\n const chunk = contracts.slice(i, i + batchSize);\n const chunkResults = await this.executeMulticallBatch(\n chunk,\n allowFailure,\n blockTag,\n );\n results.push(...chunkResults);\n }\n\n return results;\n }\n\n private async executeMulticallBatch(\n contracts: readonly ContractCall[],\n allowFailure: boolean,\n blockTag: BlockTag,\n ): Promise<MulticallResult[]> {\n try {\n const results = await this.viemClient.multicall({\n contracts: contracts.map((c) => ({\n address: c.address,\n abi: c.abi,\n functionName: c.functionName,\n args: c.args as unknown[],\n })),\n allowFailure,\n blockTag: blockTag as ViemBlockTag,\n multicallAddress: this.multicall3Address!,\n });\n\n // Cast results to known shape - viem returns either success or failure objects\n const typedResults = results as Array<\n { status: 'success'; result: unknown } | { status: 'failure'; error: Error }\n >;\n\n return typedResults.map((r) => {\n if (r.status === 'success') {\n return { status: 'success' as const, result: r.result };\n } else {\n return { status: 'failure' as const, error: r.error };\n }\n });\n } catch (error) {\n // If multicall fails entirely, fall back to sequential\n return this.sequentialMulticall(contracts, allowFailure, blockTag);\n }\n }\n\n private async sequentialMulticall(\n contracts: readonly ContractCall[],\n allowFailure: boolean,\n blockTag: BlockTag,\n ): Promise<MulticallResult[]> {\n const results: MulticallResult[] = [];\n\n for (const contract of contracts) {\n try {\n const result = await this.readContract({\n address: contract.address,\n abi: contract.abi,\n functionName: contract.functionName,\n args: contract.args,\n blockTag,\n });\n results.push({ status: 'success', result });\n } catch (error) {\n if (allowFailure) {\n results.push({\n status: 'failure',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n } else {\n throw error;\n }\n }\n }\n\n return results;\n }\n\n async getLogs(params: GetLogsParams): Promise<LogEntry[]> {\n const { address, event, args, fromBlock, toBlock, blockHash } = params;\n\n // Build parameters conditionally based on what's provided\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const logsParams: any = {};\n\n if (address !== undefined) {\n logsParams.address = address;\n }\n\n if (event !== undefined) {\n logsParams.event = event;\n }\n\n if (args !== undefined) {\n logsParams.args = args;\n }\n\n if (blockHash !== undefined) {\n logsParams.blockHash = blockHash;\n } else {\n if (fromBlock !== undefined) {\n logsParams.fromBlock = normalizeBlockTag(fromBlock);\n }\n if (toBlock !== undefined) {\n logsParams.toBlock = normalizeBlockTag(toBlock);\n }\n }\n\n const logs = await this.viemClient.getLogs(logsParams);\n\n return logs.map((log) => ({\n address: log.address,\n topics: log.topics as [Address, ...Address[]] | [],\n data: log.data,\n blockNumber: log.blockNumber,\n blockHash: log.blockHash,\n transactionHash: log.transactionHash,\n transactionIndex: log.transactionIndex,\n logIndex: log.logIndex,\n removed: log.removed,\n // These properties only exist when an event ABI is provided\n args: 'args' in log ? (log.args as Record<string, unknown>) : undefined,\n eventName: 'eventName' in log ? (log.eventName as string) : undefined,\n }));\n }\n\n async getTransactionReceipt(\n params: GetTransactionReceiptParams,\n ): Promise<TransactionReceipt | null> {\n const { hash } = params;\n\n try {\n const receipt = await this.viemClient.getTransactionReceipt({ hash });\n return this.mapReceipt(receipt);\n } catch (error) {\n // Transaction not found or pending\n if (\n error instanceof Error &&\n (error.message.includes('could not be found') ||\n error.message.includes('not found'))\n ) {\n return null;\n }\n throw error;\n }\n }\n\n async waitForTransactionReceipt(\n params: WaitForTransactionReceiptParams,\n ): Promise<TransactionReceipt> {\n const {\n hash,\n confirmations = 1,\n pollingInterval = 4000,\n timeout = 60000,\n onReplaced,\n } = params;\n\n try {\n const receipt = await this.viemClient.waitForTransactionReceipt({\n hash,\n confirmations,\n pollingInterval,\n timeout,\n onReplaced: onReplaced\n ? (response) => {\n onReplaced({\n reason: response.reason,\n replacedTransaction: { hash: response.replacedTransaction.hash },\n transaction: { hash: response.transaction.hash },\n transactionReceipt: this.mapReceipt(response.transactionReceipt),\n } as ReplacedTransactionResponse);\n }\n : undefined,\n });\n return this.mapReceipt(receipt);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes('timed out')\n ) {\n throw new TransactionReceiptTimeoutError(hash, timeout);\n }\n throw error;\n }\n }\n\n private mapReceipt(\n receipt: Awaited<ReturnType<typeof this.viemClient.getTransactionReceipt>>,\n ): TransactionReceipt {\n return {\n blockHash: receipt.blockHash,\n blockNumber: receipt.blockNumber,\n contractAddress: receipt.contractAddress,\n cumulativeGasUsed: receipt.cumulativeGasUsed,\n effectiveGasPrice: receipt.effectiveGasPrice,\n from: receipt.from,\n gasUsed: receipt.gasUsed,\n logs: receipt.logs.map((log) => ({\n address: log.address,\n topics: log.topics as [Address, ...Address[]] | [],\n data: log.data,\n blockNumber: log.blockNumber,\n blockHash: log.blockHash,\n transactionHash: log.transactionHash,\n transactionIndex: log.transactionIndex,\n logIndex: log.logIndex,\n removed: log.removed,\n })),\n logsBloom: receipt.logsBloom,\n status: receipt.status,\n to: receipt.to,\n transactionHash: receipt.transactionHash,\n transactionIndex: receipt.transactionIndex,\n type: receipt.type,\n };\n }\n\n clearCache(): void {\n this.cache?.clear();\n }\n\n getCacheStats(): CacheStats {\n if (!this.cache) {\n return { size: 0, maxSize: 0, hits: 0, misses: 0 };\n }\n return this.cache.getStats();\n }\n}\n\n/**\n * Create a public read client for blockchain queries\n *\n * @example\n * ```typescript\n * // Using Lumia mainnet defaults\n * const client = getPublicClient({ chainId: 994873017 });\n *\n * // Using custom RPC with fallbacks\n * const client = getPublicClient({\n * chainId: 1,\n * rpcUrls: ['https://primary.rpc', 'https://fallback.rpc'],\n * });\n * ```\n */\nexport function getPublicClient(config: PublicReadClientConfig): PublicReadClient {\n const {\n chainId,\n rpcUrls,\n multicall3Address,\n cacheTtl = DEFAULT_CACHE_TTL,\n cacheMaxSize = DEFAULT_CACHE_MAX_SIZE,\n disableCache = false,\n } = config;\n\n // Get RPC URLs\n const urls = resolveRpcUrls(chainId, rpcUrls);\n\n // Create chain object for viem\n const chainConfig = getChainConfig(chainId);\n const chain: Chain = {\n id: chainId,\n name: chainConfig?.name ?? `Chain ${chainId}`,\n nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: urls },\n },\n };\n\n // Create viem client with fallback support\n let viemClient: ViemPublicClient;\n if (urls.length === 1) {\n viemClient = createPublicClient({\n chain,\n transport: http(urls[0]),\n });\n } else {\n viemClient = createFallbackClient(chain, { urls });\n }\n\n // Create cache if enabled\n const cache = disableCache\n ? null\n : new LRUCache({ maxSize: cacheMaxSize, ttl: cacheTtl });\n\n // Determine multicall3 address\n const resolvedMulticall3 =\n multicall3Address ?? chainConfig?.multicall3 ?? MULTICALL3_ADDRESS;\n\n return new PublicReadClientImpl(chainId, viemClient, cache, resolvedMulticall3);\n}\n\n/**\n * Resolve RPC URLs from config or chain defaults\n */\nfunction resolveRpcUrls(\n chainId: number,\n rpcUrls?: string | string[],\n): string[] {\n // If URLs provided, use them\n if (rpcUrls) {\n return Array.isArray(rpcUrls) ? rpcUrls : [rpcUrls];\n }\n\n // Try to get from chain config\n const chainConfig = getChainConfig(chainId);\n if (chainConfig) {\n return chainConfig.rpcUrls;\n }\n\n // Chain not supported and no URLs provided\n throw new ChainNotSupportedError(chainId);\n}\n\n/**\n * Normalize block tag for viem\n */\nfunction normalizeBlockTag(\n blockTag: BlockTag | bigint,\n): 'latest' | 'pending' | 'safe' | 'finalized' | 'earliest' | bigint {\n if (typeof blockTag === 'bigint') {\n return blockTag;\n }\n return blockTag;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumiapassport/core",
3
- "version": "1.14.1",
3
+ "version": "1.14.2",
4
4
  "description": "Framework-agnostic core SDK for Lumia Passport smart accounts",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",