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