@awarizon/web3 1.0.2 → 1.1.0

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.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { createPublicClient, http } from 'viem';
1
+ import { erc20Abi, createPublicClient, http } from 'viem';
2
2
  import { WalletEngine } from '@awarizon/wallet-engine';
3
3
  export { ChainSwitchError, InvalidMnemonicError, InvalidPrivateKeyError, WalletEngine, WalletNotConnectedError } from '@awarizon/wallet-engine';
4
4
  import { TransactionEngine } from '@awarizon/tx-engine';
@@ -362,6 +362,36 @@ var TelemetryClient = class {
362
362
  );
363
363
  }
364
364
  };
365
+ var ERC20_ABI = erc20Abi;
366
+ var ERC721_ABI = [
367
+ { type: "function", name: "name", stateMutability: "view", inputs: [], outputs: [{ type: "string" }] },
368
+ { type: "function", name: "symbol", stateMutability: "view", inputs: [], outputs: [{ type: "string" }] },
369
+ { type: "function", name: "tokenURI", stateMutability: "view", inputs: [{ name: "tokenId", type: "uint256" }], outputs: [{ type: "string" }] },
370
+ { type: "function", name: "totalSupply", stateMutability: "view", inputs: [], outputs: [{ type: "uint256" }] },
371
+ { type: "function", name: "ownerOf", stateMutability: "view", inputs: [{ name: "tokenId", type: "uint256" }], outputs: [{ type: "address" }] },
372
+ { type: "function", name: "balanceOf", stateMutability: "view", inputs: [{ name: "owner", type: "address" }], outputs: [{ type: "uint256" }] },
373
+ { type: "function", name: "getApproved", stateMutability: "view", inputs: [{ name: "tokenId", type: "uint256" }], outputs: [{ type: "address" }] },
374
+ { type: "function", name: "isApprovedForAll", stateMutability: "view", inputs: [{ name: "owner", type: "address" }, { name: "operator", type: "address" }], outputs: [{ type: "bool" }] },
375
+ { type: "function", name: "transferFrom", stateMutability: "nonpayable", inputs: [{ name: "from", type: "address" }, { name: "to", type: "address" }, { name: "tokenId", type: "uint256" }], outputs: [] },
376
+ { type: "function", name: "safeTransferFrom", stateMutability: "nonpayable", inputs: [{ name: "from", type: "address" }, { name: "to", type: "address" }, { name: "tokenId", type: "uint256" }], outputs: [] },
377
+ { type: "function", name: "approve", stateMutability: "nonpayable", inputs: [{ name: "to", type: "address" }, { name: "tokenId", type: "uint256" }], outputs: [] },
378
+ { type: "function", name: "setApprovalForAll", stateMutability: "nonpayable", inputs: [{ name: "operator", type: "address" }, { name: "approved", type: "bool" }], outputs: [] },
379
+ { type: "event", name: "Transfer", inputs: [{ indexed: true, name: "from", type: "address" }, { indexed: true, name: "to", type: "address" }, { indexed: true, name: "tokenId", type: "uint256" }] },
380
+ { type: "event", name: "Approval", inputs: [{ indexed: true, name: "owner", type: "address" }, { indexed: true, name: "approved", type: "address" }, { indexed: true, name: "tokenId", type: "uint256" }] },
381
+ { type: "event", name: "ApprovalForAll", inputs: [{ indexed: true, name: "owner", type: "address" }, { indexed: true, name: "operator", type: "address" }, { name: "approved", type: "bool" }] }
382
+ ];
383
+ var ERC1155_ABI = [
384
+ { type: "function", name: "uri", stateMutability: "view", inputs: [{ name: "id", type: "uint256" }], outputs: [{ type: "string" }] },
385
+ { type: "function", name: "balanceOf", stateMutability: "view", inputs: [{ name: "account", type: "address" }, { name: "id", type: "uint256" }], outputs: [{ type: "uint256" }] },
386
+ { type: "function", name: "balanceOfBatch", stateMutability: "view", inputs: [{ name: "accounts", type: "address[]" }, { name: "ids", type: "uint256[]" }], outputs: [{ type: "uint256[]" }] },
387
+ { type: "function", name: "isApprovedForAll", stateMutability: "view", inputs: [{ name: "account", type: "address" }, { name: "operator", type: "address" }], outputs: [{ type: "bool" }] },
388
+ { type: "function", name: "setApprovalForAll", stateMutability: "nonpayable", inputs: [{ name: "operator", type: "address" }, { name: "approved", type: "bool" }], outputs: [] },
389
+ { 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: [] },
390
+ { 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: [] },
391
+ { 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" }] },
392
+ { 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[]" }] },
393
+ { type: "event", name: "ApprovalForAll", inputs: [{ indexed: true, name: "account", type: "address" }, { indexed: true, name: "operator", type: "address" }, { name: "approved", type: "bool" }] }
394
+ ];
365
395
  var WalletProxy = class {
366
396
  constructor(engine, ensureReady) {
367
397
  this.engine = engine;
@@ -417,6 +447,8 @@ var AwarizonWeb3 = class {
417
447
  // Contract instances are cached by address — same address returns same instance.
418
448
  // Cache is cleared on switchChain() since contracts are chain-specific.
419
449
  this._contractCache = /* @__PURE__ */ new Map();
450
+ // Named contract registry — register once, reference by name anywhere.
451
+ this._registry = /* @__PURE__ */ new Map();
420
452
  if (!config.apiKey) throw new ApiKeyRequiredError();
421
453
  this.chain = resolveChain(config.chain);
422
454
  this.publicClient = createPublicClient({
@@ -639,6 +671,105 @@ var AwarizonWeb3 = class {
639
671
  );
640
672
  }
641
673
  }
674
+ // ─── ERC Standard Clients ───────────────────────────────────────────────────
675
+ /**
676
+ * Load an ERC-20 token with fully typed methods — no ABI import needed.
677
+ *
678
+ * ```ts
679
+ * const token = await awarizon.erc20("0x...")
680
+ * const balance = await token.balanceOf(userAddress)
681
+ * const symbol = await token.symbol()
682
+ * await token.transfer(recipient, 100n)
683
+ * ```
684
+ */
685
+ async erc20(address) {
686
+ const instance = await this.contract({ address, abi: ERC20_ABI });
687
+ return instance;
688
+ }
689
+ /**
690
+ * Load an ERC-721 NFT contract with fully typed methods — no ABI import needed.
691
+ *
692
+ * ```ts
693
+ * const nft = await awarizon.erc721("0x...")
694
+ * const owner = await nft.ownerOf(1n)
695
+ * const uri = await nft.tokenURI(1n)
696
+ * await nft.transferFrom(from, to, 1n)
697
+ * ```
698
+ */
699
+ async erc721(address) {
700
+ const instance = await this.contract({ address, abi: ERC721_ABI });
701
+ return instance;
702
+ }
703
+ /**
704
+ * Load an ERC-1155 multi-token contract with fully typed methods — no ABI import needed.
705
+ *
706
+ * ```ts
707
+ * const items = await awarizon.erc1155("0x...")
708
+ * const balance = await items.balanceOf(userAddress, 42n)
709
+ * const uri = await items.uri(42n)
710
+ * await items.safeTransferFrom(from, to, 42n, 1n, "0x")
711
+ * ```
712
+ */
713
+ async erc1155(address) {
714
+ const instance = await this.contract({ address, abi: ERC1155_ABI });
715
+ return instance;
716
+ }
717
+ // ─── Named Contract Registry ────────────────────────────────────────────────
718
+ /**
719
+ * Register a contract under a human-readable name.
720
+ * After registering, use `awarizon.use(name)` anywhere instead of repeating
721
+ * address + ABI every time.
722
+ *
723
+ * ```ts
724
+ * awarizon.register("USDC", { address: "0x...", abi: erc20Abi })
725
+ * awarizon.register("Vault", { address: "0x...", abi: vaultAbi })
726
+ *
727
+ * const usdc = await awarizon.use("USDC")
728
+ * const vault = await awarizon.use("Vault")
729
+ * ```
730
+ */
731
+ register(name, config) {
732
+ this._registry.set(name, config);
733
+ return this;
734
+ }
735
+ /**
736
+ * Retrieve a previously registered contract by name.
737
+ * Throws a descriptive error if the name was never registered.
738
+ *
739
+ * ```ts
740
+ * const usdc = await awarizon.use("USDC")
741
+ * await usdc.transfer(recipient, 100n)
742
+ * ```
743
+ */
744
+ async use(name) {
745
+ const config = this._registry.get(name);
746
+ if (!config) {
747
+ const registered = [...this._registry.keys()].join(", ") || "none";
748
+ throw new Error(
749
+ `[awarizon/web3] Contract "${name}" is not registered.
750
+ Call awarizon.register("${name}", { address, abi }) first.
751
+ Currently registered: ${registered}`
752
+ );
753
+ }
754
+ return this.contract(config);
755
+ }
756
+ /**
757
+ * Remove a registered contract from the registry.
758
+ *
759
+ * ```ts
760
+ * awarizon.unregister("USDC")
761
+ * ```
762
+ */
763
+ unregister(name) {
764
+ this._registry.delete(name);
765
+ return this;
766
+ }
767
+ /**
768
+ * Return all registered contract names.
769
+ */
770
+ registeredContracts() {
771
+ return [...this._registry.keys()];
772
+ }
642
773
  // ─── Accessors ──────────────────────────────────────────────────────────────
643
774
  get chainId() {
644
775
  return this.chain.id;
@@ -655,6 +786,6 @@ var AwarizonWeb3 = class {
655
786
  }
656
787
  };
657
788
 
658
- export { ApiKeyRequiredError, AwarizonWeb3, CHAINS, ContractNotLoadedError, InvalidApiKeyError, NetworkMismatchError, ProviderError, TelemetryClient, UnsupportedChainError, getSupportedChainIds, resolveChain };
789
+ export { ApiKeyRequiredError, AwarizonWeb3, CHAINS, ContractNotLoadedError, ERC1155_ABI, ERC20_ABI, ERC721_ABI, InvalidApiKeyError, NetworkMismatchError, ProviderError, TelemetryClient, UnsupportedChainError, getSupportedChainIds, resolveChain };
659
790
  //# sourceMappingURL=index.mjs.map
660
791
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chains.ts","../src/contract.ts","../src/errors.ts","../src/telemetry.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// ─── 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"]}
1
+ {"version":3,"sources":["../src/chains.ts","../src/contract.ts","../src/errors.ts","../src/telemetry.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 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 { 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} 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 {\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} 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 // 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: 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 // ─── 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awarizon/web3",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "Core Awarizon Web3 SDK — production-grade EVM blockchain abstraction layer",
5
5
  "keywords": [
6
6
  "web3",
@@ -28,8 +28,8 @@
28
28
  "dependencies": {
29
29
  "viem": "^2.21.0",
30
30
  "@awarizon/wallet-engine": "1.0.2",
31
- "@awarizon/abi-engine": "1.0.2",
32
- "@awarizon/tx-engine": "1.0.2"
31
+ "@awarizon/tx-engine": "1.1.0",
32
+ "@awarizon/abi-engine": "1.0.2"
33
33
  },
34
34
  "devDependencies": {
35
35
  "typescript": "^5.5.0",