@barzkit/sdk 0.1.1 → 0.1.3

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.js CHANGED
@@ -1,4 +1,4 @@
1
- import { http, createPublicClient } from 'viem';
1
+ import { getAddress, parseUnits, encodeFunctionData, http, createPublicClient } from 'viem';
2
2
  import { privateKeyToAccount } from 'viem/accounts';
3
3
  import { entryPoint06Address } from 'viem/account-abstraction';
4
4
  import { createSmartAccountClient } from 'permissionless';
@@ -14,7 +14,8 @@ var CHAIN_CONFIGS = {
14
14
  bundlerUrl: "https://api.pimlico.io/v2/sepolia/rpc",
15
15
  paymasterUrl: "https://api.pimlico.io/v2/sepolia/rpc",
16
16
  entryPointAddress: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
17
- entryPointVersion: "0.6"
17
+ entryPointVersion: "0.6",
18
+ explorerUrl: "https://sepolia.etherscan.io"
18
19
  },
19
20
  "base-sepolia": {
20
21
  chain: baseSepolia,
@@ -22,7 +23,8 @@ var CHAIN_CONFIGS = {
22
23
  bundlerUrl: "https://api.pimlico.io/v2/base-sepolia/rpc",
23
24
  paymasterUrl: "https://api.pimlico.io/v2/base-sepolia/rpc",
24
25
  entryPointAddress: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
25
- entryPointVersion: "0.6"
26
+ entryPointVersion: "0.6",
27
+ explorerUrl: "https://sepolia.basescan.org"
26
28
  },
27
29
  base: {
28
30
  chain: base,
@@ -30,7 +32,8 @@ var CHAIN_CONFIGS = {
30
32
  bundlerUrl: "https://api.pimlico.io/v2/base/rpc",
31
33
  paymasterUrl: "https://api.pimlico.io/v2/base/rpc",
32
34
  entryPointAddress: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
33
- entryPointVersion: "0.6"
35
+ entryPointVersion: "0.6",
36
+ explorerUrl: "https://basescan.org"
34
37
  }
35
38
  };
36
39
  function getChainConfig(chain) {
@@ -313,6 +316,214 @@ var ERC20_ABI = [
313
316
  type: "function"
314
317
  }
315
318
  ];
319
+ var ETH_SENTINEL = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
320
+ var TOKEN_DECIMALS = {
321
+ ETH: 18,
322
+ WETH: 18,
323
+ USDC: 6,
324
+ USDT: 6,
325
+ DAI: 18,
326
+ USDbC: 6
327
+ };
328
+ function resolveToken(symbolOrAddress, chain) {
329
+ if (symbolOrAddress.startsWith("0x")) {
330
+ return getAddress(symbolOrAddress);
331
+ }
332
+ const symbol = symbolOrAddress.toUpperCase();
333
+ if (symbol === "ETH") {
334
+ return ETH_SENTINEL;
335
+ }
336
+ const chainTokens = TOKENS[chain];
337
+ if (!chainTokens) {
338
+ throw new BarzKitError(
339
+ `No tokens configured for chain "${chain}".`,
340
+ "UNSUPPORTED_CHAIN"
341
+ );
342
+ }
343
+ const address = chainTokens[symbol];
344
+ if (!address) {
345
+ throw new BarzKitError(
346
+ `Unknown token "${symbolOrAddress}" on ${chain}. Available: ${Object.keys(chainTokens).join(", ")}`,
347
+ "UNKNOWN_TOKEN"
348
+ );
349
+ }
350
+ return address;
351
+ }
352
+ function getTokenDecimals(symbol) {
353
+ return TOKEN_DECIMALS[symbol.toUpperCase()] ?? null;
354
+ }
355
+ function isNativeETH(token) {
356
+ if (token.toUpperCase() === "ETH") return true;
357
+ if (token.startsWith("0x")) {
358
+ return token.toLowerCase() === ETH_SENTINEL.toLowerCase();
359
+ }
360
+ return false;
361
+ }
362
+
363
+ // src/actions/swap.ts
364
+ var UNISWAP_V3_ROUTER = {
365
+ sepolia: "0x3bFA4769FB09eefC5a80d6E87c3B9C650f7Ae48E"
366
+ };
367
+ var SWAP_ROUTER_ABI = [
368
+ {
369
+ inputs: [
370
+ {
371
+ components: [
372
+ { name: "tokenIn", type: "address" },
373
+ { name: "tokenOut", type: "address" },
374
+ { name: "fee", type: "uint24" },
375
+ { name: "recipient", type: "address" },
376
+ { name: "amountIn", type: "uint256" },
377
+ { name: "amountOutMinimum", type: "uint256" },
378
+ { name: "sqrtPriceLimitX96", type: "uint160" }
379
+ ],
380
+ name: "params",
381
+ type: "tuple"
382
+ }
383
+ ],
384
+ name: "exactInputSingle",
385
+ outputs: [{ name: "amountOut", type: "uint256" }],
386
+ stateMutability: "payable",
387
+ type: "function"
388
+ }
389
+ ];
390
+ function buildSwapTransactions(params, chain, account) {
391
+ const router = UNISWAP_V3_ROUTER[chain];
392
+ if (!router) {
393
+ throw new BarzKitError(
394
+ `Uniswap V3 is not available on "${chain}". Supported: ${Object.keys(UNISWAP_V3_ROUTER).join(", ")}`,
395
+ "UNSUPPORTED_CHAIN"
396
+ );
397
+ }
398
+ const tokenIn = resolveToken(params.from, chain);
399
+ const tokenOut = resolveToken(params.to, chain);
400
+ if (tokenIn.toLowerCase() === tokenOut.toLowerCase()) {
401
+ throw new BarzKitError(
402
+ `Cannot swap a token to itself ("${params.from}" \u2192 "${params.to}").`,
403
+ "INVALID_SWAP"
404
+ );
405
+ }
406
+ const fromIsETH = isNativeETH(params.from);
407
+ const fromSymbol = params.from.startsWith("0x") ? null : params.from;
408
+ const decimals = fromSymbol ? getTokenDecimals(fromSymbol) ?? 18 : 18;
409
+ const amountIn = parseUnits(params.amount, decimals);
410
+ const routerTokenIn = fromIsETH ? resolveToken("WETH", chain) : tokenIn;
411
+ const routerTokenOut = isNativeETH(params.to) ? resolveToken("WETH", chain) : tokenOut;
412
+ const fee = params.fee ?? 3e3;
413
+ const amountOutMinimum = 0n;
414
+ const swapData = encodeFunctionData({
415
+ abi: SWAP_ROUTER_ABI,
416
+ functionName: "exactInputSingle",
417
+ args: [
418
+ {
419
+ tokenIn: routerTokenIn,
420
+ tokenOut: routerTokenOut,
421
+ fee,
422
+ recipient: account,
423
+ amountIn,
424
+ amountOutMinimum,
425
+ sqrtPriceLimitX96: 0n
426
+ }
427
+ ]
428
+ });
429
+ const txs = [];
430
+ if (fromIsETH) {
431
+ txs.push({
432
+ to: router,
433
+ value: amountIn,
434
+ data: swapData
435
+ });
436
+ } else {
437
+ const approveData = encodeFunctionData({
438
+ abi: ERC20_ABI,
439
+ functionName: "approve",
440
+ args: [router, amountIn]
441
+ });
442
+ txs.push({
443
+ to: tokenIn,
444
+ data: approveData
445
+ });
446
+ txs.push({
447
+ to: router,
448
+ data: swapData
449
+ });
450
+ }
451
+ return txs;
452
+ }
453
+ function getSwapTokenAddresses(params, chain) {
454
+ const addresses = [];
455
+ const tokenIn = resolveToken(params.from, chain);
456
+ const tokenOut = resolveToken(params.to, chain);
457
+ if (tokenIn !== ETH_SENTINEL) addresses.push(tokenIn);
458
+ if (tokenOut !== ETH_SENTINEL) addresses.push(tokenOut);
459
+ return addresses;
460
+ }
461
+ var AAVE_V3_POOL = {
462
+ sepolia: "0x6Ae43d3271ff6888e7Fc43Fd7321a503ff738951"
463
+ };
464
+ var AAVE_POOL_ABI = [
465
+ {
466
+ inputs: [
467
+ { name: "asset", type: "address" },
468
+ { name: "amount", type: "uint256" },
469
+ { name: "onBehalfOf", type: "address" },
470
+ { name: "referralCode", type: "uint16" }
471
+ ],
472
+ name: "supply",
473
+ outputs: [],
474
+ stateMutability: "nonpayable",
475
+ type: "function"
476
+ }
477
+ ];
478
+ function buildLendTransactions(params, chain, account) {
479
+ if (params.protocol !== "aave") {
480
+ throw new BarzKitError(
481
+ `Unknown lending protocol "${params.protocol}". Supported: aave`,
482
+ "UNKNOWN_PROTOCOL"
483
+ );
484
+ }
485
+ const pool = AAVE_V3_POOL[chain];
486
+ if (!pool) {
487
+ throw new BarzKitError(
488
+ `Aave V3 is not available on "${chain}". Supported: ${Object.keys(AAVE_V3_POOL).join(", ")}`,
489
+ "UNSUPPORTED_CHAIN"
490
+ );
491
+ }
492
+ if (isNativeETH(params.token)) {
493
+ throw new BarzKitError(
494
+ "Cannot supply native ETH to Aave. Wrap to WETH first, then supply WETH.",
495
+ "NATIVE_ETH_NOT_SUPPORTED"
496
+ );
497
+ }
498
+ const tokenAddress = resolveToken(params.token, chain);
499
+ const tokenSymbol = params.token.startsWith("0x") ? null : params.token;
500
+ const decimals = tokenSymbol ? getTokenDecimals(tokenSymbol) ?? 18 : 18;
501
+ const amount = parseUnits(params.amount, decimals);
502
+ const approveData = encodeFunctionData({
503
+ abi: ERC20_ABI,
504
+ functionName: "approve",
505
+ args: [pool, amount]
506
+ });
507
+ const supplyData = encodeFunctionData({
508
+ abi: AAVE_POOL_ABI,
509
+ functionName: "supply",
510
+ args: [tokenAddress, amount, account, 0]
511
+ });
512
+ return [
513
+ {
514
+ to: tokenAddress,
515
+ data: approveData
516
+ },
517
+ {
518
+ to: pool,
519
+ data: supplyData
520
+ }
521
+ ];
522
+ }
523
+ function getLendTokenAddresses(params, chain) {
524
+ const tokenAddress = resolveToken(params.token, chain);
525
+ return [tokenAddress];
526
+ }
316
527
 
317
528
  // src/core/account.ts
318
529
  async function createBarzAgent(config) {
@@ -344,8 +555,33 @@ async function createBarzAgent(config) {
344
555
  }
345
556
  }
346
557
  });
558
+ if (config.chain === "base") {
559
+ console.warn("\u26A0\uFE0F Using Base mainnet \u2014 real funds at risk");
560
+ }
347
561
  const permissionManager = new PermissionManager(config.permissions);
348
562
  let frozen = false;
563
+ async function executeBatch(txs) {
564
+ for (const tx of txs) {
565
+ permissionManager.validate(tx);
566
+ }
567
+ try {
568
+ const userOpHash = await smartAccountClient.sendUserOperation({
569
+ calls: txs.map((tx) => ({
570
+ to: tx.to,
571
+ value: tx.value ?? 0n,
572
+ data: tx.data ?? "0x"
573
+ }))
574
+ });
575
+ const receipt = await smartAccountClient.waitForUserOperationReceipt({
576
+ hash: userOpHash
577
+ });
578
+ const totalValue = txs.reduce((sum, tx) => sum + (tx.value ?? 0n), 0n);
579
+ if (totalValue > 0n) permissionManager.recordSpend(totalValue);
580
+ return receipt.receipt.transactionHash;
581
+ } catch (error) {
582
+ throw humanizeError(error);
583
+ }
584
+ }
349
585
  const agent = {
350
586
  address: smartAccount.address,
351
587
  chain: config.chain,
@@ -373,26 +609,7 @@ async function createBarzAgent(config) {
373
609
  "BATCH_EMPTY"
374
610
  );
375
611
  }
376
- for (const tx of txs) {
377
- permissionManager.validate(tx);
378
- }
379
- try {
380
- const userOpHash = await smartAccountClient.sendUserOperation({
381
- calls: txs.map((tx) => ({
382
- to: tx.to,
383
- value: tx.value ?? 0n,
384
- data: tx.data ?? "0x"
385
- }))
386
- });
387
- const receipt = await smartAccountClient.waitForUserOperationReceipt({
388
- hash: userOpHash
389
- });
390
- const totalValue = txs.reduce((sum, tx) => sum + (tx.value ?? 0n), 0n);
391
- if (totalValue > 0n) permissionManager.recordSpend(totalValue);
392
- return receipt.receipt.transactionHash;
393
- } catch (error) {
394
- throw humanizeError(error);
395
- }
612
+ return executeBatch(txs);
396
613
  },
397
614
  async getBalance(token) {
398
615
  try {
@@ -426,6 +643,23 @@ async function createBarzAgent(config) {
426
643
  );
427
644
  }
428
645
  },
