@barzkit/sdk 0.1.3 → 0.1.5

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/CHANGELOG.md CHANGED
@@ -5,6 +5,33 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.1.5] - 2026-03-02
9
+
10
+ ### Added
11
+
12
+ - `@barzkit/elizaos` — ElizaOS plugin for AI agent wallets (separate package in `plugins/elizaos/`)
13
+ - 8 actions: SEND_TRANSACTION, CHECK_BALANCE, SWAP_TOKENS, LEND_TOKENS, BATCH_TRANSACTIONS, FREEZE_WALLET, UNFREEZE_WALLET, FETCH_WITH_PAYMENT
14
+ - `BarzService` — ElizaOS service lifecycle for BarzKit smart accounts
15
+ - `walletProvider` — wallet context provider (address, balance, status)
16
+ - ElizaOS plugin documentation (`docs/advanced/elizaos-plugin.md`)
17
+ - `elizaos-agent` example
18
+ - `plugins/` directory structure for all `@barzkit` plugins
19
+
20
+ ## [0.1.4] - 2026-03-01
21
+
22
+ ### Added
23
+
24
+ - x402 payment protocol support: machine-to-machine HTTP 402 payments
25
+ - `enableX402()` method on `BarzAgent` — configure payment limits and domain whitelist
26
+ - `fetchWithPayment()` method on `BarzAgent` — auto-pay 402 responses and retry with proof
27
+ - `X402Config` and `X402PaymentRequest` interfaces
28
+ - `X402Manager` — per-request and daily spend limit enforcement with 24h rolling window
29
+ - `parsePaymentRequired()` — parse 402 response headers into structured payment request
30
+ - `validateDomain()` — domain whitelist check for payment endpoints
31
+ - `buildPaymentTransaction()` — build ERC-20 transfer for x402 payment
32
+ - `X402Error` error class
33
+ - Unit tests for x402 parsing, validation, manager, and fetch flow
34
+
8
35
  ## [0.1.3] - 2026-03-01
9
36
 
10
37
  ### Added
@@ -86,6 +113,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
86
113
  - `AgentEvent` type definitions for future event hooks
87
114
  - Dual-package build: ESM (`.mjs`) + CJS (`.js`) + DTS (`.d.ts`)
88
115
 
116
+ [0.1.5]: https://github.com/barzkit/sdk/compare/v0.1.4...v0.1.5
117
+ [0.1.4]: https://github.com/barzkit/sdk/compare/v0.1.3...v0.1.4
89
118
  [0.1.3]: https://github.com/barzkit/sdk/compare/v0.1.2...v0.1.3
90
119
  [0.1.2]: https://github.com/barzkit/sdk/compare/v0.1.1...v0.1.2
91
120
  [0.1.1]: https://github.com/barzkit/sdk/compare/v0.1.0...v0.1.1
package/README.md CHANGED
@@ -158,9 +158,9 @@ See [examples](https://github.com/barzkit/examples) for complete working example
158
158
  - [x] Batch transactions: atomic multi-call in one UserOperation
159
159
  - [x] Multi-chain: Base Sepolia, Base mainnet
160
160
  - [x] DeFi actions: swap, lend (Uniswap, Aave)
161
- - [ ] ElizaOS plugin
161
+ - [x] x402 payment handler
162
+ - [x] ElizaOS plugin
162
163
  - [ ] LangChain tool
163
- - [ ] x402 payment handler
164
164
  - [ ] On-chain permission enforcement via Diamond Facets
165
165
 
166
166
  ## Contributing
package/dist/index.cjs CHANGED
@@ -88,6 +88,12 @@ var TransactionError = class extends BarzKitError {
88
88
  this.txHash = txHash;
89
89
  }
90
90
  };
