agentwallet-sdk 5.0.0 → 5.0.1
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/README.md +221 -0
- package/dist/abi.d.ts +397 -0
- package/dist/abi.d.ts.map +1 -0
- package/dist/abi.js +255 -0
- package/dist/abi.js.map +1 -0
- package/dist/ap2/index.d.ts +185 -0
- package/dist/ap2/index.d.ts.map +1 -0
- package/dist/ap2/index.js +255 -0
- package/dist/ap2/index.js.map +1 -0
- package/dist/bridge/abis.d.ts +64 -0
- package/dist/bridge/abis.d.ts.map +1 -0
- package/dist/bridge/abis.js +129 -0
- package/dist/bridge/abis.js.map +1 -0
- package/dist/bridge/client.d.ts +35 -0
- package/dist/bridge/client.d.ts.map +1 -0
- package/dist/bridge/client.js +230 -0
- package/dist/bridge/client.js.map +1 -0
- package/dist/bridge/index.d.ts +4 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +3 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/types.d.ts +69 -0
- package/dist/bridge/types.d.ts.map +1 -0
- package/dist/bridge/types.js +53 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/bridge/unified.d.ts +101 -0
- package/dist/bridge/unified.d.ts.map +1 -0
- package/dist/bridge/unified.js +284 -0
- package/dist/bridge/unified.js.map +1 -0
- package/dist/chains.d.ts +62 -0
- package/dist/chains.d.ts.map +1 -0
- package/dist/chains.js +108 -0
- package/dist/chains.js.map +1 -0
- package/dist/escrow/MutualStakeEscrow.d.ts +75 -0
- package/dist/escrow/MutualStakeEscrow.d.ts.map +1 -0
- package/dist/escrow/MutualStakeEscrow.js +339 -0
- package/dist/escrow/MutualStakeEscrow.js.map +1 -0
- package/dist/escrow/types.d.ts +59 -0
- package/dist/escrow/types.d.ts.map +1 -0
- package/dist/escrow/types.js +11 -0
- package/dist/escrow/types.js.map +1 -0
- package/dist/escrow/verifiers.d.ts +26 -0
- package/dist/escrow/verifiers.d.ts.map +1 -0
- package/dist/escrow/verifiers.js +53 -0
- package/dist/escrow/verifiers.js.map +1 -0
- package/dist/fiat/index.d.ts +10 -0
- package/dist/fiat/index.d.ts.map +1 -0
- package/dist/fiat/index.js +9 -0
- package/dist/fiat/index.js.map +1 -0
- package/dist/fiat/onramp.d.ts +101 -0
- package/dist/fiat/onramp.d.ts.map +1 -0
- package/dist/fiat/onramp.js +155 -0
- package/dist/fiat/onramp.js.map +1 -0
- package/dist/fiat/providers/index.d.ts +16 -0
- package/dist/fiat/providers/index.d.ts.map +1 -0
- package/dist/fiat/providers/index.js +30 -0
- package/dist/fiat/providers/index.js.map +1 -0
- package/dist/fiat/providers/moonpay.d.ts +22 -0
- package/dist/fiat/providers/moonpay.d.ts.map +1 -0
- package/dist/fiat/providers/moonpay.js +107 -0
- package/dist/fiat/providers/moonpay.js.map +1 -0
- package/dist/fiat/providers/stripe.d.ts +26 -0
- package/dist/fiat/providers/stripe.d.ts.map +1 -0
- package/dist/fiat/providers/stripe.js +135 -0
- package/dist/fiat/providers/stripe.js.map +1 -0
- package/dist/fiat/providers/transak.d.ts +26 -0
- package/dist/fiat/providers/transak.d.ts.map +1 -0
- package/dist/fiat/providers/transak.js +119 -0
- package/dist/fiat/providers/transak.js.map +1 -0
- package/dist/fiat/types.d.ts +106 -0
- package/dist/fiat/types.d.ts.map +1 -0
- package/dist/fiat/types.js +13 -0
- package/dist/fiat/types.js.map +1 -0
- package/dist/flash/executor.d.ts +119 -0
- package/dist/flash/executor.d.ts.map +1 -0
- package/dist/flash/executor.js +195 -0
- package/dist/flash/executor.js.map +1 -0
- package/dist/flash/index.d.ts +28 -0
- package/dist/flash/index.d.ts.map +1 -0
- package/dist/flash/index.js +29 -0
- package/dist/flash/index.js.map +1 -0
- package/dist/flash/scanner.d.ts +133 -0
- package/dist/flash/scanner.d.ts.map +1 -0
- package/dist/flash/scanner.js +212 -0
- package/dist/flash/scanner.js.map +1 -0
- package/dist/flash/types.d.ts +136 -0
- package/dist/flash/types.d.ts.map +1 -0
- package/dist/flash/types.js +23 -0
- package/dist/flash/types.js.map +1 -0
- package/dist/gas/index.d.ts +4 -0
- package/dist/gas/index.d.ts.map +1 -0
- package/dist/gas/index.js +3 -0
- package/dist/gas/index.js.map +1 -0
- package/dist/gas/sponsor.d.ts +70 -0
- package/dist/gas/sponsor.d.ts.map +1 -0
- package/dist/gas/sponsor.js +193 -0
- package/dist/gas/sponsor.js.map +1 -0
- package/dist/gas/types.d.ts +76 -0
- package/dist/gas/types.d.ts.map +1 -0
- package/dist/gas/types.js +21 -0
- package/dist/gas/types.js.map +1 -0
- package/dist/identity/agent-identity.d.ts +276 -0
- package/dist/identity/agent-identity.d.ts.map +1 -0
- package/dist/identity/agent-identity.js +300 -0
- package/dist/identity/agent-identity.js.map +1 -0
- package/dist/identity/erc6551.d.ts +441 -0
- package/dist/identity/erc6551.d.ts.map +1 -0
- package/dist/identity/erc6551.js +517 -0
- package/dist/identity/erc6551.js.map +1 -0
- package/dist/identity/erc8004.d.ts +305 -0
- package/dist/identity/erc8004.d.ts.map +1 -0
- package/dist/identity/erc8004.js +413 -0
- package/dist/identity/erc8004.js.map +1 -0
- package/dist/identity/index.d.ts +7 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +4 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/reputation.d.ts +318 -0
- package/dist/identity/reputation.d.ts.map +1 -0
- package/dist/identity/reputation.js +272 -0
- package/dist/identity/reputation.js.map +1 -0
- package/dist/identity/validation.d.ts +284 -0
- package/dist/identity/validation.d.ts.map +1 -0
- package/dist/identity/validation.js +226 -0
- package/dist/identity/validation.js.map +1 -0
- package/dist/index.d.ts +38803 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +376 -0
- package/dist/index.js.map +1 -0
- package/dist/mev/index.d.ts +4 -0
- package/dist/mev/index.d.ts.map +1 -0
- package/dist/mev/index.js +8 -0
- package/dist/mev/index.js.map +1 -0
- package/dist/mev/protection.d.ts +54 -0
- package/dist/mev/protection.d.ts.map +1 -0
- package/dist/mev/protection.js +185 -0
- package/dist/mev/protection.js.map +1 -0
- package/dist/mev/risk.d.ts +19 -0
- package/dist/mev/risk.d.ts.map +1 -0
- package/dist/mev/risk.js +95 -0
- package/dist/mev/risk.js.map +1 -0
- package/dist/mev/types.d.ts +49 -0
- package/dist/mev/types.d.ts.map +1 -0
- package/dist/mev/types.js +2 -0
- package/dist/mev/types.js.map +1 -0
- package/dist/plugins/elizaos.d.ts +52 -0
- package/dist/plugins/elizaos.d.ts.map +1 -0
- package/dist/plugins/elizaos.js +89 -0
- package/dist/plugins/elizaos.js.map +1 -0
- package/dist/policy/SpendingPolicy.d.ts +106 -0
- package/dist/policy/SpendingPolicy.d.ts.map +1 -0
- package/dist/policy/SpendingPolicy.js +155 -0
- package/dist/policy/SpendingPolicy.js.map +1 -0
- package/dist/policy/SpendingPolicy.test.d.ts +2 -0
- package/dist/policy/SpendingPolicy.test.d.ts.map +1 -0
- package/dist/policy/SpendingPolicy.test.js +143 -0
- package/dist/policy/SpendingPolicy.test.js.map +1 -0
- package/dist/settlement/index.d.ts +4 -0
- package/dist/settlement/index.d.ts.map +1 -0
- package/dist/settlement/index.js +3 -0
- package/dist/settlement/index.js.map +1 -0
- package/dist/settlement/types.d.ts +66 -0
- package/dist/settlement/types.d.ts.map +1 -0
- package/dist/settlement/types.js +37 -0
- package/dist/settlement/types.js.map +1 -0
- package/dist/settlement/verifier.d.ts +75 -0
- package/dist/settlement/verifier.d.ts.map +1 -0
- package/dist/settlement/verifier.js +354 -0
- package/dist/settlement/verifier.js.map +1 -0
- package/dist/solana/bridge.d.ts +144 -0
- package/dist/solana/bridge.d.ts.map +1 -0
- package/dist/solana/bridge.js +352 -0
- package/dist/solana/bridge.js.map +1 -0
- package/dist/solana/index.d.ts +8 -0
- package/dist/solana/index.d.ts.map +1 -0
- package/dist/solana/index.js +6 -0
- package/dist/solana/index.js.map +1 -0
- package/dist/solana/swap.d.ts +85 -0
- package/dist/solana/swap.d.ts.map +1 -0
- package/dist/solana/swap.js +173 -0
- package/dist/solana/swap.js.map +1 -0
- package/dist/solana/types.d.ts +126 -0
- package/dist/solana/types.d.ts.map +1 -0
- package/dist/solana/types.js +10 -0
- package/dist/solana/types.js.map +1 -0
- package/dist/solana/wallet.d.ts +83 -0
- package/dist/solana/wallet.d.ts.map +1 -0
- package/dist/solana/wallet.js +164 -0
- package/dist/solana/wallet.js.map +1 -0
- package/dist/solana/x402.d.ts +69 -0
- package/dist/solana/x402.d.ts.map +1 -0
- package/dist/solana/x402.js +154 -0
- package/dist/solana/x402.js.map +1 -0
- package/dist/solver/adapter.d.ts +47 -0
- package/dist/solver/adapter.d.ts.map +1 -0
- package/dist/solver/adapter.js +146 -0
- package/dist/solver/adapter.js.map +1 -0
- package/dist/solver/analyzer.d.ts +48 -0
- package/dist/solver/analyzer.d.ts.map +1 -0
- package/dist/solver/analyzer.js +171 -0
- package/dist/solver/analyzer.js.map +1 -0
- package/dist/solver/builder.d.ts +31 -0
- package/dist/solver/builder.d.ts.map +1 -0
- package/dist/solver/builder.js +60 -0
- package/dist/solver/builder.js.map +1 -0
- package/dist/solver/index.d.ts +22 -0
- package/dist/solver/index.d.ts.map +1 -0
- package/dist/solver/index.js +25 -0
- package/dist/solver/index.js.map +1 -0
- package/dist/solver/types.d.ts +115 -0
- package/dist/solver/types.d.ts.map +1 -0
- package/dist/solver/types.js +10 -0
- package/dist/solver/types.js.map +1 -0
- package/dist/spend-guard/index.d.ts +125 -0
- package/dist/spend-guard/index.d.ts.map +1 -0
- package/dist/spend-guard/index.js +150 -0
- package/dist/spend-guard/index.js.map +1 -0
- package/dist/swap/SwapModule.d.ts +34 -0
- package/dist/swap/SwapModule.d.ts.map +1 -0
- package/dist/swap/SwapModule.js +144 -0
- package/dist/swap/SwapModule.js.map +1 -0
- package/dist/swap/abi.d.ts +51 -0
- package/dist/swap/abi.d.ts.map +1 -0
- package/dist/swap/abi.js +118 -0
- package/dist/swap/abi.js.map +1 -0
- package/dist/swap/index.d.ts +5 -0
- package/dist/swap/index.d.ts.map +1 -0
- package/dist/swap/index.js +4 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/swap/router/cache.d.ts +13 -0
- package/dist/swap/router/cache.d.ts.map +1 -0
- package/dist/swap/router/cache.js +30 -0
- package/dist/swap/router/cache.js.map +1 -0
- package/dist/swap/router/flashbots.d.ts +10 -0
- package/dist/swap/router/flashbots.d.ts.map +1 -0
- package/dist/swap/router/flashbots.js +43 -0
- package/dist/swap/router/flashbots.js.map +1 -0
- package/dist/swap/router/health.d.ts +17 -0
- package/dist/swap/router/health.d.ts.map +1 -0
- package/dist/swap/router/health.js +38 -0
- package/dist/swap/router/health.js.map +1 -0
- package/dist/swap/router/index.d.ts +10 -0
- package/dist/swap/router/index.d.ts.map +1 -0
- package/dist/swap/router/index.js +10 -0
- package/dist/swap/router/index.js.map +1 -0
- package/dist/swap/router/providers/cowswap.d.ts +11 -0
- package/dist/swap/router/providers/cowswap.d.ts.map +1 -0
- package/dist/swap/router/providers/cowswap.js +79 -0
- package/dist/swap/router/providers/cowswap.js.map +1 -0
- package/dist/swap/router/providers/index.d.ts +20 -0
- package/dist/swap/router/providers/index.d.ts.map +1 -0
- package/dist/swap/router/providers/index.js +32 -0
- package/dist/swap/router/providers/index.js.map +1 -0
- package/dist/swap/router/providers/jupiter.d.ts +12 -0
- package/dist/swap/router/providers/jupiter.d.ts.map +1 -0
- package/dist/swap/router/providers/jupiter.js +73 -0
- package/dist/swap/router/providers/jupiter.js.map +1 -0
- package/dist/swap/router/providers/lifi.d.ts +11 -0
- package/dist/swap/router/providers/lifi.d.ts.map +1 -0
- package/dist/swap/router/providers/lifi.js +123 -0
- package/dist/swap/router/providers/lifi.js.map +1 -0
- package/dist/swap/router/providers/oneinch.d.ts +13 -0
- package/dist/swap/router/providers/oneinch.d.ts.map +1 -0
- package/dist/swap/router/providers/oneinch.js +71 -0
- package/dist/swap/router/providers/oneinch.js.map +1 -0
- package/dist/swap/router/providers/paraswap.d.ts +11 -0
- package/dist/swap/router/providers/paraswap.d.ts.map +1 -0
- package/dist/swap/router/providers/paraswap.js +73 -0
- package/dist/swap/router/providers/paraswap.js.map +1 -0
- package/dist/swap/router/providers/uniswap.d.ts +31 -0
- package/dist/swap/router/providers/uniswap.d.ts.map +1 -0
- package/dist/swap/router/providers/uniswap.js +237 -0
- package/dist/swap/router/providers/uniswap.js.map +1 -0
- package/dist/swap/router/providers/zerox.d.ts +13 -0
- package/dist/swap/router/providers/zerox.d.ts.map +1 -0
- package/dist/swap/router/providers/zerox.js +94 -0
- package/dist/swap/router/providers/zerox.js.map +1 -0
- package/dist/swap/router/router.d.ts +86 -0
- package/dist/swap/router/router.d.ts.map +1 -0
- package/dist/swap/router/router.js +224 -0
- package/dist/swap/router/router.js.map +1 -0
- package/dist/swap/router/rsi/engine.d.ts +60 -0
- package/dist/swap/router/rsi/engine.d.ts.map +1 -0
- package/dist/swap/router/rsi/engine.js +483 -0
- package/dist/swap/router/rsi/engine.js.map +1 -0
- package/dist/swap/router/rsi/index.d.ts +3 -0
- package/dist/swap/router/rsi/index.d.ts.map +1 -0
- package/dist/swap/router/rsi/index.js +3 -0
- package/dist/swap/router/rsi/index.js.map +1 -0
- package/dist/swap/router/rsi/types.d.ts +106 -0
- package/dist/swap/router/rsi/types.d.ts.map +1 -0
- package/dist/swap/router/rsi/types.js +3 -0
- package/dist/swap/router/rsi/types.js.map +1 -0
- package/dist/swap/router/types.d.ts +120 -0
- package/dist/swap/router/types.d.ts.map +1 -0
- package/dist/swap/router/types.js +16 -0
- package/dist/swap/router/types.js.map +1 -0
- package/dist/swap/types.d.ts +51 -0
- package/dist/swap/types.d.ts.map +1 -0
- package/dist/swap/types.js +17 -0
- package/dist/swap/types.js.map +1 -0
- package/dist/tax/engine.d.ts +131 -0
- package/dist/tax/engine.d.ts.map +1 -0
- package/dist/tax/engine.js +307 -0
- package/dist/tax/engine.js.map +1 -0
- package/dist/tax/index.d.ts +9 -0
- package/dist/tax/index.d.ts.map +1 -0
- package/dist/tax/index.js +12 -0
- package/dist/tax/index.js.map +1 -0
- package/dist/tax/lots.d.ts +60 -0
- package/dist/tax/lots.d.ts.map +1 -0
- package/dist/tax/lots.js +129 -0
- package/dist/tax/lots.js.map +1 -0
- package/dist/tax/types.d.ts +113 -0
- package/dist/tax/types.d.ts.map +1 -0
- package/dist/tax/types.js +18 -0
- package/dist/tax/types.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/x402/__tests__/budget.test.d.ts +2 -0
- package/dist/x402/__tests__/budget.test.d.ts.map +1 -0
- package/dist/x402/__tests__/budget.test.js +114 -0
- package/dist/x402/__tests__/budget.test.js.map +1 -0
- package/dist/x402/__tests__/client.test.d.ts +2 -0
- package/dist/x402/__tests__/client.test.d.ts.map +1 -0
- package/dist/x402/__tests__/client.test.js +107 -0
- package/dist/x402/__tests__/client.test.js.map +1 -0
- package/dist/x402/budget.d.ts +52 -0
- package/dist/x402/budget.d.ts.map +1 -0
- package/dist/x402/budget.js +113 -0
- package/dist/x402/budget.js.map +1 -0
- package/dist/x402/chains/abstract/index.d.ts +135 -0
- package/dist/x402/chains/abstract/index.d.ts.map +1 -0
- package/dist/x402/chains/abstract/index.js +190 -0
- package/dist/x402/chains/abstract/index.js.map +1 -0
- package/dist/x402/client.d.ts +60 -0
- package/dist/x402/client.d.ts.map +1 -0
- package/dist/x402/client.js +205 -0
- package/dist/x402/client.js.map +1 -0
- package/dist/x402/index.d.ts +8 -0
- package/dist/x402/index.d.ts.map +1 -0
- package/dist/x402/index.js +8 -0
- package/dist/x402/index.js.map +1 -0
- package/dist/x402/middleware.d.ts +37 -0
- package/dist/x402/middleware.d.ts.map +1 -0
- package/dist/x402/middleware.js +65 -0
- package/dist/x402/middleware.js.map +1 -0
- package/dist/x402/types.d.ts +91 -0
- package/dist/x402/types.d.ts.map +1 -0
- package/dist/x402/types.js +9 -0
- package/dist/x402/types.js.map +1 -0
- package/dist/yield/index.d.ts +26 -0
- package/dist/yield/index.d.ts.map +1 -0
- package/dist/yield/index.js +29 -0
- package/dist/yield/index.js.map +1 -0
- package/dist/yield/rates.d.ts +114 -0
- package/dist/yield/rates.d.ts.map +1 -0
- package/dist/yield/rates.js +351 -0
- package/dist/yield/rates.js.map +1 -0
- package/dist/yield/types.d.ts +134 -0
- package/dist/yield/types.d.ts.map +1 -0
- package/dist/yield/types.js +24 -0
- package/dist/yield/types.js.map +1 -0
- package/dist/yield/vault.d.ts +112 -0
- package/dist/yield/vault.d.ts.map +1 -0
- package/dist/yield/vault.js +264 -0
- package/dist/yield/vault.js.map +1 -0
- package/package.json +46 -7
- package/index.js +0 -2
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { ethers } from 'ethers';
|
|
2
|
+
import { MEVRiskAssessor } from './risk.js';
|
|
3
|
+
const DEFAULTS = {
|
|
4
|
+
autoProtectAboveRisk: 'medium',
|
|
5
|
+
flashbotsRpcUrl: 'https://rpc.flashbots.net',
|
|
6
|
+
mevBlockerRpcUrl: 'https://rpc.mevblocker.io',
|
|
7
|
+
maxProtectionLatencyMs: 5000,
|
|
8
|
+
minSwapUsdForProtection: 100,
|
|
9
|
+
};
|
|
10
|
+
export class MEVProtection {
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.config = {
|
|
13
|
+
enabled: config.enabled,
|
|
14
|
+
autoProtectAboveRisk: config.autoProtectAboveRisk ?? DEFAULTS.autoProtectAboveRisk,
|
|
15
|
+
flashbotsRpcUrl: config.flashbotsRpcUrl ?? DEFAULTS.flashbotsRpcUrl,
|
|
16
|
+
mevBlockerRpcUrl: config.mevBlockerRpcUrl ?? DEFAULTS.mevBlockerRpcUrl,
|
|
17
|
+
maxProtectionLatencyMs: config.maxProtectionLatencyMs ?? DEFAULTS.maxProtectionLatencyMs,
|
|
18
|
+
minSwapUsdForProtection: config.minSwapUsdForProtection ?? DEFAULTS.minSwapUsdForProtection,
|
|
19
|
+
};
|
|
20
|
+
this.assessor = new MEVRiskAssessor();
|
|
21
|
+
this._createProvider = (url) => new ethers.JsonRpcProvider(url);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Assess MEV risk for a proposed swap.
|
|
25
|
+
* Fetches live gas price from provider if available.
|
|
26
|
+
*/
|
|
27
|
+
async assessRisk(params) {
|
|
28
|
+
let gasPriceGwei = 20; // sensible default
|
|
29
|
+
if (params.provider) {
|
|
30
|
+
try {
|
|
31
|
+
const feeData = await params.provider.getFeeData();
|
|
32
|
+
if (feeData.gasPrice) {
|
|
33
|
+
gasPriceGwei = Number(ethers.formatUnits(feeData.gasPrice, 'gwei'));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// fallback to default
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return this.assessor.assess({
|
|
41
|
+
fromToken: params.fromToken,
|
|
42
|
+
toToken: params.toToken,
|
|
43
|
+
amountUsd: params.amountUsd,
|
|
44
|
+
slippageBps: params.slippageBps,
|
|
45
|
+
gasPriceGwei,
|
|
46
|
+
chain: params.chain,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get the protected RPC URL for a given protection method.
|
|
51
|
+
*/
|
|
52
|
+
getProtectedRpc(method) {
|
|
53
|
+
switch (method) {
|
|
54
|
+
case 'flashbots-protect':
|
|
55
|
+
return this.config.flashbotsRpcUrl;
|
|
56
|
+
case 'private-rpc':
|
|
57
|
+
return this.config.mevBlockerRpcUrl;
|
|
58
|
+
case 'flashbots-bundle':
|
|
59
|
+
case 'cowswap-order':
|
|
60
|
+
case 'none':
|
|
61
|
+
default:
|
|
62
|
+
return '';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Submit a signed transaction through the appropriate protected route.
|
|
67
|
+
* Main API called by SmartSwapRouter.
|
|
68
|
+
*/
|
|
69
|
+
async submitProtected(params) {
|
|
70
|
+
const startTime = Date.now();
|
|
71
|
+
switch (params.assessment.recommendedMethod) {
|
|
72
|
+
case 'flashbots-protect':
|
|
73
|
+
return this.submitViaFlashbotsProtect(params.signedTx, params.provider, startTime, params.assessment);
|
|
74
|
+
case 'flashbots-bundle':
|
|
75
|
+
return this.submitViaFlashbotsBundle(params.signedTx, params.targetBlock, startTime, params.assessment);
|
|
76
|
+
case 'private-rpc':
|
|
77
|
+
return this.submitViaMEVBlocker(params.signedTx, params.provider, startTime, params.assessment);
|
|
78
|
+
default:
|
|
79
|
+
return this.submitPublic(params.signedTx, params.provider, startTime, params.assessment);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Flashbots Protect: broadcast via rpc.flashbots.net.
|
|
84
|
+
* No bundle auth required. Best for most users.
|
|
85
|
+
*/
|
|
86
|
+
async submitViaFlashbotsProtect(signedTx, _provider, startTime, assessment) {
|
|
87
|
+
const protectedProvider = this._createProvider(this.config.flashbotsRpcUrl);
|
|
88
|
+
const txResponse = await protectedProvider.broadcastTransaction(signedTx);
|
|
89
|
+
const receipt = await txResponse.wait(1);
|
|
90
|
+
return {
|
|
91
|
+
success: receipt?.status === 1,
|
|
92
|
+
txHash: receipt?.hash,
|
|
93
|
+
protectionMethod: 'flashbots-protect',
|
|
94
|
+
riskAssessment: assessment,
|
|
95
|
+
mevSavedUsd: assessment.estimatedSavingsUsd,
|
|
96
|
+
blockNumber: receipt?.blockNumber,
|
|
97
|
+
latencyMs: Date.now() - startTime,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Flashbots Bundle: maximum protection for critical-risk swaps.
|
|
102
|
+
* Falls back to Flashbots Protect RPC if no bundle signing key configured.
|
|
103
|
+
*/
|
|
104
|
+
async submitViaFlashbotsBundle(signedTx, targetBlock, startTime, assessment) {
|
|
105
|
+
// Full bundle submission requires a Flashbots signing key (ECDSA).
|
|
106
|
+
// Without one, we fall back to Flashbots Protect RPC which still gives
|
|
107
|
+
// strong protection for most users.
|
|
108
|
+
const protectedProvider = this._createProvider(this.config.flashbotsRpcUrl);
|
|
109
|
+
try {
|
|
110
|
+
// Attempt bundle submission via relay
|
|
111
|
+
const currentBlock = await protectedProvider.getBlockNumber();
|
|
112
|
+
const blockTarget = targetBlock ?? currentBlock + 2;
|
|
113
|
+
const blockHex = `0x${blockTarget.toString(16)}`;
|
|
114
|
+
const response = await fetch('https://relay.flashbots.net', {
|
|
115
|
+
method: 'POST',
|
|
116
|
+
headers: { 'Content-Type': 'application/json' },
|
|
117
|
+
body: JSON.stringify({
|
|
118
|
+
jsonrpc: '2.0',
|
|
119
|
+
id: 1,
|
|
120
|
+
method: 'eth_sendBundle',
|
|
121
|
+
params: [{ txs: [signedTx], blockNumber: blockHex }],
|
|
122
|
+
}),
|
|
123
|
+
});
|
|
124
|
+
if (response.ok) {
|
|
125
|
+
const json = await response.json();
|
|
126
|
+
const bundleHash = json.result?.bundleHash;
|
|
127
|
+
return {
|
|
128
|
+
success: true,
|
|
129
|
+
protectionMethod: 'flashbots-bundle',
|
|
130
|
+
bundleHash,
|
|
131
|
+
riskAssessment: assessment,
|
|
132
|
+
mevSavedUsd: assessment.estimatedSavingsUsd,
|
|
133
|
+
latencyMs: Date.now() - startTime,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Bundle submission failed — fall through to Protect RPC fallback
|
|
139
|
+
}
|
|
140
|
+
// Fallback: broadcast via Flashbots Protect RPC
|
|
141
|
+
const txResponse = await protectedProvider.broadcastTransaction(signedTx);
|
|
142
|
+
const receipt = await txResponse.wait(1);
|
|
143
|
+
return {
|
|
144
|
+
success: receipt?.status === 1,
|
|
145
|
+
txHash: receipt?.hash,
|
|
146
|
+
protectionMethod: 'flashbots-bundle',
|
|
147
|
+
riskAssessment: assessment,
|
|
148
|
+
mevSavedUsd: assessment.estimatedSavingsUsd,
|
|
149
|
+
blockNumber: receipt?.blockNumber,
|
|
150
|
+
latencyMs: Date.now() - startTime,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* MEV Blocker: alternative private RPC by CoW Protocol.
|
|
155
|
+
*/
|
|
156
|
+
async submitViaMEVBlocker(signedTx, _provider, startTime, assessment) {
|
|
157
|
+
const mevBlockerProvider = this._createProvider(this.config.mevBlockerRpcUrl);
|
|
158
|
+
const txResponse = await mevBlockerProvider.broadcastTransaction(signedTx);
|
|
159
|
+
const receipt = await txResponse.wait(1);
|
|
160
|
+
return {
|
|
161
|
+
success: receipt?.status === 1,
|
|
162
|
+
txHash: receipt?.hash,
|
|
163
|
+
protectionMethod: 'private-rpc',
|
|
164
|
+
riskAssessment: assessment,
|
|
165
|
+
mevSavedUsd: assessment.estimatedSavingsUsd,
|
|
166
|
+
blockNumber: receipt?.blockNumber,
|
|
167
|
+
latencyMs: Date.now() - startTime,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Public mempool fallback for low-risk swaps.
|
|
172
|
+
*/
|
|
173
|
+
async submitPublic(signedTx, provider, startTime, assessment) {
|
|
174
|
+
const txResponse = await provider.broadcastTransaction(signedTx);
|
|
175
|
+
const receipt = await txResponse.wait(1);
|
|
176
|
+
return {
|
|
177
|
+
success: receipt?.status === 1,
|
|
178
|
+
txHash: receipt?.hash,
|
|
179
|
+
protectionMethod: 'none',
|
|
180
|
+
riskAssessment: assessment,
|
|
181
|
+
latencyMs: Date.now() - startTime,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=protection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protection.js","sourceRoot":"","sources":["../../src/mev/protection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MEVRiskAssessment } from './types.js';
|
|
2
|
+
/** Deterministic MEV risk scorer — no external calls required */
|
|
3
|
+
export declare class MEVRiskAssessor {
|
|
4
|
+
/**
|
|
5
|
+
* Assess MEV risk for a proposed swap.
|
|
6
|
+
* Scoring model produces a 0-100 risk score mapped to a risk level.
|
|
7
|
+
*/
|
|
8
|
+
assess(params: {
|
|
9
|
+
fromToken: string;
|
|
10
|
+
toToken: string;
|
|
11
|
+
amountUsd: number;
|
|
12
|
+
slippageBps: number;
|
|
13
|
+
gasPriceGwei: number;
|
|
14
|
+
chain: string;
|
|
15
|
+
}): MEVRiskAssessment;
|
|
16
|
+
/** Check if a token pair is "popular" (highly watched by MEV bots) */
|
|
17
|
+
isPopularPair(fromToken: string, toToken: string): boolean;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=risk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../src/mev/risk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAkC,MAAM,YAAY,CAAC;AAOpF,iEAAiE;AACjE,qBAAa,eAAe;IAC1B;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,iBAAiB;IA6ErB,sEAAsE;IACtE,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;CAG3D"}
|
package/dist/mev/risk.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/** Popular tokens that are heavily watched by MEV bots */
|
|
2
|
+
const POPULAR_TOKENS = new Set([
|
|
3
|
+
'ETH', 'WETH', 'USDC', 'USDT', 'DAI', 'WBTC', 'SOL', 'WSOL',
|
|
4
|
+
]);
|
|
5
|
+
/** Deterministic MEV risk scorer — no external calls required */
|
|
6
|
+
export class MEVRiskAssessor {
|
|
7
|
+
/**
|
|
8
|
+
* Assess MEV risk for a proposed swap.
|
|
9
|
+
* Scoring model produces a 0-100 risk score mapped to a risk level.
|
|
10
|
+
*/
|
|
11
|
+
assess(params) {
|
|
12
|
+
const { fromToken, toToken, amountUsd, slippageBps, gasPriceGwei, chain } = params;
|
|
13
|
+
let score = 0;
|
|
14
|
+
// 1. Size risk
|
|
15
|
+
if (amountUsd >= 10000)
|
|
16
|
+
score += 40;
|
|
17
|
+
else if (amountUsd >= 1000)
|
|
18
|
+
score += 20;
|
|
19
|
+
else if (amountUsd >= 100)
|
|
20
|
+
score += 10;
|
|
21
|
+
// < $100 = 0 pts
|
|
22
|
+
// 2. Slippage risk (high slippage = easy sandwich)
|
|
23
|
+
if (slippageBps > 200)
|
|
24
|
+
score += 20;
|
|
25
|
+
else if (slippageBps >= 50)
|
|
26
|
+
score += 10;
|
|
27
|
+
// 3. Popular pair risk (heavily watched by bots)
|
|
28
|
+
if (this.isPopularPair(fromToken, toToken))
|
|
29
|
+
score += 15;
|
|
30
|
+
// 4. Gas spike risk (high gas = bots are active)
|
|
31
|
+
if (gasPriceGwei > 100)
|
|
32
|
+
score += 25;
|
|
33
|
+
else if (gasPriceGwei > 50)
|
|
34
|
+
score += 15;
|
|
35
|
+
// 5. Chain risk
|
|
36
|
+
const chainLower = chain.toLowerCase();
|
|
37
|
+
if (chainLower === 'ethereum' || chainLower === 'mainnet')
|
|
38
|
+
score += 10;
|
|
39
|
+
else if (chainLower === 'arbitrum')
|
|
40
|
+
score += 5;
|
|
41
|
+
else if (chainLower === 'base')
|
|
42
|
+
score += 3;
|
|
43
|
+
// Cap at 100
|
|
44
|
+
score = Math.min(100, score);
|
|
45
|
+
// Map score to risk level
|
|
46
|
+
let riskLevel;
|
|
47
|
+
if (score >= 76)
|
|
48
|
+
riskLevel = 'critical';
|
|
49
|
+
else if (score >= 51)
|
|
50
|
+
riskLevel = 'high';
|
|
51
|
+
else if (score >= 26)
|
|
52
|
+
riskLevel = 'medium';
|
|
53
|
+
else
|
|
54
|
+
riskLevel = 'low';
|
|
55
|
+
// Recommended method by risk level
|
|
56
|
+
let recommendedMethod;
|
|
57
|
+
if (riskLevel === 'critical')
|
|
58
|
+
recommendedMethod = 'flashbots-bundle';
|
|
59
|
+
else if (riskLevel === 'high')
|
|
60
|
+
recommendedMethod = 'flashbots-protect';
|
|
61
|
+
else if (riskLevel === 'medium')
|
|
62
|
+
recommendedMethod = 'private-rpc';
|
|
63
|
+
else
|
|
64
|
+
recommendedMethod = 'none';
|
|
65
|
+
// Estimated savings: risk-weighted sandwich loss model
|
|
66
|
+
// ~0.5-2% of swap size; simplified: amountUsd * riskScore/100 * 0.01
|
|
67
|
+
const estimatedSavingsUsd = amountUsd * (score / 100) * 0.01;
|
|
68
|
+
// Derive factor labels
|
|
69
|
+
const gasPrice = gasPriceGwei > 100 ? 'spike' :
|
|
70
|
+
gasPriceGwei > 50 ? 'high' :
|
|
71
|
+
gasPriceGwei > 20 ? 'normal' : 'low';
|
|
72
|
+
const tokenPairLiquidity = this.isPopularPair(fromToken, toToken) ? 'high' : 'low';
|
|
73
|
+
const marketVolatility = gasPriceGwei > 100 ? 'extreme' :
|
|
74
|
+
gasPriceGwei > 50 ? 'volatile' : 'stable';
|
|
75
|
+
return {
|
|
76
|
+
riskLevel,
|
|
77
|
+
riskScore: score,
|
|
78
|
+
factors: {
|
|
79
|
+
swapSizeUsd: amountUsd,
|
|
80
|
+
slippageBps,
|
|
81
|
+
tokenPairLiquidity,
|
|
82
|
+
marketVolatility,
|
|
83
|
+
gasPrice,
|
|
84
|
+
isPopularPair: this.isPopularPair(fromToken, toToken),
|
|
85
|
+
},
|
|
86
|
+
recommendedMethod,
|
|
87
|
+
estimatedSavingsUsd,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** Check if a token pair is "popular" (highly watched by MEV bots) */
|
|
91
|
+
isPopularPair(fromToken, toToken) {
|
|
92
|
+
return POPULAR_TOKENS.has(fromToken.toUpperCase()) && POPULAR_TOKENS.has(toToken.toUpperCase());
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=risk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../src/mev/risk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type MEVRiskLevel = 'low' | 'medium' | 'high' | 'critical';
|
|
2
|
+
export type ProtectionMethod = 'flashbots-protect' | 'flashbots-bundle' | 'cowswap-order' | 'private-rpc' | 'none';
|
|
3
|
+
export interface MEVRiskAssessment {
|
|
4
|
+
riskLevel: MEVRiskLevel;
|
|
5
|
+
riskScore: number;
|
|
6
|
+
factors: {
|
|
7
|
+
swapSizeUsd: number;
|
|
8
|
+
slippageBps: number;
|
|
9
|
+
tokenPairLiquidity: 'high' | 'medium' | 'low';
|
|
10
|
+
marketVolatility: 'stable' | 'volatile' | 'extreme';
|
|
11
|
+
gasPrice: 'low' | 'normal' | 'high' | 'spike';
|
|
12
|
+
isPopularPair: boolean;
|
|
13
|
+
};
|
|
14
|
+
recommendedMethod: ProtectionMethod;
|
|
15
|
+
estimatedSavingsUsd: number;
|
|
16
|
+
}
|
|
17
|
+
export interface MEVProtectionConfig {
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
/** Risk threshold above which protection is auto-applied */
|
|
20
|
+
autoProtectAboveRisk?: MEVRiskLevel;
|
|
21
|
+
/** Flashbots RPC endpoint */
|
|
22
|
+
flashbotsRpcUrl?: string;
|
|
23
|
+
/** MEV Blocker RPC (alternative) */
|
|
24
|
+
mevBlockerRpcUrl?: string;
|
|
25
|
+
/** Max extra latency accepted for protection (ms) */
|
|
26
|
+
maxProtectionLatencyMs?: number;
|
|
27
|
+
/** Minimum swap USD value to trigger protection */
|
|
28
|
+
minSwapUsdForProtection?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ProtectedSwapResult {
|
|
31
|
+
success: boolean;
|
|
32
|
+
txHash?: string;
|
|
33
|
+
protectionMethod: ProtectionMethod;
|
|
34
|
+
bundleHash?: string;
|
|
35
|
+
riskAssessment: MEVRiskAssessment;
|
|
36
|
+
/** Gas saved vs public mempool (estimated) */
|
|
37
|
+
gasSavedGwei?: number;
|
|
38
|
+
/** MEV loss avoided (estimated USD) */
|
|
39
|
+
mevSavedUsd?: number;
|
|
40
|
+
blockNumber?: number;
|
|
41
|
+
latencyMs: number;
|
|
42
|
+
}
|
|
43
|
+
export interface FlashbotsBundle {
|
|
44
|
+
transactions: string[];
|
|
45
|
+
blockNumber: string;
|
|
46
|
+
minTimestamp?: number;
|
|
47
|
+
maxTimestamp?: number;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mev/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAElE,MAAM,MAAM,gBAAgB,GACxB,mBAAmB,GACnB,kBAAkB,GAClB,eAAe,GACf,aAAa,GACb,MAAM,CAAC;AAEX,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,YAAY,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QAC9C,gBAAgB,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;QACpD,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;QAC9C,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,iBAAiB,EAAE,gBAAgB,CAAC;IACpC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,oBAAoB,CAAC,EAAE,YAAY,CAAC;IACpC,6BAA6B;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qDAAqD;IACrD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mDAAmD;IACnD,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,iBAAiB,CAAC;IAClC,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mev/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @elizaos/plugin-agentwallet
|
|
3
|
+
*
|
|
4
|
+
* ElizaOS plugin for agentwallet-sdk — non-custodial AI agent wallet with
|
|
5
|
+
* x402 payment support, CCTP V2 cross-chain transfers, and on-chain spend limits.
|
|
6
|
+
*
|
|
7
|
+
* Your agent holds its own private key. No custodian. No KYC.
|
|
8
|
+
*/
|
|
9
|
+
import type { Plugin } from '@elizaos/core';
|
|
10
|
+
import { createWallet } from '../index.js';
|
|
11
|
+
type AgentWallet = ReturnType<typeof createWallet>;
|
|
12
|
+
export interface AgentWalletPluginConfig {
|
|
13
|
+
/** Agent private key — stays in your environment, never transmitted */
|
|
14
|
+
privateKey: `0x${string}`;
|
|
15
|
+
/** Deployed AgentAccountV2 contract address */
|
|
16
|
+
accountAddress: `0x${string}`;
|
|
17
|
+
/** Chain to connect to (default: 'base') */
|
|
18
|
+
chain?: 'base' | 'base-sepolia' | 'ethereum' | 'arbitrum' | 'polygon' | 'etherlink';
|
|
19
|
+
/** Optional custom RPC URL */
|
|
20
|
+
rpcUrl?: string;
|
|
21
|
+
/** Optional daily x402 spend limit in USDC base units (default: 50 USDC = 50_000_000n) */
|
|
22
|
+
x402DailyLimit?: bigint;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get or create the agent wallet singleton.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getAgentWallet(config: AgentWalletPluginConfig): AgentWallet;
|
|
28
|
+
/**
|
|
29
|
+
* Create an x402-enabled fetch function for the agent to pay APIs automatically.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createAgentFetch(config: AgentWalletPluginConfig): typeof fetch;
|
|
32
|
+
/**
|
|
33
|
+
* ElizaOS Plugin definition for agentwallet-sdk.
|
|
34
|
+
*
|
|
35
|
+
* Usage in your Eliza character config:
|
|
36
|
+
*
|
|
37
|
+
* ```json
|
|
38
|
+
* {
|
|
39
|
+
* "plugins": ["@elizaos/plugin-agentwallet"],
|
|
40
|
+
* "settings": {
|
|
41
|
+
* "AGENT_PRIVATE_KEY": "0x...",
|
|
42
|
+
* "AGENT_ACCOUNT_ADDRESS": "0x...",
|
|
43
|
+
* "AGENT_CHAIN": "base",
|
|
44
|
+
* "X402_DAILY_LIMIT": "50000000"
|
|
45
|
+
* }
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
declare const AgentWalletPlugin: Plugin;
|
|
50
|
+
export default AgentWalletPlugin;
|
|
51
|
+
export { AgentWalletPlugin };
|
|
52
|
+
//# sourceMappingURL=elizaos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elizaos.d.ts","sourceRoot":"","sources":["../../src/plugins/elizaos.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EACL,YAAY,EAGb,MAAM,aAAa,CAAC;AAGrB,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AAInD,MAAM,WAAW,uBAAuB;IACtC,uEAAuE;IACvE,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,+CAA+C;IAC/C,cAAc,EAAE,KAAK,MAAM,EAAE,CAAC;IAC9B,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;IACpF,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,uBAAuB,GAAG,WAAW,CAuB3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,gBAK/D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,QAAA,MAAM,iBAAiB,EAAE,MAiCxB,CAAC;AAEF,eAAe,iBAAiB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createWallet, createX402Fetch, } from '../index.js';
|
|
2
|
+
import { createWalletClient, http } from 'viem';
|
|
3
|
+
import { privateKeyToAccount } from 'viem/accounts';
|
|
4
|
+
let walletInstance = null;
|
|
5
|
+
/**
|
|
6
|
+
* Get or create the agent wallet singleton.
|
|
7
|
+
*/
|
|
8
|
+
export function getAgentWallet(config) {
|
|
9
|
+
if (!walletInstance) {
|
|
10
|
+
const account = privateKeyToAccount(config.privateKey);
|
|
11
|
+
const rpcUrls = {
|
|
12
|
+
base: 'https://mainnet.base.org',
|
|
13
|
+
'base-sepolia': 'https://sepolia.base.org',
|
|
14
|
+
ethereum: 'https://eth.llamarpc.com',
|
|
15
|
+
arbitrum: 'https://arb1.arbitrum.io/rpc',
|
|
16
|
+
polygon: 'https://polygon-rpc.com',
|
|
17
|
+
etherlink: 'https://node.mainnet.etherlink.com',
|
|
18
|
+
};
|
|
19
|
+
const chain = config.chain ?? 'base';
|
|
20
|
+
const walletClient = createWalletClient({
|
|
21
|
+
account,
|
|
22
|
+
transport: http(config.rpcUrl ?? rpcUrls[chain] ?? rpcUrls.base),
|
|
23
|
+
});
|
|
24
|
+
walletInstance = createWallet({
|
|
25
|
+
accountAddress: config.accountAddress,
|
|
26
|
+
chain,
|
|
27
|
+
walletClient,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return walletInstance;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create an x402-enabled fetch function for the agent to pay APIs automatically.
|
|
34
|
+
*/
|
|
35
|
+
export function createAgentFetch(config) {
|
|
36
|
+
const wallet = getAgentWallet(config);
|
|
37
|
+
return createX402Fetch(wallet, {
|
|
38
|
+
globalDailyLimit: config.x402DailyLimit ?? 50000000n, // 50 USDC default
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* ElizaOS Plugin definition for agentwallet-sdk.
|
|
43
|
+
*
|
|
44
|
+
* Usage in your Eliza character config:
|
|
45
|
+
*
|
|
46
|
+
* ```json
|
|
47
|
+
* {
|
|
48
|
+
* "plugins": ["@elizaos/plugin-agentwallet"],
|
|
49
|
+
* "settings": {
|
|
50
|
+
* "AGENT_PRIVATE_KEY": "0x...",
|
|
51
|
+
* "AGENT_ACCOUNT_ADDRESS": "0x...",
|
|
52
|
+
* "AGENT_CHAIN": "base",
|
|
53
|
+
* "X402_DAILY_LIMIT": "50000000"
|
|
54
|
+
* }
|
|
55
|
+
* }
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
const AgentWalletPlugin = {
|
|
59
|
+
name: '@elizaos/plugin-agentwallet',
|
|
60
|
+
description: 'Non-custodial agent wallet for ElizaOS — x402 payments, CCTP cross-chain, on-chain spend limits. Agent holds its own keys.',
|
|
61
|
+
actions: [],
|
|
62
|
+
providers: [
|
|
63
|
+
{
|
|
64
|
+
name: 'agentWallet',
|
|
65
|
+
description: 'Provides agent wallet and x402 fetch capability to the runtime',
|
|
66
|
+
async get(runtime) {
|
|
67
|
+
const privateKey = runtime.getSetting('AGENT_PRIVATE_KEY');
|
|
68
|
+
const accountAddress = runtime.getSetting('AGENT_ACCOUNT_ADDRESS');
|
|
69
|
+
const chain = (runtime.getSetting('AGENT_CHAIN') ?? 'base');
|
|
70
|
+
const dailyLimitStr = runtime.getSetting('X402_DAILY_LIMIT');
|
|
71
|
+
const x402DailyLimit = dailyLimitStr ? BigInt(dailyLimitStr) : 50000000n;
|
|
72
|
+
if (!privateKey || !accountAddress) {
|
|
73
|
+
return 'AgentWallet not configured: AGENT_PRIVATE_KEY and AGENT_ACCOUNT_ADDRESS required.';
|
|
74
|
+
}
|
|
75
|
+
const config = { privateKey, accountAddress, chain, x402DailyLimit };
|
|
76
|
+
const wallet = getAgentWallet(config);
|
|
77
|
+
const x402Fetch = createAgentFetch(config);
|
|
78
|
+
// Expose on runtime for actions to use
|
|
79
|
+
runtime.agentWallet = wallet;
|
|
80
|
+
runtime.x402Fetch = x402Fetch;
|
|
81
|
+
return `AgentWallet ready — non-custodial, keys stay local. Chain: ${chain}. x402 daily limit: ${x402DailyLimit / 1000000n} USDC.`;
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
evaluators: [],
|
|
86
|
+
};
|
|
87
|
+
export default AgentWalletPlugin;
|
|
88
|
+
export { AgentWalletPlugin };
|
|
89
|
+
//# sourceMappingURL=elizaos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elizaos.js","sourceRoot":"","sources":["../../src/plugins/elizaos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpendingPolicy — Programmable spending guardrails for AI agents.
|
|
3
|
+
*
|
|
4
|
+
* Beats PolicyLayer.com to market with:
|
|
5
|
+
* - MerchantAllowlist — allowlist-only merchant enforcement
|
|
6
|
+
* - RollingSpendCap — time-windowed spend limits
|
|
7
|
+
* - DraftThenApprove — human-in-the-loop for large transactions
|
|
8
|
+
* - AuditTrail — immutable local log of every payment attempt
|
|
9
|
+
* - FailClosed — policy errors always reject, never approve
|
|
10
|
+
*
|
|
11
|
+
* @module policy/SpendingPolicy
|
|
12
|
+
*/
|
|
13
|
+
/** A payment the agent wants to make. */
|
|
14
|
+
export interface PaymentIntent {
|
|
15
|
+
/** Merchant contract address or domain (e.g. "0xABC..." or "api.example.com") */
|
|
16
|
+
merchant: string;
|
|
17
|
+
/** Amount in the smallest token unit (e.g. USDC micro-cents = 6 decimals). Use number for JS safety in tests; real on-chain code passes BigInt via adapter. */
|
|
18
|
+
amount: number;
|
|
19
|
+
/** ISO-8601 timestamp string. Defaults to now if omitted. */
|
|
20
|
+
timestamp?: string;
|
|
21
|
+
/** Optional human-readable label */
|
|
22
|
+
description?: string;
|
|
23
|
+
}
|
|
24
|
+
export type PolicyStatus = 'approved' | 'rejected' | 'draft';
|
|
25
|
+
/** Result returned by SpendingPolicy.check(). */
|
|
26
|
+
export interface PolicyResult {
|
|
27
|
+
status: PolicyStatus;
|
|
28
|
+
reason?: string;
|
|
29
|
+
draftId?: string;
|
|
30
|
+
}
|
|
31
|
+
/** A queued draft transaction awaiting approval. */
|
|
32
|
+
export interface DraftEntry {
|
|
33
|
+
draftId: string;
|
|
34
|
+
payment: PaymentIntent;
|
|
35
|
+
queuedAt: string;
|
|
36
|
+
approved: boolean;
|
|
37
|
+
rejected: boolean;
|
|
38
|
+
}
|
|
39
|
+
/** Immutable record written to the audit log. */
|
|
40
|
+
export interface AuditEntry {
|
|
41
|
+
id: string;
|
|
42
|
+
timestamp: string;
|
|
43
|
+
merchant: string;
|
|
44
|
+
amount: number;
|
|
45
|
+
status: PolicyStatus;
|
|
46
|
+
reason?: string;
|
|
47
|
+
draftId?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Configuration passed to SpendingPolicy constructor. */
|
|
50
|
+
export interface SpendingPolicyConfig {
|
|
51
|
+
/**
|
|
52
|
+
* MerchantAllowlist: list of allowed contract addresses or domains.
|
|
53
|
+
* If provided and non-empty, only these merchants are allowed.
|
|
54
|
+
* Pass an empty array [] to disable allowlist enforcement (allow all).
|
|
55
|
+
*/
|
|
56
|
+
merchantAllowlist?: string[];
|
|
57
|
+
/**
|
|
58
|
+
* RollingSpendCap: maximum cumulative spend in a rolling time window.
|
|
59
|
+
* Set to undefined to disable.
|
|
60
|
+
*/
|
|
61
|
+
rollingCap?: {
|
|
62
|
+
/** Max amount (same units as PaymentIntent.amount) */
|
|
63
|
+
maxAmount: number;
|
|
64
|
+
/** Window size in milliseconds (e.g. 86_400_000 for 24 h) */
|
|
65
|
+
windowMs: number;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* DraftThenApprove: payments above this threshold are placed in draft status
|
|
69
|
+
* for human (or another agent) approval rather than executed immediately.
|
|
70
|
+
* Set to undefined to disable.
|
|
71
|
+
*/
|
|
72
|
+
draftThreshold?: number;
|
|
73
|
+
}
|
|
74
|
+
export declare class SpendingPolicy {
|
|
75
|
+
private config;
|
|
76
|
+
private allowlist;
|
|
77
|
+
private spendWindow;
|
|
78
|
+
private auditLog;
|
|
79
|
+
private drafts;
|
|
80
|
+
constructor(config: SpendingPolicyConfig);
|
|
81
|
+
/**
|
|
82
|
+
* FailClosed: wraps the actual check logic so that ANY unhandled error
|
|
83
|
+
* produces a rejection rather than inadvertently approving a payment.
|
|
84
|
+
*/
|
|
85
|
+
check(payment: PaymentIntent): Promise<PolicyResult>;
|
|
86
|
+
/**
|
|
87
|
+
* Write a payment attempt to the immutable audit log.
|
|
88
|
+
*/
|
|
89
|
+
log(payment: PaymentIntent, result: PolicyResult): Promise<void>;
|
|
90
|
+
/** Return a copy of the current merchant allowlist. */
|
|
91
|
+
getMerchantAllowlist(): string[];
|
|
92
|
+
/** Add a merchant address/domain to the allowlist at runtime. */
|
|
93
|
+
addMerchant(address: string): void;
|
|
94
|
+
/** Return the full, immutable audit log (copy). */
|
|
95
|
+
getAuditLog(): AuditEntry[];
|
|
96
|
+
/** Approve a queued draft by its draftId. Returns false if not found. */
|
|
97
|
+
approveDraft(draftId: string): boolean;
|
|
98
|
+
/** Reject a queued draft by its draftId. Returns false if not found. */
|
|
99
|
+
rejectDraft(draftId: string): boolean;
|
|
100
|
+
/** Return all pending (not yet approved or rejected) drafts. */
|
|
101
|
+
getPendingDrafts(): DraftEntry[];
|
|
102
|
+
/** Return all drafts. */
|
|
103
|
+
getAllDrafts(): DraftEntry[];
|
|
104
|
+
private _check;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=SpendingPolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpendingPolicy.d.ts","sourceRoot":"","sources":["../../src/policy/SpendingPolicy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,+JAA+J;IAC/J,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAE7D,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,iDAAiD;AACjD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,0DAA0D;AAC1D,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B;;;OAGG;IACH,UAAU,CAAC,EAAE;QACX,sDAAsD;QACtD,SAAS,EAAE,MAAM,CAAC;QAClB,6DAA6D;QAC7D,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAWD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,MAAM,CAA0B;gBAE5B,MAAM,EAAE,oBAAoB;IAYxC;;;OAGG;IACG,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAW1D;;OAEG;IACG,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAatE,uDAAuD;IACvD,oBAAoB,IAAI,MAAM,EAAE;IAIhC,iEAAiE;IACjE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC,mDAAmD;IACnD,WAAW,IAAI,UAAU,EAAE;IAM3B,yEAAyE;IACzE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOtC,wEAAwE;IACxE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOrC,gEAAgE;IAChE,gBAAgB,IAAI,UAAU,EAAE;IAMhC,yBAAyB;IACzB,YAAY,IAAI,UAAU,EAAE;YAMd,MAAM;CAmErB"}
|