@awarizon/web3 1.1.1 → 1.3.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.d.mts +46 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +69 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -14
package/dist/index.d.mts
CHANGED
|
@@ -40,6 +40,17 @@ interface AwarizonConfig {
|
|
|
40
40
|
* Only affects external wallets (wagmi, RainbowKit, EIP-1193).
|
|
41
41
|
*/
|
|
42
42
|
autoSwitchChain?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* WalletConnect v2 project ID.
|
|
45
|
+
* Required when using `awarizon.connectWalletConnect()` or the built-in
|
|
46
|
+
* `<ConnectButton />` to connect mobile wallets via WalletConnect.
|
|
47
|
+
*
|
|
48
|
+
* Get a free project ID at https://cloud.walletconnect.com
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* new AwarizonWeb3({ chain: "base", apiKey: "awz_live_...", walletConnectProjectId: "abc123" })
|
|
52
|
+
*/
|
|
53
|
+
walletConnectProjectId?: string;
|
|
43
54
|
}
|
|
44
55
|
interface ContractConfig<TAbi extends Abi = Abi> {
|
|
45
56
|
/** The deployed contract address */
|
|
@@ -715,6 +726,7 @@ declare class AwarizonWeb3 {
|
|
|
715
726
|
private readonly _engine;
|
|
716
727
|
private readonly _txEngine;
|
|
717
728
|
private readonly _telemetry;
|
|
729
|
+
private readonly _walletConnectProjectId;
|
|
718
730
|
private _contractCache;
|
|
719
731
|
private _registry;
|
|
720
732
|
constructor(config: AwarizonConfig);
|
|
@@ -740,6 +752,40 @@ declare class AwarizonWeb3 {
|
|
|
740
752
|
name?: string;
|
|
741
753
|
icon?: string;
|
|
742
754
|
}): Promise<this>;
|
|
755
|
+
/**
|
|
756
|
+
* Connect a mobile or desktop wallet using the WalletConnect v2 protocol.
|
|
757
|
+
* Opens a QR-code modal (or deeplink on mobile) so the user can scan with
|
|
758
|
+
* MetaMask, Rainbow, Trust Wallet, or any WalletConnect-compatible wallet.
|
|
759
|
+
*
|
|
760
|
+
* Requires `walletConnectProjectId` in the SDK config and the peer package:
|
|
761
|
+
* `npm install @walletconnect/ethereum-provider`
|
|
762
|
+
*
|
|
763
|
+
* @example
|
|
764
|
+
* ```ts
|
|
765
|
+
* const awarizon = new AwarizonWeb3({ chain: "base", apiKey: "...", walletConnectProjectId: "abc" })
|
|
766
|
+
* await awarizon.connectWalletConnect()
|
|
767
|
+
* ```
|
|
768
|
+
*/
|
|
769
|
+
/**
|
|
770
|
+
* Connect a wallet using the WalletConnect v2 protocol.
|
|
771
|
+
*
|
|
772
|
+
* When called from `<ConnectButton />`, the SDK handles QR display internally.
|
|
773
|
+
* When called manually, pass `onDisplayUri` to receive the WC URI and render
|
|
774
|
+
* your own QR code.
|
|
775
|
+
*
|
|
776
|
+
* Requires `walletConnectProjectId` in the SDK config.
|
|
777
|
+
*
|
|
778
|
+
* @example
|
|
779
|
+
* await awarizon.connectWalletConnect({
|
|
780
|
+
* onDisplayUri: (uri) => console.log("Show QR:", uri)
|
|
781
|
+
* })
|
|
782
|
+
*/
|
|
783
|
+
connectWalletConnect(options?: {
|
|
784
|
+
/** Called with the WalletConnect URI as soon as it's ready — render it as a QR code. */
|
|
785
|
+
onDisplayUri?: (uri: string) => void;
|
|
786
|
+
}): Promise<this>;
|
|
787
|
+
/** The WalletConnect project ID passed at construction, if any */
|
|
788
|
+
get walletConnectProjectId(): string | undefined;
|
|
743
789
|
disconnectWallet(): this;
|
|
744
790
|
switchChain(chain: Chain | string): Promise<this>;
|
|
745
791
|
getWalletInfo(): SDKWalletInfo;
|
package/dist/index.d.ts
CHANGED
|
@@ -40,6 +40,17 @@ interface AwarizonConfig {
|
|
|
40
40
|
* Only affects external wallets (wagmi, RainbowKit, EIP-1193).
|
|
41
41
|
*/
|
|
42
42
|
autoSwitchChain?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* WalletConnect v2 project ID.
|
|
45
|
+
* Required when using `awarizon.connectWalletConnect()` or the built-in
|
|
46
|
+
* `<ConnectButton />` to connect mobile wallets via WalletConnect.
|
|
47
|
+
*
|
|
48
|
+
* Get a free project ID at https://cloud.walletconnect.com
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* new AwarizonWeb3({ chain: "base", apiKey: "awz_live_...", walletConnectProjectId: "abc123" })
|
|
52
|
+
*/
|
|
53
|
+
walletConnectProjectId?: string;
|
|
43
54
|
}
|
|
44
55
|
interface ContractConfig<TAbi extends Abi = Abi> {
|
|
45
56
|
/** The deployed contract address */
|
|
@@ -715,6 +726,7 @@ declare class AwarizonWeb3 {
|
|
|
715
726
|
private readonly _engine;
|
|
716
727
|
private readonly _txEngine;
|
|
717
728
|
private readonly _telemetry;
|
|
729
|
+
private readonly _walletConnectProjectId;
|
|
718
730
|
private _contractCache;
|
|
719
731
|
private _registry;
|
|
720
732
|
constructor(config: AwarizonConfig);
|
|
@@ -740,6 +752,40 @@ declare class AwarizonWeb3 {
|
|
|
740
752
|
name?: string;
|
|
741
753
|
icon?: string;
|
|
742
754
|
}): Promise<this>;
|
|
755
|
+
/**
|
|
756
|
+
* Connect a mobile or desktop wallet using the WalletConnect v2 protocol.
|
|
757
|
+
* Opens a QR-code modal (or deeplink on mobile) so the user can scan with
|
|
758
|
+
* MetaMask, Rainbow, Trust Wallet, or any WalletConnect-compatible wallet.
|
|
759
|
+
*
|
|
760
|
+
* Requires `walletConnectProjectId` in the SDK config and the peer package:
|
|
761
|
+
* `npm install @walletconnect/ethereum-provider`
|
|
762
|
+
*
|
|
763
|
+
* @example
|
|
764
|
+
* ```ts
|
|
765
|
+
* const awarizon = new AwarizonWeb3({ chain: "base", apiKey: "...", walletConnectProjectId: "abc" })
|
|
766
|
+
* await awarizon.connectWalletConnect()
|
|
767
|
+
* ```
|
|
768
|
+
*/
|
|
769
|
+
/**
|
|
770
|
+
* Connect a wallet using the WalletConnect v2 protocol.
|
|
771
|
+
*
|
|
772
|
+
* When called from `<ConnectButton />`, the SDK handles QR display internally.
|
|
773
|
+
* When called manually, pass `onDisplayUri` to receive the WC URI and render
|
|
774
|
+
* your own QR code.
|
|
775
|
+
*
|
|
776
|
+
* Requires `walletConnectProjectId` in the SDK config.
|
|
777
|
+
*
|
|
778
|
+
* @example
|
|
779
|
+
* await awarizon.connectWalletConnect({
|
|
780
|
+
* onDisplayUri: (uri) => console.log("Show QR:", uri)
|
|
781
|
+
* })
|
|
782
|
+
*/
|
|
783
|
+
connectWalletConnect(options?: {
|
|
784
|
+
/** Called with the WalletConnect URI as soon as it's ready — render it as a QR code. */
|
|
785
|
+
onDisplayUri?: (uri: string) => void;
|
|
786
|
+
}): Promise<this>;
|
|
787
|
+
/** The WalletConnect project ID passed at construction, if any */
|
|
788
|
+
get walletConnectProjectId(): string | undefined;
|
|
743
789
|
disconnectWallet(): this;
|
|
744
790
|
switchChain(chain: Chain | string): Promise<this>;
|
|
745
791
|
getWalletInfo(): SDKWalletInfo;
|
package/dist/index.js
CHANGED
|
@@ -493,6 +493,7 @@ var AwarizonWeb3 = class {
|
|
|
493
493
|
() => this._engine.getWalletClient()
|
|
494
494
|
);
|
|
495
495
|
this._telemetry = new TelemetryClient(config.apiKey, config.baseUrl);
|
|
496
|
+
this._walletConnectProjectId = config.walletConnectProjectId;
|
|
496
497
|
this.wallet = new WalletProxy(
|
|
497
498
|
this._engine,
|
|
498
499
|
() => this._telemetry.ensureValidated()
|
|
@@ -525,6 +526,74 @@ var AwarizonWeb3 = class {
|
|
|
525
526
|
await this._engine.connectEIP1193(provider, connectorInfo);
|
|
526
527
|
return this;
|
|
527
528
|
}
|
|
529
|
+
/**
|
|
530
|
+
* Connect a mobile or desktop wallet using the WalletConnect v2 protocol.
|
|
531
|
+
* Opens a QR-code modal (or deeplink on mobile) so the user can scan with
|
|
532
|
+
* MetaMask, Rainbow, Trust Wallet, or any WalletConnect-compatible wallet.
|
|
533
|
+
*
|
|
534
|
+
* Requires `walletConnectProjectId` in the SDK config and the peer package:
|
|
535
|
+
* `npm install @walletconnect/ethereum-provider`
|
|
536
|
+
*
|
|
537
|
+
* @example
|
|
538
|
+
* ```ts
|
|
539
|
+
* const awarizon = new AwarizonWeb3({ chain: "base", apiKey: "...", walletConnectProjectId: "abc" })
|
|
540
|
+
* await awarizon.connectWalletConnect()
|
|
541
|
+
* ```
|
|
542
|
+
*/
|
|
543
|
+
/**
|
|
544
|
+
* Connect a wallet using the WalletConnect v2 protocol.
|
|
545
|
+
*
|
|
546
|
+
* When called from `<ConnectButton />`, the SDK handles QR display internally.
|
|
547
|
+
* When called manually, pass `onDisplayUri` to receive the WC URI and render
|
|
548
|
+
* your own QR code.
|
|
549
|
+
*
|
|
550
|
+
* Requires `walletConnectProjectId` in the SDK config.
|
|
551
|
+
*
|
|
552
|
+
* @example
|
|
553
|
+
* await awarizon.connectWalletConnect({
|
|
554
|
+
* onDisplayUri: (uri) => console.log("Show QR:", uri)
|
|
555
|
+
* })
|
|
556
|
+
*/
|
|
557
|
+
async connectWalletConnect(options) {
|
|
558
|
+
if (!this._walletConnectProjectId) {
|
|
559
|
+
throw new Error(
|
|
560
|
+
'[awarizon/web3] walletConnectProjectId is not configured. Pass it when creating the SDK: new AwarizonWeb3({ ..., walletConnectProjectId: "your_id" }).\nGet a free project ID at https://cloud.walletconnect.com'
|
|
561
|
+
);
|
|
562
|
+
}
|
|
563
|
+
let EthereumProvider;
|
|
564
|
+
try {
|
|
565
|
+
const load = new Function("id", "return import(id)");
|
|
566
|
+
EthereumProvider = (await load("@walletconnect/ethereum-provider")).default;
|
|
567
|
+
} catch {
|
|
568
|
+
throw new Error(
|
|
569
|
+
"[awarizon/web3] @walletconnect/ethereum-provider is not installed.\nRun: npm install @walletconnect/ethereum-provider"
|
|
570
|
+
);
|
|
571
|
+
}
|
|
572
|
+
const provider = await EthereumProvider.init({
|
|
573
|
+
projectId: this._walletConnectProjectId,
|
|
574
|
+
chains: [this.chain.id],
|
|
575
|
+
showQrModal: false,
|
|
576
|
+
// We render our own modal — set up onDisplayUri instead
|
|
577
|
+
optionalChains: [],
|
|
578
|
+
methods: ["eth_sendTransaction", "personal_sign", "eth_signTypedData_v4"],
|
|
579
|
+
events: ["chainChanged", "accountsChanged"]
|
|
580
|
+
});
|
|
581
|
+
if (options?.onDisplayUri) {
|
|
582
|
+
provider.on?.("display_uri", (...args) => {
|
|
583
|
+
options.onDisplayUri(args[0]);
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
await provider.connect();
|
|
587
|
+
await this.connectEIP1193Provider(provider, {
|
|
588
|
+
name: "WalletConnect",
|
|
589
|
+
icon: "https://avatars.githubusercontent.com/u/37784886"
|
|
590
|
+
});
|
|
591
|
+
return this;
|
|
592
|
+
}
|
|
593
|
+
/** The WalletConnect project ID passed at construction, if any */
|
|
594
|
+
get walletConnectProjectId() {
|
|
595
|
+
return this._walletConnectProjectId;
|
|
596
|
+
}
|
|
528
597
|
disconnectWallet() {
|
|
529
598
|
this._engine.disconnectExternal();
|
|
530
599
|
return this;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chains.ts","../src/contract.ts","../src/errors.ts","../src/telemetry.ts","../src/standards.ts","../src/sdk.ts"],"names":["mainnet","base","baseSepolia","polygon","polygonAmoy","arbitrum","arbitrumSepolia","optimism","optimismSepolia","bsc","avalanche","sepolia","zora","linea","scroll","mantle","celo","gnosis","fantom","moonbeam","parseABI","erc20Abi","createPublicClient","http","WalletEngine","TransactionEngine"],"mappings":"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","file":"index.js","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 EIP1193Provider,\n ConnectorInfo,\n WalletChangeEvent,\n ChainChangeEvent,\n SignTypedDataParams,\n} from '@awarizon/wallet-engine';\nimport { TransactionEngine } from '@awarizon/tx-engine';\nimport type { TransactionResult } from '@awarizon/tx-engine';\nimport { resolveChain } 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 ChainMismatchError,\n} from '@awarizon/wallet-engine';\n\nexport {\n ContractExecutionError,\n SimulationError,\n GasEstimationError,\n} from '@awarizon/tx-engine';\n\nexport {\n InvalidABIError,\n} from '@awarizon/abi-engine';\n\nexport {\n NetworkMismatchError,\n ProviderError,\n ContractNotLoadedError,\n UnsupportedChainError,\n ApiKeyRequiredError,\n InvalidApiKeyError,\n} from './errors';\n\n// ─── WalletProxy ──────────────────────────────────────────────────────────────\n\n/**\n * Wraps WalletEngine and gates mutating operations (create, import) behind\n * API key validation. Read-only operations (address, isConnected, etc.) are\n * never gated since they need no network access.\n */\nclass WalletProxy {\n constructor(\n private readonly engine: WalletEngine,\n private readonly ensureReady: () => Promise<void>,\n ) {}\n\n // ── Gated async operations ──────────────────────────────────────────────────\n\n async create(): Promise<CreatedWallet> {\n await this.ensureReady();\n return this.engine.create();\n }\n\n async importMnemonic(\n mnemonic: string,\n 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 getConnectorInfo(): ConnectorInfo { return this.engine.getConnectorInfo(); }\n\n connectExternal(\n c: ExternalWalletClient,\n info?: { name?: string; icon?: string },\n ): void { this.engine.connectExternal(c, info); }\n\n disconnectExternal(): void { this.engine.disconnectExternal(); }\n disconnect(): void { this.engine.disconnect(); }\n\n async switchChain(chain: Chain): Promise<void> {\n return this.engine.switchChain(chain);\n }\n\n // ── Gated async — EIP-1193, signing, chain awareness ───────────────────────\n\n async connectEIP1193(\n provider: EIP1193Provider,\n info?: { name?: string; icon?: string },\n ): Promise<void> {\n await this.ensureReady();\n return this.engine.connectEIP1193(provider, info);\n }\n\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signMessage(message);\n }\n\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signTypedData(params);\n }\n\n async getChainId(): Promise<number> { return this.engine.getChainId(); }\n async isChainMismatch(): Promise<boolean> { return this.engine.isChainMismatch(); }\n\n // ── Event subscriptions ────────────────────────────────────────────────────\n\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this.engine.onWalletChange(cb);\n }\n\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this.engine.onChainChange(cb);\n }\n}\n\n// ─── AwarizonWeb3 ─────────────────────────────────────────────────────────────\n\n/**\n * Primary entry point for the Awarizon Web3 SDK.\n *\n * An API key is required — get yours at https://awarizon.com/dashboard/api-keys\n *\n * ```ts\n * const awarizon = new AwarizonWeb3({ chain: \"base\", apiKey: \"awz_live_...\" })\n *\n * // Internal wallet\n * const wallet = await awarizon.wallet.create()\n *\n * // Load a contract\n * const staking = await awarizon.contract({ address: \"0x...\", abi })\n * await staking.stake(100n)\n * staking.on(\"Staked\", (log) => console.log(log))\n * ```\n */\nexport class AwarizonWeb3 {\n readonly chain: Chain;\n readonly publicClient: PublicClient;\n\n /** Wallet management — create, import, or connect external wallets */\n readonly wallet: WalletProxy;\n\n 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 /**\n * Connect any viem WalletClient (wagmi, RainbowKit, custom).\n * Optionally pass connector metadata to display in the UI.\n *\n * @example\n * awarizon.connectWallet(walletClient, { name: \"MetaMask\" })\n */\n connectWallet(\n walletClient: WalletClient,\n connectorInfo?: { name?: string; icon?: string },\n ): this {\n this._engine.connectExternal(walletClient, connectorInfo);\n return this;\n }\n\n /**\n * Connect directly from a raw EIP-1193 provider without needing wagmi.\n * Works with window.ethereum, WalletConnect v2, and any EIP-1193 object.\n *\n * @example\n * await awarizon.connectEIP1193Provider(window.ethereum, { name: \"MetaMask\" })\n */\n async connectEIP1193Provider(\n provider: EIP1193Provider,\n connectorInfo?: { name?: string; icon?: string },\n ): Promise<this> {\n await this._telemetry.ensureValidated();\n await this._engine.connectEIP1193(provider, connectorInfo);\n return this;\n }\n\n disconnectWallet(): this {\n this._engine.disconnectExternal();\n return this;\n }\n\n async switchChain(chain: Chain | string): Promise<this> {\n await this._telemetry.ensureValidated();\n const resolved = resolveChain(chain);\n await this._engine.switchChain(resolved);\n this._contractCache.clear(); // contracts are chain-specific\n return this;\n }\n\n getWalletInfo(): SDKWalletInfo {\n const info = this._engine.getConnectorInfo();\n return {\n address: this._engine.address(),\n chain: this.chain,\n isExternal: this._engine.hasExternalWallet(),\n connectorName: info.name,\n };\n }\n\n /**\n * Sign a plain text or raw-bytes message.\n * Use for Sign-In with Ethereum (SIWE) and off-chain authorization.\n *\n * @example\n * const sig = await awarizon.signMessage(\"Hello, Awarizon!\")\n */\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signMessage(message);\n }\n\n /**\n * Sign EIP-712 typed structured data (permit2, SIWE, Seaport orders, etc.).\n *\n * @example\n * const sig = await awarizon.signTypedData({\n * domain: { name: \"MyApp\", version: \"1\", chainId: 8453 },\n * types: { Transfer: [{ name: \"to\", type: \"address\" }, { name: \"amount\", type: \"uint256\" }] },\n * primaryType: \"Transfer\",\n * message: { to: \"0x...\", amount: \"1000000\" },\n * })\n */\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signTypedData(params);\n }\n\n /**\n * Returns the chain ID the active wallet is currently on.\n * For external wallets this may differ from the SDK's configured chain.\n */\n async getChainId(): Promise<number> {\n return this._engine.getChainId();\n }\n\n /**\n * Returns true when the external wallet is on a different chain than the SDK.\n * Use this to show a \"wrong network\" banner in your UI.\n *\n * @example\n * if (await awarizon.isChainMismatch()) {\n * alert(\"Please switch to Base in your wallet\")\n * }\n */\n async isChainMismatch(): Promise<boolean> {\n return this._engine.isChainMismatch();\n }\n\n /**\n * Returns metadata about the currently active connector.\n * Useful for displaying \"Connected via MetaMask\" in the UI.\n */\n getConnectorInfo(): ConnectorInfo {\n return this._engine.getConnectorInfo();\n }\n\n /**\n * Subscribe to wallet changes (connect, disconnect, account switch).\n * Returns an unsubscribe function — call it on cleanup.\n *\n * @example\n * const unsub = awarizon.onWalletChange(({ address, type, name }) => {\n * console.log(\"Wallet changed:\", address, type, name)\n * })\n * unsub() // stop listening\n */\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this._engine.onWalletChange(cb);\n }\n\n /**\n * Subscribe to chain changes (switchChain calls).\n * Returns an unsubscribe function.\n */\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this._engine.onChainChange(cb);\n }\n\n // ─── Contract API ───────────────────────────────────────────────────────────\n\n /**\n * Load a deployed contract and return a fully typed, ABI-powered instance.\n * Validates the API key on the first call — subsequent calls are instant.\n *\n * Results are cached by address — calling contract() twice with the same\n * address and ABI object returns the same instance without rebuilding.\n */\n async contract<TAbi extends Abi>(config: ContractConfig<TAbi>): Promise<ContractInstance> {\n await this._telemetry.ensureValidated();\n\n if (!config.address || !config.abi) {\n throw new Error('[awarizon/web3] awarizon.contract() requires both address and abi');\n }\n\n const key = config.address.toLowerCase();\n const cached = this._contractCache.get(key);\n if (cached && cached.abiRef === (config.abi as Abi)) return cached.instance;\n\n const instance = buildContractInstance(\n config.address,\n config.abi as Abi,\n this.publicClient,\n this._txEngine,\n this._telemetry,\n this.chain,\n );\n this._contractCache.set(key, { abiRef: config.abi as Abi, instance });\n return instance;\n }\n\n /**\n * Load multiple contracts in parallel. Validates the API key once, then\n * instantiates all contracts concurrently.\n *\n * @example\n * ```ts\n * const [token, staking, nft] = await awarizon.contracts([\n * { address: tokenAddr, abi: ERC20_ABI },\n * { address: stakingAddr, abi: STAKING_ABI },\n * { address: nftAddr, abi: ERC721_ABI },\n * ])\n * ```\n */\n async contracts(configs: Array<{ address: Address; abi: Abi }>): Promise<ContractInstance[]> {\n return Promise.all(configs.map(c => this.contract(c)));\n }\n\n /**\n * Call a read-only (view/pure) contract function directly without loading\n * a full contract instance. Best for one-off reads.\n *\n * @example\n * ```ts\n * const balance = await awarizon.read<bigint>({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"balanceOf\",\n * args: [userAddress],\n * })\n * ```\n */\n async read<T = unknown>(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n }): Promise<T> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.read({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n });\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result as T;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Execute a state-mutating contract function directly without loading a full\n * contract instance. Best for one-off writes.\n *\n * @example\n * ```ts\n * const { hash, receipt } = await awarizon.write({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"transfer\",\n * args: [recipient, 100n],\n * })\n * ```\n */\n async write(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n value?: bigint;\n gas?: bigint;\n }): Promise<TransactionResult> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.write({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n value: params.value,\n gas: params.gas,\n });\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Batch multiple read calls into a single RPC round-trip using multicall3.\n * Falls back to parallel individual reads on chains where multicall3 is\n * not deployed.\n *\n * @example\n * ```ts\n * const [balance, supply, allowance] = await awarizon.multicall([\n * { address: tokenAddr, abi: ERC20_ABI, method: \"balanceOf\", args: [userAddr] },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"totalSupply\" },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"allowance\", args: [userAddr, spenderAddr] },\n * ])\n * ```\n */\n async multicall(\n calls: Array<{ address: Address; abi: Abi; method: string; args?: unknown[] }>,\n ): Promise<unknown[]> {\n await this._telemetry.ensureValidated();\n\n const contracts = calls.map(c => ({\n address: c.address,\n abi: c.abi,\n functionName: c.method,\n args: (c.args ?? []) as readonly unknown[],\n }));\n\n try {\n // Single RPC round-trip via multicall3\n const results = await this.publicClient.multicall({\n contracts: contracts as any,\n allowFailure: false,\n });\n return results as unknown[];\n } catch {\n // Multicall3 not deployed on this chain — fall back to parallel reads\n return Promise.all(\n contracts.map(c =>\n this.publicClient.readContract(c as any),\n ),\n );\n }\n }\n\n // ─── ERC Standard Clients ───────────────────────────────────────────────────\n\n /**\n * Load an ERC-20 token with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const token = await awarizon.erc20(\"0x...\")\n * const balance = await token.balanceOf(userAddress)\n * const symbol = await token.symbol()\n * await token.transfer(recipient, 100n)\n * ```\n */\n async erc20(address: Address): Promise<Erc20Contract> {\n const instance = await this.contract({ address, abi: ERC20_ABI as unknown as Abi });\n return instance as unknown as Erc20Contract;\n }\n\n /**\n * Load an ERC-721 NFT contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const nft = await awarizon.erc721(\"0x...\")\n * const owner = await nft.ownerOf(1n)\n * const uri = await nft.tokenURI(1n)\n * await nft.transferFrom(from, to, 1n)\n * ```\n */\n async erc721(address: Address): Promise<Erc721Contract> {\n const instance = await this.contract({ address, abi: ERC721_ABI as unknown as Abi });\n return instance as unknown as Erc721Contract;\n }\n\n /**\n * Load an ERC-1155 multi-token contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const items = await awarizon.erc1155(\"0x...\")\n * const balance = await items.balanceOf(userAddress, 42n)\n * const uri = await items.uri(42n)\n * await items.safeTransferFrom(from, to, 42n, 1n, \"0x\")\n * ```\n */\n async erc1155(address: Address): Promise<Erc1155Contract> {\n const instance = await this.contract({ address, abi: ERC1155_ABI as unknown as Abi });\n return instance as unknown as Erc1155Contract;\n }\n\n // ─── Named Contract Registry ────────────────────────────────────────────────\n\n /**\n * Register a contract under a human-readable name.\n * After registering, use `awarizon.use(name)` anywhere instead of repeating\n * address + ABI every time.\n *\n * ```ts\n * awarizon.register(\"USDC\", { address: \"0x...\", abi: erc20Abi })\n * awarizon.register(\"Vault\", { address: \"0x...\", abi: vaultAbi })\n *\n * const usdc = await awarizon.use(\"USDC\")\n * const vault = await awarizon.use(\"Vault\")\n * ```\n */\n register(name: string, config: ContractRegistryEntry): this {\n this._registry.set(name, config);\n return this;\n }\n\n /**\n * Retrieve a previously registered contract by name.\n * Throws a descriptive error if the name was never registered.\n *\n * ```ts\n * const usdc = await awarizon.use(\"USDC\")\n * await usdc.transfer(recipient, 100n)\n * ```\n */\n async use(name: string): Promise<ContractInstance> {\n const config = this._registry.get(name);\n if (!config) {\n const registered = [...this._registry.keys()].join(', ') || 'none';\n throw new Error(\n `[awarizon/web3] Contract \"${name}\" is not registered.\\n` +\n `Call awarizon.register(\"${name}\", { address, abi }) first.\\n` +\n `Currently registered: ${registered}`,\n );\n }\n return this.contract(config);\n }\n\n /**\n * Remove a registered contract from the registry.\n *\n * ```ts\n * awarizon.unregister(\"USDC\")\n * ```\n */\n unregister(name: string): this {\n this._registry.delete(name);\n return this;\n }\n\n /**\n * Return all registered contract names.\n */\n registeredContracts(): string[] {\n return [...this._registry.keys()];\n }\n\n // ─── Accessors ──────────────────────────────────────────────────────────────\n\n get chainId(): number {\n return this.chain.id;\n }\n\n get isConnected(): boolean {\n return this._engine.isConnected();\n }\n\n /**\n * Flush pending telemetry and stop background timers.\n * Call when tearing down a long-lived SDK instance (e.g. on server shutdown).\n */\n async destroy(): Promise<void> {\n await this._telemetry.destroy();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/chains.ts","../src/contract.ts","../src/errors.ts","../src/telemetry.ts","../src/standards.ts","../src/sdk.ts"],"names":["mainnet","base","baseSepolia","polygon","polygonAmoy","arbitrum","arbitrumSepolia","optimism","optimismSepolia","bsc","avalanche","sepolia","zora","linea","scroll","mantle","celo","gnosis","fantom","moonbeam","parseABI","erc20Abi","createPublicClient","http","WalletEngine","TransactionEngine"],"mappings":"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","file":"index.js","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 EIP1193Provider,\n ConnectorInfo,\n WalletChangeEvent,\n ChainChangeEvent,\n SignTypedDataParams,\n} from '@awarizon/wallet-engine';\nimport { TransactionEngine } from '@awarizon/tx-engine';\nimport type { TransactionResult } from '@awarizon/tx-engine';\nimport { resolveChain } 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 ChainMismatchError,\n} from '@awarizon/wallet-engine';\n\nexport {\n ContractExecutionError,\n SimulationError,\n GasEstimationError,\n} from '@awarizon/tx-engine';\n\nexport {\n InvalidABIError,\n} from '@awarizon/abi-engine';\n\nexport {\n NetworkMismatchError,\n ProviderError,\n ContractNotLoadedError,\n UnsupportedChainError,\n ApiKeyRequiredError,\n InvalidApiKeyError,\n} from './errors';\n\n// ─── WalletProxy ──────────────────────────────────────────────────────────────\n\n/**\n * Wraps WalletEngine and gates mutating operations (create, import) behind\n * API key validation. Read-only operations (address, isConnected, etc.) are\n * never gated since they need no network access.\n */\nclass WalletProxy {\n constructor(\n private readonly engine: WalletEngine,\n private readonly ensureReady: () => Promise<void>,\n ) {}\n\n // ── Gated async operations ──────────────────────────────────────────────────\n\n async create(): Promise<CreatedWallet> {\n await this.ensureReady();\n return this.engine.create();\n }\n\n async importMnemonic(\n mnemonic: string,\n 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 getConnectorInfo(): ConnectorInfo { return this.engine.getConnectorInfo(); }\n\n connectExternal(\n c: ExternalWalletClient,\n info?: { name?: string; icon?: string },\n ): void { this.engine.connectExternal(c, info); }\n\n disconnectExternal(): void { this.engine.disconnectExternal(); }\n disconnect(): void { this.engine.disconnect(); }\n\n async switchChain(chain: Chain): Promise<void> {\n return this.engine.switchChain(chain);\n }\n\n // ── Gated async — EIP-1193, signing, chain awareness ───────────────────────\n\n async connectEIP1193(\n provider: EIP1193Provider,\n info?: { name?: string; icon?: string },\n ): Promise<void> {\n await this.ensureReady();\n return this.engine.connectEIP1193(provider, info);\n }\n\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signMessage(message);\n }\n\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signTypedData(params);\n }\n\n async getChainId(): Promise<number> { return this.engine.getChainId(); }\n async isChainMismatch(): Promise<boolean> { return this.engine.isChainMismatch(); }\n\n // ── Event subscriptions ────────────────────────────────────────────────────\n\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this.engine.onWalletChange(cb);\n }\n\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this.engine.onChainChange(cb);\n }\n}\n\n// ─── AwarizonWeb3 ─────────────────────────────────────────────────────────────\n\n/**\n * Primary entry point for the Awarizon Web3 SDK.\n *\n * An API key is required — get yours at https://awarizon.com/dashboard/api-keys\n *\n * ```ts\n * const awarizon = new AwarizonWeb3({ chain: \"base\", apiKey: \"awz_live_...\" })\n *\n * // Internal wallet\n * const wallet = await awarizon.wallet.create()\n *\n * // Load a contract\n * const staking = await awarizon.contract({ address: \"0x...\", abi })\n * await staking.stake(100n)\n * staking.on(\"Staked\", (log) => console.log(log))\n * ```\n */\nexport class AwarizonWeb3 {\n readonly chain: Chain;\n readonly publicClient: PublicClient;\n\n /** Wallet management — create, import, or connect external wallets */\n readonly wallet: WalletProxy;\n\n private readonly _engine: WalletEngine;\n private readonly _txEngine: TransactionEngine;\n private readonly _telemetry: TelemetryClient;\n private readonly _walletConnectProjectId: string | undefined;\n\n // Contract instances are cached by address — same address returns same instance.\n // Cache is cleared on switchChain() since contracts are chain-specific.\n private _contractCache = new Map<string, { abiRef: Abi; instance: ContractInstance }>();\n\n // Named contract registry — register once, reference by name anywhere.\n private _registry = new Map<string, ContractRegistryEntry>();\n\n constructor(config: AwarizonConfig) {\n if (!config.apiKey) throw new ApiKeyRequiredError();\n\n this.chain = resolveChain(config.chain);\n\n this.publicClient = createPublicClient({\n chain: this.chain,\n transport: 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 this._walletConnectProjectId = config.walletConnectProjectId;\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 /**\n * Connect any viem WalletClient (wagmi, RainbowKit, custom).\n * Optionally pass connector metadata to display in the UI.\n *\n * @example\n * awarizon.connectWallet(walletClient, { name: \"MetaMask\" })\n */\n connectWallet(\n walletClient: WalletClient,\n connectorInfo?: { name?: string; icon?: string },\n ): this {\n this._engine.connectExternal(walletClient, connectorInfo);\n return this;\n }\n\n /**\n * Connect directly from a raw EIP-1193 provider without needing wagmi.\n * Works with window.ethereum, WalletConnect v2, and any EIP-1193 object.\n *\n * @example\n * await awarizon.connectEIP1193Provider(window.ethereum, { name: \"MetaMask\" })\n */\n async connectEIP1193Provider(\n provider: EIP1193Provider,\n connectorInfo?: { name?: string; icon?: string },\n ): Promise<this> {\n await this._telemetry.ensureValidated();\n await this._engine.connectEIP1193(provider, connectorInfo);\n return this;\n }\n\n /**\n * Connect a mobile or desktop wallet using the WalletConnect v2 protocol.\n * Opens a QR-code modal (or deeplink on mobile) so the user can scan with\n * MetaMask, Rainbow, Trust Wallet, or any WalletConnect-compatible wallet.\n *\n * Requires `walletConnectProjectId` in the SDK config and the peer package:\n * `npm install @walletconnect/ethereum-provider`\n *\n * @example\n * ```ts\n * const awarizon = new AwarizonWeb3({ chain: \"base\", apiKey: \"...\", walletConnectProjectId: \"abc\" })\n * await awarizon.connectWalletConnect()\n * ```\n */\n /**\n * Connect a wallet using the WalletConnect v2 protocol.\n *\n * When called from `<ConnectButton />`, the SDK handles QR display internally.\n * When called manually, pass `onDisplayUri` to receive the WC URI and render\n * your own QR code.\n *\n * Requires `walletConnectProjectId` in the SDK config.\n *\n * @example\n * await awarizon.connectWalletConnect({\n * onDisplayUri: (uri) => console.log(\"Show QR:\", uri)\n * })\n */\n async connectWalletConnect(options?: {\n /** Called with the WalletConnect URI as soon as it's ready — render it as a QR code. */\n onDisplayUri?: (uri: string) => void;\n }): Promise<this> {\n if (!this._walletConnectProjectId) {\n throw new Error(\n '[awarizon/web3] walletConnectProjectId is not configured. ' +\n 'Pass it when creating the SDK: new AwarizonWeb3({ ..., walletConnectProjectId: \"your_id\" }).\\n' +\n 'Get a free project ID at https://cloud.walletconnect.com',\n );\n }\n\n // Minimal interface — matches the actual WalletConnect EthereumProvider shape\n type WCProvider = EIP1193Provider & { connect(): Promise<void> };\n interface WCProviderClass {\n init(opts: {\n projectId: string;\n chains: number[];\n showQrModal: boolean;\n optionalChains?: number[];\n methods?: string[];\n events?: string[];\n }): Promise<WCProvider>;\n }\n\n let EthereumProvider: WCProviderClass;\n try {\n // Function constructor keeps the import string opaque to TypeScript's DTS pass\n // so the optional peer dep doesn't cause \"module not found\" errors at build time.\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<{ default: WCProviderClass }>;\n EthereumProvider = (await load('@walletconnect/ethereum-provider')).default;\n } catch {\n throw new Error(\n '[awarizon/web3] @walletconnect/ethereum-provider is not installed.\\n' +\n 'Run: npm install @walletconnect/ethereum-provider',\n );\n }\n\n const provider = await EthereumProvider.init({\n projectId: this._walletConnectProjectId,\n chains: [this.chain.id],\n showQrModal: false, // We render our own modal — set up onDisplayUri instead\n optionalChains: [],\n methods: ['eth_sendTransaction', 'personal_sign', 'eth_signTypedData_v4'],\n events: ['chainChanged', 'accountsChanged'],\n });\n\n // Register display_uri BEFORE connect() so we catch the event synchronously\n if (options?.onDisplayUri) {\n provider.on?.('display_uri', (...args: unknown[]) => {\n options.onDisplayUri!(args[0] as string);\n });\n }\n\n // Waits until the user scans the QR and approves in their wallet\n await provider.connect();\n\n await this.connectEIP1193Provider(provider, {\n name: 'WalletConnect',\n icon: 'https://avatars.githubusercontent.com/u/37784886',\n });\n\n return this;\n }\n\n /** The WalletConnect project ID passed at construction, if any */\n get walletConnectProjectId(): string | undefined {\n return this._walletConnectProjectId;\n }\n\n disconnectWallet(): this {\n this._engine.disconnectExternal();\n return this;\n }\n\n async switchChain(chain: Chain | string): Promise<this> {\n await this._telemetry.ensureValidated();\n const resolved = resolveChain(chain);\n await this._engine.switchChain(resolved);\n this._contractCache.clear(); // contracts are chain-specific\n return this;\n }\n\n getWalletInfo(): SDKWalletInfo {\n const info = this._engine.getConnectorInfo();\n return {\n address: this._engine.address(),\n chain: this.chain,\n isExternal: this._engine.hasExternalWallet(),\n connectorName: info.name,\n };\n }\n\n /**\n * Sign a plain text or raw-bytes message.\n * Use for Sign-In with Ethereum (SIWE) and off-chain authorization.\n *\n * @example\n * const sig = await awarizon.signMessage(\"Hello, Awarizon!\")\n */\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signMessage(message);\n }\n\n /**\n * Sign EIP-712 typed structured data (permit2, SIWE, Seaport orders, etc.).\n *\n * @example\n * const sig = await awarizon.signTypedData({\n * domain: { name: \"MyApp\", version: \"1\", chainId: 8453 },\n * types: { Transfer: [{ name: \"to\", type: \"address\" }, { name: \"amount\", type: \"uint256\" }] },\n * primaryType: \"Transfer\",\n * message: { to: \"0x...\", amount: \"1000000\" },\n * })\n */\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signTypedData(params);\n }\n\n /**\n * Returns the chain ID the active wallet is currently on.\n * For external wallets this may differ from the SDK's configured chain.\n */\n async getChainId(): Promise<number> {\n return this._engine.getChainId();\n }\n\n /**\n * Returns true when the external wallet is on a different chain than the SDK.\n * Use this to show a \"wrong network\" banner in your UI.\n *\n * @example\n * if (await awarizon.isChainMismatch()) {\n * alert(\"Please switch to Base in your wallet\")\n * }\n */\n async isChainMismatch(): Promise<boolean> {\n return this._engine.isChainMismatch();\n }\n\n /**\n * Returns metadata about the currently active connector.\n * Useful for displaying \"Connected via MetaMask\" in the UI.\n */\n getConnectorInfo(): ConnectorInfo {\n return this._engine.getConnectorInfo();\n }\n\n /**\n * Subscribe to wallet changes (connect, disconnect, account switch).\n * Returns an unsubscribe function — call it on cleanup.\n *\n * @example\n * const unsub = awarizon.onWalletChange(({ address, type, name }) => {\n * console.log(\"Wallet changed:\", address, type, name)\n * })\n * unsub() // stop listening\n */\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this._engine.onWalletChange(cb);\n }\n\n /**\n * Subscribe to chain changes (switchChain calls).\n * Returns an unsubscribe function.\n */\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this._engine.onChainChange(cb);\n }\n\n // ─── Contract API ───────────────────────────────────────────────────────────\n\n /**\n * Load a deployed contract and return a fully typed, ABI-powered instance.\n * Validates the API key on the first call — subsequent calls are instant.\n *\n * Results are cached by address — calling contract() twice with the same\n * address and ABI object returns the same instance without rebuilding.\n */\n async contract<TAbi extends Abi>(config: ContractConfig<TAbi>): Promise<ContractInstance> {\n await this._telemetry.ensureValidated();\n\n if (!config.address || !config.abi) {\n throw new Error('[awarizon/web3] awarizon.contract() requires both address and abi');\n }\n\n const key = config.address.toLowerCase();\n const cached = this._contractCache.get(key);\n if (cached && cached.abiRef === (config.abi as Abi)) return cached.instance;\n\n const instance = buildContractInstance(\n config.address,\n config.abi as Abi,\n this.publicClient,\n this._txEngine,\n this._telemetry,\n this.chain,\n );\n this._contractCache.set(key, { abiRef: config.abi as Abi, instance });\n return instance;\n }\n\n /**\n * Load multiple contracts in parallel. Validates the API key once, then\n * instantiates all contracts concurrently.\n *\n * @example\n * ```ts\n * const [token, staking, nft] = await awarizon.contracts([\n * { address: tokenAddr, abi: ERC20_ABI },\n * { address: stakingAddr, abi: STAKING_ABI },\n * { address: nftAddr, abi: ERC721_ABI },\n * ])\n * ```\n */\n async contracts(configs: Array<{ address: Address; abi: Abi }>): Promise<ContractInstance[]> {\n return Promise.all(configs.map(c => this.contract(c)));\n }\n\n /**\n * Call a read-only (view/pure) contract function directly without loading\n * a full contract instance. Best for one-off reads.\n *\n * @example\n * ```ts\n * const balance = await awarizon.read<bigint>({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"balanceOf\",\n * args: [userAddress],\n * })\n * ```\n */\n async read<T = unknown>(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n }): Promise<T> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.read({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n });\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result as T;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Execute a state-mutating contract function directly without loading a full\n * contract instance. Best for one-off writes.\n *\n * @example\n * ```ts\n * const { hash, receipt } = await awarizon.write({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"transfer\",\n * args: [recipient, 100n],\n * })\n * ```\n */\n async write(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n value?: bigint;\n gas?: bigint;\n }): Promise<TransactionResult> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.write({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n value: params.value,\n gas: params.gas,\n });\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Batch multiple read calls into a single RPC round-trip using multicall3.\n * Falls back to parallel individual reads on chains where multicall3 is\n * not deployed.\n *\n * @example\n * ```ts\n * const [balance, supply, allowance] = await awarizon.multicall([\n * { address: tokenAddr, abi: ERC20_ABI, method: \"balanceOf\", args: [userAddr] },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"totalSupply\" },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"allowance\", args: [userAddr, spenderAddr] },\n * ])\n * ```\n */\n async multicall(\n calls: Array<{ address: Address; abi: Abi; method: string; args?: unknown[] }>,\n ): Promise<unknown[]> {\n await this._telemetry.ensureValidated();\n\n const contracts = calls.map(c => ({\n address: c.address,\n abi: c.abi,\n functionName: c.method,\n args: (c.args ?? []) as readonly unknown[],\n }));\n\n try {\n // Single RPC round-trip via multicall3\n const results = await this.publicClient.multicall({\n contracts: contracts as any,\n allowFailure: false,\n });\n return results as unknown[];\n } catch {\n // Multicall3 not deployed on this chain — fall back to parallel reads\n return Promise.all(\n contracts.map(c =>\n this.publicClient.readContract(c as any),\n ),\n );\n }\n }\n\n // ─── ERC Standard Clients ───────────────────────────────────────────────────\n\n /**\n * Load an ERC-20 token with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const token = await awarizon.erc20(\"0x...\")\n * const balance = await token.balanceOf(userAddress)\n * const symbol = await token.symbol()\n * await token.transfer(recipient, 100n)\n * ```\n */\n async erc20(address: Address): Promise<Erc20Contract> {\n const instance = await this.contract({ address, abi: ERC20_ABI as unknown as Abi });\n return instance as unknown as Erc20Contract;\n }\n\n /**\n * Load an ERC-721 NFT contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const nft = await awarizon.erc721(\"0x...\")\n * const owner = await nft.ownerOf(1n)\n * const uri = await nft.tokenURI(1n)\n * await nft.transferFrom(from, to, 1n)\n * ```\n */\n async erc721(address: Address): Promise<Erc721Contract> {\n const instance = await this.contract({ address, abi: ERC721_ABI as unknown as Abi });\n return instance as unknown as Erc721Contract;\n }\n\n /**\n * Load an ERC-1155 multi-token contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const items = await awarizon.erc1155(\"0x...\")\n * const balance = await items.balanceOf(userAddress, 42n)\n * const uri = await items.uri(42n)\n * await items.safeTransferFrom(from, to, 42n, 1n, \"0x\")\n * ```\n */\n async erc1155(address: Address): Promise<Erc1155Contract> {\n const instance = await this.contract({ address, abi: ERC1155_ABI as unknown as Abi });\n return instance as unknown as Erc1155Contract;\n }\n\n // ─── Named Contract Registry ────────────────────────────────────────────────\n\n /**\n * Register a contract under a human-readable name.\n * After registering, use `awarizon.use(name)` anywhere instead of repeating\n * address + ABI every time.\n *\n * ```ts\n * awarizon.register(\"USDC\", { address: \"0x...\", abi: erc20Abi })\n * awarizon.register(\"Vault\", { address: \"0x...\", abi: vaultAbi })\n *\n * const usdc = await awarizon.use(\"USDC\")\n * const vault = await awarizon.use(\"Vault\")\n * ```\n */\n register(name: string, config: ContractRegistryEntry): this {\n this._registry.set(name, config);\n return this;\n }\n\n /**\n * Retrieve a previously registered contract by name.\n * Throws a descriptive error if the name was never registered.\n *\n * ```ts\n * const usdc = await awarizon.use(\"USDC\")\n * await usdc.transfer(recipient, 100n)\n * ```\n */\n async use(name: string): Promise<ContractInstance> {\n const config = this._registry.get(name);\n if (!config) {\n const registered = [...this._registry.keys()].join(', ') || 'none';\n throw new Error(\n `[awarizon/web3] Contract \"${name}\" is not registered.\\n` +\n `Call awarizon.register(\"${name}\", { address, abi }) first.\\n` +\n `Currently registered: ${registered}`,\n );\n }\n return this.contract(config);\n }\n\n /**\n * Remove a registered contract from the registry.\n *\n * ```ts\n * awarizon.unregister(\"USDC\")\n * ```\n */\n unregister(name: string): this {\n this._registry.delete(name);\n return this;\n }\n\n /**\n * Return all registered contract names.\n */\n registeredContracts(): string[] {\n return [...this._registry.keys()];\n }\n\n // ─── Accessors ──────────────────────────────────────────────────────────────\n\n get chainId(): number {\n return this.chain.id;\n }\n\n get isConnected(): boolean {\n return this._engine.isConnected();\n }\n\n /**\n * Flush pending telemetry and stop background timers.\n * Call when tearing down a long-lived SDK instance (e.g. on server shutdown).\n */\n async destroy(): Promise<void> {\n await this._telemetry.destroy();\n }\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -494,6 +494,7 @@ var AwarizonWeb3 = class {
|
|
|
494
494
|
() => this._engine.getWalletClient()
|
|
495
495
|
);
|
|
496
496
|
this._telemetry = new TelemetryClient(config.apiKey, config.baseUrl);
|
|
497
|
+
this._walletConnectProjectId = config.walletConnectProjectId;
|
|
497
498
|
this.wallet = new WalletProxy(
|
|
498
499
|
this._engine,
|
|
499
500
|
() => this._telemetry.ensureValidated()
|
|
@@ -526,6 +527,74 @@ var AwarizonWeb3 = class {
|
|
|
526
527
|
await this._engine.connectEIP1193(provider, connectorInfo);
|
|
527
528
|
return this;
|
|
528
529
|
}
|
|
530
|
+
/**
|
|
531
|
+
* Connect a mobile or desktop wallet using the WalletConnect v2 protocol.
|
|
532
|
+
* Opens a QR-code modal (or deeplink on mobile) so the user can scan with
|
|
533
|
+
* MetaMask, Rainbow, Trust Wallet, or any WalletConnect-compatible wallet.
|
|
534
|
+
*
|
|
535
|
+
* Requires `walletConnectProjectId` in the SDK config and the peer package:
|
|
536
|
+
* `npm install @walletconnect/ethereum-provider`
|
|
537
|
+
*
|
|
538
|
+
* @example
|
|
539
|
+
* ```ts
|
|
540
|
+
* const awarizon = new AwarizonWeb3({ chain: "base", apiKey: "...", walletConnectProjectId: "abc" })
|
|
541
|
+
* await awarizon.connectWalletConnect()
|
|
542
|
+
* ```
|
|
543
|
+
*/
|
|
544
|
+
/**
|
|
545
|
+
* Connect a wallet using the WalletConnect v2 protocol.
|
|
546
|
+
*
|
|
547
|
+
* When called from `<ConnectButton />`, the SDK handles QR display internally.
|
|
548
|
+
* When called manually, pass `onDisplayUri` to receive the WC URI and render
|
|
549
|
+
* your own QR code.
|
|
550
|
+
*
|
|
551
|
+
* Requires `walletConnectProjectId` in the SDK config.
|
|
552
|
+
*
|
|
553
|
+
* @example
|
|
554
|
+
* await awarizon.connectWalletConnect({
|
|
555
|
+
* onDisplayUri: (uri) => console.log("Show QR:", uri)
|
|
556
|
+
* })
|
|
557
|
+
*/
|
|
558
|
+
async connectWalletConnect(options) {
|
|
559
|
+
if (!this._walletConnectProjectId) {
|
|
560
|
+
throw new Error(
|
|
561
|
+
'[awarizon/web3] walletConnectProjectId is not configured. Pass it when creating the SDK: new AwarizonWeb3({ ..., walletConnectProjectId: "your_id" }).\nGet a free project ID at https://cloud.walletconnect.com'
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
let EthereumProvider;
|
|
565
|
+
try {
|
|
566
|
+
const load = new Function("id", "return import(id)");
|
|
567
|
+
EthereumProvider = (await load("@walletconnect/ethereum-provider")).default;
|
|
568
|
+
} catch {
|
|
569
|
+
throw new Error(
|
|
570
|
+
"[awarizon/web3] @walletconnect/ethereum-provider is not installed.\nRun: npm install @walletconnect/ethereum-provider"
|
|
571
|
+
);
|
|
572
|
+
}
|
|
573
|
+
const provider = await EthereumProvider.init({
|
|
574
|
+
projectId: this._walletConnectProjectId,
|
|
575
|
+
chains: [this.chain.id],
|
|
576
|
+
showQrModal: false,
|
|
577
|
+
// We render our own modal — set up onDisplayUri instead
|
|
578
|
+
optionalChains: [],
|
|
579
|
+
methods: ["eth_sendTransaction", "personal_sign", "eth_signTypedData_v4"],
|
|
580
|
+
events: ["chainChanged", "accountsChanged"]
|
|
581
|
+
});
|
|
582
|
+
if (options?.onDisplayUri) {
|
|
583
|
+
provider.on?.("display_uri", (...args) => {
|
|
584
|
+
options.onDisplayUri(args[0]);
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
await provider.connect();
|
|
588
|
+
await this.connectEIP1193Provider(provider, {
|
|
589
|
+
name: "WalletConnect",
|
|
590
|
+
icon: "https://avatars.githubusercontent.com/u/37784886"
|
|
591
|
+
});
|
|
592
|
+
return this;
|
|
593
|
+
}
|
|
594
|
+
/** The WalletConnect project ID passed at construction, if any */
|
|
595
|
+
get walletConnectProjectId() {
|
|
596
|
+
return this._walletConnectProjectId;
|
|
597
|
+
}
|
|
529
598
|
disconnectWallet() {
|
|
530
599
|
this._engine.disconnectExternal();
|
|
531
600
|
return this;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chains.ts","../src/contract.ts","../src/errors.ts","../src/telemetry.ts","../src/standards.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;AC/KO,IAAM,SAAA,GAAY;AAuBlB,IAAM,UAAA,GAAa;AAAA,EACxB,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,MAAA,EAAqB,iBAAiB,MAAA,EAAe,MAAA,EAAQ,EAAC,EAA0F,SAAS,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA,EAAG;AAAA,EACjN,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAqB,iBAAiB,MAAA,EAAe,MAAA,EAAQ,EAAC,EAA0F,SAAS,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA,EAAG;AAAA,EACjN,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,YAAqB,eAAA,EAAiB,MAAA,EAAe,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,WAAY,IAAA,EAAM,SAAA,EAAW,CAAA,EAAqD,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA,EAAG;AAAA,EACjN,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,aAAA,EAAqB,iBAAiB,MAAA,EAAe,MAAA,EAAQ,EAAC,EAA0F,SAAS,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,EAAE;AAAA,EACjN,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,WAAqB,eAAA,EAAiB,MAAA,EAAe,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,WAAY,IAAA,EAAM,SAAA,EAAW,CAAA,EAAqD,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,EAAE;AAAA,EACjN,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,aAAqB,eAAA,EAAiB,MAAA,EAAe,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,SAAY,IAAA,EAAM,SAAA,EAAW,CAAA,EAAqD,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,EAAE;AAAA,EACjN,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,eAAqB,eAAA,EAAiB,MAAA,EAAe,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,WAAY,IAAA,EAAM,SAAA,EAAW,CAAA,EAAqD,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,EAAE;AAAA,EACjN,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,kBAAA,EAAqB,eAAA,EAAiB,MAAA,EAAe,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,OAAA,EAAY,IAAA,EAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,UAAA,EAAa,IAAA,EAAM,SAAA,EAAW,CAAA,EAAa,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAK;AAAA,EACjN,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,cAAA,EAAqB,eAAA,EAAiB,YAAA,EAAe,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,MAAA,EAAY,MAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,EACnN,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,kBAAA,EAAqB,eAAA,EAAiB,YAAA,EAAe,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,MAAA,EAAY,MAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,EACnN,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAqB,iBAAiB,YAAA,EAAe,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,IAAA,EAAY,MAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,WAAW,CAAA,EAAe,OAAA,EAAS,EAAC,EAAE;AAAA,EAC9L,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,mBAAA,EAAqB,iBAAiB,YAAA,EAAe,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAW,CAAA,EAAc,OAAA,EAAS,EAAC,EAAE;AAAA,EAC9L,EAAE,IAAA,EAAM,OAAA,EAAY,IAAA,EAAM,UAAA,EAAqB,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,MAAM,SAAA,EAAU,EAAG,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,IAAA,EAAY,IAAA,EAAM,WAAU,EAAG,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAY,IAAA,EAAM,SAAA,EAAW,CAAA,EAAE;AAAA,EACtN,EAAE,IAAA,EAAM,OAAA,EAAY,IAAA,EAAM,UAAA,EAAqB,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,MAAM,SAAA,EAAU,EAAG,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,WAAU,EAAG,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAY,IAAA,EAAM,SAAA,EAAW,CAAA,EAAE;AAAA,EACvN,EAAE,IAAA,EAAM,OAAA,EAAY,IAAA,EAAM,gBAAA,EAAqB,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU,EAAG,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,CAAA;AACrM;AAuBO,IAAM,WAAA,GAAc;AAAA,EACzB,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,OAAyB,eAAA,EAAiB,MAAA,EAAc,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,MAAY,IAAA,EAAM,SAAA,EAAW,CAAA,EAAkJ,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA,EAAM;AAAA,EACpT,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,WAAA,EAAyB,eAAA,EAAiB,MAAA,EAAc,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,SAAA,EAAY,IAAA,EAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,IAAA,EAAY,IAAA,EAAM,SAAA,EAAW,CAAA,EAA2G,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,EAAK;AAAA,EACpT,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,gBAAA,EAAyB,eAAA,EAAiB,MAAA,EAAc,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,WAAA,EAAY,EAAG,EAAE,IAAA,EAAM,KAAA,EAAW,IAAA,EAAM,WAAA,EAAa,CAAA,EAAwG,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,WAAA,EAAa,CAAA,EAAG;AAAA,EACpT,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,kBAAA,EAAyB,eAAA,EAAiB,MAAA,EAAc,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,SAAA,EAAY,IAAA,EAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,UAAA,EAAa,IAAA,EAAM,SAAA,EAAW,CAAA,EAA0G,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAQ;AAAA,EACpT,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,mBAAA,EAAyB,iBAAiB,YAAA,EAAc,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,UAAA,EAAa,IAAA,EAAM,QAAW,CAAA,EAA0G,OAAA,EAAS,EAAC,EAAwB;AAAA,EACpT,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,kBAAA,EAAyB,eAAA,EAAiB,cAAc,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,MAAA,EAAY,MAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,IAAA,EAAa,MAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,MAAW,IAAA,EAAM,SAAA,IAAe,EAAE,IAAA,EAAM,UAAW,IAAA,EAAM,SAAA,IAAe,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,EACxS,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,uBAAA,EAAyB,eAAA,EAAiB,cAAc,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,MAAA,EAAY,MAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,IAAA,EAAa,MAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,OAAW,IAAA,EAAM,WAAA,IAAe,EAAE,IAAA,EAAM,WAAW,IAAA,EAAM,WAAA,IAAe,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,EACxS,EAAE,IAAA,EAAM,OAAA,EAAY,MAAM,gBAAA,EAAyB,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,MAAM,IAAA,EAAM,UAAA,EAAY,MAAM,SAAA,EAAU,EAAG,EAAE,OAAA,EAAS,IAAA,EAAM,MAAM,MAAA,EAAQ,IAAA,EAAM,WAAU,EAAG,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,MAAO,IAAA,EAAM,SAAA,IAAa,EAAE,IAAA,EAAM,MAAU,IAAA,EAAM,SAAA,IAAe,EAAE,IAAA,EAAM,SAAW,IAAA,EAAM,SAAA,EAAa,CAAA,EAAE;AAAA,EACpS,EAAE,IAAA,EAAM,OAAA,EAAY,MAAM,eAAA,EAAyB,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,MAAM,IAAA,EAAM,UAAA,EAAY,MAAM,SAAA,EAAU,EAAG,EAAE,OAAA,EAAS,IAAA,EAAM,MAAM,MAAA,EAAQ,IAAA,EAAM,WAAU,EAAG,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,MAAO,IAAA,EAAM,SAAA,IAAa,EAAE,IAAA,EAAM,OAAU,IAAA,EAAM,WAAA,IAAe,EAAE,IAAA,EAAM,UAAW,IAAA,EAAM,WAAA,EAAa,CAAA,EAAE;AAAA,EACpS,EAAE,IAAA,EAAM,OAAA,EAAY,IAAA,EAAM,gBAAA,EAAyB,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAY,IAAA,EAAM,SAAA,EAAU,EAAG,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,CAAA;AAC5M;ACEA,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,gBAAA,GAAwC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,gBAAA,EAAiB;AAAA,EAAG;AAAA,EAEjF,eAAA,CACE,GACA,IAAA,EACM;AAAE,IAAA,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgB,CAAA,EAAG,IAAI,CAAA;AAAA,EAAG;AAAA,EAEhD,kBAAA,GAA2B;AAAE,IAAA,IAAA,CAAK,OAAO,kBAAA,EAAmB;AAAA,EAAG;AAAA,EAC/D,UAAA,GAA2B;AAAE,IAAA,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,EAAG;AAAA,EAEvD,MAAM,YAAY,KAAA,EAA6B;AAC7C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,KAAK,CAAA;AAAA,EACtC;AAAA;AAAA,EAIA,MAAM,cAAA,CACJ,QAAA,EACA,IAAA,EACe;AACf,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,QAAA,EAAU,IAAI,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,YAAY,OAAA,EAA2D;AAC3E,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,cAAc,MAAA,EAA2C;AAC7D,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,MAAM,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,UAAA,GAAkC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,EAAG;AAAA,EAC3E,MAAM,eAAA,GAAoC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,eAAA,EAAgB;AAAA,EAAG;AAAA;AAAA,EAIlF,eAAe,EAAA,EAAoD;AACjE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,EAAE,CAAA;AAAA,EACtC;AAAA,EAEA,cAAc,EAAA,EAAmD;AAC/D,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,EAAE,CAAA;AAAA,EACrC;AACF,CAAA;AAqBO,IAAM,eAAN,MAAmB;AAAA,EAkBxB,YAAY,MAAA,EAAwB;AALpC;AAAA;AAAA,IAAA,IAAA,CAAQ,cAAA,uBAAqB,GAAA,EAAyD;AAGtF;AAAA,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAmC;AAGzD,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,aAAA,CACE,cACA,aAAA,EACM;AACN,IAAA,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,YAAA,EAAc,aAAa,CAAA;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,sBAAA,CACJ,QAAA,EACA,aAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,WAAW,eAAA,EAAgB;AACtC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,QAAA,EAAU,aAAa,CAAA;AACzD,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,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAiB;AAC3C,IAAA,OAAO;AAAA,MACL,OAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAQ;AAAA,MACpC,OAAe,IAAA,CAAK,KAAA;AAAA,MACpB,UAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAkB;AAAA,MAC9C,eAAe,IAAA,CAAK;AAAA,KACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAY,OAAA,EAA2D;AAC3E,IAAA,MAAM,IAAA,CAAK,WAAW,eAAA,EAAgB;AACtC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,cAAc,MAAA,EAA2C;AAC7D,IAAA,MAAM,IAAA,CAAK,WAAW,eAAA,EAAgB;AACtC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,GAA8B;AAClC,IAAA,OAAO,IAAA,CAAK,QAAQ,UAAA,EAAW;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,eAAA,GAAoC;AACxC,IAAA,OAAO,IAAA,CAAK,QAAQ,eAAA,EAAgB;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,QAAQ,gBAAA,EAAiB;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,eAAe,EAAA,EAAoD;AACjE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,EAAE,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,EAAA,EAAmD;AAC/D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,EAAE,CAAA;AAAA,EACtC;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,MAAM,OAAA,EAA0C;AACpD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,OAAA,EAAS,GAAA,EAAK,WAA6B,CAAA;AAClF,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAO,OAAA,EAA2C;AACtD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,OAAA,EAAS,GAAA,EAAK,YAA8B,CAAA;AACnF,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,QAAQ,OAAA,EAA4C;AACxD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,OAAA,EAAS,GAAA,EAAK,aAA+B,CAAA;AACpF,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,QAAA,CAAS,MAAc,MAAA,EAAqC;AAC1D,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,IAAI,IAAA,EAAyC;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,MAAA;AAC5D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,6BAA6B,IAAI,CAAA;AAAA,wBAAA,EACN,IAAI,CAAA;AAAA,sBAAA,EACN,UAAU,CAAA;AAAA,OACrC;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,IAAA,EAAoB;AAC7B,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,IAAI,CAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAAgC;AAC9B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,EAClC;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 { erc20Abi, type Address, type Abi } from 'viem';\nimport type { ContractInstance, TransactionResult } from './types';\n\n// ─── ERC-20 ───────────────────────────────────────────────────────────────────\n\nexport const ERC20_ABI = erc20Abi;\n\nexport interface Erc20Contract {\n name(): Promise<string>;\n symbol(): Promise<string>;\n decimals(): Promise<number>;\n totalSupply(): Promise<bigint>;\n balanceOf(owner: Address): Promise<bigint>;\n allowance(owner: Address, spender: Address): Promise<bigint>;\n transfer(to: Address, amount: bigint): Promise<TransactionResult>;\n transferFrom(from: Address, to: Address, amount: bigint): Promise<TransactionResult>;\n approve(spender: Address, amount: bigint): Promise<TransactionResult>;\n on: ContractInstance['on'];\n estimateGas: ContractInstance['estimateGas'];\n readonly _address: Address;\n readonly _abi: Abi;\n}\n\n// ─── ERC-721 ──────────────────────────────────────────────────────────────────\n// Single safeTransferFrom overload (3-arg) to avoid ABI duplicate conflicts.\n// Includes tokenURI + totalSupply (ERC721Metadata / ERC721Enumerable extensions\n// present on virtually every deployed NFT contract).\n\nexport const ERC721_ABI = [\n { type: 'function', name: 'name', stateMutability: 'view', inputs: [], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'symbol', stateMutability: 'view', inputs: [], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'tokenURI', stateMutability: 'view', inputs: [{ name: 'tokenId', type: 'uint256' }], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'totalSupply', stateMutability: 'view', inputs: [], outputs: [{ type: 'uint256' }] },\n { type: 'function', name: 'ownerOf', stateMutability: 'view', inputs: [{ name: 'tokenId', type: 'uint256' }], outputs: [{ type: 'address' }] },\n { type: 'function', name: 'balanceOf', stateMutability: 'view', inputs: [{ name: 'owner', type: 'address' }], outputs: [{ type: 'uint256' }] },\n { type: 'function', name: 'getApproved', stateMutability: 'view', inputs: [{ name: 'tokenId', type: 'uint256' }], outputs: [{ type: 'address' }] },\n { type: 'function', name: 'isApprovedForAll', stateMutability: 'view', inputs: [{ name: 'owner', type: 'address' }, { name: 'operator', type: 'address' }], outputs: [{ type: 'bool' }] },\n { type: 'function', name: 'transferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'tokenId', type: 'uint256' }], outputs: [] },\n { type: 'function', name: 'safeTransferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'tokenId', type: 'uint256' }], outputs: [] },\n { type: 'function', name: 'approve', stateMutability: 'nonpayable', inputs: [{ name: 'to', type: 'address' }, { name: 'tokenId', type: 'uint256' }], outputs: [] },\n { type: 'function', name: 'setApprovalForAll', stateMutability: 'nonpayable', inputs: [{ name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }], outputs: [] },\n { type: 'event', name: 'Transfer', inputs: [{ indexed: true, name: 'from', type: 'address' }, { indexed: true, name: 'to', type: 'address' }, { indexed: true, name: 'tokenId', type: 'uint256' }] },\n { type: 'event', name: 'Approval', inputs: [{ indexed: true, name: 'owner', type: 'address' }, { indexed: true, name: 'approved', type: 'address' }, { indexed: true, name: 'tokenId', type: 'uint256' }] },\n { type: 'event', name: 'ApprovalForAll', inputs: [{ indexed: true, name: 'owner', type: 'address' }, { indexed: true, name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }] },\n] as const;\n\nexport interface Erc721Contract {\n name(): Promise<string>;\n symbol(): Promise<string>;\n tokenURI(tokenId: bigint): Promise<string>;\n totalSupply(): Promise<bigint>;\n ownerOf(tokenId: bigint): Promise<Address>;\n balanceOf(owner: Address): Promise<bigint>;\n getApproved(tokenId: bigint): Promise<Address>;\n isApprovedForAll(owner: Address, operator: Address): Promise<boolean>;\n transferFrom(from: Address, to: Address, tokenId: bigint): Promise<TransactionResult>;\n safeTransferFrom(from: Address, to: Address, tokenId: bigint): Promise<TransactionResult>;\n approve(to: Address, tokenId: bigint): Promise<TransactionResult>;\n setApprovalForAll(operator: Address, approved: boolean): Promise<TransactionResult>;\n on: ContractInstance['on'];\n estimateGas: ContractInstance['estimateGas'];\n readonly _address: Address;\n readonly _abi: Abi;\n}\n\n// ─── ERC-1155 ─────────────────────────────────────────────────────────────────\n\nexport const ERC1155_ABI = [\n { type: 'function', name: 'uri', stateMutability: 'view', inputs: [{ name: 'id', type: 'uint256' }], outputs: [{ type: 'string' }] },\n { type: 'function', name: 'balanceOf', stateMutability: 'view', inputs: [{ name: 'account', type: 'address' }, { name: 'id', type: 'uint256' }], outputs: [{ type: 'uint256' }] },\n { type: 'function', name: 'balanceOfBatch', stateMutability: 'view', inputs: [{ name: 'accounts', type: 'address[]' }, { name: 'ids', type: 'uint256[]' }], outputs: [{ type: 'uint256[]' }] },\n { type: 'function', name: 'isApprovedForAll', stateMutability: 'view', inputs: [{ name: 'account', type: 'address' }, { name: 'operator', type: 'address' }], outputs: [{ type: 'bool' }] },\n { type: 'function', name: 'setApprovalForAll', stateMutability: 'nonpayable', inputs: [{ name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }], outputs: [] },\n { type: 'function', name: 'safeTransferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'id', type: 'uint256' }, { name: 'amount', type: 'uint256' }, { name: 'data', type: 'bytes' }], outputs: [] },\n { type: 'function', name: 'safeBatchTransferFrom', stateMutability: 'nonpayable', inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'ids', type: 'uint256[]' }, { name: 'amounts', type: 'uint256[]' }, { name: 'data', type: 'bytes' }], outputs: [] },\n { type: 'event', name: 'TransferSingle', inputs: [{ indexed: true, name: 'operator', type: 'address' }, { indexed: true, name: 'from', type: 'address' }, { indexed: true, name: 'to', type: 'address' }, { name: 'id', type: 'uint256' }, { name: 'value', type: 'uint256' }] },\n { type: 'event', name: 'TransferBatch', inputs: [{ indexed: true, name: 'operator', type: 'address' }, { indexed: true, name: 'from', type: 'address' }, { indexed: true, name: 'to', type: 'address' }, { name: 'ids', type: 'uint256[]' }, { name: 'values', type: 'uint256[]' }] },\n { type: 'event', name: 'ApprovalForAll', inputs: [{ indexed: true, name: 'account', type: 'address' }, { indexed: true, name: 'operator', type: 'address' }, { name: 'approved', type: 'bool' }] },\n] as const;\n\nexport interface Erc1155Contract {\n uri(id: bigint): Promise<string>;\n balanceOf(account: Address, id: bigint): Promise<bigint>;\n balanceOfBatch(accounts: Address[], ids: bigint[]): Promise<bigint[]>;\n isApprovedForAll(account: Address, operator: Address): Promise<boolean>;\n setApprovalForAll(operator: Address, approved: boolean): Promise<TransactionResult>;\n safeTransferFrom(from: Address, to: Address, id: bigint, amount: bigint, data: `0x${string}`): Promise<TransactionResult>;\n safeBatchTransferFrom(from: Address, to: Address, ids: bigint[], amounts: bigint[], data: `0x${string}`): Promise<TransactionResult>;\n on: ContractInstance['on'];\n estimateGas: ContractInstance['estimateGas'];\n readonly _address: Address;\n readonly _abi: Abi;\n}\n","import {\n createPublicClient,\n http,\n type Chain,\n type WalletClient,\n type PublicClient,\n type Address,\n type Abi,\n type Hex,\n} from 'viem';\nimport { WalletEngine } from '@awarizon/wallet-engine';\nimport type {\n CreatedWallet,\n ImportedWalletFromMnemonic,\n ImportedWalletFromPrivateKey,\n ExternalWalletClient,\n EIP1193Provider,\n ConnectorInfo,\n WalletChangeEvent,\n ChainChangeEvent,\n SignTypedDataParams,\n} from '@awarizon/wallet-engine';\nimport { TransactionEngine } from '@awarizon/tx-engine';\nimport type { TransactionResult } from '@awarizon/tx-engine';\nimport { resolveChain } 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 ChainMismatchError,\n} from '@awarizon/wallet-engine';\n\nexport {\n ContractExecutionError,\n SimulationError,\n GasEstimationError,\n} from '@awarizon/tx-engine';\n\nexport {\n InvalidABIError,\n} from '@awarizon/abi-engine';\n\nexport {\n NetworkMismatchError,\n ProviderError,\n ContractNotLoadedError,\n UnsupportedChainError,\n ApiKeyRequiredError,\n InvalidApiKeyError,\n} from './errors';\n\n// ─── WalletProxy ──────────────────────────────────────────────────────────────\n\n/**\n * Wraps WalletEngine and gates mutating operations (create, import) behind\n * API key validation. Read-only operations (address, isConnected, etc.) are\n * never gated since they need no network access.\n */\nclass WalletProxy {\n constructor(\n private readonly engine: WalletEngine,\n private readonly ensureReady: () => Promise<void>,\n ) {}\n\n // ── Gated async operations ──────────────────────────────────────────────────\n\n async create(): Promise<CreatedWallet> {\n await this.ensureReady();\n return this.engine.create();\n }\n\n async importMnemonic(\n mnemonic: string,\n 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 getConnectorInfo(): ConnectorInfo { return this.engine.getConnectorInfo(); }\n\n connectExternal(\n c: ExternalWalletClient,\n info?: { name?: string; icon?: string },\n ): void { this.engine.connectExternal(c, info); }\n\n disconnectExternal(): void { this.engine.disconnectExternal(); }\n disconnect(): void { this.engine.disconnect(); }\n\n async switchChain(chain: Chain): Promise<void> {\n return this.engine.switchChain(chain);\n }\n\n // ── Gated async — EIP-1193, signing, chain awareness ───────────────────────\n\n async connectEIP1193(\n provider: EIP1193Provider,\n info?: { name?: string; icon?: string },\n ): Promise<void> {\n await this.ensureReady();\n return this.engine.connectEIP1193(provider, info);\n }\n\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signMessage(message);\n }\n\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signTypedData(params);\n }\n\n async getChainId(): Promise<number> { return this.engine.getChainId(); }\n async isChainMismatch(): Promise<boolean> { return this.engine.isChainMismatch(); }\n\n // ── Event subscriptions ────────────────────────────────────────────────────\n\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this.engine.onWalletChange(cb);\n }\n\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this.engine.onChainChange(cb);\n }\n}\n\n// ─── AwarizonWeb3 ─────────────────────────────────────────────────────────────\n\n/**\n * Primary entry point for the Awarizon Web3 SDK.\n *\n * An API key is required — get yours at https://awarizon.com/dashboard/api-keys\n *\n * ```ts\n * const awarizon = new AwarizonWeb3({ chain: \"base\", apiKey: \"awz_live_...\" })\n *\n * // Internal wallet\n * const wallet = await awarizon.wallet.create()\n *\n * // Load a contract\n * const staking = await awarizon.contract({ address: \"0x...\", abi })\n * await staking.stake(100n)\n * staking.on(\"Staked\", (log) => console.log(log))\n * ```\n */\nexport class AwarizonWeb3 {\n readonly chain: Chain;\n readonly publicClient: PublicClient;\n\n /** Wallet management — create, import, or connect external wallets */\n readonly wallet: WalletProxy;\n\n 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 /**\n * Connect any viem WalletClient (wagmi, RainbowKit, custom).\n * Optionally pass connector metadata to display in the UI.\n *\n * @example\n * awarizon.connectWallet(walletClient, { name: \"MetaMask\" })\n */\n connectWallet(\n walletClient: WalletClient,\n connectorInfo?: { name?: string; icon?: string },\n ): this {\n this._engine.connectExternal(walletClient, connectorInfo);\n return this;\n }\n\n /**\n * Connect directly from a raw EIP-1193 provider without needing wagmi.\n * Works with window.ethereum, WalletConnect v2, and any EIP-1193 object.\n *\n * @example\n * await awarizon.connectEIP1193Provider(window.ethereum, { name: \"MetaMask\" })\n */\n async connectEIP1193Provider(\n provider: EIP1193Provider,\n connectorInfo?: { name?: string; icon?: string },\n ): Promise<this> {\n await this._telemetry.ensureValidated();\n await this._engine.connectEIP1193(provider, connectorInfo);\n return this;\n }\n\n disconnectWallet(): this {\n this._engine.disconnectExternal();\n return this;\n }\n\n async switchChain(chain: Chain | string): Promise<this> {\n await this._telemetry.ensureValidated();\n const resolved = resolveChain(chain);\n await this._engine.switchChain(resolved);\n this._contractCache.clear(); // contracts are chain-specific\n return this;\n }\n\n getWalletInfo(): SDKWalletInfo {\n const info = this._engine.getConnectorInfo();\n return {\n address: this._engine.address(),\n chain: this.chain,\n isExternal: this._engine.hasExternalWallet(),\n connectorName: info.name,\n };\n }\n\n /**\n * Sign a plain text or raw-bytes message.\n * Use for Sign-In with Ethereum (SIWE) and off-chain authorization.\n *\n * @example\n * const sig = await awarizon.signMessage(\"Hello, Awarizon!\")\n */\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signMessage(message);\n }\n\n /**\n * Sign EIP-712 typed structured data (permit2, SIWE, Seaport orders, etc.).\n *\n * @example\n * const sig = await awarizon.signTypedData({\n * domain: { name: \"MyApp\", version: \"1\", chainId: 8453 },\n * types: { Transfer: [{ name: \"to\", type: \"address\" }, { name: \"amount\", type: \"uint256\" }] },\n * primaryType: \"Transfer\",\n * message: { to: \"0x...\", amount: \"1000000\" },\n * })\n */\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signTypedData(params);\n }\n\n /**\n * Returns the chain ID the active wallet is currently on.\n * For external wallets this may differ from the SDK's configured chain.\n */\n async getChainId(): Promise<number> {\n return this._engine.getChainId();\n }\n\n /**\n * Returns true when the external wallet is on a different chain than the SDK.\n * Use this to show a \"wrong network\" banner in your UI.\n *\n * @example\n * if (await awarizon.isChainMismatch()) {\n * alert(\"Please switch to Base in your wallet\")\n * }\n */\n async isChainMismatch(): Promise<boolean> {\n return this._engine.isChainMismatch();\n }\n\n /**\n * Returns metadata about the currently active connector.\n * Useful for displaying \"Connected via MetaMask\" in the UI.\n */\n getConnectorInfo(): ConnectorInfo {\n return this._engine.getConnectorInfo();\n }\n\n /**\n * Subscribe to wallet changes (connect, disconnect, account switch).\n * Returns an unsubscribe function — call it on cleanup.\n *\n * @example\n * const unsub = awarizon.onWalletChange(({ address, type, name }) => {\n * console.log(\"Wallet changed:\", address, type, name)\n * })\n * unsub() // stop listening\n */\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this._engine.onWalletChange(cb);\n }\n\n /**\n * Subscribe to chain changes (switchChain calls).\n * Returns an unsubscribe function.\n */\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this._engine.onChainChange(cb);\n }\n\n // ─── Contract API ───────────────────────────────────────────────────────────\n\n /**\n * Load a deployed contract and return a fully typed, ABI-powered instance.\n * Validates the API key on the first call — subsequent calls are instant.\n *\n * Results are cached by address — calling contract() twice with the same\n * address and ABI object returns the same instance without rebuilding.\n */\n async contract<TAbi extends Abi>(config: ContractConfig<TAbi>): Promise<ContractInstance> {\n await this._telemetry.ensureValidated();\n\n if (!config.address || !config.abi) {\n throw new Error('[awarizon/web3] awarizon.contract() requires both address and abi');\n }\n\n const key = config.address.toLowerCase();\n const cached = this._contractCache.get(key);\n if (cached && cached.abiRef === (config.abi as Abi)) return cached.instance;\n\n const instance = buildContractInstance(\n config.address,\n config.abi as Abi,\n this.publicClient,\n this._txEngine,\n this._telemetry,\n this.chain,\n );\n this._contractCache.set(key, { abiRef: config.abi as Abi, instance });\n return instance;\n }\n\n /**\n * Load multiple contracts in parallel. Validates the API key once, then\n * instantiates all contracts concurrently.\n *\n * @example\n * ```ts\n * const [token, staking, nft] = await awarizon.contracts([\n * { address: tokenAddr, abi: ERC20_ABI },\n * { address: stakingAddr, abi: STAKING_ABI },\n * { address: nftAddr, abi: ERC721_ABI },\n * ])\n * ```\n */\n async contracts(configs: Array<{ address: Address; abi: Abi }>): Promise<ContractInstance[]> {\n return Promise.all(configs.map(c => this.contract(c)));\n }\n\n /**\n * Call a read-only (view/pure) contract function directly without loading\n * a full contract instance. Best for one-off reads.\n *\n * @example\n * ```ts\n * const balance = await awarizon.read<bigint>({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"balanceOf\",\n * args: [userAddress],\n * })\n * ```\n */\n async read<T = unknown>(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n }): Promise<T> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.read({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n });\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result as T;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Execute a state-mutating contract function directly without loading a full\n * contract instance. Best for one-off writes.\n *\n * @example\n * ```ts\n * const { hash, receipt } = await awarizon.write({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"transfer\",\n * args: [recipient, 100n],\n * })\n * ```\n */\n async write(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n value?: bigint;\n gas?: bigint;\n }): Promise<TransactionResult> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.write({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n value: params.value,\n gas: params.gas,\n });\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Batch multiple read calls into a single RPC round-trip using multicall3.\n * Falls back to parallel individual reads on chains where multicall3 is\n * not deployed.\n *\n * @example\n * ```ts\n * const [balance, supply, allowance] = await awarizon.multicall([\n * { address: tokenAddr, abi: ERC20_ABI, method: \"balanceOf\", args: [userAddr] },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"totalSupply\" },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"allowance\", args: [userAddr, spenderAddr] },\n * ])\n * ```\n */\n async multicall(\n calls: Array<{ address: Address; abi: Abi; method: string; args?: unknown[] }>,\n ): Promise<unknown[]> {\n await this._telemetry.ensureValidated();\n\n const contracts = calls.map(c => ({\n address: c.address,\n abi: c.abi,\n functionName: c.method,\n args: (c.args ?? []) as readonly unknown[],\n }));\n\n try {\n // Single RPC round-trip via multicall3\n const results = await this.publicClient.multicall({\n contracts: contracts as any,\n allowFailure: false,\n });\n return results as unknown[];\n } catch {\n // Multicall3 not deployed on this chain — fall back to parallel reads\n return Promise.all(\n contracts.map(c =>\n this.publicClient.readContract(c as any),\n ),\n );\n }\n }\n\n // ─── ERC Standard Clients ───────────────────────────────────────────────────\n\n /**\n * Load an ERC-20 token with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const token = await awarizon.erc20(\"0x...\")\n * const balance = await token.balanceOf(userAddress)\n * const symbol = await token.symbol()\n * await token.transfer(recipient, 100n)\n * ```\n */\n async erc20(address: Address): Promise<Erc20Contract> {\n const instance = await this.contract({ address, abi: ERC20_ABI as unknown as Abi });\n return instance as unknown as Erc20Contract;\n }\n\n /**\n * Load an ERC-721 NFT contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const nft = await awarizon.erc721(\"0x...\")\n * const owner = await nft.ownerOf(1n)\n * const uri = await nft.tokenURI(1n)\n * await nft.transferFrom(from, to, 1n)\n * ```\n */\n async erc721(address: Address): Promise<Erc721Contract> {\n const instance = await this.contract({ address, abi: ERC721_ABI as unknown as Abi });\n return instance as unknown as Erc721Contract;\n }\n\n /**\n * Load an ERC-1155 multi-token contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const items = await awarizon.erc1155(\"0x...\")\n * const balance = await items.balanceOf(userAddress, 42n)\n * const uri = await items.uri(42n)\n * await items.safeTransferFrom(from, to, 42n, 1n, \"0x\")\n * ```\n */\n async erc1155(address: Address): Promise<Erc1155Contract> {\n const instance = await this.contract({ address, abi: ERC1155_ABI as unknown as Abi });\n return instance as unknown as Erc1155Contract;\n }\n\n // ─── Named Contract Registry ────────────────────────────────────────────────\n\n /**\n * Register a contract under a human-readable name.\n * After registering, use `awarizon.use(name)` anywhere instead of repeating\n * address + ABI every time.\n *\n * ```ts\n * awarizon.register(\"USDC\", { address: \"0x...\", abi: erc20Abi })\n * awarizon.register(\"Vault\", { address: \"0x...\", abi: vaultAbi })\n *\n * const usdc = await awarizon.use(\"USDC\")\n * const vault = await awarizon.use(\"Vault\")\n * ```\n */\n register(name: string, config: ContractRegistryEntry): this {\n this._registry.set(name, config);\n return this;\n }\n\n /**\n * Retrieve a previously registered contract by name.\n * Throws a descriptive error if the name was never registered.\n *\n * ```ts\n * const usdc = await awarizon.use(\"USDC\")\n * await usdc.transfer(recipient, 100n)\n * ```\n */\n async use(name: string): Promise<ContractInstance> {\n const config = this._registry.get(name);\n if (!config) {\n const registered = [...this._registry.keys()].join(', ') || 'none';\n throw new Error(\n `[awarizon/web3] Contract \"${name}\" is not registered.\\n` +\n `Call awarizon.register(\"${name}\", { address, abi }) first.\\n` +\n `Currently registered: ${registered}`,\n );\n }\n return this.contract(config);\n }\n\n /**\n * Remove a registered contract from the registry.\n *\n * ```ts\n * awarizon.unregister(\"USDC\")\n * ```\n */\n unregister(name: string): this {\n this._registry.delete(name);\n return this;\n }\n\n /**\n * Return all registered contract names.\n */\n registeredContracts(): string[] {\n return [...this._registry.keys()];\n }\n\n // ─── Accessors ──────────────────────────────────────────────────────────────\n\n get chainId(): number {\n return this.chain.id;\n }\n\n get isConnected(): boolean {\n return this._engine.isConnected();\n }\n\n /**\n * Flush pending telemetry and stop background timers.\n * Call when tearing down a long-lived SDK instance (e.g. on server shutdown).\n */\n async destroy(): Promise<void> {\n await this._telemetry.destroy();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../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 EIP1193Provider,\n ConnectorInfo,\n WalletChangeEvent,\n ChainChangeEvent,\n SignTypedDataParams,\n} from '@awarizon/wallet-engine';\nimport { TransactionEngine } from '@awarizon/tx-engine';\nimport type { TransactionResult } from '@awarizon/tx-engine';\nimport { resolveChain } 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 ChainMismatchError,\n} from '@awarizon/wallet-engine';\n\nexport {\n ContractExecutionError,\n SimulationError,\n GasEstimationError,\n} from '@awarizon/tx-engine';\n\nexport {\n InvalidABIError,\n} from '@awarizon/abi-engine';\n\nexport {\n NetworkMismatchError,\n ProviderError,\n ContractNotLoadedError,\n UnsupportedChainError,\n ApiKeyRequiredError,\n InvalidApiKeyError,\n} from './errors';\n\n// ─── WalletProxy ──────────────────────────────────────────────────────────────\n\n/**\n * Wraps WalletEngine and gates mutating operations (create, import) behind\n * API key validation. Read-only operations (address, isConnected, etc.) are\n * never gated since they need no network access.\n */\nclass WalletProxy {\n constructor(\n private readonly engine: WalletEngine,\n private readonly ensureReady: () => Promise<void>,\n ) {}\n\n // ── Gated async operations ──────────────────────────────────────────────────\n\n async create(): Promise<CreatedWallet> {\n await this.ensureReady();\n return this.engine.create();\n }\n\n async importMnemonic(\n mnemonic: string,\n 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 getConnectorInfo(): ConnectorInfo { return this.engine.getConnectorInfo(); }\n\n connectExternal(\n c: ExternalWalletClient,\n info?: { name?: string; icon?: string },\n ): void { this.engine.connectExternal(c, info); }\n\n disconnectExternal(): void { this.engine.disconnectExternal(); }\n disconnect(): void { this.engine.disconnect(); }\n\n async switchChain(chain: Chain): Promise<void> {\n return this.engine.switchChain(chain);\n }\n\n // ── Gated async — EIP-1193, signing, chain awareness ───────────────────────\n\n async connectEIP1193(\n provider: EIP1193Provider,\n info?: { name?: string; icon?: string },\n ): Promise<void> {\n await this.ensureReady();\n return this.engine.connectEIP1193(provider, info);\n }\n\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signMessage(message);\n }\n\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this.ensureReady();\n return this.engine.signTypedData(params);\n }\n\n async getChainId(): Promise<number> { return this.engine.getChainId(); }\n async isChainMismatch(): Promise<boolean> { return this.engine.isChainMismatch(); }\n\n // ── Event subscriptions ────────────────────────────────────────────────────\n\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this.engine.onWalletChange(cb);\n }\n\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this.engine.onChainChange(cb);\n }\n}\n\n// ─── AwarizonWeb3 ─────────────────────────────────────────────────────────────\n\n/**\n * Primary entry point for the Awarizon Web3 SDK.\n *\n * An API key is required — get yours at https://awarizon.com/dashboard/api-keys\n *\n * ```ts\n * const awarizon = new AwarizonWeb3({ chain: \"base\", apiKey: \"awz_live_...\" })\n *\n * // Internal wallet\n * const wallet = await awarizon.wallet.create()\n *\n * // Load a contract\n * const staking = await awarizon.contract({ address: \"0x...\", abi })\n * await staking.stake(100n)\n * staking.on(\"Staked\", (log) => console.log(log))\n * ```\n */\nexport class AwarizonWeb3 {\n readonly chain: Chain;\n readonly publicClient: PublicClient;\n\n /** Wallet management — create, import, or connect external wallets */\n readonly wallet: WalletProxy;\n\n private readonly _engine: WalletEngine;\n private readonly _txEngine: TransactionEngine;\n private readonly _telemetry: TelemetryClient;\n private readonly _walletConnectProjectId: string | undefined;\n\n // Contract instances are cached by address — same address returns same instance.\n // Cache is cleared on switchChain() since contracts are chain-specific.\n private _contractCache = new Map<string, { abiRef: Abi; instance: ContractInstance }>();\n\n // Named contract registry — register once, reference by name anywhere.\n private _registry = new Map<string, ContractRegistryEntry>();\n\n constructor(config: AwarizonConfig) {\n if (!config.apiKey) throw new ApiKeyRequiredError();\n\n this.chain = resolveChain(config.chain);\n\n this.publicClient = createPublicClient({\n chain: this.chain,\n transport: 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 this._walletConnectProjectId = config.walletConnectProjectId;\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 /**\n * Connect any viem WalletClient (wagmi, RainbowKit, custom).\n * Optionally pass connector metadata to display in the UI.\n *\n * @example\n * awarizon.connectWallet(walletClient, { name: \"MetaMask\" })\n */\n connectWallet(\n walletClient: WalletClient,\n connectorInfo?: { name?: string; icon?: string },\n ): this {\n this._engine.connectExternal(walletClient, connectorInfo);\n return this;\n }\n\n /**\n * Connect directly from a raw EIP-1193 provider without needing wagmi.\n * Works with window.ethereum, WalletConnect v2, and any EIP-1193 object.\n *\n * @example\n * await awarizon.connectEIP1193Provider(window.ethereum, { name: \"MetaMask\" })\n */\n async connectEIP1193Provider(\n provider: EIP1193Provider,\n connectorInfo?: { name?: string; icon?: string },\n ): Promise<this> {\n await this._telemetry.ensureValidated();\n await this._engine.connectEIP1193(provider, connectorInfo);\n return this;\n }\n\n /**\n * Connect a mobile or desktop wallet using the WalletConnect v2 protocol.\n * Opens a QR-code modal (or deeplink on mobile) so the user can scan with\n * MetaMask, Rainbow, Trust Wallet, or any WalletConnect-compatible wallet.\n *\n * Requires `walletConnectProjectId` in the SDK config and the peer package:\n * `npm install @walletconnect/ethereum-provider`\n *\n * @example\n * ```ts\n * const awarizon = new AwarizonWeb3({ chain: \"base\", apiKey: \"...\", walletConnectProjectId: \"abc\" })\n * await awarizon.connectWalletConnect()\n * ```\n */\n /**\n * Connect a wallet using the WalletConnect v2 protocol.\n *\n * When called from `<ConnectButton />`, the SDK handles QR display internally.\n * When called manually, pass `onDisplayUri` to receive the WC URI and render\n * your own QR code.\n *\n * Requires `walletConnectProjectId` in the SDK config.\n *\n * @example\n * await awarizon.connectWalletConnect({\n * onDisplayUri: (uri) => console.log(\"Show QR:\", uri)\n * })\n */\n async connectWalletConnect(options?: {\n /** Called with the WalletConnect URI as soon as it's ready — render it as a QR code. */\n onDisplayUri?: (uri: string) => void;\n }): Promise<this> {\n if (!this._walletConnectProjectId) {\n throw new Error(\n '[awarizon/web3] walletConnectProjectId is not configured. ' +\n 'Pass it when creating the SDK: new AwarizonWeb3({ ..., walletConnectProjectId: \"your_id\" }).\\n' +\n 'Get a free project ID at https://cloud.walletconnect.com',\n );\n }\n\n // Minimal interface — matches the actual WalletConnect EthereumProvider shape\n type WCProvider = EIP1193Provider & { connect(): Promise<void> };\n interface WCProviderClass {\n init(opts: {\n projectId: string;\n chains: number[];\n showQrModal: boolean;\n optionalChains?: number[];\n methods?: string[];\n events?: string[];\n }): Promise<WCProvider>;\n }\n\n let EthereumProvider: WCProviderClass;\n try {\n // Function constructor keeps the import string opaque to TypeScript's DTS pass\n // so the optional peer dep doesn't cause \"module not found\" errors at build time.\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<{ default: WCProviderClass }>;\n EthereumProvider = (await load('@walletconnect/ethereum-provider')).default;\n } catch {\n throw new Error(\n '[awarizon/web3] @walletconnect/ethereum-provider is not installed.\\n' +\n 'Run: npm install @walletconnect/ethereum-provider',\n );\n }\n\n const provider = await EthereumProvider.init({\n projectId: this._walletConnectProjectId,\n chains: [this.chain.id],\n showQrModal: false, // We render our own modal — set up onDisplayUri instead\n optionalChains: [],\n methods: ['eth_sendTransaction', 'personal_sign', 'eth_signTypedData_v4'],\n events: ['chainChanged', 'accountsChanged'],\n });\n\n // Register display_uri BEFORE connect() so we catch the event synchronously\n if (options?.onDisplayUri) {\n provider.on?.('display_uri', (...args: unknown[]) => {\n options.onDisplayUri!(args[0] as string);\n });\n }\n\n // Waits until the user scans the QR and approves in their wallet\n await provider.connect();\n\n await this.connectEIP1193Provider(provider, {\n name: 'WalletConnect',\n icon: 'https://avatars.githubusercontent.com/u/37784886',\n });\n\n return this;\n }\n\n /** The WalletConnect project ID passed at construction, if any */\n get walletConnectProjectId(): string | undefined {\n return this._walletConnectProjectId;\n }\n\n disconnectWallet(): this {\n this._engine.disconnectExternal();\n return this;\n }\n\n async switchChain(chain: Chain | string): Promise<this> {\n await this._telemetry.ensureValidated();\n const resolved = resolveChain(chain);\n await this._engine.switchChain(resolved);\n this._contractCache.clear(); // contracts are chain-specific\n return this;\n }\n\n getWalletInfo(): SDKWalletInfo {\n const info = this._engine.getConnectorInfo();\n return {\n address: this._engine.address(),\n chain: this.chain,\n isExternal: this._engine.hasExternalWallet(),\n connectorName: info.name,\n };\n }\n\n /**\n * Sign a plain text or raw-bytes message.\n * Use for Sign-In with Ethereum (SIWE) and off-chain authorization.\n *\n * @example\n * const sig = await awarizon.signMessage(\"Hello, Awarizon!\")\n */\n async signMessage(message: string | { raw: Hex | Uint8Array }): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signMessage(message);\n }\n\n /**\n * Sign EIP-712 typed structured data (permit2, SIWE, Seaport orders, etc.).\n *\n * @example\n * const sig = await awarizon.signTypedData({\n * domain: { name: \"MyApp\", version: \"1\", chainId: 8453 },\n * types: { Transfer: [{ name: \"to\", type: \"address\" }, { name: \"amount\", type: \"uint256\" }] },\n * primaryType: \"Transfer\",\n * message: { to: \"0x...\", amount: \"1000000\" },\n * })\n */\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n await this._telemetry.ensureValidated();\n return this._engine.signTypedData(params);\n }\n\n /**\n * Returns the chain ID the active wallet is currently on.\n * For external wallets this may differ from the SDK's configured chain.\n */\n async getChainId(): Promise<number> {\n return this._engine.getChainId();\n }\n\n /**\n * Returns true when the external wallet is on a different chain than the SDK.\n * Use this to show a \"wrong network\" banner in your UI.\n *\n * @example\n * if (await awarizon.isChainMismatch()) {\n * alert(\"Please switch to Base in your wallet\")\n * }\n */\n async isChainMismatch(): Promise<boolean> {\n return this._engine.isChainMismatch();\n }\n\n /**\n * Returns metadata about the currently active connector.\n * Useful for displaying \"Connected via MetaMask\" in the UI.\n */\n getConnectorInfo(): ConnectorInfo {\n return this._engine.getConnectorInfo();\n }\n\n /**\n * Subscribe to wallet changes (connect, disconnect, account switch).\n * Returns an unsubscribe function — call it on cleanup.\n *\n * @example\n * const unsub = awarizon.onWalletChange(({ address, type, name }) => {\n * console.log(\"Wallet changed:\", address, type, name)\n * })\n * unsub() // stop listening\n */\n onWalletChange(cb: (event: WalletChangeEvent) => void): () => void {\n return this._engine.onWalletChange(cb);\n }\n\n /**\n * Subscribe to chain changes (switchChain calls).\n * Returns an unsubscribe function.\n */\n onChainChange(cb: (event: ChainChangeEvent) => void): () => void {\n return this._engine.onChainChange(cb);\n }\n\n // ─── Contract API ───────────────────────────────────────────────────────────\n\n /**\n * Load a deployed contract and return a fully typed, ABI-powered instance.\n * Validates the API key on the first call — subsequent calls are instant.\n *\n * Results are cached by address — calling contract() twice with the same\n * address and ABI object returns the same instance without rebuilding.\n */\n async contract<TAbi extends Abi>(config: ContractConfig<TAbi>): Promise<ContractInstance> {\n await this._telemetry.ensureValidated();\n\n if (!config.address || !config.abi) {\n throw new Error('[awarizon/web3] awarizon.contract() requires both address and abi');\n }\n\n const key = config.address.toLowerCase();\n const cached = this._contractCache.get(key);\n if (cached && cached.abiRef === (config.abi as Abi)) return cached.instance;\n\n const instance = buildContractInstance(\n config.address,\n config.abi as Abi,\n this.publicClient,\n this._txEngine,\n this._telemetry,\n this.chain,\n );\n this._contractCache.set(key, { abiRef: config.abi as Abi, instance });\n return instance;\n }\n\n /**\n * Load multiple contracts in parallel. Validates the API key once, then\n * instantiates all contracts concurrently.\n *\n * @example\n * ```ts\n * const [token, staking, nft] = await awarizon.contracts([\n * { address: tokenAddr, abi: ERC20_ABI },\n * { address: stakingAddr, abi: STAKING_ABI },\n * { address: nftAddr, abi: ERC721_ABI },\n * ])\n * ```\n */\n async contracts(configs: Array<{ address: Address; abi: Abi }>): Promise<ContractInstance[]> {\n return Promise.all(configs.map(c => this.contract(c)));\n }\n\n /**\n * Call a read-only (view/pure) contract function directly without loading\n * a full contract instance. Best for one-off reads.\n *\n * @example\n * ```ts\n * const balance = await awarizon.read<bigint>({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"balanceOf\",\n * args: [userAddress],\n * })\n * ```\n */\n async read<T = unknown>(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n }): Promise<T> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.read({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n });\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result as T;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.read',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Execute a state-mutating contract function directly without loading a full\n * contract instance. Best for one-off writes.\n *\n * @example\n * ```ts\n * const { hash, receipt } = await awarizon.write({\n * address: tokenAddress,\n * abi: ERC20_ABI,\n * method: \"transfer\",\n * args: [recipient, 100n],\n * })\n * ```\n */\n async write(params: {\n address: Address;\n abi: Abi;\n method: string;\n args?: unknown[];\n value?: bigint;\n gas?: bigint;\n }): Promise<TransactionResult> {\n await this._telemetry.ensureValidated();\n const start = Date.now();\n try {\n const result = await this._txEngine.write({\n address: params.address,\n abi: params.abi,\n functionName: params.method,\n args: params.args ?? [],\n value: params.value,\n gas: params.gas,\n });\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: true,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n return result;\n } catch (err) {\n this._telemetry.track({\n type: 'contract.write',\n chain: this.chain.name,\n chainId: this.chain.id,\n functionName: params.method,\n success: false,\n durationMs: Date.now() - start,\n ts: Date.now(),\n });\n throw err;\n }\n }\n\n /**\n * Batch multiple read calls into a single RPC round-trip using multicall3.\n * Falls back to parallel individual reads on chains where multicall3 is\n * not deployed.\n *\n * @example\n * ```ts\n * const [balance, supply, allowance] = await awarizon.multicall([\n * { address: tokenAddr, abi: ERC20_ABI, method: \"balanceOf\", args: [userAddr] },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"totalSupply\" },\n * { address: tokenAddr, abi: ERC20_ABI, method: \"allowance\", args: [userAddr, spenderAddr] },\n * ])\n * ```\n */\n async multicall(\n calls: Array<{ address: Address; abi: Abi; method: string; args?: unknown[] }>,\n ): Promise<unknown[]> {\n await this._telemetry.ensureValidated();\n\n const contracts = calls.map(c => ({\n address: c.address,\n abi: c.abi,\n functionName: c.method,\n args: (c.args ?? []) as readonly unknown[],\n }));\n\n try {\n // Single RPC round-trip via multicall3\n const results = await this.publicClient.multicall({\n contracts: contracts as any,\n allowFailure: false,\n });\n return results as unknown[];\n } catch {\n // Multicall3 not deployed on this chain — fall back to parallel reads\n return Promise.all(\n contracts.map(c =>\n this.publicClient.readContract(c as any),\n ),\n );\n }\n }\n\n // ─── ERC Standard Clients ───────────────────────────────────────────────────\n\n /**\n * Load an ERC-20 token with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const token = await awarizon.erc20(\"0x...\")\n * const balance = await token.balanceOf(userAddress)\n * const symbol = await token.symbol()\n * await token.transfer(recipient, 100n)\n * ```\n */\n async erc20(address: Address): Promise<Erc20Contract> {\n const instance = await this.contract({ address, abi: ERC20_ABI as unknown as Abi });\n return instance as unknown as Erc20Contract;\n }\n\n /**\n * Load an ERC-721 NFT contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const nft = await awarizon.erc721(\"0x...\")\n * const owner = await nft.ownerOf(1n)\n * const uri = await nft.tokenURI(1n)\n * await nft.transferFrom(from, to, 1n)\n * ```\n */\n async erc721(address: Address): Promise<Erc721Contract> {\n const instance = await this.contract({ address, abi: ERC721_ABI as unknown as Abi });\n return instance as unknown as Erc721Contract;\n }\n\n /**\n * Load an ERC-1155 multi-token contract with fully typed methods — no ABI import needed.\n *\n * ```ts\n * const items = await awarizon.erc1155(\"0x...\")\n * const balance = await items.balanceOf(userAddress, 42n)\n * const uri = await items.uri(42n)\n * await items.safeTransferFrom(from, to, 42n, 1n, \"0x\")\n * ```\n */\n async erc1155(address: Address): Promise<Erc1155Contract> {\n const instance = await this.contract({ address, abi: ERC1155_ABI as unknown as Abi });\n return instance as unknown as Erc1155Contract;\n }\n\n // ─── Named Contract Registry ────────────────────────────────────────────────\n\n /**\n * Register a contract under a human-readable name.\n * After registering, use `awarizon.use(name)` anywhere instead of repeating\n * address + ABI every time.\n *\n * ```ts\n * awarizon.register(\"USDC\", { address: \"0x...\", abi: erc20Abi })\n * awarizon.register(\"Vault\", { address: \"0x...\", abi: vaultAbi })\n *\n * const usdc = await awarizon.use(\"USDC\")\n * const vault = await awarizon.use(\"Vault\")\n * ```\n */\n register(name: string, config: ContractRegistryEntry): this {\n this._registry.set(name, config);\n return this;\n }\n\n /**\n * Retrieve a previously registered contract by name.\n * Throws a descriptive error if the name was never registered.\n *\n * ```ts\n * const usdc = await awarizon.use(\"USDC\")\n * await usdc.transfer(recipient, 100n)\n * ```\n */\n async use(name: string): Promise<ContractInstance> {\n const config = this._registry.get(name);\n if (!config) {\n const registered = [...this._registry.keys()].join(', ') || 'none';\n throw new Error(\n `[awarizon/web3] Contract \"${name}\" is not registered.\\n` +\n `Call awarizon.register(\"${name}\", { address, abi }) first.\\n` +\n `Currently registered: ${registered}`,\n );\n }\n return this.contract(config);\n }\n\n /**\n * Remove a registered contract from the registry.\n *\n * ```ts\n * awarizon.unregister(\"USDC\")\n * ```\n */\n unregister(name: string): this {\n this._registry.delete(name);\n return this;\n }\n\n /**\n * Return all registered contract names.\n */\n registeredContracts(): string[] {\n return [...this._registry.keys()];\n }\n\n // ─── Accessors ──────────────────────────────────────────────────────────────\n\n get chainId(): number {\n return this.chain.id;\n }\n\n get isConnected(): boolean {\n return this._engine.isConnected();\n }\n\n /**\n * Flush pending telemetry and stop background timers.\n * Call when tearing down a long-lived SDK instance (e.g. on server shutdown).\n */\n async destroy(): Promise<void> {\n await this._telemetry.destroy();\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awarizon/web3",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Core Awarizon Web3 SDK — production-grade EVM blockchain abstraction layer",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"web3",
|
|
@@ -25,11 +25,19 @@
|
|
|
25
25
|
"files": [
|
|
26
26
|
"dist"
|
|
27
27
|
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsup",
|
|
30
|
+
"dev": "tsup --watch",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"clean": "rimraf dist"
|
|
34
|
+
},
|
|
28
35
|
"dependencies": {
|
|
29
|
-
"
|
|
30
|
-
"@awarizon/wallet-engine": "
|
|
31
|
-
"@awarizon/tx-engine": "
|
|
32
|
-
"@
|
|
36
|
+
"@awarizon/abi-engine": "workspace:*",
|
|
37
|
+
"@awarizon/wallet-engine": "workspace:*",
|
|
38
|
+
"@awarizon/tx-engine": "workspace:*",
|
|
39
|
+
"@walletconnect/ethereum-provider": "^2.17.0",
|
|
40
|
+
"viem": "^2.21.0"
|
|
33
41
|
},
|
|
34
42
|
"devDependencies": {
|
|
35
43
|
"typescript": "^5.5.0",
|
|
@@ -37,12 +45,5 @@
|
|
|
37
45
|
"vitest": "^2.0.0",
|
|
38
46
|
"rimraf": "^5.0.0"
|
|
39
47
|
},
|
|
40
|
-
"sideEffects": false
|
|
41
|
-
|
|
42
|
-
"build": "tsup",
|
|
43
|
-
"dev": "tsup --watch",
|
|
44
|
-
"test": "vitest run",
|
|
45
|
-
"typecheck": "tsc --noEmit",
|
|
46
|
-
"clean": "rimraf dist"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
48
|
+
"sideEffects": false
|
|
49
|
+
}
|