@awarizon/web3 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +201 -47
- package/dist/index.d.ts +201 -47
- package/dist/index.js +457 -95
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +436 -77
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chains.ts","../src/contract.ts","../src/errors.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 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// ─── Helper ───────────────────────────────────────────────────────────────────\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 const available = Object.keys(CHAINS)\n .filter((k, i, arr) => arr.indexOf(k) === i) // deduplicate aliases\n .sort()\n .join(', ');\n throw new Error(\n `[awarizon/web3] Unsupported chain: \"${chain}\".\\n` +\n `Available chains: ${available}`,\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","import type { Abi, AbiFunction, AbiEvent, Address, PublicClient, WalletClient } from 'viem';\nimport { parseABI, isWriteFunction } from '@awarizon/abi-engine';\nimport { TransactionEngine } from '@awarizon/tx-engine';\nimport type { ContractInstance, EventUnsubscribe } from './types';\n\n// ─── ContractFactory ──────────────────────────────────────────────────────────\n\n/**\n * Builds a fully dynamic ContractInstance from an address + ABI.\n *\n * For every function in the ABI it attaches a method to the returned\n * object that automatically routes to read or write depending on the\n * function's stateMutability.\n *\n * Additionally exposes:\n * .on(event, callback) – event subscription\n * .estimateGas(method, ...args) – gas estimation\n * ._address / ._abi – metadata accessors\n */\nexport function buildContractInstance(\n address: Address,\n abi: Abi,\n publicClient: PublicClient,\n getWalletClient: () => WalletClient,\n): ContractInstance {\n const parsed = parseABI(abi);\n const txEngine = new TransactionEngine(publicClient, getWalletClient);\n\n // ── Base object ─────────────────────────────────────────────────────────────\n const instance: Record<string, unknown> = {\n _address: address,\n _abi: abi,\n };\n\n // ── Generate read methods ───────────────────────────────────────────────────\n for (const fn of parsed.readFunctions) {\n instance[fn.name] = buildReadMethod(fn, address, abi, txEngine);\n }\n\n // ── Generate write methods ──────────────────────────────────────────────────\n for (const fn of parsed.writeFunctions) {\n instance[fn.name] = buildWriteMethod(fn, address, abi, txEngine);\n }\n\n // ── Event subscription ──────────────────────────────────────────────────────\n instance['on'] = buildEventSubscription(address, abi, parsed.events, publicClient);\n\n // ── Gas estimation ──────────────────────────────────────────────────────────\n instance['estimateGas'] = async (method: string, ...args: unknown[]): Promise<bigint> => {\n const estimate = await txEngine.estimateGas({\n address,\n abi,\n functionName: method,\n args,\n });\n return estimate.gas;\n };\n\n return instance as ContractInstance;\n}\n\n// ─── Read method builder ──────────────────────────────────────────────────────\n\nfunction buildReadMethod(\n fn: AbiFunction,\n address: Address,\n abi: Abi,\n txEngine: TransactionEngine,\n): (...args: unknown[]) => Promise<unknown> {\n return async (...args: unknown[]) => {\n return txEngine.read({ address, abi, functionName: fn.name, args });\n };\n}\n\n// ─── Write method builder ─────────────────────────────────────────────────────\n\nfunction buildWriteMethod(\n fn: AbiFunction,\n address: Address,\n abi: Abi,\n txEngine: TransactionEngine,\n): (...args: unknown[]) => Promise<unknown> {\n const isPayable = fn.stateMutability === 'payable';\n\n return async (...args: unknown[]) => {\n // Payable functions accept an optional trailing options object\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 return txEngine.write({\n address,\n abi,\n functionName: fn.name,\n args: callArgs,\n value,\n gas,\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 builder ───────────────────────────────────────────────\n\nfunction buildEventSubscription(\n address: Address,\n abi: Abi,\n events: AbiEvent[],\n publicClient: PublicClient,\n): (event: string, callback: (log: unknown) => void) => EventUnsubscribe {\n return (eventName: string, callback: (log: unknown) => void): EventUnsubscribe => {\n const abiEvent = events.find(e => e.name === eventName);\n\n if (!abiEvent) {\n const available = events.map(e => e.name).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 sdk.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","import {\n createPublicClient,\n http,\n type Chain,\n type WalletClient,\n type PublicClient,\n type Address,\n type Abi,\n} from 'viem';\nimport { WalletEngine } from '@awarizon/wallet-engine';\nimport { resolveChain } from './chains';\nimport { buildContractInstance } from './contract';\nimport type {\n AwarizonConfig,\n ContractConfig,\n ContractInstance,\n SDKWalletInfo,\n} from './types';\n\n// Re-export errors for convenience so consumers don't need extra imports\nexport {\n WalletNotConnectedError,\n InvalidMnemonicError,\n InvalidPrivateKeyError,\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} from './errors';\n\n// ─── AwarizonWeb3 ─────────────────────────────────────────────────────────────\n\n/**\n * The primary entry point for the Awarizon Web3 SDK.\n *\n * ```ts\n * const sdk = new AwarizonWeb3({ chain: \"base\" })\n *\n * // Internal wallet\n * const wallet = await sdk.wallet.create()\n *\n * // Load a contract and call it\n * const staking = await sdk.contract({ address: \"0x...\", abi })\n * await staking.stake(100n)\n * const balance = await staking.getBalance(wallet.address)\n *\n * // Listen for events\n * staking.on(\"Staked\", (log) => console.log(log))\n * ```\n */\nexport class AwarizonWeb3 {\n /** The resolved viem Chain */\n readonly chain: Chain;\n\n /** Internal wallet + signer management */\n readonly wallet: WalletEngine;\n\n /** The underlying viem PublicClient used for reads */\n readonly publicClient: PublicClient;\n\n constructor(config: AwarizonConfig) {\n this.chain = resolveChain(config.chain);\n\n this.publicClient = createPublicClient({\n chain: this.chain,\n transport: http(config.rpcUrl),\n });\n\n this.wallet = new WalletEngine({\n chain: this.chain,\n publicClient: this.publicClient,\n rpcUrl: config.rpcUrl,\n });\n\n // Pre-connect external signer if provided at construction time\n if (config.signer) {\n this.wallet.connectExternal(config.signer);\n }\n }\n\n // ─── Wallet API surface ─────────────────────────────────────────────────────\n\n /**\n * Connect an external wallet client (wagmi, WalletConnect, viem, EIP-1193).\n * The connected signer takes priority over any internal wallet.\n *\n * @example\n * sdk.connectWallet(walletClient)\n */\n connectWallet(walletClient: WalletClient): this {\n this.wallet.connectExternal(walletClient);\n return this;\n }\n\n /**\n * Disconnect the externally-connected wallet.\n * Falls back to the internal wallet if one is loaded.\n */\n disconnectWallet(): this {\n this.wallet.disconnectExternal();\n return this;\n }\n\n /**\n * Switch the active chain.\n * Rebuilds the PublicClient and internal WalletClient for the new chain.\n */\n async switchChain(chain: Chain | string): Promise<this> {\n const resolved = resolveChain(chain);\n await this.wallet.switchChain(resolved);\n return this;\n }\n\n /**\n * Returns a summary of the currently active wallet.\n * @throws {WalletNotConnectedError} if no wallet is connected\n */\n getWalletInfo(): SDKWalletInfo {\n return {\n address: this.wallet.address(),\n chain: this.chain,\n isExternal: this.wallet.hasExternalWallet(),\n };\n }\n\n // ─── Contract API ───────────────────────────────────────────────────────────\n\n /**\n * Load a deployed smart contract and return a fully typed, ABI-powered\n * instance. Every function in the ABI is exposed as a direct method.\n *\n * **Read functions** (view / pure) use the PublicClient — no signer needed.\n * **Write functions** (nonpayable / payable) use the active WalletClient.\n *\n * @example\n * const token = await sdk.contract({ address: \"0x...\", abi: ERC20_ABI })\n * const balance = await token.balanceOf(address) // read\n * await token.transfer(to, 100n) // write\n * token.on(\"Transfer\", handler) // events\n */\n async contract<TAbi extends Abi>(config: ContractConfig<TAbi>): Promise<ContractInstance> {\n if (!config.address || !config.abi) {\n throw new Error('[awarizon/web3] sdk.contract() requires both address and abi');\n }\n\n return buildContractInstance(\n config.address,\n config.abi as Abi,\n this.publicClient,\n () => this.wallet.getWalletClient(),\n );\n }\n\n /**\n * Returns the chain ID of the current chain.\n * Useful for runtime network validation.\n */\n get chainId(): number {\n return this.chain.id;\n }\n\n /**\n * Check whether any wallet (internal or external) is connected.\n */\n get isConnected(): boolean {\n return this.wallet.isConnected();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/chains.ts","../src/contract.ts","../src/errors.ts","../src/telemetry.ts","../src/sdk.ts"],"names":[],"mappings":";;;;;;;;;;AA0BO,IAAM,MAAA,GAAgC;AAAA;AAAA,EAE3C,OAAA;AAAA,EACA,QAAA,EAAU,OAAA;AAAA,EACV,GAAA,EAAK,OAAA;AAAA;AAAA,EAGL,IAAA;AAAA,EACA,cAAA,EAAgB,IAAA;AAAA;AAAA,EAGhB,cAAA,EAAgB,WAAA;AAAA,EAChB,WAAA;AAAA;AAAA,EAGA,OAAA;AAAA,EACA,KAAA,EAAO,OAAA;AAAA;AAAA,EAGP,IAAA,EAAM,WAAA;AAAA,EACN,cAAA,EAAgB,WAAA;AAAA;AAAA,EAGhB,QAAA;AAAA,EACA,cAAA,EAAgB,QAAA;AAAA;AAAA,EAGhB,kBAAA,EAAoB,eAAA;AAAA,EACpB,eAAA;AAAA;AAAA,EAGA,QAAA;AAAA,EACA,EAAA,EAAI,QAAA;AAAA;AAAA,EAGJ,kBAAA,EAAoB,eAAA;AAAA,EACpB,eAAA;AAAA;AAAA,EAGA,GAAA;AAAA,EACA,GAAA,EAAK,GAAA;AAAA,EACL,qBAAA,EAAuB,GAAA;AAAA;AAAA,EAGvB,SAAA;AAAA,EACA,IAAA,EAAM,SAAA;AAAA;AAAA,EAGN,OAAA;AAAA,EACA,aAAA,EAAe,OAAA;AAAA;AAAA,EAGf,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,EAAM,MAAA;AAAA,EACN,MAAA;AAAA,EACA;AACF;AAKA,IAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,MAAM,EAAE,IAAA,EAAK,CAAE,KAAK,IAAI,CAAA;AAUnD,SAAS,aAAa,KAAA,EAA8B;AACzD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,IAAA,IAAQ,KAAA,EAAO;AAC9C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,WAAW,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA,IAAK,OAAO,KAAK,CAAA;AAC5D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,uCAAuC,KAAK,CAAA;AAAA,kBAAA,EACvB,aAAa,CAAA;AAAA,OACpC;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAI,SAAA,CAAU,CAAA,6DAAA,EAAgE,OAAO,KAAK,CAAA,CAAE,CAAA;AACpG;AAGO,SAAS,oBAAA,GAAiC;AAC/C,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CACxB,OAAO,CAAA,CAAA,KAAK;AAAE,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,GAAG,OAAO,KAAA;AAAO,IAAA,IAAA,CAAK,GAAA,CAAI,EAAE,EAAE,CAAA;AAAG,IAAA,OAAO,IAAA;AAAA,EAAM,CAAC,CAAA,CAC9E,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE,CAAA;AAClB;ACvHA,SAAS,WACP,SAAA,EACA,IAAA,EACA,KAAA,EACA,YAAA,EACA,SACA,KAAA,EACM;AACN,EAAA,SAAA,EAAW,KAAA,CAAM;AAAA,IACf,IAAA;AAAA,IACA,KAAA,EAAO,OAAO,IAAA,IAAQ,SAAA;AAAA,IACtB,OAAA,EAAS,OAAO,EAAA,IAAM,CAAA;AAAA,IACtB,YAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,IACzB,EAAA,EAAI,KAAK,GAAA;AAAI,GACd,CAAA;AACH;AAaO,SAAS,sBACd,OAAA,EACA,GAAA,EACA,YAAA,EACA,QAAA,EACA,WACA,KAAA,EACkB;AAElB,EAAA,MAAM,MAAA,GAAS,SAAS,GAAG,CAAA;AAG3B,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAsB,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AAE/E,EAAA,MAAM,QAAA,GAAoC;AAAA,IACxC,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,aAAA,EAAe;AACrC,IAAA,QAAA,CAAS,EAAA,CAAG,IAAI,CAAA,GAAI,eAAA,CAAgB,IAAI,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,SAAA,EAAW,KAAK,CAAA;AAAA,EAClF;AAEA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,cAAA,EAAgB;AACtC,IAAA,QAAA,CAAS,EAAA,CAAG,IAAI,CAAA,GAAI,gBAAA,CAAiB,IAAI,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,SAAA,EAAW,KAAK,CAAA;AAAA,EACnF;AAEA,EAAA,QAAA,CAAS,IAAI,CAAA,GAAI,sBAAA,CAAuB,OAAA,EAAS,GAAA,EAAK,WAAW,YAAY,CAAA;AAE7E,EAAA,QAAA,CAAS,aAAa,CAAA,GAAI,OAAO,MAAA,EAAA,GAAmB,IAAA,KAAqC;AACvF,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,WAAA,CAAY,EAAE,SAAS,GAAA,EAAK,YAAA,EAAc,MAAA,EAAQ,IAAA,EAAM,CAAA;AACxF,MAAA,UAAA,CAAW,SAAA,EAAW,uBAAA,EAAyB,KAAA,EAAO,MAAA,EAAQ,MAAM,KAAK,CAAA;AACzE,MAAA,OAAO,QAAA,CAAS,GAAA;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,UAAA,CAAW,SAAA,EAAW,uBAAA,EAAyB,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAK,CAAA;AAC1E,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,QAAA;AACT;AAIA,SAAS,gBACP,EAAA,EACA,OAAA,EACA,GAAA,EACA,QAAA,EACA,WACA,KAAA,EAC0C;AAC1C,EAAA,OAAO,UAAU,IAAA,KAAoB;AACnC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,GAAA,EAAK,YAAA,EAAc,EAAA,CAAG,IAAA,EAAM,IAAA,EAAM,CAAA;AAChF,MAAA,UAAA,CAAW,WAAW,eAAA,EAAiB,KAAA,EAAO,EAAA,CAAG,IAAA,EAAM,MAAM,KAAK,CAAA;AAClE,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,UAAA,CAAW,WAAW,eAAA,EAAiB,KAAA,EAAO,EAAA,CAAG,IAAA,EAAM,OAAO,KAAK,CAAA;AACnE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AACF;AAIA,SAAS,iBACP,EAAA,EACA,OAAA,EACA,GAAA,EACA,QAAA,EACA,WACA,KAAA,EAC0C;AAC1C,EAAA,MAAM,SAAA,GAAY,GAAG,eAAA,KAAoB,SAAA;AAEzC,EAAA,OAAO,UAAU,IAAA,KAAoB;AACnC,IAAA,IAAI,QAAA,GAAW,IAAA;AACf,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,GAAA;AAEJ,IAAA,IAAI,SAAA,IAAa,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACjC,MAAA,IAAI,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAC1B,QAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC3B,QAAA,KAAA,GAAQ,IAAA,CAAK,KAAA;AACb,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,KAAA,CAAM;AAAA,QAClC,OAAA;AAAA,QAAS,GAAA;AAAA,QAAK,cAAc,EAAA,CAAG,IAAA;AAAA,QAAM,IAAA,EAAM,QAAA;AAAA,QAAU,KAAA;AAAA,QAAO;AAAA,OAC7D,CAAA;AACD,MAAA,UAAA,CAAW,WAAW,gBAAA,EAAkB,KAAA,EAAO,EAAA,CAAG,IAAA,EAAM,MAAM,KAAK,CAAA;AACnE,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,UAAA,CAAW,WAAW,gBAAA,EAAkB,KAAA,EAAO,EAAA,CAAG,IAAA,EAAM,OAAO,KAAK,CAAA;AACpE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AACF;AAEA,SAAS,iBAAiB,GAAA,EAAuD;AAC/E,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,MAAM,QAAA,GAAW,WAAW,GAAA,KAAQ,GAAA,CAAI,UAAU,MAAA,IAAa,OAAO,IAAI,KAAA,KAAU,QAAA,CAAA;AACpF,EAAA,MAAM,MAAA,GAAW,SAAW,GAAA,KAAQ,GAAA,CAAI,QAAU,MAAA,IAAa,OAAO,IAAI,GAAA,KAAU,QAAA,CAAA;AACpF,EAAA,OAAO,QAAA,IAAY,MAAA;AACrB;AAIA,SAAS,sBAAA,CACP,OAAA,EACA,GAAA,EACA,SAAA,EACA,YAAA,EACuE;AACvE,EAAA,OAAO,CAAC,WAAmB,QAAA,KAAuD;AAChF,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AAExC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,SAAA,GAAY,CAAC,GAAG,SAAA,CAAU,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,MAAA;AACtD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,uBAAA,EAA0B,SAAS,CAAA,wBAAA,EAA2B,OAAO,CAAA;AAAA,kBAAA,EAChD,SAAS,CAAA;AAAA,OAChC;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,aAAa,kBAAA,CAAmB;AAAA,MAC9C,OAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,EAAQ,CAAC,IAAA,KAAS;AAChB,QAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,QAAA,CAAS,GAAG,CAAA;AAAA,MACtC;AAAA,KACD,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AACF;;;ACvLO,IAAM,oBAAA,GAAN,cAAmC,KAAA,CAAM;AAAA,EAK9C,WAAA,CAAY,UAA2B,GAAA,EAAsB;AAC3D,IAAA,KAAA,CAAM,CAAA,oDAAA,EAAuD,QAAQ,CAAA,4BAAA,EAA+B,GAAG,CAAA,CAAE,CAAA;AAL3G,IAAA,IAAA,CAAS,IAAA,GAAO,kBAAA;AAMd,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,OAAO,QAAQ,CAAA;AAC/B,IAAA,IAAA,CAAK,GAAA,GAAM,OAAO,GAAG,CAAA;AAAA,EACvB;AACF;AAEO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EAGvC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,CAAA,gCAAA,EAAmC,OAAO,CAAA,CAAE,CAAA;AAHpD,IAAA,IAAA,CAAS,IAAA,GAAO,gBAAA;AAId,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAEO,IAAM,sBAAA,GAAN,cAAqC,KAAA,CAAM;AAAA,EAGhD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,CAAA,4BAAA,EAA+B,OAAO,CAAA,+DAAA,CAAiE,CAAA;AAH/G,IAAA,IAAA,CAAS,IAAA,GAAO,qBAAA;AAId,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AAAA,EACd;AACF;AAEO,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EAI/C,YAAY,KAAA,EAAe;AACzB,IAAA,KAAA,CAAM,CAAA,oCAAA,EAAuC,KAAK,CAAA,gDAAA,CAAkD,CAAA;AAJtG,IAAA,IAAA,CAAS,IAAA,GAAO,mBAAA;AAKd,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EAG7C,WAAA,GAAc;AACZ,IAAA,KAAA;AAAA,MACE;AAAA,KAEF;AANF,IAAA,IAAA,CAAS,IAAA,GAAO,kBAAA;AAOd,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAG5C,WAAA,CAAY,UAAU,6BAAA,EAA+B;AACnD,IAAA,KAAA,CAAM,CAAA,gBAAA,EAAmB,OAAO,CAAA,CAAE,CAAA;AAHpC,IAAA,IAAA,CAAS,IAAA,GAAO,iBAAA;AAId,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;;;ACzCA,IAAM,gBAAA,GAAsB,sBAAA;AAC5B,IAAM,iBAAA,GAAsB,GAAA;AAC5B,IAAM,cAAA,GAAsB,EAAA;AAC5B,IAAM,kBAAA,GAAsB,GAAA;AAarB,IAAM,kBAAN,MAAsB;AAAA,EAU3B,WAAA,CAAY,MAAA,EAAgB,OAAA,GAAU,gBAAA,EAAkB;AANxD,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,iBAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,QAA0B,EAAC;AACnC,IAAA,IAAA,CAAQ,UAAA,GAAoD,IAAA;AAC5D,IAAA,IAAA,CAAQ,cAAA,GAAsC,IAAA;AAG5C,IAAA,IAAA,CAAK,MAAA,GAAW,MAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAA,GAAiC;AACrC,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAI,IAAA,CAAK,iBAAA,EAAmB,OAAO,IAAA,CAAK,iBAAA;AAExC,IAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK,SAAA,EAAU,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAEvD,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,MAAM,GAAA;AAAA,IACR,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,EAA6B;AACjC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AACrB,IAAA,IAAI,KAAK,KAAA,CAAM,MAAA,IAAU,cAAA,EAAgB,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA,EAIA,MAAc,SAAA,GAA2B;AACvC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,UAAa,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,kBAAkB,CAAA;AAE1E,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,YAAA,CAAA,EAAgB;AAAA,QAC/C,MAAA,EAAS,KAAA;AAAA,QACT,SAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA,EAAG;AAAA,QAClD,QAAS,UAAA,CAAW;AAAA,OACrB,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,MAAA,CAAO,OAAA,GAC1B,CAAA,oCAAA,EAAuC,qBAAqB,GAAI,CAAA,EAAA,CAAA,GAChE,CAAA,8BAAA,EAAkC,GAAA,CAAc,OAAO,CAAA,CAAA;AAC3D,MAAA,MAAM,IAAI,mBAAmB,GAAG,CAAA;AAAA,IAClC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACtB;AAEA,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC9C,MAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,KAAA,IAAS,6BAA6B,CAAA;AAAA,IAC1E;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAEQ,YAAA,GAAqB;AAE3B,IAAA,IAAA,CAAK,UAAA,GAAa,YAAY,MAAM;AAClC,MAAA,IAAI,KAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IAC9C,GAAG,iBAAiB,CAAA;AAGpB,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AACnB,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,UAAA,QAAkB,KAAA,EAAM;AAGnD,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,cAAc,WAAA,EAAa;AACrE,MAAA,IAAA,CAAK,cAAA,GAAiB,MAAM,IAAA,CAAK,YAAA,EAAa;AAC9C,MAAA,MAAA,CAAO,gBAAA,CAAiB,cAAA,EAAgB,IAAA,CAAK,cAAc,CAAA;AAAA,IAC7D;AAAA,EACF;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,IAAA,IAAQ,OAAO,WAAW,WAAA,EAAa;AACjE,MAAA,MAAA,CAAO,mBAAA,CAAoB,cAAA,EAAgB,IAAA,CAAK,cAAc,CAAA;AAC9D,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAAA,EACF;AAAA,EAQQ,OAAO,OAAA,EAAwC;AACrD,IAAA,IAAI,IAAA,CAAK,MAAM,MAAA,KAAW,CAAA,SAAU,OAAA,GAAU,OAAA,CAAQ,SAAQ,GAAI,MAAA;AAElE,IAAA,MAAM,KAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,cAAc,CAAA;AACnD,IAAA,MAAM,OAAA,GAAyB,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,aAAA,CAAA,EAAiB;AAAA,MACnE,MAAA,EAAS,MAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,aAAA,EAAgB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,QACrC,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,OAAO;AAAA,KACvC,CAAA,CAAE,IAAA,CAAK,MAAM;AAAA,IAAC,GAAG,MAAM;AAAA,IAAC,CAAC,CAAA;AAE1B,IAAA,OAAO,UAAU,OAAA,GAAU,MAAA;AAAA,EAC7B;AAAA;AAAA,EAGQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,KAAK,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,OAAO,cAAc,WAAA,EAAa;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AACjC,IAAA,SAAA,CAAU,UAAA;AAAA,MACR,CAAA,EAAG,KAAK,OAAO,CAAA,aAAA,CAAA;AAAA,MACf,IAAI,IAAA,CAAK,CAAC,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,oBAAoB;AAAA,KAC5E;AAAA,EACF;AACF;ACrHA,IAAM,cAAN,MAAkB;AAAA,EAChB,WAAA,CACmB,QACA,WAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAChB;AAAA;AAAA,EAIH,MAAM,MAAA,GAAiC;AACrC,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,EAAO;AAAA,EAC5B;AAAA,EAEA,MAAM,cAAA,CACJ,QAAA,EACA,YAAA,EACqC;AACrC,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,QAAA,EAAU,YAAY,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,iBACJ,UAAA,EACuC;AACvC,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,UAAU,CAAA;AAAA,EAChD;AAAA;AAAA,EAIA,OAAA,GAAwC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,EAAG;AAAA,EACxE,SAAA,GAAwC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,eAAA,EAAgB;AAAA,EAAG;AAAA,EAChF,eAAA,GAAwC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,eAAA,EAAgB;AAAA,EAAG;AAAA,EAChF,WAAA,GAAwC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,WAAA,EAAY;AAAA,EAAG;AAAA,EAC5E,iBAAA,GAAwC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,iBAAA,EAAkB;AAAA,EAAG;AAAA,EAClF,iBAAA,GAAwC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,iBAAA,EAAkB;AAAA,EAAG;AAAA,EAClF,gBAAgB,CAAA,EAAyB;AAAE,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAC,CAAA;AAAA,EAAG;AAAA,EAC3E,kBAAA,GAAwC;AAAE,IAAA,IAAA,CAAK,OAAO,kBAAA,EAAmB;AAAA,EAAG;AAAA,EAC5E,UAAA,GAAwC;AAAE,IAAA,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,EAAG;AAAA,EACpE,MAAM,YAAY,KAAA,EAA6B;AAC7C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,KAAK,CAAA;AAAA,EACtC;AACF,CAAA;AAqBO,IAAM,eAAN,MAAmB;AAAA,EAexB,YAAY,MAAA,EAAwB;AAFpC;AAAA;AAAA,IAAA,IAAA,CAAQ,cAAA,uBAAqB,GAAA,EAAyD;AAGpF,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,mBAAA,EAAoB;AAElD,IAAA,IAAA,CAAK,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA;AAEtC,IAAA,IAAA,CAAK,eAAe,kBAAA,CAAmB;AAAA,MACrC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,MAAM;AAAA,KAC9B,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,YAAA,CAAa;AAAA,MAC9B,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,QAAQ,MAAA,CAAO;AAAA,KAChB,CAAA;AAGD,IAAA,IAAA,CAAK,YAAY,IAAI,iBAAA;AAAA,MACnB,IAAA,CAAK,YAAA;AAAA,MACL,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA;AAAgB,KACrC;AAEA,IAAA,IAAA,CAAK,aAAa,IAAI,eAAA,CAAgB,MAAA,CAAO,MAAA,EAAQ,OAAO,OAAO,CAAA;AAEnE,IAAA,IAAA,CAAK,SAAS,IAAI,WAAA;AAAA,MAChB,IAAA,CAAK,OAAA;AAAA,MACL,MAAM,IAAA,CAAK,UAAA,CAAW,eAAA;AAAgB,KACxC;AAEA,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA,EAIA,cAAc,YAAA,EAAkC;AAC9C,IAAA,IAAA,CAAK,OAAA,CAAQ,gBAAgB,YAAY,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,gBAAA,GAAyB;AACvB,IAAA,IAAA,CAAK,QAAQ,kBAAA,EAAmB;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,KAAA,EAAsC;AACtD,IAAA,MAAM,IAAA,CAAK,WAAW,eAAA,EAAgB;AACtC,IAAA,MAAM,QAAA,GAAW,aAAa,KAAK,CAAA;AACnC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,QAAQ,CAAA;AACvC,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAA,GAA+B;AAC7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAQ;AAAA,MAC9B,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,iBAAA;AAAkB,KAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,SAA2B,MAAA,EAAyD;AACxF,IAAA,MAAM,IAAA,CAAK,WAAW,eAAA,EAAgB;AAEtC,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,GAAA,EAAK;AAClC,MAAA,MAAM,IAAI,MAAM,mEAAmE,CAAA;AAAA,IACrF;AAEA,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAY;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AAC1C,IAAA,IAAI,UAAU,MAAA,CAAO,MAAA,KAAY,MAAA,CAAO,GAAA,SAAoB,MAAA,CAAO,QAAA;AAEnE,IAAA,MAAM,QAAA,GAAW,qBAAA;AAAA,MACf,MAAA,CAAO,OAAA;AAAA,MACP,MAAA,CAAO,GAAA;AAAA,MACP,IAAA,CAAK,YAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,GAAA,EAAK,EAAE,QAAQ,MAAA,CAAO,GAAA,EAAY,UAAU,CAAA;AACpE,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,UAAU,OAAA,EAA6E;AAC3F,IAAA,OAAO,OAAA,CAAQ,IAAI,OAAA,CAAQ,GAAA,CAAI,OAAK,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,KAAkB,MAAA,EAKT;AACb,IAAA,MAAM,IAAA,CAAK,WAAW,eAAA,EAAgB;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK;AAAA,QACvC,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,cAAc,MAAA,CAAO,MAAA;AAAA,QACrB,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ;AAAC,OACvB,CAAA;AACD,MAAA,IAAA,CAAK,WAAW,KAAA,CAAM;AAAA,QACpB,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO,KAAK,KAAA,CAAM,IAAA;AAAA,QAClB,OAAA,EAAS,KAAK,KAAA,CAAM,EAAA;AAAA,QACpB,cAAc,MAAA,CAAO,MAAA;AAAA,QACrB,OAAA,EAAS,IAAA;AAAA,QACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,EAAA,EAAI,KAAK,GAAA;AAAI,OACd,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,WAAW,KAAA,CAAM;AAAA,QACpB,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO,KAAK,KAAA,CAAM,IAAA;AAAA,QAClB,OAAA,EAAS,KAAK,KAAA,CAAM,EAAA;AAAA,QACpB,cAAc,MAAA,CAAO,MAAA;AAAA,QACrB,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,EAAA,EAAI,KAAK,GAAA;AAAI,OACd,CAAA;AACD,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,MAAM,MAAA,EAOmB;AAC7B,IAAA,MAAM,IAAA,CAAK,WAAW,eAAA,EAAgB;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM;AAAA,QACxC,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,cAAc,MAAA,CAAO,MAAA;AAAA,QACrB,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,EAAC;AAAA,QACtB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,KAAK,MAAA,CAAO;AAAA,OACb,CAAA;AACD,MAAA,IAAA,CAAK,WAAW,KAAA,CAAM;AAAA,QACpB,IAAA,EAAM,gBAAA;AAAA,QACN,KAAA,EAAO,KAAK,KAAA,CAAM,IAAA;AAAA,QAClB,OAAA,EAAS,KAAK,KAAA,CAAM,EAAA;AAAA,QACpB,cAAc,MAAA,CAAO,MAAA;AAAA,QACrB,OAAA,EAAS,IAAA;AAAA,QACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,EAAA,EAAI,KAAK,GAAA;AAAI,OACd,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,WAAW,KAAA,CAAM;AAAA,QACpB,IAAA,EAAM,gBAAA;AAAA,QACN,KAAA,EAAO,KAAK,KAAA,CAAM,IAAA;AAAA,QAClB,OAAA,EAAS,KAAK,KAAA,CAAM,EAAA;AAAA,QACpB,cAAc,MAAA,CAAO,MAAA;AAAA,QACrB,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,EAAA,EAAI,KAAK,GAAA;AAAI,OACd,CAAA;AACD,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,UACJ,KAAA,EACoB;AACpB,IAAA,MAAM,IAAA,CAAK,WAAW,eAAA,EAAgB;AAEtC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MAChC,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,cAAc,CAAA,CAAE,MAAA;AAAA,MAChB,IAAA,EAAO,CAAA,CAAE,IAAA,IAAQ;AAAC,KACpB,CAAE,CAAA;AAEF,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU;AAAA,QAChD,SAAA;AAAA,QACA,YAAA,EAAc;AAAA,OACf,CAAA;AACD,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,QACb,SAAA,CAAU,GAAA;AAAA,UAAI,CAAA,CAAA,KACZ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,CAAQ;AAAA;AACzC,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,KAAA,CAAM,EAAA;AAAA,EACpB;AAAA,EAEA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,EAAY;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,IAAA,CAAK,WAAW,OAAA,EAAQ;AAAA,EAChC;AACF","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 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","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 {\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} from '@awarizon/wallet-engine';\nimport { TransactionEngine } from '@awarizon/tx-engine';\nimport type { TransactionResult } from '@awarizon/tx-engine';\nimport { resolveChain } from './chains';\nimport { buildContractInstance } from './contract';\nimport { TelemetryClient } from './telemetry';\nimport { ApiKeyRequiredError } from './errors';\nimport type {\n AwarizonConfig,\n ContractConfig,\n ContractInstance,\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} 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 accountIndex?: number,\n ): Promise<ImportedWalletFromMnemonic> {\n await this.ensureReady();\n return this.engine.importMnemonic(mnemonic, accountIndex);\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 connectExternal(c: ExternalWalletClient) { this.engine.connectExternal(c); }\n disconnectExternal(): void { this.engine.disconnectExternal(); }\n disconnect(): void { this.engine.disconnect(); }\n async switchChain(chain: Chain): Promise<void> {\n return this.engine.switchChain(chain);\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 private readonly _engine: WalletEngine;\n private readonly _txEngine: TransactionEngine;\n private readonly _telemetry: TelemetryClient;\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 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: http(config.rpcUrl),\n });\n\n this._engine = new WalletEngine({\n chain: this.chain,\n publicClient: this.publicClient,\n rpcUrl: 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\n this.wallet = new WalletProxy(\n this._engine,\n () => this._telemetry.ensureValidated(),\n );\n\n if (config.signer) {\n this._engine.connectExternal(config.signer);\n }\n }\n\n // ─── Wallet API surface ─────────────────────────────────────────────────────\n\n connectWallet(walletClient: WalletClient): this {\n this._engine.connectExternal(walletClient);\n return this;\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 return {\n address: this._engine.address(),\n chain: this.chain,\n isExternal: this._engine.hasExternalWallet(),\n };\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 // ─── 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awarizon/web3",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Core Awarizon Web3 SDK — production-grade EVM blockchain abstraction layer",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"web3",
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
],
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"viem": "^2.21.0",
|
|
30
|
-
"@awarizon/
|
|
31
|
-
"@awarizon/
|
|
32
|
-
"@awarizon/tx-engine": "1.0.
|
|
30
|
+
"@awarizon/wallet-engine": "1.0.2",
|
|
31
|
+
"@awarizon/abi-engine": "1.0.2",
|
|
32
|
+
"@awarizon/tx-engine": "1.0.2"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"typescript": "^5.5.0",
|