@barzkit/sdk 0.1.3 → 0.1.4
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 +16 -0
- package/README.md +1 -1
- package/dist/index.cjs +169 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +41 -1
- package/dist/index.d.ts +41 -1
- package/dist/index.js +164 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,21 @@ 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.4] - 2026-03-01
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- x402 payment protocol support: machine-to-machine HTTP 402 payments
|
|
13
|
+
- `enableX402()` method on `BarzAgent` — configure payment limits and domain whitelist
|
|
14
|
+
- `fetchWithPayment()` method on `BarzAgent` — auto-pay 402 responses and retry with proof
|
|
15
|
+
- `X402Config` and `X402PaymentRequest` interfaces
|
|
16
|
+
- `X402Manager` — per-request and daily spend limit enforcement with 24h rolling window
|
|
17
|
+
- `parsePaymentRequired()` — parse 402 response headers into structured payment request
|
|
18
|
+
- `validateDomain()` — domain whitelist check for payment endpoints
|
|
19
|
+
- `buildPaymentTransaction()` — build ERC-20 transfer for x402 payment
|
|
20
|
+
- `X402Error` error class
|
|
21
|
+
- Unit tests for x402 parsing, validation, manager, and fetch flow
|
|
22
|
+
|
|
8
23
|
## [0.1.3] - 2026-03-01
|
|
9
24
|
|
|
10
25
|
### Added
|
|
@@ -86,6 +101,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
86
101
|
- `AgentEvent` type definitions for future event hooks
|
|
87
102
|
- Dual-package build: ESM (`.mjs`) + CJS (`.js`) + DTS (`.d.ts`)
|
|
88
103
|
|
|
104
|
+
[0.1.4]: https://github.com/barzkit/sdk/compare/v0.1.3...v0.1.4
|
|
89
105
|
[0.1.3]: https://github.com/barzkit/sdk/compare/v0.1.2...v0.1.3
|
|
90
106
|
[0.1.2]: https://github.com/barzkit/sdk/compare/v0.1.1...v0.1.2
|
|
91
107
|
[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
|
+
- [x] x402 payment handler
|
|
161
162
|
- [ ] 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
|
package/dist/index.cjs.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":["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
|
-
|
|
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
|
-
|
|
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