{"version":3,"sources":["../src/types/api-types.ts","../src/networks.ts","../src/http-client.ts","../src/cache.ts","../src/event-emitter.ts","../src/provider-events.ts","../src/provider.ts","../src/utils/receipt-parser.ts"],"names":["AssetType","StakingInterestType","TransactionStatus"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { TransactionHash } from '@klever/connect-core'\n\nexport interface IAccount {\n  address: string\n  balance: bigint\n  nonce: number\n  assets?: IAssetBalance[]\n}\n\n/** Asset type enum matching KDAData_EnumAssetType from blockchain */\nexport enum AssetType {\n  Fungible = 0,\n  NonFungible = 1,\n  SemiFungible = 2,\n}\n\n/** Staking interest type enum matching StakingData_EnumInterestType */\nexport enum StakingInterestType {\n  APRI = 0, // Annual Percentage Rate Interest\n  FPRI = 1, // Flexible Percentage Rate Interest\n}\n\n/** User's last claim information for a KDA */\nexport interface UserKDALastClaim {\n  timestamp: number\n  epoch: number\n}\n\n/** User's bucket information for staking */\nexport interface UserKDABucket {\n  id: string\n  stakedAt: number\n  stakedEpoch: number\n  unstakedEpoch: number\n  balance: bigint\n  delegation: string\n  validatorName: string\n}\n\n/**\n * Complete asset balance information from blockchain\n * Matches AccountKDA structure from Go backend\n */\nexport interface IAssetBalance {\n  /** Address of the account holding this asset */\n  address: string\n  /** Asset ID (KDA ID) */\n  assetId: string\n  /** Collection ID for NFTs */\n  collection?: string | undefined\n  /** NFT nonce for specific NFT instances */\n  nftNonce?: number | undefined\n  /** Human-readable asset name */\n  assetName: string\n  /** Asset type (Fungible, NonFungible, SemiFungible) */\n  assetType: AssetType\n  /** Total balance in smallest units */\n  balance: bigint\n  /** Number of decimal places for display */\n  precision: number\n  /** Frozen balance (staked) in smallest units */\n  frozenBalance: bigint\n  /** Unfrozen balance (available after unstaking cooldown) */\n  unfrozenBalance: bigint\n  /** Last claim information for rewards */\n  lastClaim: UserKDALastClaim\n  /** Staking buckets for this asset */\n  buckets: UserKDABucket[]\n  /** NFT metadata */\n  metadata?: string | undefined\n  /** MIME type for NFT content */\n  mime?: string | undefined\n  /** Marketplace ID if listed for sale */\n  marketplaceId?: string | undefined\n  /** Order ID if active order exists */\n  orderId?: string | undefined\n  /** Staking interest type (APR or FPR) */\n  stakingType: StakingInterestType\n}\n\nexport interface IBalance {\n  address: string\n  token: string\n  amount: bigint\n  decimals: number\n}\n\nexport interface IBroadcastResult {\n  hash: string\n  code?: string\n  message?: string\n}\n\nexport interface IBulkBroadcastResult {\n  hashes: string[]\n  code?: string\n  message?: string\n}\n\nexport interface IContractQueryParams {\n  ScAddress: string\n  FuncName: string\n  Arguments?: string[]\n}\n\nexport interface IContractQueryResult {\n  data?: {\n    returnData?: string[]\n    returnCode?: string\n    returnMessage?: string\n    gasRemaining?: bigint\n    gasRefund?: bigint\n  }\n  error?: string\n  code?: string\n}\n\nexport interface IFaucetResult {\n  txHash: string\n  status: string\n}\n\n/**\n * Contract data from API responses (e.g., getTransaction)\n * Represents contracts in mined/historical transactions returned by the Klever API.\n *\n * Note: This is for READ operations (API → Client).\n * For WRITE operations (building new transactions), use ContractRequestData instead.\n *\n * @property type - Contract type number (0=Transfer, 4=Freeze, etc.)\n * @property typeString - Human-readable type name, added by the indexer (e.g., \"Transfer\")\n * @property parameter - Contract-specific data (untyped for historical transactions)\n */\nexport interface IContractData {\n  type: number\n  typeString?: string\n  parameter: Record<string, unknown> | ISCData\n}\n\nexport interface ICallValueData {\n  assetId: string\n  amount: bigint\n}\n\nexport interface ISCData {\n  address: string\n  scType: number\n  callValue?: ICallValueData[]\n  input?: string\n}\n\nexport enum TransactionStatus {\n  Pending = 'pending',\n  Success = 'success',\n  Failed = 'failed',\n  Invalid = 'invalid',\n}\n\nexport interface ITransactionLog {\n  address: string\n  contractId?: number\n  timestamp?: number\n  events: ILogEvent[]\n}\n\nexport interface ILogEvent {\n  address: string\n  identifier: string\n  topics: string[]\n  data: string[]\n}\n\nexport interface IFees {\n  KAppFee: number\n  BandwidthFee: number\n  TotalFee: number\n}\n\nexport interface IFeesResponse {\n  kAppFee: number\n  bandwidthFee: number\n  gasEstimated: number\n  safetyMargin: number\n  gasMultiplier: number\n  returnMessage: string\n  kdaFee: {\n    kda?: Uint8Array\n    amount?: number\n  }\n}\n\nexport interface IReceipt {\n  type?: number\n  typeString?: string\n  cID?: number\n  [key: string]: unknown\n}\n\n/**\n * Transaction response from the API/Indexer\n * This represents a transaction that has been processed and indexed\n * Contains parsed data with human-readable addresses and contract info\n */\nexport interface ITransactionResponse {\n  hash: string\n  blockNum: number\n  sender: string\n  nonce: number\n  timestamp: number\n  kAppFee: number\n  bandwidthFee: number\n  totalFee: number\n  status: TransactionStatus\n  resultCode?: string\n  version: number\n  chainID: string\n  signature: string[]\n  contract?: IContractData[]\n  data?: string[]\n  receipts?: IReceipt[]\n  logs?: ITransactionLog\n  hasLogs?: boolean\n  hasOperations?: boolean\n}\n\n/**\n * Result returned when submitting a transaction\n * Contains the transaction hash and optionally the full transaction data\n */\nexport interface TransactionSubmitResult {\n  /** Transaction hash */\n  hash: TransactionHash\n  /** Transaction status */\n  status: 'pending' | 'success' | 'failed'\n  /** Raw transaction data that was submitted (proto Transaction format from @klever/connect-transactions) */\n  transaction?: unknown\n  /** Wait for transaction to be mined/confirmed */\n  wait?: () => Promise<ITransactionResponse>\n}\n\n/**\n * Klever API Response Types\n */\n\n// Common Response Wrapper\nexport interface ApiResponse<T> {\n  data: T\n  pagination?: Pagination\n  error: string\n  code: string\n}\n\nexport interface Pagination {\n  self: number\n  next: number\n  previous: number\n  perPage: number\n  totalPages: number\n  totalRecords: number\n}\n\n// Account/Address Response\nexport interface AddressResponse {\n  account: {\n    address: string\n    nonce: number\n    rootHash?: string\n    balance: number\n    frozenBalance: number\n    unfrozenBalance: number\n    allowance: number\n    permissions: string[]\n    timestamp: number\n    codeHash?: string\n    codeMetadata: string\n    assets: Record<string, ApiAssetBalance>\n  }\n}\n\n/**\n * Asset balance as returned by the API\n * Matches AccountKDA structure from Go backend\n */\nexport interface ApiAssetBalance {\n  address: string\n  assetId: string\n  collection?: string\n  nftNonce?: number\n  assetName: string\n  assetType: number\n  balance: number\n  precision: number\n  frozenBalance: number\n  unfrozenBalance: number\n  lastClaim: {\n    timestamp: number\n    epoch: number\n  }\n  buckets: Array<{\n    id: string\n    stakeAt: number\n    stakedEpoch: number\n    unstakedEpoch: number\n    balance: number\n    delegation: string\n    validatorName: string\n  }>\n  metadata?: string\n  mime?: string\n  marketplaceId?: string\n  orderId?: string\n  stakingType: number\n}\n\n// Transaction Response\nexport interface ITransactionListResponse {\n  transactions: ITransactionResponse[]\n}\n\n// Transaction API Response wrapper\nexport interface ITransactionApiResponse {\n  transaction: ITransactionResponse\n}\n\n// Broadcast Response (Node API)\n// Matches the API response: { data: { txsHashes: [...], count: N }, error: \"\", code: \"\" }\nexport interface IBroadcastResponse {\n  data?: {\n    txHash?: string\n    txsHashes?: string[]\n    count?: number\n  }\n  error?: string\n  code?: string\n  message?: string\n}\n\n// Block Response (from API/Indexer)\nexport interface IBlockResponse {\n  hash: string\n  nonce: number\n  parentHash: string\n  timestamp: number\n  slot: number\n  epoch: number\n  isEpochStart: boolean\n  prevEpochStartSlot: number\n  size: number\n  sizeTxs: number\n  virtualBlockSize: number\n  txRootHash: string\n  trieRoot: string\n  validatorsTrieRoot: string\n  kappsTrieRoot: string\n  producerSignature: string\n  signature: string\n  prevRandSeed: string\n  randSeed: string\n  txCount: number\n  blockRewards: number\n  stakingRewards: number\n  txHashes: string[]\n  validators: string[]\n  softwareVersion: string\n  chainID: string\n  reserved: string\n  producerBLS: string\n  transactions: ITransactionResponse[] | null\n  producerName: string\n  producerOwnerAddress: string\n  producerLogo: string\n}\n\n// Asset/Token Response\nexport interface IAssetResponse {\n  assetId: string\n  assetName: string\n  assetType: string\n  ownerAddress: string\n  logo?: string\n  uris?: Record<string, string>\n  precision: number\n  circulatingSupply: string\n  maxSupply: string\n  marketCap?: string\n  verified?: boolean\n  hidden?: boolean\n  attributes?: Record<string, unknown>\n}\n\n// Network Info Response\nexport interface INetworkResponse {\n  nodeVersion: string\n  apiVersion: string\n  chainID: string\n  currentBlockHeight: number\n  currentBlockHash: string\n  genesisBlockHash: string\n  protocolVersion: string\n}\n\n// Staking/Delegation Response\nexport interface IStakingResponse {\n  frozenBalance: number\n  unfrozenBalance: number\n  claimableBalance: number\n  delegate?: {\n    to: string\n    amount: number\n  }\n}\n\n// Validator Response\nexport interface IValidatorResponse {\n  address: string\n  name?: string\n  rating: number\n  jailed: boolean\n  totalStake: string\n  selfStake: string\n  delegatedStake: string\n  commission: number\n  maxDelegation: string\n  website?: string\n  logo?: string\n  details?: string\n}\n\n// Contract Query Response\nexport interface IContractQueryResponse {\n  data?: {\n    returnData?: string[]\n    returnCode?: string\n    returnMessage?: string\n    gasRemaining?: number\n    gasRefund?: number\n  }\n  error?: string\n  code?: string\n}\n\n// Faucet Response\nexport interface IFaucetResponse {\n  data?: {\n    txHash: string\n    status: string\n  }\n  error?: string\n  code?: string\n}\n\n// Market/Exchange Data\nexport interface IMarketResponse {\n  marketId: string\n  baseAsset: string\n  quoteAsset: string\n  lastPrice: string\n  priceChange24h: string\n  volume24h: string\n  high24h: string\n  low24h: string\n}\n\nexport interface ITypedValue {\n  type: string\n  value: string\n}\n","import type { NetworkName, Network, NetworkURI } from './types'\n\n// Network configurations (similar to ethers.js)\nexport const NETWORKS: Record<NetworkName, Network> = {\n  mainnet: {\n    name: 'mainnet',\n    chainId: '108',\n    config: {\n      api: 'https://api.mainnet.klever.org', // Indexer (fast, cached)\n      node: 'https://node.mainnet.klever.org', // Direct node (raw, up-to-date)\n      explorer: 'https://kleverscan.org',\n    },\n    isTestnet: false,\n    nativeCurrency: {\n      name: 'Klever',\n      symbol: 'KLV',\n      decimals: 6,\n    },\n  },\n  testnet: {\n    name: 'testnet',\n    chainId: '109',\n    config: {\n      api: 'https://api.testnet.klever.org', // Indexer (fast, cached)\n      node: 'https://node.testnet.klever.org', // Direct node (raw, up-to-date)\n      explorer: 'https://testnet.kleverscan.org',\n    },\n    isTestnet: true,\n    nativeCurrency: {\n      name: 'Klever',\n      symbol: 'KLV',\n      decimals: 6,\n    },\n  },\n  devnet: {\n    name: 'devnet',\n    chainId: '10001',\n    config: {\n      api: 'https://api.devnet.klever.org', // Indexer (fast, cached)\n      node: 'https://node.devnet.klever.org', // Direct node (raw, up-to-date)\n      explorer: 'https://devnet.kleverscan.org',\n    },\n    isTestnet: true,\n    nativeCurrency: {\n      name: 'Klever',\n      symbol: 'KLV',\n      decimals: 6,\n    },\n  },\n  local: {\n    name: 'local',\n    chainId: '420420',\n    config: {\n      api: 'http://localhost:8080', // Indexer\n      node: 'http://localhost:8080', // Node (same in local dev)\n      ws: 'ws://localhost:8080/subscribe',\n      explorer: 'http://localhost:3000',\n    },\n    isTestnet: true,\n    nativeCurrency: {\n      name: 'Klever',\n      symbol: 'KLV',\n      decimals: 6,\n    },\n  },\n  custom: {\n    name: 'custom',\n    chainId: '420420',\n    config: {},\n    isTestnet: true,\n    nativeCurrency: {\n      name: 'Klever',\n      symbol: 'KLV',\n      decimals: 6,\n    },\n  },\n}\n\n// Default network\nexport const DEFAULT_NETWORK: NetworkName = 'mainnet'\n\n// Export helper to get network by chain ID\nexport function getNetworkByChainId(chainId: string): Network | undefined {\n  return Object.values(NETWORKS).find((network) => network.chainId === chainId)\n}\n\n// Export helper to create custom network configuration\nexport function createCustomNetwork(config: {\n  chainId: string\n  api: string\n  node: string\n  ws?: string\n  explorer?: string\n  isTestnet?: boolean\n}): Network {\n  const networkConfig: NetworkURI = {\n    api: config.api,\n    node: config.node,\n  }\n\n  // Only add optional properties if they are explicitly provided\n  if (config.ws !== undefined) networkConfig.ws = config.ws\n  if (config.explorer !== undefined) networkConfig.explorer = config.explorer\n\n  return {\n    name: 'custom',\n    chainId: config.chainId,\n    config: networkConfig,\n    isTestnet: config.isTestnet ?? true,\n    nativeCurrency: {\n      name: 'Klever',\n      symbol: 'KLV',\n      decimals: 6,\n    },\n  }\n}\n\n/**\n * Helper to resolve network configuration to a Network object\n */\nexport function resolveNetwork(network: NetworkName | Network): Network {\n  if (typeof network === 'string') {\n    const net = NETWORKS[network]\n    if (!net) {\n      throw new Error(`Unknown network: ${network}`)\n    }\n    return net\n  }\n\n  if (network && typeof network === 'object' && 'config' in network) {\n    return network\n  }\n\n  throw new Error(`Unknown network`)\n}\n\n/**\n * Helper to get network name from a Network object\n */\nexport function getNetworkName(network: NetworkName | Network): NetworkName {\n  if (typeof network === 'string') {\n    const net = NETWORKS[network]\n    if (!net) {\n      throw new Error(`Unknown network: ${network}`)\n    }\n    return net.name\n  }\n\n  if (network && typeof network === 'object' && 'config' in network) {\n    return network.name\n  }\n\n  throw new Error(`Unknown network`)\n}\n\n/**\n * Helper to get network configuration from a Network object\n * @param network\n * @returns\n */\nexport function getNetworkConfig(network: NetworkName | Network): NetworkURI {\n  if (typeof network === 'string') {\n    const net = NETWORKS[network]\n    if (!net) {\n      throw new Error(`Unknown network: ${network}`)\n    }\n    return net.config\n  }\n\n  if (network && typeof network === 'object' && 'config' in network) {\n    return network.config\n  }\n\n  throw new Error(`Unknown network`)\n}\n\n/**\n * Helper to get network identifier for storage\n */\nexport function getNetworkIdentifier(network: NetworkName): string {\n  const net = NETWORKS[network]\n  if (!net) {\n    throw new Error(`Unknown network: ${network}`)\n  }\n  return net.name === 'custom' ? `custom-${net.chainId}` : net.chainId\n}\n","/**\n * Configuration options for HttpClient\n */\nexport interface HttpClientConfig {\n  /** Base URL for all HTTP requests */\n  baseUrl: string\n  /** Request timeout in milliseconds (default: 30000) */\n  timeout?: number\n  /** Default headers to include in all requests */\n  headers?: Record<string, string>\n  /** Number of retry attempts for failed requests (default: 3) */\n  retries?: number\n}\n\n/**\n * Options for individual HTTP requests\n */\nexport interface RequestOptions {\n  /** HTTP method to use (default: GET) */\n  method?: 'GET' | 'POST' | 'PUT' | 'DELETE'\n  /** Headers to include in this specific request */\n  headers?: Record<string, string>\n  /** Request body (will be JSON stringified) */\n  body?: unknown\n  /** Request timeout in milliseconds */\n  timeout?: number\n}\n\n/**\n * HTTP client with built-in retry logic and timeout handling\n *\n * Features:\n * - Automatic retries with exponential backoff\n * - Configurable timeout per request\n * - Default JSON content type\n * - Proper error handling for HTTP status codes\n * - Does not retry client errors (4xx)\n *\n * @example\n * ```typescript\n * const client = new HttpClient({\n *   baseUrl: 'https://api.example.com',\n *   timeout: 10000,\n *   retries: 3\n * })\n *\n * // GET request\n * const data = await client.get<UserData>('/users/123')\n *\n * // POST request\n * const result = await client.post<CreateResult>('/users', {\n *   name: 'John',\n *   email: 'john@example.com'\n * })\n * ```\n */\nexport class HttpClient {\n  private baseUrl: string\n  private timeout: number\n  private headers: Record<string, string>\n  private retries: number\n\n  /**\n   * Creates a new HttpClient instance\n   *\n   * @param config - Client configuration\n   */\n  constructor(config: HttpClientConfig) {\n    this.baseUrl = config.baseUrl\n    this.timeout = config.timeout ?? 30000\n    this.headers = {\n      'Content-Type': 'application/json',\n      ...config.headers,\n    }\n    this.retries = config.retries ?? 3\n  }\n\n  /**\n   * Makes an HTTP request with automatic retries and timeout handling\n   *\n   * Implements exponential backoff for retries:\n   * - 1st retry: wait 1 second\n   * - 2nd retry: wait 2 seconds\n   * - 3rd retry: wait 4 seconds\n   *\n   * Client errors (4xx) are not retried.\n   *\n   * @param path - API path to request (will be appended to baseUrl)\n   * @param options - Request options (method, headers, body, timeout)\n   * @returns Promise resolving to the parsed JSON response\n   * @throws {Error} If all retry attempts fail or response is not ok\n   *\n   * @example\n   * ```typescript\n   * const response = await client.request<UserData>('/users/123', {\n   *   method: 'GET',\n   *   headers: { 'Authorization': 'Bearer token' }\n   * })\n   * ```\n   */\n  async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n    const url = `${this.baseUrl}${path}`\n    const method = options.method ?? 'GET'\n    const headers = { ...this.headers, ...options.headers }\n    const timeout = options.timeout ?? this.timeout\n\n    let lastError: Error | undefined\n\n    for (let attempt = 0; attempt <= this.retries; attempt++) {\n      try {\n        const controller = new AbortController()\n        const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n        const response = await fetch(url, {\n          method,\n          headers,\n          body: options.body ? JSON.stringify(options.body) : null,\n          signal: controller.signal,\n        })\n\n        clearTimeout(timeoutId)\n\n        if (!response.ok) {\n          const errorBody = await response.text()\n          throw new Error(`HTTP ${response.status}: ${errorBody}`)\n        }\n\n        const data = await response.json()\n        return data as T\n      } catch (error) {\n        lastError = error as Error\n\n        // Don't retry on client errors (4xx)\n        if (error instanceof Error && error.message.includes('HTTP 4')) {\n          throw error\n        }\n\n        // Wait before retrying (exponential backoff)\n        if (attempt < this.retries) {\n          await this.sleep(Math.pow(2, attempt) * 1000)\n        }\n      }\n    }\n\n    throw lastError ?? new Error('Request failed')\n  }\n\n  /**\n   * Makes a GET request\n   *\n   * @param path - API path to request\n   * @param options - Optional request options\n   * @returns Promise resolving to the parsed JSON response\n   *\n   * @example\n   * ```typescript\n   * const user = await client.get<User>('/users/123')\n   * const users = await client.get<User[]>('/users', {\n   *   headers: { 'X-Custom-Header': 'value' }\n   * })\n   * ```\n   */\n  async get<T>(path: string, options?: RequestOptions): Promise<T> {\n    return this.request<T>(path, { ...options, method: 'GET' })\n  }\n\n  /**\n   * Makes a POST request\n   *\n   * @param path - API path to request\n   * @param body - Request body (will be JSON stringified)\n   * @param options - Optional request options\n   * @returns Promise resolving to the parsed JSON response\n   *\n   * @example\n   * ```typescript\n   * const result = await client.post<CreateResult>('/users', {\n   *   name: 'John',\n   *   email: 'john@example.com'\n   * })\n   *\n   * const response = await client.post<Response>('/api/action', payload, {\n   *   timeout: 5000\n   * })\n   * ```\n   */\n  async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n    return this.request<T>(path, { ...options, method: 'POST', body })\n  }\n\n  private sleep(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms))\n  }\n}\n","import type { CacheOptions } from './types/provider'\n\n/**\n * Simple in-memory cache with TTL (time-to-live) and LRU (least-recently-used) eviction\n *\n * Features:\n * - Automatic expiration based on TTL\n * - LRU eviction when cache is full\n * - Configurable max size\n * - Generic type support\n *\n * @internal\n *\n * @example\n * ```typescript\n * const cache = new SimpleCache<UserData>({\n *   ttl: 15000,    // 15 seconds\n *   maxSize: 100   // Max 100 entries\n * })\n *\n * cache.set('user:123', userData)\n * const user = cache.get('user:123') // Returns userData\n *\n * // After 15 seconds\n * const expired = cache.get('user:123') // Returns undefined\n * ```\n */\nexport class SimpleCache<T> {\n  private cache = new Map<string, { value: T; expires: number }>()\n  private readonly ttl: number\n  private readonly maxSize: number\n\n  /**\n   * Creates a new SimpleCache instance\n   *\n   * @param options - Cache configuration options\n   * @param options.ttl - Time to live in milliseconds (default: 15000)\n   * @param options.maxSize - Maximum number of entries (default: 100)\n   */\n  constructor(options: CacheOptions) {\n    this.ttl = options.ttl ?? 15000 // 15 seconds default (3-4 blocks)\n    this.maxSize = options.maxSize ?? 100\n  }\n\n  /**\n   * Retrieves a value from the cache\n   *\n   * Returns undefined if:\n   * - Key doesn't exist\n   * - Entry has expired (also removes it)\n   *\n   * @param key - Cache key\n   * @returns Cached value or undefined\n   *\n   * @example\n   * ```typescript\n   * const user = cache.get('user:123')\n   * if (user) {\n   *   console.log('Cache hit:', user)\n   * } else {\n   *   console.log('Cache miss or expired')\n   * }\n   * ```\n   */\n  get(key: string): T | undefined {\n    const item = this.cache.get(key)\n    if (!item) return undefined\n\n    if (Date.now() > item.expires) {\n      this.cache.delete(key)\n      return undefined\n    }\n\n    return item.value\n  }\n\n  /**\n   * Stores a value in the cache with automatic expiration\n   *\n   * If cache is full and key doesn't exist, removes oldest entry (LRU eviction).\n   * Updates expiration time if key already exists.\n   *\n   * @param key - Cache key\n   * @param value - Value to cache\n   *\n   * @example\n   * ```typescript\n   * cache.set('user:123', { name: 'John', age: 30 })\n   * cache.set('account:abc', accountData)\n   * ```\n   */\n  set(key: string, value: T): void {\n    // Implement simple LRU by removing oldest entries when at capacity\n    if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n      const firstKey = this.cache.keys().next().value\n      if (firstKey) this.cache.delete(firstKey)\n    }\n\n    this.cache.set(key, {\n      value,\n      expires: Date.now() + this.ttl,\n    })\n  }\n\n  /**\n   * Removes all entries from the cache\n   *\n   * @example\n   * ```typescript\n   * cache.clear()\n   * console.log('Cache cleared')\n   * ```\n   */\n  clear(): void {\n    this.cache.clear()\n  }\n\n  /**\n   * Removes a specific entry from the cache\n   *\n   * @param key - Cache key to remove\n   * @returns true if entry was found and removed, false otherwise\n   *\n   * @example\n   * ```typescript\n   * const wasDeleted = cache.delete('user:123')\n   * if (wasDeleted) {\n   *   console.log('Entry removed')\n   * }\n   * ```\n   */\n  delete(key: string): boolean {\n    return this.cache.delete(key)\n  }\n}\n","/** Maximum listeners per event before a warning is emitted to the console */\nconst MAX_LISTENERS_WARN = 10\n\ntype Listener<T> = (data: T) => void\n\ninterface ListenerEntry<T> {\n  listener: Listener<T>\n  /** When true, the entry is removed after the first invocation */\n  once: boolean\n}\n\n// Alias for the union type stored in the Map to avoid repeating it at every\n// call site. The per-key narrowing is done in the typed accessor below.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyEntry<TEventMap> = Array<ListenerEntry<TEventMap[keyof TEventMap] & any>>\n\n/**\n * Generic typed event emitter.\n *\n * @typeParam TEventMap - A record mapping event name strings to their payload\n *   types.  Use `void` for events that carry no data.\n *\n * @example\n * ```typescript\n * interface MyEvents {\n *   block: { nonce: number; hash: string }\n *   error: Error\n *   connect: void\n * }\n *\n * const emitter = new TypedEventEmitter<MyEvents>()\n * emitter.on('block', ({ nonce }) => console.log('block', nonce))\n * emitter.emit('block', { nonce: 1, hash: '0xabc' })\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class TypedEventEmitter<TEventMap extends Record<string, any>> {\n  private readonly _listeners = new Map<keyof TEventMap, AnyEntry<TEventMap>>()\n  /**\n   * Add a persistent listener for `event`.\n   * The listener will be called every time the event is emitted.\n   *\n   * @param event - The event name\n   * @param listener - Callback invoked with the event payload\n   */\n  on<K extends keyof TEventMap>(event: K, listener: Listener<TEventMap[K]>): this {\n    this._addListener(event, listener, false)\n    return this\n  }\n\n  /**\n   * Remove a previously registered listener for `event`.\n   * If the listener is not found this is a no-op.\n   *\n   * @param event - The event name\n   * @param listener - The exact callback reference that was passed to `on`/`once`\n   */\n  off<K extends keyof TEventMap>(event: K, listener: Listener<TEventMap[K]>): this {\n    const entries = this._getEntries(event)\n    if (!entries) return this\n\n    const filtered = entries.filter((e) => e.listener !== listener)\n    if (filtered.length === 0) {\n      this._listeners.delete(event)\n    } else {\n      this._listeners.set(event, filtered)\n    }\n\n    return this\n  }\n\n  /**\n   * Add a one-time listener for `event`.\n   * The listener will be invoked at most once and then automatically removed.\n   *\n   * @param event - The event name\n   * @param listener - Callback invoked with the event payload\n   */\n  once<K extends keyof TEventMap>(event: K, listener: Listener<TEventMap[K]>): this {\n    this._addListener(event, listener, true)\n    return this\n  }\n\n  /**\n   * Remove all listeners for a specific event, or every listener across all\n   * events when called without arguments.\n   *\n   * @param event - Optional event name.  When omitted all listeners are cleared.\n   */\n  removeAllListeners<K extends keyof TEventMap>(event?: K): this {\n    if (event === undefined) {\n      this._listeners.clear()\n    } else {\n      this._listeners.delete(event)\n    }\n    return this\n  }\n\n  /**\n   * Return the number of listeners currently registered for `event`.\n   *\n   * @param event - The event name\n   */\n  getListenerCount<K extends keyof TEventMap>(event: K): number {\n    return this._listeners.get(event)?.length ?? 0\n  }\n\n  /**\n   * Return all event names that currently have at least one listener.\n   */\n  eventNames(): Array<keyof TEventMap> {\n    return Array.from(this._listeners.keys())\n  }\n\n  // -------------------------------------------------------------------------\n  // Internal helpers\n  // -------------------------------------------------------------------------\n\n  /**\n   * Dispatch `event` to all registered listeners.\n   * One-time listeners are removed before invocation so that re-entrant\n   * emissions do not call them twice.\n   *\n   * @param event - The event name\n   * @param data - The payload forwarded to every listener\n   */\n  emit<K extends keyof TEventMap>(event: K, data: TEventMap[K]): void {\n    const entries = this._getEntries(event)\n    if (!entries || entries.length === 0) return\n\n    // Snapshot to handle mutations during iteration\n    const snapshot = entries.slice()\n\n    // Remove once-listeners before calling them (handles re-entrant emits)\n    const remaining = entries.filter((e) => !e.once)\n    if (remaining.length !== entries.length) {\n      if (remaining.length === 0) {\n        this._listeners.delete(event)\n      } else {\n        this._listeners.set(event, remaining)\n      }\n    }\n\n    for (const entry of snapshot) {\n      entry.listener(data)\n    }\n  }\n\n  /** Centralised typed accessor — the single place where the Map cast lives. */\n  private _getEntries<K extends keyof TEventMap>(\n    event: K,\n  ): Array<ListenerEntry<TEventMap[K]>> | undefined {\n    return this._listeners.get(event)\n  }\n\n  private _addListener<K extends keyof TEventMap>(\n    event: K,\n    listener: Listener<TEventMap[K]>,\n    isOnce: boolean,\n  ): void {\n    let entries = this._getEntries(event)\n\n    if (!entries) {\n      entries = []\n      this._listeners.set(event, entries)\n    }\n\n    entries.push({ listener, once: isOnce })\n\n    if (entries.length > MAX_LISTENERS_WARN) {\n      console.warn(\n        `[TypedEventEmitter] Possible memory leak: ${entries.length} listeners registered for event \"${String(event)}\". ` +\n          `Use removeAllListeners() to clean up unused subscriptions.`,\n      )\n    }\n  }\n}\n","import type { Network } from './types'\nimport type { ProviderEventMap, WsEventMessage } from './types/types'\nimport type { TypedEventEmitter } from './event-emitter'\n\nconst BLOCK_POLL_INTERVAL_MS = 3_000\nconst RECONNECT_BASE_DELAY_MS = 1_000\nconst RECONNECT_MAX_DELAY_MS = 30_000\nconst RECONNECT_MAX_ATTEMPTS = 5\nconst WS_CONNECT_TIMEOUT_MS = 15_000\n\nconst WS_EVENT_TYPES = ['blocks', 'transactions', 'accounts', 'user_transactions'] as const\ntype WsEventType = (typeof WS_EVENT_TYPES)[number]\n\nconst WS_TYPE_TO_PROVIDER_EVENT: Partial<Record<WsEventType, keyof ProviderEventMap>> = {\n  blocks: 'block',\n  transactions: 'pending',\n} as const\n\ntype BlockPoller = {\n  stop: () => void\n}\n\nfunction createBlockPoller(\n  fetchBlockNumber: () => Promise<number>,\n  onBlock: (blockNumber: number) => void,\n  onError: (err: Error) => void,\n): BlockPoller {\n  let lastSeen = -1\n  let stopped = false\n  let timer: ReturnType<typeof setTimeout> | null = null\n\n  const tick = async (): Promise<void> => {\n    if (stopped) return\n    try {\n      const num = await fetchBlockNumber()\n      if (!stopped && num !== lastSeen) {\n        lastSeen = num\n        onBlock(num)\n      }\n    } catch (err) {\n      if (!stopped) onError(err instanceof Error ? err : new Error(String(err)))\n    } finally {\n      if (!stopped) timer = setTimeout(() => void tick(), BLOCK_POLL_INTERVAL_MS)\n    }\n  }\n\n  void tick()\n\n  return {\n    stop: () => {\n      stopped = true\n      if (timer !== null) {\n        clearTimeout(timer)\n        timer = null\n      }\n    },\n  }\n}\n\n// The WebSocket server expects an initial subscription message\n// at /subscribe route with this exact format (routes.go: subscribeRequest).\n// Field name is \"subscribed_types\", not \"types\".\nfunction buildSubscribeMessage(addresses: string[]): string {\n  return JSON.stringify({\n    addresses,\n    subscribed_types: [...WS_EVENT_TYPES],\n  })\n}\n\n/**\n * Manages the real-time event connection (WebSocket or polling fallback) for\n * a given Klever network.\n *\n * Consumers interact via the {@link TypedEventEmitter} that is passed in at\n * construction time — this class simply drives it with live data.\n *\n * @example\n * ```typescript\n * const manager = new KleverEventManager(\n *   network,\n *   emitter,\n *   () => provider.getBlockNumber(),\n *   debug,\n * )\n * manager.connect()\n * // ...\n * manager.dispose()\n * ```\n */\nexport class KleverEventManager {\n  private readonly _network: Network\n  private readonly _emitter: TypedEventEmitter<ProviderEventMap>\n  private readonly _fetchBlockNumber: () => Promise<number>\n  private readonly _debug: boolean\n\n  private _ws: WebSocket | null = null\n  private _wsConnected = false\n  private _wsAvailable: boolean\n  private _wsConnectTimer: ReturnType<typeof setTimeout> | null = null\n  private _reconnectAttempts = 0\n  private _reconnectTimer: ReturnType<typeof setTimeout> | null = null\n  private _poller: BlockPoller | null = null\n  private _disposed = false\n\n  constructor(\n    network: Network,\n    emitter: TypedEventEmitter<ProviderEventMap>,\n    fetchBlockNumber: () => Promise<number>,\n    debug = false,\n  ) {\n    this._network = network\n    this._emitter = emitter\n    this._fetchBlockNumber = fetchBlockNumber\n    this._debug = debug\n    this._wsAvailable = typeof globalThis.WebSocket !== 'undefined'\n  }\n\n  /**\n   * Open the connection.  If WebSocket is available and the network has a `ws`\n   * URL, a WebSocket subscription is established.  Otherwise HTTP polling is\n   * used as a fallback.\n   */\n  connect(): void {\n    if (this._disposed) return\n    // Guard: already have an active WebSocket, polling, or a pending reconnect\n    if (this._ws !== null || this._poller !== null || this._reconnectTimer !== null) return\n\n    const wsUrl = this._network.config.ws\n\n    if (this._wsAvailable && wsUrl) {\n      this._log(`Connecting WebSocket to ${wsUrl}`)\n      this._connectWs(wsUrl)\n    } else {\n      this._log('WebSocket unavailable — starting block polling fallback')\n      this._startPolling()\n    }\n  }\n\n  /**\n   * Close the connection and clean up all timers.  After calling this the\n   * manager must not be reused — create a fresh instance instead.\n   */\n  dispose(): void {\n    if (this._disposed) return\n    this._disposed = true\n    this._log('Disposing KleverEventManager')\n    this._teardown()\n  }\n\n  /** Whether the WebSocket connection is currently open */\n  get isConnected(): boolean {\n    return this._wsConnected\n  }\n\n  /** Whether the manager is using polling (as opposed to WebSocket) */\n  get isPolling(): boolean {\n    return this._poller !== null\n  }\n\n  private _connectWs(url: string): void {\n    if (this._disposed) return\n\n    try {\n      const ws = new globalThis.WebSocket(url)\n      this._ws = ws\n\n      this._wsConnectTimer = setTimeout(() => {\n        this._wsConnectTimer = null\n        if (!this._wsConnected && this._ws === ws) {\n          this._log(`WebSocket connection timed out after ${WS_CONNECT_TIMEOUT_MS}ms`)\n          ws.onopen = null\n          ws.onerror = null\n          ws.onclose = null\n          ws.close()\n          this._ws = null\n          if (!this._disposed) this._scheduleReconnect(url)\n        }\n      }, WS_CONNECT_TIMEOUT_MS)\n\n      ws.onopen = () => {\n        if (this._wsConnectTimer !== null) {\n          clearTimeout(this._wsConnectTimer)\n          this._wsConnectTimer = null\n        }\n        if (this._disposed) {\n          ws.close()\n          return\n        }\n        this._wsConnected = true\n        this._reconnectAttempts = 0\n        this._log('WebSocket connected')\n\n        // Send the initial subscription message.\n        ws.send(buildSubscribeMessage([]))\n\n        this._safeEmit('connect', undefined)\n      }\n\n      ws.onmessage = (event: MessageEvent<string>) => {\n        this._handleWsMessage(event.data)\n      }\n\n      ws.onerror = (event: Event) => {\n        if (this._wsConnectTimer !== null) {\n          clearTimeout(this._wsConnectTimer)\n          this._wsConnectTimer = null\n        }\n        this._log(`WebSocket error: ${event.type}`)\n        // ErrorEvent is a browser-only global; guard against it being absent in\n        // Node.js environments (e.g. during tests or server-side rendering).\n        const errorEventMessage =\n          typeof ErrorEvent !== 'undefined' && event instanceof ErrorEvent\n            ? event.message\n            : undefined\n        this._safeEmit('error', {\n          code: 'WS_ERROR',\n          message: 'WebSocket connection error',\n          originalError: errorEventMessage !== undefined ? new Error(errorEventMessage) : undefined,\n        })\n\n        // Node.js 22+ native WebSocket does not always fire `onclose` after\n        // `onerror` on a failed connection attempt (unlike browsers).  When the\n        // connection was never established, trigger the reconnect logic here to\n        // avoid getting stuck with no polling fallback.\n        if (!this._wsConnected && !this._disposed) {\n          this._ws = null\n          this._scheduleReconnect(url)\n        }\n      }\n\n      ws.onclose = (event: CloseEvent) => {\n        if (this._wsConnectTimer !== null) {\n          clearTimeout(this._wsConnectTimer)\n          this._wsConnectTimer = null\n        }\n        // Guard: if onerror already cleaned up (Node.js behaviour), skip\n        if (this._ws !== ws) return\n        this._ws = null\n        this._wsConnected = false\n        this._log(`WebSocket closed: code=${event.code} reason=${event.reason}`)\n\n        if (!this._disposed) {\n          this._safeEmit('disconnect', undefined)\n          this._scheduleReconnect(url)\n        }\n      }\n    } catch (err) {\n      this._log(`Failed to create WebSocket: ${String(err)}`)\n      this._safeEmit('error', {\n        code: 'WS_INIT_FAILED',\n        message: `Failed to create WebSocket: ${err instanceof Error ? err.message : String(err)}`,\n        originalError: err instanceof Error ? err : undefined,\n      })\n      // Fall back to polling\n      this._wsAvailable = false\n      this._startPolling()\n    }\n  }\n\n  private _handleWsMessage(raw: string): void {\n    let parsed: WsEventMessage\n\n    try {\n      parsed = JSON.parse(raw) as WsEventMessage\n    } catch {\n      this._log(`Failed to parse WS message: ${raw}`)\n      return\n    }\n\n    if (parsed === null || typeof parsed !== 'object' || typeof parsed.type !== 'string') {\n      this._log(`Dropping malformed WS frame: ${raw}`)\n      return\n    }\n\n    const providerEvent = WS_TYPE_TO_PROVIDER_EVENT[parsed.type as WsEventType]\n\n    if (!providerEvent) {\n      this._log(`Ignoring unknown WS event type: ${parsed.type}`)\n      return\n    }\n\n    if (providerEvent === 'block') {\n      const blockData =\n        typeof parsed.data === 'object' && parsed.data !== null\n          ? (parsed.data as Record<string, unknown>)\n          : undefined\n      const blockNumber = blockData?.['nonce']\n\n      if (typeof blockNumber !== 'number') {\n        this._log(`Dropping malformed block frame: ${raw}`)\n        return\n      }\n\n      const hash = blockData?.['hash'] ?? parsed.hash\n      const timestamp = blockData?.['timestamp']\n\n      this._safeEmit('block', {\n        blockNumber,\n        ...(typeof hash === 'string' && { hash }),\n        ...(typeof timestamp === 'number' && { timestamp }),\n      })\n      return\n    }\n\n    if (providerEvent === 'pending') {\n      const txData =\n        typeof parsed.data === 'object' && parsed.data !== null\n          ? (parsed.data as Record<string, unknown>)\n          : undefined\n      const txHash = txData?.['hash'] ?? parsed.hash\n      const txFrom = txData?.['sender'] ?? parsed.address\n\n      if (typeof txHash !== 'string' || typeof txFrom !== 'string') {\n        this._log(`Dropping malformed pending frame: ${raw}`)\n        return\n      }\n\n      this._safeEmit('pending', {\n        hash: txHash,\n        from: txFrom,\n      })\n    }\n  }\n\n  private _scheduleReconnect(url: string): void {\n    if (this._disposed) return\n    if (this._reconnectAttempts >= RECONNECT_MAX_ATTEMPTS) {\n      this._log(\n        `Max reconnect attempts (${RECONNECT_MAX_ATTEMPTS}) reached — falling back to polling`,\n      )\n      this._startPolling()\n      return\n    }\n\n    const delay = Math.min(\n      RECONNECT_BASE_DELAY_MS * Math.pow(2, this._reconnectAttempts),\n      RECONNECT_MAX_DELAY_MS,\n    )\n    this._reconnectAttempts++\n    this._log(\n      `Reconnecting in ${delay}ms (attempt ${this._reconnectAttempts}/${RECONNECT_MAX_ATTEMPTS})`,\n    )\n\n    this._reconnectTimer = setTimeout(() => {\n      this._reconnectTimer = null\n      if (!this._disposed) {\n        this._connectWs(url)\n      }\n    }, delay)\n  }\n\n  private _startPolling(): void {\n    if (this._poller) return // already polling\n    this._log('Starting block polling fallback')\n    this._poller = createBlockPoller(\n      this._fetchBlockNumber,\n      (blockNumber) => {\n        this._safeEmit('block', { blockNumber })\n      },\n      (err) => {\n        this._safeEmit('error', {\n          code: 'POLL_ERROR',\n          message: `Block polling error: ${err.message}`,\n          originalError: err,\n        })\n      },\n    )\n    this._safeEmit('connect', undefined)\n  }\n\n  private _teardown(): void {\n    if (this._wsConnectTimer !== null) {\n      clearTimeout(this._wsConnectTimer)\n      this._wsConnectTimer = null\n    }\n\n    if (this._reconnectTimer !== null) {\n      clearTimeout(this._reconnectTimer)\n      this._reconnectTimer = null\n    }\n\n    if (this._wsConnected || this._poller !== null) {\n      this._safeEmit('disconnect', undefined)\n    }\n\n    if (this._ws) {\n      // Remove handlers before closing to prevent the onclose handler from\n      // scheduling yet another reconnect during teardown.\n      this._ws.onopen = null\n      this._ws.onmessage = null\n      this._ws.onerror = null\n      this._ws.onclose = null\n      if (this._ws.readyState === WebSocket.OPEN || this._ws.readyState === WebSocket.CONNECTING) {\n        this._ws.close(1000, 'dispose')\n      }\n      this._ws = null\n    }\n\n    this._wsConnected = false\n\n    if (this._poller) {\n      this._poller.stop()\n      this._poller = null\n    }\n  }\n  private _safeEmit<K extends keyof ProviderEventMap>(event: K, data: ProviderEventMap[K]): void {\n    try {\n      this._emitter.emit(event, data)\n    } catch (err) {\n      this._log(`Listener threw for event \"${String(event)}\": ${String(err)}`)\n    }\n  }\n\n  private _log(message: string): void {\n    if (this._debug) {\n      console.log(`[KleverEventManager] ${message}`)\n    }\n  }\n}\n","import type { KleverAddress, TransactionHash } from '@klever/connect-core'\nimport {\n  isValidAddress,\n  ValidationError,\n  NetworkError,\n  TransactionError,\n} from '@klever/connect-core'\nimport type { ProviderConfig, ProviderConfigObject } from './types/provider'\nimport type { Network, NetworkName } from './types'\nimport type {\n  IAccount,\n  IAssetBalance,\n  ApiResponse,\n  AddressResponse,\n  ITransactionResponse,\n  IBlockResponse,\n  IBroadcastResult,\n  IBulkBroadcastResult,\n  IContractQueryParams,\n  IContractQueryResult,\n  IFaucetResult,\n  IReceipt,\n  ITransactionApiResponse,\n  IBroadcastResponse,\n  IContractQueryResponse,\n  IFaucetResponse,\n  IFeesResponse,\n} from './types/api-types'\nimport { TransactionStatus } from './types/api-types'\nimport { NETWORKS, DEFAULT_NETWORK } from './networks'\nimport { HttpClient } from './http-client'\nimport { SimpleCache } from './cache'\nimport type {\n  BlockIdentifier,\n  IProvider,\n  ProviderEventMap,\n  BuildTransactionRequest,\n  BuildTransactionResponse,\n} from './types/types'\nimport { TypedEventEmitter } from './event-emitter'\nimport { KleverEventManager } from './provider-events'\n\n/**\n * Klever blockchain provider with built-in caching and retry capabilities\n *\n * @example\n * ```typescript\n * // Default mainnet\n * const provider = new KleverProvider()\n *\n * // Named network (simple)\n * const provider = new KleverProvider('testnet')\n * const provider = new KleverProvider('mainnet')\n *\n * // Named network (config object)\n * const provider = new KleverProvider({ network: 'testnet' })\n *\n * // Custom network (shorthand)\n * const provider = new KleverProvider({\n *   url: 'https://custom-node.com',\n *   chainId: '100'\n * })\n *\n * // Custom network (full)\n * const provider = new KleverProvider({\n *   network: createCustomNetwork({\n *     api: 'https://api.custom.com',\n *     node: 'https://node.custom.com',\n *     chainId: '100'\n *   })\n * })\n *\n * // Advanced usage with caching and retry\n * const provider = new KleverProvider({\n *   network: 'mainnet',\n *   cache: { ttl: 15000, maxSize: 100 },\n *   retry: { maxRetries: 3, backoff: 'exponential' },\n *   debug: true\n * })\n * ```\n */\nexport class KleverProvider implements IProvider {\n  readonly network: Network\n  protected apiClient: HttpClient\n  protected nodeClient: HttpClient\n  protected cache?: SimpleCache<unknown>\n  protected readonly debug: boolean\n\n  /** Internal typed event emitter shared across the provider */\n  private readonly _emitter: TypedEventEmitter<ProviderEventMap>\n  /** WebSocket / polling manager (created lazily on first connect()) call) */\n  private _eventManager: KleverEventManager | null = null\n\n  /**\n   * Creates a new KleverProvider instance\n   *\n   * @param config - Provider configuration options\n   * Can be:\n   * - undefined: Uses mainnet\n   * - A network name: 'mainnet', 'testnet', 'devnet', 'local'\n   * - A config object with network or custom URL\n   */\n  constructor(config?: ProviderConfig) {\n    // Normalize config to ProviderConfigObject\n    const normalizedConfig = this.normalizeConfig(config)\n\n    // Resolve network configuration\n    this.network = this.resolveNetwork(normalizedConfig)\n\n    this.debug = normalizedConfig.debug ?? false\n\n    // Set up HTTP clients\n    const httpClientConfig = {\n      baseUrl: this.network.config.api ?? 'http://localhost:8080',\n      ...(normalizedConfig.timeout !== undefined && { timeout: normalizedConfig.timeout }),\n      ...(normalizedConfig.headers !== undefined && { headers: normalizedConfig.headers }),\n      retries: normalizedConfig.retry === false ? 0 : (normalizedConfig.retry?.maxRetries ?? 3),\n    }\n    this.apiClient = new HttpClient(httpClientConfig)\n\n    const nodeClientConfig = {\n      baseUrl: this.network.config.node ?? this.network.config.api ?? 'http://localhost:8080',\n      ...(normalizedConfig.timeout !== undefined && { timeout: normalizedConfig.timeout }),\n      ...(normalizedConfig.headers !== undefined && { headers: normalizedConfig.headers }),\n      retries: normalizedConfig.retry === false ? 0 : (normalizedConfig.retry?.maxRetries ?? 3),\n    }\n    this.nodeClient = new HttpClient(nodeClientConfig)\n\n    // Set up cache if enabled\n    if (normalizedConfig.cache !== false) {\n      this.cache = new SimpleCache(normalizedConfig.cache ?? {})\n    }\n\n    this._emitter = new TypedEventEmitter<ProviderEventMap>()\n\n    if (this.debug) {\n      console.log(`[KleverProvider] Initialized with network: ${this.network.name}`)\n    }\n  }\n\n  /**\n   * Normalize config input to ProviderConfigObject\n   */\n  private normalizeConfig(config?: ProviderConfig): ProviderConfigObject {\n    // If undefined, return empty config (will use defaults)\n    if (config === undefined) {\n      return {}\n    }\n\n    // If string, treat as network name\n    if (typeof config === 'string') {\n      return { network: config }\n    }\n\n    // Otherwise, it's already a config object\n    return config\n  }\n\n  /**\n   * Resolve network from config\n   */\n  private resolveNetwork(config: ProviderConfigObject): Network {\n    let network: Network\n\n    // If url and chainId provided, create custom network\n    if (config.url && config.chainId) {\n      network = {\n        name: 'custom',\n        chainId: config.chainId,\n        config: {\n          api: config.url,\n          node: config.url,\n        },\n        isTestnet: true,\n        nativeCurrency: {\n          name: 'Klever',\n          symbol: 'KLV',\n          decimals: 6,\n        },\n      }\n    } else if (config.network) {\n      // If network is a string (network name)\n      if (typeof config.network === 'string') {\n        const networkName = config.network\n        const resolved = NETWORKS[networkName]\n        if (!resolved) {\n          throw new ValidationError(`Unknown network: ${config.network}`, {\n            network: config.network,\n          })\n        }\n        network = resolved\n      } else {\n        // It's a Network object\n        network = config.network\n      }\n    } else {\n      // Default to mainnet\n      network = NETWORKS[DEFAULT_NETWORK]\n    }\n\n    // Apply custom WebSocket URL if provided, overriding the network default\n    if (config.ws !== undefined) {\n      network = {\n        ...network,\n        config: { ...network.config, ws: config.ws },\n      }\n    }\n\n    return network\n  }\n\n  /**\n   * Retrieves account information from the blockchain\n   *\n   * @param address - The Klever address to query\n   * @param options - Additional options\n   * @returns Account information including balance and assets\n   * @throws {Error} If the address is invalid\n   *\n   * @example\n   * ```typescript\n   * const account = await provider.getAccount('klv1...')\n   * console.log('Balance:', account.balance)\n   * console.log('Assets:', account.assets)\n   * ```\n   */\n  async getAccount(address: KleverAddress, options?: { skipCache?: boolean }): Promise<IAccount> {\n    if (!isValidAddress(address)) {\n      throw new ValidationError(`Invalid address: ${address}`, { address })\n    }\n\n    const cacheKey = `account:${address}`\n\n    // Check cache first\n    if (!options?.skipCache && this.cache) {\n      const cached = this.cache.get(cacheKey)\n      if (cached) {\n        return cached as IAccount\n      }\n    }\n\n    const response = await this.apiClient.get<ApiResponse<AddressResponse>>(\n      `/v1.0/address/${address}`,\n    )\n\n    if (response.error) {\n      throw new NetworkError(response.error, { address, endpoint: '/v1.0/address' })\n    }\n\n    const apiAccount = response.data.account\n    if (!apiAccount) {\n      throw new NetworkError('Account not found', { address })\n    }\n\n    // Convert API response to IAccount format\n    const assets: IAssetBalance[] = Object.entries(apiAccount.assets || {}).map(\n      ([assetId, assetData]) => ({\n        address: assetData.address,\n        assetId,\n        collection: assetData.collection,\n        nftNonce: assetData.nftNonce,\n        assetName: assetData.assetName,\n        assetType: assetData.assetType,\n        balance: BigInt(assetData.balance || 0),\n        precision: assetData.precision,\n        frozenBalance: BigInt(assetData.frozenBalance || 0),\n        unfrozenBalance: BigInt(assetData.unfrozenBalance || 0),\n        lastClaim: assetData.lastClaim,\n        buckets: (assetData.buckets || []).map((bucket) => ({\n          id: bucket.id,\n          stakedAt: bucket.stakeAt,\n          stakedEpoch: bucket.stakedEpoch,\n          unstakedEpoch: bucket.unstakedEpoch,\n          balance: BigInt(bucket.balance || 0),\n          delegation: bucket.delegation,\n          validatorName: bucket.validatorName,\n        })),\n        metadata: assetData.metadata,\n        mime: assetData.mime,\n        marketplaceId: assetData.marketplaceId,\n        orderId: assetData.orderId,\n        stakingType: assetData.stakingType,\n      }),\n    )\n\n    const account: IAccount = {\n      address: apiAccount.address,\n      balance: BigInt(apiAccount.balance),\n      nonce: apiAccount.nonce,\n      assets,\n    }\n\n    // Cache the result\n    if (this.cache) {\n      this.cache.set(cacheKey, account)\n    }\n\n    return account\n  }\n\n  /**\n   * Get the current nonce for an address\n   * Convenience method that extracts nonce from getAccount\n   *\n   * @param address - Klever address\n   * @returns Current nonce value\n   *\n   * @example\n   * ```typescript\n   * const nonce = await provider.getNonce('klv1...')\n   * console.log('Current nonce:', nonce)\n   * ```\n   */\n  async getNonce(address: KleverAddress): Promise<number> {\n    const account = await this.getAccount(address)\n    return account.nonce\n  }\n\n  /**\n   * Get balance for a specific token\n   *\n   * @param address - Klever address\n   * @param token - Token identifier (e.g., 'KLV', 'KDA-ABC123')\n   * @returns Balance as bigint\n   *\n   * @example\n   * ```typescript\n   * const balance = await provider.getBalance('klv1...', 'KLV')\n   * console.log(`Balance: ${balance}`)\n   * ```\n   */\n  async getBalance(address: KleverAddress, token = 'KLV'): Promise<bigint> {\n    const account = await this.getAccount(address)\n\n    if (token === 'KLV') {\n      return account.balance\n    }\n\n    const asset = account.assets?.find((a) => a.assetId === token)\n    return asset?.balance ?? 0n\n  }\n\n  /**\n   * Retrieves transaction information by hash\n   *\n   * @param hash - The transaction hash (as TransactionHash branded type or string)\n   * @param options - Additional options\n   * @returns Transaction details including receipts, or null if not found\n   * @throws {NetworkError} If there's a network error\n   *\n   * @example\n   * ```typescript\n   * const tx = await provider.getTransaction('0x123...')\n   * if (tx) {\n   *   console.log('Status:', tx.status)\n   *   console.log('Block:', tx.blockNum)\n   *   console.log('From:', tx.sender)\n   *   console.log('Receipts:', tx.receipts)\n   * }\n   * ```\n   */\n  async getTransaction(\n    hash: TransactionHash | string,\n    options?: { skipCache?: boolean },\n  ): Promise<ITransactionResponse | null> {\n    const cacheKey = `tx:${hash}`\n\n    if (!options?.skipCache && this.cache) {\n      const cached = this.cache.get(cacheKey)\n      if (cached) {\n        return cached as ITransactionResponse\n      }\n    }\n\n    const response = await this.apiClient.get<ApiResponse<ITransactionApiResponse>>(\n      `/v1.0/transaction/${hash}?withResults=true`,\n    )\n\n    if (response.error || !response.data?.transaction) {\n      throw new NetworkError(response.error || 'Transaction not found', { hash })\n    }\n\n    const transaction = response.data.transaction\n\n    if (this.cache) {\n      this.cache.set(cacheKey, transaction)\n    }\n\n    return transaction\n  }\n\n  /**\n   * Retrieves transaction receipt(s) by hash\n   *\n   * Receipts contain detailed information about what happened during transaction execution,\n   * including transfers, freezes, claims, and other operations.\n   *\n   * @param hash - The transaction hash (as TransactionHash branded type or string)\n   * @returns Array of receipts or null if transaction not found\n   *\n   * @example\n   * ```typescript\n   * // Get receipts after transaction is mined\n   * const receipts = await provider.getTransactionReceipt(txHash)\n   * if (receipts) {\n   *   console.log(`Transaction has ${receipts.length} receipt(s)`)\n   *   receipts.forEach(receipt => {\n   *     console.log(`Type: ${receipt.typeString}, Asset: ${receipt.assetId}`)\n   *   })\n   * }\n   *\n   * // Parse receipts with type-safe parsers\n   * import { parseReceipt } from '@klever/connect-provider'\n   * const tx = await provider.getTransaction(txHash)\n   * if (tx) {\n   *   const freezeData = parseReceipt.freeze(tx)\n   *   console.log(`Bucket ID: ${freezeData.bucketId}`)\n   * }\n   * ```\n   */\n  async getTransactionReceipt(hash: TransactionHash | string): Promise<IReceipt[] | null> {\n    const tx = await this.getTransaction(hash)\n    if (!tx) {\n      return null\n    }\n\n    return tx.receipts ?? []\n  }\n\n  /**\n   * Broadcasts a single signed transaction to the network\n   *\n   * @param tx - The signed transaction data\n   * @returns Broadcast result with transaction hash\n   *\n   * @example\n   * ```typescript\n   * const result = await provider.broadcastTransaction(signedTx)\n   * console.log(result.hash) // Transaction hash\n   * ```\n   */\n  async broadcastTransaction(tx: unknown): Promise<IBroadcastResult> {\n    const response = await this.nodeClient.post<IBroadcastResponse>('/transaction/broadcast', {\n      txs: [tx],\n    })\n\n    if (response.error) {\n      throw new TransactionError(response.error || 'Broadcast failed', { tx })\n    }\n\n    // Extract single hash from response\n    const hash =\n      (response.data?.txsHashes && response.data.txsHashes.length > 0\n        ? response.data.txsHashes[0]\n        : response.data?.txHash) ?? ''\n\n    // Validate that we got a hash\n    if (!hash) {\n      throw new TransactionError(\n        response.message || 'Broadcast succeeded but no transaction hash was returned',\n        { response },\n      )\n    }\n\n    return {\n      hash,\n      ...(response.code !== undefined && { code: response.code }),\n      ...(response.message !== undefined && { message: response.message }),\n    }\n  }\n\n  /**\n   * Broadcasts multiple signed transactions to the network in a single batch\n   *\n   * @param txs - Array of signed transaction data\n   * @returns Broadcast result with array of transaction hashes\n   *\n   * @example\n   * ```typescript\n   * const result = await provider.broadcastTransactions([tx1, tx2, tx3])\n   * console.log(result.hashes) // ['hash1', 'hash2', 'hash3']\n   * ```\n   */\n  async broadcastTransactions(txs: unknown[]): Promise<IBulkBroadcastResult> {\n    if (txs.length === 0) {\n      throw new ValidationError('At least one transaction is required')\n    }\n\n    const response = await this.nodeClient.post<IBroadcastResponse>('/transaction/broadcast', {\n      txs,\n    })\n\n    if (response.error) {\n      throw new TransactionError(response.error || 'Broadcast failed', { txs })\n    }\n\n    const hashes = response.data?.txsHashes ?? []\n    if (hashes.length === 0 && response.data?.txHash) {\n      // Fallback for single transaction response format\n      hashes.push(response.data.txHash)\n    }\n\n    // Validate that we got hashes\n    if (hashes.length === 0) {\n      throw new Error(\n        response.message || 'Broadcast succeeded but no transaction hashes were returned',\n      )\n    }\n\n    return {\n      hashes,\n      ...(response.code !== undefined && { code: response.code }),\n      ...(response.message !== undefined && { message: response.message }),\n    }\n  }\n\n  /**\n   * Queries a smart contract (read-only, no gas cost)\n   *\n   * Contract queries are free and don't require signing or broadcasting.\n   * Use this to read contract state or call view functions.\n   *\n   * @param params - Contract query parameters\n   * @returns Query result with return data and status\n   *\n   * @example\n   * ```typescript\n   * // Query contract balance\n   * const result = await provider.queryContract({\n   *   scAddress: 'klv1contract...',\n   *   funcName: 'getBalance',\n   *   args: ['klv1user...']\n   * })\n   *\n   * if (result.error) {\n   *   console.error('Query failed:', result.error)\n   * } else {\n   *   console.log('Return data:', result.data?.returnData)\n   *   console.log('Gas remaining:', result.data?.gasRemaining)\n   * }\n   * ```\n   */\n  async queryContract(params: IContractQueryParams): Promise<IContractQueryResult> {\n    const response = await this.apiClient.post<IContractQueryResponse>('/sc/query', params)\n\n    if (response.error) {\n      const errorResult: IContractQueryResult = {\n        error: response.error,\n      }\n      if (response.code !== undefined) errorResult.code = response.code\n      return errorResult\n    }\n\n    const result: IContractQueryResult = {\n      data: {\n        ...(response.data?.returnData !== undefined && { returnData: response.data.returnData }),\n        ...(response.data?.returnCode !== undefined && { returnCode: response.data.returnCode }),\n        ...(response.data?.returnMessage !== undefined && {\n          returnMessage: response.data.returnMessage,\n        }),\n        ...(response.data?.gasRemaining !== undefined && {\n          gasRemaining: BigInt(response.data.gasRemaining),\n        }),\n        ...(response.data?.gasRefund !== undefined && {\n          gasRefund: BigInt(response.data.gasRefund),\n        }),\n      },\n    }\n    return result\n  }\n\n  /**\n   * Requests test KLV from faucet (testnet/devnet only)\n   *\n   * @param address - The address to send test KLV to\n   * @param amount - Optional amount to request (in smallest unit)\n   * @returns Faucet result with transaction hash and status\n   * @throws {ValidationError} If address is invalid or network is mainnet\n   *\n   * @example\n   * ```typescript\n   * // Request test KLV on testnet\n   * const provider = new KleverProvider('testnet')\n   * const result = await provider.requestTestKLV('klv1...')\n   * console.log('Faucet TX:', result.txHash)\n   * console.log('Status:', result.status)\n   *\n   * // Wait for confirmation\n   * await provider.waitForTransaction(result.txHash)\n   * const balance = await provider.getBalance('klv1...')\n   * console.log('New balance:', balance)\n   * ```\n   */\n  async requestTestKLV(address: KleverAddress, amount?: bigint): Promise<IFaucetResult> {\n    if (!isValidAddress(address)) {\n      throw new ValidationError(`Invalid address: ${address}`, { address })\n    }\n\n    if (!this.network.isTestnet) {\n      throw new ValidationError('Faucet is not available on mainnet', {\n        network: this.network.chainId,\n      })\n    }\n\n    const response = await this.apiClient.post<IFaucetResponse>(\n      `/v1.0/transaction/send-user-funds/${address}`,\n      amount ? { amount: amount.toString() } : undefined,\n    )\n\n    return {\n      txHash: response.data?.txHash ?? '',\n      status: response.data?.status ?? 'pending',\n    }\n  }\n\n  /**\n   * Clear all cached data\n   */\n  clearCache(): void {\n    this.cache?.clear()\n    if (this.debug) {\n      console.log('[KleverProvider] Cache cleared')\n    }\n  }\n\n  /**\n   * Get the full URL for viewing a transaction in the explorer\n   * @param txHash - The transaction hash (as TransactionHash branded type or string)\n   * @returns The full URL to view the transaction\n   *\n   * @example\n   * ```typescript\n   * const txUrl = provider.getTransactionUrl('0x123...')\n   * console.log(txUrl) // https://kleverscan.org/transaction/0x123...\n   * ```\n   */\n  getTransactionUrl(txHash: TransactionHash | string): string {\n    return `${this.network.config.explorer}/transaction/${txHash}`\n  }\n\n  /**\n   * Get the network name\n   */\n  getNetworkName(): NetworkName {\n    return this.network.name\n  }\n\n  /**\n   * Get the network object\n   */\n  getNetwork(): Network {\n    return this.network\n  }\n\n  /**\n   * Get the current block number (nonce) from the blockchain\n   * @returns Current block nonce\n   */\n  async getBlockNumber(): Promise<number> {\n    try {\n      const response = await this.nodeClient.get<{\n        data?: {\n          overview?: {\n            nonce: number\n          }\n        }\n        error?: string\n      }>('/node/overview')\n\n      if (response.error || !response.data?.overview?.nonce) {\n        throw new NetworkError(response.error || 'Failed to fetch block number')\n      }\n\n      return response.data.overview.nonce\n    } catch (error) {\n      throw new NetworkError(\n        `Failed to get block number: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        { originalError: error },\n      )\n    }\n  }\n\n  /**\n   * Get block by nonce, hash, or \"latest\"\n   * @param blockHashOrNumber - Block nonce (number), hash (string), or \"latest\"\n   * @returns Block information\n   */\n  async getBlock(blockHashOrNumber: BlockIdentifier): Promise<IBlockResponse | null> {\n    try {\n      let endpoint: string\n\n      if (blockHashOrNumber === 'latest') {\n        // First get current nonce, then fetch by nonce\n        const currentNonce = await this.getBlockNumber()\n        endpoint = `/block/by-nonce/${currentNonce}`\n      } else if (typeof blockHashOrNumber === 'number') {\n        // Fetch by nonce\n        endpoint = `/block/by-nonce/${blockHashOrNumber}`\n      } else {\n        // Fetch by hash\n        endpoint = `/block/by-hash/${blockHashOrNumber}`\n      }\n\n      const response = await this.apiClient.get<{\n        data?: {\n          block?: IBlockResponse\n        }\n        error?: string\n        code?: string\n      }>(endpoint)\n\n      if (response.error || !response.data?.block) {\n        if (this.debug) {\n          console.log(`[KleverProvider] Block not found: ${response.error || 'No block data'}`)\n        }\n        return null\n      }\n\n      return response.data.block\n    } catch (error) {\n      // Handle 404 and 500 errors for non-existent blocks gracefully\n      if (\n        error instanceof Error &&\n        (error.message.includes('HTTP 500') || error.message.includes('HTTP 404'))\n      ) {\n        if (this.debug) {\n          console.log(`[KleverProvider] Block not found: ${error.message}`)\n        }\n        return null\n      }\n\n      if (this.debug) {\n        console.error('[KleverProvider] Error fetching block:', error)\n      }\n      throw new NetworkError(\n        `Failed to fetch block: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        { blockHashOrNumber, originalError: error },\n      )\n    }\n  }\n\n  /**\n   * Estimates the fee for a transaction\n   *\n   * TODO: Implementation pending - currently returns zero fees\n   *\n   * This method will calculate the expected fees for a transaction including:\n   * - kAppFee: Application-specific fee\n   * - bandwidthFee: Network bandwidth cost\n   * - gasEstimated: Estimated gas for smart contract execution\n   *\n   * @param _tx - The transaction request to estimate fees for\n   * @returns The estimated fee breakdown\n   *\n   * @example\n   * ```typescript\n   * // Future usage (not yet implemented)\n   * const fees = await provider.estimateFee({\n   *   sender: 'klv1...',\n   *   contracts: [{\n   *     type: TXType.Transfer,\n   *     parameter: { receiver: 'klv1...', amount: 1000000n }\n   *   }]\n   * })\n   * console.log('Estimated kAppFee:', fees.kAppFee)\n   * console.log('Estimated bandwidthFee:', fees.bandwidthFee)\n   * ```\n   */\n  estimateFee(_tx: unknown): Promise<IFeesResponse> {\n    // TODO: Implement fee estimation\n    return Promise.resolve({\n      kAppFee: 0,\n      bandwidthFee: 0,\n      gasEstimated: 0,\n      safetyMargin: 0,\n      gasMultiplier: 0,\n      returnMessage: '',\n      kdaFee: {\n        kda: new Uint8Array(),\n        amount: 0,\n      },\n    })\n  }\n\n  /**\n   * Parse raw transaction data to a format suitable for broadcasting\n   * Supports hex strings, JSON strings, Uint8Arrays, and transaction objects\n   * @private\n   * @throws {Error} If the transaction data is invalid\n   */\n  private parseRawTransaction(tx: string | Uint8Array | unknown): unknown {\n    if (typeof tx === 'string') {\n      // Try to parse as JSON first\n      try {\n        return JSON.parse(tx)\n      } catch {\n        // If parsing fails, parse from hex to bytes\n        const hex = tx.startsWith('0x') ? tx.slice(2) : tx\n\n        // Validate hex string\n        if (!/^[0-9a-fA-F]*$/.test(hex)) {\n          throw new ValidationError('Invalid transaction data: not valid JSON or hex string', {\n            tx,\n          })\n        }\n\n        const bytes = hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16))\n        if (!bytes || bytes.length === 0) {\n          throw new ValidationError('Invalid transaction data: empty hex string')\n        }\n\n        return new Uint8Array(bytes)\n      }\n    } else if (tx instanceof Uint8Array) {\n      if (tx.length === 0) {\n        throw new ValidationError('Invalid transaction data: empty Uint8Array')\n      }\n      return tx\n    } else {\n      // Assume it's already a transaction object\n      return tx\n    }\n  }\n\n  /**\n   * Sends a single raw transaction to the network\n   * @param signedTx - Signed transaction data (hex string, JSON string, Uint8Array, or Transaction object)\n   * @returns The transaction hash\n   * @throws {Error} If the transaction data is invalid, broadcast fails, or no hash is returned\n   *\n   * @example\n   * ```typescript\n   * try {\n   *   const hash = await provider.sendRawTransaction(signedTxHex)\n   *   console.log(hash) // '0x123...'\n   * } catch (error) {\n   *   console.error('Broadcast failed:', error.message)\n   * }\n   * ```\n   */\n  async sendRawTransaction(signedTx: string | Uint8Array | unknown): Promise<TransactionHash> {\n    const txData = this.parseRawTransaction(signedTx)\n    const result = await this.broadcastTransaction(txData)\n\n    // Check for error codes even if we got a hash\n    // Some APIs may return partial success with warnings\n    if (result.code && result.code !== '0' && result.code !== 'successful') {\n      throw new TransactionError(\n        result.message || `Transaction broadcast returned error code: ${result.code}`,\n        { code: result.code, message: result.message },\n      )\n    }\n\n    return result.hash as TransactionHash\n  }\n\n  /**\n   * Sends multiple raw transactions to the network in a single batch\n   * @param signedTxs - Array of signed transaction data (hex strings, JSON strings, Uint8Arrays, or Transaction objects)\n   * @returns Array of transaction hashes\n   * @throws {Error} If any transaction data is invalid, broadcast fails, or no hashes are returned\n   *\n   * @example\n   * ```typescript\n   * try {\n   *   const hashes = await provider.sendRawTransactions([tx1Hex, tx2Hex, tx3Hex])\n   *   console.log(hashes) // ['0x123...', '0x456...', '0x789...']\n   * } catch (error) {\n   *   console.error('Broadcast failed:', error.message)\n   * }\n   * ```\n   */\n  async sendRawTransactions(\n    signedTxs: (string | Uint8Array | unknown)[],\n  ): Promise<TransactionHash[]> {\n    const txsData = signedTxs.map((tx) => this.parseRawTransaction(tx))\n    const result = await this.broadcastTransactions(txsData)\n\n    // Check for error codes even if we got hashes\n    // Some APIs may return partial success with warnings\n    if (result.code && result.code !== '0' && result.code !== 'successful') {\n      throw new TransactionError(\n        result.message || `Transaction broadcast returned error code: ${result.code}`,\n        { code: result.code, message: result.message },\n      )\n    }\n\n    return result.hashes as TransactionHash[]\n  }\n\n  /**\n   * Waits for a transaction to be mined and confirmed\n   * @param hash - The transaction hash (as TransactionHash branded type or string)\n   * @param confirmations - Number of confirmations to wait for (default: 1)\n   * @param onProgress - Optional callback for progress updates\n   * @returns The transaction or null if not found/timeout\n   *\n   * @example\n   * ```typescript\n   * // Basic usage\n   * const tx = await provider.waitForTransaction(hash)\n   *\n   * // With progress callback for UI updates\n   * const tx = await provider.waitForTransaction(hash, 3, (status, data) => {\n   *   if (status === 'pending') {\n   *     console.log(`Attempt ${data.attempts}/${data.maxAttempts}`)\n   *   } else if (status === 'confirming') {\n   *     console.log(`Confirmations: ${data.confirmations}/${data.required}`)\n   *   }\n   * })\n   * ```\n   */\n  waitForTransaction(\n    hash: TransactionHash | string,\n    confirmations?: number,\n    onProgress?: (\n      status: 'pending' | 'confirming' | 'failed' | 'timeout',\n      data: {\n        attempts: number\n        maxAttempts: number\n        confirmations?: number\n        required?: number\n        transaction?: ITransactionResponse\n      },\n    ) => void,\n  ): Promise<ITransactionResponse | null> {\n    const confirmationsToWait = confirmations ?? 1\n    const pollInterval = 3000 // 3 seconds\n    const maxAttempts = 40 // Max 2 minutes\n\n    let attempts = 0\n\n    return new Promise((resolve, reject) => {\n      const rejectWaitError = (error: unknown): void => {\n        clearInterval(interval)\n        reject(\n          new Error(\n            `Error while waiting for transaction: ${\n              error instanceof Error ? error.message : 'Unknown error'\n            }`,\n          ),\n        )\n      }\n\n      const handlePendingTransactionLookup = (): void => {\n        onProgress?.('pending', { attempts, maxAttempts })\n        if (attempts >= maxAttempts) {\n          clearInterval(interval)\n          onProgress?.('timeout', { attempts, maxAttempts })\n          resolve(null)\n        }\n      }\n\n      const checkTransaction = async (): Promise<void> => {\n        attempts++\n\n        let tx: ITransactionResponse | null\n        try {\n          tx = await this.getTransaction(hash, { skipCache: true })\n        } catch (error) {\n          if (this.isPendingTransactionLookupError(error)) {\n            handlePendingTransactionLookup()\n            return\n          }\n\n          rejectWaitError(error)\n          return\n        }\n\n        try {\n          // Transaction not found yet\n          if (!tx) {\n            onProgress?.('pending', { attempts, maxAttempts })\n            if (attempts >= maxAttempts) {\n              clearInterval(interval)\n              onProgress?.('timeout', { attempts, maxAttempts })\n              resolve(null) // Timeout - transaction not found\n            }\n            return\n          }\n\n          // Transaction is still pending\n          if (tx.status === TransactionStatus.Pending) {\n            onProgress?.('pending', { attempts, maxAttempts, transaction: tx })\n            if (attempts >= maxAttempts) {\n              clearInterval(interval)\n              onProgress?.('timeout', { attempts, maxAttempts, transaction: tx })\n              resolve(null) // Timeout - still pending\n            }\n            return\n          }\n\n          // Transaction failed - return immediately\n          if (tx.status === TransactionStatus.Failed) {\n            clearInterval(interval)\n            onProgress?.('failed', { attempts, maxAttempts, transaction: tx })\n            resolve(tx)\n            return\n          }\n\n          // Transaction succeeded - check confirmations if needed\n          if (confirmationsToWait > 1 && tx.blockNum) {\n            const currentBlock = await this.getBlockNumber()\n            const currentConfirmations = currentBlock - tx.blockNum + 1\n            onProgress?.('confirming', {\n              attempts,\n              maxAttempts,\n              confirmations: currentConfirmations,\n              required: confirmationsToWait,\n              transaction: tx,\n            })\n            if (currentConfirmations >= confirmationsToWait) {\n              clearInterval(interval)\n              resolve(tx)\n            }\n          } else {\n            // No confirmation requirement or only 1 confirmation needed\n            clearInterval(interval)\n            resolve(tx)\n          }\n        } catch (error) {\n          rejectWaitError(error)\n        }\n      }\n\n      // Fire immediately so a tx that's already mined doesn't wait a full interval.\n      void checkTransaction()\n\n      const interval = setInterval(() => {\n        void checkTransaction()\n      }, pollInterval)\n    })\n  }\n\n  private isPendingTransactionLookupError(error: unknown): boolean {\n    return error instanceof Error && error.message.includes('HTTP 404')\n  }\n\n  /**\n   * Subscribe to provider events\n   *\n   * Opens a WebSocket connection to the network's `ws` URL.  If WebSocket is unavailable in the\n   * current runtime, or if the network has no `ws` URL configured, the\n   * provider automatically falls back to polling the REST API for new blocks\n   * every 3 seconds.\n   *\n   * Safe to call multiple times — subsequent calls while already connected are\n   * no-ops.  To reconnect, call `disconnect()` first.\n   *\n   * @example\n   * ```typescript\n   * const provider = new KleverProvider('mainnet')\n   * provider.on('block', ({ blockNumber }) => console.log('New block:', blockNumber))\n   * provider.connect()\n   * ```\n   */\n  connect(): void {\n    if (this._eventManager) {\n      // Already connected or connecting — no-op\n      return\n    }\n\n    this._eventManager = new KleverEventManager(\n      this.network,\n      this._emitter,\n      () => this.getBlockNumber(),\n      this.debug,\n    )\n    this._eventManager.connect()\n\n    if (this.debug) {\n      console.log('[KleverProvider] Event manager started')\n    }\n  }\n\n  /**\n   * Stop real-time event subscription and release all associated resources\n   * (WebSocket, polling timers).\n   *\n   * After calling `disconnect()` you can call `connect()` again to re-establish\n   * the connection.\n   *\n   * @example\n   * ```typescript\n   * provider.disconnect()\n   * ```\n   */\n  disconnect(): void {\n    if (this._eventManager) {\n      this._eventManager.dispose()\n      this._eventManager = null\n    }\n\n    if (this.debug) {\n      console.log('[KleverProvider] Event manager stopped')\n    }\n  }\n\n  /**\n   * Register a persistent listener for a provider event.\n   *\n   * The provider emits the following typed events:\n   * - `'block'` — `BlockEventData` — new block produced\n   * - `'pending'` — `PendingEventData` — pending transaction in mempool\n   * - `'error'` — `ProviderError` — connection or polling error\n   * - `'debug'` — `DebugEvent` — internal diagnostic message\n   * - `'network'` — `NetworkChangeEvent` — active network changed\n   * - `'connect'` — `undefined` — WebSocket/polling connection established\n   * - `'disconnect'` — `undefined` — WebSocket/polling connection closed\n   *\n   * Note: You must call `connect()` to start receiving `'block'`, `'pending'`,\n   * `'connect'`, and `'disconnect'` events.  `'error'` and `'network'` events\n   * can fire without an active connection.\n   *\n   * @param event - The event name (key of ProviderEventMap)\n   * @param listener - Callback receiving the typed payload\n   *\n   * @example\n   * ```typescript\n   * provider.on('block', ({ blockNumber, hash }) => {\n   *   console.log(`New block #${blockNumber}: ${hash}`)\n   * })\n   *\n   * provider.on('error', ({ code, message }) => {\n   *   console.error(`Provider error [${code}]: ${message}`)\n   * })\n   *\n   * provider.connect()\n   * ```\n   */\n  on<K extends keyof ProviderEventMap>(\n    event: K,\n    listener: (data: ProviderEventMap[K]) => void,\n  ): void {\n    this._emitter.on(event, listener)\n  }\n\n  /**\n   * Remove a previously registered listener.\n   *\n   * Passing a listener reference that was never registered is a no-op.\n   *\n   * @param event - The event name\n   * @param listener - The exact callback reference that was passed to `on`/`once`\n   *\n   * @example\n   * ```typescript\n   * const handler = ({ blockNumber }: BlockEventData) => console.log(blockNumber)\n   * provider.on('block', handler)\n   * // ... later\n   * provider.off('block', handler)\n   * ```\n   */\n  off<K extends keyof ProviderEventMap>(\n    event: K,\n    listener: (data: ProviderEventMap[K]) => void,\n  ): void {\n    this._emitter.off(event, listener)\n  }\n\n  /**\n   * Register a one-time listener that is automatically removed after its\n   * first invocation.\n   *\n   * @param event - The event name\n   * @param listener - Callback receiving the typed payload\n   *\n   * @example\n   * ```typescript\n   * // Wait for the first block after connecting\n   * provider.once('block', ({ blockNumber }) => {\n   *   console.log('First block received:', blockNumber)\n   * })\n   * provider.connect()\n   * ```\n   */\n  once<K extends keyof ProviderEventMap>(\n    event: K,\n    listener: (data: ProviderEventMap[K]) => void,\n  ): void {\n    this._emitter.once(event, listener)\n  }\n\n  /**\n   * Remove all listeners for a specific event, or every listener across all\n   * events when called without arguments.\n   *\n   * @param event - Optional event name.  Omit to clear all events.\n   *\n   * @example\n   * ```typescript\n   * // Remove all 'block' listeners\n   * provider.removeAllListeners('block')\n   *\n   * // Remove every listener on the provider\n   * provider.removeAllListeners()\n   * ```\n   */\n  removeAllListeners<K extends keyof ProviderEventMap>(event?: K): void {\n    this._emitter.removeAllListeners(event)\n  }\n\n  /**\n   * Calls a contract method (generic API call)\n   *\n   * TODO: Implementation pending - generic contract calls not yet supported\n   *\n   * This is a low-level method for making arbitrary contract API calls.\n   * For standard contract queries, use `queryContract()` instead.\n   *\n   * @param _endpoint - The API endpoint for the contract call\n   * @param _params - The parameters for the contract call\n   * @returns The result of the contract call\n   *\n   * @example\n   * ```typescript\n   * // Future usage (not yet implemented)\n   * const result = await provider.call<ContractData>('/contract/endpoint', {\n   *   param1: 'value1',\n   *   param2: 123\n   * })\n   * ```\n   */\n  async call<T = unknown>(_endpoint: string, _params?: Record<string, unknown>): Promise<T> {\n    throw new Error('call() is not yet implemented')\n  }\n\n  /**\n   * Build transaction using node endpoint\n   * Node will handle nonce fetching (if missing), fee calculation, and proto encoding\n   *\n   * This method provides server-side transaction building where the node does the heavy lifting:\n   * - Fetches nonce if not provided\n   * - Calculates kAppFee and bandwidthFee\n   * - Encodes transaction to proto format\n   * - Returns proto transaction object and transaction hash\n   *\n   * @param request - Transaction build request with contracts and optional sender/nonce\n   * @returns Proto transaction object and transaction hash\n   *\n   * @example\n   * ```typescript\n   * const request = {\n   *   sender: 'klv1...',\n   *   contracts: [{\n   *     type: TXType.Transfer,\n   *     parameter: { receiver: 'klv1...', amount: 1000000n, kda: 'KLV' }\n   *   }]\n   * }\n   * const tx = await provider.buildTransaction(request)\n   * // tx.result contains proto transaction object (ITransaction)\n   * // tx.txHash contains the transaction hash\n   * ```\n   */\n  async buildTransaction(request: BuildTransactionRequest): Promise<BuildTransactionResponse> {\n    if (!request.contracts || request.contracts.length === 0) {\n      throw new ValidationError('At least one contract is required')\n    }\n\n    try {\n      const req: BuildTransactionRequest = { ...request }\n\n      // Auto-fetch nonce if not provided\n      if (req.sender && req.nonce === undefined) {\n        const nonceResponse = await this.nodeClient.get<\n          ApiResponse<{\n            nonce: number\n            firstPendingNonce: number\n            txPending: number\n          }>\n        >(`/address/${req.sender}/nonce`)\n\n        const fetchedNonce = nonceResponse.data?.nonce\n        if (fetchedNonce === undefined || fetchedNonce === null) {\n          throw new Error(`Failed to fetch nonce for address ${req.sender}`)\n        }\n        req.nonce = fetchedNonce\n      }\n\n      // Call node endpoint to build transaction\n      const response = await this.nodeClient.post<\n        ApiResponse<{\n          result: unknown // Proto transaction object (ITransaction)\n          txHash: string\n        }>\n      >('/transaction/send', req)\n\n      if (response.error || !response.data) {\n        throw new NetworkError(response.error || 'Failed to build transaction', { request })\n      }\n\n      return {\n        result: response.data.result,\n        txHash: response.data.txHash,\n      }\n    } catch (error) {\n      if (error instanceof NetworkError || error instanceof ValidationError) {\n        throw error\n      }\n      throw new TransactionError(\n        `Failed to build transaction: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        { request, originalError: error },\n      )\n    }\n  }\n\n  // ============================================================================\n  // Convenience Methods\n  // ============================================================================\n\n  /**\n   * Execute multiple requests in parallel\n   * Useful for batching multiple API calls for better performance\n   *\n   * @param requests - Array of request functions to execute\n   * @returns Array of results in the same order as requests\n   *\n   * @example\n   * ```typescript\n   * const [account1, account2, balance] = await provider.batch([\n   *   () => provider.getAccount('klv1...'),\n   *   () => provider.getAccount('klv1xxx...'),\n   *   () => provider.getBalance('klv1...')\n   * ])\n   * ```\n   */\n  async batch<T>(requests: (() => Promise<T>)[]): Promise<T[]> {\n    return Promise.all(requests.map((req) => req()))\n  }\n\n  // ============================================================================\n  // Web3 Naming Convention Aliases\n  // ============================================================================\n\n  /**\n   * Alias for getAccount() - matches Solana web3.js naming convention\n   * @see getAccount\n   */\n  async getAccountInfo(\n    address: KleverAddress,\n    options?: { skipCache?: boolean },\n  ): Promise<IAccount> {\n    return this.getAccount(address, options)\n  }\n\n  /**\n   * Alias for broadcastTransaction() - matches ethers.js and web3.js naming convention\n   * More commonly used in Web3 ecosystems\n   * @see broadcastTransaction\n   */\n  async sendTransaction(tx: unknown): Promise<IBroadcastResult> {\n    return this.broadcastTransaction(tx)\n  }\n}\n","/**\n * Receipt Parser Utilities\n *\n * Type-safe parsers for extracting data from transaction receipts.\n * Works with all transaction types and provides clean, typed outputs.\n */\n\nimport type { ITransactionResponse } from '../types/api-types'\n\n// ============================================================================\n// Internal Receipt Types (from blockchain API)\n// ============================================================================\n\ninterface FreezeReceipt extends Record<string, unknown> {\n  type: number\n  typeString?: string\n  bucketId?: string\n  bucketID?: string\n  value?: number | string\n  amount?: number | string\n  assetId?: string\n  from?: string\n  cID?: number\n}\n\ninterface UnfreezeReceipt extends Record<string, unknown> {\n  type: number\n  typeString?: string\n  bucketId?: string\n  bucketID?: string\n  assetId?: string\n  availableEpoch?: string | number\n  from?: string\n  cID?: number\n}\n\ninterface WithdrawReceipt extends Record<string, unknown> {\n  type: number\n  typeString?: string\n  amount?: number | string\n  assetId?: string\n  from?: string\n  cID?: number\n}\n\ninterface DelegateReceipt extends Record<string, unknown> {\n  type: number\n  typeString?: string\n  bucketId?: string\n  bucketID?: string\n  delegate?: string\n  amountDelegated?: string | number\n  from?: string\n  cID?: number\n  availableEpoch?: string | number\n}\n\ninterface TransferReceipt extends Record<string, unknown> {\n  type: number\n  typeString?: string\n  from?: string\n  to?: string\n  value?: number | string\n  amount?: number | string\n  assetId?: string\n  assetType?: string\n  collection?: string\n  nonce?: string\n  marketplaceId?: string\n  orderId?: string\n  cID?: number\n}\n\n// ============================================================================\n// Parsed Receipt Data Types\n// ============================================================================\n\nexport interface FreezeReceiptData {\n  /** Bucket ID created (32-byte hash for KLV, KDA ID for other assets) */\n  bucketId: string\n  /** Amount frozen */\n  amount: bigint\n  /** Asset ID (KDA) */\n  kda: string\n  /** All freeze operations if multiple assets were frozen */\n  freezes?:\n    | Array<{\n        bucketId: string\n        amount: bigint\n        kda: string\n      }>\n    | undefined\n  /** Raw receipt for additional data */\n  raw: ITransactionResponse\n}\n\nexport interface UnfreezeReceiptData {\n  /** Bucket ID that was unfrozen */\n  bucketId: string\n  /** Asset ID (KDA) */\n  kda: string\n  /** Timestamp when withdrawal will be available */\n  availableAt?: number | undefined\n  /** Raw receipt for additional data */\n  raw: ITransactionResponse\n}\n\nexport interface ClaimReceiptData {\n  /** Array of claimed rewards */\n  rewards: Array<{\n    /** Asset ID */\n    kda: string\n    /** Amount claimed */\n    amount: bigint\n  }>\n  /** Total amount claimed (sum of all rewards) */\n  totalClaimed: bigint\n  /** Claim type (0 = Staking, 1 = Market, 2 = Allowance, 3 = FPR) */\n  claimType?: number | undefined\n  /** Raw receipt for additional data */\n  raw: ITransactionResponse\n}\n\nexport interface WithdrawReceiptData {\n  /** Amount withdrawn */\n  amount: bigint\n  /** Asset ID (KDA) */\n  kda: string\n  /** Withdraw type */\n  withdrawType?: number | undefined\n  /** All withdrawals if multiple */\n  withdrawals?:\n    | Array<{\n        amount: bigint\n        kda: string\n      }>\n    | undefined\n  /** Raw receipt for additional data */\n  raw: ITransactionResponse\n}\n\nexport interface DelegateReceiptData {\n  /** Validator address delegated to */\n  validator: string\n  /** Bucket ID that was delegated */\n  bucketId: string\n  /** Raw receipt for additional data */\n  raw: ITransactionResponse\n}\n\nexport interface UndelegateReceiptData {\n  /** Bucket ID that was undelegated */\n  bucketId: string\n  /** Timestamp when funds will be available for withdrawal */\n  availableAt?: number | undefined\n  /** Raw receipt for additional data */\n  raw: ITransactionResponse\n}\n\nexport interface TransferReceiptData {\n  /** Sender address */\n  sender: string\n  /** Recipient address */\n  receiver: string\n  /** Amount transferred */\n  amount: bigint\n  /** Asset ID (KDA) - defaults to KLV */\n  kda: string\n  /** All transfers if multiple assets were transferred */\n  transfers?:\n    | Array<{\n        sender: string\n        receiver: string\n        amount: bigint\n        kda: string\n      }>\n    | undefined\n  /** Raw receipt for additional data */\n  raw: ITransactionResponse\n}\n\n// ============================================================================\n// Parser Error\n// ============================================================================\n\nexport class ReceiptParseError extends Error {\n  constructor(\n    message: string,\n    public readonly receipt?: ITransactionResponse,\n    public readonly receiptType?: string,\n  ) {\n    super(message)\n    this.name = 'ReceiptParseError'\n  }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Safely extract string value from receipt data using dot notation path\n *\n * Supports:\n * - Nested objects: 'contract.parameter.receiver'\n * - Array access: 'contract[0].parameter'\n *\n * @param receipt - Transaction receipt to extract from\n * @param path - Dot notation path (e.g., 'contract[0].parameter.claimType')\n * @returns Extracted string value or undefined if path not found\n *\n * @example\n * ```typescript\n * const receiver = getReceiptString(receipt, 'contract[0].parameter.receiver')\n * const claimType = getReceiptString(receipt, 'contract[0].parameter.claimType')\n * ```\n */\nfunction getReceiptString(receipt: ITransactionResponse, path: string): string | undefined {\n  const parts = path.split('.')\n  let current: unknown = receipt\n\n  for (const part of parts) {\n    const match = part.match(/^(\\w+)(?:\\[(\\d+)\\])?$/)\n    if (!match) return undefined\n\n    const [, key, index] = match\n    if (!key) return undefined\n\n    // Type guard to check if current is an object with string keys\n    if (typeof current !== 'object' || current === null) {\n      return undefined\n    }\n\n    current = (current as Record<string, unknown>)[key]\n\n    if (index !== undefined) {\n      if (!Array.isArray(current)) {\n        return undefined\n      }\n      current = current[parseInt(index)]\n    }\n\n    if (current === undefined || current === null) {\n      return undefined\n    }\n  }\n\n  return String(current)\n}\n\n/**\n * Safely extract numeric value from receipt data using dot notation path\n *\n * Converts string values to numbers automatically.\n *\n * @param receipt - Transaction receipt to extract from\n * @param path - Dot notation path (e.g., 'contract[0].parameter.withdrawType')\n * @returns Extracted number or undefined if path not found or not a valid number\n *\n * @example\n * ```typescript\n * const withdrawType = getReceiptNumber(receipt, 'contract[0].parameter.withdrawType')\n * const claimType = getReceiptNumber(receipt, 'contract[0].parameter.claimType')\n * ```\n */\nfunction getReceiptNumber(receipt: ITransactionResponse, path: string): number | undefined {\n  const value = getReceiptString(receipt, path)\n  if (!value) return undefined\n\n  const num = Number(value)\n  return isNaN(num) ? undefined : num\n}\n\n// ============================================================================\n// Receipt Parsers\n// ============================================================================\n\n/**\n * Parse freeze transaction receipt to extract bucket ID and frozen amount\n *\n * Freeze receipts contain:\n * - bucketId: Unique identifier for the frozen bucket (32-byte hash)\n * - amount: Amount that was frozen\n * - kda: Asset ID (KDA) that was frozen\n *\n * Supports multi-freeze transactions where multiple assets are frozen in one transaction.\n *\n * @param receipt - Transaction receipt from a freeze operation\n * @returns Parsed freeze data with bucket ID, amount, and asset details\n * @throws {ReceiptParseError} If receipt is missing or invalid\n *\n * @example\n * ```typescript\n * // Single freeze\n * const tx = await provider.getTransaction(freezeTxHash)\n * const { bucketId, amount, kda } = parseReceipt.freeze(tx)\n * console.log(`Frozen ${amount} ${kda} in bucket ${bucketId}`)\n *\n * // Multiple freezes\n * const { bucketId, amount, kda, freezes } = parseReceipt.freeze(tx)\n * console.log(`Primary freeze: ${amount} ${kda}`)\n * if (freezes) {\n *   freezes.forEach(f => console.log(`  ${f.amount} ${f.kda} -> ${f.bucketId}`))\n * }\n * ```\n */\nfunction freeze(receipt: ITransactionResponse): FreezeReceiptData {\n  if (!receipt.receipts || receipt.receipts.length === 0) {\n    throw new ReceiptParseError('No receipts found in freeze transaction', receipt, 'freeze')\n  }\n\n  // Find freeze receipts (type 3 or typeString 'Freeze')\n  const freezeReceipts = receipt.receipts.filter(\n    (r): r is FreezeReceipt => r.type === 3 || r.typeString === 'Freeze',\n  )\n\n  if (freezeReceipts.length === 0) {\n    throw new ReceiptParseError('No freeze receipt found', receipt, 'freeze')\n  }\n\n  // Parse first freeze receipt (primary)\n  const firstFreeze = freezeReceipts[0]\n  if (!firstFreeze) {\n    throw new ReceiptParseError('No freeze receipt found', receipt, 'freeze')\n  }\n  const bucketId = firstFreeze.bucketId || firstFreeze.bucketID\n\n  if (!bucketId) {\n    throw new ReceiptParseError('BucketId not found in freeze receipt', receipt, 'freeze')\n  }\n\n  const amount = BigInt(firstFreeze.value || firstFreeze.amount || 0)\n  const kda = firstFreeze.assetId || 'KLV'\n\n  // Parse all freeze operations if multiple\n  const freezes =\n    freezeReceipts.length > 1\n      ? freezeReceipts.map((r) => ({\n          bucketId: r.bucketId || r.bucketID || '',\n          amount: BigInt(r.value || r.amount || 0),\n          kda: r.assetId || 'KLV',\n        }))\n      : undefined\n\n  return {\n    bucketId,\n    amount,\n    kda,\n    freezes,\n    raw: receipt,\n  }\n}\n\n/**\n * Parse unfreeze transaction receipt to extract bucket and availability details\n *\n * Unfreeze receipts contain:\n * - bucketId: ID of the bucket that was unfrozen\n * - kda: Asset ID that was unfrozen\n * - availableAt: Timestamp when funds can be withdrawn (if applicable)\n *\n * @param receipt - Transaction receipt from an unfreeze operation\n * @returns Parsed unfreeze data with bucket ID and availability info\n * @throws {ReceiptParseError} If receipt is missing or invalid\n *\n * @example\n * ```typescript\n * const tx = await provider.getTransaction(unfreezeTxHash)\n * const { bucketId, kda, availableAt } = parseReceipt.unfreeze(tx)\n * console.log(`Unfrozen ${kda} from bucket ${bucketId}`)\n * if (availableAt) {\n *   const date = new Date(availableAt * 1000)\n *   console.log(`Available for withdrawal at: ${date.toISOString()}`)\n * }\n * ```\n */\nfunction unfreeze(receipt: ITransactionResponse): UnfreezeReceiptData {\n  if (!receipt.receipts || receipt.receipts.length === 0) {\n    throw new ReceiptParseError('No receipts found in unfreeze transaction', receipt, 'unfreeze')\n  }\n\n  // Find unfreeze receipt (type 4 or typeString 'Unfreeze')\n  const unfreezeReceipt = receipt.receipts.find(\n    (r): r is UnfreezeReceipt => r.type === 4 || r.typeString === 'Unfreeze',\n  )\n\n  if (!unfreezeReceipt) {\n    throw new ReceiptParseError('No unfreeze receipt found', receipt, 'unfreeze')\n  }\n\n  const bucketId = unfreezeReceipt.bucketId || unfreezeReceipt.bucketID\n\n  if (!bucketId) {\n    throw new ReceiptParseError('BucketId not found in unfreeze receipt', receipt, 'unfreeze')\n  }\n\n  const kda = unfreezeReceipt.assetId || 'KLV'\n  const availableAt = unfreezeReceipt.availableEpoch\n    ? Number(unfreezeReceipt.availableEpoch)\n    : undefined\n\n  return {\n    bucketId,\n    kda,\n    availableAt,\n    raw: receipt,\n  }\n}\n\n/**\n * Parse claim transaction receipt to extract reward details\n *\n * Claim receipts contain:\n * - rewards: Array of all claimed rewards by asset\n * - totalClaimed: Sum of all claimed amounts\n * - claimType: Type of claim (0=Staking, 1=Market, 2=Allowance, 3=FPR)\n *\n * Claims always involve multiple receipts (one per asset claimed).\n *\n * @param receipt - Transaction receipt from a claim operation\n * @returns Parsed claim data with rewards array and totals\n * @throws {ReceiptParseError} If receipt is missing or invalid\n *\n * @example\n * ```typescript\n * const tx = await provider.getTransaction(claimTxHash)\n * const { rewards, totalClaimed, claimType } = parseReceipt.claim(tx)\n *\n * console.log(`Claimed ${totalClaimed} total across ${rewards.length} assets`)\n * rewards.forEach(r => {\n *   console.log(`  ${r.amount} ${r.kda}`)\n * })\n *\n * const claimTypes = ['Staking', 'Market', 'Allowance', 'FPR']\n * console.log(`Claim type: ${claimTypes[claimType || 0]}`)\n * ```\n */\nfunction claim(receipt: ITransactionResponse): ClaimReceiptData {\n  if (!receipt.receipts || receipt.receipts.length === 0) {\n    throw new ReceiptParseError('No receipts found in claim transaction', receipt, 'claim')\n  }\n\n  const rewards = receipt.receipts.map((r) => {\n    const assetId = typeof r['assetId'] === 'string' ? r['assetId'] : 'KLV'\n    const amount =\n      typeof r['amount'] === 'number' || typeof r['amount'] === 'string' ? BigInt(r['amount']) : 0n\n    return {\n      kda: assetId,\n      amount,\n    }\n  })\n\n  const totalClaimed = rewards.reduce((sum, r) => sum + r.amount, 0n)\n\n  const claimType = getReceiptNumber(receipt, 'contract[0].parameter.claimType')\n\n  return {\n    rewards,\n    totalClaimed,\n    claimType,\n    raw: receipt,\n  }\n}\n\n/**\n * Parse withdraw transaction receipt to extract withdrawal details\n *\n * Withdraw receipts contain:\n * - amount: Amount withdrawn\n * - kda: Asset ID that was withdrawn\n * - withdrawType: Type of withdrawal operation\n *\n * Supports multi-withdraw transactions.\n *\n * @param receipt - Transaction receipt from a withdraw operation\n * @returns Parsed withdraw data with amount and asset details\n * @throws {ReceiptParseError} If receipt is missing or invalid\n *\n * @example\n * ```typescript\n * const tx = await provider.getTransaction(withdrawTxHash)\n * const { amount, kda, withdrawType } = parseReceipt.withdraw(tx)\n * console.log(`Withdrew ${amount} ${kda}`)\n *\n * // Multiple withdrawals\n * const { amount, kda, withdrawals } = parseReceipt.withdraw(tx)\n * if (withdrawals) {\n *   console.log(`Total withdrawals: ${withdrawals.length}`)\n *   withdrawals.forEach(w => console.log(`  ${w.amount} ${w.kda}`))\n * }\n * ```\n */\nfunction withdraw(receipt: ITransactionResponse): WithdrawReceiptData {\n  if (!receipt.receipts || receipt.receipts.length === 0) {\n    throw new ReceiptParseError('No receipts found in withdraw transaction', receipt, 'withdraw')\n  }\n\n  // Find withdraw receipts (type 18 or typeString 'Withdraw')\n  const withdrawReceipts = receipt.receipts.filter(\n    (r): r is WithdrawReceipt => r.type === 18 || r.typeString === 'Withdraw',\n  )\n\n  if (withdrawReceipts.length === 0) {\n    throw new ReceiptParseError('No withdraw receipt found', receipt, 'withdraw')\n  }\n\n  // Parse first withdraw receipt (primary)\n  const firstWithdraw = withdrawReceipts[0]\n  if (!firstWithdraw) {\n    throw new ReceiptParseError('No withdraw receipt found', receipt, 'withdraw')\n  }\n  const amount = BigInt(firstWithdraw.amount || 0)\n  const kda = firstWithdraw.assetId || 'KLV'\n\n  const withdrawType = getReceiptNumber(receipt, 'contract[0].parameter.withdrawType')\n\n  // Parse all withdrawals if multiple\n  const withdrawals =\n    withdrawReceipts.length > 1\n      ? withdrawReceipts.map((r) => ({\n          amount: BigInt(r.amount || 0),\n          kda: r.assetId || 'KLV',\n        }))\n      : undefined\n\n  return {\n    amount,\n    kda,\n    withdrawType,\n    withdrawals,\n    raw: receipt,\n  }\n}\n\n/**\n * Parse delegate transaction receipt to extract delegation details\n *\n * Delegate receipts contain:\n * - validator: Address of the validator that was delegated to\n * - bucketId: Bucket ID that was delegated\n *\n * @param receipt - Transaction receipt from a delegate operation\n * @returns Parsed delegation data with validator and bucket ID\n * @throws {ReceiptParseError} If receipt is missing or invalid\n *\n * @example\n * ```typescript\n * const tx = await provider.getTransaction(delegateTxHash)\n * const { validator, bucketId } = parseReceipt.delegate(tx)\n * console.log(`Delegated bucket ${bucketId} to validator ${validator}`)\n * ```\n */\nfunction delegate(receipt: ITransactionResponse): DelegateReceiptData {\n  if (!receipt.receipts || receipt.receipts.length === 0) {\n    throw new ReceiptParseError('No receipts found in delegate transaction', receipt, 'delegate')\n  }\n\n  // Find delegate receipt (type 7 or typeString 'Delegate')\n  const delegateReceipt = receipt.receipts.find(\n    (r): r is DelegateReceipt => r.type === 7 || r.typeString === 'Delegate',\n  )\n\n  if (!delegateReceipt) {\n    throw new ReceiptParseError('No delegate receipt found', receipt, 'delegate')\n  }\n\n  const validator =\n    delegateReceipt.delegate ||\n    getReceiptString(receipt, 'contract[0].parameter.toAddress') ||\n    getReceiptString(receipt, 'contract[0].parameter.receiver')\n\n  if (!validator) {\n    throw new ReceiptParseError(\n      'Validator address not found in delegate receipt',\n      receipt,\n      'delegate',\n    )\n  }\n\n  const bucketId = delegateReceipt.bucketId || delegateReceipt.bucketID || ''\n\n  return {\n    validator,\n    bucketId,\n    raw: receipt,\n  }\n}\n\n/**\n * Parse undelegate transaction receipt to extract undelegation details\n *\n * Undelegate receipts contain:\n * - bucketId: Bucket ID that was undelegated\n * - availableAt: Timestamp when funds can be withdrawn\n *\n * Note: Undelegate creates a Delegate receipt (type 7) with empty delegate field\n *\n * @param receipt - Transaction receipt from an undelegate operation\n * @returns Parsed undelegation data with bucket ID and availability info\n * @throws {ReceiptParseError} If receipt is missing or invalid\n *\n * @example\n * ```typescript\n * const tx = await provider.getTransaction(undelegateTxHash)\n * const { bucketId, availableAt } = parseReceipt.undelegate(tx)\n * console.log(`Undelegated bucket ${bucketId}`)\n * if (availableAt) {\n *   const date = new Date(availableAt * 1000)\n *   console.log(`Available for withdrawal: ${date.toISOString()}`)\n * }\n * ```\n */\nfunction undelegate(receipt: ITransactionResponse): UndelegateReceiptData {\n  if (!receipt.receipts || receipt.receipts.length === 0) {\n    throw new ReceiptParseError(\n      'No receipts found in undelegate transaction',\n      receipt,\n      'undelegate',\n    )\n  }\n\n  // Find delegate receipt (undelegate creates a delegate receipt with empty delegate field)\n  const delegateReceipt = receipt.receipts.find(\n    (r): r is DelegateReceipt => r.type === 7 || r.typeString === 'Delegate',\n  )\n\n  if (!delegateReceipt) {\n    throw new ReceiptParseError(\n      'No delegate receipt found in undelegate transaction',\n      receipt,\n      'undelegate',\n    )\n  }\n\n  const bucketId = delegateReceipt.bucketId || delegateReceipt.bucketID\n\n  if (!bucketId) {\n    throw new ReceiptParseError('BucketId not found in undelegate receipt', receipt, 'undelegate')\n  }\n\n  const availableAt = delegateReceipt.availableEpoch\n    ? Number(delegateReceipt.availableEpoch)\n    : undefined\n\n  return {\n    bucketId,\n    availableAt,\n    raw: receipt,\n  }\n}\n\n/**\n * Parse transfer transaction receipt to extract transfer details\n *\n * Transfer receipts contain:\n * - sender: Address that sent the assets\n * - receiver: Address that received the assets\n * - amount: Amount transferred\n * - kda: Asset ID that was transferred (defaults to KLV)\n *\n * Supports multi-transfer transactions where multiple transfers occur.\n *\n * @param receipt - Transaction receipt from a transfer operation\n * @returns Parsed transfer data with sender, receiver, and amount\n * @throws {ReceiptParseError} If receipt is missing or invalid\n *\n * @example\n * ```typescript\n * // Single transfer\n * const tx = await provider.getTransaction(transferTxHash)\n * const { sender, receiver, amount, kda } = parseReceipt.transfer(tx)\n * console.log(`${sender} sent ${amount} ${kda} to ${receiver}`)\n *\n * // Multiple transfers\n * const { sender, receiver, amount, kda, transfers } = parseReceipt.transfer(tx)\n * console.log(`Primary: ${sender} -> ${receiver}: ${amount} ${kda}`)\n * if (transfers) {\n *   console.log(`Total transfers: ${transfers.length}`)\n *   transfers.forEach(t => {\n *     console.log(`  ${t.sender} -> ${t.receiver}: ${t.amount} ${t.kda}`)\n *   })\n * }\n * ```\n */\nfunction transfer(receipt: ITransactionResponse): TransferReceiptData {\n  if (!receipt.receipts || receipt.receipts.length === 0) {\n    throw new ReceiptParseError('No receipts found in transfer transaction', receipt, 'transfer')\n  }\n\n  // Find transfer receipts (type 0 or typeString 'Transfer')\n  const transferReceipts = receipt.receipts.filter(\n    (r): r is TransferReceipt => r.type === 0 || r.typeString === 'Transfer',\n  )\n\n  if (transferReceipts.length === 0) {\n    throw new ReceiptParseError('No transfer receipt found', receipt, 'transfer')\n  }\n\n  // Parse first transfer receipt (primary)\n  const firstTransfer = transferReceipts[0]\n  if (!firstTransfer) {\n    throw new ReceiptParseError('No transfer receipt found', receipt, 'transfer')\n  }\n  const sender = firstTransfer.from || receipt.sender\n  const receiver = firstTransfer.to\n\n  if (!receiver) {\n    throw new ReceiptParseError(\n      'Receiver address not found in transfer receipt',\n      receipt,\n      'transfer',\n    )\n  }\n\n  const amount = BigInt(firstTransfer.value || firstTransfer.amount || 0)\n  const kda = firstTransfer.assetId || 'KLV'\n\n  // Parse all transfers if multiple\n  const transfers =\n    transferReceipts.length > 1\n      ? transferReceipts.map((r) => ({\n          sender: r.from || receipt.sender,\n          receiver: r.to || '',\n          amount: BigInt(r.value || r.amount || 0),\n          kda: r.assetId || 'KLV',\n        }))\n      : undefined\n\n  return {\n    sender,\n    receiver,\n    amount,\n    kda,\n    transfers,\n    raw: receipt,\n  }\n}\n\n// ============================================================================\n// Main Parser Export\n// ============================================================================\n\n/**\n * Receipt parser utilities\n *\n * Provides type-safe parsing of transaction receipts with hybrid support:\n * - Simple API: Primary/first receipt for common single-operation cases\n * - Array fields: All operations when multiple receipts exist\n *\n * @example\n * ```ts\n * import { parseReceipt } from '@klever/connect-provider'\n *\n * // Single freeze\n * const result = await freeze(100000, 'KLV')\n * const receipt = await result.wait()\n * const { bucketId, amount, kda } = parseReceipt.freeze(receipt)\n * console.log(`Created bucket ${bucketId} with ${amount} ${kda}`)\n *\n * // Multiple transfers in one transaction\n * const transferResult = await transferMultiple(...)\n * const transferReceipt = await transferResult.wait()\n * const { sender, receiver, amount, kda, transfers } = parseReceipt.transfer(transferReceipt)\n * console.log(`Primary: ${sender} → ${receiver}: ${amount} ${kda}`)\n * if (transfers) {\n *   console.log(`Total transfers: ${transfers.length}`)\n *   transfers.forEach(t => console.log(`  ${t.sender} → ${t.receiver}: ${t.amount} ${t.kda}`))\n * }\n *\n * // Claim rewards (always multiple)\n * const claimResult = await claim(0)\n * const claimReceipt = await claimResult.wait()\n * const { rewards, totalClaimed } = parseReceipt.claim(claimReceipt)\n * console.log(`Claimed ${totalClaimed} across ${rewards.length} assets`)\n * ```\n */\nexport const parseReceipt = {\n  freeze,\n  unfreeze,\n  claim,\n  withdraw,\n  delegate,\n  undelegate,\n  transfer,\n}\n\n// Re-export error for convenience\nexport { ReceiptParseError as ParseError }\n"]}