646
+ async swap(params) {
647
+ if (frozen) throw new FrozenError();
648
+ const tokenAddresses = getSwapTokenAddresses(params, config.chain);
649
+ validateTokenPermissions(tokenAddresses, permissionManager.permissions);
650
+ const txs = buildSwapTransactions(params, config.chain, smartAccount.address);
651
+ return executeBatch(txs);
652
+ },
653
+ async lend(params) {
654
+ if (frozen) throw new FrozenError();
655
+ const tokenAddresses = getLendTokenAddresses(params, config.chain);
656
+ validateTokenPermissions(tokenAddresses, permissionManager.permissions);
657
+ const txs = buildLendTransactions(params, config.chain, smartAccount.address);
658
+ return executeBatch(txs);
659
+ },
660
+ getExplorerUrl(hash) {
661
+ return `${chainConfig.explorerUrl}/tx/${hash}`;
662
+ },
429
663
  getPermissions() {
430
664
  return permissionManager.permissions;
431
665
  },
@@ -463,7 +697,18 @@ function validateConfig(config) {
463
697
  throw new ConfigError('Missing "pimlico.apiKey". Get a free key at https://dashboard.pimlico.io');
464
698
  }
465
699
  }
700
+ function validateTokenPermissions(tokenAddresses, permissions) {
701
+ if (!permissions.allowedTokens || permissions.allowedTokens.length === 0) return;
702
+ const allowed = permissions.allowedTokens.map((a) => a.toLowerCase());
703
+ for (const token of tokenAddresses) {
704
+ if (!allowed.includes(token.toLowerCase())) {
705
+ throw new PermissionError(
706
+ `Token ${token} is not in the allowed list. Allowed: ${permissions.allowedTokens.join(", ")}`
707
+ );
708
+ }
709
+ }
710
+ }
466
711
 
467
- export { BarzKitError, BundlerError, CHAIN_CONFIGS, ConfigError, ERC20_ABI, FrozenError, PermissionError, TOKENS, TransactionError, createBarzAgent, getChainConfig };
712
+ export { AAVE_V3_POOL, BarzKitError, BundlerError, CHAIN_CONFIGS, ConfigError, ERC20_ABI, ETH_SENTINEL, FrozenError, PermissionError, TOKENS, TransactionError, UNISWAP_V3_ROUTER, buildLendTransactions, buildSwapTransactions, createBarzAgent, getChainConfig, getLendTokenAddresses, getSwapTokenAddresses, getTokenDecimals, isNativeETH, resolveToken };
468
713
  //# sourceMappingURL=index.js.map