91
+ var X402Error = class extends BarzKitError {
92
+ constructor(message) {
93
+ super(message, "X402_ERROR");
94
+ this.name = "X402Error";
95
+ }
96
+ };
91
97
  var BundlerError = class extends BarzKitError {
92
98
  constructor(message) {
93
99
  super(message, "BUNDLER_ERROR");
@@ -526,6 +532,154 @@ function getLendTokenAddresses(params, chain) {
526
532
  const tokenAddress = resolveToken(params.token, chain);
527
533
  return [tokenAddress];
528
534
  }
535
+ var HEADER_AMOUNT = "x-payment-amount";
536
+ var HEADER_ADDRESS = "x-payment-address";
537
+ var HEADER_TOKEN = "x-payment-token";
538
+ var HEADER_NETWORK = "x-payment-network";
539
+ var HEADER_PROOF = "X-Payment-Proof";
540
+ function parsePaymentRequired(response) {
541
+ const amount = response.headers.get(HEADER_AMOUNT);
542
+ const address = response.headers.get(HEADER_ADDRESS);
543
+ const token = response.headers.get(HEADER_TOKEN);
544
+ const network = response.headers.get(HEADER_NETWORK);
545
+ if (!amount || !address || !token || !network) {
546
+ const missing = [
547
+ !amount && "X-Payment-Amount",
548
+ !address && "X-Payment-Address",
549
+ !token && "X-Payment-Token",
550
+ !network && "X-Payment-Network"
551
+ ].filter(Boolean);
552
+ throw new X402Error(`402 response missing required headers: ${missing.join(", ")}`);
553
+ }
554
+ const parsed = BigInt(amount);
555
+ if (parsed <= 0n) {
556
+ throw new X402Error(`Invalid payment amount: ${amount}`);
557
+ }
558
+ return {
559
+ amount: parsed,
560
+ address,
561
+ token,
562
+ network
563
+ };
564
+ }
565
+ function validateDomain(url, allowedDomains) {
566
+ if (!allowedDomains || allowedDomains.length === 0) return;
567
+ const hostname = new URL(url).hostname;
568
+ if (!allowedDomains.includes(hostname)) {
569
+ throw new X402Error(
570
+ `Domain "${hostname}" is not in the allowed list. Allowed: ${allowedDomains.join(", ")}`
571
+ );
572
+ }
573
+ }
574
+ var X402Manager = class {
575
+ _config = null;
576
+ _dailySpent = 0n;
577
+ _windowStart = 0;
578
+ get enabled() {
579
+ return this._config !== null;
580
+ }
581
+ get config() {
582
+ return this._config;
583
+ }
584
+ get dailySpent() {
585
+ this.resetIfExpired();
586
+ return this._dailySpent;
587
+ }
588
+ enable(config) {
589
+ this._config = config;
590
+ this._dailySpent = 0n;
591
+ this._windowStart = Date.now();
592
+ }
593
+ validatePayment(amount) {
594
+ if (!this._config) throw new X402Error("x402 not enabled");
595
+ this.resetIfExpired();
596
+ const maxPerRequest = parseHumanAmountToAtomic(this._config.maxPaymentPerRequest);
597
+ if (amount > maxPerRequest) {
598
+ throw new PermissionError(
599
+ `Payment amount ${amount} exceeds per-request limit of ${maxPerRequest} (${this._config.maxPaymentPerRequest})`
600
+ );
601
+ }
602
+ const maxDaily = parseHumanAmountToAtomic(this._config.maxDailyPayments);
603
+ if (this._dailySpent + amount > maxDaily) {
604
+ throw new PermissionError(
605
+ `Payment would exceed daily limit of ${maxDaily} (${this._config.maxDailyPayments}). Already spent: ${this._dailySpent}`
606
+ );
607
+ }
608
+ }
609
+ recordPayment(amount) {
610
+ this.resetIfExpired();
611
+ this._dailySpent += amount;
612
+ }
613
+ resetIfExpired() {
614
+ const now = Date.now();
615
+ const elapsed = now - this._windowStart;
616
+ const DAY_MS = 24 * 60 * 60 * 1e3;
617
+ if (elapsed >= DAY_MS) {
618
+ this._dailySpent = 0n;
619
+ this._windowStart = now;
620
+ }
621
+ }
622
+ };
623
+ function buildPaymentTransaction(payment) {
624
+ const data = viem.encodeFunctionData({
625
+ abi: ERC20_ABI,
626
+ functionName: "transfer",
627
+ args: [payment.address, payment.amount]
628
+ });
629
+ return {
630
+ to: payment.token,
631
+ data
632
+ };
633
+ }
634
+ function createFetchWithPayment(manager, sendTransaction) {
635
+ return async function fetchWithPayment(url, options) {
636
+ if (!manager.enabled) {
637
+ throw new X402Error("x402 not enabled. Call agent.enableX402() first.");
638
+ }
639
+ const config = manager.config;
640
+ validateDomain(url, config.allowedDomains);
641
+ const response = await fetch(url, options);
642
+ if (response.status !== 402) {
643
+ return response;
644
+ }
645
+ const payment = parsePaymentRequired(response);
646
+ manager.validatePayment(payment.amount);
647
+ const txHash = await sendTransaction(buildPaymentTransaction(payment));
648
+ manager.recordPayment(payment.amount);
649
+ return fetch(url, {
650
+ ...options,
651
+ headers: {
652
+ ...options?.headers,
653
+ [HEADER_PROOF]: txHash
654
+ }
655
+ });
656
+ };
657
+ }
658
+ function parseHumanAmountToAtomic(input) {
659
+ const parts = input.trim().split(/\s+/);
660
+ if (parts.length !== 2) {
661
+ throw new X402Error(`Invalid amount format: "${input}". Expected "0.01 USDC".`);
662
+ }
663
+ const [numStr, unit] = parts;
664
+ const upper = unit.toUpperCase();
665
+ let decimals;
666
+ switch (upper) {
667
+ case "USDC":
668
+ case "USDT":
669
+ decimals = 6;
670
+ break;
671
+ case "DAI":
672
+ case "ETH":
673
+ case "WETH":
674
+ decimals = 18;
675
+ break;
676
+ default:
677
+ throw new X402Error(`Unknown token unit in amount: "${unit}"`);
678
+ }
679
+ const [whole, frac = ""] = numStr.split(".");
680
+ const padded = frac.padEnd(decimals, "0").slice(0, decimals);
681
+ return BigInt(whole + padded);
682
+ }
529
683
 
530
684
  // src/core/account.ts
531
685
  async function createBarzAgent(config) {
@@ -561,6 +715,7 @@ async function createBarzAgent(config) {
561
715
  console.warn("\u26A0\uFE0F Using Base mainnet \u2014 real funds at risk");
562
716
  }
563
717
  const permissionManager = new PermissionManager(config.permissions);
718
+ const x402Manager = new X402Manager();
564
719
  let frozen = false;
565
720
  async function executeBatch(txs) {
566
721
  for (const tx of txs) {
@@ -659,6 +814,10 @@ async function createBarzAgent(config) {
659
814
  const txs = buildLendTransactions(params, config.chain, smartAccount.address);
660
815
  return executeBatch(txs);
661
816
  },
817
+ enableX402(x402Config) {
818
+ x402Manager.enable(x402Config);
819
+ },
820
+ fetchWithPayment: null,
662
821
  getExplorerUrl(hash) {
663
822
  return `${chainConfig.explorerUrl}/tx/${hash}`;
664
823
  },
@@ -680,6 +839,10 @@ async function createBarzAgent(config) {
680
839
  return !frozen;
681
840
  }
682
841
  };
842
+ agent.fetchWithPayment = createFetchWithPayment(
843
+ x402Manager,
844
+ (tx) => agent.sendTransaction(tx)
845
+ );
683
846
  return agent;
684
847
  }
685
848
  function validateConfig(config) {
@@ -723,14 +886,20 @@ exports.PermissionError = PermissionError;
723
886
  exports.TOKENS = TOKENS;
724
887
  exports.TransactionError = TransactionError;
725
888
  exports.UNISWAP_V3_ROUTER = UNISWAP_V3_ROUTER;
889
+ exports.X402Error = X402Error;
890
+ exports.X402Manager = X402Manager;
726
891
  exports.buildLendTransactions = buildLendTransactions;
892
+ exports.buildPaymentTransaction = buildPaymentTransaction;
727
893
  exports.buildSwapTransactions = buildSwapTransactions;
728
894
  exports.createBarzAgent = createBarzAgent;
895
+ exports.createFetchWithPayment = createFetchWithPayment;
729
896
  exports.getChainConfig = getChainConfig;
730
897
  exports.getLendTokenAddresses = getLendTokenAddresses;
731
898
  exports.getSwapTokenAddresses = getSwapTokenAddresses;
732
899
  exports.getTokenDecimals = getTokenDecimals;
733
900
  exports.isNativeETH = isNativeETH;
901
+ exports.parsePaymentRequired = parsePaymentRequired;
734
902
  exports.resolveToken = resolveToken;
903
+ exports.validateDomain = validateDomain;
735
904
  //# sourceMappingURL=index.cjs.map
736
905
  //# sourceMappingURL=index.cjs.map
@@ -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/actions/tokens.ts","../src/actions/swap.ts","../src/actions/lend.ts","../src/core/account.ts"],"names":["sepolia","baseSepolia","base","createPublicClient","http","createPimlicoClient","entryPoint06Address","getAddress","parseUnits","encodeFunctionData","privateKeyToAccount","toTrustSmartAccount","createSmartAccountClient"],"mappings":"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","file":"index.cjs","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"]}
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/actions/x402.ts","../src/core/account.ts"],"names":["sepolia","baseSepolia","base","createPublicClient","http","createPimlicoClient","entryPoint06Address","getAddress","parseUnits","encodeFunctionData","privateKeyToAccount","toTrustSmartAccount","createSmartAccountClient"],"mappings":"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","file":"index.cjs","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 X402Error extends BarzKitError {\n constructor(message: string) {\n super(message, 'X402_ERROR')\n this.name = 'X402Error'\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 type { Address, Hash } from 'viem'\nimport { encodeFunctionData } from 'viem'\nimport type { X402Config, X402PaymentRequest, TransactionRequest } from '../core/types'\nimport { X402Error, PermissionError } from '../utils/errors'\nimport { ERC20_ABI } from '../utils/constants'\n\n// ─── Header Constants ───────────────────────────────────────\n\nconst HEADER_AMOUNT = 'x-payment-amount'\nconst HEADER_ADDRESS = 'x-payment-address'\nconst HEADER_TOKEN = 'x-payment-token'\nconst HEADER_NETWORK = 'x-payment-network'\nconst HEADER_PROOF = 'X-Payment-Proof'\n\n// ─── Parse 402 Response ─────────────────────────────────────\n\nexport function parsePaymentRequired(response: Response): X402PaymentRequest {\n const amount = response.headers.get(HEADER_AMOUNT)\n const address = response.headers.get(HEADER_ADDRESS)\n const token = response.headers.get(HEADER_TOKEN)\n const network = response.headers.get(HEADER_NETWORK)\n\n if (!amount || !address || !token || !network) {\n const missing = [\n !amount && 'X-Payment-Amount',\n !address && 'X-Payment-Address',\n !token && 'X-Payment-Token',\n !network && 'X-Payment-Network',\n ].filter(Boolean)\n throw new X402Error(`402 response missing required headers: ${missing.join(', ')}`)\n }\n\n const parsed = BigInt(amount)\n if (parsed <= 0n) {\n throw new X402Error(`Invalid payment amount: ${amount}`)\n }\n\n return {\n amount: parsed,\n address: address as Address,\n token: token as Address,\n network,\n }\n}\n\n// ─── Validation ─────────────────────────────────────────────\n\nexport function validateDomain(url: string, allowedDomains?: string[]): void {\n if (!allowedDomains || allowedDomains.length === 0) return\n\n const hostname = new URL(url).hostname\n if (!allowedDomains.includes(hostname)) {\n throw new X402Error(\n `Domain \"${hostname}\" is not in the allowed list. ` +\n `Allowed: ${allowedDomains.join(', ')}`,\n )\n }\n}\n\n// ─── Daily Spend Tracker ────────────────────────────────────\n\nexport class X402Manager {\n private _config: X402Config | null = null\n private _dailySpent = 0n\n private _windowStart = 0\n\n get enabled(): boolean {\n return this._config !== null\n }\n\n get config(): X402Config | null {\n return this._config\n }\n\n get dailySpent(): bigint {\n this.resetIfExpired()\n return this._dailySpent\n }\n\n enable(config: X402Config): void {\n this._config = config\n this._dailySpent = 0n\n this._windowStart = Date.now()\n }\n\n validatePayment(amount: bigint): void {\n if (!this._config) throw new X402Error('x402 not enabled')\n\n this.resetIfExpired()\n\n const maxPerRequest = parseHumanAmountToAtomic(this._config.maxPaymentPerRequest)\n if (amount > maxPerRequest) {\n throw new PermissionError(\n `Payment amount ${amount} exceeds per-request limit of ${maxPerRequest} ` +\n `(${this._config.maxPaymentPerRequest})`,\n )\n }\n\n const maxDaily = parseHumanAmountToAtomic(this._config.maxDailyPayments)\n if (this._dailySpent + amount > maxDaily) {\n throw new PermissionError(\n `Payment would exceed daily limit of ${maxDaily} ` +\n `(${this._config.maxDailyPayments}). Already spent: ${this._dailySpent}`,\n )\n }\n }\n\n recordPayment(amount: bigint): void {\n this.resetIfExpired()\n this._dailySpent += amount\n }\n\n private resetIfExpired(): void {\n const now = Date.now()\n const elapsed = now - this._windowStart\n const DAY_MS = 24 * 60 * 60 * 1000\n if (elapsed >= DAY_MS) {\n this._dailySpent = 0n\n this._windowStart = now\n }\n }\n}\n\n// ─── Build ERC-20 Transfer ──────────────────────────────────\n\nexport function buildPaymentTransaction(\n payment: X402PaymentRequest,\n): TransactionRequest {\n const data = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [payment.address, payment.amount],\n })\n\n return {\n to: payment.token,\n data,\n }\n}\n\n// ─── Fetch With Payment ─────────────────────────────────────\n\nexport function createFetchWithPayment(\n manager: X402Manager,\n sendTransaction: (tx: TransactionRequest) => Promise<Hash>,\n) {\n return async function fetchWithPayment(\n url: string,\n options?: RequestInit,\n ): Promise<Response> {\n if (!manager.enabled) {\n throw new X402Error('x402 not enabled. Call agent.enableX402() first.')\n }\n\n const config = manager.config!\n validateDomain(url, config.allowedDomains)\n\n const response = await fetch(url, options)\n\n if (response.status !== 402) {\n return response\n }\n\n const payment = parsePaymentRequired(response)\n manager.validatePayment(payment.amount)\n\n const txHash = await sendTransaction(buildPaymentTransaction(payment))\n manager.recordPayment(payment.amount)\n\n return fetch(url, {\n ...options,\n headers: {\n ...options?.headers,\n [HEADER_PROOF]: txHash,\n },\n })\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────\n\nfunction parseHumanAmountToAtomic(input: string): bigint {\n const parts = input.trim().split(/\\s+/)\n if (parts.length !== 2) {\n throw new X402Error(`Invalid amount format: \"${input}\". Expected \"0.01 USDC\".`)\n }\n\n const [numStr, unit] = parts\n const upper = unit.toUpperCase()\n\n let decimals: number\n switch (upper) {\n case 'USDC':\n case 'USDT':\n decimals = 6\n break\n case 'DAI':\n case 'ETH':\n case 'WETH':\n decimals = 18\n break\n default:\n throw new X402Error(`Unknown token unit in amount: \"${unit}\"`)\n }\n\n const [whole, frac = ''] = numStr.split('.')\n const padded = frac.padEnd(decimals, '0').slice(0, decimals)\n return BigInt(whole + padded)\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 X402Config,\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'\nimport { X402Manager, createFetchWithPayment } from '../actions/x402'\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 const x402Manager = new X402Manager()\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 enableX402(x402Config: X402Config): void {\n x402Manager.enable(x402Config)\n },\n\n fetchWithPayment: null as unknown as BarzAgent['fetchWithPayment'],\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 agent.fetchWithPayment = createFetchWithPayment(\n x402Manager,\n (tx) => agent.sendTransaction(tx),\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/dist/index.d.cts CHANGED
@@ -38,6 +38,24 @@ interface AgentPermissions {
38
38
  end: string;
39
39
  };
40
40
  }
41
+ interface X402Config {
42
+ /** Maximum payment amount per single request (e.g., '0.01 USDC') */
43
+ maxPaymentPerRequest: string;
44
+ /** Maximum total payments per 24h rolling window (e.g., '1 USDC') */
45
+ maxDailyPayments: string;
46
+ /** Optional whitelist of domains allowed to request payment */
47
+ allowedDomains?: string[];
48
+ }
49
+ interface X402PaymentRequest {
50
+ /** Payment amount in atomic units (e.g., USDC has 6 decimals) */
51
+ amount: bigint;
52
+ /** Merchant address to send payment to */
53
+ address: `0x${string}`;
54
+ /** Token contract address */
55
+ token: `0x${string}`;
56
+ /** Network name (e.g., 'base') */
57
+ network: string;
58
+ }
41
59
  interface SwapParams {
42
60
  /** Token to swap from (symbol like 'USDC' or address) */
43
61
  from: string;
@@ -81,6 +99,8 @@ interface BarzAgent {
81
99
  lend(params: LendParams): Promise<Hash>;
82
100
  getPermissions(): AgentPermissions;
83
101
  updatePermissions(permissions: Partial<AgentPermissions>): void;
102
+ enableX402(config: X402Config): void;
103
+ fetchWithPayment(url: string, options?: RequestInit): Promise<Response>;
84
104
  /** Get block explorer URL for a transaction hash */
85
105
  getExplorerUrl(hash: Hash): string;
86
106
  freeze(): Promise<Hash>;
@@ -138,6 +158,9 @@ declare class TransactionError extends BarzKitError {
138
158
  readonly txHash?: string;
139
159
  constructor(message: string, txHash?: string);
140
160
  }
161
+ declare class X402Error extends BarzKitError {
162
+ constructor(message: string);
163
+ }
141
164
  declare class BundlerError extends BarzKitError {
142
165
  constructor(message: string);
143
166
  }
@@ -258,4 +281,21 @@ declare function buildLendTransactions(params: LendParams, chain: SupportedChain
258
281
  */
259
282
  declare function getLendTokenAddresses(params: LendParams, chain: SupportedChain): Address[];
260
283
 
261
- export { AAVE_V3_POOL, type AgentConfig, type AgentEvent, type AgentPermissions, type BarzAgent, BarzKitError, BundlerError, CHAIN_CONFIGS, type ChainConfig, ConfigError, ERC20_ABI, ETH_SENTINEL, FrozenError, type LendParams, PermissionError, type SupportedChain, type SwapParams, TOKENS, TransactionError, type TransactionReceipt, type TransactionRequest, UNISWAP_V3_ROUTER, buildLendTransactions, buildSwapTransactions, createBarzAgent, getChainConfig, getLendTokenAddresses, getSwapTokenAddresses, getTokenDecimals, isNativeETH, resolveToken };
284
+ declare function parsePaymentRequired(response: Response): X402PaymentRequest;
285
+ declare function validateDomain(url: string, allowedDomains?: string[]): void;
286
+ declare class X402Manager {
287
+ private _config;
288
+ private _dailySpent;
289
+ private _windowStart;
290
+ get enabled(): boolean;
291
+ get config(): X402Config | null;
292
+ get dailySpent(): bigint;
293
+ enable(config: X402Config): void;
294
+ validatePayment(amount: bigint): void;
295
+ recordPayment(amount: bigint): void;
296
+ private resetIfExpired;
297
+ }
298
+ declare function buildPaymentTransaction(payment: X402PaymentRequest): TransactionRequest;
299
+ declare function createFetchWithPayment(manager: X402Manager, sendTransaction: (tx: TransactionRequest) => Promise<Hash>): (url: string, options?: RequestInit) => Promise<Response>;
300
+
301
+ export { AAVE_V3_POOL, type AgentConfig, type AgentEvent, type AgentPermissions, type BarzAgent, BarzKitError, BundlerError, CHAIN_CONFIGS, type ChainConfig, ConfigError, ERC20_ABI, ETH_SENTINEL, FrozenError, type LendParams, PermissionError, type SupportedChain, type SwapParams, TOKENS, TransactionError, type TransactionReceipt, type TransactionRequest, UNISWAP_V3_ROUTER, type X402Config, X402Error, X402Manager, type X402PaymentRequest, buildLendTransactions, buildPaymentTransaction, buildSwapTransactions, createBarzAgent, createFetchWithPayment, getChainConfig, getLendTokenAddresses, getSwapTokenAddresses, getTokenDecimals, isNativeETH, parsePaymentRequired, resolveToken, validateDomain };
package/dist/index.d.ts CHANGED
@@ -38,6 +38,24 @@ interface AgentPermissions {
38
38
  end: string;
39
39
  };
40
40
  }
41
+ interface X402Config {
42
+ /** Maximum payment amount per single request (e.g., '0.01 USDC') */
43
+ maxPaymentPerRequest: string;
44
+ /** Maximum total payments per 24h rolling window (e.g., '1 USDC') */
45
+ maxDailyPayments: string;
46
+ /** Optional whitelist of domains allowed to request payment */
47
+ allowedDomains?: string[];
48
+ }
49
+ interface X402PaymentRequest {
50
+ /** Payment amount in atomic units (e.g., USDC has 6 decimals) */
51
+ amount: bigint;
52
+ /** Merchant address to send payment to */
53
+ address: `0x${string}`;
54
+ /** Token contract address */
55
+ token: `0x${string}`;
56
+ /** Network name (e.g., 'base') */
57
+ network: string;
58
+ }
41
59
  interface SwapParams {
42
60
  /** Token to swap from (symbol like 'USDC' or address) */
43
61
  from: string;
@@ -81,6 +99,8 @@ interface BarzAgent {
81
99
  lend(params: LendParams): Promise<Hash>;
82
100
  getPermissions(): AgentPermissions;
83
101
  updatePermissions(permissions: Partial<AgentPermissions>): void;
102
+ enableX402(config: X402Config): void;
103
+ fetchWithPayment(url: string, options?: RequestInit): Promise<Response>;
84
104
  /** Get block explorer URL for a transaction hash */
85
105
  getExplorerUrl(hash: Hash): string;
86
106
  freeze(): Promise<Hash>;
@@ -138,6 +158,9 @@ declare class TransactionError extends BarzKitError {
138
158
  readonly txHash?: string;
139
159
  constructor(message: string, txHash?: string);
140
160
  }
161
+ declare class X402Error extends BarzKitError {
162
+ constructor(message: string);
163
+ }
141
164
  declare class BundlerError extends BarzKitError {
142
165
  constructor(message: string);
143
166
  }
@@ -258,4 +281,21 @@ declare function buildLendTransactions(params: LendParams, chain: SupportedChain
258
281
  */
259
282
  declare function getLendTokenAddresses(params: LendParams, chain: SupportedChain): Address[];
260
283
 
261
- export { AAVE_V3_POOL, type AgentConfig, type AgentEvent, type AgentPermissions, type BarzAgent, BarzKitError, BundlerError, CHAIN_CONFIGS, type ChainConfig, ConfigError, ERC20_ABI, ETH_SENTINEL, FrozenError, type LendParams, PermissionError, type SupportedChain, type SwapParams, TOKENS, TransactionError, type TransactionReceipt, type TransactionRequest, UNISWAP_V3_ROUTER, buildLendTransactions, buildSwapTransactions, createBarzAgent, getChainConfig, getLendTokenAddresses, getSwapTokenAddresses, getTokenDecimals, isNativeETH, resolveToken };
284
+ declare function parsePaymentRequired(response: Response): X402PaymentRequest;
285
+ declare function validateDomain(url: string, allowedDomains?: string[]): void;
286
+ declare class X402Manager {
287
+ private _config;
288
+ private _dailySpent;
289
+ private _windowStart;
290
+ get enabled(): boolean;
291
+ get config(): X402Config | null;
292
+ get dailySpent(): bigint;
293
+ enable(config: X402Config): void;
294
+ validatePayment(amount: bigint): void;
295
+ recordPayment(amount: bigint): void;
296
+ private resetIfExpired;
297
+ }
298
+ declare function buildPaymentTransaction(payment: X402PaymentRequest): TransactionRequest;
299
+ declare function createFetchWithPayment(manager: X402Manager, sendTransaction: (tx: TransactionRequest) => Promise<Hash>): (url: string, options?: RequestInit) => Promise<Response>;
300
+
301
+ export { AAVE_V3_POOL, type AgentConfig, type AgentEvent, type AgentPermissions, type BarzAgent, BarzKitError, BundlerError, CHAIN_CONFIGS, type ChainConfig, ConfigError, ERC20_ABI, ETH_SENTINEL, FrozenError, type LendParams, PermissionError, type SupportedChain, type SwapParams, TOKENS, TransactionError, type TransactionReceipt, type TransactionRequest, UNISWAP_V3_ROUTER, type X402Config, X402Error, X402Manager, type X402PaymentRequest, buildLendTransactions, buildPaymentTransaction, buildSwapTransactions, createBarzAgent, createFetchWithPayment, getChainConfig, getLendTokenAddresses, getSwapTokenAddresses, getTokenDecimals, isNativeETH, parsePaymentRequired, resolveToken, validateDomain };
package/dist/index.js CHANGED
@@ -86,6 +86,12 @@ var TransactionError = class extends BarzKitError {
86
86
  this.txHash = txHash;
87
87
  }
88
88
  };
89
+ var X402Error = class extends BarzKitError {
90
+ constructor(message) {
91
+ super(message, "X402_ERROR");
92
+ this.name = "X402Error";
93
+ }
94
+ };
89
95
  var BundlerError = class extends BarzKitError {
90
96
  constructor(message) {
91
97
  super(message, "BUNDLER_ERROR");
@@ -524,6 +530,154 @@ function getLendTokenAddresses(params, chain) {
524
530
  const tokenAddress = resolveToken(params.token, chain);
525
531
  return [tokenAddress];
526
532
  }
533
+ var HEADER_AMOUNT = "x-payment-amount";
534
+ var HEADER_ADDRESS = "x-payment-address";
535
+ var HEADER_TOKEN = "x-payment-token";
536
+ var HEADER_NETWORK = "x-payment-network";
537
+ var HEADER_PROOF = "X-Payment-Proof";
538
+ function parsePaymentRequired(response) {
539
+ const amount = response.headers.get(HEADER_AMOUNT);
540
+ const address = response.headers.get(HEADER_ADDRESS);
541
+ const token = response.headers.get(HEADER_TOKEN);
542
+ const network = response.headers.get(HEADER_NETWORK);
543
+ if (!amount || !address || !token || !network) {
544
+ const missing = [
545
+ !amount && "X-Payment-Amount",
546
+ !address && "X-Payment-Address",
547
+ !token && "X-Payment-Token",
548
+ !network && "X-Payment-Network"
549
+ ].filter(Boolean);
550
+ throw new X402Error(`402 response missing required headers: ${missing.join(", ")}`);
551
+ }
552
+ const parsed = BigInt(amount);
553
+ if (parsed <= 0n) {
554
+ throw new X402Error(`Invalid payment amount: ${amount}`);
555
+ }
556
+ return {
557
+ amount: parsed,
558
+ address,
559
+ token,
560
+ network
561
+ };
562
+ }
563
+ function validateDomain(url, allowedDomains) {
564
+ if (!allowedDomains || allowedDomains.length === 0) return;
565
+ const hostname = new URL(url).hostname;
566
+ if (!allowedDomains.includes(hostname)) {
567
+ throw new X402Error(
568
+ `Domain "${hostname}" is not in the allowed list. Allowed: ${allowedDomains.join(", ")}`
569
+ );
570
+ }
571
+ }
572
+ var X402Manager = class {
573
+ _config = null;
574
+ _dailySpent = 0n;
575
+ _windowStart = 0;
576
+ get enabled() {
577
+ return this._config !== null;
578
+ }
579
+ get config() {
580
+ return this._config;
581
+ }
582
+ get dailySpent() {
583
+ this.resetIfExpired();
584
+ return this._dailySpent;
585
+ }
586
+ enable(config) {
587
+ this._config = config;
588
+ this._dailySpent = 0n;
589
+ this._windowStart = Date.now();
590
+ }
591
+ validatePayment(amount) {
592
+ if (!this._config) throw new X402Error("x402 not enabled");
593
+ this.resetIfExpired();
594
+ const maxPerRequest = parseHumanAmountToAtomic(this._config.maxPaymentPerRequest);
595
+ if (amount > maxPerRequest) {
596
+ throw new PermissionError(
597
+ `Payment amount ${amount} exceeds per-request limit of ${maxPerRequest} (${this._config.maxPaymentPerRequest})`
598
+ );
599
+ }
600
+ const maxDaily = parseHumanAmountToAtomic(this._config.maxDailyPayments);
601
+ if (this._dailySpent + amount > maxDaily) {
602
+ throw new PermissionError(
603
+ `Payment would exceed daily limit of ${maxDaily} (${this._config.maxDailyPayments}). Already spent: ${this._dailySpent}`
604
+ );
605
+ }
606
+ }
607
+ recordPayment(amount) {
608
+ this.resetIfExpired();
609
+ this._dailySpent += amount;
610
+ }
611
+ resetIfExpired() {
612
+ const now = Date.now();
613
+ const elapsed = now - this._windowStart;
614
+ const DAY_MS = 24 * 60 * 60 * 1e3;
615
+ if (elapsed >= DAY_MS) {
616
+ this._dailySpent = 0n;
617
+ this._windowStart = now;
618
+ }
619
+ }
620
+ };
621
+ function buildPaymentTransaction(payment) {
622
+ const data = encodeFunctionData({
623
+ abi: ERC20_ABI,
624
+ functionName: "transfer",
625
+ args: [payment.address, payment.amount]
626
+ });
627
+ return {
628
+ to: payment.token,
629
+ data
630
+ };
631
+ }
632
+ function createFetchWithPayment(manager, sendTransaction) {
633
+ return async function fetchWithPayment(url, options) {
634
+ if (!manager.enabled) {
635
+ throw new X402Error("x402 not enabled. Call agent.enableX402() first.");
636
+ }
637
+ const config = manager.config;
638
+ validateDomain(url, config.allowedDomains);
639
+ const response = await fetch(url, options);
640
+ if (response.status !== 402) {
641
+ return response;
642
+ }
643
+ const payment = parsePaymentRequired(response);
644
+ manager.validatePayment(payment.amount);
645
+ const txHash = await sendTransaction(buildPaymentTransaction(payment));
646
+ manager.recordPayment(payment.amount);
647
+ return fetch(url, {
648
+ ...options,
649
+ headers: {
650
+ ...options?.headers,
651
+ [HEADER_PROOF]: txHash
652
+ }
653
+ });
654
+ };
655
+ }
656
+ function parseHumanAmountToAtomic(input) {
657
+ const parts = input.trim().split(/\s+/);
658
+ if (parts.length !== 2) {
659
+ throw new X402Error(`Invalid amount format: "${input}". Expected "0.01 USDC".`);
660
+ }
661
+ const [numStr, unit] = parts;
662
+ const upper = unit.toUpperCase();
663
+ let decimals;
664
+ switch (upper) {
665
+ case "USDC":
666
+ case "USDT":
667
+ decimals = 6;
668
+ break;
669
+ case "DAI":
670
+ case "ETH":
671
+ case "WETH":
672
+ decimals = 18;
673
+ break;
674
+ default:
675
+ throw new X402Error(`Unknown token unit in amount: "${unit}"`);
676
+ }
677
+ const [whole, frac = ""] = numStr.split(".");
678
+ const padded = frac.padEnd(decimals, "0").slice(0, decimals);
679
+ return BigInt(whole + padded);
680
+ }
527
681
 
528
682
  // src/core/account.ts
529
683
  async function createBarzAgent(config) {
@@ -559,6 +713,7 @@ async function createBarzAgent(config) {
559
713
  console.warn("\u26A0\uFE0F Using Base mainnet \u2014 real funds at risk");
560
714
  }
561
715
  const permissionManager = new PermissionManager(config.permissions);
716
+ const x402Manager = new X402Manager();
562
717
  let frozen = false;
563
718
  async function executeBatch(txs) {
564
719
  for (const tx of txs) {
@@ -657,6 +812,10 @@ async function createBarzAgent(config) {
657
812
  const txs = buildLendTransactions(params, config.chain, smartAccount.address);
658
813
  return executeBatch(txs);
659
814
  },
815
+ enableX402(x402Config) {
816
+ x402Manager.enable(x402Config);
817
+ },
818
+ fetchWithPayment: null,
660
819
  getExplorerUrl(hash) {
661
820
  return `${chainConfig.explorerUrl}/tx/${hash}`;
662
821
  },
@@ -678,6 +837,10 @@ async function createBarzAgent(config) {
678
837
  return !frozen;
679
838
  }
680
839
  };
840
+ agent.fetchWithPayment = createFetchWithPayment(
841
+ x402Manager,
842
+ (tx) => agent.sendTransaction(tx)
843
+ );
681
844
  return agent;
682
845
  }
683
846
  function validateConfig(config) {
@@ -709,6 +872,6 @@ function validateTokenPermissions(tokenAddresses, permissions) {
709
872
  }
710
873
  }
711
874
 
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 };
875
+ export { AAVE_V3_POOL, BarzKitError, BundlerError, CHAIN_CONFIGS, ConfigError, ERC20_ABI, ETH_SENTINEL, FrozenError, PermissionError, TOKENS, TransactionError, UNISWAP_V3_ROUTER, X402Error, X402Manager, buildLendTransactions, buildPaymentTransaction, buildSwapTransactions, createBarzAgent, createFetchWithPayment, getChainConfig, getLendTokenAddresses, getSwapTokenAddresses, getTokenDecimals, isNativeETH, parsePaymentRequired, resolveToken, validateDomain };
713
876
  //# sourceMappingURL=index.js.map
714
877
  //# 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/actions/tokens.ts","../src/actions/swap.ts","../src/actions/lend.ts","../src/core/account.ts"],"names":["parseUnits","encodeFunctionData","entryPoint06Address","http"],"mappings":"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","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"]}
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/actions/x402.ts","../src/core/account.ts"],"names":["parseUnits","encodeFunctionData","entryPoint06Address","http"],"mappings":"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","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 X402Error extends BarzKitError {\n constructor(message: string) {\n super(message, 'X402_ERROR')\n this.name = 'X402Error'\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 type { Address, Hash } from 'viem'\nimport { encodeFunctionData } from 'viem'\nimport type { X402Config, X402PaymentRequest, TransactionRequest } from '../core/types'\nimport { X402Error, PermissionError } from '../utils/errors'\nimport { ERC20_ABI } from '../utils/constants'\n\n// ─── Header Constants ───────────────────────────────────────\n\nconst HEADER_AMOUNT = 'x-payment-amount'\nconst HEADER_ADDRESS = 'x-payment-address'\nconst HEADER_TOKEN = 'x-payment-token'\nconst HEADER_NETWORK = 'x-payment-network'\nconst HEADER_PROOF = 'X-Payment-Proof'\n\n// ─── Parse 402 Response ─────────────────────────────────────\n\nexport function parsePaymentRequired(response: Response): X402PaymentRequest {\n const amount = response.headers.get(HEADER_AMOUNT)\n const address = response.headers.get(HEADER_ADDRESS)\n const token = response.headers.get(HEADER_TOKEN)\n const network = response.headers.get(HEADER_NETWORK)\n\n if (!amount || !address || !token || !network) {\n const missing = [\n !amount && 'X-Payment-Amount',\n !address && 'X-Payment-Address',\n !token && 'X-Payment-Token',\n !network && 'X-Payment-Network',\n ].filter(Boolean)\n throw new X402Error(`402 response missing required headers: ${missing.join(', ')}`)\n }\n\n const parsed = BigInt(amount)\n if (parsed <= 0n) {\n throw new X402Error(`Invalid payment amount: ${amount}`)\n }\n\n return {\n amount: parsed,\n address: address as Address,\n token: token as Address,\n network,\n }\n}\n\n// ─── Validation ─────────────────────────────────────────────\n\nexport function validateDomain(url: string, allowedDomains?: string[]): void {\n if (!allowedDomains || allowedDomains.length === 0) return\n\n const hostname = new URL(url).hostname\n if (!allowedDomains.includes(hostname)) {\n throw new X402Error(\n `Domain \"${hostname}\" is not in the allowed list. ` +\n `Allowed: ${allowedDomains.join(', ')}`,\n )\n }\n}\n\n// ─── Daily Spend Tracker ────────────────────────────────────\n\nexport class X402Manager {\n private _config: X402Config | null = null\n private _dailySpent = 0n\n private _windowStart = 0\n\n get enabled(): boolean {\n return this._config !== null\n }\n\n get config(): X402Config | null {\n return this._config\n }\n\n get dailySpent(): bigint {\n this.resetIfExpired()\n return this._dailySpent\n }\n\n enable(config: X402Config): void {\n this._config = config\n this._dailySpent = 0n\n this._windowStart = Date.now()\n }\n\n validatePayment(amount: bigint): void {\n if (!this._config) throw new X402Error('x402 not enabled')\n\n this.resetIfExpired()\n\n const maxPerRequest = parseHumanAmountToAtomic(this._config.maxPaymentPerRequest)\n if (amount > maxPerRequest) {\n throw new PermissionError(\n `Payment amount ${amount} exceeds per-request limit of ${maxPerRequest} ` +\n `(${this._config.maxPaymentPerRequest})`,\n )\n }\n\n const maxDaily = parseHumanAmountToAtomic(this._config.maxDailyPayments)\n if (this._dailySpent + amount > maxDaily) {\n throw new PermissionError(\n `Payment would exceed daily limit of ${maxDaily} ` +\n `(${this._config.maxDailyPayments}). Already spent: ${this._dailySpent}`,\n )\n }\n }\n\n recordPayment(amount: bigint): void {\n this.resetIfExpired()\n this._dailySpent += amount\n }\n\n private resetIfExpired(): void {\n const now = Date.now()\n const elapsed = now - this._windowStart\n const DAY_MS = 24 * 60 * 60 * 1000\n if (elapsed >= DAY_MS) {\n this._dailySpent = 0n\n this._windowStart = now\n }\n }\n}\n\n// ─── Build ERC-20 Transfer ──────────────────────────────────\n\nexport function buildPaymentTransaction(\n payment: X402PaymentRequest,\n): TransactionRequest {\n const data = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [payment.address, payment.amount],\n })\n\n return {\n to: payment.token,\n data,\n }\n}\n\n// ─── Fetch With Payment ─────────────────────────────────────\n\nexport function createFetchWithPayment(\n manager: X402Manager,\n sendTransaction: (tx: TransactionRequest) => Promise<Hash>,\n) {\n return async function fetchWithPayment(\n url: string,\n options?: RequestInit,\n ): Promise<Response> {\n if (!manager.enabled) {\n throw new X402Error('x402 not enabled. Call agent.enableX402() first.')\n }\n\n const config = manager.config!\n validateDomain(url, config.allowedDomains)\n\n const response = await fetch(url, options)\n\n if (response.status !== 402) {\n return response\n }\n\n const payment = parsePaymentRequired(response)\n manager.validatePayment(payment.amount)\n\n const txHash = await sendTransaction(buildPaymentTransaction(payment))\n manager.recordPayment(payment.amount)\n\n return fetch(url, {\n ...options,\n headers: {\n ...options?.headers,\n [HEADER_PROOF]: txHash,\n },\n })\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────\n\nfunction parseHumanAmountToAtomic(input: string): bigint {\n const parts = input.trim().split(/\\s+/)\n if (parts.length !== 2) {\n throw new X402Error(`Invalid amount format: \"${input}\". Expected \"0.01 USDC\".`)\n }\n\n const [numStr, unit] = parts\n const upper = unit.toUpperCase()\n\n let decimals: number\n switch (upper) {\n case 'USDC':\n case 'USDT':\n decimals = 6\n break\n case 'DAI':\n case 'ETH':\n case 'WETH':\n decimals = 18\n break\n default:\n throw new X402Error(`Unknown token unit in amount: \"${unit}\"`)\n }\n\n const [whole, frac = ''] = numStr.split('.')\n const padded = frac.padEnd(decimals, '0').slice(0, decimals)\n return BigInt(whole + padded)\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 X402Config,\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'\nimport { X402Manager, createFetchWithPayment } from '../actions/x402'\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 const x402Manager = new X402Manager()\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 enableX402(x402Config: X402Config): void {\n x402Manager.enable(x402Config)\n },\n\n fetchWithPayment: null as unknown as BarzAgent['fetchWithPayment'],\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 agent.fetchWithPayment = createFetchWithPayment(\n x402Manager,\n (tx) => agent.sendTransaction(tx),\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,6 +1,6 @@
1
1
  {
2
2
  "name": "@barzkit/sdk",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "type": "module",
5
5
  "description": "Self-custody AI agent wallets with passkeys, gasless transactions & programmable permissions (ERC-4337)",
6
6
  "main": "./dist/index.cjs",