@awarizon/web3 1.3.3 → 1.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +395 -7
- package/dist/index.d.ts +395 -7
- package/dist/index.js +3446 -114
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3406 -40
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -4
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chains.ts","../src/contract.ts","../src/errors.ts","../src/telemetry.ts","../src/price/feeds.ts","../src/price/index.ts","../src/standards.ts","../src/sdk.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n mainnet,\n base,\n baseSepolia,\n polygon,\n polygonAmoy,\n arbitrum,\n arbitrumSepolia,\n optimism,\n optimismSepolia,\n bsc,\n avalanche,\n sepolia,\n zora,\n linea,\n scroll,\n mantle,\n celo,\n gnosis,\n fantom,\n moonbeam,\n} from 'viem/chains';\nimport { fallback, http, type Transport } from 'viem';\nimport type { Chain } from 'viem';\n\n// ─── Supported chains registry ────────────────────────────────────────────────\n\nexport const CHAINS: Record<string, Chain> = {\n // Mainnet\n mainnet,\n ethereum: mainnet,\n eth: mainnet,\n\n // Base\n base,\n 'base-mainnet': base,\n\n // Base Sepolia\n 'base-sepolia': baseSepolia,\n baseSepolia,\n\n // Polygon\n polygon,\n matic: polygon,\n\n // Polygon Amoy (testnet)\n amoy: polygonAmoy,\n 'polygon-amoy': polygonAmoy,\n\n // Arbitrum\n arbitrum,\n 'arbitrum-one': arbitrum,\n\n // Arbitrum Sepolia\n 'arbitrum-sepolia': arbitrumSepolia,\n arbitrumSepolia,\n\n // Optimism\n optimism,\n op: optimism,\n\n // Optimism Sepolia\n 'optimism-sepolia': optimismSepolia,\n optimismSepolia,\n\n // BSC\n bsc,\n bnb: bsc,\n 'binance-smart-chain': bsc,\n\n // Avalanche\n avalanche,\n avax: avalanche,\n\n // Testnets\n sepolia,\n 'eth-sepolia': sepolia,\n\n // Other L2s\n zora,\n linea,\n scroll,\n mantle,\n celo,\n gnosis,\n xdai: gnosis,\n fantom,\n moonbeam,\n};\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n// Pre-computed once at module load — used in unsupported-chain error messages.\nconst _chainAliases = Object.keys(CHAINS).sort().join(', ');\n\n/**\n * Resolves a chain string identifier or a viem Chain object to a Chain.\n *\n * @example\n * resolveChain(\"base\") // → Chain object for Base\n * resolveChain(base) // → same Chain object, passthrough\n * resolveChain(\"unknown\") // → throws Error\n */\nexport function resolveChain(chain: Chain | string): Chain {\n if (typeof chain === 'object' && 'id' in chain) {\n return chain;\n }\n\n if (typeof chain === 'string') {\n const resolved = CHAINS[chain.toLowerCase()] ?? CHAINS[chain];\n if (!resolved) {\n throw new Error(\n `[awarizon/web3] Unsupported chain: \"${chain}\".\\n` +\n `Available chains: ${_chainAliases}`,\n );\n }\n return resolved;\n }\n\n throw new TypeError(`[awarizon/web3] chain must be a string or Chain object, got: ${typeof chain}`);\n}\n\n/** Returns a list of all unique supported chain IDs */\nexport function getSupportedChainIds(): number[] {\n const seen = new Set<number>();\n return Object.values(CHAINS)\n .filter(c => { if (seen.has(c.id)) return false; seen.add(c.id); return true; })\n .map(c => c.id);\n}\n\n// ─── Fallback RPC registry ────────────────────────────────────────────────────\n// Secondary endpoints for chains whose default public RPCs are unreliable.\n// Keyed by chain ID so the lookup is O(1) and independent of alias names.\n\nconst FALLBACK_RPCS: Record<number, string> = {\n 5000: 'https://mantle-mainnet.public.blastapi.io', // mantle\n 42220: 'https://celo.drpc.org', // celo\n 100: 'https://gnosis.drpc.org', // gnosis\n 250: 'https://rpc.fantom.network', // fantom\n 1284: 'https://moonbeam.drpc.org', // moonbeam\n};\n\n/**\n * Build the viem Transport for a chain.\n *\n * Priority:\n * 1. If the caller supplied an explicit `rpcUrlOverride`, use it directly.\n * 2. For chains with a known-unreliable default RPC, wrap primary + fallback\n * in viem's `fallback()` transport — primary is always tried first.\n * 3. All other chains: plain `http()` with viem's chain default.\n *\n * @example\n * // Fallback kicks in automatically for mantle, celo, gnosis, fantom, moonbeam\n * const transport = getChainTransport(mantle)\n *\n * // User override bypasses fallback entirely — they know what they want\n * const transport = getChainTransport(mantle, \"https://my-own-rpc.example.com\")\n */\nexport function getChainTransport(chain: Chain, rpcUrlOverride?: string): Transport {\n if (rpcUrlOverride) return http(rpcUrlOverride);\n\n const fallbackUrl = FALLBACK_RPCS[chain.id];\n if (fallbackUrl) {\n const primaryUrl = chain.rpcUrls.default.http[0];\n return fallback([http(primaryUrl), http(fallbackUrl)]);\n }\n\n return http();\n}\n","import type { Abi, AbiFunction, AbiEvent, Address, PublicClient, Chain } from 'viem';\nimport { parseABI } from '@awarizon/abi-engine';\nimport { TransactionEngine } from '@awarizon/tx-engine';\nimport type { TelemetryClient, TelemetryEventType } from './telemetry';\nimport type { ContractInstance, EventUnsubscribe } from './types';\n\n// ─── Telemetry helper ─────────────────────────────────────────────────────────\n\nfunction trackEvent(\n telemetry: TelemetryClient | undefined,\n type: TelemetryEventType,\n chain: Chain | undefined,\n functionName: string | undefined,\n success: boolean,\n start: number,\n): void {\n telemetry?.track({\n type,\n chain: chain?.name ?? 'unknown',\n chainId: chain?.id ?? 0,\n functionName,\n success,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n}\n\n// ─── ContractFactory ──────────────────────────────────────────────────────────\n\n/**\n * Builds a fully dynamic ContractInstance from an address + ABI.\n *\n * Every function in the ABI is attached as a method that routes to read or\n * write based on stateMutability. Telemetry is tracked for every call.\n *\n * The `txEngine` parameter is shared from the parent SDK instance — one engine\n * per SDK, not one per contract.\n */\nexport function buildContractInstance(\n address: Address,\n abi: Abi,\n publicClient: PublicClient,\n txEngine: TransactionEngine,\n telemetry?: TelemetryClient,\n chain?: Chain,\n): ContractInstance {\n // parseABI is memoized by ABI object identity — free on repeat calls\n const parsed = parseABI(abi);\n\n // O(1) event lookup — built once, used on every .on() call\n const eventsMap = new Map<string, AbiEvent>(parsed.events.map(e => [e.name, e]));\n\n const instance: Record<string, unknown> = {\n _address: address,\n _abi: abi,\n };\n\n for (const fn of parsed.readFunctions) {\n instance[fn.name] = buildReadMethod(fn, address, abi, txEngine, telemetry, chain);\n }\n\n for (const fn of parsed.writeFunctions) {\n instance[fn.name] = buildWriteMethod(fn, address, abi, txEngine, telemetry, chain);\n }\n\n instance['on'] = buildEventSubscription(address, abi, eventsMap, publicClient);\n\n instance['estimateGas'] = async (method: string, ...args: unknown[]): Promise<bigint> => {\n const start = Date.now();\n try {\n const estimate = await txEngine.estimateGas({ address, abi, functionName: method, args });\n trackEvent(telemetry, 'contract.gas_estimate', chain, method, true, start);\n return estimate.gas;\n } catch (error) {\n trackEvent(telemetry, 'contract.gas_estimate', chain, method, false, start);\n throw error;\n }\n };\n\n return instance as ContractInstance;\n}\n\n// ─── Read method ──────────────────────────────────────────────────────────────\n\nfunction buildReadMethod(\n fn: AbiFunction,\n address: Address,\n abi: Abi,\n txEngine: TransactionEngine,\n telemetry: TelemetryClient | undefined,\n chain: Chain | undefined,\n): (...args: unknown[]) => Promise<unknown> {\n return async (...args: unknown[]) => {\n const start = Date.now();\n try {\n const result = await txEngine.read({ address, abi, functionName: fn.name, args });\n trackEvent(telemetry, 'contract.read', chain, fn.name, true, start);\n return result;\n } catch (error) {\n trackEvent(telemetry, 'contract.read', chain, fn.name, false, start);\n throw error;\n }\n };\n}\n\n// ─── Write method ─────────────────────────────────────────────────────────────\n\nfunction buildWriteMethod(\n fn: AbiFunction,\n address: Address,\n abi: Abi,\n txEngine: TransactionEngine,\n telemetry: TelemetryClient | undefined,\n chain: Chain | undefined,\n): (...args: unknown[]) => Promise<unknown> {\n const isPayable = fn.stateMutability === 'payable';\n\n return async (...args: unknown[]) => {\n let callArgs = args;\n let value: bigint | undefined;\n let gas: bigint | undefined;\n\n if (isPayable && args.length > 0) {\n const last = args[args.length - 1];\n if (isPayableOptions(last)) {\n callArgs = args.slice(0, -1);\n value = last.value;\n gas = last.gas;\n }\n }\n\n const start = Date.now();\n try {\n const result = await txEngine.write({\n address, abi, functionName: fn.name, args: callArgs, value, gas,\n });\n trackEvent(telemetry, 'contract.write', chain, fn.name, true, start);\n return result;\n } catch (error) {\n trackEvent(telemetry, 'contract.write', chain, fn.name, false, start);\n throw error;\n }\n };\n}\n\nfunction isPayableOptions(val: unknown): val is { value?: bigint; gas?: bigint } {\n if (!val || typeof val !== 'object') return false;\n const obj = val as Record<string, unknown>;\n const hasValue = 'value' in obj && (obj.value === undefined || typeof obj.value === 'bigint');\n const hasGas = 'gas' in obj && (obj.gas === undefined || typeof obj.gas === 'bigint');\n return hasValue || hasGas;\n}\n\n// ─── Event subscription ───────────────────────────────────────────────────────\n\nfunction buildEventSubscription(\n address: Address,\n abi: Abi,\n eventsMap: Map<string, AbiEvent>,\n publicClient: PublicClient,\n): (event: string, callback: (log: unknown) => void) => EventUnsubscribe {\n return (eventName: string, callback: (log: unknown) => void): EventUnsubscribe => {\n const abiEvent = eventsMap.get(eventName); // O(1)\n\n if (!abiEvent) {\n const available = [...eventsMap.keys()].join(', ') || 'none';\n throw new Error(\n `[awarizon/web3] Event \"${eventName}\" not found on contract ${address}.\\n` +\n `Available events: ${available}`,\n );\n }\n\n const unwatch = publicClient.watchContractEvent({\n address,\n abi,\n eventName,\n onLogs: (logs) => {\n for (const log of logs) callback(log);\n },\n });\n\n return unwatch;\n };\n}\n","export class NetworkMismatchError extends Error {\n readonly code = 'NETWORK_MISMATCH' as const;\n readonly expected: string;\n readonly got: string;\n\n constructor(expected: string | number, got: string | number) {\n super(`[awarizon/web3] Network mismatch: expected chain ID ${expected}, but wallet is on chain ID ${got}`);\n this.name = 'NetworkMismatchError';\n this.expected = String(expected);\n this.got = String(got);\n }\n}\n\nexport class ProviderError extends Error {\n readonly code = 'PROVIDER_ERROR' as const;\n\n constructor(message: string) {\n super(`[awarizon/web3] Provider error: ${message}`);\n this.name = 'ProviderError';\n }\n}\n\nexport class ContractNotLoadedError extends Error {\n readonly code = 'CONTRACT_NOT_LOADED' as const;\n\n constructor(address: string) {\n super(`[awarizon/web3] Contract at ${address} is not loaded. Call awarizon.contract({ address, abi }) first.`);\n this.name = 'ContractNotLoadedError';\n }\n}\n\nexport class UnsupportedChainError extends Error {\n readonly code = 'UNSUPPORTED_CHAIN' as const;\n readonly chain: string;\n\n constructor(chain: string) {\n super(`[awarizon/web3] Unsupported chain: \"${chain}\". Pass a valid chain name or viem Chain object.`);\n this.name = 'UnsupportedChainError';\n this.chain = chain;\n }\n}\n\nexport class ApiKeyRequiredError extends Error {\n readonly code = 'API_KEY_REQUIRED' as const;\n\n constructor() {\n super(\n '[awarizon/web3] An API key is required. Pass apiKey: \"awz_live_...\" to AwarizonWeb3({ ... }). ' +\n 'Get yours at https://awarizon.com/dashboard/api-keys',\n );\n this.name = 'ApiKeyRequiredError';\n }\n}\n\nexport class InvalidApiKeyError extends Error {\n readonly code = 'INVALID_API_KEY' as const;\n\n constructor(message = 'Invalid or revoked API key.') {\n super(`[awarizon/web3] ${message}`);\n this.name = 'InvalidApiKeyError';\n }\n}\n","import { InvalidApiKeyError } from './errors';\n\nexport type TelemetryEventType =\n | 'contract.read'\n | 'contract.write'\n | 'contract.gas_estimate'\n | 'wallet.create'\n | 'wallet.import'\n | 'chain.switch';\n\nexport interface TelemetryEvent {\n type: TelemetryEventType;\n chain: string;\n chainId: number;\n functionName?: string;\n success: boolean;\n durationMs: number;\n ts: number;\n}\n\nconst DEFAULT_BASE_URL = 'https://awarizon.com';\nconst FLUSH_INTERVAL_MS = 10_000;\nconst MAX_BATCH_SIZE = 20;\nconst VALIDATION_TIMEOUT = 5_000;\n\n// ─── TelemetryClient ──────────────────────────────────────────────────────────\n\n/**\n * Handles SDK-to-Awarizon API communication:\n * 1. Validates the API key on first meaningful operation (5s timeout)\n * 2. Batches usage events and flushes them fire-and-forget\n * 3. Flushes remaining events via sendBeacon on browser page unload\n *\n * All telemetry failures are swallowed — they never surface to the caller.\n * The only hard error is InvalidApiKeyError thrown from ensureValidated().\n */\nexport class TelemetryClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n private validated = false;\n private validationPromise: Promise<void> | null = null;\n private queue: TelemetryEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private unloadListener: (() => void) | null = null;\n\n constructor(apiKey: string, baseUrl = DEFAULT_BASE_URL) {\n this.apiKey = apiKey;\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n }\n\n /**\n * Ensures the API key has been validated against the Awarizon API.\n * Idempotent — safe to call on every operation; only hits the network once.\n * Times out after 5 seconds to avoid hanging in degraded network conditions.\n *\n * @throws {InvalidApiKeyError} if the key is invalid, revoked, or unreachable\n */\n async ensureValidated(): Promise<void> {\n if (this.validated) return;\n if (this.validationPromise) return this.validationPromise;\n\n this.validationPromise = this._validate().catch((err) => {\n // Reset so callers can retry after transient failures\n this.validationPromise = null;\n throw err;\n });\n\n return this.validationPromise;\n }\n\n /**\n * Queue a usage event. Events are batched and sent periodically.\n * Must only be called after ensureValidated() has resolved.\n */\n track(event: TelemetryEvent): void {\n if (!this.validated) return;\n this.queue.push(event);\n if (this.queue.length >= MAX_BATCH_SIZE) this._flush(false);\n }\n\n /**\n * Flush pending events and stop background timers.\n * Call when tearing down a long-lived SDK instance (e.g. server shutdown).\n */\n async destroy(): Promise<void> {\n this._stopTimers();\n await this._flush(true);\n }\n\n // ─── Private ─────────────────────────────────────────────────────────────────\n\n private async _validate(): Promise<void> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), VALIDATION_TIMEOUT);\n\n let res: Response;\n try {\n res = await fetch(`${this.baseUrl}/api/v1/auth`, {\n method: 'GET',\n headers: { Authorization: `Bearer ${this.apiKey}` },\n signal: controller.signal,\n });\n } catch (err) {\n const msg = controller.signal.aborted\n ? `Awarizon API did not respond within ${VALIDATION_TIMEOUT / 1000}s.`\n : `Could not reach Awarizon API: ${(err as Error).message}`;\n throw new InvalidApiKeyError(msg);\n } finally {\n clearTimeout(timeout);\n }\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({})) as { error?: string };\n throw new InvalidApiKeyError(body.error ?? 'Invalid or revoked API key.');\n }\n\n this.validated = true;\n this._startTimers();\n }\n\n private _startTimers(): void {\n // Periodic background flush\n this.flushTimer = setInterval(() => {\n if (this.queue.length > 0) this._flush(false);\n }, FLUSH_INTERVAL_MS);\n\n // Prevent the interval from blocking Node.js process exit\n const timer = this.flushTimer as unknown as { unref?: () => void };\n if (typeof timer.unref === 'function') timer.unref();\n\n // Browser page-unload: sendBeacon guarantees delivery even as page closes\n if (typeof window !== 'undefined' && typeof navigator !== 'undefined') {\n this.unloadListener = () => this._flushBeacon();\n window.addEventListener('beforeunload', this.unloadListener);\n }\n }\n\n private _stopTimers(): void {\n if (this.flushTimer !== null) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n if (this.unloadListener !== null && typeof window !== 'undefined') {\n window.removeEventListener('beforeunload', this.unloadListener);\n this.unloadListener = null;\n }\n }\n\n /**\n * Unified flush. Pass `await = true` for graceful shutdown,\n * `await = false` for fire-and-forget mid-session flushes.\n */\n private _flush(awaited: false): void;\n private _flush(awaited: true): Promise<void>;\n private _flush(awaited: boolean): void | Promise<void> {\n if (this.queue.length === 0) return awaited ? Promise.resolve() : undefined;\n\n const batch = this.queue.splice(0, MAX_BATCH_SIZE);\n const promise: Promise<void> = fetch(`${this.baseUrl}/api/v1/usage`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ events: batch }),\n }).then(() => {}, () => {});\n\n return awaited ? promise : undefined;\n }\n\n /** Uses sendBeacon for guaranteed delivery on page unload */\n private _flushBeacon(): void {\n if (this.queue.length === 0 || typeof navigator === 'undefined') return;\n const batch = this.queue.splice(0);\n navigator.sendBeacon(\n `${this.baseUrl}/api/v1/usage`,\n new Blob([JSON.stringify({ events: batch })], { type: 'application/json' }),\n );\n }\n}\n","import type { Address } from 'viem';\n\n// ─── Chainlink ABI ────────────────────────────────────────────────────────────\n\nexport const AGGREGATOR_ABI = [\n {\n inputs: [],\n name: 'latestRoundData',\n outputs: [\n { name: 'roundId', type: 'uint80' },\n { name: 'answer', type: 'int256' },\n { name: 'startedAt', type: 'uint256' },\n { name: 'updatedAt', type: 'uint256' },\n { name: 'answeredInRound', type: 'uint80' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint8' }],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n\n// ─── Chainlink feed registry ──────────────────────────────────────────────────\n// Keyed by chainId → SYMBOL → aggregator address.\n// Source: https://docs.chain.link/data-feeds/price-feeds/addresses\n\nexport const CHAINLINK_FEEDS: Record<number, Record<string, Address>> = {\n\n // Ethereum Mainnet\n 1: {\n ETH: '0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419',\n BTC: '0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88b',\n BNB: '0x14e613AC84a31f709eadbEF3bf98585328207896',\n MATIC:'0x7bAC85A8a13A4BcD8abb3eB7d6b4d632c895a5f6',\n AVAX: '0xFF3EEb22B5E3dE6e705b44749C2559d704923FD7',\n LINK: '0x2c1d072e956AFFC0D435Cb7AC308d97936742191',\n UNI: '0x553303d460EE0afB37EdFf9bE42922D8FF63220e',\n AAVE: '0x547a514d5e3769680Ce22B2361c10Ea13619e8a9',\n MKR: '0xec1D1B3b0443256cc3860e24a46F108e699484Aa',\n SNX: '0xDC3EA94CD0AC27d9A86C180091e7f78C683d3699',\n CRV: '0xCd627aA160A6fA45Eb793D19Ef54f5062F20f33',\n USDC: '0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6',\n USDT: '0x3E7d1eAB13ad0104d2750B8863b489D65364e32D',\n DAI: '0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9',\n FRAX: '0xB9E1E3A9feFf48998E45Fa90847ed4D467E8BcfD',\n },\n\n // Base\n 8453: {\n ETH: '0x71041dddad3595F9CEd3dCCFBe3D1F4b0a16Bb70',\n BTC: '0x64c911996D3c6aC71f9b455B1E8E7266BcFBF15F',\n LINK: '0x56a43EB56Da12C0dc1D972ACb089c06a5dEF8e69',\n USDC: '0x7e860098F58bBFC8648a4311b374B1D669a2bc9b',\n },\n\n // Polygon\n 137: {\n ETH: '0xF9680D99D6C9589e2a93a78A04A279e509205945',\n BTC: '0xc907E116054Ad103354f2D350FD2514433D57F6f',\n MATIC:'0xAB594600376Ec9fD91F8e885dADF0CE036862dE0',\n LINK: '0xd9FFdb71EbE7496cC440152d43986Aae0AB76665',\n AAVE: '0x72484B12719E23115761D5DA1646945632979bB6',\n UNI: '0xdf0Fb4e4F928d2dCB76f438575fDD8682386e13C',\n USDC: '0xfE4A8cc5b5B2366C1B58Bea3858e81843581b2F7',\n USDT: '0x0A6513e40db6EB1b165753AD52E80663aea50545',\n DAI: '0x4746DeC9e833A82EC7C2C1356372CcF2cfcD2F3D',\n },\n\n // Arbitrum One\n 42161: {\n ETH: '0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612',\n BTC: '0x6ce185860a4963106506C203335A2910413708e9',\n LINK: '0x86E53CF1B873786aC9Cc60cde71fFd0035d6df2d',\n ARB: '0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6',\n USDC: '0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3',\n USDT: '0x3f3f5dF88dC9F13eac63DF89EC16ef6e7E25DdE7',\n },\n\n // Optimism\n 10: {\n ETH: '0x13e3Ee699D1909E989722E753853AE30b17e08c5',\n BTC: '0xD702DD976Fb76Fffc2D3963D037dfDae5b04E593',\n LINK: '0xCc232dcFAAE6354cE191Bd574108c1aD03f86450',\n OP: '0x0D276FC14719f9292D5C1eA2198673d1f4269246',\n USDC: '0x16a9FA2FDa030272Ce99B29CF780dFA30361d35f',\n USDT: '0xECef79E109e997bCA29c1c0897ec9d7b03647F5E',\n },\n\n // BNB Smart Chain\n 56: {\n BNB: '0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE',\n ETH: '0x9ef1B8c0E4F7dc8bF5719Ea496883DC6401d5b2',\n BTC: '0x264990fbd0A4796A3E3d8E37C4d5F87a3aCa5Ebf',\n LINK: '0xca236E327F629f9Fc2c30A4E95775EbF0B89fac8',\n USDT: '0xB97Ad0E74fa7d920791E90258A6E2085088b4320',\n DAI: '0x132d3C0B1D2cEa0BC552588063bdBb210FDeecfA',\n },\n\n // Avalanche C-Chain\n 43114: {\n ETH: '0x976B3D034E162d8bD72D6b9C989d545b839003b0',\n BTC: '0x2779D32d5166BAaa2B2b658333bA7e6Ec0C65743',\n AVAX: '0x0A77230d17318075983913bC2145DB16C7366156',\n LINK: '0x49ccd9ca821EfEab2b98c60DC60F518E765eDe9a',\n USDC: '0xF096872672F44d6EBA71527d2277B6f4B77Ea29A',\n USDT: '0xEBE676ee90Fe1112671f19b6B7459bC678B67e8a',\n },\n};\n\n// ─── CoinGecko fallback registry ──────────────────────────────────────────────\n// Maps uppercase symbol → CoinGecko asset ID.\n// Used when no Chainlink feed exists for the current chain+symbol.\n\nexport const COINGECKO_IDS: Record<string, string> = {\n // Native tokens\n ETH: 'ethereum',\n BTC: 'bitcoin',\n BNB: 'binancecoin',\n MATIC: 'matic-network',\n POL: 'matic-network',\n AVAX: 'avalanche-2',\n FTM: 'fantom',\n GLMR: 'moonbeam',\n CELO: 'celo',\n XDAI: 'xdai',\n GNO: 'gnosis',\n MNT: 'mantle',\n\n // Major stables\n USDC: 'usd-coin',\n USDT: 'tether',\n DAI: 'dai',\n BUSD: 'binance-usd',\n FRAX: 'frax',\n LUSD: 'liquity-usd',\n GUSD: 'gemini-dollar',\n TUSD: 'true-usd',\n USDD: 'usdd',\n FDUSD: 'first-digital-usd',\n\n // DeFi blue chips\n LINK: 'chainlink',\n UNI: 'uniswap',\n AAVE: 'aave',\n MKR: 'maker',\n SNX: 'havven',\n CRV: 'curve-dao-token',\n LDO: 'lido-dao',\n RPL: 'rocket-pool',\n BAL: 'balancer',\n COMP: 'compound-governance-token',\n YFI: 'yearn-finance',\n SUSHI: 'sushi',\n\n // L2 tokens\n ARB: 'arbitrum',\n OP: 'optimism',\n IMX: 'immutable-x',\n\n // Other popular alts\n DOGE: 'dogecoin',\n SHIB: 'shiba-inu',\n PEPE: 'pepe',\n WLD: 'worldcoin-wld',\n APE: 'apecoin',\n GRT: 'the-graph',\n ENS: 'ethereum-name-service',\n BLUR: 'blur',\n};\n","import type { PublicClient } from 'viem';\nimport { AGGREGATOR_ABI, CHAINLINK_FEEDS, COINGECKO_IDS } from './feeds';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface PriceResult {\n /** Uppercase token symbol (e.g. \"ETH\", \"USDC\") */\n symbol: string;\n /** Current USD price */\n price: number;\n /** Where the price came from */\n source: 'chainlink' | 'coingecko';\n /** Unix timestamp of the last update (only set for chainlink source) */\n updatedAt?: number;\n /** True when chainlink data is older than 2 hours */\n stale?: boolean;\n}\n\n// ─── Chainlink helpers ────────────────────────────────────────────────────────\n\nconst TWO_HOURS_SECS = 7200;\n\nasync function fetchChainlink(\n publicClient: PublicClient,\n chainId: number,\n symbol: string,\n): Promise<PriceResult | null> {\n const feeds = CHAINLINK_FEEDS[chainId];\n if (!feeds) return null;\n\n const address = feeds[symbol.toUpperCase()];\n if (!address) return null;\n\n try {\n const [roundData, rawDecimals] = await Promise.all([\n publicClient.readContract({\n address,\n abi: AGGREGATOR_ABI,\n functionName: 'latestRoundData',\n }),\n publicClient.readContract({\n address,\n abi: AGGREGATOR_ABI,\n functionName: 'decimals',\n }),\n ]);\n\n const answer = roundData[1]; // int256\n const updatedAt = Number(roundData[3]);\n const decimals = Number(rawDecimals);\n\n if (answer <= 0n) return null;\n\n const price = Number(answer) / 10 ** decimals;\n const stale = Date.now() / 1000 - updatedAt > TWO_HOURS_SECS;\n\n return { symbol: symbol.toUpperCase(), price, source: 'chainlink', updatedAt, stale };\n } catch {\n return null;\n }\n}\n\n// ─── CoinGecko helpers ────────────────────────────────────────────────────────\n\nconst CG_BASE = 'https://api.coingecko.com/api/v3';\n\nasync function fetchCoinGecko(symbols: string[]): Promise<Record<string, number>> {\n const ids = symbols\n .map(s => COINGECKO_IDS[s.toUpperCase()])\n .filter(Boolean);\n\n if (ids.length === 0) return {};\n\n const url = `${CG_BASE}/simple/price?ids=${ids.join(',')}&vs_currencies=usd`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`[awarizon/price] CoinGecko returned ${res.status}`);\n\n const data = (await res.json()) as Record<string, { usd?: number }>;\n\n const out: Record<string, number> = {};\n for (const sym of symbols) {\n const id = COINGECKO_IDS[sym.toUpperCase()];\n const price = id ? data[id]?.usd : undefined;\n if (price !== undefined) out[sym.toUpperCase()] = price;\n }\n return out;\n}\n\n// ─── PriceEngine ─────────────────────────────────────────────────────────────\n\n/**\n * Fetches USD prices via Chainlink on-chain feeds (primary) with automatic\n * fallback to CoinGecko's free API when no feed exists for the current chain.\n *\n * Attached to the SDK as `awarizon.price`.\n *\n * @example\n * ```ts\n * const { price } = await awarizon.price.get('ETH')\n * // → { symbol: 'ETH', price: 3421.57, source: 'chainlink', updatedAt: 1720000000 }\n *\n * const prices = await awarizon.price.getMany(['ETH', 'BTC', 'USDC', 'ARB'])\n * // → { ETH: { price: 3421 }, BTC: { price: 68200 }, ... }\n * ```\n */\nexport class PriceEngine {\n constructor(\n private readonly publicClient: PublicClient,\n private readonly chainId: number,\n ) {}\n\n /**\n * Get the current USD price of a single token by symbol.\n * Tries Chainlink first; falls back to CoinGecko on failure or missing feed.\n *\n * @param symbol - Token symbol: 'ETH', 'BTC', 'USDC', 'LINK', etc.\n *\n * @example\n * const { price, source } = await awarizon.price.get('ETH')\n */\n async get(symbol: string): Promise<PriceResult> {\n const sym = symbol.toUpperCase();\n\n // 1. Try Chainlink on the current chain\n const chainlink = await fetchChainlink(this.publicClient, this.chainId, sym);\n if (chainlink && !chainlink.stale) return chainlink;\n\n // 2. Fall back to CoinGecko\n if (COINGECKO_IDS[sym]) {\n try {\n const cgPrices = await fetchCoinGecko([sym]);\n const price = cgPrices[sym];\n if (price !== undefined) {\n return { symbol: sym, price, source: 'coingecko' };\n }\n } catch {\n // CoinGecko failed — return stale chainlink if we have it\n if (chainlink) return chainlink;\n }\n }\n\n // 3. Return stale chainlink if that's all we have\n if (chainlink) return chainlink;\n\n throw new Error(\n `[awarizon/price] No price available for \"${sym}\". ` +\n `No Chainlink feed on chain ${this.chainId} and CoinGecko ID not registered. ` +\n `Supported symbols: ETH, BTC, BNB, MATIC, AVAX, LINK, UNI, AAVE, USDC, USDT, DAI, and more.`,\n );\n }\n\n /**\n * Get USD prices for multiple tokens in one call.\n * Chainlink feeds are read in parallel; CoinGecko batch-fetches all remaining\n * symbols in a single HTTP request — efficient even for large lists.\n *\n * @param symbols - Array of token symbols: ['ETH', 'BTC', 'USDC']\n *\n * @example\n * const prices = await awarizon.price.getMany(['ETH', 'BTC', 'USDC', 'ARB'])\n * console.log(prices.ETH.price) // 3421.57\n * console.log(prices.ARB.source) // 'coingecko' (no feed on most chains)\n */\n async getMany(symbols: string[]): Promise<Record<string, PriceResult>> {\n const syms = symbols.map(s => s.toUpperCase());\n\n // Fire all Chainlink lookups in parallel\n const chainlinkResults = await Promise.all(\n syms.map(sym => fetchChainlink(this.publicClient, this.chainId, sym)),\n );\n\n const out: Record<string, PriceResult> = {};\n const needsCG: string[] = [];\n\n for (let i = 0; i < syms.length; i++) {\n const sym = syms[i];\n const cl = chainlinkResults[i];\n\n if (cl && !cl.stale) {\n out[sym] = cl;\n } else {\n needsCG.push(sym);\n }\n }\n\n // One CoinGecko call for everything that didn't resolve via Chainlink\n if (needsCG.length > 0) {\n try {\n const cgPrices = await fetchCoinGecko(needsCG);\n for (const sym of needsCG) {\n const price = cgPrices[sym];\n if (price !== undefined) {\n out[sym] = { symbol: sym, price, source: 'coingecko' };\n } else {\n // Last resort: return stale chainlink if we have it\n const cl = chainlinkResults[syms.indexOf(sym)];\n if (cl) out[sym] = cl;\n }\n }\n } catch {\n // CoinGecko failed — fill in stale chainlink values where available\n for (const sym of needsCG) {\n const cl = chainlinkResults[syms.indexOf(sym)];\n if (cl) out[sym] = cl;\n }\n }\n }\n\n return out;\n }\n\n /**\n * Check whether a Chainlink feed exists for the given symbol on the current chain.\n *\n * @example\n * awarizon.price.hasFeed('ETH') // true on mainnet, base, polygon, etc.\n * awarizon.price.hasFeed('ARB') // true on Arbitrum, false elsewhere\n */\n hasFeed(symbol: string): boolean {\n return !!(CHAINLINK_FEEDS[this.chainId]?.[symbol.toUpperCase()]);\n }\n\n /**\n * Return all symbols that have a Chainlink feed on the current chain.\n *\n * @example\n * awarizon.price.supportedSymbols()\n * // → ['ETH', 'BTC', 'LINK', 'USDC', 'USDT', 'DAI'] on Base\n */\n supportedSymbols(): string[] {\n return Object.keys(CHAINLINK_FEEDS[this.chainId] ?? {});\n }\n}\n","import { erc20Abi, type Address, type Abi } from 'viem';\nimport type { ContractInstance, TransactionResult } from './types';\n\n// ─── ERC-20 ───────────────────────────────────────────────────────────────────\n\nexport const ERC20_ABI = erc20Abi;\n\nexport interface Erc20Contract {\n name(): Promise<string>;\n symbol(): Promise<string>;\n decimals(): Promise<number>;\n totalSupply(): Promise<bigint>;\n balanceOf(owner: Address): Promise<bigint>;\n allowance(owner: Address, spender: Address): Promise<bigint>;\n transfer(to: Address, amount: bigint): Promise<TransactionResult>;\n transferFrom(from: Address, to: Address, amount: bigint): Promise<TransactionResult>;\n approve(spender: Address, amount: bigint): Promise<TransactionResult>;\n on: ContractInstance['on'];\n estimateGas: ContractInstance['estimateGas'];\n readonly _address: Address;\n readonly _abi: Abi;\n}\n\n// ─── ERC-721 ──────────────────────────────────────────────────────────────────\n// Single safeTransferFrom overload (3-arg) to avoid ABI duplicate conflicts.\n// Includes tokenURI + totalSupply (ERC721Metadata / ERC721Enumerable extensions\n// present on virtually every deployed NFT contract).\n\nexport const ERC721_ABI = [\n { type: 'function', name: 'name', stateMutability: 'view', inputs: [], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'symbol', stateMutability: 'view', inputs: [], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'tokenURI', stateMutability: 'view', inputs: [{ name: 'tokenId', type: 'uint256' }], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'totalSupply', stateMutability: 'view', inputs: [], outputs: [{ type: 'uint256' }] },\n { type: 'function', name: 'ownerOf', stateMutability: 'view', inputs: [{ name: 'tokenId', type: 'uint256' }], outputs: [{ type: 'address' }] },\n { type: 'function', name: 'balanceOf', stateMutability: 'view', inputs: [{ name: 'owner', type: 'address' }], outputs: [{ type: 'uint256' }] },\n { type: 'function', name: 'getApproved', stateMutability: 'view', inputs: [{ name: 'tokenId', type: 'uint256' }], outputs: [{ type: 'address' }] },\n { type: 'function', name: 'isApprovedForAll', stateMutability: 'view', inputs: [{ name: 'owner', type: 'address' }, { name: 'operator', type: 'address' }], outputs: [{ type: 'bool' }] },\n { type: 'function', name: 'transferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'tokenId', type: 'uint256' }], outputs: [] },\n { type: 'function', name: 'safeTransferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'tokenId', type: 'uint256' }], outputs: [] },\n { type: 'function', name: 'approve', stateMutability: 'nonpayable', inputs: [{ name: 'to', type: 'address' }, { name: 'tokenId', type: 'uint256' }], outputs: [] },\n { type: 'function', name: 'setApprovalForAll', stateMutability: 'nonpayable', inputs: [{ name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }], outputs: [] },\n { type: 'event', name: 'Transfer', inputs: [{ indexed: true, name: 'from', type: 'address' }, { indexed: true, name: 'to', type: 'address' }, { indexed: true, name: 'tokenId', type: 'uint256' }] },\n { type: 'event', name: 'Approval', inputs: [{ indexed: true, name: 'owner', type: 'address' }, { indexed: true, name: 'approved', type: 'address' }, { indexed: true, name: 'tokenId', type: 'uint256' }] },\n { type: 'event', name: 'ApprovalForAll', inputs: [{ indexed: true, name: 'owner', type: 'address' }, { indexed: true, name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }] },\n] as const;\n\nexport interface Erc721Contract {\n name(): Promise<string>;\n symbol(): Promise<string>;\n tokenURI(tokenId: bigint): Promise<string>;\n totalSupply(): Promise<bigint>;\n ownerOf(tokenId: bigint): Promise<Address>;\n balanceOf(owner: Address): Promise<bigint>;\n getApproved(tokenId: bigint): Promise<Address>;\n isApprovedForAll(owner: Address, operator: Address): Promise<boolean>;\n transferFrom(from: Address, to: Address, tokenId: bigint): Promise<TransactionResult>;\n safeTransferFrom(from: Address, to: Address, tokenId: bigint): Promise<TransactionResult>;\n approve(to: Address, tokenId: bigint): Promise<TransactionResult>;\n setApprovalForAll(operator: Address, approved: boolean): Promise<TransactionResult>;\n on: ContractInstance['on'];\n estimateGas: ContractInstance['estimateGas'];\n readonly _address: Address;\n readonly _abi: Abi;\n}\n\n// ─── ERC-1155 ─────────────────────────────────────────────────────────────────\n\nexport const ERC1155_ABI = [\n { type: 'function', name: 'uri', stateMutability: 'view', inputs: [{ name: 'id', type: 'uint256' }], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'balanceOf', stateMutability: 'view', inputs: [{ name: 'account', type: 'address' }, { name: 'id', type: 'uint256' }], outputs: [{ type: 'uint256' }] },\n { type: 'function', name: 'balanceOfBatch', stateMutability: 'view', inputs: [{ name: 'accounts', type: 'address[]' }, { name: 'ids', type: 'uint256[]' }], outputs: [{ type: 'uint256[]' }] },\n { type: 'function', name: 'isApprovedForAll', stateMutability: 'view', inputs: [{ name: 'account', type: 'address' }, { name: 'operator', type: 'address' }], outputs: [{ type: 'bool' }] },\n { type: 'function', name: 'setApprovalForAll', stateMutability: 'nonpayable', inputs: [{ name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }], outputs: [] },\n { type: 'function', name: 'safeTransferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'id', type: 'uint256' }, { name: 'amount', type: 'uint256' }, { name: 'data', type: 'bytes' }], outputs: [] },\n { type: 'function', name: 'safeBatchTransferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'ids', type: 'uint256[]' }, { name: 'amounts', type: 'uint256[]' }, { name: 'data', type: 'bytes' }], outputs: [] },\n { type: 'event', name: 'TransferSingle', inputs: [{ indexed: true, name: 'operator', type: 'address' }, { indexed: true, name: 'from', type: 'address' }, { indexed: true, name: 'to', type: 'address' }, { name: 'id', type: 'uint256' }, { name: 'value', type: 'uint256' }] },\n { type: 'event', name: 'TransferBatch', inputs: [{ indexed: true, name: 'operator', type: 'address' }, { indexed: true, name: 'from', type: 'address' }, { indexed: true, name: 'to', type: 'address' }, { name: 'ids', type: 'uint256[]' }, { name: 'values', type: 'uint256[]' }] },\n { type: 'event', name: 'ApprovalForAll', inputs: [{ indexed: true, name: 'account', type: 'address' }, { indexed: true, name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }] },\n] as const;\n\nexport interface Erc1155Contract {\n uri(id: bigint): Promise<string>;\n balanceOf(account: Address, id: bigint): Promise<bigint>;\n balanceOfBatch(accounts: Address[], ids: bigint[]): Promise<bigint[]>;\n isApprovedForAll(account: Address, operator: Address): Promise<boolean>;\n setApprovalForAll(operator: Address, approved: boolean): Promise<TransactionResult>;\n safeTransferFrom(from: Address, to: Address, id: bigint, amount: bigint, data: `0x${string}`): Promise<TransactionResult>;\n safeBatchTransferFrom(from: Address, to: Address, ids: bigint[], amounts: bigint[], data: `0x${string}`): Promise<TransactionResult>;\n on: ContractInstance['on'];\n estimateGas: ContractInstance['estimateGas'];\n readonly _address: Address;\n readonly _abi: Abi;\n}\n","import {\n createPublicClient,\n http,\n type Chain,\n type WalletClient,\n type PublicClient,\n type Address,\n type Abi,\n type Hex,\n} from 'viem';\nimport { WalletEngine } from '@awarizon/wallet-engine';\nimport type {\n CreatedWallet,\n ImportedWalletFromMnemonic,\n ImportedWalletFromPrivateKey,\n ExternalWalletClient,\n EIP1193Provider,\n ConnectorInfo,\n WalletChangeEvent,\n ChainChangeEvent,\n SignTypedDataParams,\n} from '@awarizon/wallet-engine';\nimport { TransactionEngine } from '@awarizon/tx-engine';\nimport type { TransactionResult } from '@awarizon/tx-engine';\nimport { resolveChain, getChainTransport } from './chains';\nimport { buildContractInstance } from './contract';\nimport { TelemetryClient } from './telemetry';\nimport { ApiKeyRequiredError } from './errors';\nimport { PriceEngine } from './price';\nimport {\n ERC20_ABI,\n ERC721_ABI,\n ERC1155_ABI,\n} from './standards';\nimport type {\n Erc20Contract,\n Erc721Contract,\n Erc1155Contract,\n} from './standards';\nimport type {\n AwarizonConfig,\n ContractConfig,\n ContractInstance,\n ContractRegistryEntry,\n SDKWalletInfo,\n} from './types';\n\n// Re-export errors so consumers only need one import path\nexport {\n WalletNotConnectedError,\n InvalidMnemonicError,\n InvalidPrivateKeyError,\n ChainMismatchError,\n} from '@awarizon/wallet-engine';\n\nexport {\n ContractExecutionError,\n SimulationError,\n GasEstimationError,\n} from '@awarizon/tx-engine';\n\nexport {\n InvalidABIError,\n} from '@awarizon/abi-engine';\n\nexport {\n NetworkMismatchError,\n ProviderError,\n ContractNotLoadedError,\n UnsupportedChainError,\n ApiKeyRequiredError,\n InvalidApiKeyError,\n} from './errors';\n\n// ─── WalletProxy ──────────────────────────────────────────────────────────────\n\n/**\n * Wraps WalletEngine and gates mutating operations (create, import) behind\n * API key validation. Read-only operations (address, isConnected, etc.) are\n * never gated since they need no network access.\n */\nclass WalletProxy {\n constructor(\n private readonly engine: WalletEngine,\n private readonly ensureReady: () => Promise<void>,\n ) {}\n\n // ── Gated async operations ──────────────────────────────────────────────────\n\n async create(): Promise<CreatedWallet> {\n await this.ensureReady();\n return this.engine.create();\n }\n\n async importMnemonic(\n mnemonic: string,\n addressIndex?: number,\n ): Promise<ImportedWalletFromMnemonic> {\n await this.ensureReady();\n return this.engine.importMnemonic(mnemonic, addressIndex);\n }\n\n async importPrivateKey(\n privateKey: Hex,\n ): Promise<ImportedWalletFromPrivateKey> {\n await this.ensureReady();\n return this.engine.importPrivateKey(privateKey);\n }\n\n // ── Pass-throughs (sync, no network) ───────────────────────────────────────\n\n address(): Address { return this.engine.address(); }\n getSigner(): WalletClient { return this.engine.getWalletClient(); }\n getWalletClient(): WalletClient { return this.engine.getWalletClient(); }\n isConnected(): boolean { return this.engine.isConnected(); }\n hasExternalWallet(): boolean { return this.engine.hasExternalWallet(); }\n hasInternalWallet(): boolean { return this.engine.hasInternalWallet(); }\n getConnectorInfo(): ConnectorInfo { return this.engine.getConnectorInfo(); }\n\n connectExternal(\n c: ExternalWalletClient,\n info?: { name?: string; icon?: string },\n ): void { this.engine.connectExternal(c, info); }\n\n disconnectExternal(): void { this.engine.disconnectExternal(); }\n disconnect(): void { this.engine.disconnect(); }\n\n async switchChain(chain: Chain): Promise<void> {\n return this.engine.switchChain(chain);\n }\n\n // ── Gated async — EIP-1193, signing, chain awareness ───────────────────────\n\n async connectEIP1193(\n provider: EIP1193Provider,\n info?: { name?: string; icon?: string },\n ): Promise<void> {\n await this.ensureReady();\n return this.engine.connectEIP1193(provider, info);\n }\n\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signMessage(message);\n }\n\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signTypedData(params);\n }\n\n async getChainId(): Promise<number> { return this.engine.getChainId(); }\n async isChainMismatch(): Promise<boolean> { return this.engine.isChainMismatch(); }\n\n // ── Event subscriptions ────────────────────────────────────────────────────\n\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this.engine.onWalletChange(cb);\n }\n\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this.engine.onChainChange(cb);\n }\n}\n\n// ─── AwarizonWeb3 ─────────────────────────────────────────────────────────────\n\n/**\n * Primary entry point for the Awarizon Web3 SDK.\n *\n * An API key is required — get yours at https://awarizon.com/dashboard/api-keys\n *\n * ```ts\n * const awarizon = new AwarizonWeb3({ chain: \"base\", apiKey: \"awz_live_...\" })\n *\n * // Internal wallet\n * const wallet = await awarizon.wallet.create()\n *\n * // Load a contract\n * const staking = await awarizon.contract({ address: \"0x...\", abi })\n * await staking.stake(100n)\n * staking.on(\"Staked\", (log) => console.log(log))\n * ```\n */\nexport class AwarizonWeb3 {\n readonly chain: Chain;\n readonly publicClient: PublicClient;\n\n /** Wallet management — create, import, or connect external wallets */\n readonly wallet: WalletProxy;\n\n /**\n * Token price engine — Chainlink on-chain feeds with CoinGecko fallback.\n *\n * @example\n * const { price } = await awarizon.price.get('ETH')\n * const prices = await awarizon.price.getMany(['ETH', 'BTC', 'USDC'])\n */\n readonly price: PriceEngine;\n\n private readonly _engine: WalletEngine;\n private readonly _txEngine: TransactionEngine;\n private readonly _telemetry: TelemetryClient;\n private readonly _walletConnectProjectId: string | undefined;\n\n // Contract instances are cached by address — same address returns same instance.\n // Cache is cleared on switchChain() since contracts are chain-specific.\n private _contractCache = new Map<string, { abiRef: Abi; instance: ContractInstance }>();\n\n // Named contract registry — register once, reference by name anywhere.\n private _registry = new Map<string, ContractRegistryEntry>();\n\n constructor(config: AwarizonConfig) {\n if (!config.apiKey) throw new ApiKeyRequiredError();\n\n this.chain = resolveChain(config.chain);\n\n this.publicClient = createPublicClient({\n chain: this.chain,\n transport: getChainTransport(this.chain, config.rpcUrl),\n });\n\n this._engine = new WalletEngine({\n chain: this.chain,\n publicClient: this.publicClient,\n rpcUrl: config.rpcUrl,\n getTransport: (chain) => getChainTransport(chain, config.rpcUrl),\n });\n\n // Single TransactionEngine shared across all contracts loaded from this SDK instance\n this._txEngine = new TransactionEngine(\n this.publicClient,\n () => this._engine.getWalletClient(),\n );\n\n this._telemetry = new TelemetryClient(config.apiKey, config.baseUrl);\n this._walletConnectProjectId = config.walletConnectProjectId;\n\n this.wallet = new WalletProxy(\n this._engine,\n () => this._telemetry.ensureValidated(),\n );\n\n this.price = new PriceEngine(this.publicClient, this.chain.id);\n\n if (config.signer) {\n this._engine.connectExternal(config.signer);\n }\n }\n\n // ─── Wallet API surface ─────────────────────────────────────────────────────\n\n /**\n * Connect any viem WalletClient (wagmi, RainbowKit, custom).\n * Optionally pass connector metadata to display in the UI.\n *\n * @example\n * awarizon.connectWallet(walletClient, { name: \"MetaMask\" })\n */\n connectWallet(\n walletClient: WalletClient,\n connectorInfo?: { name?: string; icon?: string },\n ): this {\n this._engine.connectExternal(walletClient, connectorInfo);\n return this;\n }\n\n /**\n * Connect directly from a raw EIP-1193 provider without needing wagmi.\n * Works with window.ethereum, WalletConnect v2, and any EIP-1193 object.\n *\n * @example\n * await awarizon.connectEIP1193Provider(window.ethereum, { name: \"MetaMask\" })\n */\n async connectEIP1193Provider(\n provider: EIP1193Provider,\n connectorInfo?: { name?: string; icon?: string },\n ): Promise<this> {\n await this._telemetry.ensureValidated();\n await this._engine.connectEIP1193(provider, connectorInfo);\n return this;\n }\n\n /**\n * Connect a mobile or desktop wallet using the WalletConnect v2 protocol.\n * Opens a QR-code modal (or deeplink on mobile) so the user can scan with\n * MetaMask, Rainbow, Trust Wallet, or any WalletConnect-compatible wallet.\n *\n * Requires `walletConnectProjectId` in the SDK config and the peer package:\n * `npm install @walletconnect/ethereum-provider`\n *\n * @example\n * ```ts\n * const awarizon = new AwarizonWeb3({ chain: \"base\", apiKey: \"...\", walletConnectProjectId: \"abc\" })\n * await awarizon.connectWalletConnect()\n * ```\n */\n /**\n * Connect a wallet using the WalletConnect v2 protocol.\n *\n * When called from `<ConnectButton />`, the SDK handles QR display internally.\n * When called manually, pass `onDisplayUri` to receive the WC URI and render\n * your own QR code.\n *\n * Requires `walletConnectProjectId` in the SDK config.\n *\n * @example\n * await awarizon.connectWalletConnect({\n * onDisplayUri: (uri) => console.log(\"Show QR:\", uri)\n * })\n */\n async connectWalletConnect(options?: {\n /** Called with the WalletConnect URI as soon as it's ready — render it as a QR code. */\n onDisplayUri?: (uri: string) => void;\n }): Promise<this> {\n if (!this._walletConnectProjectId) {\n throw new Error(\n '[awarizon/web3] walletConnectProjectId is not configured. ' +\n 'Pass it when creating the SDK: new AwarizonWeb3({ ..., walletConnectProjectId: \"your_id\" }).\\n' +\n 'Get a free project ID at https://cloud.walletconnect.com',\n );\n }\n\n // Minimal interface — matches the actual WalletConnect EthereumProvider shape\n type WCProvider = EIP1193Provider & { connect(): Promise<void> };\n interface WCProviderClass {\n init(opts: {\n projectId: string;\n chains: number[];\n showQrModal: boolean;\n optionalChains?: number[];\n methods?: string[];\n events?: string[];\n }): Promise<WCProvider>;\n }\n\n let EthereumProvider: WCProviderClass;\n try {\n // Function constructor keeps the import string opaque to TypeScript's DTS pass\n // so the optional peer dep doesn't cause \"module not found\" errors at build time.\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<{ default: WCProviderClass }>;\n EthereumProvider = (await load('@walletconnect/ethereum-provider')).default;\n } catch {\n throw new Error(\n '[awarizon/web3] @walletconnect/ethereum-provider is not installed.\\n' +\n 'Run: npm install @walletconnect/ethereum-provider',\n );\n }\n\n const provider = await EthereumProvider.init({\n projectId: this._walletConnectProjectId,\n chains: [this.chain.id],\n showQrModal: false, // We render our own modal — set up onDisplayUri instead\n optionalChains: [],\n methods: ['eth_sendTransaction', 'personal_sign', 'eth_signTypedData_v4'],\n events: ['chainChanged', 'accountsChanged'],\n });\n\n // Register display_uri BEFORE connect() so we catch the event synchronously\n if (options?.onDisplayUri) {\n provider.on?.('display_uri', (...args: unknown[]) => {\n options.onDisplayUri!(args[0] as string);\n });\n }\n\n // Waits until the user scans the QR and approves in their wallet\n await provider.connect();\n\n await this.connectEIP1193Provider(provider, {\n name: 'WalletConnect',\n icon: 'https://avatars.githubusercontent.com/u/37784886',\n });\n\n return this;\n }\n\n /** The WalletConnect project ID passed at construction, if any */\n get walletConnectProjectId(): string | undefined {\n return this._walletConnectProjectId;\n }\n\n disconnectWallet(): this {\n this._engine.disconnectExternal();\n return this;\n }\n\n async switchChain(chain: Chain | string): Promise<this> {\n await this._telemetry.ensureValidated();\n const resolved = resolveChain(chain);\n await this._engine.switchChain(resolved);\n this._contractCache.clear(); // contracts are chain-specific\n return this;\n }\n\n getWalletInfo(): SDKWalletInfo {\n const info = this._engine.getConnectorInfo();\n return {\n address: this._engine.address(),\n chain: this.chain,\n isExternal: this._engine.hasExternalWallet(),\n connectorName: info.name,\n };\n }\n\n /**\n * Sign a plain text or raw-bytes message.\n * Use for Sign-In with Ethereum (SIWE) and off-chain authorization.\n *\n * @example\n * const sig = await awarizon.signMessage(\"Hello, Awarizon!\")\n */\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signMessage(message);\n }\n\n /**\n * Sign EIP-712 typed structured data (permit2, SIWE, Seaport orders, etc.).\n *\n * @example\n * const sig = await awarizon.signTypedData({\n * domain: { name: \"MyApp\", version: \"1\", chainId: 8453 },\n * types: { Transfer: [{ name: \"to\", type: \"address\" }, { name: \"amount\", type: \"uint256\" }] },\n * primaryType: \"Transfer\",\n * message: { to: \"0x...\", amount: \"1000000\" },\n * })\n */\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signTypedData(params);\n }\n\n /**\n * Returns the chain ID the active wallet is currently on.\n * For external wallets this may differ from the SDK's configured chain.\n */\n async getChainId(): Promise<number> {\n return this._engine.getChainId();\n }\n\n /**\n * Returns true when the external wallet is on a different chain than the SDK.\n * Use this to show a \"wrong network\" banner in your UI.\n *\n * @example\n * if (await awarizon.isChainMismatch()) {\n * alert(\"Please switch to Base in your wallet\")\n * }\n */\n async isChainMismatch(): Promise<boolean> {\n return this._engine.isChainMismatch();\n }\n\n /**\n * Returns metadata about the currently active connector.\n * Useful for displaying \"Connected via MetaMask\" in the UI.\n */\n getConnectorInfo(): ConnectorInfo {\n return this._engine.getConnectorInfo();\n }\n\n /**\n * Subscribe to wallet changes (connect, disconnect, account switch).\n * Returns an unsubscribe function — call it on cleanup.\n *\n * @example\n * const unsub = awarizon.onWalletChange(({ address, type, name }) => {\n * console.log(\"Wallet changed:\", address, type, name)\n * })\n * unsub() // stop listening\n */\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this._engine.onWalletChange(cb);\n }\n\n /**\n * Subscribe to chain changes (switchChain calls).\n * Returns an unsubscribe function.\n */\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this._engine.onChainChange(cb);\n }\n\n // ─── Contract API ───────────────────────────────────────────────────────────\n\n /**\n * Load a deployed contract and return a fully typed, ABI-powered instance.\n * Validates the API key on the first call — subsequent calls are instant.\n *\n * Results are cached by address — calling contract() twice with the same\n * address and ABI object returns the same instance without rebuilding.\n */\n async contract<TAbi extends Abi>(config: ContractConfig<TAbi>): Promise<ContractInstance> {\n await this._telemetry.ensureValidated();\n\n if (!config.address || !config.abi) {\n throw new Error('[awarizon/web3] awarizon.contract() requires both address and abi');\n }\n\n const key = config.address.toLowerCase();\n const cached = this._contractCache.get(key);\n if (cached && cached.abiRef === (config.abi as Abi)) return cached.instance;\n\n const instance = buildContractInstance(\n config.address,\n config.abi as Abi,\n this.publicClient,\n this._txEngine,\n this._telemetry,\n this.chain,\n );\n this._contractCache.set(key, { abiRef: config.abi as Abi, instance });\n return instance;\n }\n\n /**\n * Load multiple contracts in parallel. Validates the API key once, then\n * instantiates all contracts concurrently.\n *\n * @example\n * ```ts\n * const [token, staking, nft] = await awarizon.contracts([\n * { address: tokenAddr, abi: ERC20_ABI },\n * { address: stakingAddr, abi: STAKING_ABI },\n * { address: nftAddr, abi: ERC721_ABI },\n * ])\n * ```\n */\n async contracts(configs: Array<{ address: Address; abi: Abi }>): Promise<ContractInstance[]> {\n return Promise.all(configs.map(c => this.contract(c)));\n }\n\n /**\n * Call a read-only (view/pure) contract function directly without loading\n * a full contract instance. Best for one-off reads.\n *\n * @example\n * ```ts\n * const balance = await awarizon.read<bigint>({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"balanceOf\",\n * args: [userAddress],\n * })\n * ```\n */\n async read<T = unknown>(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n }): Promise<T> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.read({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n });\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result as T;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Execute a state-mutating contract function directly without loading a full\n * contract instance. Best for one-off writes.\n *\n * @example\n * ```ts\n * const { hash, receipt } = await awarizon.write({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"transfer\",\n * args: [recipient, 100n],\n * })\n * ```\n */\n async write(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n value?: bigint;\n gas?: bigint;\n }): Promise<TransactionResult> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.write({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n value: params.value,\n gas: params.gas,\n });\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Batch multiple read calls into a single RPC round-trip using multicall3.\n * Falls back to parallel individual reads on chains where multicall3 is\n * not deployed.\n *\n * @example\n * ```ts\n * const [balance, supply, allowance] = await awarizon.multicall([\n * { address: tokenAddr, abi: ERC20_ABI, method: \"balanceOf\", args: [userAddr] },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"totalSupply\" },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"allowance\", args: [userAddr, spenderAddr] },\n * ])\n * ```\n */\n async multicall(\n calls: Array<{ address: Address; abi: Abi; method: string; args?: unknown[] }>,\n ): Promise<unknown[]> {\n await this._telemetry.ensureValidated();\n\n const contracts = calls.map(c => ({\n address: c.address,\n abi: c.abi,\n functionName: c.method,\n args: (c.args ?? []) as readonly unknown[],\n }));\n\n try {\n // Single RPC round-trip via multicall3\n const results = await this.publicClient.multicall({\n contracts: contracts as any,\n allowFailure: false,\n });\n return results as unknown[];\n } catch {\n // Multicall3 not deployed on this chain — fall back to parallel reads\n return Promise.all(\n contracts.map(c =>\n this.publicClient.readContract(c as any),\n ),\n );\n }\n }\n\n // ─── ERC Standard Clients ───────────────────────────────────────────────────\n\n /**\n * Load an ERC-20 token with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const token = await awarizon.erc20(\"0x...\")\n * const balance = await token.balanceOf(userAddress)\n * const symbol = await token.symbol()\n * await token.transfer(recipient, 100n)\n * ```\n */\n async erc20(address: Address): Promise<Erc20Contract> {\n const instance = await this.contract({ address, abi: ERC20_ABI as unknown as Abi });\n return instance as unknown as Erc20Contract;\n }\n\n /**\n * Load an ERC-721 NFT contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const nft = await awarizon.erc721(\"0x...\")\n * const owner = await nft.ownerOf(1n)\n * const uri = await nft.tokenURI(1n)\n * await nft.transferFrom(from, to, 1n)\n * ```\n */\n async erc721(address: Address): Promise<Erc721Contract> {\n const instance = await this.contract({ address, abi: ERC721_ABI as unknown as Abi });\n return instance as unknown as Erc721Contract;\n }\n\n /**\n * Load an ERC-1155 multi-token contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const items = await awarizon.erc1155(\"0x...\")\n * const balance = await items.balanceOf(userAddress, 42n)\n * const uri = await items.uri(42n)\n * await items.safeTransferFrom(from, to, 42n, 1n, \"0x\")\n * ```\n */\n async erc1155(address: Address): Promise<Erc1155Contract> {\n const instance = await this.contract({ address, abi: ERC1155_ABI as unknown as Abi });\n return instance as unknown as Erc1155Contract;\n }\n\n // ─── Named Contract Registry ────────────────────────────────────────────────\n\n /**\n * Register a contract under a human-readable name.\n * After registering, use `awarizon.use(name)` anywhere instead of repeating\n * address + ABI every time.\n *\n * ```ts\n * awarizon.register(\"USDC\", { address: \"0x...\", abi: erc20Abi })\n * awarizon.register(\"Vault\", { address: \"0x...\", abi: vaultAbi })\n *\n * const usdc = await awarizon.use(\"USDC\")\n * const vault = await awarizon.use(\"Vault\")\n * ```\n */\n register(name: string, config: ContractRegistryEntry): this {\n this._registry.set(name, config);\n return this;\n }\n\n /**\n * Retrieve a previously registered contract by name.\n * Throws a descriptive error if the name was never registered.\n *\n * ```ts\n * const usdc = await awarizon.use(\"USDC\")\n * await usdc.transfer(recipient, 100n)\n * ```\n */\n async use(name: string): Promise<ContractInstance> {\n const config = this._registry.get(name);\n if (!config) {\n const registered = [...this._registry.keys()].join(', ') || 'none';\n throw new Error(\n `[awarizon/web3] Contract \"${name}\" is not registered.\\n` +\n `Call awarizon.register(\"${name}\", { address, abi }) first.\\n` +\n `Currently registered: ${registered}`,\n );\n }\n return this.contract(config);\n }\n\n /**\n * Remove a registered contract from the registry.\n *\n * ```ts\n * awarizon.unregister(\"USDC\")\n * ```\n */\n unregister(name: string): this {\n this._registry.delete(name);\n return this;\n }\n\n /**\n * Return all registered contract names.\n */\n registeredContracts(): string[] {\n return [...this._registry.keys()];\n }\n\n // ─── Accessors ──────────────────────────────────────────────────────────────\n\n get chainId(): number {\n return this.chain.id;\n }\n\n get isConnected(): boolean {\n return this._engine.isConnected();\n }\n\n /**\n * Flush pending telemetry and stop background timers.\n * Call when tearing down a long-lived SDK instance (e.g. on server shutdown).\n */\n async destroy(): Promise<void> {\n await this._telemetry.destroy();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/cryptoNode.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/utils.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/_md.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/sha2.ts","../../../node_modules/.pnpm/@scure+base@1.2.6/node_modules/@scure/base/index.ts","../../../node_modules/.pnpm/@scure+bip39@1.6.0/node_modules/@scure/bip39/esm/index.js","../../../node_modules/.pnpm/@scure+bip39@1.6.0/node_modules/@scure/bip39/esm/wordlists/english.js","../../wallet-engine/src/errors.ts","../../wallet-engine/src/wallet.ts","../../tx-engine/src/errors.ts","../../tx-engine/src/transaction.ts","../src/chains.ts","../../abi-engine/src/errors.ts","../../abi-engine/src/parser.ts","../src/contract.ts","../src/errors.ts","../src/telemetry.ts","../src/price/feeds.ts","../src/price/index.ts","../src/standards.ts","../src/sdk.ts"],"names":["isBytes","anumber","padding","wordlist","chain","http","createPublicClient"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","file":"index.mjs","sourcesContent":["/**\n * Internal webcrypto alias.\n * We prefer WebCrypto aka globalThis.crypto, which exists in node.js 16+.\n * Falls back to Node.js built-in crypto for Node.js <=v14.\n * See utils.ts for details.\n * @module\n */\n// @ts-ignore\nimport * as nc from 'node:crypto';\nexport const crypto: any =\n nc && typeof nc === 'object' && 'webcrypto' in nc\n ? (nc.webcrypto as any)\n : nc && typeof nc === 'object' && 'randomBytes' in nc\n ? nc\n : undefined;\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\n/** Asserts something is hash */\nexport function ahash(h: IHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** @deprecated */\nexport const byteSwapIfBE: typeof swap8IfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/** Accepted input of hash functions. Strings are converted to byte arrays. */\nexport type Input = string | Uint8Array;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Hash interface. */\nexport type IHash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** For runtime check if class implements interface */\nexport abstract class Hash<T extends Hash<T>> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n abstract clone(): T;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash function */\nexport type CHash = ReturnType<typeof createHasher>;\n/** Hash function with output */\nexport type CHashO = ReturnType<typeof createOptHasher>;\n/** XOF with output */\nexport type CHashXO = ReturnType<typeof createXOFer>;\n\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher<T extends Hash<T>>(\n hashCons: () => Hash<T>\n): {\n (msg: Input): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(): Hash<T>;\n} {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function createOptHasher<H extends Hash<H>, T extends Object>(\n hashCons: (opts?: T) => Hash<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): Hash<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\n\nexport function createXOFer<H extends HashXOF<H>, T extends Object>(\n hashCons: (opts?: T) => HashXOF<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): HashXOF<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor: typeof createHasher = createHasher;\nexport const wrapConstructorWithOpts: typeof createOptHasher = createOptHasher;\nexport const wrapXOFConstructorWithOpts: typeof createXOFer = createXOFer;\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { type Input, Hash, abytes, aexists, aoutput, clean, createView, toBytes } from './utils.ts';\n\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(\n view: DataView,\n byteOffset: number,\n value: bigint,\n isLE: boolean\n): void {\n if (typeof view.setBigUint64 === 'function') return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> extends Hash<T> {\n protected abstract process(buf: DataView, offset: number): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected abstract roundClean(): void;\n\n readonly blockLen: number;\n readonly outputLen: number;\n readonly padOffset: number;\n readonly isLE: boolean;\n\n // For partial updates less than block size\n protected buffer: Uint8Array;\n protected view: DataView;\n protected finished = false;\n protected length = 0;\n protected pos = 0;\n protected destroyed = false;\n\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n super();\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data: Input): this {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n to ||= new (this.constructor as any)() as T;\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen) to.buffer.set(buffer);\n return to;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nexport class SHA256 extends HashMD<SHA256> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected A: number = SHA256_IV[0] | 0;\n protected B: number = SHA256_IV[1] | 0;\n protected C: number = SHA256_IV[2] | 0;\n protected D: number = SHA256_IV[3] | 0;\n protected E: number = SHA256_IV[4] | 0;\n protected F: number = SHA256_IV[5] | 0;\n protected G: number = SHA256_IV[6] | 0;\n protected H: number = SHA256_IV[7] | 0;\n\n constructor(outputLen: number = 32) {\n super(64, outputLen, 8, false);\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n protected set(\n A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n ): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n protected roundClean(): void {\n clean(SHA256_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\nexport class SHA224 extends SHA256 {\n protected A: number = SHA224_IV[0] | 0;\n protected B: number = SHA224_IV[1] | 0;\n protected C: number = SHA224_IV[2] | 0;\n protected D: number = SHA224_IV[3] | 0;\n protected E: number = SHA224_IV[4] | 0;\n protected F: number = SHA224_IV[5] | 0;\n protected G: number = SHA224_IV[6] | 0;\n protected H: number = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\nexport class SHA512 extends HashMD<SHA512> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n protected Ah: number = SHA512_IV[0] | 0;\n protected Al: number = SHA512_IV[1] | 0;\n protected Bh: number = SHA512_IV[2] | 0;\n protected Bl: number = SHA512_IV[3] | 0;\n protected Ch: number = SHA512_IV[4] | 0;\n protected Cl: number = SHA512_IV[5] | 0;\n protected Dh: number = SHA512_IV[6] | 0;\n protected Dl: number = SHA512_IV[7] | 0;\n protected Eh: number = SHA512_IV[8] | 0;\n protected El: number = SHA512_IV[9] | 0;\n protected Fh: number = SHA512_IV[10] | 0;\n protected Fl: number = SHA512_IV[11] | 0;\n protected Gh: number = SHA512_IV[12] | 0;\n protected Gl: number = SHA512_IV[13] | 0;\n protected Hh: number = SHA512_IV[14] | 0;\n protected Hl: number = SHA512_IV[15] | 0;\n\n constructor(outputLen: number = 64) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n protected set(\n Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n ): void {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy(): void {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\nexport class SHA384 extends SHA512 {\n protected Ah: number = SHA384_IV[0] | 0;\n protected Al: number = SHA384_IV[1] | 0;\n protected Bh: number = SHA384_IV[2] | 0;\n protected Bl: number = SHA384_IV[3] | 0;\n protected Ch: number = SHA384_IV[4] | 0;\n protected Cl: number = SHA384_IV[5] | 0;\n protected Dh: number = SHA384_IV[6] | 0;\n protected Dl: number = SHA384_IV[7] | 0;\n protected Eh: number = SHA384_IV[8] | 0;\n protected El: number = SHA384_IV[9] | 0;\n protected Fh: number = SHA384_IV[10] | 0;\n protected Fl: number = SHA384_IV[11] | 0;\n protected Gh: number = SHA384_IV[12] | 0;\n protected Gl: number = SHA384_IV[13] | 0;\n protected Hh: number = SHA384_IV[14] | 0;\n protected Hl: number = SHA384_IV[15] | 0;\n\n constructor() {\n super(48);\n }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\nexport class SHA512_224 extends SHA512 {\n protected Ah: number = T224_IV[0] | 0;\n protected Al: number = T224_IV[1] | 0;\n protected Bh: number = T224_IV[2] | 0;\n protected Bl: number = T224_IV[3] | 0;\n protected Ch: number = T224_IV[4] | 0;\n protected Cl: number = T224_IV[5] | 0;\n protected Dh: number = T224_IV[6] | 0;\n protected Dl: number = T224_IV[7] | 0;\n protected Eh: number = T224_IV[8] | 0;\n protected El: number = T224_IV[9] | 0;\n protected Fh: number = T224_IV[10] | 0;\n protected Fl: number = T224_IV[11] | 0;\n protected Gh: number = T224_IV[12] | 0;\n protected Gl: number = T224_IV[13] | 0;\n protected Hh: number = T224_IV[14] | 0;\n protected Hl: number = T224_IV[15] | 0;\n\n constructor() {\n super(28);\n }\n}\n\nexport class SHA512_256 extends SHA512 {\n protected Ah: number = T256_IV[0] | 0;\n protected Al: number = T256_IV[1] | 0;\n protected Bh: number = T256_IV[2] | 0;\n protected Bl: number = T256_IV[3] | 0;\n protected Ch: number = T256_IV[4] | 0;\n protected Cl: number = T256_IV[5] | 0;\n protected Dh: number = T256_IV[6] | 0;\n protected Dl: number = T256_IV[7] | 0;\n protected Eh: number = T256_IV[8] | 0;\n protected El: number = T256_IV[9] | 0;\n protected Fh: number = T256_IV[10] | 0;\n protected Fl: number = T256_IV[11] | 0;\n protected Gh: number = T256_IV[12] | 0;\n protected Gl: number = T256_IV[13] | 0;\n protected Hh: number = T256_IV[14] | 0;\n protected Hl: number = T256_IV[15] | 0;\n\n constructor() {\n super(32);\n }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256: CHash = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash = /* @__PURE__ */ createHasher(() => new SHA224());\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash = /* @__PURE__ */ createHasher(() => new SHA384());\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash = /* @__PURE__ */ createHasher(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash = /* @__PURE__ */ createHasher(() => new SHA512_224());\n","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder<F, T> {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder<Uint8Array, string> {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\n// no abytes: seems to have 10% slowdown. Why?!\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like <string, number>, <number, bytes>, <bytes, float>\ntype Chain = [Coder<any, any>, ...Coder<any, any>[]];\n// Extract info from Coder type\ntype Input<F> = F extends Coder<infer T, any> ? T : never;\ntype Output<F> = F extends Coder<any, infer T> ? T : never;\n// Generic function for arrays\ntype First<T> = T extends [infer U, ...any[]] ? U : never;\ntype Last<T> = T extends [...any[], infer U] ? U : never;\ntype Tail<T> = T extends [any, ...infer U] ? U : never;\n\ntype AsChain<C extends Chain, Rest = Tail<C>> = {\n // C[K] = Coder<Input<C[K]>, Input<Rest[k]>>\n [K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder<number[], string[]> {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder<string[], string> {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder<string[], string[]> {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize<T>(fn: (val: T) => T): Coder<T, T> {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder<Uint8Array, number[]> {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder<Uint8Array, number[]> {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper<T extends (...args: any) => any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes<T>): ReturnType<T> | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder<Uint8Array, Uint8Array> {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder<number[], string> = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase<Prefix>}1${string}`;\n decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded<string>;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase<Prefix>}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase<Prefix>}1${string}`;\n }\n\n function decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n","/**\n * Audited & minimal JS implementation of\n * [BIP39 mnemonic phrases](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki).\n * @module\n * @example\n```js\nimport * as bip39 from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nconst mn = bip39.generateMnemonic(wordlist);\nconsole.log(mn);\nconst ent = bip39.mnemonicToEntropy(mn, wordlist)\nbip39.entropyToMnemonic(ent, wordlist);\nbip39.validateMnemonic(mn, wordlist);\nawait bip39.mnemonicToSeed(mn, 'password');\nbip39.mnemonicToSeedSync(mn, 'password');\n\n// Wordlists\nimport { wordlist as czech } from '@scure/bip39/wordlists/czech';\nimport { wordlist as english } from '@scure/bip39/wordlists/english';\nimport { wordlist as french } from '@scure/bip39/wordlists/french';\nimport { wordlist as italian } from '@scure/bip39/wordlists/italian';\nimport { wordlist as japanese } from '@scure/bip39/wordlists/japanese';\nimport { wordlist as korean } from '@scure/bip39/wordlists/korean';\nimport { wordlist as portuguese } from '@scure/bip39/wordlists/portuguese';\nimport { wordlist as simplifiedChinese } from '@scure/bip39/wordlists/simplified-chinese';\nimport { wordlist as spanish } from '@scure/bip39/wordlists/spanish';\nimport { wordlist as traditionalChinese } from '@scure/bip39/wordlists/traditional-chinese';\n```\n */\n/*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { pbkdf2, pbkdf2Async } from '@noble/hashes/pbkdf2';\nimport { sha256, sha512 } from '@noble/hashes/sha2';\nimport { abytes, anumber, randomBytes } from '@noble/hashes/utils';\nimport { utils as baseUtils } from '@scure/base';\n// Japanese wordlist\nconst isJapanese = (wordlist) => wordlist[0] === '\\u3042\\u3044\\u3053\\u304f\\u3057\\u3093';\n// Normalization replaces equivalent sequences of characters\n// so that any two texts that are equivalent will be reduced\n// to the same sequence of code points, called the normal form of the original text.\n// https://tonsky.me/blog/unicode/#why-is-a----\nfunction nfkd(str) {\n if (typeof str !== 'string')\n throw new TypeError('invalid mnemonic type: ' + typeof str);\n return str.normalize('NFKD');\n}\nfunction normalize(str) {\n const norm = nfkd(str);\n const words = norm.split(' ');\n if (![12, 15, 18, 21, 24].includes(words.length))\n throw new Error('Invalid mnemonic');\n return { nfkd: norm, words };\n}\nfunction aentropy(ent) {\n abytes(ent, 16, 20, 24, 28, 32);\n}\n/**\n * Generate x random words. Uses Cryptographically-Secure Random Number Generator.\n * @param wordlist imported wordlist for specific language\n * @param strength mnemonic strength 128-256 bits\n * @example\n * generateMnemonic(wordlist, 128)\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function generateMnemonic(wordlist, strength = 128) {\n anumber(strength);\n if (strength % 32 !== 0 || strength > 256)\n throw new TypeError('Invalid entropy');\n return entropyToMnemonic(randomBytes(strength / 8), wordlist);\n}\nconst calcChecksum = (entropy) => {\n // Checksum is ent.length/4 bits long\n const bitsLeft = 8 - entropy.length / 4;\n // Zero rightmost \"bitsLeft\" bits in byte\n // For example: bitsLeft=4 val=10111101 -> 10110000\n return new Uint8Array([(sha256(entropy)[0] >> bitsLeft) << bitsLeft]);\n};\nfunction getCoder(wordlist) {\n if (!Array.isArray(wordlist) || wordlist.length !== 2048 || typeof wordlist[0] !== 'string')\n throw new Error('Wordlist: expected array of 2048 strings');\n wordlist.forEach((i) => {\n if (typeof i !== 'string')\n throw new Error('wordlist: non-string element: ' + i);\n });\n return baseUtils.chain(baseUtils.checksum(1, calcChecksum), baseUtils.radix2(11, true), baseUtils.alphabet(wordlist));\n}\n/**\n * Reversible: Converts mnemonic string to raw entropy in form of byte array.\n * @param mnemonic 12-24 words\n * @param wordlist imported wordlist for specific language\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToEntropy(mnem, wordlist)\n * // Produces\n * new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ])\n */\nexport function mnemonicToEntropy(mnemonic, wordlist) {\n const { words } = normalize(mnemonic);\n const entropy = getCoder(wordlist).decode(words);\n aentropy(entropy);\n return entropy;\n}\n/**\n * Reversible: Converts raw entropy in form of byte array to mnemonic string.\n * @param entropy byte array\n * @param wordlist imported wordlist for specific language\n * @returns 12-24 words\n * @example\n * const ent = new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ]);\n * entropyToMnemonic(ent, wordlist);\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function entropyToMnemonic(entropy, wordlist) {\n aentropy(entropy);\n const words = getCoder(wordlist).encode(entropy);\n return words.join(isJapanese(wordlist) ? '\\u3000' : ' ');\n}\n/**\n * Validates mnemonic for being 12-24 words contained in `wordlist`.\n */\nexport function validateMnemonic(mnemonic, wordlist) {\n try {\n mnemonicToEntropy(mnemonic, wordlist);\n }\n catch (e) {\n return false;\n }\n return true;\n}\nconst psalt = (passphrase) => nfkd('mnemonic' + passphrase);\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * await mnemonicToSeed(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeed(mnemonic, passphrase = '') {\n return pbkdf2Async(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToSeedSync(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeedSync(mnemonic, passphrase = '') {\n return pbkdf2(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n","export const wordlist = `abandon\nability\nable\nabout\nabove\nabsent\nabsorb\nabstract\nabsurd\nabuse\naccess\naccident\naccount\naccuse\nachieve\nacid\nacoustic\nacquire\nacross\nact\naction\nactor\nactress\nactual\nadapt\nadd\naddict\naddress\nadjust\nadmit\nadult\nadvance\nadvice\naerobic\naffair\nafford\nafraid\nagain\nage\nagent\nagree\nahead\naim\nair\nairport\naisle\nalarm\nalbum\nalcohol\nalert\nalien\nall\nalley\nallow\nalmost\nalone\nalpha\nalready\nalso\nalter\nalways\namateur\namazing\namong\namount\namused\nanalyst\nanchor\nancient\nanger\nangle\nangry\nanimal\nankle\nannounce\nannual\nanother\nanswer\nantenna\nantique\nanxiety\nany\napart\napology\nappear\napple\napprove\napril\narch\narctic\narea\narena\nargue\narm\narmed\narmor\narmy\naround\narrange\narrest\narrive\narrow\nart\nartefact\nartist\nartwork\nask\naspect\nassault\nasset\nassist\nassume\nasthma\nathlete\natom\nattack\nattend\nattitude\nattract\nauction\naudit\naugust\naunt\nauthor\nauto\nautumn\naverage\navocado\navoid\nawake\naware\naway\nawesome\nawful\nawkward\naxis\nbaby\nbachelor\nbacon\nbadge\nbag\nbalance\nbalcony\nball\nbamboo\nbanana\nbanner\nbar\nbarely\nbargain\nbarrel\nbase\nbasic\nbasket\nbattle\nbeach\nbean\nbeauty\nbecause\nbecome\nbeef\nbefore\nbegin\nbehave\nbehind\nbelieve\nbelow\nbelt\nbench\nbenefit\nbest\nbetray\nbetter\nbetween\nbeyond\nbicycle\nbid\nbike\nbind\nbiology\nbird\nbirth\nbitter\nblack\nblade\nblame\nblanket\nblast\nbleak\nbless\nblind\nblood\nblossom\nblouse\nblue\nblur\nblush\nboard\nboat\nbody\nboil\nbomb\nbone\nbonus\nbook\nboost\nborder\nboring\nborrow\nboss\nbottom\nbounce\nbox\nboy\nbracket\nbrain\nbrand\nbrass\nbrave\nbread\nbreeze\nbrick\nbridge\nbrief\nbright\nbring\nbrisk\nbroccoli\nbroken\nbronze\nbroom\nbrother\nbrown\nbrush\nbubble\nbuddy\nbudget\nbuffalo\nbuild\nbulb\nbulk\nbullet\nbundle\nbunker\nburden\nburger\nburst\nbus\nbusiness\nbusy\nbutter\nbuyer\nbuzz\ncabbage\ncabin\ncable\ncactus\ncage\ncake\ncall\ncalm\ncamera\ncamp\ncan\ncanal\ncancel\ncandy\ncannon\ncanoe\ncanvas\ncanyon\ncapable\ncapital\ncaptain\ncar\ncarbon\ncard\ncargo\ncarpet\ncarry\ncart\ncase\ncash\ncasino\ncastle\ncasual\ncat\ncatalog\ncatch\ncategory\ncattle\ncaught\ncause\ncaution\ncave\nceiling\ncelery\ncement\ncensus\ncentury\ncereal\ncertain\nchair\nchalk\nchampion\nchange\nchaos\nchapter\ncharge\nchase\nchat\ncheap\ncheck\ncheese\nchef\ncherry\nchest\nchicken\nchief\nchild\nchimney\nchoice\nchoose\nchronic\nchuckle\nchunk\nchurn\ncigar\ncinnamon\ncircle\ncitizen\ncity\ncivil\nclaim\nclap\nclarify\nclaw\nclay\nclean\nclerk\nclever\nclick\nclient\ncliff\nclimb\nclinic\nclip\nclock\nclog\nclose\ncloth\ncloud\nclown\nclub\nclump\ncluster\nclutch\ncoach\ncoast\ncoconut\ncode\ncoffee\ncoil\ncoin\ncollect\ncolor\ncolumn\ncombine\ncome\ncomfort\ncomic\ncommon\ncompany\nconcert\nconduct\nconfirm\ncongress\nconnect\nconsider\ncontrol\nconvince\ncook\ncool\ncopper\ncopy\ncoral\ncore\ncorn\ncorrect\ncost\ncotton\ncouch\ncountry\ncouple\ncourse\ncousin\ncover\ncoyote\ncrack\ncradle\ncraft\ncram\ncrane\ncrash\ncrater\ncrawl\ncrazy\ncream\ncredit\ncreek\ncrew\ncricket\ncrime\ncrisp\ncritic\ncrop\ncross\ncrouch\ncrowd\ncrucial\ncruel\ncruise\ncrumble\ncrunch\ncrush\ncry\ncrystal\ncube\nculture\ncup\ncupboard\ncurious\ncurrent\ncurtain\ncurve\ncushion\ncustom\ncute\ncycle\ndad\ndamage\ndamp\ndance\ndanger\ndaring\ndash\ndaughter\ndawn\nday\ndeal\ndebate\ndebris\ndecade\ndecember\ndecide\ndecline\ndecorate\ndecrease\ndeer\ndefense\ndefine\ndefy\ndegree\ndelay\ndeliver\ndemand\ndemise\ndenial\ndentist\ndeny\ndepart\ndepend\ndeposit\ndepth\ndeputy\nderive\ndescribe\ndesert\ndesign\ndesk\ndespair\ndestroy\ndetail\ndetect\ndevelop\ndevice\ndevote\ndiagram\ndial\ndiamond\ndiary\ndice\ndiesel\ndiet\ndiffer\ndigital\ndignity\ndilemma\ndinner\ndinosaur\ndirect\ndirt\ndisagree\ndiscover\ndisease\ndish\ndismiss\ndisorder\ndisplay\ndistance\ndivert\ndivide\ndivorce\ndizzy\ndoctor\ndocument\ndog\ndoll\ndolphin\ndomain\ndonate\ndonkey\ndonor\ndoor\ndose\ndouble\ndove\ndraft\ndragon\ndrama\ndrastic\ndraw\ndream\ndress\ndrift\ndrill\ndrink\ndrip\ndrive\ndrop\ndrum\ndry\nduck\ndumb\ndune\nduring\ndust\ndutch\nduty\ndwarf\ndynamic\neager\neagle\nearly\nearn\nearth\neasily\neast\neasy\necho\necology\neconomy\nedge\nedit\neducate\neffort\negg\neight\neither\nelbow\nelder\nelectric\nelegant\nelement\nelephant\nelevator\nelite\nelse\nembark\nembody\nembrace\nemerge\nemotion\nemploy\nempower\nempty\nenable\nenact\nend\nendless\nendorse\nenemy\nenergy\nenforce\nengage\nengine\nenhance\nenjoy\nenlist\nenough\nenrich\nenroll\nensure\nenter\nentire\nentry\nenvelope\nepisode\nequal\nequip\nera\nerase\nerode\nerosion\nerror\nerupt\nescape\nessay\nessence\nestate\neternal\nethics\nevidence\nevil\nevoke\nevolve\nexact\nexample\nexcess\nexchange\nexcite\nexclude\nexcuse\nexecute\nexercise\nexhaust\nexhibit\nexile\nexist\nexit\nexotic\nexpand\nexpect\nexpire\nexplain\nexpose\nexpress\nextend\nextra\neye\neyebrow\nfabric\nface\nfaculty\nfade\nfaint\nfaith\nfall\nfalse\nfame\nfamily\nfamous\nfan\nfancy\nfantasy\nfarm\nfashion\nfat\nfatal\nfather\nfatigue\nfault\nfavorite\nfeature\nfebruary\nfederal\nfee\nfeed\nfeel\nfemale\nfence\nfestival\nfetch\nfever\nfew\nfiber\nfiction\nfield\nfigure\nfile\nfilm\nfilter\nfinal\nfind\nfine\nfinger\nfinish\nfire\nfirm\nfirst\nfiscal\nfish\nfit\nfitness\nfix\nflag\nflame\nflash\nflat\nflavor\nflee\nflight\nflip\nfloat\nflock\nfloor\nflower\nfluid\nflush\nfly\nfoam\nfocus\nfog\nfoil\nfold\nfollow\nfood\nfoot\nforce\nforest\nforget\nfork\nfortune\nforum\nforward\nfossil\nfoster\nfound\nfox\nfragile\nframe\nfrequent\nfresh\nfriend\nfringe\nfrog\nfront\nfrost\nfrown\nfrozen\nfruit\nfuel\nfun\nfunny\nfurnace\nfury\nfuture\ngadget\ngain\ngalaxy\ngallery\ngame\ngap\ngarage\ngarbage\ngarden\ngarlic\ngarment\ngas\ngasp\ngate\ngather\ngauge\ngaze\ngeneral\ngenius\ngenre\ngentle\ngenuine\ngesture\nghost\ngiant\ngift\ngiggle\nginger\ngiraffe\ngirl\ngive\nglad\nglance\nglare\nglass\nglide\nglimpse\nglobe\ngloom\nglory\nglove\nglow\nglue\ngoat\ngoddess\ngold\ngood\ngoose\ngorilla\ngospel\ngossip\ngovern\ngown\ngrab\ngrace\ngrain\ngrant\ngrape\ngrass\ngravity\ngreat\ngreen\ngrid\ngrief\ngrit\ngrocery\ngroup\ngrow\ngrunt\nguard\nguess\nguide\nguilt\nguitar\ngun\ngym\nhabit\nhair\nhalf\nhammer\nhamster\nhand\nhappy\nharbor\nhard\nharsh\nharvest\nhat\nhave\nhawk\nhazard\nhead\nhealth\nheart\nheavy\nhedgehog\nheight\nhello\nhelmet\nhelp\nhen\nhero\nhidden\nhigh\nhill\nhint\nhip\nhire\nhistory\nhobby\nhockey\nhold\nhole\nholiday\nhollow\nhome\nhoney\nhood\nhope\nhorn\nhorror\nhorse\nhospital\nhost\nhotel\nhour\nhover\nhub\nhuge\nhuman\nhumble\nhumor\nhundred\nhungry\nhunt\nhurdle\nhurry\nhurt\nhusband\nhybrid\nice\nicon\nidea\nidentify\nidle\nignore\nill\nillegal\nillness\nimage\nimitate\nimmense\nimmune\nimpact\nimpose\nimprove\nimpulse\ninch\ninclude\nincome\nincrease\nindex\nindicate\nindoor\nindustry\ninfant\ninflict\ninform\ninhale\ninherit\ninitial\ninject\ninjury\ninmate\ninner\ninnocent\ninput\ninquiry\ninsane\ninsect\ninside\ninspire\ninstall\nintact\ninterest\ninto\ninvest\ninvite\ninvolve\niron\nisland\nisolate\nissue\nitem\nivory\njacket\njaguar\njar\njazz\njealous\njeans\njelly\njewel\njob\njoin\njoke\njourney\njoy\njudge\njuice\njump\njungle\njunior\njunk\njust\nkangaroo\nkeen\nkeep\nketchup\nkey\nkick\nkid\nkidney\nkind\nkingdom\nkiss\nkit\nkitchen\nkite\nkitten\nkiwi\nknee\nknife\nknock\nknow\nlab\nlabel\nlabor\nladder\nlady\nlake\nlamp\nlanguage\nlaptop\nlarge\nlater\nlatin\nlaugh\nlaundry\nlava\nlaw\nlawn\nlawsuit\nlayer\nlazy\nleader\nleaf\nlearn\nleave\nlecture\nleft\nleg\nlegal\nlegend\nleisure\nlemon\nlend\nlength\nlens\nleopard\nlesson\nletter\nlevel\nliar\nliberty\nlibrary\nlicense\nlife\nlift\nlight\nlike\nlimb\nlimit\nlink\nlion\nliquid\nlist\nlittle\nlive\nlizard\nload\nloan\nlobster\nlocal\nlock\nlogic\nlonely\nlong\nloop\nlottery\nloud\nlounge\nlove\nloyal\nlucky\nluggage\nlumber\nlunar\nlunch\nluxury\nlyrics\nmachine\nmad\nmagic\nmagnet\nmaid\nmail\nmain\nmajor\nmake\nmammal\nman\nmanage\nmandate\nmango\nmansion\nmanual\nmaple\nmarble\nmarch\nmargin\nmarine\nmarket\nmarriage\nmask\nmass\nmaster\nmatch\nmaterial\nmath\nmatrix\nmatter\nmaximum\nmaze\nmeadow\nmean\nmeasure\nmeat\nmechanic\nmedal\nmedia\nmelody\nmelt\nmember\nmemory\nmention\nmenu\nmercy\nmerge\nmerit\nmerry\nmesh\nmessage\nmetal\nmethod\nmiddle\nmidnight\nmilk\nmillion\nmimic\nmind\nminimum\nminor\nminute\nmiracle\nmirror\nmisery\nmiss\nmistake\nmix\nmixed\nmixture\nmobile\nmodel\nmodify\nmom\nmoment\nmonitor\nmonkey\nmonster\nmonth\nmoon\nmoral\nmore\nmorning\nmosquito\nmother\nmotion\nmotor\nmountain\nmouse\nmove\nmovie\nmuch\nmuffin\nmule\nmultiply\nmuscle\nmuseum\nmushroom\nmusic\nmust\nmutual\nmyself\nmystery\nmyth\nnaive\nname\nnapkin\nnarrow\nnasty\nnation\nnature\nnear\nneck\nneed\nnegative\nneglect\nneither\nnephew\nnerve\nnest\nnet\nnetwork\nneutral\nnever\nnews\nnext\nnice\nnight\nnoble\nnoise\nnominee\nnoodle\nnormal\nnorth\nnose\nnotable\nnote\nnothing\nnotice\nnovel\nnow\nnuclear\nnumber\nnurse\nnut\noak\nobey\nobject\noblige\nobscure\nobserve\nobtain\nobvious\noccur\nocean\noctober\nodor\noff\noffer\noffice\noften\noil\nokay\nold\nolive\nolympic\nomit\nonce\none\nonion\nonline\nonly\nopen\nopera\nopinion\noppose\noption\norange\norbit\norchard\norder\nordinary\norgan\norient\noriginal\norphan\nostrich\nother\noutdoor\nouter\noutput\noutside\noval\noven\nover\nown\nowner\noxygen\noyster\nozone\npact\npaddle\npage\npair\npalace\npalm\npanda\npanel\npanic\npanther\npaper\nparade\nparent\npark\nparrot\nparty\npass\npatch\npath\npatient\npatrol\npattern\npause\npave\npayment\npeace\npeanut\npear\npeasant\npelican\npen\npenalty\npencil\npeople\npepper\nperfect\npermit\nperson\npet\nphone\nphoto\nphrase\nphysical\npiano\npicnic\npicture\npiece\npig\npigeon\npill\npilot\npink\npioneer\npipe\npistol\npitch\npizza\nplace\nplanet\nplastic\nplate\nplay\nplease\npledge\npluck\nplug\nplunge\npoem\npoet\npoint\npolar\npole\npolice\npond\npony\npool\npopular\nportion\nposition\npossible\npost\npotato\npottery\npoverty\npowder\npower\npractice\npraise\npredict\nprefer\nprepare\npresent\npretty\nprevent\nprice\npride\nprimary\nprint\npriority\nprison\nprivate\nprize\nproblem\nprocess\nproduce\nprofit\nprogram\nproject\npromote\nproof\nproperty\nprosper\nprotect\nproud\nprovide\npublic\npudding\npull\npulp\npulse\npumpkin\npunch\npupil\npuppy\npurchase\npurity\npurpose\npurse\npush\nput\npuzzle\npyramid\nquality\nquantum\nquarter\nquestion\nquick\nquit\nquiz\nquote\nrabbit\nraccoon\nrace\nrack\nradar\nradio\nrail\nrain\nraise\nrally\nramp\nranch\nrandom\nrange\nrapid\nrare\nrate\nrather\nraven\nraw\nrazor\nready\nreal\nreason\nrebel\nrebuild\nrecall\nreceive\nrecipe\nrecord\nrecycle\nreduce\nreflect\nreform\nrefuse\nregion\nregret\nregular\nreject\nrelax\nrelease\nrelief\nrely\nremain\nremember\nremind\nremove\nrender\nrenew\nrent\nreopen\nrepair\nrepeat\nreplace\nreport\nrequire\nrescue\nresemble\nresist\nresource\nresponse\nresult\nretire\nretreat\nreturn\nreunion\nreveal\nreview\nreward\nrhythm\nrib\nribbon\nrice\nrich\nride\nridge\nrifle\nright\nrigid\nring\nriot\nripple\nrisk\nritual\nrival\nriver\nroad\nroast\nrobot\nrobust\nrocket\nromance\nroof\nrookie\nroom\nrose\nrotate\nrough\nround\nroute\nroyal\nrubber\nrude\nrug\nrule\nrun\nrunway\nrural\nsad\nsaddle\nsadness\nsafe\nsail\nsalad\nsalmon\nsalon\nsalt\nsalute\nsame\nsample\nsand\nsatisfy\nsatoshi\nsauce\nsausage\nsave\nsay\nscale\nscan\nscare\nscatter\nscene\nscheme\nschool\nscience\nscissors\nscorpion\nscout\nscrap\nscreen\nscript\nscrub\nsea\nsearch\nseason\nseat\nsecond\nsecret\nsection\nsecurity\nseed\nseek\nsegment\nselect\nsell\nseminar\nsenior\nsense\nsentence\nseries\nservice\nsession\nsettle\nsetup\nseven\nshadow\nshaft\nshallow\nshare\nshed\nshell\nsheriff\nshield\nshift\nshine\nship\nshiver\nshock\nshoe\nshoot\nshop\nshort\nshoulder\nshove\nshrimp\nshrug\nshuffle\nshy\nsibling\nsick\nside\nsiege\nsight\nsign\nsilent\nsilk\nsilly\nsilver\nsimilar\nsimple\nsince\nsing\nsiren\nsister\nsituate\nsix\nsize\nskate\nsketch\nski\nskill\nskin\nskirt\nskull\nslab\nslam\nsleep\nslender\nslice\nslide\nslight\nslim\nslogan\nslot\nslow\nslush\nsmall\nsmart\nsmile\nsmoke\nsmooth\nsnack\nsnake\nsnap\nsniff\nsnow\nsoap\nsoccer\nsocial\nsock\nsoda\nsoft\nsolar\nsoldier\nsolid\nsolution\nsolve\nsomeone\nsong\nsoon\nsorry\nsort\nsoul\nsound\nsoup\nsource\nsouth\nspace\nspare\nspatial\nspawn\nspeak\nspecial\nspeed\nspell\nspend\nsphere\nspice\nspider\nspike\nspin\nspirit\nsplit\nspoil\nsponsor\nspoon\nsport\nspot\nspray\nspread\nspring\nspy\nsquare\nsqueeze\nsquirrel\nstable\nstadium\nstaff\nstage\nstairs\nstamp\nstand\nstart\nstate\nstay\nsteak\nsteel\nstem\nstep\nstereo\nstick\nstill\nsting\nstock\nstomach\nstone\nstool\nstory\nstove\nstrategy\nstreet\nstrike\nstrong\nstruggle\nstudent\nstuff\nstumble\nstyle\nsubject\nsubmit\nsubway\nsuccess\nsuch\nsudden\nsuffer\nsugar\nsuggest\nsuit\nsummer\nsun\nsunny\nsunset\nsuper\nsupply\nsupreme\nsure\nsurface\nsurge\nsurprise\nsurround\nsurvey\nsuspect\nsustain\nswallow\nswamp\nswap\nswarm\nswear\nsweet\nswift\nswim\nswing\nswitch\nsword\nsymbol\nsymptom\nsyrup\nsystem\ntable\ntackle\ntag\ntail\ntalent\ntalk\ntank\ntape\ntarget\ntask\ntaste\ntattoo\ntaxi\nteach\nteam\ntell\nten\ntenant\ntennis\ntent\nterm\ntest\ntext\nthank\nthat\ntheme\nthen\ntheory\nthere\nthey\nthing\nthis\nthought\nthree\nthrive\nthrow\nthumb\nthunder\nticket\ntide\ntiger\ntilt\ntimber\ntime\ntiny\ntip\ntired\ntissue\ntitle\ntoast\ntobacco\ntoday\ntoddler\ntoe\ntogether\ntoilet\ntoken\ntomato\ntomorrow\ntone\ntongue\ntonight\ntool\ntooth\ntop\ntopic\ntopple\ntorch\ntornado\ntortoise\ntoss\ntotal\ntourist\ntoward\ntower\ntown\ntoy\ntrack\ntrade\ntraffic\ntragic\ntrain\ntransfer\ntrap\ntrash\ntravel\ntray\ntreat\ntree\ntrend\ntrial\ntribe\ntrick\ntrigger\ntrim\ntrip\ntrophy\ntrouble\ntruck\ntrue\ntruly\ntrumpet\ntrust\ntruth\ntry\ntube\ntuition\ntumble\ntuna\ntunnel\nturkey\nturn\nturtle\ntwelve\ntwenty\ntwice\ntwin\ntwist\ntwo\ntype\ntypical\nugly\numbrella\nunable\nunaware\nuncle\nuncover\nunder\nundo\nunfair\nunfold\nunhappy\nuniform\nunique\nunit\nuniverse\nunknown\nunlock\nuntil\nunusual\nunveil\nupdate\nupgrade\nuphold\nupon\nupper\nupset\nurban\nurge\nusage\nuse\nused\nuseful\nuseless\nusual\nutility\nvacant\nvacuum\nvague\nvalid\nvalley\nvalve\nvan\nvanish\nvapor\nvarious\nvast\nvault\nvehicle\nvelvet\nvendor\nventure\nvenue\nverb\nverify\nversion\nvery\nvessel\nveteran\nviable\nvibrant\nvicious\nvictory\nvideo\nview\nvillage\nvintage\nviolin\nvirtual\nvirus\nvisa\nvisit\nvisual\nvital\nvivid\nvocal\nvoice\nvoid\nvolcano\nvolume\nvote\nvoyage\nwage\nwagon\nwait\nwalk\nwall\nwalnut\nwant\nwarfare\nwarm\nwarrior\nwash\nwasp\nwaste\nwater\nwave\nway\nwealth\nweapon\nwear\nweasel\nweather\nweb\nwedding\nweekend\nweird\nwelcome\nwest\nwet\nwhale\nwhat\nwheat\nwheel\nwhen\nwhere\nwhip\nwhisper\nwide\nwidth\nwife\nwild\nwill\nwin\nwindow\nwine\nwing\nwink\nwinner\nwinter\nwire\nwisdom\nwise\nwish\nwitness\nwolf\nwoman\nwonder\nwood\nwool\nword\nwork\nworld\nworry\nworth\nwrap\nwreck\nwrestle\nwrist\nwrite\nwrong\nyard\nyear\nyellow\nyou\nyoung\nyouth\nzebra\nzero\nzone\nzoo`.split('\\n');\n","export class WalletNotConnectedError extends Error {\n readonly code = 'WALLET_NOT_CONNECTED' as const;\n\n constructor(\n message = 'No wallet connected. Call awarizon.wallet.create(), awarizon.wallet.importPrivateKey(), ' +\n 'awarizon.wallet.importMnemonic(), or awarizon.connectWallet(walletClient).',\n ) {\n super(`[wallet-engine] ${message}`);\n this.name = 'WalletNotConnectedError';\n }\n}\n\nexport class InvalidMnemonicError extends Error {\n readonly code = 'INVALID_MNEMONIC' as const;\n\n constructor(message = 'The provided mnemonic phrase is invalid.') {\n super(`[wallet-engine] ${message}`);\n this.name = 'InvalidMnemonicError';\n }\n}\n\nexport class InvalidPrivateKeyError extends Error {\n readonly code = 'INVALID_PRIVATE_KEY' as const;\n\n constructor(message = 'The provided private key is invalid.') {\n super(`[wallet-engine] ${message}`);\n this.name = 'InvalidPrivateKeyError';\n }\n}\n\nexport class ChainSwitchError extends Error {\n readonly code = 'CHAIN_SWITCH_ERROR' as const;\n\n constructor(message: string) {\n super(`[wallet-engine] ${message}`);\n this.name = 'ChainSwitchError';\n }\n}\n\nexport class ChainMismatchError extends Error {\n readonly code = 'CHAIN_MISMATCH' as const;\n readonly walletChainId: number;\n readonly expectedChainId: number;\n\n constructor(walletChainId: number, expectedChainId: number) {\n super(\n `[wallet-engine] Chain mismatch: wallet is on chain ${walletChainId}, ` +\n `SDK is configured for chain ${expectedChainId}. ` +\n `Switch networks in your wallet or call awarizon.switchChain().`,\n );\n this.name = 'ChainMismatchError';\n this.walletChainId = walletChainId;\n this.expectedChainId = expectedChainId;\n }\n}\n","import {\n createWalletClient,\n createPublicClient,\n http,\n custom,\n type WalletClient,\n type PublicClient,\n type Chain,\n type Address,\n type Hex,\n type Account,\n} from 'viem';\nimport { privateKeyToAccount, mnemonicToAccount } from 'viem/accounts';\nimport { generateMnemonic, validateMnemonic } from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\n\n// BIP-44 path for Ethereum — same as MetaMask, Phantom, Ledger Live, Trust Wallet\nconst ETH_PATH = (addressIndex: number) => `m/44'/60'/0'/0/${addressIndex}` as const;\nimport {\n WalletNotConnectedError,\n InvalidMnemonicError,\n InvalidPrivateKeyError,\n} from './errors';\nimport type {\n WalletEngineConfig,\n CreatedWallet,\n ImportedWalletFromMnemonic,\n ImportedWalletFromPrivateKey,\n ExternalWalletClient,\n EIP1193Provider,\n ConnectorInfo,\n WalletChangeEvent,\n ChainChangeEvent,\n SignTypedDataParams,\n} from './types';\n\ntype WalletChangeCallback = (event: WalletChangeEvent) => void;\ntype ChainChangeCallback = (event: ChainChangeEvent) => void;\n\n// ─── WalletEngine ─────────────────────────────────────────────────────────────\n\n/**\n * Manages both internally-generated wallets and externally-injected signers\n * (wagmi, WalletConnect, EIP-1193 providers, raw viem WalletClients).\n *\n * Priority order when resolving the active signer:\n * 1. External wallet client (highest priority)\n * 2. Internal wallet client (private key / mnemonic import)\n *\n * Events:\n * onWalletChange — fires whenever the active wallet address changes\n * onChainChange — fires whenever switchChain() is called\n */\nexport class WalletEngine {\n private config: WalletEngineConfig;\n private internalClient: WalletClient | null = null;\n private externalClient: ExternalWalletClient | null = null;\n private _connectorInfo: ConnectorInfo | null = null;\n private _walletListeners = new Set<WalletChangeCallback>();\n private _chainListeners = new Set<ChainChangeCallback>();\n\n constructor(config: WalletEngineConfig) {\n this.config = config;\n }\n\n // ─── Internal wallet creation ──────────────────────────────────────────────\n\n async create(): Promise<CreatedWallet> {\n // Generate a 12-word BIP-39 mnemonic (128-bit entropy) — same as MetaMask \"Create Wallet\"\n const mnemonic = generateMnemonic(wordlist, 128);\n const path = ETH_PATH(0);\n const account = mnemonicToAccount(mnemonic, { accountIndex: 0, addressIndex: 0 });\n\n this.internalClient = this._buildInternalClient(account);\n this._connectorInfo = { type: 'internal' };\n this._emitWalletChange();\n return { address: account.address, mnemonic, derivationPath: path };\n }\n\n /**\n * Import a wallet from a BIP-39 mnemonic phrase.\n *\n * `addressIndex` maps to MetaMask's account switcher:\n * 0 → Account 1 (m/44'/60'/0'/0/0)\n * 1 → Account 2 (m/44'/60'/0'/0/1)\n * N → Account N+1\n */\n async importMnemonic(\n mnemonic: string,\n addressIndex = 0,\n ): Promise<ImportedWalletFromMnemonic> {\n if (!mnemonic || typeof mnemonic !== 'string') throw new InvalidMnemonicError();\n\n // Validate the phrase before attempting derivation\n if (!validateMnemonic(mnemonic, wordlist)) {\n throw new InvalidMnemonicError(\n `Invalid BIP-39 mnemonic: ${mnemonic.split(' ').slice(0, 2).join(' ')}…`,\n );\n }\n\n let account: Account;\n try {\n // MetaMask / Phantom EVM path: m/44'/60'/0'/0/addressIndex\n account = mnemonicToAccount(mnemonic, { accountIndex: 0, addressIndex });\n } catch {\n throw new InvalidMnemonicError(\n `Could not derive account from mnemonic: ${mnemonic.slice(0, 8)}…`,\n );\n }\n\n this.internalClient = this._buildInternalClient(account);\n this._connectorInfo = { type: 'internal' };\n this._emitWalletChange();\n const path = ETH_PATH(addressIndex);\n return { address: account.address, mnemonic, derivationPath: path };\n }\n\n async importPrivateKey(privateKey: Hex): Promise<ImportedWalletFromPrivateKey> {\n if (!privateKey || !privateKey.startsWith('0x')) {\n throw new InvalidPrivateKeyError('Private key must be a 0x-prefixed hex string.');\n }\n\n let account: Account;\n try {\n account = privateKeyToAccount(privateKey);\n } catch {\n throw new InvalidPrivateKeyError();\n }\n\n this.internalClient = this._buildInternalClient(account);\n this._connectorInfo = { type: 'internal' };\n this._emitWalletChange();\n return { address: account.address };\n }\n\n // ─── External wallet integration ───────────────────────────────────────────\n\n /**\n * Connect any viem WalletClient (wagmi, RainbowKit, custom).\n * Optionally pass connector metadata to display in the UI.\n *\n * External wallets always take priority over internal wallets.\n */\n connectExternal(\n walletClient: ExternalWalletClient,\n info?: { name?: string; icon?: string },\n ): void {\n if (!walletClient || typeof walletClient !== 'object') {\n throw new TypeError('[wallet-engine] connectExternal: expected a viem WalletClient');\n }\n this.externalClient = walletClient;\n this._connectorInfo = { type: 'external', ...info };\n this._emitWalletChange();\n }\n\n /**\n * Connect directly from a raw EIP-1193 provider (window.ethereum, WalletConnect, etc.)\n * without needing wagmi or any wrapper. Calls eth_requestAccounts internally.\n *\n * @param provider - Any object implementing the EIP-1193 interface\n * @param info - Optional connector metadata (name, icon)\n */\n async connectEIP1193(\n provider: EIP1193Provider,\n info?: { name?: string; icon?: string },\n ): Promise<void> {\n const accounts = (await provider.request({\n method: 'eth_requestAccounts',\n })) as Address[];\n\n const account = accounts[0];\n if (!account) {\n throw new WalletNotConnectedError(\n 'No accounts returned by EIP-1193 provider. ' +\n 'The user may have rejected the connection request.',\n );\n }\n\n const walletClient = createWalletClient({\n account,\n chain: this.config.chain,\n transport: custom(provider as Parameters<typeof custom>[0]),\n });\n\n this.connectExternal(walletClient, info);\n\n // ── Live provider event subscriptions ──────────────────────────────────────\n // These keep SDK state in sync when the user switches accounts or networks\n // in their wallet (MetaMask, WalletConnect, etc.) without our code asking.\n\n provider.on?.('accountsChanged', (...args: unknown[]) => {\n const newAccounts = args[0] as string[];\n if (!newAccounts || newAccounts.length === 0) {\n // User disconnected or locked their wallet\n this.disconnectExternal();\n return;\n }\n // Rebuild walletClient with the new primary account\n const updated = createWalletClient({\n account: newAccounts[0] as Address,\n chain: this.config.chain,\n transport: custom(provider as Parameters<typeof custom>[0]),\n });\n this.connectExternal(updated, info);\n });\n\n provider.on?.('chainChanged', (..._args: unknown[]) => {\n // External wallet switched networks — emit so useWallet can re-check mismatch\n this._emitChainChange();\n });\n\n provider.on?.('disconnect', (..._args: unknown[]) => {\n this.disconnectExternal();\n });\n }\n\n /** Remove the external wallet. Falls back to internal wallet if one is loaded. */\n disconnectExternal(): void {\n this.externalClient = null;\n this._connectorInfo = this.internalClient ? { type: 'internal' } : null;\n this._emitWalletChange();\n }\n\n /** Remove all wallet state — both internal and external. */\n disconnect(): void {\n this.internalClient = null;\n this.externalClient = null;\n this._connectorInfo = null;\n this._emitWalletChange();\n }\n\n // ─── Chain management ──────────────────────────────────────────────────────\n\n async switchChain(chain: Chain): Promise<void> {\n this.config.chain = chain;\n this.config.publicClient = createPublicClient({\n chain,\n transport: this._resolveTransport(chain),\n });\n\n if (this.internalClient?.account) {\n this.internalClient = this._buildInternalClient(this.internalClient.account);\n }\n\n this._emitChainChange();\n }\n\n // ─── Signing ───────────────────────────────────────────────────────────────\n\n /**\n * Sign a plain text or raw-bytes message with the active wallet.\n * Supports Sign-In with Ethereum (SIWE) and off-chain auth flows.\n *\n * @param message - A UTF-8 string or `{ raw: Hex | Uint8Array }` for raw bytes\n */\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n const client = this.externalClient ?? this.internalClient;\n if (!client) throw new WalletNotConnectedError();\n\n const account = client.account;\n if (!account) {\n throw new WalletNotConnectedError(\n 'No account set on wallet client. ' +\n 'The wallet may need to be unlocked or reconnected.',\n );\n }\n\n return (client.signMessage as (args: unknown) => Promise<Hex>)({\n account,\n message,\n });\n }\n\n /**\n * Sign EIP-712 typed structured data (permit2, SIWE, Seaport, etc.).\n *\n * @param params - domain, types, primaryType, and message fields per EIP-712\n */\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n const client = this.externalClient ?? this.internalClient;\n if (!client) throw new WalletNotConnectedError();\n\n const account = client.account;\n if (!account) {\n throw new WalletNotConnectedError(\n 'No account set on wallet client. ' +\n 'The wallet may need to be unlocked or reconnected.',\n );\n }\n\n return (client.signTypedData as (args: unknown) => Promise<Hex>)({\n account,\n ...params,\n });\n }\n\n // ─── Chain awareness ───────────────────────────────────────────────────────\n\n /**\n * Returns the chain ID the active wallet is currently on.\n * For external wallets this queries the wallet directly (may differ from SDK config).\n * For internal wallets this always returns the SDK-configured chain ID.\n */\n async getChainId(): Promise<number> {\n if (this.externalClient) {\n try {\n return await this.externalClient.getChainId();\n } catch {\n return this.config.chain.id;\n }\n }\n return this.config.chain.id;\n }\n\n /**\n * Returns true if the external wallet is on a different chain than the SDK.\n * Always false for internal wallets (they follow the SDK chain automatically).\n */\n async isChainMismatch(): Promise<boolean> {\n if (!this.externalClient) return false;\n const activeChainId = await this.getChainId();\n return activeChainId !== this.config.chain.id;\n }\n\n // ─── Event listeners ───────────────────────────────────────────────────────\n\n /**\n * Subscribe to wallet changes (connect, disconnect, account switch).\n * Returns an unsubscribe function — call it to stop listening.\n *\n * @example\n * const unsub = engine.onWalletChange(({ address, type }) => {\n * console.log('wallet changed:', address, type)\n * })\n * unsub() // stop listening\n */\n onWalletChange(cb: WalletChangeCallback): () => void {\n this._walletListeners.add(cb);\n return () => this._walletListeners.delete(cb);\n }\n\n /**\n * Subscribe to chain changes (switchChain calls).\n * Returns an unsubscribe function — call it to stop listening.\n */\n onChainChange(cb: ChainChangeCallback): () => void {\n this._chainListeners.add(cb);\n return () => this._chainListeners.delete(cb);\n }\n\n // ─── Accessors ─────────────────────────────────────────────────────────────\n\n getWalletClient(): WalletClient {\n const client = this.externalClient ?? this.internalClient;\n if (!client) throw new WalletNotConnectedError();\n return client;\n }\n\n getSigner(): WalletClient {\n return this.getWalletClient();\n }\n\n address(): Address {\n const client = this.externalClient ?? this.internalClient;\n const addr = client?.account?.address;\n if (!addr) throw new WalletNotConnectedError();\n return addr;\n }\n\n getChain(): Chain {\n return this.config.chain;\n }\n\n getPublicClient(): PublicClient {\n return this.config.publicClient;\n }\n\n isConnected(): boolean {\n return !!(this.externalClient ?? this.internalClient);\n }\n\n hasExternalWallet(): boolean {\n return this.externalClient !== null;\n }\n\n hasInternalWallet(): boolean {\n return this.internalClient !== null;\n }\n\n /**\n * Returns metadata about the currently active connector.\n * Useful for displaying \"Connected via MetaMask\" in the UI.\n */\n getConnectorInfo(): ConnectorInfo {\n if (this._connectorInfo) return this._connectorInfo;\n if (this.externalClient) return { type: 'external' };\n if (this.internalClient) return { type: 'internal' };\n return { type: 'none' };\n }\n\n // ─── Private helpers ───────────────────────────────────────────────────────\n\n private _resolveTransport(chain: Chain) {\n return this.config.getTransport\n ? this.config.getTransport(chain)\n : http(this.config.rpcUrl);\n }\n\n private _buildInternalClient(account: Account): WalletClient {\n return createWalletClient({\n account,\n chain: this.config.chain,\n transport: this._resolveTransport(this.config.chain),\n });\n }\n\n private _emitWalletChange(): void {\n let addr: Address | null = null;\n try { addr = this.address(); } catch { /* disconnected */ }\n\n const event: WalletChangeEvent = {\n address: addr,\n type: this.externalClient ? 'external' : this.internalClient ? 'internal' : 'none',\n name: this._connectorInfo?.name,\n };\n\n this._walletListeners.forEach(cb => {\n try { cb(event); } catch { /* isolate listener errors */ }\n });\n }\n\n private _emitChainChange(): void {\n const event: ChainChangeEvent = {\n chainId: this.config.chain.id,\n chain: this.config.chain,\n };\n\n this._chainListeners.forEach(cb => {\n try { cb(event); } catch { /* isolate listener errors */ }\n });\n }\n}\n","export class ContractExecutionError extends Error {\n readonly code = 'CONTRACT_EXECUTION_ERROR' as const;\n readonly functionName?: string;\n readonly cause?: Error;\n\n constructor(message: string, options?: { functionName?: string; cause?: Error }) {\n super(`[tx-engine] ${message}`);\n this.name = 'ContractExecutionError';\n this.functionName = options?.functionName;\n this.cause = options?.cause;\n }\n}\n\nexport class SimulationError extends Error {\n readonly code = 'SIMULATION_ERROR' as const;\n readonly functionName?: string;\n readonly cause?: Error;\n\n constructor(message: string, options?: { functionName?: string; cause?: Error }) {\n super(`[tx-engine] Simulation failed: ${message}`);\n this.name = 'SimulationError';\n this.functionName = options?.functionName;\n this.cause = options?.cause;\n }\n}\n\nexport class GasEstimationError extends Error {\n readonly code = 'GAS_ESTIMATION_ERROR' as const;\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(`[tx-engine] Gas estimation failed: ${message}`);\n this.name = 'GasEstimationError';\n this.cause = cause;\n }\n}\n\nexport class TransactionTimeoutError extends Error {\n readonly code = 'TRANSACTION_TIMEOUT' as const;\n readonly hash?: string;\n\n constructor(hash?: string) {\n super(`[tx-engine] Transaction confirmation timed out${hash ? ` (hash: ${hash})` : ''}`);\n this.name = 'TransactionTimeoutError';\n this.hash = hash;\n }\n}\n","import type {\n PublicClient,\n WalletClient,\n SimulateContractParameters,\n EstimateContractGasParameters,\n} from 'viem';\n\n// ─── Revert reason extractor ─────────────────────────────────────────────────\n// Walks the viem error chain to surface the human-readable revert reason\n// (e.g. \"ERC20: transfer amount exceeds balance\") instead of a raw hex string.\n\nfunction extractRevertReason(error: unknown): string {\n if (!error || typeof error !== 'object') return String(error);\n\n const e = error as Record<string, unknown>;\n\n // viem ContractFunctionRevertedError: .reason holds the require() string\n if (typeof e['reason'] === 'string' && e['reason']) return e['reason'];\n\n // Custom Solidity errors expose .data.errorName\n if (e['data'] && typeof e['data'] === 'object') {\n const data = e['data'] as Record<string, unknown>;\n if (typeof data['errorName'] === 'string' && data['errorName']) {\n const args = Array.isArray(data['args']) && data['args'].length\n ? `(${data['args'].join(', ')})`\n : '';\n return `${data['errorName']}${args}`;\n }\n }\n\n // viem BaseError always has a short, human-readable shortMessage\n if (typeof e['shortMessage'] === 'string' && e['shortMessage']) return e['shortMessage'];\n\n // Walk nested cause chain (viem wraps errors in cause chains)\n if (e['cause']) return extractRevertReason(e['cause']);\n\n return (error as Error).message ?? String(error);\n}\nimport {\n ContractExecutionError,\n SimulationError,\n GasEstimationError,\n} from './errors';\nimport type {\n ReadContractParams,\n WriteContractParams,\n TransactionResult,\n GasEstimate,\n} from './types';\n\n// ─── TransactionEngine ────────────────────────────────────────────────────────\n\n/**\n * Handles the complete transaction lifecycle:\n * read → readContract via PublicClient\n * write → simulate → writeContract → waitForReceipt\n *\n * Automatically handles:\n * • ABI encoding / decoding (delegated to viem)\n * • Gas estimation (via simulation)\n * • Simulation before broadcast (catches reverts early)\n * • Receipt polling\n */\nexport class TransactionEngine {\n constructor(\n private readonly publicClient: PublicClient,\n private readonly getWalletClient: () => WalletClient,\n ) {}\n\n // ─── Read ─────────────────────────────────────────────────────────────────\n\n /**\n * Execute a read-only contract call (view / pure functions).\n * Returns the decoded output — single values or tuples.\n */\n async read(params: ReadContractParams): Promise<unknown> {\n try {\n return await this.publicClient.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args as readonly unknown[],\n });\n } catch (error) {\n throw new ContractExecutionError(\n `read(${params.functionName}) failed: ${extractRevertReason(error)}`,\n { functionName: params.functionName, cause: error as Error },\n );\n }\n }\n\n // ─── Write ────────────────────────────────────────────────────────────────\n\n /**\n * Execute a state-mutating contract call:\n * 1. Simulate the transaction (surfaces revert reasons before spending gas)\n * 2. Broadcast the signed transaction\n * 3. Wait for on-chain confirmation\n *\n * @returns { hash, receipt } — the tx hash and on-chain receipt\n */\n async write(params: WriteContractParams): Promise<TransactionResult> {\n const walletClient = this.getWalletClient();\n const account = walletClient.account;\n\n if (!account) {\n throw new ContractExecutionError(\n `write(${params.functionName}): wallet client has no account attached`,\n { functionName: params.functionName },\n );\n }\n\n // ── 1. Simulate ──────────────────────────────────────────────────────────\n let request: any;\n try {\n const simulation = await this.publicClient.simulateContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args as readonly unknown[],\n account: account as any,\n value: params.value,\n gas: params.gas,\n } as SimulateContractParameters);\n request = simulation.request;\n } catch (error) {\n throw new SimulationError(\n `${params.functionName}: ${extractRevertReason(error)}`,\n { functionName: params.functionName, cause: error as Error },\n );\n }\n\n // ── 2. Broadcast ─────────────────────────────────────────────────────────\n let hash: `0x${string}`;\n try {\n hash = await walletClient.writeContract(request);\n } catch (error) {\n throw new ContractExecutionError(\n `write(${params.functionName}) broadcast failed: ${(error as Error).message}`,\n { functionName: params.functionName, cause: error as Error },\n );\n }\n\n // ── 3. Wait for receipt ──────────────────────────────────────────────────\n let receipt: any;\n try {\n receipt = await this.publicClient.waitForTransactionReceipt({ hash });\n } catch (error) {\n throw new ContractExecutionError(\n `write(${params.functionName}) receipt wait failed: ${(error as Error).message}`,\n { functionName: params.functionName, cause: error as Error },\n );\n }\n\n return { hash, receipt };\n }\n\n // ─── Gas estimation ───────────────────────────────────────────────────────\n\n /**\n * Estimate gas for a write transaction.\n * Useful for displaying fee previews before the user confirms.\n */\n async estimateGas(params: WriteContractParams): Promise<GasEstimate> {\n const walletClient = this.getWalletClient();\n const account = walletClient.account;\n\n if (!account) {\n throw new GasEstimationError('Wallet client has no account attached');\n }\n\n try {\n const gas = await this.publicClient.estimateContractGas({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args as readonly unknown[],\n account: account as any,\n value: params.value,\n } as EstimateContractGasParameters);\n\n // Optionally attach gas cost if we can fetch the current gas price\n let gasCost: bigint | undefined;\n try {\n const gasPrice = await this.publicClient.getGasPrice();\n gasCost = gas * gasPrice;\n } catch {\n // Gas price may not be available on all networks\n }\n\n return { gas, gasCost };\n } catch (error) {\n throw new GasEstimationError(extractRevertReason(error), error as Error);\n }\n }\n}\n","import {\n mainnet,\n base,\n baseSepolia,\n polygon,\n polygonAmoy,\n arbitrum,\n arbitrumSepolia,\n optimism,\n optimismSepolia,\n bsc,\n avalanche,\n sepolia,\n zora,\n linea,\n scroll,\n mantle,\n celo,\n gnosis,\n fantom,\n moonbeam,\n} from 'viem/chains';\nimport { fallback, http, type Transport } from 'viem';\nimport type { Chain } from 'viem';\n\n// ─── Supported chains registry ────────────────────────────────────────────────\n\nexport const CHAINS: Record<string, Chain> = {\n // Mainnet\n mainnet,\n ethereum: mainnet,\n eth: mainnet,\n\n // Base\n base,\n 'base-mainnet': base,\n\n // Base Sepolia\n 'base-sepolia': baseSepolia,\n baseSepolia,\n\n // Polygon\n polygon,\n matic: polygon,\n\n // Polygon Amoy (testnet)\n amoy: polygonAmoy,\n 'polygon-amoy': polygonAmoy,\n\n // Arbitrum\n arbitrum,\n 'arbitrum-one': arbitrum,\n\n // Arbitrum Sepolia\n 'arbitrum-sepolia': arbitrumSepolia,\n arbitrumSepolia,\n\n // Optimism\n optimism,\n op: optimism,\n\n // Optimism Sepolia\n 'optimism-sepolia': optimismSepolia,\n optimismSepolia,\n\n // BSC\n bsc,\n bnb: bsc,\n 'binance-smart-chain': bsc,\n\n // Avalanche\n avalanche,\n avax: avalanche,\n\n // Testnets\n sepolia,\n 'eth-sepolia': sepolia,\n\n // Other L2s\n zora,\n linea,\n scroll,\n mantle,\n celo,\n gnosis,\n xdai: gnosis,\n fantom,\n moonbeam,\n};\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n// Pre-computed once at module load — used in unsupported-chain error messages.\nconst _chainAliases = Object.keys(CHAINS).sort().join(', ');\n\n/**\n * Resolves a chain string identifier or a viem Chain object to a Chain.\n *\n * @example\n * resolveChain(\"base\") // → Chain object for Base\n * resolveChain(base) // → same Chain object, passthrough\n * resolveChain(\"unknown\") // → throws Error\n */\nexport function resolveChain(chain: Chain | string): Chain {\n if (typeof chain === 'object' && 'id' in chain) {\n return chain;\n }\n\n if (typeof chain === 'string') {\n const resolved = CHAINS[chain.toLowerCase()] ?? CHAINS[chain];\n if (!resolved) {\n throw new Error(\n `[awarizon/web3] Unsupported chain: \"${chain}\".\\n` +\n `Available chains: ${_chainAliases}`,\n );\n }\n return resolved;\n }\n\n throw new TypeError(`[awarizon/web3] chain must be a string or Chain object, got: ${typeof chain}`);\n}\n\n/** Returns a list of all unique supported chain IDs */\nexport function getSupportedChainIds(): number[] {\n const seen = new Set<number>();\n return Object.values(CHAINS)\n .filter(c => { if (seen.has(c.id)) return false; seen.add(c.id); return true; })\n .map(c => c.id);\n}\n\n// ─── Fallback RPC registry ────────────────────────────────────────────────────\n// Secondary endpoints for chains whose default public RPCs are unreliable.\n// Keyed by chain ID so the lookup is O(1) and independent of alias names.\n\nconst FALLBACK_RPCS: Record<number, string> = {\n 5000: 'https://mantle-mainnet.public.blastapi.io', // mantle\n 42220: 'https://celo.drpc.org', // celo\n 100: 'https://gnosis.drpc.org', // gnosis\n 250: 'https://rpc.fantom.network', // fantom\n 1284: 'https://moonbeam.drpc.org', // moonbeam\n};\n\n/**\n * Build the viem Transport for a chain.\n *\n * Priority:\n * 1. If the caller supplied an explicit `rpcUrlOverride`, use it directly.\n * 2. For chains with a known-unreliable default RPC, wrap primary + fallback\n * in viem's `fallback()` transport — primary is always tried first.\n * 3. All other chains: plain `http()` with viem's chain default.\n *\n * @example\n * // Fallback kicks in automatically for mantle, celo, gnosis, fantom, moonbeam\n * const transport = getChainTransport(mantle)\n *\n * // User override bypasses fallback entirely — they know what they want\n * const transport = getChainTransport(mantle, \"https://my-own-rpc.example.com\")\n */\nexport function getChainTransport(chain: Chain, rpcUrlOverride?: string): Transport {\n if (rpcUrlOverride) return http(rpcUrlOverride);\n\n const fallbackUrl = FALLBACK_RPCS[chain.id];\n if (fallbackUrl) {\n const primaryUrl = chain.rpcUrls.default.http[0];\n return fallback([http(primaryUrl), http(fallbackUrl)]);\n }\n\n return http();\n}\n","export class InvalidABIError extends Error {\n readonly code = 'INVALID_ABI' as const;\n\n constructor(message: string) {\n super(`[abi-engine] ${message}`);\n this.name = 'InvalidABIError';\n }\n}\n\nexport class UnsupportedABIItemError extends Error {\n readonly code = 'UNSUPPORTED_ABI_ITEM' as const;\n readonly itemType: string;\n\n constructor(itemType: string) {\n super(`[abi-engine] Unsupported ABI item type: \"${itemType}\"`);\n this.name = 'UnsupportedABIItemError';\n this.itemType = itemType;\n }\n}\n\nexport class DuplicateFunctionError extends Error {\n readonly code = 'DUPLICATE_FUNCTION' as const;\n readonly functionName: string;\n\n constructor(name: string) {\n super(`[abi-engine] Duplicate function name detected: \"${name}\". Function overloads are not yet supported.`);\n this.name = 'DuplicateFunctionError';\n this.functionName = name;\n }\n}\n","import type { Abi, AbiFunction, AbiEvent } from 'viem';\nimport type { AbiConstructor } from 'abitype';\nimport { InvalidABIError } from './errors';\nimport type { ParsedABI, FunctionMetadata, FunctionKind, GeneratedMethod } from './types';\n\n// ─── ABI parser ──────────────────────────────────────────────────────────────\n\n// Module-level WeakMap — ABIs defined as module constants (the 99% case) are\n// parsed exactly once per process lifetime. No GC pressure; zero API changes.\nconst _parseCache = new WeakMap<object, ParsedABI>();\n\n/**\n * Parse a raw ABI array and classify every item into read functions,\n * write functions, payable functions, events, and the constructor.\n *\n * Results are memoized by object identity — passing the same const ABI\n * reference across multiple calls costs only a single WeakMap lookup.\n *\n * @throws {InvalidABIError} when the input is not a valid ABI array\n */\nexport function parseABI(abi: Abi): ParsedABI {\n const hit = _parseCache.get(abi);\n if (hit) return hit;\n\n if (!Array.isArray(abi) || abi.length === 0) {\n throw new InvalidABIError('ABI must be a non-empty array');\n }\n\n const readFunctions: AbiFunction[] = [];\n const writeFunctions: AbiFunction[] = [];\n const payableFunctions: AbiFunction[] = [];\n const events: AbiEvent[] = [];\n let constructor: AbiConstructor | undefined;\n\n for (const item of abi) {\n if (!item || typeof item !== 'object' || !('type' in item)) {\n throw new InvalidABIError(`Invalid ABI item: ${JSON.stringify(item)}`);\n }\n\n switch (item.type) {\n case 'function': {\n const fn = item as AbiFunction;\n const sm = fn.stateMutability;\n\n if (sm === 'view' || sm === 'pure') {\n readFunctions.push(fn);\n } else if (sm === 'payable') {\n payableFunctions.push(fn);\n writeFunctions.push(fn);\n } else {\n // nonpayable\n writeFunctions.push(fn);\n }\n break;\n }\n\n case 'event':\n events.push(item as AbiEvent);\n break;\n\n case 'constructor':\n constructor = item as AbiConstructor;\n break;\n\n case 'fallback':\n case 'receive':\n case 'error':\n // Supported but not surfaced as callable methods\n break;\n\n default:\n // Unknown item — skip gracefully to stay forward-compatible\n break;\n }\n }\n\n const result: ParsedABI = { readFunctions, writeFunctions, payableFunctions, events, constructor };\n _parseCache.set(abi, result);\n return result;\n}\n\n// ─── Metadata helpers ─────────────────────────────────────────────────────────\n\n/** Return rich metadata for a single ABI function */\nexport function getFunctionMetadata(fn: AbiFunction): FunctionMetadata {\n const sm = fn.stateMutability;\n let kind: FunctionKind;\n\n if (sm === 'view' || sm === 'pure') {\n kind = 'read';\n } else if (sm === 'payable') {\n kind = 'payable';\n } else {\n kind = 'write';\n }\n\n return {\n name: fn.name,\n kind,\n inputs: [...(fn.inputs ?? [])],\n outputs: [...(fn.outputs ?? [])],\n stateMutability: fn.stateMutability,\n };\n}\n\n/** Check whether a function mutates state (requires a signer) */\nexport function isWriteFunction(fn: AbiFunction): boolean {\n return fn.stateMutability !== 'view' && fn.stateMutability !== 'pure';\n}\n\n/** Check whether a function can receive ETH */\nexport function isPayableFunction(fn: AbiFunction): boolean {\n return fn.stateMutability === 'payable';\n}\n\n// ─── TypeScript signature generation ─────────────────────────────────────────\n\n/** Map Solidity ABI types to approximate TypeScript types */\nfunction solidityTypeToTS(abiType: string): string {\n if (abiType.endsWith('[]')) return `${solidityTypeToTS(abiType.slice(0, -2))}[]`;\n if (abiType.startsWith('uint') || abiType.startsWith('int')) return 'bigint';\n if (abiType === 'address') return '`0x${string}`';\n if (abiType === 'bool') return 'boolean';\n if (abiType.startsWith('bytes')) return '`0x${string}`';\n if (abiType === 'string') return 'string';\n if (abiType === 'tuple') return 'Record<string, unknown>';\n return 'unknown';\n}\n\n/**\n * Generate a human-readable TypeScript method signature from an ABI function.\n * Useful for tooling, code generation, and documentation.\n */\nexport function generateMethodSignature(fn: AbiFunction): GeneratedMethod {\n const sm = fn.stateMutability;\n const kind: FunctionKind =\n sm === 'view' || sm === 'pure' ? 'read' : sm === 'payable' ? 'payable' : 'write';\n\n const params = (fn.inputs ?? []).map((p, i) => ({\n name: p.name || `arg${i}`,\n type: solidityTypeToTS(p.type),\n }));\n\n const paramStr = params.map(p => `${p.name}: ${p.type}`).join(', ');\n\n let returnType: string;\n const outputs = fn.outputs ?? [];\n if (outputs.length === 0) {\n returnType = kind === 'read' ? 'void' : 'TransactionResult';\n } else if (outputs.length === 1) {\n returnType = solidityTypeToTS(outputs[0].type);\n } else {\n returnType = `[${outputs.map(o => solidityTypeToTS(o.type)).join(', ')}]`;\n }\n\n const asyncReturn = kind === 'read' ? `Promise<${returnType}>` : 'Promise<TransactionResult>';\n const signature = `${fn.name}(${paramStr}): ${asyncReturn}`;\n\n return { name: fn.name, kind, signature, params };\n}\n\n/**\n * Generate TypeScript method signatures for all functions in a parsed ABI.\n * Used by the CLI to produce fully typed contract client code.\n */\nexport function generateAllMethodSignatures(parsed: ParsedABI): GeneratedMethod[] {\n const all = [...parsed.readFunctions, ...parsed.writeFunctions];\n return all.map(generateMethodSignature);\n}\n","import type { Abi, AbiFunction, AbiEvent, Address, PublicClient, Chain } from 'viem';\nimport { parseABI } from '@awarizon/abi-engine';\nimport { TransactionEngine } from '@awarizon/tx-engine';\nimport type { TelemetryClient, TelemetryEventType } from './telemetry';\nimport type { ContractInstance, EventUnsubscribe } from './types';\n\n// ─── Telemetry helper ─────────────────────────────────────────────────────────\n\nfunction trackEvent(\n telemetry: TelemetryClient | undefined,\n type: TelemetryEventType,\n chain: Chain | undefined,\n functionName: string | undefined,\n success: boolean,\n start: number,\n): void {\n telemetry?.track({\n type,\n chain: chain?.name ?? 'unknown',\n chainId: chain?.id ?? 0,\n functionName,\n success,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n}\n\n// ─── ContractFactory ──────────────────────────────────────────────────────────\n\n/**\n * Builds a fully dynamic ContractInstance from an address + ABI.\n *\n * Every function in the ABI is attached as a method that routes to read or\n * write based on stateMutability. Telemetry is tracked for every call.\n *\n * The `txEngine` parameter is shared from the parent SDK instance — one engine\n * per SDK, not one per contract.\n */\nexport function buildContractInstance(\n address: Address,\n abi: Abi,\n publicClient: PublicClient,\n txEngine: TransactionEngine,\n telemetry?: TelemetryClient,\n chain?: Chain,\n): ContractInstance {\n // parseABI is memoized by ABI object identity — free on repeat calls\n const parsed = parseABI(abi);\n\n // O(1) event lookup — built once, used on every .on() call\n const eventsMap = new Map<string, AbiEvent>(parsed.events.map(e => [e.name, e]));\n\n const instance: Record<string, unknown> = {\n _address: address,\n _abi: abi,\n };\n\n for (const fn of parsed.readFunctions) {\n instance[fn.name] = buildReadMethod(fn, address, abi, txEngine, telemetry, chain);\n }\n\n for (const fn of parsed.writeFunctions) {\n instance[fn.name] = buildWriteMethod(fn, address, abi, txEngine, telemetry, chain);\n }\n\n instance['on'] = buildEventSubscription(address, abi, eventsMap, publicClient);\n\n instance['estimateGas'] = async (method: string, ...args: unknown[]): Promise<bigint> => {\n const start = Date.now();\n try {\n const estimate = await txEngine.estimateGas({ address, abi, functionName: method, args });\n trackEvent(telemetry, 'contract.gas_estimate', chain, method, true, start);\n return estimate.gas;\n } catch (error) {\n trackEvent(telemetry, 'contract.gas_estimate', chain, method, false, start);\n throw error;\n }\n };\n\n return instance as ContractInstance;\n}\n\n// ─── Read method ──────────────────────────────────────────────────────────────\n\nfunction buildReadMethod(\n fn: AbiFunction,\n address: Address,\n abi: Abi,\n txEngine: TransactionEngine,\n telemetry: TelemetryClient | undefined,\n chain: Chain | undefined,\n): (...args: unknown[]) => Promise<unknown> {\n return async (...args: unknown[]) => {\n const start = Date.now();\n try {\n const result = await txEngine.read({ address, abi, functionName: fn.name, args });\n trackEvent(telemetry, 'contract.read', chain, fn.name, true, start);\n return result;\n } catch (error) {\n trackEvent(telemetry, 'contract.read', chain, fn.name, false, start);\n throw error;\n }\n };\n}\n\n// ─── Write method ─────────────────────────────────────────────────────────────\n\nfunction buildWriteMethod(\n fn: AbiFunction,\n address: Address,\n abi: Abi,\n txEngine: TransactionEngine,\n telemetry: TelemetryClient | undefined,\n chain: Chain | undefined,\n): (...args: unknown[]) => Promise<unknown> {\n const isPayable = fn.stateMutability === 'payable';\n\n return async (...args: unknown[]) => {\n let callArgs = args;\n let value: bigint | undefined;\n let gas: bigint | undefined;\n\n if (isPayable && args.length > 0) {\n const last = args[args.length - 1];\n if (isPayableOptions(last)) {\n callArgs = args.slice(0, -1);\n value = last.value;\n gas = last.gas;\n }\n }\n\n const start = Date.now();\n try {\n const result = await txEngine.write({\n address, abi, functionName: fn.name, args: callArgs, value, gas,\n });\n trackEvent(telemetry, 'contract.write', chain, fn.name, true, start);\n return result;\n } catch (error) {\n trackEvent(telemetry, 'contract.write', chain, fn.name, false, start);\n throw error;\n }\n };\n}\n\nfunction isPayableOptions(val: unknown): val is { value?: bigint; gas?: bigint } {\n if (!val || typeof val !== 'object') return false;\n const obj = val as Record<string, unknown>;\n const hasValue = 'value' in obj && (obj.value === undefined || typeof obj.value === 'bigint');\n const hasGas = 'gas' in obj && (obj.gas === undefined || typeof obj.gas === 'bigint');\n return hasValue || hasGas;\n}\n\n// ─── Event subscription ───────────────────────────────────────────────────────\n\nfunction buildEventSubscription(\n address: Address,\n abi: Abi,\n eventsMap: Map<string, AbiEvent>,\n publicClient: PublicClient,\n): (event: string, callback: (log: unknown) => void) => EventUnsubscribe {\n return (eventName: string, callback: (log: unknown) => void): EventUnsubscribe => {\n const abiEvent = eventsMap.get(eventName); // O(1)\n\n if (!abiEvent) {\n const available = [...eventsMap.keys()].join(', ') || 'none';\n throw new Error(\n `[awarizon/web3] Event \"${eventName}\" not found on contract ${address}.\\n` +\n `Available events: ${available}`,\n );\n }\n\n const unwatch = publicClient.watchContractEvent({\n address,\n abi,\n eventName,\n onLogs: (logs) => {\n for (const log of logs) callback(log);\n },\n });\n\n return unwatch;\n };\n}\n","export class NetworkMismatchError extends Error {\n readonly code = 'NETWORK_MISMATCH' as const;\n readonly expected: string;\n readonly got: string;\n\n constructor(expected: string | number, got: string | number) {\n super(`[awarizon/web3] Network mismatch: expected chain ID ${expected}, but wallet is on chain ID ${got}`);\n this.name = 'NetworkMismatchError';\n this.expected = String(expected);\n this.got = String(got);\n }\n}\n\nexport class ProviderError extends Error {\n readonly code = 'PROVIDER_ERROR' as const;\n\n constructor(message: string) {\n super(`[awarizon/web3] Provider error: ${message}`);\n this.name = 'ProviderError';\n }\n}\n\nexport class ContractNotLoadedError extends Error {\n readonly code = 'CONTRACT_NOT_LOADED' as const;\n\n constructor(address: string) {\n super(`[awarizon/web3] Contract at ${address} is not loaded. Call awarizon.contract({ address, abi }) first.`);\n this.name = 'ContractNotLoadedError';\n }\n}\n\nexport class UnsupportedChainError extends Error {\n readonly code = 'UNSUPPORTED_CHAIN' as const;\n readonly chain: string;\n\n constructor(chain: string) {\n super(`[awarizon/web3] Unsupported chain: \"${chain}\". Pass a valid chain name or viem Chain object.`);\n this.name = 'UnsupportedChainError';\n this.chain = chain;\n }\n}\n\nexport class ApiKeyRequiredError extends Error {\n readonly code = 'API_KEY_REQUIRED' as const;\n\n constructor() {\n super(\n '[awarizon/web3] An API key is required. Pass apiKey: \"awz_live_...\" to AwarizonWeb3({ ... }). ' +\n 'Get yours at https://awarizon.com/dashboard/api-keys',\n );\n this.name = 'ApiKeyRequiredError';\n }\n}\n\nexport class InvalidApiKeyError extends Error {\n readonly code = 'INVALID_API_KEY' as const;\n\n constructor(message = 'Invalid or revoked API key.') {\n super(`[awarizon/web3] ${message}`);\n this.name = 'InvalidApiKeyError';\n }\n}\n","import { InvalidApiKeyError } from './errors';\n\nexport type TelemetryEventType =\n | 'contract.read'\n | 'contract.write'\n | 'contract.gas_estimate'\n | 'wallet.create'\n | 'wallet.import'\n | 'chain.switch';\n\nexport interface TelemetryEvent {\n type: TelemetryEventType;\n chain: string;\n chainId: number;\n functionName?: string;\n success: boolean;\n durationMs: number;\n ts: number;\n}\n\nconst DEFAULT_BASE_URL = 'https://awarizon.com';\nconst FLUSH_INTERVAL_MS = 10_000;\nconst MAX_BATCH_SIZE = 20;\nconst VALIDATION_TIMEOUT = 5_000;\n\n// ─── TelemetryClient ──────────────────────────────────────────────────────────\n\n/**\n * Handles SDK-to-Awarizon API communication:\n * 1. Validates the API key on first meaningful operation (5s timeout)\n * 2. Batches usage events and flushes them fire-and-forget\n * 3. Flushes remaining events via sendBeacon on browser page unload\n *\n * All telemetry failures are swallowed — they never surface to the caller.\n * The only hard error is InvalidApiKeyError thrown from ensureValidated().\n */\nexport class TelemetryClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n private validated = false;\n private validationPromise: Promise<void> | null = null;\n private queue: TelemetryEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private unloadListener: (() => void) | null = null;\n\n constructor(apiKey: string, baseUrl = DEFAULT_BASE_URL) {\n this.apiKey = apiKey;\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n }\n\n /**\n * Ensures the API key has been validated against the Awarizon API.\n * Idempotent — safe to call on every operation; only hits the network once.\n * Times out after 5 seconds to avoid hanging in degraded network conditions.\n *\n * @throws {InvalidApiKeyError} if the key is invalid, revoked, or unreachable\n */\n async ensureValidated(): Promise<void> {\n if (this.validated) return;\n if (this.validationPromise) return this.validationPromise;\n\n this.validationPromise = this._validate().catch((err) => {\n // Reset so callers can retry after transient failures\n this.validationPromise = null;\n throw err;\n });\n\n return this.validationPromise;\n }\n\n /**\n * Queue a usage event. Events are batched and sent periodically.\n * Must only be called after ensureValidated() has resolved.\n */\n track(event: TelemetryEvent): void {\n if (!this.validated) return;\n this.queue.push(event);\n if (this.queue.length >= MAX_BATCH_SIZE) this._flush(false);\n }\n\n /**\n * Flush pending events and stop background timers.\n * Call when tearing down a long-lived SDK instance (e.g. server shutdown).\n */\n async destroy(): Promise<void> {\n this._stopTimers();\n await this._flush(true);\n }\n\n // ─── Private ─────────────────────────────────────────────────────────────────\n\n private async _validate(): Promise<void> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), VALIDATION_TIMEOUT);\n\n let res: Response;\n try {\n res = await fetch(`${this.baseUrl}/api/v1/auth`, {\n method: 'GET',\n headers: { Authorization: `Bearer ${this.apiKey}` },\n signal: controller.signal,\n });\n } catch (err) {\n const msg = controller.signal.aborted\n ? `Awarizon API did not respond within ${VALIDATION_TIMEOUT / 1000}s.`\n : `Could not reach Awarizon API: ${(err as Error).message}`;\n throw new InvalidApiKeyError(msg);\n } finally {\n clearTimeout(timeout);\n }\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({})) as { error?: string };\n throw new InvalidApiKeyError(body.error ?? 'Invalid or revoked API key.');\n }\n\n this.validated = true;\n this._startTimers();\n }\n\n private _startTimers(): void {\n // Periodic background flush\n this.flushTimer = setInterval(() => {\n if (this.queue.length > 0) this._flush(false);\n }, FLUSH_INTERVAL_MS);\n\n // Prevent the interval from blocking Node.js process exit\n const timer = this.flushTimer as unknown as { unref?: () => void };\n if (typeof timer.unref === 'function') timer.unref();\n\n // Browser page-unload: sendBeacon guarantees delivery even as page closes\n if (typeof window !== 'undefined' && typeof navigator !== 'undefined') {\n this.unloadListener = () => this._flushBeacon();\n window.addEventListener('beforeunload', this.unloadListener);\n }\n }\n\n private _stopTimers(): void {\n if (this.flushTimer !== null) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n if (this.unloadListener !== null && typeof window !== 'undefined') {\n window.removeEventListener('beforeunload', this.unloadListener);\n this.unloadListener = null;\n }\n }\n\n /**\n * Unified flush. Pass `await = true` for graceful shutdown,\n * `await = false` for fire-and-forget mid-session flushes.\n */\n private _flush(awaited: false): void;\n private _flush(awaited: true): Promise<void>;\n private _flush(awaited: boolean): void | Promise<void> {\n if (this.queue.length === 0) return awaited ? Promise.resolve() : undefined;\n\n const batch = this.queue.splice(0, MAX_BATCH_SIZE);\n const promise: Promise<void> = fetch(`${this.baseUrl}/api/v1/usage`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ events: batch }),\n }).then(() => {}, () => {});\n\n return awaited ? promise : undefined;\n }\n\n /** Uses sendBeacon for guaranteed delivery on page unload */\n private _flushBeacon(): void {\n if (this.queue.length === 0 || typeof navigator === 'undefined') return;\n const batch = this.queue.splice(0);\n navigator.sendBeacon(\n `${this.baseUrl}/api/v1/usage`,\n new Blob([JSON.stringify({ events: batch })], { type: 'application/json' }),\n );\n }\n}\n","import type { Address } from 'viem';\n\n// ─── Chainlink ABI ────────────────────────────────────────────────────────────\n\nexport const AGGREGATOR_ABI = [\n {\n inputs: [],\n name: 'latestRoundData',\n outputs: [\n { name: 'roundId', type: 'uint80' },\n { name: 'answer', type: 'int256' },\n { name: 'startedAt', type: 'uint256' },\n { name: 'updatedAt', type: 'uint256' },\n { name: 'answeredInRound', type: 'uint80' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint8' }],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n\n// ─── Chainlink feed registry ──────────────────────────────────────────────────\n// Keyed by chainId → SYMBOL → aggregator address.\n// Source: https://docs.chain.link/data-feeds/price-feeds/addresses\n\nexport const CHAINLINK_FEEDS: Record<number, Record<string, Address>> = {\n\n // Ethereum Mainnet\n 1: {\n ETH: '0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419',\n BTC: '0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88b',\n BNB: '0x14e613AC84a31f709eadbEF3bf98585328207896',\n MATIC:'0x7bAC85A8a13A4BcD8abb3eB7d6b4d632c895a5f6',\n AVAX: '0xFF3EEb22B5E3dE6e705b44749C2559d704923FD7',\n LINK: '0x2c1d072e956AFFC0D435Cb7AC308d97936742191',\n UNI: '0x553303d460EE0afB37EdFf9bE42922D8FF63220e',\n AAVE: '0x547a514d5e3769680Ce22B2361c10Ea13619e8a9',\n MKR: '0xec1D1B3b0443256cc3860e24a46F108e699484Aa',\n SNX: '0xDC3EA94CD0AC27d9A86C180091e7f78C683d3699',\n CRV: '0xCd627aA160A6fA45Eb793D19Ef54f5062F20f33',\n USDC: '0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6',\n USDT: '0x3E7d1eAB13ad0104d2750B8863b489D65364e32D',\n DAI: '0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9',\n FRAX: '0xB9E1E3A9feFf48998E45Fa90847ed4D467E8BcfD',\n },\n\n // Base\n 8453: {\n ETH: '0x71041dddad3595F9CEd3dCCFBe3D1F4b0a16Bb70',\n BTC: '0x64c911996D3c6aC71f9b455B1E8E7266BcFBF15F',\n LINK: '0x56a43EB56Da12C0dc1D972ACb089c06a5dEF8e69',\n USDC: '0x7e860098F58bBFC8648a4311b374B1D669a2bc9b',\n },\n\n // Polygon\n 137: {\n ETH: '0xF9680D99D6C9589e2a93a78A04A279e509205945',\n BTC: '0xc907E116054Ad103354f2D350FD2514433D57F6f',\n MATIC:'0xAB594600376Ec9fD91F8e885dADF0CE036862dE0',\n LINK: '0xd9FFdb71EbE7496cC440152d43986Aae0AB76665',\n AAVE: '0x72484B12719E23115761D5DA1646945632979bB6',\n UNI: '0xdf0Fb4e4F928d2dCB76f438575fDD8682386e13C',\n USDC: '0xfE4A8cc5b5B2366C1B58Bea3858e81843581b2F7',\n USDT: '0x0A6513e40db6EB1b165753AD52E80663aea50545',\n DAI: '0x4746DeC9e833A82EC7C2C1356372CcF2cfcD2F3D',\n },\n\n // Arbitrum One\n 42161: {\n ETH: '0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612',\n BTC: '0x6ce185860a4963106506C203335A2910413708e9',\n LINK: '0x86E53CF1B873786aC9Cc60cde71fFd0035d6df2d',\n ARB: '0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6',\n USDC: '0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3',\n USDT: '0x3f3f5dF88dC9F13eac63DF89EC16ef6e7E25DdE7',\n },\n\n // Optimism\n 10: {\n ETH: '0x13e3Ee699D1909E989722E753853AE30b17e08c5',\n BTC: '0xD702DD976Fb76Fffc2D3963D037dfDae5b04E593',\n LINK: '0xCc232dcFAAE6354cE191Bd574108c1aD03f86450',\n OP: '0x0D276FC14719f9292D5C1eA2198673d1f4269246',\n USDC: '0x16a9FA2FDa030272Ce99B29CF780dFA30361d35f',\n USDT: '0xECef79E109e997bCA29c1c0897ec9d7b03647F5E',\n },\n\n // BNB Smart Chain\n 56: {\n BNB: '0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE',\n ETH: '0x9ef1B8c0E4F7dc8bF5719Ea496883DC6401d5b2',\n BTC: '0x264990fbd0A4796A3E3d8E37C4d5F87a3aCa5Ebf',\n LINK: '0xca236E327F629f9Fc2c30A4E95775EbF0B89fac8',\n USDT: '0xB97Ad0E74fa7d920791E90258A6E2085088b4320',\n DAI: '0x132d3C0B1D2cEa0BC552588063bdBb210FDeecfA',\n },\n\n // Avalanche C-Chain\n 43114: {\n ETH: '0x976B3D034E162d8bD72D6b9C989d545b839003b0',\n BTC: '0x2779D32d5166BAaa2B2b658333bA7e6Ec0C65743',\n AVAX: '0x0A77230d17318075983913bC2145DB16C7366156',\n LINK: '0x49ccd9ca821EfEab2b98c60DC60F518E765eDe9a',\n USDC: '0xF096872672F44d6EBA71527d2277B6f4B77Ea29A',\n USDT: '0xEBE676ee90Fe1112671f19b6B7459bC678B67e8a',\n },\n};\n\n// ─── CoinGecko fallback registry ──────────────────────────────────────────────\n// Maps uppercase symbol → CoinGecko asset ID.\n// Used when no Chainlink feed exists for the current chain+symbol.\n\nexport const COINGECKO_IDS: Record<string, string> = {\n // Native tokens\n ETH: 'ethereum',\n BTC: 'bitcoin',\n BNB: 'binancecoin',\n MATIC: 'matic-network',\n POL: 'matic-network',\n AVAX: 'avalanche-2',\n FTM: 'fantom',\n GLMR: 'moonbeam',\n CELO: 'celo',\n XDAI: 'xdai',\n GNO: 'gnosis',\n MNT: 'mantle',\n\n // Major stables\n USDC: 'usd-coin',\n USDT: 'tether',\n DAI: 'dai',\n BUSD: 'binance-usd',\n FRAX: 'frax',\n LUSD: 'liquity-usd',\n GUSD: 'gemini-dollar',\n TUSD: 'true-usd',\n USDD: 'usdd',\n FDUSD: 'first-digital-usd',\n\n // DeFi blue chips\n LINK: 'chainlink',\n UNI: 'uniswap',\n AAVE: 'aave',\n MKR: 'maker',\n SNX: 'havven',\n CRV: 'curve-dao-token',\n LDO: 'lido-dao',\n RPL: 'rocket-pool',\n BAL: 'balancer',\n COMP: 'compound-governance-token',\n YFI: 'yearn-finance',\n SUSHI: 'sushi',\n\n // L2 tokens\n ARB: 'arbitrum',\n OP: 'optimism',\n IMX: 'immutable-x',\n\n // Other popular alts\n DOGE: 'dogecoin',\n SHIB: 'shiba-inu',\n PEPE: 'pepe',\n WLD: 'worldcoin-wld',\n APE: 'apecoin',\n GRT: 'the-graph',\n ENS: 'ethereum-name-service',\n BLUR: 'blur',\n};\n","import type { PublicClient } from 'viem';\nimport { AGGREGATOR_ABI, CHAINLINK_FEEDS, COINGECKO_IDS } from './feeds';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface PriceResult {\n /** Uppercase token symbol (e.g. \"ETH\", \"USDC\") */\n symbol: string;\n /** Current USD price */\n price: number;\n /** Where the price came from */\n source: 'chainlink' | 'coingecko';\n /** Unix timestamp of the last update (only set for chainlink source) */\n updatedAt?: number;\n /** True when chainlink data is older than 2 hours */\n stale?: boolean;\n}\n\n// ─── Chainlink helpers ────────────────────────────────────────────────────────\n\nconst TWO_HOURS_SECS = 7200;\n\nasync function fetchChainlink(\n publicClient: PublicClient,\n chainId: number,\n symbol: string,\n): Promise<PriceResult | null> {\n const feeds = CHAINLINK_FEEDS[chainId];\n if (!feeds) return null;\n\n const address = feeds[symbol.toUpperCase()];\n if (!address) return null;\n\n try {\n const [roundData, rawDecimals] = await Promise.all([\n publicClient.readContract({\n address,\n abi: AGGREGATOR_ABI,\n functionName: 'latestRoundData',\n }),\n publicClient.readContract({\n address,\n abi: AGGREGATOR_ABI,\n functionName: 'decimals',\n }),\n ]);\n\n const answer = roundData[1]; // int256\n const updatedAt = Number(roundData[3]);\n const decimals = Number(rawDecimals);\n\n if (answer <= 0n) return null;\n\n const price = Number(answer) / 10 ** decimals;\n const stale = Date.now() / 1000 - updatedAt > TWO_HOURS_SECS;\n\n return { symbol: symbol.toUpperCase(), price, source: 'chainlink', updatedAt, stale };\n } catch {\n return null;\n }\n}\n\n// ─── CoinGecko helpers ────────────────────────────────────────────────────────\n\nconst CG_BASE = 'https://api.coingecko.com/api/v3';\n\nasync function fetchCoinGecko(symbols: string[]): Promise<Record<string, number>> {\n const ids = symbols\n .map(s => COINGECKO_IDS[s.toUpperCase()])\n .filter(Boolean);\n\n if (ids.length === 0) return {};\n\n const url = `${CG_BASE}/simple/price?ids=${ids.join(',')}&vs_currencies=usd`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`[awarizon/price] CoinGecko returned ${res.status}`);\n\n const data = (await res.json()) as Record<string, { usd?: number }>;\n\n const out: Record<string, number> = {};\n for (const sym of symbols) {\n const id = COINGECKO_IDS[sym.toUpperCase()];\n const price = id ? data[id]?.usd : undefined;\n if (price !== undefined) out[sym.toUpperCase()] = price;\n }\n return out;\n}\n\n// ─── PriceEngine ─────────────────────────────────────────────────────────────\n\n/**\n * Fetches USD prices via Chainlink on-chain feeds (primary) with automatic\n * fallback to CoinGecko's free API when no feed exists for the current chain.\n *\n * Attached to the SDK as `awarizon.price`.\n *\n * @example\n * ```ts\n * const { price } = await awarizon.price.get('ETH')\n * // → { symbol: 'ETH', price: 3421.57, source: 'chainlink', updatedAt: 1720000000 }\n *\n * const prices = await awarizon.price.getMany(['ETH', 'BTC', 'USDC', 'ARB'])\n * // → { ETH: { price: 3421 }, BTC: { price: 68200 }, ... }\n * ```\n */\nexport class PriceEngine {\n constructor(\n private readonly publicClient: PublicClient,\n private readonly chainId: number,\n ) {}\n\n /**\n * Get the current USD price of a single token by symbol.\n * Tries Chainlink first; falls back to CoinGecko on failure or missing feed.\n *\n * @param symbol - Token symbol: 'ETH', 'BTC', 'USDC', 'LINK', etc.\n *\n * @example\n * const { price, source } = await awarizon.price.get('ETH')\n */\n async get(symbol: string): Promise<PriceResult> {\n const sym = symbol.toUpperCase();\n\n // 1. Try Chainlink on the current chain\n const chainlink = await fetchChainlink(this.publicClient, this.chainId, sym);\n if (chainlink && !chainlink.stale) return chainlink;\n\n // 2. Fall back to CoinGecko\n if (COINGECKO_IDS[sym]) {\n try {\n const cgPrices = await fetchCoinGecko([sym]);\n const price = cgPrices[sym];\n if (price !== undefined) {\n return { symbol: sym, price, source: 'coingecko' };\n }\n } catch {\n // CoinGecko failed — return stale chainlink if we have it\n if (chainlink) return chainlink;\n }\n }\n\n // 3. Return stale chainlink if that's all we have\n if (chainlink) return chainlink;\n\n throw new Error(\n `[awarizon/price] No price available for \"${sym}\". ` +\n `No Chainlink feed on chain ${this.chainId} and CoinGecko ID not registered. ` +\n `Supported symbols: ETH, BTC, BNB, MATIC, AVAX, LINK, UNI, AAVE, USDC, USDT, DAI, and more.`,\n );\n }\n\n /**\n * Get USD prices for multiple tokens in one call.\n * Chainlink feeds are read in parallel; CoinGecko batch-fetches all remaining\n * symbols in a single HTTP request — efficient even for large lists.\n *\n * @param symbols - Array of token symbols: ['ETH', 'BTC', 'USDC']\n *\n * @example\n * const prices = await awarizon.price.getMany(['ETH', 'BTC', 'USDC', 'ARB'])\n * console.log(prices.ETH.price) // 3421.57\n * console.log(prices.ARB.source) // 'coingecko' (no feed on most chains)\n */\n async getMany(symbols: string[]): Promise<Record<string, PriceResult>> {\n const syms = symbols.map(s => s.toUpperCase());\n\n // Fire all Chainlink lookups in parallel\n const chainlinkResults = await Promise.all(\n syms.map(sym => fetchChainlink(this.publicClient, this.chainId, sym)),\n );\n\n const out: Record<string, PriceResult> = {};\n const needsCG: string[] = [];\n\n for (let i = 0; i < syms.length; i++) {\n const sym = syms[i];\n const cl = chainlinkResults[i];\n\n if (cl && !cl.stale) {\n out[sym] = cl;\n } else {\n needsCG.push(sym);\n }\n }\n\n // One CoinGecko call for everything that didn't resolve via Chainlink\n if (needsCG.length > 0) {\n try {\n const cgPrices = await fetchCoinGecko(needsCG);\n for (const sym of needsCG) {\n const price = cgPrices[sym];\n if (price !== undefined) {\n out[sym] = { symbol: sym, price, source: 'coingecko' };\n } else {\n // Last resort: return stale chainlink if we have it\n const cl = chainlinkResults[syms.indexOf(sym)];\n if (cl) out[sym] = cl;\n }\n }\n } catch {\n // CoinGecko failed — fill in stale chainlink values where available\n for (const sym of needsCG) {\n const cl = chainlinkResults[syms.indexOf(sym)];\n if (cl) out[sym] = cl;\n }\n }\n }\n\n return out;\n }\n\n /**\n * Check whether a Chainlink feed exists for the given symbol on the current chain.\n *\n * @example\n * awarizon.price.hasFeed('ETH') // true on mainnet, base, polygon, etc.\n * awarizon.price.hasFeed('ARB') // true on Arbitrum, false elsewhere\n */\n hasFeed(symbol: string): boolean {\n return !!(CHAINLINK_FEEDS[this.chainId]?.[symbol.toUpperCase()]);\n }\n\n /**\n * Return all symbols that have a Chainlink feed on the current chain.\n *\n * @example\n * awarizon.price.supportedSymbols()\n * // → ['ETH', 'BTC', 'LINK', 'USDC', 'USDT', 'DAI'] on Base\n */\n supportedSymbols(): string[] {\n return Object.keys(CHAINLINK_FEEDS[this.chainId] ?? {});\n }\n}\n","import { erc20Abi, type Address, type Abi } from 'viem';\nimport type { ContractInstance, TransactionResult } from './types';\n\n// ─── ERC-20 ───────────────────────────────────────────────────────────────────\n\nexport const ERC20_ABI = erc20Abi;\n\nexport interface Erc20Contract {\n name(): Promise<string>;\n symbol(): Promise<string>;\n decimals(): Promise<number>;\n totalSupply(): Promise<bigint>;\n balanceOf(owner: Address): Promise<bigint>;\n allowance(owner: Address, spender: Address): Promise<bigint>;\n transfer(to: Address, amount: bigint): Promise<TransactionResult>;\n transferFrom(from: Address, to: Address, amount: bigint): Promise<TransactionResult>;\n approve(spender: Address, amount: bigint): Promise<TransactionResult>;\n on: ContractInstance['on'];\n estimateGas: ContractInstance['estimateGas'];\n readonly _address: Address;\n readonly _abi: Abi;\n}\n\n// ─── ERC-721 ──────────────────────────────────────────────────────────────────\n// Single safeTransferFrom overload (3-arg) to avoid ABI duplicate conflicts.\n// Includes tokenURI + totalSupply (ERC721Metadata / ERC721Enumerable extensions\n// present on virtually every deployed NFT contract).\n\nexport const ERC721_ABI = [\n { type: 'function', name: 'name', stateMutability: 'view', inputs: [], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'symbol', stateMutability: 'view', inputs: [], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'tokenURI', stateMutability: 'view', inputs: [{ name: 'tokenId', type: 'uint256' }], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'totalSupply', stateMutability: 'view', inputs: [], outputs: [{ type: 'uint256' }] },\n { type: 'function', name: 'ownerOf', stateMutability: 'view', inputs: [{ name: 'tokenId', type: 'uint256' }], outputs: [{ type: 'address' }] },\n { type: 'function', name: 'balanceOf', stateMutability: 'view', inputs: [{ name: 'owner', type: 'address' }], outputs: [{ type: 'uint256' }] },\n { type: 'function', name: 'getApproved', stateMutability: 'view', inputs: [{ name: 'tokenId', type: 'uint256' }], outputs: [{ type: 'address' }] },\n { type: 'function', name: 'isApprovedForAll', stateMutability: 'view', inputs: [{ name: 'owner', type: 'address' }, { name: 'operator', type: 'address' }], outputs: [{ type: 'bool' }] },\n { type: 'function', name: 'transferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'tokenId', type: 'uint256' }], outputs: [] },\n { type: 'function', name: 'safeTransferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'tokenId', type: 'uint256' }], outputs: [] },\n { type: 'function', name: 'approve', stateMutability: 'nonpayable', inputs: [{ name: 'to', type: 'address' }, { name: 'tokenId', type: 'uint256' }], outputs: [] },\n { type: 'function', name: 'setApprovalForAll', stateMutability: 'nonpayable', inputs: [{ name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }], outputs: [] },\n { type: 'event', name: 'Transfer', inputs: [{ indexed: true, name: 'from', type: 'address' }, { indexed: true, name: 'to', type: 'address' }, { indexed: true, name: 'tokenId', type: 'uint256' }] },\n { type: 'event', name: 'Approval', inputs: [{ indexed: true, name: 'owner', type: 'address' }, { indexed: true, name: 'approved', type: 'address' }, { indexed: true, name: 'tokenId', type: 'uint256' }] },\n { type: 'event', name: 'ApprovalForAll', inputs: [{ indexed: true, name: 'owner', type: 'address' }, { indexed: true, name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }] },\n] as const;\n\nexport interface Erc721Contract {\n name(): Promise<string>;\n symbol(): Promise<string>;\n tokenURI(tokenId: bigint): Promise<string>;\n totalSupply(): Promise<bigint>;\n ownerOf(tokenId: bigint): Promise<Address>;\n balanceOf(owner: Address): Promise<bigint>;\n getApproved(tokenId: bigint): Promise<Address>;\n isApprovedForAll(owner: Address, operator: Address): Promise<boolean>;\n transferFrom(from: Address, to: Address, tokenId: bigint): Promise<TransactionResult>;\n safeTransferFrom(from: Address, to: Address, tokenId: bigint): Promise<TransactionResult>;\n approve(to: Address, tokenId: bigint): Promise<TransactionResult>;\n setApprovalForAll(operator: Address, approved: boolean): Promise<TransactionResult>;\n on: ContractInstance['on'];\n estimateGas: ContractInstance['estimateGas'];\n readonly _address: Address;\n readonly _abi: Abi;\n}\n\n// ─── ERC-1155 ─────────────────────────────────────────────────────────────────\n\nexport const ERC1155_ABI = [\n { type: 'function', name: 'uri', stateMutability: 'view', inputs: [{ name: 'id', type: 'uint256' }], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'balanceOf', stateMutability: 'view', inputs: [{ name: 'account', type: 'address' }, { name: 'id', type: 'uint256' }], outputs: [{ type: 'uint256' }] },\n { type: 'function', name: 'balanceOfBatch', stateMutability: 'view', inputs: [{ name: 'accounts', type: 'address[]' }, { name: 'ids', type: 'uint256[]' }], outputs: [{ type: 'uint256[]' }] },\n { type: 'function', name: 'isApprovedForAll', stateMutability: 'view', inputs: [{ name: 'account', type: 'address' }, { name: 'operator', type: 'address' }], outputs: [{ type: 'bool' }] },\n { type: 'function', name: 'setApprovalForAll', stateMutability: 'nonpayable', inputs: [{ name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }], outputs: [] },\n { type: 'function', name: 'safeTransferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'id', type: 'uint256' }, { name: 'amount', type: 'uint256' }, { name: 'data', type: 'bytes' }], outputs: [] },\n { type: 'function', name: 'safeBatchTransferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'ids', type: 'uint256[]' }, { name: 'amounts', type: 'uint256[]' }, { name: 'data', type: 'bytes' }], outputs: [] },\n { type: 'event', name: 'TransferSingle', inputs: [{ indexed: true, name: 'operator', type: 'address' }, { indexed: true, name: 'from', type: 'address' }, { indexed: true, name: 'to', type: 'address' }, { name: 'id', type: 'uint256' }, { name: 'value', type: 'uint256' }] },\n { type: 'event', name: 'TransferBatch', inputs: [{ indexed: true, name: 'operator', type: 'address' }, { indexed: true, name: 'from', type: 'address' }, { indexed: true, name: 'to', type: 'address' }, { name: 'ids', type: 'uint256[]' }, { name: 'values', type: 'uint256[]' }] },\n { type: 'event', name: 'ApprovalForAll', inputs: [{ indexed: true, name: 'account', type: 'address' }, { indexed: true, name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }] },\n] as const;\n\nexport interface Erc1155Contract {\n uri(id: bigint): Promise<string>;\n balanceOf(account: Address, id: bigint): Promise<bigint>;\n balanceOfBatch(accounts: Address[], ids: bigint[]): Promise<bigint[]>;\n isApprovedForAll(account: Address, operator: Address): Promise<boolean>;\n setApprovalForAll(operator: Address, approved: boolean): Promise<TransactionResult>;\n safeTransferFrom(from: Address, to: Address, id: bigint, amount: bigint, data: `0x${string}`): Promise<TransactionResult>;\n safeBatchTransferFrom(from: Address, to: Address, ids: bigint[], amounts: bigint[], data: `0x${string}`): Promise<TransactionResult>;\n on: ContractInstance['on'];\n estimateGas: ContractInstance['estimateGas'];\n readonly _address: Address;\n readonly _abi: Abi;\n}\n","import {\n createPublicClient,\n http,\n type Chain,\n type WalletClient,\n type PublicClient,\n type Address,\n type Abi,\n type Hex,\n} from 'viem';\nimport { WalletEngine } from '@awarizon/wallet-engine';\nimport type {\n CreatedWallet,\n ImportedWalletFromMnemonic,\n ImportedWalletFromPrivateKey,\n ExternalWalletClient,\n EIP1193Provider,\n ConnectorInfo,\n WalletChangeEvent,\n ChainChangeEvent,\n SignTypedDataParams,\n} from '@awarizon/wallet-engine';\nimport { TransactionEngine } from '@awarizon/tx-engine';\nimport type { TransactionResult } from '@awarizon/tx-engine';\nimport { resolveChain, getChainTransport } from './chains';\nimport { buildContractInstance } from './contract';\nimport { TelemetryClient } from './telemetry';\nimport { ApiKeyRequiredError } from './errors';\nimport { PriceEngine } from './price';\nimport {\n ERC20_ABI,\n ERC721_ABI,\n ERC1155_ABI,\n} from './standards';\nimport type {\n Erc20Contract,\n Erc721Contract,\n Erc1155Contract,\n} from './standards';\nimport type {\n AwarizonConfig,\n ContractConfig,\n ContractInstance,\n ContractRegistryEntry,\n SDKWalletInfo,\n} from './types';\n\n// Re-export errors so consumers only need one import path\nexport {\n WalletNotConnectedError,\n InvalidMnemonicError,\n InvalidPrivateKeyError,\n ChainMismatchError,\n} from '@awarizon/wallet-engine';\n\nexport {\n ContractExecutionError,\n SimulationError,\n GasEstimationError,\n} from '@awarizon/tx-engine';\n\nexport {\n InvalidABIError,\n} from '@awarizon/abi-engine';\n\nexport {\n NetworkMismatchError,\n ProviderError,\n ContractNotLoadedError,\n UnsupportedChainError,\n ApiKeyRequiredError,\n InvalidApiKeyError,\n} from './errors';\n\n// ─── WalletProxy ──────────────────────────────────────────────────────────────\n\n/**\n * Wraps WalletEngine and gates mutating operations (create, import) behind\n * API key validation. Read-only operations (address, isConnected, etc.) are\n * never gated since they need no network access.\n */\nclass WalletProxy {\n constructor(\n private readonly engine: WalletEngine,\n private readonly ensureReady: () => Promise<void>,\n ) {}\n\n // ── Gated async operations ──────────────────────────────────────────────────\n\n async create(): Promise<CreatedWallet> {\n await this.ensureReady();\n return this.engine.create();\n }\n\n async importMnemonic(\n mnemonic: string,\n addressIndex?: number,\n ): Promise<ImportedWalletFromMnemonic> {\n await this.ensureReady();\n return this.engine.importMnemonic(mnemonic, addressIndex);\n }\n\n async importPrivateKey(\n privateKey: Hex,\n ): Promise<ImportedWalletFromPrivateKey> {\n await this.ensureReady();\n return this.engine.importPrivateKey(privateKey);\n }\n\n // ── Pass-throughs (sync, no network) ───────────────────────────────────────\n\n address(): Address { return this.engine.address(); }\n getSigner(): WalletClient { return this.engine.getWalletClient(); }\n getWalletClient(): WalletClient { return this.engine.getWalletClient(); }\n isConnected(): boolean { return this.engine.isConnected(); }\n hasExternalWallet(): boolean { return this.engine.hasExternalWallet(); }\n hasInternalWallet(): boolean { return this.engine.hasInternalWallet(); }\n getConnectorInfo(): ConnectorInfo { return this.engine.getConnectorInfo(); }\n\n connectExternal(\n c: ExternalWalletClient,\n info?: { name?: string; icon?: string },\n ): void { this.engine.connectExternal(c, info); }\n\n disconnectExternal(): void { this.engine.disconnectExternal(); }\n disconnect(): void { this.engine.disconnect(); }\n\n async switchChain(chain: Chain): Promise<void> {\n return this.engine.switchChain(chain);\n }\n\n // ── Gated async — EIP-1193, signing, chain awareness ───────────────────────\n\n async connectEIP1193(\n provider: EIP1193Provider,\n info?: { name?: string; icon?: string },\n ): Promise<void> {\n await this.ensureReady();\n return this.engine.connectEIP1193(provider, info);\n }\n\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signMessage(message);\n }\n\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signTypedData(params);\n }\n\n async getChainId(): Promise<number> { return this.engine.getChainId(); }\n async isChainMismatch(): Promise<boolean> { return this.engine.isChainMismatch(); }\n\n // ── Event subscriptions ────────────────────────────────────────────────────\n\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this.engine.onWalletChange(cb);\n }\n\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this.engine.onChainChange(cb);\n }\n}\n\n// ─── AwarizonWeb3 ─────────────────────────────────────────────────────────────\n\n/**\n * Primary entry point for the Awarizon Web3 SDK.\n *\n * An API key is required — get yours at https://awarizon.com/dashboard/api-keys\n *\n * ```ts\n * const awarizon = new AwarizonWeb3({ chain: \"base\", apiKey: \"awz_live_...\" })\n *\n * // Internal wallet\n * const wallet = await awarizon.wallet.create()\n *\n * // Load a contract\n * const staking = await awarizon.contract({ address: \"0x...\", abi })\n * await staking.stake(100n)\n * staking.on(\"Staked\", (log) => console.log(log))\n * ```\n */\nexport class AwarizonWeb3 {\n readonly chain: Chain;\n readonly publicClient: PublicClient;\n\n /** Wallet management — create, import, or connect external wallets */\n readonly wallet: WalletProxy;\n\n /**\n * Token price engine — Chainlink on-chain feeds with CoinGecko fallback.\n *\n * @example\n * const { price } = await awarizon.price.get('ETH')\n * const prices = await awarizon.price.getMany(['ETH', 'BTC', 'USDC'])\n */\n readonly price: PriceEngine;\n\n private readonly _engine: WalletEngine;\n private readonly _txEngine: TransactionEngine;\n private readonly _telemetry: TelemetryClient;\n private readonly _walletConnectProjectId: string | undefined;\n\n // Contract instances are cached by address — same address returns same instance.\n // Cache is cleared on switchChain() since contracts are chain-specific.\n private _contractCache = new Map<string, { abiRef: Abi; instance: ContractInstance }>();\n\n // Named contract registry — register once, reference by name anywhere.\n private _registry = new Map<string, ContractRegistryEntry>();\n\n constructor(config: AwarizonConfig) {\n if (!config.apiKey) throw new ApiKeyRequiredError();\n\n this.chain = resolveChain(config.chain);\n\n this.publicClient = createPublicClient({\n chain: this.chain,\n transport: getChainTransport(this.chain, config.rpcUrl),\n });\n\n this._engine = new WalletEngine({\n chain: this.chain,\n publicClient: this.publicClient,\n rpcUrl: config.rpcUrl,\n getTransport: (chain) => getChainTransport(chain, config.rpcUrl),\n });\n\n // Single TransactionEngine shared across all contracts loaded from this SDK instance\n this._txEngine = new TransactionEngine(\n this.publicClient,\n () => this._engine.getWalletClient(),\n );\n\n this._telemetry = new TelemetryClient(config.apiKey, config.baseUrl);\n this._walletConnectProjectId = config.walletConnectProjectId;\n\n this.wallet = new WalletProxy(\n this._engine,\n () => this._telemetry.ensureValidated(),\n );\n\n this.price = new PriceEngine(this.publicClient, this.chain.id);\n\n if (config.signer) {\n this._engine.connectExternal(config.signer);\n }\n }\n\n // ─── Wallet API surface ─────────────────────────────────────────────────────\n\n /**\n * Connect any viem WalletClient (wagmi, RainbowKit, custom).\n * Optionally pass connector metadata to display in the UI.\n *\n * @example\n * awarizon.connectWallet(walletClient, { name: \"MetaMask\" })\n */\n connectWallet(\n walletClient: WalletClient,\n connectorInfo?: { name?: string; icon?: string },\n ): this {\n this._engine.connectExternal(walletClient, connectorInfo);\n return this;\n }\n\n /**\n * Connect directly from a raw EIP-1193 provider without needing wagmi.\n * Works with window.ethereum, WalletConnect v2, and any EIP-1193 object.\n *\n * @example\n * await awarizon.connectEIP1193Provider(window.ethereum, { name: \"MetaMask\" })\n */\n async connectEIP1193Provider(\n provider: EIP1193Provider,\n connectorInfo?: { name?: string; icon?: string },\n ): Promise<this> {\n await this._telemetry.ensureValidated();\n await this._engine.connectEIP1193(provider, connectorInfo);\n return this;\n }\n\n /**\n * Connect a mobile or desktop wallet using the WalletConnect v2 protocol.\n * Opens a QR-code modal (or deeplink on mobile) so the user can scan with\n * MetaMask, Rainbow, Trust Wallet, or any WalletConnect-compatible wallet.\n *\n * Requires `walletConnectProjectId` in the SDK config and the peer package:\n * `npm install @walletconnect/ethereum-provider`\n *\n * @example\n * ```ts\n * const awarizon = new AwarizonWeb3({ chain: \"base\", apiKey: \"...\", walletConnectProjectId: \"abc\" })\n * await awarizon.connectWalletConnect()\n * ```\n */\n /**\n * Connect a wallet using the WalletConnect v2 protocol.\n *\n * When called from `<ConnectButton />`, the SDK handles QR display internally.\n * When called manually, pass `onDisplayUri` to receive the WC URI and render\n * your own QR code.\n *\n * Requires `walletConnectProjectId` in the SDK config.\n *\n * @example\n * await awarizon.connectWalletConnect({\n * onDisplayUri: (uri) => console.log(\"Show QR:\", uri)\n * })\n */\n async connectWalletConnect(options?: {\n /** Called with the WalletConnect URI as soon as it's ready — render it as a QR code. */\n onDisplayUri?: (uri: string) => void;\n }): Promise<this> {\n if (!this._walletConnectProjectId) {\n throw new Error(\n '[awarizon/web3] walletConnectProjectId is not configured. ' +\n 'Pass it when creating the SDK: new AwarizonWeb3({ ..., walletConnectProjectId: \"your_id\" }).\\n' +\n 'Get a free project ID at https://cloud.walletconnect.com',\n );\n }\n\n // Minimal interface — matches the actual WalletConnect EthereumProvider shape\n type WCProvider = EIP1193Provider & { connect(): Promise<void> };\n interface WCProviderClass {\n init(opts: {\n projectId: string;\n chains: number[];\n showQrModal: boolean;\n optionalChains?: number[];\n methods?: string[];\n events?: string[];\n }): Promise<WCProvider>;\n }\n\n let EthereumProvider: WCProviderClass;\n try {\n // Function constructor keeps the import string opaque to TypeScript's DTS pass\n // so the optional peer dep doesn't cause \"module not found\" errors at build time.\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<{ default: WCProviderClass }>;\n EthereumProvider = (await load('@walletconnect/ethereum-provider')).default;\n } catch {\n throw new Error(\n '[awarizon/web3] @walletconnect/ethereum-provider is not installed.\\n' +\n 'Run: npm install @walletconnect/ethereum-provider',\n );\n }\n\n const provider = await EthereumProvider.init({\n projectId: this._walletConnectProjectId,\n chains: [this.chain.id],\n showQrModal: false, // We render our own modal — set up onDisplayUri instead\n optionalChains: [],\n methods: ['eth_sendTransaction', 'personal_sign', 'eth_signTypedData_v4'],\n events: ['chainChanged', 'accountsChanged'],\n });\n\n // Register display_uri BEFORE connect() so we catch the event synchronously\n if (options?.onDisplayUri) {\n provider.on?.('display_uri', (...args: unknown[]) => {\n options.onDisplayUri!(args[0] as string);\n });\n }\n\n // Waits until the user scans the QR and approves in their wallet\n await provider.connect();\n\n await this.connectEIP1193Provider(provider, {\n name: 'WalletConnect',\n icon: 'https://avatars.githubusercontent.com/u/37784886',\n });\n\n return this;\n }\n\n /** The WalletConnect project ID passed at construction, if any */\n get walletConnectProjectId(): string | undefined {\n return this._walletConnectProjectId;\n }\n\n disconnectWallet(): this {\n this._engine.disconnectExternal();\n return this;\n }\n\n async switchChain(chain: Chain | string): Promise<this> {\n await this._telemetry.ensureValidated();\n const resolved = resolveChain(chain);\n await this._engine.switchChain(resolved);\n this._contractCache.clear(); // contracts are chain-specific\n return this;\n }\n\n getWalletInfo(): SDKWalletInfo {\n const info = this._engine.getConnectorInfo();\n return {\n address: this._engine.address(),\n chain: this.chain,\n isExternal: this._engine.hasExternalWallet(),\n connectorName: info.name,\n };\n }\n\n /**\n * Sign a plain text or raw-bytes message.\n * Use for Sign-In with Ethereum (SIWE) and off-chain authorization.\n *\n * @example\n * const sig = await awarizon.signMessage(\"Hello, Awarizon!\")\n */\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signMessage(message);\n }\n\n /**\n * Sign EIP-712 typed structured data (permit2, SIWE, Seaport orders, etc.).\n *\n * @example\n * const sig = await awarizon.signTypedData({\n * domain: { name: \"MyApp\", version: \"1\", chainId: 8453 },\n * types: { Transfer: [{ name: \"to\", type: \"address\" }, { name: \"amount\", type: \"uint256\" }] },\n * primaryType: \"Transfer\",\n * message: { to: \"0x...\", amount: \"1000000\" },\n * })\n */\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signTypedData(params);\n }\n\n /**\n * Returns the chain ID the active wallet is currently on.\n * For external wallets this may differ from the SDK's configured chain.\n */\n async getChainId(): Promise<number> {\n return this._engine.getChainId();\n }\n\n /**\n * Returns true when the external wallet is on a different chain than the SDK.\n * Use this to show a \"wrong network\" banner in your UI.\n *\n * @example\n * if (await awarizon.isChainMismatch()) {\n * alert(\"Please switch to Base in your wallet\")\n * }\n */\n async isChainMismatch(): Promise<boolean> {\n return this._engine.isChainMismatch();\n }\n\n /**\n * Returns metadata about the currently active connector.\n * Useful for displaying \"Connected via MetaMask\" in the UI.\n */\n getConnectorInfo(): ConnectorInfo {\n return this._engine.getConnectorInfo();\n }\n\n /**\n * Subscribe to wallet changes (connect, disconnect, account switch).\n * Returns an unsubscribe function — call it on cleanup.\n *\n * @example\n * const unsub = awarizon.onWalletChange(({ address, type, name }) => {\n * console.log(\"Wallet changed:\", address, type, name)\n * })\n * unsub() // stop listening\n */\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this._engine.onWalletChange(cb);\n }\n\n /**\n * Subscribe to chain changes (switchChain calls).\n * Returns an unsubscribe function.\n */\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this._engine.onChainChange(cb);\n }\n\n // ─── Contract API ───────────────────────────────────────────────────────────\n\n /**\n * Load a deployed contract and return a fully typed, ABI-powered instance.\n * Validates the API key on the first call — subsequent calls are instant.\n *\n * Results are cached by address — calling contract() twice with the same\n * address and ABI object returns the same instance without rebuilding.\n */\n async contract<TAbi extends Abi>(config: ContractConfig<TAbi>): Promise<ContractInstance> {\n await this._telemetry.ensureValidated();\n\n if (!config.address || !config.abi) {\n throw new Error('[awarizon/web3] awarizon.contract() requires both address and abi');\n }\n\n const key = config.address.toLowerCase();\n const cached = this._contractCache.get(key);\n if (cached && cached.abiRef === (config.abi as Abi)) return cached.instance;\n\n const instance = buildContractInstance(\n config.address,\n config.abi as Abi,\n this.publicClient,\n this._txEngine,\n this._telemetry,\n this.chain,\n );\n this._contractCache.set(key, { abiRef: config.abi as Abi, instance });\n return instance;\n }\n\n /**\n * Load multiple contracts in parallel. Validates the API key once, then\n * instantiates all contracts concurrently.\n *\n * @example\n * ```ts\n * const [token, staking, nft] = await awarizon.contracts([\n * { address: tokenAddr, abi: ERC20_ABI },\n * { address: stakingAddr, abi: STAKING_ABI },\n * { address: nftAddr, abi: ERC721_ABI },\n * ])\n * ```\n */\n async contracts(configs: Array<{ address: Address; abi: Abi }>): Promise<ContractInstance[]> {\n return Promise.all(configs.map(c => this.contract(c)));\n }\n\n /**\n * Call a read-only (view/pure) contract function directly without loading\n * a full contract instance. Best for one-off reads.\n *\n * @example\n * ```ts\n * const balance = await awarizon.read<bigint>({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"balanceOf\",\n * args: [userAddress],\n * })\n * ```\n */\n async read<T = unknown>(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n }): Promise<T> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.read({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n });\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result as T;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Execute a state-mutating contract function directly without loading a full\n * contract instance. Best for one-off writes.\n *\n * @example\n * ```ts\n * const { hash, receipt } = await awarizon.write({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"transfer\",\n * args: [recipient, 100n],\n * })\n * ```\n */\n async write(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n value?: bigint;\n gas?: bigint;\n }): Promise<TransactionResult> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.write({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n value: params.value,\n gas: params.gas,\n });\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Batch multiple read calls into a single RPC round-trip using multicall3.\n * Falls back to parallel individual reads on chains where multicall3 is\n * not deployed.\n *\n * @example\n * ```ts\n * const [balance, supply, allowance] = await awarizon.multicall([\n * { address: tokenAddr, abi: ERC20_ABI, method: \"balanceOf\", args: [userAddr] },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"totalSupply\" },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"allowance\", args: [userAddr, spenderAddr] },\n * ])\n * ```\n */\n async multicall(\n calls: Array<{ address: Address; abi: Abi; method: string; args?: unknown[] }>,\n ): Promise<unknown[]> {\n await this._telemetry.ensureValidated();\n\n const contracts = calls.map(c => ({\n address: c.address,\n abi: c.abi,\n functionName: c.method,\n args: (c.args ?? []) as readonly unknown[],\n }));\n\n try {\n // Single RPC round-trip via multicall3\n const results = await this.publicClient.multicall({\n contracts: contracts as any,\n allowFailure: false,\n });\n return results as unknown[];\n } catch {\n // Multicall3 not deployed on this chain — fall back to parallel reads\n return Promise.all(\n contracts.map(c =>\n this.publicClient.readContract(c as any),\n ),\n );\n }\n }\n\n // ─── ERC Standard Clients ───────────────────────────────────────────────────\n\n /**\n * Load an ERC-20 token with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const token = await awarizon.erc20(\"0x...\")\n * const balance = await token.balanceOf(userAddress)\n * const symbol = await token.symbol()\n * await token.transfer(recipient, 100n)\n * ```\n */\n async erc20(address: Address): Promise<Erc20Contract> {\n const instance = await this.contract({ address, abi: ERC20_ABI as unknown as Abi });\n return instance as unknown as Erc20Contract;\n }\n\n /**\n * Load an ERC-721 NFT contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const nft = await awarizon.erc721(\"0x...\")\n * const owner = await nft.ownerOf(1n)\n * const uri = await nft.tokenURI(1n)\n * await nft.transferFrom(from, to, 1n)\n * ```\n */\n async erc721(address: Address): Promise<Erc721Contract> {\n const instance = await this.contract({ address, abi: ERC721_ABI as unknown as Abi });\n return instance as unknown as Erc721Contract;\n }\n\n /**\n * Load an ERC-1155 multi-token contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const items = await awarizon.erc1155(\"0x...\")\n * const balance = await items.balanceOf(userAddress, 42n)\n * const uri = await items.uri(42n)\n * await items.safeTransferFrom(from, to, 42n, 1n, \"0x\")\n * ```\n */\n async erc1155(address: Address): Promise<Erc1155Contract> {\n const instance = await this.contract({ address, abi: ERC1155_ABI as unknown as Abi });\n return instance as unknown as Erc1155Contract;\n }\n\n // ─── Named Contract Registry ────────────────────────────────────────────────\n\n /**\n * Register a contract under a human-readable name.\n * After registering, use `awarizon.use(name)` anywhere instead of repeating\n * address + ABI every time.\n *\n * ```ts\n * awarizon.register(\"USDC\", { address: \"0x...\", abi: erc20Abi })\n * awarizon.register(\"Vault\", { address: \"0x...\", abi: vaultAbi })\n *\n * const usdc = await awarizon.use(\"USDC\")\n * const vault = await awarizon.use(\"Vault\")\n * ```\n */\n register(name: string, config: ContractRegistryEntry): this {\n this._registry.set(name, config);\n return this;\n }\n\n /**\n * Retrieve a previously registered contract by name.\n * Throws a descriptive error if the name was never registered.\n *\n * ```ts\n * const usdc = await awarizon.use(\"USDC\")\n * await usdc.transfer(recipient, 100n)\n * ```\n */\n async use(name: string): Promise<ContractInstance> {\n const config = this._registry.get(name);\n if (!config) {\n const registered = [...this._registry.keys()].join(', ') || 'none';\n throw new Error(\n `[awarizon/web3] Contract \"${name}\" is not registered.\\n` +\n `Call awarizon.register(\"${name}\", { address, abi }) first.\\n` +\n `Currently registered: ${registered}`,\n );\n }\n return this.contract(config);\n }\n\n /**\n * Remove a registered contract from the registry.\n *\n * ```ts\n * awarizon.unregister(\"USDC\")\n * ```\n */\n unregister(name: string): this {\n this._registry.delete(name);\n return this;\n }\n\n /**\n * Return all registered contract names.\n */\n registeredContracts(): string[] {\n return [...this._registry.keys()];\n }\n\n // ─── Accessors ──────────────────────────────────────────────────────────────\n\n get chainId(): number {\n return this.chain.id;\n }\n\n get isConnected(): boolean {\n return this._engine.isConnected();\n }\n\n /**\n * Flush pending telemetry and stop background timers.\n * Call when tearing down a long-lived SDK instance (e.g. on server shutdown).\n */\n async destroy(): Promise<void> {\n await this._telemetry.destroy();\n }\n}\n"]}
|