469
714
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chains/chains.ts","../src/utils/errors.ts","../src/core/client.ts","../src/permissions/permissions.ts","../src/utils/constants.ts","../src/core/account.ts"],"names":["entryPoint06Address","http"],"mappings":";;;;;;;;;AAGO,IAAM,aAAA,GAAqD;AAAA,EAChE,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,6CAAA;AAAA,IACR,UAAA,EAAY,uCAAA;AAAA,IACZ,YAAA,EAAc,uCAAA;AAAA,IACd,iBAAA,EAAmB,4CAAA;AAAA,IACnB,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,KAAA,EAAO,WAAA;AAAA,IACP,MAAA,EAAQ,0BAAA;AAAA,IACR,UAAA,EAAY,4CAAA;AAAA,IACZ,YAAA,EAAc,4CAAA;AAAA,IACd,iBAAA,EAAmB,4CAAA;AAAA,IACnB,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,0BAAA;AAAA,IACR,UAAA,EAAY,oCAAA;AAAA,IACZ,YAAA,EAAc,oCAAA;AAAA,IACd,iBAAA,EAAmB,4CAAA;AAAA,IACnB,iBAAA,EAAmB;AAAA;AAEvB;AAEO,SAAS,eAAe,KAAA,EAAoC;AACjE,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,KAAK,IAAI,CAAA;AACtD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,KAAK,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAE,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,eAAA,CAAgB,aAA0B,MAAA,EAAwB;AAChF,EAAA,OAAO,CAAA,EAAG,WAAA,CAAY,UAAU,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AACnD;;;ACzCO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtB,IAAA;AAAA,EAEhB,WAAA,CAAY,SAAiB,IAAA,EAAc;AACzC,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAEO,IAAM,WAAA,GAAN,cAA0B,YAAA,CAAa;AAAA,EAC5C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,SAAS,cAAc,CAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,EAChD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,SAAS,mBAAmB,CAAA;AAClC,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,WAAA,GAAN,cAA0B,YAAA,CAAa;AAAA,EAC5C,WAAA,GAAc;AACZ,IAAA,KAAA;AAAA,MACE,oEAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AACF;AAEO,IAAM,gBAAA,GAAN,cAA+B,YAAA,CAAa;AAAA,EACjC,MAAA;AAAA,EAEhB,WAAA,CAAY,SAAiB,MAAA,EAAiB;AAC5C,IAAA,KAAA,CAAM,SAAS,oBAAoB,CAAA;AACnC,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;AAEO,IAAM,YAAA,GAAN,cAA2B,YAAA,CAAa;AAAA,EAC7C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,SAAS,eAAe,CAAA;AAC9B,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAEO,SAAS,cAAc,KAAA,EAA8B;AAC1D,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAErE,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,QAAA,CAAS,MAAM,KAAK,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AACxD,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,oBAAoB,CAAA,EAAG;AAC1C,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,YAAA,CAAa,CAAA,oBAAA,EAAuB,OAAO,IAAI,eAAe,CAAA;AAC3E;;;AC/EO,SAAS,cAAc,MAAA,EAAkC;AAC9D,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,IAAI,YAAY,gEAAgE,CAAA;AAAA,EACxF;AACA,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,IAAI,YAAY,6DAA6D,CAAA;AAAA,EACrF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ;AAC3B,IAAA,MAAM,IAAI,WAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,CAAO,KAAK,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,WAAA,CAAY,MAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,WAAA,EAAa,MAAA,CAAO,QAAQ,MAAM,CAAA;AAErE,EAAA,MAAM,eAAe,kBAAA,CAAmB;AAAA,IACtC,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,SAAA,EAAW,KAAK,MAAM;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,gBAAgB,mBAAA,CAAoB;AAAA,IACxC,SAAA,EAAW,KAAK,UAAU,CAAA;AAAA,IAC1B,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,mBAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACjDO,IAAM,oBAAN,MAAwB;AAAA,EACrB,YAAA;AAAA,EACA,WAAA,GAAsB,EAAA;AAAA,EACtB,eAAA,GAA0B,KAAK,GAAA,EAAI;AAAA,EAE3C,WAAA,CAAY,WAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,IAAA,CAAK,YAAA,GAAe,EAAE,GAAG,WAAA,EAAY;AAAA,EACvC;AAAA,EAEA,IAAI,WAAA,GAAgC;AAClC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,YAAA,EAAa;AAAA,EAChC;AAAA,EAEA,OAAO,WAAA,EAA8C;AACnD,IAAA,IAAA,CAAK,eAAe,EAAE,GAAG,IAAA,CAAK,YAAA,EAAc,GAAG,WAAA,EAAY;AAAA,EAC7D;AAAA,EAEA,SAAS,EAAA,EAA8B;AACrC,IAAA,MAAM,IAAI,IAAA,CAAK,YAAA;AAGf,IAAA,IAAI,CAAA,CAAE,gBAAA,IAAoB,CAAA,CAAE,gBAAA,CAAiB,SAAS,CAAA,EAAG;AACvD,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,EAAA,CAAG,WAAA,EAAY;AACjC,MAAA,MAAM,OAAA,GAAU,EAAE,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAC7D,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,CAAA,gBAAA,EAAmB,GAAG,EAAE,CAAA,sCAAA,EACZ,EAAE,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SAC3C;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,EAAE,UAAA,EAAY;AAChB,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,EAAc;AAClC,MAAA,MAAM,WAAA,GAAc,QAAQ,EAAA,GAAK,OAAA;AAEjC,MAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,CAAA,CAAE,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACjE,MAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,CAAA,CAAE,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAC3D,MAAA,MAAM,SAAA,GAAY,SAAS,EAAA,GAAK,MAAA;AAChC,MAAA,MAAM,OAAA,GAAU,OAAO,EAAA,GAAK,IAAA;AAE5B,MAAA,IAAI,WAAA,GAAc,SAAA,IAAa,WAAA,GAAc,OAAA,EAAS;AACpD,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,CAAA,kDAAA,EACY,EAAE,UAAA,CAAW,KAAK,MAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,eAAA,EACxC,MAAA,CAAO,KAAK,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,KAAA;AAAA,SAChF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,CAAA,CAAE,cAAA,IAAkB,EAAA,CAAG,KAAA,EAAO;AAChC,MAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAA,CAAE,cAAc,CAAA;AAC/C,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,EAAA,CAAG,KAAA,GAAQ,KAAA,EAAO;AACtC,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,CAAA,kBAAA,EAAqB,EAAA,CAAG,KAAK,CAAA,kCAAA,EAAqC,EAAE,cAAc,CAAA,CAAA;AAAA,SACpF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,CAAA,CAAE,aAAA,IAAiB,EAAA,CAAG,KAAA,EAAO;AAC/B,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAA,CAAE,aAAa,CAAA;AAC9C,MAAA,IAAI,UAAU,IAAA,IAAQ,IAAA,CAAK,WAAA,GAAc,EAAA,CAAG,QAAQ,KAAA,EAAO;AACzD,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,CAAA,8CAAA,EAAiD,EAAE,aAAa,CAAA,uBAAA,EACxC,KAAK,WAAW,CAAA,aAAA,EAAgB,GAAG,KAAK,CAAA,CAAA;AAAA,SAClE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,KAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,WAAA,IAAe,KAAA;AAAA,EACtB;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAA,GAAU,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAC/B,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,eAAA,GAAkB,OAAA,EAAS;AACxC,MAAA,IAAA,CAAK,WAAA,GAAc,EAAA;AACnB,MAAA,IAAA,CAAK,eAAA,GAAkB,GAAA;AAAA,IACzB;AAAA,EACF;AACF,CAAA;AAEA,SAAS,iBAAiB,MAAA,EAA+B;AACvD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAC/B,EAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,IAAA;AAEvB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,EAAG,aAAY,IAAK,KAAA;AAExC,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,KAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,IAAI,CAAC,CAAA;AAAA,IACtC,KAAK,MAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAG,CAAC,CAAA;AAAA,IACrC,KAAK,KAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,IAC/B,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAG,CAAC,CAAA;AAAA,IACrC,KAAK,KAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,IAAI,CAAC,CAAA;AAAA,IACtC;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;;;AClHO,IAAM,MAAA,GAAkD;AAAA,EAC7D,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,4CAAA;AAAA,IACN,IAAA,EAAM,4CAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,4CAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,4CAAA;AAAA,IACN,IAAA,EAAM,4CAAA;AAAA,IACN,GAAA,EAAK,4CAAA;AAAA,IACL,KAAA,EAAO;AAAA;AAEX;AAEO,IAAM,SAAA,GAAY;AAAA,EACvB;AAAA,IACE,QAAQ,CAAC,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,WAAW,CAAA;AAAA,IAC7C,IAAA,EAAM,WAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,WAAW,CAAA;AAAA,IACvC,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,MACnC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA;AAAU,KACpC;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA;AAAA,IACpC,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,MAC9B,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA;AAAU,KACpC;AAAA,IACA,IAAA,EAAM,UAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA;AAAA,IACpC,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,UAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,SAAS,CAAA;AAAA,IACrC,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,UAAU,CAAA;AAAA,IACtC,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV;;;AC7BA,eAAsB,gBAAgB,MAAA,EAAyC;AAC7E,EAAA,cAAA,CAAe,MAAM,CAAA;AAErB,EAAA,MAAM,EAAE,YAAA,EAAc,aAAA,EAAe,aAAa,UAAA,EAAW,GAAI,cAAc,MAAM,CAAA;AACrF,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,MAAA,CAAO,KAAK,CAAA;AAErD,EAAA,MAAM,YAAA,GAAe,MAAM,mBAAA,CAAoB;AAAA,IAC7C,MAAA,EAAQ,YAAA;AAAA,IACR,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,OAAO,KAAA,IAAS,EAAA;AAAA,IACvB,UAAA,EAAY;AAAA,MACV,OAAA,EAASA,mBAAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,KAAY,KAAA;AAEnC,EAAA,MAAM,qBAAqB,wBAAA,CAAyB;AAAA,IAClD,OAAA,EAAS,YAAA;AAAA,IACT,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,gBAAA,EAAkBC,KAAK,UAAU,CAAA;AAAA,IACjC,GAAI,OAAA,GACA;AAAA,MACE,SAAA,EAAW,aAAA;AAAA,MACX,aAAA,EAAe;AAAA,QACb,kBAAA,EAAoB,YAAA,CACjB,MAAM,aAAA,CAAc,0BAAyB,EAAG;AAAA;AACrD,KACF,GACA;AAAA,MACE,aAAA,EAAe;AAAA,QACb,kBAAA,EAAoB,YAAA,CACjB,MAAM,aAAA,CAAc,0BAAyB,EAAG;AAAA;AACrD;AACF,GACL,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoB,IAAI,iBAAA,CAAkB,MAAA,CAAO,WAAW,CAAA;AAClE,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,MAAM,KAAA,GAAmB;AAAA,IACvB,SAAS,YAAA,CAAa,OAAA;AAAA,IACtB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,OAAO,YAAA,CAAa,OAAA;AAAA,IAEpB,MAAM,gBAAgB,EAAA,EAAuC;AAC3D,MAAA,IAAI,MAAA,EAAQ,MAAM,IAAI,WAAA,EAAY;AAClC,MAAA,iBAAA,CAAkB,SAAS,EAAE,CAAA;AAE7B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,eAAA,CAAgB;AAAA,UACpD,IAAI,EAAA,CAAG,EAAA;AAAA,UACP,KAAA,EAAO,GAAG,KAAA,IAAS,EAAA;AAAA,UACnB,IAAA,EAAM,GAAG,IAAA,IAAQ;AAAA,SAClB,CAAA;AAED,QAAA,IAAI,EAAA,CAAG,KAAA,EAAO,iBAAA,CAAkB,WAAA,CAAY,GAAG,KAAK,CAAA;AACpD,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,cAAc,KAAK,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,kBAAkB,GAAA,EAA0C;AAChE,MAAA,IAAI,MAAA,EAAQ,MAAM,IAAI,WAAA,EAAY;AAClC,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,sDAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,iBAAA,CAAkB,SAAS,EAAE,CAAA;AAAA,MAC/B;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,iBAAA,CAAkB;AAAA,UAC5D,KAAA,EAAO,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,YACtB,IAAI,EAAA,CAAG,EAAA;AAAA,YACP,KAAA,EAAO,GAAG,KAAA,IAAS,EAAA;AAAA,YACnB,IAAA,EAAM,GAAG,IAAA,IAAS;AAAA,WACpB,CAAE;AAAA,SACH,CAAA;AAED,QAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,2BAAA,CAA4B;AAAA,UACnE,IAAA,EAAM;AAAA,SACP,CAAA;AAED,QAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,CAAO,CAAC,GAAA,EAAK,OAAO,GAAA,IAAO,EAAA,CAAG,KAAA,IAAS,EAAA,CAAA,EAAK,EAAE,CAAA;AACrE,QAAA,IAAI,UAAA,GAAa,EAAA,EAAI,iBAAA,CAAkB,WAAA,CAAY,UAAU,CAAA;AAE7D,QAAA,OAAO,QAAQ,OAAA,CAAQ,eAAA;AAAA,MACzB,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,cAAc,KAAK,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,WAAW,KAAA,EAAkC;AACjD,MAAA,IAAI;AACF,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,OAAO,MAAM,YAAA,CAAa,UAAA,CAAW,EAAE,OAAA,EAAS,YAAA,CAAa,SAAS,CAAA;AAAA,QACxE;AAEA,QAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,UAC9C,OAAA,EAAS,KAAA;AAAA,UACT,GAAA,EAAK,SAAA;AAAA,UACL,YAAA,EAAc,WAAA;AAAA,UACd,IAAA,EAAM,CAAC,YAAA,CAAa,OAAO;AAAA,SAC5B,CAAA;AAED,QAAA,OAAO,OAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,cAAc,KAAK,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,mBAAmB,IAAA,EAAyC;AAChE,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,YAAA,CAAa,yBAAA,CAA0B,EAAE,MAAM,CAAA;AACrE,QAAA,OAAO;AAAA,UACL,iBAAiB,OAAA,CAAQ,eAAA;AAAA,UACzB,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,SAAS,OAAA,CAAQ;AAAA,SACnB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,gBAAA;AAAA,UACR,kCAAkC,IAAI,CAAA,EAAA,EAAK,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,KAAK,CAAA,CAAA;AAAA,UACzF;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,cAAA,GAAmC;AACjC,MAAA,OAAO,iBAAA,CAAkB,WAAA;AAAA,IAC3B,CAAA;AAAA,IAEA,kBAAkB,WAAA,EAA8C;AAC9D,MAAA,iBAAA,CAAkB,OAAO,WAAW,CAAA;AAAA,IACtC,CAAA;AAAA,IAEA,MAAM,MAAA,GAAwB;AAC5B,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,OAAO,oEAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,QAAA,GAA0B;AAC9B,MAAA,MAAA,GAAS,KAAA;AACT,MAAA,OAAO,oEAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,QAAA,GAA6B;AACjC,MAAA,OAAO,CAAC,MAAA;AAAA,IACV;AAAA,GACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,MAAA,EAA2B;AACjD,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,YAAY,2BAA2B,CAAA;AAE9D,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,IAAI,YAAY,0DAA0D,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,IAAI,YAAY,6CAA6C,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,CAAC,OAAO,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,EAAA,EAAI;AAChE,IAAA,MAAM,IAAI,WAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ;AAC3B,IAAA,MAAM,IAAI,YAAY,0EAA0E,CAAA;AAAA,EAClG;AACF","file":"index.js","sourcesContent":["import { sepolia, baseSepolia, base } from 'viem/chains'\nimport type { ChainConfig, SupportedChain } from '../core/types'\n\nexport const CHAIN_CONFIGS: Record<SupportedChain, ChainConfig> = {\n sepolia: {\n chain: sepolia,\n rpcUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n bundlerUrl: 'https://api.pimlico.io/v2/sepolia/rpc',\n paymasterUrl: 'https://api.pimlico.io/v2/sepolia/rpc',\n entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n entryPointVersion: '0.6',\n },\n 'base-sepolia': {\n chain: baseSepolia,\n rpcUrl: 'https://sepolia.base.org',\n bundlerUrl: 'https://api.pimlico.io/v2/base-sepolia/rpc',\n paymasterUrl: 'https://api.pimlico.io/v2/base-sepolia/rpc',\n entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n entryPointVersion: '0.6',\n },\n base: {\n chain: base,\n rpcUrl: 'https://mainnet.base.org',\n bundlerUrl: 'https://api.pimlico.io/v2/base/rpc',\n paymasterUrl: 'https://api.pimlico.io/v2/base/rpc',\n entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n entryPointVersion: '0.6',\n },\n}\n\nexport function getChainConfig(chain: SupportedChain): ChainConfig {\n const config = CHAIN_CONFIGS[chain]\n if (!config) {\n const supported = Object.keys(CHAIN_CONFIGS).join(', ')\n throw new Error(`Unsupported chain: \"${chain}\". Supported: ${supported}`)\n }\n return config\n}\n\nexport function buildBundlerUrl(chainConfig: ChainConfig, apiKey: string): string {\n return `${chainConfig.bundlerUrl}?apikey=${apiKey}`\n}\n\nexport function buildPaymasterUrl(chainConfig: ChainConfig, apiKey: string): string {\n return `${chainConfig.paymasterUrl}?apikey=${apiKey}`\n}\n","export class BarzKitError extends Error {\n public readonly code: string\n\n constructor(message: string, code: string) {\n super(message)\n this.name = 'BarzKitError'\n this.code = code\n }\n}\n\nexport class ConfigError extends BarzKitError {\n constructor(message: string) {\n super(message, 'CONFIG_ERROR')\n this.name = 'ConfigError'\n }\n}\n\nexport class PermissionError extends BarzKitError {\n constructor(message: string) {\n super(message, 'PERMISSION_DENIED')\n this.name = 'PermissionError'\n }\n}\n\nexport class FrozenError extends BarzKitError {\n constructor() {\n super(\n 'Agent wallet is frozen. Call agent.unfreeze() to resume operation.',\n 'AGENT_FROZEN',\n )\n this.name = 'FrozenError'\n }\n}\n\nexport class TransactionError extends BarzKitError {\n public readonly txHash?: string\n\n constructor(message: string, txHash?: string) {\n super(message, 'TRANSACTION_FAILED')\n this.name = 'TransactionError'\n this.txHash = txHash\n }\n}\n\nexport class BundlerError extends BarzKitError {\n constructor(message: string) {\n super(message, 'BUNDLER_ERROR')\n this.name = 'BundlerError'\n }\n}\n\nexport function humanizeError(error: unknown): BarzKitError {\n const message = error instanceof Error ? error.message : String(error)\n\n if (message.includes('AA21')) {\n return new TransactionError(\n 'Smart account has insufficient funds to pay for gas. ' +\n 'Send ETH to the agent wallet address, or enable gasless mode.',\n )\n }\n\n if (message.includes('AA25')) {\n return new TransactionError(\n 'Invalid signature. The agent key may not be authorized for this account.',\n )\n }\n\n if (message.includes('AA31')) {\n return new TransactionError(\n 'Paymaster deposit too low. The paymaster may be out of funds. ' +\n 'Try again later or switch to self-funded mode.',\n )\n }\n\n if (message.includes('AA33')) {\n return new TransactionError(\n 'Transaction reverted during validation. The calldata may be invalid ' +\n 'or the target contract may have rejected the call.',\n )\n }\n\n if (message.includes('AA40') || message.includes('AA41')) {\n return new TransactionError(\n 'Paymaster validation failed. The paymaster may not support this operation.',\n )\n }\n\n if (message.includes('insufficient funds')) {\n return new TransactionError(\n 'Insufficient funds in the agent wallet. Check balance with agent.getBalance().',\n )\n }\n\n return new BarzKitError(`Transaction failed: ${message}`, 'UNKNOWN_ERROR')\n}\n","import { createPublicClient, http } from 'viem'\nimport type { PublicClient, HttpTransport, Chain } from 'viem'\nimport { createPimlicoClient } from 'permissionless/clients/pimlico'\nimport { entryPoint06Address } from 'viem/account-abstraction'\nimport type { AgentConfig, ChainConfig } from './types'\nimport { getChainConfig, buildBundlerUrl } from '../chains/chains'\nimport { ConfigError } from '../utils/errors'\n\nexport interface BarzClients {\n publicClient: PublicClient<HttpTransport, Chain>\n pimlicoClient: ReturnType<typeof createPimlicoClient>\n chainConfig: ChainConfig\n bundlerUrl: string\n}\n\nexport function createClients(config: AgentConfig): BarzClients {\n if (!config.chain) {\n throw new ConfigError('Missing required field: \"chain\". Example: { chain: \"sepolia\" }')\n }\n if (!config.owner) {\n throw new ConfigError('Missing required field: \"owner\". Provide a hex private key.')\n }\n if (!config.pimlico?.apiKey) {\n throw new ConfigError(\n 'Missing required field: \"pimlico.apiKey\". ' +\n 'Get a free API key at https://dashboard.pimlico.io',\n )\n }\n\n const chainConfig = getChainConfig(config.chain)\n const rpcUrl = config.rpcUrl || chainConfig.rpcUrl\n const bundlerUrl = buildBundlerUrl(chainConfig, config.pimlico.apiKey)\n\n const publicClient = createPublicClient({\n chain: chainConfig.chain,\n transport: http(rpcUrl),\n })\n\n const pimlicoClient = createPimlicoClient({\n transport: http(bundlerUrl),\n entryPoint: {\n address: entryPoint06Address,\n version: '0.6',\n },\n })\n\n return {\n publicClient: publicClient as PublicClient<HttpTransport, Chain>,\n pimlicoClient,\n chainConfig,\n bundlerUrl,\n }\n}\n","import type { AgentPermissions, TransactionRequest } from '../core/types'\nimport { PermissionError } from '../utils/errors'\n\nexport class PermissionManager {\n private _permissions: AgentPermissions\n private _dailySpent: bigint = 0n\n private _dailyResetTime: number = Date.now()\n\n constructor(permissions: AgentPermissions = {}) {\n this._permissions = { ...permissions }\n }\n\n get permissions(): AgentPermissions {\n return { ...this._permissions }\n }\n\n update(permissions: Partial<AgentPermissions>): void {\n this._permissions = { ...this._permissions, ...permissions }\n }\n\n validate(tx: TransactionRequest): void {\n const p = this._permissions\n\n // Check allowed contracts\n if (p.allowedContracts && p.allowedContracts.length > 0) {\n const target = tx.to.toLowerCase()\n const allowed = p.allowedContracts.map((a) => a.toLowerCase())\n if (!allowed.includes(target)) {\n throw new PermissionError(\n `Target contract ${tx.to} is not in the allowed list. ` +\n `Allowed: ${p.allowedContracts.join(', ')}`,\n )\n }\n }\n\n // Check time window\n if (p.timeWindow) {\n const now = new Date()\n const hours = now.getUTCHours()\n const minutes = now.getUTCMinutes()\n const currentTime = hours * 60 + minutes\n\n const [startH, startM] = p.timeWindow.start.split(':').map(Number)\n const [endH, endM] = p.timeWindow.end.split(':').map(Number)\n const startTime = startH * 60 + startM\n const endTime = endH * 60 + endM\n\n if (currentTime < startTime || currentTime > endTime) {\n throw new PermissionError(\n `Transaction outside allowed time window. ` +\n `Allowed: ${p.timeWindow.start} - ${p.timeWindow.end} UTC. ` +\n `Current: ${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')} UTC.`,\n )\n }\n }\n\n // Check per-transaction amount limit\n if (p.maxAmountPerTx && tx.value) {\n const limit = parseHumanAmount(p.maxAmountPerTx)\n if (limit !== null && tx.value > limit) {\n throw new PermissionError(\n `Transaction value ${tx.value} exceeds per-transaction limit of ${p.maxAmountPerTx}.`,\n )\n }\n }\n\n // Check daily spend\n if (p.maxDailySpend && tx.value) {\n this._resetDailyIfNeeded()\n const limit = parseHumanAmount(p.maxDailySpend)\n if (limit !== null && this._dailySpent + tx.value > limit) {\n throw new PermissionError(\n `Transaction would exceed daily spend limit of ${p.maxDailySpend}. ` +\n `Already spent today: ${this._dailySpent}. Requested: ${tx.value}.`,\n )\n }\n }\n }\n\n recordSpend(value: bigint): void {\n this._resetDailyIfNeeded()\n this._dailySpent += value\n }\n\n private _resetDailyIfNeeded(): void {\n const now = Date.now()\n const ONE_DAY = 24 * 60 * 60 * 1000\n if (now - this._dailyResetTime > ONE_DAY) {\n this._dailySpent = 0n\n this._dailyResetTime = now\n }\n }\n}\n\nfunction parseHumanAmount(amount: string): bigint | null {\n const parts = amount.trim().split(/\\s+/)\n const num = parseFloat(parts[0])\n if (isNaN(num)) return null\n\n const unit = parts[1]?.toUpperCase() || 'WEI'\n\n switch (unit) {\n case 'ETH':\n return BigInt(Math.floor(num * 1e18))\n case 'GWEI':\n return BigInt(Math.floor(num * 1e9))\n case 'WEI':\n return BigInt(Math.floor(num))\n case 'USDC':\n case 'USDT':\n return BigInt(Math.floor(num * 1e6))\n case 'DAI':\n return BigInt(Math.floor(num * 1e18))\n default:\n return null\n }\n}\n","import type { Address } from 'viem'\n\nexport const TOKENS: Record<string, Record<string, Address>> = {\n sepolia: {\n USDC: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n WETH: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n DAI: '0x68194a729C2450ad26072b3D33ADaCbcef39D574',\n },\n 'base-sepolia': {\n USDC: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n WETH: '0x4200000000000000000000000000000000000006',\n },\n base: {\n USDC: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n WETH: '0x4200000000000000000000000000000000000006',\n DAI: '0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb',\n USDbC: '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA',\n },\n}\n\nexport const ERC20_ABI = [\n {\n inputs: [{ name: 'account', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { name: 'spender', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n name: 'approve',\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { name: 'to', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n name: 'transfer',\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint8' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'symbol',\n outputs: [{ name: '', type: 'string' }],\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n","import { http } from 'viem'\nimport type { Address, Hash, Hex } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { entryPoint06Address } from 'viem/account-abstraction'\nimport { createSmartAccountClient } from 'permissionless'\nimport { toTrustSmartAccount } from 'permissionless/accounts'\n\nimport type {\n AgentConfig,\n BarzAgent,\n TransactionRequest,\n TransactionReceipt,\n AgentPermissions,\n} from './types'\nimport { createClients } from './client'\nimport { PermissionManager } from '../permissions/permissions'\nimport { BarzKitError, ConfigError, FrozenError, humanizeError, TransactionError } from '../utils/errors'\nimport { ERC20_ABI } from '../utils/constants'\n\n/**\n * Create a Barz agent wallet.\n *\n * @example\n * ```ts\n * const agent = await createBarzAgent({\n * chain: 'sepolia',\n * owner: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',\n * pimlico: { apiKey: 'pim_...' },\n * })\n *\n * console.log('Agent address:', agent.address)\n * ```\n */\nexport async function createBarzAgent(config: AgentConfig): Promise<BarzAgent> {\n validateConfig(config)\n\n const { publicClient, pimlicoClient, chainConfig, bundlerUrl } = createClients(config)\n const ownerAccount = privateKeyToAccount(config.owner)\n\n const smartAccount = await toTrustSmartAccount({\n client: publicClient,\n owner: ownerAccount,\n index: config.index ?? 0n,\n entryPoint: {\n address: entryPoint06Address,\n version: '0.6',\n },\n })\n\n const gasless = config.gasless !== false\n\n const smartAccountClient = createSmartAccountClient({\n account: smartAccount,\n chain: chainConfig.chain,\n bundlerTransport: http(bundlerUrl),\n ...(gasless\n ? {\n paymaster: pimlicoClient,\n userOperation: {\n estimateFeesPerGas: async () =>\n (await pimlicoClient.getUserOperationGasPrice()).fast,\n },\n }\n : {\n userOperation: {\n estimateFeesPerGas: async () =>\n (await pimlicoClient.getUserOperationGasPrice()).fast,\n },\n }),\n })\n\n const permissionManager = new PermissionManager(config.permissions)\n let frozen = false\n\n const agent: BarzAgent = {\n address: smartAccount.address,\n chain: config.chain,\n owner: ownerAccount.address,\n\n async sendTransaction(tx: TransactionRequest): Promise<Hash> {\n if (frozen) throw new FrozenError()\n permissionManager.validate(tx)\n\n try {\n const hash = await smartAccountClient.sendTransaction({\n to: tx.to,\n value: tx.value ?? 0n,\n data: tx.data ?? '0x',\n })\n\n if (tx.value) permissionManager.recordSpend(tx.value)\n return hash\n } catch (error) {\n throw humanizeError(error)\n }\n },\n\n async batchTransactions(txs: TransactionRequest[]): Promise<Hash> {\n if (frozen) throw new FrozenError()\n if (txs.length === 0) {\n throw new BarzKitError(\n 'batchTransactions requires at least one transaction.',\n 'BATCH_EMPTY',\n )\n }\n\n for (const tx of txs) {\n permissionManager.validate(tx)\n }\n\n try {\n const userOpHash = await smartAccountClient.sendUserOperation({\n calls: txs.map((tx) => ({\n to: tx.to,\n value: tx.value ?? 0n,\n data: tx.data ?? ('0x' as Hex),\n })),\n })\n\n const receipt = await smartAccountClient.waitForUserOperationReceipt({\n hash: userOpHash,\n })\n\n const totalValue = txs.reduce((sum, tx) => sum + (tx.value ?? 0n), 0n)\n if (totalValue > 0n) permissionManager.recordSpend(totalValue)\n\n return receipt.receipt.transactionHash\n } catch (error) {\n throw humanizeError(error)\n }\n },\n\n async getBalance(token?: Address): Promise<bigint> {\n try {\n if (!token) {\n return await publicClient.getBalance({ address: smartAccount.address })\n }\n\n const balance = await publicClient.readContract({\n address: token,\n abi: ERC20_ABI,\n functionName: 'balanceOf',\n args: [smartAccount.address],\n })\n\n return balance as bigint\n } catch (error) {\n throw humanizeError(error)\n }\n },\n\n async waitForTransaction(hash: Hash): Promise<TransactionReceipt> {\n try {\n const receipt = await publicClient.waitForTransactionReceipt({ hash })\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: receipt.blockNumber,\n status: receipt.status,\n gasUsed: receipt.gasUsed,\n }\n } catch (error) {\n throw new TransactionError(\n `Failed waiting for transaction ${hash}: ${error instanceof Error ? error.message : error}`,\n hash,\n )\n }\n },\n\n getPermissions(): AgentPermissions {\n return permissionManager.permissions\n },\n\n updatePermissions(permissions: Partial<AgentPermissions>): void {\n permissionManager.update(permissions)\n },\n\n async freeze(): Promise<Hash> {\n frozen = true\n return '0x0000000000000000000000000000000000000000000000000000000000000000' as Hash\n },\n\n async unfreeze(): Promise<Hash> {\n frozen = false\n return '0x0000000000000000000000000000000000000000000000000000000000000000' as Hash\n },\n\n async isActive(): Promise<boolean> {\n return !frozen\n },\n }\n\n return agent\n}\n\nfunction validateConfig(config: AgentConfig): void {\n if (!config) throw new ConfigError('Agent config is required.')\n\n if (!config.chain) {\n throw new ConfigError('Missing \"chain\". Supported: sepolia, base-sepolia, base.')\n }\n if (!config.owner) {\n throw new ConfigError('Missing \"owner\". Provide a hex private key.')\n }\n if (!config.owner.startsWith('0x') || config.owner.length !== 66) {\n throw new ConfigError(\n 'Invalid \"owner\" private key. Must be a 32-byte hex string starting with \"0x\" (66 chars total).',\n )\n }\n if (!config.pimlico?.apiKey) {\n throw new ConfigError('Missing \"pimlico.apiKey\". Get a free key at https://dashboard.pimlico.io')\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/chains/chains.ts","../src/utils/errors.ts","../src/core/client.ts","../src/permissions/permissions.ts","../src/utils/constants.ts","../src/actions/tokens.ts","../src/actions/swap.ts","../src/actions/lend.ts","../src/core/account.ts"],"names":["parseUnits","encodeFunctionData","entryPoint06Address","http"],"mappings":";;;;;;;;;AAGO,IAAM,aAAA,GAAqD;AAAA,EAChE,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,6CAAA;AAAA,IACR,UAAA,EAAY,uCAAA;AAAA,IACZ,YAAA,EAAc,uCAAA;AAAA,IACd,iBAAA,EAAmB,4CAAA;AAAA,IACnB,iBAAA,EAAmB,KAAA;AAAA,IACnB,WAAA,EAAa;AAAA,GACf;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,KAAA,EAAO,WAAA;AAAA,IACP,MAAA,EAAQ,0BAAA;AAAA,IACR,UAAA,EAAY,4CAAA;AAAA,IACZ,YAAA,EAAc,4CAAA;AAAA,IACd,iBAAA,EAAmB,4CAAA;AAAA,IACnB,iBAAA,EAAmB,KAAA;AAAA,IACnB,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,0BAAA;AAAA,IACR,UAAA,EAAY,oCAAA;AAAA,IACZ,YAAA,EAAc,oCAAA;AAAA,IACd,iBAAA,EAAmB,4CAAA;AAAA,IACnB,iBAAA,EAAmB,KAAA;AAAA,IACnB,WAAA,EAAa;AAAA;AAEjB;AAEO,SAAS,eAAe,KAAA,EAAoC;AACjE,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,KAAK,IAAI,CAAA;AACtD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,KAAK,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAE,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,eAAA,CAAgB,aAA0B,MAAA,EAAwB;AAChF,EAAA,OAAO,CAAA,EAAG,WAAA,CAAY,UAAU,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AACnD;;;AC5CO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtB,IAAA;AAAA,EAEhB,WAAA,CAAY,SAAiB,IAAA,EAAc;AACzC,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAEO,IAAM,WAAA,GAAN,cAA0B,YAAA,CAAa;AAAA,EAC5C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,SAAS,cAAc,CAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,EAChD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,SAAS,mBAAmB,CAAA;AAClC,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,WAAA,GAAN,cAA0B,YAAA,CAAa;AAAA,EAC5C,WAAA,GAAc;AACZ,IAAA,KAAA;AAAA,MACE,oEAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AACF;AAEO,IAAM,gBAAA,GAAN,cAA+B,YAAA,CAAa;AAAA,EACjC,MAAA;AAAA,EAEhB,WAAA,CAAY,SAAiB,MAAA,EAAiB;AAC5C,IAAA,KAAA,CAAM,SAAS,oBAAoB,CAAA;AACnC,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;AAEO,IAAM,YAAA,GAAN,cAA2B,YAAA,CAAa;AAAA,EAC7C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,SAAS,eAAe,CAAA;AAC9B,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAEO,SAAS,cAAc,KAAA,EAA8B;AAC1D,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAErE,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,QAAA,CAAS,MAAM,KAAK,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AACxD,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,oBAAoB,CAAA,EAAG;AAC1C,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,YAAA,CAAa,CAAA,oBAAA,EAAuB,OAAO,IAAI,eAAe,CAAA;AAC3E;;;AC/EO,SAAS,cAAc,MAAA,EAAkC;AAC9D,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,IAAI,YAAY,gEAAgE,CAAA;AAAA,EACxF;AACA,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,IAAI,YAAY,6DAA6D,CAAA;AAAA,EACrF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ;AAC3B,IAAA,MAAM,IAAI,WAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,CAAO,KAAK,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,WAAA,CAAY,MAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,WAAA,EAAa,MAAA,CAAO,QAAQ,MAAM,CAAA;AAErE,EAAA,MAAM,eAAe,kBAAA,CAAmB;AAAA,IACtC,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,SAAA,EAAW,KAAK,MAAM;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,gBAAgB,mBAAA,CAAoB;AAAA,IACxC,SAAA,EAAW,KAAK,UAAU,CAAA;AAAA,IAC1B,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,mBAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACjDO,IAAM,oBAAN,MAAwB;AAAA,EACrB,YAAA;AAAA,EACA,WAAA,GAAsB,EAAA;AAAA,EACtB,eAAA,GAA0B,KAAK,GAAA,EAAI;AAAA,EAE3C,WAAA,CAAY,WAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,IAAA,CAAK,YAAA,GAAe,EAAE,GAAG,WAAA,EAAY;AAAA,EACvC;AAAA,EAEA,IAAI,WAAA,GAAgC;AAClC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,YAAA,EAAa;AAAA,EAChC;AAAA,EAEA,OAAO,WAAA,EAA8C;AACnD,IAAA,IAAA,CAAK,eAAe,EAAE,GAAG,IAAA,CAAK,YAAA,EAAc,GAAG,WAAA,EAAY;AAAA,EAC7D;AAAA,EAEA,SAAS,EAAA,EAA8B;AACrC,IAAA,MAAM,IAAI,IAAA,CAAK,YAAA;AAGf,IAAA,IAAI,CAAA,CAAE,gBAAA,IAAoB,CAAA,CAAE,gBAAA,CAAiB,SAAS,CAAA,EAAG;AACvD,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,EAAA,CAAG,WAAA,EAAY;AACjC,MAAA,MAAM,OAAA,GAAU,EAAE,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAC7D,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,CAAA,gBAAA,EAAmB,GAAG,EAAE,CAAA,sCAAA,EACZ,EAAE,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SAC3C;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,EAAE,UAAA,EAAY;AAChB,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,EAAc;AAClC,MAAA,MAAM,WAAA,GAAc,QAAQ,EAAA,GAAK,OAAA;AAEjC,MAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,CAAA,CAAE,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACjE,MAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,CAAA,CAAE,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAC3D,MAAA,MAAM,SAAA,GAAY,SAAS,EAAA,GAAK,MAAA;AAChC,MAAA,MAAM,OAAA,GAAU,OAAO,EAAA,GAAK,IAAA;AAE5B,MAAA,IAAI,WAAA,GAAc,SAAA,IAAa,WAAA,GAAc,OAAA,EAAS;AACpD,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,CAAA,kDAAA,EACY,EAAE,UAAA,CAAW,KAAK,MAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,eAAA,EACxC,MAAA,CAAO,KAAK,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,KAAA;AAAA,SAChF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,CAAA,CAAE,cAAA,IAAkB,EAAA,CAAG,KAAA,EAAO;AAChC,MAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAA,CAAE,cAAc,CAAA;AAC/C,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,EAAA,CAAG,KAAA,GAAQ,KAAA,EAAO;AACtC,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,CAAA,kBAAA,EAAqB,EAAA,CAAG,KAAK,CAAA,kCAAA,EAAqC,EAAE,cAAc,CAAA,CAAA;AAAA,SACpF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,CAAA,CAAE,aAAA,IAAiB,EAAA,CAAG,KAAA,EAAO;AAC/B,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAA,CAAE,aAAa,CAAA;AAC9C,MAAA,IAAI,UAAU,IAAA,IAAQ,IAAA,CAAK,WAAA,GAAc,EAAA,CAAG,QAAQ,KAAA,EAAO;AACzD,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,CAAA,8CAAA,EAAiD,EAAE,aAAa,CAAA,uBAAA,EACxC,KAAK,WAAW,CAAA,aAAA,EAAgB,GAAG,KAAK,CAAA,CAAA;AAAA,SAClE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,KAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,WAAA,IAAe,KAAA;AAAA,EACtB;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAA,GAAU,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAC/B,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,eAAA,GAAkB,OAAA,EAAS;AACxC,MAAA,IAAA,CAAK,WAAA,GAAc,EAAA;AACnB,MAAA,IAAA,CAAK,eAAA,GAAkB,GAAA;AAAA,IACzB;AAAA,EACF;AACF,CAAA;AAEA,SAAS,iBAAiB,MAAA,EAA+B;AACvD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAC/B,EAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,IAAA;AAEvB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,EAAG,aAAY,IAAK,KAAA;AAExC,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,KAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,IAAI,CAAC,CAAA;AAAA,IACtC,KAAK,MAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAG,CAAC,CAAA;AAAA,IACrC,KAAK,KAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,IAC/B,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAG,CAAC,CAAA;AAAA,IACrC,KAAK,KAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,IAAI,CAAC,CAAA;AAAA,IACtC;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;;;AClHO,IAAM,MAAA,GAAkD;AAAA,EAC7D,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,4CAAA;AAAA,IACN,IAAA,EAAM,4CAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,4CAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,4CAAA;AAAA,IACN,IAAA,EAAM,4CAAA;AAAA,IACN,GAAA,EAAK,4CAAA;AAAA,IACL,KAAA,EAAO;AAAA;AAEX;AAEO,IAAM,SAAA,GAAY;AAAA,EACvB;AAAA,IACE,QAAQ,CAAC,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,WAAW,CAAA;AAAA,IAC7C,IAAA,EAAM,WAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,WAAW,CAAA;AAAA,IACvC,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,MACnC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA;AAAU,KACpC;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA;AAAA,IACpC,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,MAC9B,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA;AAAU,KACpC;AAAA,IACA,IAAA,EAAM,UAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA;AAAA,IACpC,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,UAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,SAAS,CAAA;AAAA,IACrC,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,UAAU,CAAA;AAAA,IACtC,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV;ACtDO,IAAM,YAAA,GAAwB;AAErC,IAAM,cAAA,GAAyC;AAAA,EAC7C,GAAA,EAAK,EAAA;AAAA,EACL,IAAA,EAAM,EAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO;AACT,CAAA;AASO,SAAS,YAAA,CAAa,iBAAyB,KAAA,EAAgC;AAEpF,EAAA,IAAI,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAA,EAAG;AACpC,IAAA,OAAO,WAAW,eAAe,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,MAAA,GAAS,gBAAgB,WAAA,EAAY;AAE3C,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,OAAO,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,mCAAmC,KAAK,CAAA,EAAA,CAAA;AAAA,MACxC;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM,CAAA;AAClC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,eAAA,EAAkB,eAAe,CAAA,KAAA,EAAQ,KAAK,CAAA,aAAA,EAAgB,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MACjG;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,iBAAiB,MAAA,EAA+B;AAC9D,EAAA,OAAO,cAAA,CAAe,MAAA,CAAO,WAAA,EAAa,CAAA,IAAK,IAAA;AACjD;AAGO,SAAS,YAAY,KAAA,EAAwB;AAClD,EAAA,IAAI,KAAA,CAAM,WAAA,EAAY,KAAM,KAAA,EAAO,OAAO,IAAA;AAC1C,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AAC1B,IAAA,OAAO,KAAA,CAAM,WAAA,EAAY,KAAM,YAAA,CAAa,WAAA,EAAY;AAAA,EAC1D;AACA,EAAA,OAAO,KAAA;AACT;;;AC/DO,IAAM,iBAAA,GAA8D;AAAA,EACzE,OAAA,EAAS;AACX;AAEA,IAAM,eAAA,GAAkB;AAAA,EACtB;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,UAAA,EAAY;AAAA,UACV,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,UACnC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAU;AAAA,UACpC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA,UAC9B,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAU;AAAA,UACrC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAU;AAAA,UACpC,EAAE,IAAA,EAAM,kBAAA,EAAoB,IAAA,EAAM,SAAA,EAAU;AAAA,UAC5C,EAAE,IAAA,EAAM,mBAAA,EAAqB,IAAA,EAAM,SAAA;AAAU,SAC/C;AAAA,QACA,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,kBAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,WAAA,EAAa,IAAA,EAAM,WAAW,CAAA;AAAA,IAChD,eAAA,EAAiB,SAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV,CAAA;AAUO,SAAS,qBAAA,CACd,MAAA,EACA,KAAA,EACA,OAAA,EACsB;AACtB,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,gCAAA,EAAmC,KAAK,CAAA,cAAA,EAAiB,MAAA,CAAO,KAAK,iBAAiB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAClG;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,KAAK,CAAA;AAE9C,EAAA,IAAI,OAAA,CAAQ,WAAA,EAAY,KAAM,QAAA,CAAS,aAAY,EAAG;AACpD,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,gCAAA,EAAmC,MAAA,CAAO,IAAI,CAAA,UAAA,EAAQ,OAAO,EAAE,CAAA,GAAA,CAAA;AAAA,MAC/D;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAGzC,EAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,WAAW,IAAI,CAAA,GAAI,OAAO,MAAA,CAAO,IAAA;AAChE,EAAA,MAAM,QAAA,GAAW,UAAA,GAAc,gBAAA,CAAiB,UAAU,KAAK,EAAA,GAAM,EAAA;AACrE,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,CAAO,MAAA,EAAQ,QAAQ,CAAA;AAGnD,EAAA,MAAM,aAAA,GAAgB,SAAA,GAClB,YAAA,CAAa,MAAA,EAAQ,KAAK,CAAA,GAC1B,OAAA;AAIJ,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAA,CAAO,EAAE,IACxC,YAAA,CAAa,MAAA,EAAQ,KAAK,CAAA,GAC1B,QAAA;AAEJ,EAAA,MAAM,GAAA,GAAM,OAAO,GAAA,IAAO,GAAA;AAE1B,EAAA,MAAM,gBAAA,GAAmB,EAAA;AAEzB,EAAA,MAAM,WAAW,kBAAA,CAAmB;AAAA,IAClC,GAAA,EAAK,eAAA;AAAA,IACL,YAAA,EAAc,kBAAA;AAAA,IACd,IAAA,EAAM;AAAA,MACJ;AAAA,QACE,OAAA,EAAS,aAAA;AAAA,QACT,QAAA,EAAU,cAAA;AAAA,QACV,GAAA;AAAA,QACA,SAAA,EAAW,OAAA;AAAA,QACX,QAAA;AAAA,QACA,gBAAA;AAAA,QACA,iBAAA,EAAmB;AAAA;AACrB;AACF,GACD,CAAA;AAED,EAAA,MAAM,MAA4B,EAAC;AAEnC,EAAA,IAAI,SAAA,EAAW;AAEb,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,EAAA,EAAI,MAAA;AAAA,MACJ,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,CAAA,MAAO;AAEL,IAAA,MAAM,cAAc,kBAAA,CAAmB;AAAA,MACrC,GAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAc,SAAA;AAAA,MACd,IAAA,EAAM,CAAC,MAAA,EAAQ,QAAQ;AAAA,KACxB,CAAA;AAED,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,qBAAA,CAAsB,QAAoB,KAAA,EAAkC;AAC1F,EAAA,MAAM,YAAuB,EAAC;AAE9B,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,KAAK,CAAA;AAE9C,EAAA,IAAI,OAAA,KAAY,YAAA,EAAc,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACpD,EAAA,IAAI,QAAA,KAAa,YAAA,EAAc,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA;AAEtD,EAAA,OAAO,SAAA;AACT;AC7IO,IAAM,YAAA,GAAyD;AAAA,EACpE,OAAA,EAAS;AACX;AAEA,IAAM,aAAA,GAAgB;AAAA,EACpB;AAAA,IACE,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,MACjC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA,EAAU;AAAA,MAClC,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA,EAAU;AAAA,MACtC,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,QAAA;AAAS,KACzC;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV,CAAA;AAUO,SAAS,qBAAA,CACd,MAAA,EACA,KAAA,EACA,OAAA,EACsB;AACtB,EAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAQ;AAC9B,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,0BAAA,EAA6B,OAAO,QAAQ,CAAA,kBAAA,CAAA;AAAA,MAC5C;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,aAAa,KAAK,CAAA;AAC/B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,6BAAA,EAAgC,KAAK,CAAA,cAAA,EAAiB,MAAA,CAAO,KAAK,YAAY,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAC1F;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,yEAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO,KAAK,CAAA;AAErD,EAAA,MAAM,cAAc,MAAA,CAAO,KAAA,CAAM,WAAW,IAAI,CAAA,GAAI,OAAO,MAAA,CAAO,KAAA;AAClE,EAAA,MAAM,QAAA,GAAW,WAAA,GAAe,gBAAA,CAAiB,WAAW,KAAK,EAAA,GAAM,EAAA;AACvE,EAAA,MAAM,MAAA,GAASA,UAAAA,CAAW,MAAA,CAAO,MAAA,EAAQ,QAAQ,CAAA;AAEjD,EAAA,MAAM,cAAcC,kBAAAA,CAAmB;AAAA,IACrC,GAAA,EAAK,SAAA;AAAA,IACL,YAAA,EAAc,SAAA;AAAA,IACd,IAAA,EAAM,CAAC,IAAA,EAAM,MAAM;AAAA,GACpB,CAAA;AAED,EAAA,MAAM,aAAaA,kBAAAA,CAAmB;AAAA,IACpC,GAAA,EAAK,aAAA;AAAA,IACL,YAAA,EAAc,QAAA;AAAA,IACd,IAAA,EAAM,CAAC,YAAA,EAAc,MAAA,EAAQ,SAAS,CAAC;AAAA,GACxC,CAAA;AAED,EAAA,OAAO;AAAA,IACL;AAAA,MACE,EAAA,EAAI,YAAA;AAAA,MACJ,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,EAAA,EAAI,IAAA;AAAA,MACJ,IAAA,EAAM;AAAA;AACR,GACF;AACF;AAKO,SAAS,qBAAA,CAAsB,QAAoB,KAAA,EAAkC;AAC1F,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO,KAAK,CAAA;AACrD,EAAA,OAAO,CAAC,YAAY,CAAA;AACtB;;;AC9DA,eAAsB,gBAAgB,MAAA,EAAyC;AAC7E,EAAA,cAAA,CAAe,MAAM,CAAA;AAErB,EAAA,MAAM,EAAE,YAAA,EAAc,aAAA,EAAe,aAAa,UAAA,EAAW,GAAI,cAAc,MAAM,CAAA;AACrF,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,MAAA,CAAO,KAAK,CAAA;AAErD,EAAA,MAAM,YAAA,GAAe,MAAM,mBAAA,CAAoB;AAAA,IAC7C,MAAA,EAAQ,YAAA;AAAA,IACR,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,OAAO,KAAA,IAAS,EAAA;AAAA,IACvB,UAAA,EAAY;AAAA,MACV,OAAA,EAASC,mBAAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,KAAY,KAAA;AAEnC,EAAA,MAAM,qBAAqB,wBAAA,CAAyB;AAAA,IAClD,OAAA,EAAS,YAAA;AAAA,IACT,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,gBAAA,EAAkBC,KAAK,UAAU,CAAA;AAAA,IACjC,GAAI,OAAA,GACA;AAAA,MACE,SAAA,EAAW,aAAA;AAAA,MACX,aAAA,EAAe;AAAA,QACb,kBAAA,EAAoB,YAAA,CACjB,MAAM,aAAA,CAAc,0BAAyB,EAAG;AAAA;AACrD,KACF,GACA;AAAA,MACE,aAAA,EAAe;AAAA,QACb,kBAAA,EAAoB,YAAA,CACjB,MAAM,aAAA,CAAc,0BAAyB,EAAG;AAAA;AACrD;AACF,GACL,CAAA;AAED,EAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAQ;AAC3B,IAAA,OAAA,CAAQ,KAAK,2DAA2D,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,iBAAA,GAAoB,IAAI,iBAAA,CAAkB,MAAA,CAAO,WAAW,CAAA;AAClE,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,eAAe,aAAa,GAAA,EAA0C;AACpE,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,iBAAA,CAAkB,SAAS,EAAE,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,iBAAA,CAAkB;AAAA,QAC5D,KAAA,EAAO,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,UACtB,IAAI,EAAA,CAAG,EAAA;AAAA,UACP,KAAA,EAAO,GAAG,KAAA,IAAS,EAAA;AAAA,UACnB,IAAA,EAAM,GAAG,IAAA,IAAS;AAAA,SACpB,CAAE;AAAA,OACH,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,2BAAA,CAA4B;AAAA,QACnE,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,CAAO,CAAC,GAAA,EAAK,OAAO,GAAA,IAAO,EAAA,CAAG,KAAA,IAAS,EAAA,CAAA,EAAK,EAAE,CAAA;AACrE,MAAA,IAAI,UAAA,GAAa,EAAA,EAAI,iBAAA,CAAkB,WAAA,CAAY,UAAU,CAAA;AAE7D,MAAA,OAAO,QAAQ,OAAA,CAAQ,eAAA;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,cAAc,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAmB;AAAA,IACvB,SAAS,YAAA,CAAa,OAAA;AAAA,IACtB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,OAAO,YAAA,CAAa,OAAA;AAAA,IAEpB,MAAM,gBAAgB,EAAA,EAAuC;AAC3D,MAAA,IAAI,MAAA,EAAQ,MAAM,IAAI,WAAA,EAAY;AAClC,MAAA,iBAAA,CAAkB,SAAS,EAAE,CAAA;AAE7B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,eAAA,CAAgB;AAAA,UACpD,IAAI,EAAA,CAAG,EAAA;AAAA,UACP,KAAA,EAAO,GAAG,KAAA,IAAS,EAAA;AAAA,UACnB,IAAA,EAAM,GAAG,IAAA,IAAQ;AAAA,SAClB,CAAA;AAED,QAAA,IAAI,EAAA,CAAG,KAAA,EAAO,iBAAA,CAAkB,WAAA,CAAY,GAAG,KAAK,CAAA;AACpD,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,cAAc,KAAK,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,kBAAkB,GAAA,EAA0C;AAChE,MAAA,IAAI,MAAA,EAAQ,MAAM,IAAI,WAAA,EAAY;AAClC,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,sDAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO,aAAa,GAAG,CAAA;AAAA,IACzB,CAAA;AAAA,IAEA,MAAM,WAAW,KAAA,EAAkC;AACjD,MAAA,IAAI;AACF,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,OAAO,MAAM,YAAA,CAAa,UAAA,CAAW,EAAE,OAAA,EAAS,YAAA,CAAa,SAAS,CAAA;AAAA,QACxE;AAEA,QAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,UAC9C,OAAA,EAAS,KAAA;AAAA,UACT,GAAA,EAAK,SAAA;AAAA,UACL,YAAA,EAAc,WAAA;AAAA,UACd,IAAA,EAAM,CAAC,YAAA,CAAa,OAAO;AAAA,SAC5B,CAAA;AAED,QAAA,OAAO,OAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,cAAc,KAAK,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,mBAAmB,IAAA,EAAyC;AAChE,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,YAAA,CAAa,yBAAA,CAA0B,EAAE,MAAM,CAAA;AACrE,QAAA,OAAO;AAAA,UACL,iBAAiB,OAAA,CAAQ,eAAA;AAAA,UACzB,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,SAAS,OAAA,CAAQ;AAAA,SACnB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,gBAAA;AAAA,UACR,kCAAkC,IAAI,CAAA,EAAA,EAAK,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,KAAK,CAAA,CAAA;AAAA,UACzF;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAK,MAAA,EAAmC;AAC5C,MAAA,IAAI,MAAA,EAAQ,MAAM,IAAI,WAAA,EAAY;AAElC,MAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA;AACjE,MAAA,wBAAA,CAAyB,cAAA,EAAgB,kBAAkB,WAAW,CAAA;AAEtE,MAAA,MAAM,MAAM,qBAAA,CAAsB,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,aAAa,OAAO,CAAA;AAC5E,MAAA,OAAO,aAAa,GAAG,CAAA;AAAA,IACzB,CAAA;AAAA,IAEA,MAAM,KAAK,MAAA,EAAmC;AAC5C,MAAA,IAAI,MAAA,EAAQ,MAAM,IAAI,WAAA,EAAY;AAElC,MAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA;AACjE,MAAA,wBAAA,CAAyB,cAAA,EAAgB,kBAAkB,WAAW,CAAA;AAEtE,MAAA,MAAM,MAAM,qBAAA,CAAsB,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,aAAa,OAAO,CAAA;AAC5E,MAAA,OAAO,aAAa,GAAG,CAAA;AAAA,IACzB,CAAA;AAAA,IAEA,eAAe,IAAA,EAAoB;AACjC,MAAA,OAAO,CAAA,EAAG,WAAA,CAAY,WAAW,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA;AAAA,IAC9C,CAAA;AAAA,IAEA,cAAA,GAAmC;AACjC,MAAA,OAAO,iBAAA,CAAkB,WAAA;AAAA,IAC3B,CAAA;AAAA,IAEA,kBAAkB,WAAA,EAA8C;AAC9D,MAAA,iBAAA,CAAkB,OAAO,WAAW,CAAA;AAAA,IACtC,CAAA;AAAA,IAEA,MAAM,MAAA,GAAwB;AAC5B,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,OAAO,oEAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,QAAA,GAA0B;AAC9B,MAAA,MAAA,GAAS,KAAA;AACT,MAAA,OAAO,oEAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,QAAA,GAA6B;AACjC,MAAA,OAAO,CAAC,MAAA;AAAA,IACV;AAAA,GACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,MAAA,EAA2B;AACjD,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,YAAY,2BAA2B,CAAA;AAE9D,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,IAAI,YAAY,0DAA0D,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,IAAI,YAAY,6CAA6C,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,CAAC,OAAO,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,EAAA,EAAI;AAChE,IAAA,MAAM,IAAI,WAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ;AAC3B,IAAA,MAAM,IAAI,YAAY,0EAA0E,CAAA;AAAA,EAClG;AACF;AAEA,SAAS,wBAAA,CAAyB,gBAA2B,WAAA,EAAqC;AAChG,EAAA,IAAI,CAAC,WAAA,CAAY,aAAA,IAAiB,WAAA,CAAY,aAAA,CAAc,WAAW,CAAA,EAAG;AAE1E,EAAA,MAAM,OAAA,GAAU,YAAY,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AACpE,EAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,WAAA,EAAa,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,SAAS,KAAK,CAAA,sCAAA,EACF,YAAY,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AACF","file":"index.js","sourcesContent":["import { sepolia, baseSepolia, base } from 'viem/chains'\nimport type { ChainConfig, SupportedChain } from '../core/types'\n\nexport const CHAIN_CONFIGS: Record<SupportedChain, ChainConfig> = {\n sepolia: {\n chain: sepolia,\n rpcUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n bundlerUrl: 'https://api.pimlico.io/v2/sepolia/rpc',\n paymasterUrl: 'https://api.pimlico.io/v2/sepolia/rpc',\n entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n entryPointVersion: '0.6',\n explorerUrl: 'https://sepolia.etherscan.io',\n },\n 'base-sepolia': {\n chain: baseSepolia,\n rpcUrl: 'https://sepolia.base.org',\n bundlerUrl: 'https://api.pimlico.io/v2/base-sepolia/rpc',\n paymasterUrl: 'https://api.pimlico.io/v2/base-sepolia/rpc',\n entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n entryPointVersion: '0.6',\n explorerUrl: 'https://sepolia.basescan.org',\n },\n base: {\n chain: base,\n rpcUrl: 'https://mainnet.base.org',\n bundlerUrl: 'https://api.pimlico.io/v2/base/rpc',\n paymasterUrl: 'https://api.pimlico.io/v2/base/rpc',\n entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n entryPointVersion: '0.6',\n explorerUrl: 'https://basescan.org',\n },\n}\n\nexport function getChainConfig(chain: SupportedChain): ChainConfig {\n const config = CHAIN_CONFIGS[chain]\n if (!config) {\n const supported = Object.keys(CHAIN_CONFIGS).join(', ')\n throw new Error(`Unsupported chain: \"${chain}\". Supported: ${supported}`)\n }\n return config\n}\n\nexport function buildBundlerUrl(chainConfig: ChainConfig, apiKey: string): string {\n return `${chainConfig.bundlerUrl}?apikey=${apiKey}`\n}\n\nexport function buildPaymasterUrl(chainConfig: ChainConfig, apiKey: string): string {\n return `${chainConfig.paymasterUrl}?apikey=${apiKey}`\n}\n","export class BarzKitError extends Error {\n public readonly code: string\n\n constructor(message: string, code: string) {\n super(message)\n this.name = 'BarzKitError'\n this.code = code\n }\n}\n\nexport class ConfigError extends BarzKitError {\n constructor(message: string) {\n super(message, 'CONFIG_ERROR')\n this.name = 'ConfigError'\n }\n}\n\nexport class PermissionError extends BarzKitError {\n constructor(message: string) {\n super(message, 'PERMISSION_DENIED')\n this.name = 'PermissionError'\n }\n}\n\nexport class FrozenError extends BarzKitError {\n constructor() {\n super(\n 'Agent wallet is frozen. Call agent.unfreeze() to resume operation.',\n 'AGENT_FROZEN',\n )\n this.name = 'FrozenError'\n }\n}\n\nexport class TransactionError extends BarzKitError {\n public readonly txHash?: string\n\n constructor(message: string, txHash?: string) {\n super(message, 'TRANSACTION_FAILED')\n this.name = 'TransactionError'\n this.txHash = txHash\n }\n}\n\nexport class BundlerError extends BarzKitError {\n constructor(message: string) {\n super(message, 'BUNDLER_ERROR')\n this.name = 'BundlerError'\n }\n}\n\nexport function humanizeError(error: unknown): BarzKitError {\n const message = error instanceof Error ? error.message : String(error)\n\n if (message.includes('AA21')) {\n return new TransactionError(\n 'Smart account has insufficient funds to pay for gas. ' +\n 'Send ETH to the agent wallet address, or enable gasless mode.',\n )\n }\n\n if (message.includes('AA25')) {\n return new TransactionError(\n 'Invalid signature. The agent key may not be authorized for this account.',\n )\n }\n\n if (message.includes('AA31')) {\n return new TransactionError(\n 'Paymaster deposit too low. The paymaster may be out of funds. ' +\n 'Try again later or switch to self-funded mode.',\n )\n }\n\n if (message.includes('AA33')) {\n return new TransactionError(\n 'Transaction reverted during validation. The calldata may be invalid ' +\n 'or the target contract may have rejected the call.',\n )\n }\n\n if (message.includes('AA40') || message.includes('AA41')) {\n return new TransactionError(\n 'Paymaster validation failed. The paymaster may not support this operation.',\n )\n }\n\n if (message.includes('insufficient funds')) {\n return new TransactionError(\n 'Insufficient funds in the agent wallet. Check balance with agent.getBalance().',\n )\n }\n\n return new BarzKitError(`Transaction failed: ${message}`, 'UNKNOWN_ERROR')\n}\n","import { createPublicClient, http } from 'viem'\nimport type { PublicClient, HttpTransport, Chain } from 'viem'\nimport { createPimlicoClient } from 'permissionless/clients/pimlico'\nimport { entryPoint06Address } from 'viem/account-abstraction'\nimport type { AgentConfig, ChainConfig } from './types'\nimport { getChainConfig, buildBundlerUrl } from '../chains/chains'\nimport { ConfigError } from '../utils/errors'\n\nexport interface BarzClients {\n publicClient: PublicClient<HttpTransport, Chain>\n pimlicoClient: ReturnType<typeof createPimlicoClient>\n chainConfig: ChainConfig\n bundlerUrl: string\n}\n\nexport function createClients(config: AgentConfig): BarzClients {\n if (!config.chain) {\n throw new ConfigError('Missing required field: \"chain\". Example: { chain: \"sepolia\" }')\n }\n if (!config.owner) {\n throw new ConfigError('Missing required field: \"owner\". Provide a hex private key.')\n }\n if (!config.pimlico?.apiKey) {\n throw new ConfigError(\n 'Missing required field: \"pimlico.apiKey\". ' +\n 'Get a free API key at https://dashboard.pimlico.io',\n )\n }\n\n const chainConfig = getChainConfig(config.chain)\n const rpcUrl = config.rpcUrl || chainConfig.rpcUrl\n const bundlerUrl = buildBundlerUrl(chainConfig, config.pimlico.apiKey)\n\n const publicClient = createPublicClient({\n chain: chainConfig.chain,\n transport: http(rpcUrl),\n })\n\n const pimlicoClient = createPimlicoClient({\n transport: http(bundlerUrl),\n entryPoint: {\n address: entryPoint06Address,\n version: '0.6',\n },\n })\n\n return {\n publicClient: publicClient as PublicClient<HttpTransport, Chain>,\n pimlicoClient,\n chainConfig,\n bundlerUrl,\n }\n}\n","import type { AgentPermissions, TransactionRequest } from '../core/types'\nimport { PermissionError } from '../utils/errors'\n\nexport class PermissionManager {\n private _permissions: AgentPermissions\n private _dailySpent: bigint = 0n\n private _dailyResetTime: number = Date.now()\n\n constructor(permissions: AgentPermissions = {}) {\n this._permissions = { ...permissions }\n }\n\n get permissions(): AgentPermissions {\n return { ...this._permissions }\n }\n\n update(permissions: Partial<AgentPermissions>): void {\n this._permissions = { ...this._permissions, ...permissions }\n }\n\n validate(tx: TransactionRequest): void {\n const p = this._permissions\n\n // Check allowed contracts\n if (p.allowedContracts && p.allowedContracts.length > 0) {\n const target = tx.to.toLowerCase()\n const allowed = p.allowedContracts.map((a) => a.toLowerCase())\n if (!allowed.includes(target)) {\n throw new PermissionError(\n `Target contract ${tx.to} is not in the allowed list. ` +\n `Allowed: ${p.allowedContracts.join(', ')}`,\n )\n }\n }\n\n // Check time window\n if (p.timeWindow) {\n const now = new Date()\n const hours = now.getUTCHours()\n const minutes = now.getUTCMinutes()\n const currentTime = hours * 60 + minutes\n\n const [startH, startM] = p.timeWindow.start.split(':').map(Number)\n const [endH, endM] = p.timeWindow.end.split(':').map(Number)\n const startTime = startH * 60 + startM\n const endTime = endH * 60 + endM\n\n if (currentTime < startTime || currentTime > endTime) {\n throw new PermissionError(\n `Transaction outside allowed time window. ` +\n `Allowed: ${p.timeWindow.start} - ${p.timeWindow.end} UTC. ` +\n `Current: ${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')} UTC.`,\n )\n }\n }\n\n // Check per-transaction amount limit\n if (p.maxAmountPerTx && tx.value) {\n const limit = parseHumanAmount(p.maxAmountPerTx)\n if (limit !== null && tx.value > limit) {\n throw new PermissionError(\n `Transaction value ${tx.value} exceeds per-transaction limit of ${p.maxAmountPerTx}.`,\n )\n }\n }\n\n // Check daily spend\n if (p.maxDailySpend && tx.value) {\n this._resetDailyIfNeeded()\n const limit = parseHumanAmount(p.maxDailySpend)\n if (limit !== null && this._dailySpent + tx.value > limit) {\n throw new PermissionError(\n `Transaction would exceed daily spend limit of ${p.maxDailySpend}. ` +\n `Already spent today: ${this._dailySpent}. Requested: ${tx.value}.`,\n )\n }\n }\n }\n\n recordSpend(value: bigint): void {\n this._resetDailyIfNeeded()\n this._dailySpent += value\n }\n\n private _resetDailyIfNeeded(): void {\n const now = Date.now()\n const ONE_DAY = 24 * 60 * 60 * 1000\n if (now - this._dailyResetTime > ONE_DAY) {\n this._dailySpent = 0n\n this._dailyResetTime = now\n }\n }\n}\n\nfunction parseHumanAmount(amount: string): bigint | null {\n const parts = amount.trim().split(/\\s+/)\n const num = parseFloat(parts[0])\n if (isNaN(num)) return null\n\n const unit = parts[1]?.toUpperCase() || 'WEI'\n\n switch (unit) {\n case 'ETH':\n return BigInt(Math.floor(num * 1e18))\n case 'GWEI':\n return BigInt(Math.floor(num * 1e9))\n case 'WEI':\n return BigInt(Math.floor(num))\n case 'USDC':\n case 'USDT':\n return BigInt(Math.floor(num * 1e6))\n case 'DAI':\n return BigInt(Math.floor(num * 1e18))\n default:\n return null\n }\n}\n","import type { Address } from 'viem'\n\nexport const TOKENS: Record<string, Record<string, Address>> = {\n sepolia: {\n USDC: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n WETH: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n DAI: '0x68194a729C2450ad26072b3D33ADaCbcef39D574',\n },\n 'base-sepolia': {\n USDC: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n WETH: '0x4200000000000000000000000000000000000006',\n },\n base: {\n USDC: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n WETH: '0x4200000000000000000000000000000000000006',\n DAI: '0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb',\n USDbC: '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA',\n },\n}\n\nexport const ERC20_ABI = [\n {\n inputs: [{ name: 'account', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { name: 'spender', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n name: 'approve',\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { name: 'to', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n name: 'transfer',\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint8' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'symbol',\n outputs: [{ name: '', type: 'string' }],\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n","import type { Address } from 'viem'\nimport { getAddress } from 'viem'\n\nimport type { SupportedChain } from '../core/types'\nimport { TOKENS } from '../utils/constants'\nimport { BarzKitError } from '../utils/errors'\n\n/** Sentinel address representing native ETH in token registries */\nexport const ETH_SENTINEL: Address = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'\n\nconst TOKEN_DECIMALS: Record<string, number> = {\n ETH: 18,\n WETH: 18,\n USDC: 6,\n USDT: 6,\n DAI: 18,\n USDbC: 6,\n}\n\n/**\n * Resolve a token symbol or address to a checksummed address.\n *\n * - Symbols are looked up in the TOKENS registry for the given chain.\n * - \"ETH\" resolves to ETH_SENTINEL.\n * - Raw hex addresses (0x...) are passed through with checksum validation.\n */\nexport function resolveToken(symbolOrAddress: string, chain: SupportedChain): Address {\n // Raw address passthrough\n if (symbolOrAddress.startsWith('0x')) {\n return getAddress(symbolOrAddress) as Address\n }\n\n const symbol = symbolOrAddress.toUpperCase()\n\n if (symbol === 'ETH') {\n return ETH_SENTINEL\n }\n\n const chainTokens = TOKENS[chain]\n if (!chainTokens) {\n throw new BarzKitError(\n `No tokens configured for chain \"${chain}\".`,\n 'UNSUPPORTED_CHAIN',\n )\n }\n\n const address = chainTokens[symbol]\n if (!address) {\n throw new BarzKitError(\n `Unknown token \"${symbolOrAddress}\" on ${chain}. Available: ${Object.keys(chainTokens).join(', ')}`,\n 'UNKNOWN_TOKEN',\n )\n }\n\n return address\n}\n\n/**\n * Get the number of decimals for a known token symbol.\n * Returns null for unknown symbols.\n */\nexport function getTokenDecimals(symbol: string): number | null {\n return TOKEN_DECIMALS[symbol.toUpperCase()] ?? null\n}\n\n/** Check if a token address or symbol represents native ETH */\nexport function isNativeETH(token: string): boolean {\n if (token.toUpperCase() === 'ETH') return true\n if (token.startsWith('0x')) {\n return token.toLowerCase() === ETH_SENTINEL.toLowerCase()\n }\n return false\n}\n","import type { Address, Hex } from 'viem'\nimport { encodeFunctionData, parseUnits } from 'viem'\n\nimport type { SwapParams, SupportedChain, TransactionRequest } from '../core/types'\nimport { resolveToken, getTokenDecimals, isNativeETH, ETH_SENTINEL } from './tokens'\nimport { BarzKitError } from '../utils/errors'\nimport { ERC20_ABI } from '../utils/constants'\n\n/** Uniswap V3 SwapRouter02 addresses per chain */\nexport const UNISWAP_V3_ROUTER: Partial<Record<SupportedChain, Address>> = {\n sepolia: '0x3bFA4769FB09eefC5a80d6E87c3B9C650f7Ae48E',\n}\n\nconst SWAP_ROUTER_ABI = [\n {\n inputs: [\n {\n components: [\n { name: 'tokenIn', type: 'address' },\n { name: 'tokenOut', type: 'address' },\n { name: 'fee', type: 'uint24' },\n { name: 'recipient', type: 'address' },\n { name: 'amountIn', type: 'uint256' },\n { name: 'amountOutMinimum', type: 'uint256' },\n { name: 'sqrtPriceLimitX96', type: 'uint160' },\n ],\n name: 'params',\n type: 'tuple',\n },\n ],\n name: 'exactInputSingle',\n outputs: [{ name: 'amountOut', type: 'uint256' }],\n stateMutability: 'payable',\n type: 'function',\n },\n] as const\n\n/**\n * Build transaction calldata for a Uniswap V3 swap.\n *\n * - ETH input: single swap tx with value (router wraps to WETH)\n * - ERC20 input: [approve, swap] — two transactions\n *\n * Pure function — no network calls.\n */\nexport function buildSwapTransactions(\n params: SwapParams,\n chain: SupportedChain,\n account: Address,\n): TransactionRequest[] {\n const router = UNISWAP_V3_ROUTER[chain]\n if (!router) {\n throw new BarzKitError(\n `Uniswap V3 is not available on \"${chain}\". Supported: ${Object.keys(UNISWAP_V3_ROUTER).join(', ')}`,\n 'UNSUPPORTED_CHAIN',\n )\n }\n\n const tokenIn = resolveToken(params.from, chain)\n const tokenOut = resolveToken(params.to, chain)\n\n if (tokenIn.toLowerCase() === tokenOut.toLowerCase()) {\n throw new BarzKitError(\n `Cannot swap a token to itself (\"${params.from}\" → \"${params.to}\").`,\n 'INVALID_SWAP',\n )\n }\n\n const fromIsETH = isNativeETH(params.from)\n\n // Determine decimals from the input token symbol\n const fromSymbol = params.from.startsWith('0x') ? null : params.from\n const decimals = fromSymbol ? (getTokenDecimals(fromSymbol) ?? 18) : 18\n const amountIn = parseUnits(params.amount, decimals)\n\n // For router: ETH swaps use WETH address as tokenIn\n const routerTokenIn = fromIsETH\n ? resolveToken('WETH', chain)\n : tokenIn\n\n // ETH output: the router sends WETH, so tokenOut stays as resolved\n // (user receives WETH which they can unwrap separately)\n const routerTokenOut = isNativeETH(params.to)\n ? resolveToken('WETH', chain)\n : tokenOut\n\n const fee = params.fee ?? 3000\n // amountOutMinimum: 0 for simplicity in Phase 1 (slippage protection via deadline)\n const amountOutMinimum = 0n\n\n const swapData = encodeFunctionData({\n abi: SWAP_ROUTER_ABI,\n functionName: 'exactInputSingle',\n args: [\n {\n tokenIn: routerTokenIn,\n tokenOut: routerTokenOut,\n fee,\n recipient: account,\n amountIn,\n amountOutMinimum,\n sqrtPriceLimitX96: 0n,\n },\n ],\n })\n\n const txs: TransactionRequest[] = []\n\n if (fromIsETH) {\n // ETH swap: no approve needed, pass value directly\n txs.push({\n to: router,\n value: amountIn,\n data: swapData as Hex,\n })\n } else {\n // ERC20 swap: approve + swap\n const approveData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'approve',\n args: [router, amountIn],\n })\n\n txs.push({\n to: tokenIn,\n data: approveData as Hex,\n })\n\n txs.push({\n to: router,\n data: swapData as Hex,\n })\n }\n\n return txs\n}\n\n/**\n * Get all token addresses involved in a swap (for permission validation).\n */\nexport function getSwapTokenAddresses(params: SwapParams, chain: SupportedChain): Address[] {\n const addresses: Address[] = []\n\n const tokenIn = resolveToken(params.from, chain)\n const tokenOut = resolveToken(params.to, chain)\n\n if (tokenIn !== ETH_SENTINEL) addresses.push(tokenIn)\n if (tokenOut !== ETH_SENTINEL) addresses.push(tokenOut)\n\n return addresses\n}\n","import type { Address, Hex } from 'viem'\nimport { encodeFunctionData, parseUnits } from 'viem'\n\nimport type { LendParams, SupportedChain, TransactionRequest } from '../core/types'\nimport { resolveToken, getTokenDecimals, isNativeETH } from './tokens'\nimport { BarzKitError } from '../utils/errors'\nimport { ERC20_ABI } from '../utils/constants'\n\n/** Aave V3 Pool addresses per chain */\nexport const AAVE_V3_POOL: Partial<Record<SupportedChain, Address>> = {\n sepolia: '0x6Ae43d3271ff6888e7Fc43Fd7321a503ff738951',\n}\n\nconst AAVE_POOL_ABI = [\n {\n inputs: [\n { name: 'asset', type: 'address' },\n { name: 'amount', type: 'uint256' },\n { name: 'onBehalfOf', type: 'address' },\n { name: 'referralCode', type: 'uint16' },\n ],\n name: 'supply',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const\n\n/**\n * Build transaction calldata for an Aave V3 supply (lending).\n *\n * Always returns [approve, supply] — two transactions.\n * Native ETH is rejected (wrap to WETH first).\n *\n * Pure function — no network calls.\n */\nexport function buildLendTransactions(\n params: LendParams,\n chain: SupportedChain,\n account: Address,\n): TransactionRequest[] {\n if (params.protocol !== 'aave') {\n throw new BarzKitError(\n `Unknown lending protocol \"${params.protocol}\". Supported: aave`,\n 'UNKNOWN_PROTOCOL',\n )\n }\n\n const pool = AAVE_V3_POOL[chain]\n if (!pool) {\n throw new BarzKitError(\n `Aave V3 is not available on \"${chain}\". Supported: ${Object.keys(AAVE_V3_POOL).join(', ')}`,\n 'UNSUPPORTED_CHAIN',\n )\n }\n\n if (isNativeETH(params.token)) {\n throw new BarzKitError(\n 'Cannot supply native ETH to Aave. Wrap to WETH first, then supply WETH.',\n 'NATIVE_ETH_NOT_SUPPORTED',\n )\n }\n\n const tokenAddress = resolveToken(params.token, chain)\n\n const tokenSymbol = params.token.startsWith('0x') ? null : params.token\n const decimals = tokenSymbol ? (getTokenDecimals(tokenSymbol) ?? 18) : 18\n const amount = parseUnits(params.amount, decimals)\n\n const approveData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'approve',\n args: [pool, amount],\n })\n\n const supplyData = encodeFunctionData({\n abi: AAVE_POOL_ABI,\n functionName: 'supply',\n args: [tokenAddress, amount, account, 0],\n })\n\n return [\n {\n to: tokenAddress,\n data: approveData as Hex,\n },\n {\n to: pool,\n data: supplyData as Hex,\n },\n ]\n}\n\n/**\n * Get all token addresses involved in a lend operation (for permission validation).\n */\nexport function getLendTokenAddresses(params: LendParams, chain: SupportedChain): Address[] {\n const tokenAddress = resolveToken(params.token, chain)\n return [tokenAddress]\n}\n","import { http } from 'viem'\nimport type { Address, Hash, Hex } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { entryPoint06Address } from 'viem/account-abstraction'\nimport { createSmartAccountClient } from 'permissionless'\nimport { toTrustSmartAccount } from 'permissionless/accounts'\n\nimport type {\n AgentConfig,\n BarzAgent,\n SwapParams,\n LendParams,\n TransactionRequest,\n TransactionReceipt,\n AgentPermissions,\n} from './types'\nimport { createClients } from './client'\nimport { PermissionManager } from '../permissions/permissions'\nimport { BarzKitError, ConfigError, FrozenError, PermissionError, humanizeError, TransactionError } from '../utils/errors'\nimport { ERC20_ABI } from '../utils/constants'\nimport { buildSwapTransactions, getSwapTokenAddresses } from '../actions/swap'\nimport { buildLendTransactions, getLendTokenAddresses } from '../actions/lend'\n\n/**\n * Create a Barz agent wallet.\n *\n * @example\n * ```ts\n * const agent = await createBarzAgent({\n * chain: 'sepolia',\n * owner: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',\n * pimlico: { apiKey: 'pim_...' },\n * })\n *\n * console.log('Agent address:', agent.address)\n * ```\n */\nexport async function createBarzAgent(config: AgentConfig): Promise<BarzAgent> {\n validateConfig(config)\n\n const { publicClient, pimlicoClient, chainConfig, bundlerUrl } = createClients(config)\n const ownerAccount = privateKeyToAccount(config.owner)\n\n const smartAccount = await toTrustSmartAccount({\n client: publicClient,\n owner: ownerAccount,\n index: config.index ?? 0n,\n entryPoint: {\n address: entryPoint06Address,\n version: '0.6',\n },\n })\n\n const gasless = config.gasless !== false\n\n const smartAccountClient = createSmartAccountClient({\n account: smartAccount,\n chain: chainConfig.chain,\n bundlerTransport: http(bundlerUrl),\n ...(gasless\n ? {\n paymaster: pimlicoClient,\n userOperation: {\n estimateFeesPerGas: async () =>\n (await pimlicoClient.getUserOperationGasPrice()).fast,\n },\n }\n : {\n userOperation: {\n estimateFeesPerGas: async () =>\n (await pimlicoClient.getUserOperationGasPrice()).fast,\n },\n }),\n })\n\n if (config.chain === 'base') {\n console.warn('\\u26a0\\ufe0f Using Base mainnet \\u2014 real funds at risk')\n }\n\n const permissionManager = new PermissionManager(config.permissions)\n let frozen = false\n\n async function executeBatch(txs: TransactionRequest[]): Promise<Hash> {\n for (const tx of txs) {\n permissionManager.validate(tx)\n }\n\n try {\n const userOpHash = await smartAccountClient.sendUserOperation({\n calls: txs.map((tx) => ({\n to: tx.to,\n value: tx.value ?? 0n,\n data: tx.data ?? ('0x' as Hex),\n })),\n })\n\n const receipt = await smartAccountClient.waitForUserOperationReceipt({\n hash: userOpHash,\n })\n\n const totalValue = txs.reduce((sum, tx) => sum + (tx.value ?? 0n), 0n)\n if (totalValue > 0n) permissionManager.recordSpend(totalValue)\n\n return receipt.receipt.transactionHash\n } catch (error) {\n throw humanizeError(error)\n }\n }\n\n const agent: BarzAgent = {\n address: smartAccount.address,\n chain: config.chain,\n owner: ownerAccount.address,\n\n async sendTransaction(tx: TransactionRequest): Promise<Hash> {\n if (frozen) throw new FrozenError()\n permissionManager.validate(tx)\n\n try {\n const hash = await smartAccountClient.sendTransaction({\n to: tx.to,\n value: tx.value ?? 0n,\n data: tx.data ?? '0x',\n })\n\n if (tx.value) permissionManager.recordSpend(tx.value)\n return hash\n } catch (error) {\n throw humanizeError(error)\n }\n },\n\n async batchTransactions(txs: TransactionRequest[]): Promise<Hash> {\n if (frozen) throw new FrozenError()\n if (txs.length === 0) {\n throw new BarzKitError(\n 'batchTransactions requires at least one transaction.',\n 'BATCH_EMPTY',\n )\n }\n\n return executeBatch(txs)\n },\n\n async getBalance(token?: Address): Promise<bigint> {\n try {\n if (!token) {\n return await publicClient.getBalance({ address: smartAccount.address })\n }\n\n const balance = await publicClient.readContract({\n address: token,\n abi: ERC20_ABI,\n functionName: 'balanceOf',\n args: [smartAccount.address],\n })\n\n return balance as bigint\n } catch (error) {\n throw humanizeError(error)\n }\n },\n\n async waitForTransaction(hash: Hash): Promise<TransactionReceipt> {\n try {\n const receipt = await publicClient.waitForTransactionReceipt({ hash })\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: receipt.blockNumber,\n status: receipt.status,\n gasUsed: receipt.gasUsed,\n }\n } catch (error) {\n throw new TransactionError(\n `Failed waiting for transaction ${hash}: ${error instanceof Error ? error.message : error}`,\n hash,\n )\n }\n },\n\n async swap(params: SwapParams): Promise<Hash> {\n if (frozen) throw new FrozenError()\n\n const tokenAddresses = getSwapTokenAddresses(params, config.chain)\n validateTokenPermissions(tokenAddresses, permissionManager.permissions)\n\n const txs = buildSwapTransactions(params, config.chain, smartAccount.address)\n return executeBatch(txs)\n },\n\n async lend(params: LendParams): Promise<Hash> {\n if (frozen) throw new FrozenError()\n\n const tokenAddresses = getLendTokenAddresses(params, config.chain)\n validateTokenPermissions(tokenAddresses, permissionManager.permissions)\n\n const txs = buildLendTransactions(params, config.chain, smartAccount.address)\n return executeBatch(txs)\n },\n\n getExplorerUrl(hash: Hash): string {\n return `${chainConfig.explorerUrl}/tx/${hash}`\n },\n\n getPermissions(): AgentPermissions {\n return permissionManager.permissions\n },\n\n updatePermissions(permissions: Partial<AgentPermissions>): void {\n permissionManager.update(permissions)\n },\n\n async freeze(): Promise<Hash> {\n frozen = true\n return '0x0000000000000000000000000000000000000000000000000000000000000000' as Hash\n },\n\n async unfreeze(): Promise<Hash> {\n frozen = false\n return '0x0000000000000000000000000000000000000000000000000000000000000000' as Hash\n },\n\n async isActive(): Promise<boolean> {\n return !frozen\n },\n }\n\n return agent\n}\n\nfunction validateConfig(config: AgentConfig): void {\n if (!config) throw new ConfigError('Agent config is required.')\n\n if (!config.chain) {\n throw new ConfigError('Missing \"chain\". Supported: sepolia, base-sepolia, base.')\n }\n if (!config.owner) {\n throw new ConfigError('Missing \"owner\". Provide a hex private key.')\n }\n if (!config.owner.startsWith('0x') || config.owner.length !== 66) {\n throw new ConfigError(\n 'Invalid \"owner\" private key. Must be a 32-byte hex string starting with \"0x\" (66 chars total).',\n )\n }\n if (!config.pimlico?.apiKey) {\n throw new ConfigError('Missing \"pimlico.apiKey\". Get a free key at https://dashboard.pimlico.io')\n }\n}\n\nfunction validateTokenPermissions(tokenAddresses: Address[], permissions: AgentPermissions): void {\n if (!permissions.allowedTokens || permissions.allowedTokens.length === 0) return\n\n const allowed = permissions.allowedTokens.map((a) => a.toLowerCase())\n for (const token of tokenAddresses) {\n if (!allowed.includes(token.toLowerCase())) {\n throw new PermissionError(\n `Token ${token} is not in the allowed list. ` +\n `Allowed: ${permissions.allowedTokens.join(', ')}`,\n )\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@barzkit/sdk",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
- "description": "Self-custody wallet infrastructure for AI agents. Deploy an autonomous, audited smart account in 5 minutes.",
5
+ "description": "Self-custody AI agent wallets with passkeys, gasless transactions & programmable permissions (ERC-4337)",
6
6
  "main": "./dist/index.cjs",
7
7
  "module": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
@@ -15,7 +15,8 @@
15
15
  },
16
16
  "files": [
17
17
  "dist",
18
- "README.md"
18
+ "README.md",
19
+ "CHANGELOG.md"
19
20
  ],
20
21
  "scripts": {
21
22
  "build": "tsup",
@@ -26,17 +27,16 @@
26
27
  "clean": "rm -rf dist"
27
28
  },
28
29
  "keywords": [
29
- "ai-agent",
30
- "wallet",
31
- "erc-4337",
32
- "account-abstraction",
30
+ "typescript",
31
+ "sdk",
32
+ "web3",
33
+ "ai-agents",
34
+ "defi",
33
35
  "trust-wallet",
34
- "barz",
35
- "self-custody",
36
- "smart-account",
37
- "diamond-proxy",
38
- "passkeys",
39
- "gasless"
36
+ "account-abstraction",
37
+ "erc-4337",
38
+ "smart-accounts",
39
+ "barz"
40
40
  ],
41
41
  "author": "",
42
42
  "license": "MIT",