amped-defi 1.0.0
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 +757 -0
- package/dist/__mocks__/@sodax/sdk.d.ts +24 -0
- package/dist/__mocks__/@sodax/sdk.d.ts.map +1 -0
- package/dist/__mocks__/@sodax/sdk.js +24 -0
- package/dist/__mocks__/@sodax/sdk.js.map +1 -0
- package/dist/__tests__/setup.d.ts +4 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +32 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +281 -0
- package/dist/index.js.map +1 -0
- package/dist/policy/policyEngine.d.ts +119 -0
- package/dist/policy/policyEngine.d.ts.map +1 -0
- package/dist/policy/policyEngine.js +322 -0
- package/dist/policy/policyEngine.js.map +1 -0
- package/dist/providers/spokeProviderFactory.d.ts +38 -0
- package/dist/providers/spokeProviderFactory.d.ts.map +1 -0
- package/dist/providers/spokeProviderFactory.js +212 -0
- package/dist/providers/spokeProviderFactory.js.map +1 -0
- package/dist/sodax/client.d.ts +34 -0
- package/dist/sodax/client.d.ts.map +1 -0
- package/dist/sodax/client.js +99 -0
- package/dist/sodax/client.js.map +1 -0
- package/dist/tools/bridge.d.ts +105 -0
- package/dist/tools/bridge.d.ts.map +1 -0
- package/dist/tools/bridge.js +334 -0
- package/dist/tools/bridge.js.map +1 -0
- package/dist/tools/discovery.d.ts +141 -0
- package/dist/tools/discovery.d.ts.map +1 -0
- package/dist/tools/discovery.js +777 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/moneyMarket.d.ts +227 -0
- package/dist/tools/moneyMarket.d.ts.map +1 -0
- package/dist/tools/moneyMarket.js +867 -0
- package/dist/tools/moneyMarket.js.map +1 -0
- package/dist/tools/portfolio.d.ts +43 -0
- package/dist/tools/portfolio.d.ts.map +1 -0
- package/dist/tools/portfolio.js +538 -0
- package/dist/tools/portfolio.js.map +1 -0
- package/dist/tools/swap.d.ts +71 -0
- package/dist/tools/swap.d.ts.map +1 -0
- package/dist/tools/swap.js +762 -0
- package/dist/tools/swap.js.map +1 -0
- package/dist/tools/walletManagement.d.ts +80 -0
- package/dist/tools/walletManagement.d.ts.map +1 -0
- package/dist/tools/walletManagement.js +289 -0
- package/dist/tools/walletManagement.js.map +1 -0
- package/dist/types.d.ts +205 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errorUtils.d.ts +2 -0
- package/dist/utils/errorUtils.d.ts.map +1 -0
- package/dist/utils/errorUtils.js +19 -0
- package/dist/utils/errorUtils.js.map +1 -0
- package/dist/utils/errors.d.ts +144 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +310 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/positionAggregator.d.ts +122 -0
- package/dist/utils/positionAggregator.d.ts.map +1 -0
- package/dist/utils/positionAggregator.js +377 -0
- package/dist/utils/positionAggregator.js.map +1 -0
- package/dist/utils/priceService.d.ts +45 -0
- package/dist/utils/priceService.d.ts.map +1 -0
- package/dist/utils/priceService.js +108 -0
- package/dist/utils/priceService.js.map +1 -0
- package/dist/utils/sodaxApi.d.ts +92 -0
- package/dist/utils/sodaxApi.d.ts.map +1 -0
- package/dist/utils/sodaxApi.js +143 -0
- package/dist/utils/sodaxApi.js.map +1 -0
- package/dist/utils/tokenResolver.d.ts +54 -0
- package/dist/utils/tokenResolver.d.ts.map +1 -0
- package/dist/utils/tokenResolver.js +252 -0
- package/dist/utils/tokenResolver.js.map +1 -0
- package/dist/wallet/backendConfig.d.ts +37 -0
- package/dist/wallet/backendConfig.d.ts.map +1 -0
- package/dist/wallet/backendConfig.js +125 -0
- package/dist/wallet/backendConfig.js.map +1 -0
- package/dist/wallet/backends/BankrBackend.d.ts +73 -0
- package/dist/wallet/backends/BankrBackend.d.ts.map +1 -0
- package/dist/wallet/backends/BankrBackend.js +315 -0
- package/dist/wallet/backends/BankrBackend.js.map +1 -0
- package/dist/wallet/backends/BankrWalletProvider.d.ts +75 -0
- package/dist/wallet/backends/BankrWalletProvider.d.ts.map +1 -0
- package/dist/wallet/backends/BankrWalletProvider.js +243 -0
- package/dist/wallet/backends/BankrWalletProvider.js.map +1 -0
- package/dist/wallet/backends/EnvBackend.d.ts +50 -0
- package/dist/wallet/backends/EnvBackend.d.ts.map +1 -0
- package/dist/wallet/backends/EnvBackend.js +114 -0
- package/dist/wallet/backends/EnvBackend.js.map +1 -0
- package/dist/wallet/backends/EvmWalletSkillBackend.d.ts +40 -0
- package/dist/wallet/backends/EvmWalletSkillBackend.d.ts.map +1 -0
- package/dist/wallet/backends/EvmWalletSkillBackend.js +81 -0
- package/dist/wallet/backends/EvmWalletSkillBackend.js.map +1 -0
- package/dist/wallet/backends/index.d.ts +10 -0
- package/dist/wallet/backends/index.d.ts.map +1 -0
- package/dist/wallet/backends/index.js +10 -0
- package/dist/wallet/backends/index.js.map +1 -0
- package/dist/wallet/index.d.ts +9 -0
- package/dist/wallet/index.d.ts.map +1 -0
- package/dist/wallet/index.js +12 -0
- package/dist/wallet/index.js.map +1 -0
- package/dist/wallet/providers/AmpedWalletProvider.d.ts +107 -0
- package/dist/wallet/providers/AmpedWalletProvider.d.ts.map +1 -0
- package/dist/wallet/providers/AmpedWalletProvider.js +208 -0
- package/dist/wallet/providers/AmpedWalletProvider.js.map +1 -0
- package/dist/wallet/providers/BankrBackend.d.ts +105 -0
- package/dist/wallet/providers/BankrBackend.d.ts.map +1 -0
- package/dist/wallet/providers/BankrBackend.js +327 -0
- package/dist/wallet/providers/BankrBackend.js.map +1 -0
- package/dist/wallet/providers/LocalKeyBackend.d.ts +62 -0
- package/dist/wallet/providers/LocalKeyBackend.d.ts.map +1 -0
- package/dist/wallet/providers/LocalKeyBackend.js +152 -0
- package/dist/wallet/providers/LocalKeyBackend.js.map +1 -0
- package/dist/wallet/providers/chainConfig.d.ts +209 -0
- package/dist/wallet/providers/chainConfig.d.ts.map +1 -0
- package/dist/wallet/providers/chainConfig.js +175 -0
- package/dist/wallet/providers/chainConfig.js.map +1 -0
- package/dist/wallet/providers/index.d.ts +30 -0
- package/dist/wallet/providers/index.d.ts.map +1 -0
- package/dist/wallet/providers/index.js +32 -0
- package/dist/wallet/providers/index.js.map +1 -0
- package/dist/wallet/providers/types.d.ts +156 -0
- package/dist/wallet/providers/types.d.ts.map +1 -0
- package/dist/wallet/providers/types.js +11 -0
- package/dist/wallet/providers/types.js.map +1 -0
- package/dist/wallet/skillWalletAdapter.d.ts +96 -0
- package/dist/wallet/skillWalletAdapter.d.ts.map +1 -0
- package/dist/wallet/skillWalletAdapter.js +280 -0
- package/dist/wallet/skillWalletAdapter.js.map +1 -0
- package/dist/wallet/types.d.ts +134 -0
- package/dist/wallet/types.d.ts.map +1 -0
- package/dist/wallet/types.js +138 -0
- package/dist/wallet/types.js.map +1 -0
- package/dist/wallet/walletManager.d.ts +111 -0
- package/dist/wallet/walletManager.d.ts.map +1 -0
- package/dist/wallet/walletManager.js +476 -0
- package/dist/wallet/walletManager.js.map +1 -0
- package/dist/wallet/walletRegistry.d.ts +95 -0
- package/dist/wallet/walletRegistry.d.ts.map +1 -0
- package/dist/wallet/walletRegistry.js +184 -0
- package/dist/wallet/walletRegistry.js.map +1 -0
- package/index.js +2 -0
- package/openclaw.plugin.json +37 -0
- package/package.json +69 -0
- package/src/__mocks__/@sodax/sdk.ts +28 -0
- package/src/__tests__/errors.test.ts +238 -0
- package/src/__tests__/policyEngine.test.ts +354 -0
- package/src/__tests__/positionAggregator.test.ts +271 -0
- package/src/__tests__/setup.ts +35 -0
- package/src/__tests__/sodaxApi.test.ts +203 -0
- package/src/__tests__/walletRegistry.test.ts +155 -0
- package/src/index.ts +376 -0
- package/src/policy/policyEngine.ts +389 -0
- package/src/providers/spokeProviderFactory.ts +283 -0
- package/src/sodax/client.ts +113 -0
- package/src/tools/bridge.ts +425 -0
- package/src/tools/discovery.ts +989 -0
- package/src/tools/moneyMarket.ts +1265 -0
- package/src/tools/portfolio.ts +697 -0
- package/src/tools/swap.ts +926 -0
- package/src/tools/walletManagement.ts +359 -0
- package/src/types.ts +228 -0
- package/src/utils/errorUtils.ts +16 -0
- package/src/utils/errors.ts +396 -0
- package/src/utils/positionAggregator.ts +559 -0
- package/src/utils/priceService.ts +153 -0
- package/src/utils/sodaxApi.ts +261 -0
- package/src/utils/tokenResolver.ts +286 -0
- package/src/wallet/backendConfig.ts +151 -0
- package/src/wallet/backends/BankrBackend.ts +399 -0
- package/src/wallet/backends/BankrWalletProvider.ts +329 -0
- package/src/wallet/backends/EnvBackend.ts +149 -0
- package/src/wallet/backends/EvmWalletSkillBackend.ts +110 -0
- package/src/wallet/backends/index.ts +10 -0
- package/src/wallet/index.ts +14 -0
- package/src/wallet/providers/AmpedWalletProvider.ts +267 -0
- package/src/wallet/providers/BankrBackend.ts +407 -0
- package/src/wallet/providers/LocalKeyBackend.ts +184 -0
- package/src/wallet/providers/chainConfig.ts +194 -0
- package/src/wallet/providers/index.ts +62 -0
- package/src/wallet/providers/types.ts +186 -0
- package/src/wallet/skillWalletAdapter.ts +335 -0
- package/src/wallet/types.ts +248 -0
- package/src/wallet/walletManager.ts +561 -0
- package/src/wallet/walletRegistry.ts +216 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet Management Tools
|
|
3
|
+
*
|
|
4
|
+
* Agent-driven wallet configuration:
|
|
5
|
+
* - Add wallets with nicknames
|
|
6
|
+
* - Rename existing wallets
|
|
7
|
+
* - Remove wallets
|
|
8
|
+
* - Set default wallet
|
|
9
|
+
*
|
|
10
|
+
* Changes persist to: ~/.openclaw/extensions/amped-defi/wallets.json
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { Type, Static } from '@sinclair/typebox';
|
|
14
|
+
import { getWalletManager } from '../wallet';
|
|
15
|
+
import type { WalletConfig, WalletBackendType } from '../wallet/types';
|
|
16
|
+
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// TypeBox Schemas
|
|
19
|
+
// ============================================================================
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Schema for amped_add_wallet
|
|
23
|
+
*/
|
|
24
|
+
const AddWalletSchema = Type.Object({
|
|
25
|
+
nickname: Type.String({
|
|
26
|
+
description: 'Nickname for the wallet (e.g., "trading", "savings", "degen")',
|
|
27
|
+
}),
|
|
28
|
+
source: Type.Union([
|
|
29
|
+
Type.Literal('evm-wallet-skill'),
|
|
30
|
+
Type.Literal('bankr'),
|
|
31
|
+
Type.Literal('env'),
|
|
32
|
+
], {
|
|
33
|
+
description: 'Wallet source type',
|
|
34
|
+
}),
|
|
35
|
+
// For evm-wallet-skill
|
|
36
|
+
path: Type.Optional(Type.String({
|
|
37
|
+
description: 'Path to wallet JSON file (for evm-wallet-skill). Defaults to ~/.evm-wallet.json',
|
|
38
|
+
})),
|
|
39
|
+
// For bankr
|
|
40
|
+
apiKey: Type.Optional(Type.String({
|
|
41
|
+
description: 'Bankr API key (for bankr source)',
|
|
42
|
+
})),
|
|
43
|
+
apiUrl: Type.Optional(Type.String({
|
|
44
|
+
description: 'Bankr API URL (optional, defaults to https://api.bankr.bot)',
|
|
45
|
+
})),
|
|
46
|
+
// For env
|
|
47
|
+
address: Type.Optional(Type.String({
|
|
48
|
+
description: 'Wallet address (for env source)',
|
|
49
|
+
})),
|
|
50
|
+
privateKey: Type.Optional(Type.String({
|
|
51
|
+
description: 'Private key (for env source). WARNING: Will be stored in config file.',
|
|
52
|
+
})),
|
|
53
|
+
// Chain restrictions
|
|
54
|
+
chains: Type.Optional(Type.Array(Type.String(), {
|
|
55
|
+
description: 'Optional list of chains this wallet can use',
|
|
56
|
+
})),
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Schema for amped_rename_wallet
|
|
61
|
+
*/
|
|
62
|
+
const RenameWalletSchema = Type.Object({
|
|
63
|
+
currentNickname: Type.String({
|
|
64
|
+
description: 'Current wallet nickname',
|
|
65
|
+
}),
|
|
66
|
+
newNickname: Type.String({
|
|
67
|
+
description: 'New wallet nickname',
|
|
68
|
+
}),
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Schema for amped_remove_wallet
|
|
73
|
+
*/
|
|
74
|
+
const RemoveWalletSchema = Type.Object({
|
|
75
|
+
nickname: Type.String({
|
|
76
|
+
description: 'Wallet nickname to remove',
|
|
77
|
+
}),
|
|
78
|
+
confirm: Type.Optional(Type.Boolean({
|
|
79
|
+
description: 'Set to true to confirm removal',
|
|
80
|
+
default: false,
|
|
81
|
+
})),
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Schema for amped_set_default_wallet
|
|
86
|
+
*/
|
|
87
|
+
const SetDefaultWalletSchema = Type.Object({
|
|
88
|
+
nickname: Type.String({
|
|
89
|
+
description: 'Wallet nickname to set as default',
|
|
90
|
+
}),
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// ============================================================================
|
|
94
|
+
// Type Definitions
|
|
95
|
+
// ============================================================================
|
|
96
|
+
|
|
97
|
+
type AddWalletParams = Static<typeof AddWalletSchema>;
|
|
98
|
+
type RenameWalletParams = Static<typeof RenameWalletSchema>;
|
|
99
|
+
type RemoveWalletParams = Static<typeof RemoveWalletSchema>;
|
|
100
|
+
type SetDefaultWalletParams = Static<typeof SetDefaultWalletSchema>;
|
|
101
|
+
|
|
102
|
+
interface AgentTools {
|
|
103
|
+
register(tool: {
|
|
104
|
+
name: string;
|
|
105
|
+
summary: string;
|
|
106
|
+
description?: string;
|
|
107
|
+
schema: unknown;
|
|
108
|
+
handler: (params: unknown) => Promise<unknown>;
|
|
109
|
+
}): void;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ============================================================================
|
|
113
|
+
// Handlers
|
|
114
|
+
// ============================================================================
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Add a new wallet with a nickname
|
|
118
|
+
*/
|
|
119
|
+
async function handleAddWallet(params: AddWalletParams): Promise<unknown> {
|
|
120
|
+
const { nickname, source, path, apiKey, apiUrl, address, privateKey, chains } = params;
|
|
121
|
+
|
|
122
|
+
console.log('[walletManagement:addWallet] Adding wallet', { nickname, source });
|
|
123
|
+
|
|
124
|
+
// Validate required fields based on source
|
|
125
|
+
if (source === 'bankr' && !apiKey) {
|
|
126
|
+
throw new Error('Bankr wallet requires apiKey');
|
|
127
|
+
}
|
|
128
|
+
if (source === 'env' && (!address || !privateKey)) {
|
|
129
|
+
throw new Error('Env wallet requires both address and privateKey');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Build config
|
|
133
|
+
const config: WalletConfig = {
|
|
134
|
+
source: source as WalletBackendType,
|
|
135
|
+
chains,
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
if (source === 'evm-wallet-skill') {
|
|
139
|
+
if (path) config.path = path;
|
|
140
|
+
} else if (source === 'bankr') {
|
|
141
|
+
config.apiKey = apiKey;
|
|
142
|
+
if (apiUrl) config.apiUrl = apiUrl;
|
|
143
|
+
} else if (source === 'env') {
|
|
144
|
+
config.address = address as `0x${string}`;
|
|
145
|
+
config.privateKey = privateKey as `0x${string}`;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Add wallet
|
|
149
|
+
const walletManager = getWalletManager();
|
|
150
|
+
await walletManager.addWallet(nickname, config);
|
|
151
|
+
|
|
152
|
+
// Get the new wallet info
|
|
153
|
+
const wallet = await walletManager.resolve(nickname);
|
|
154
|
+
const walletAddress = await wallet.getAddress();
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
success: true,
|
|
158
|
+
message: `Wallet "${nickname}" added successfully`,
|
|
159
|
+
wallet: {
|
|
160
|
+
nickname: nickname.toLowerCase(),
|
|
161
|
+
type: source,
|
|
162
|
+
address: walletAddress,
|
|
163
|
+
chains: wallet.supportedChains,
|
|
164
|
+
},
|
|
165
|
+
hint: `You can now use: "swap 100 USDC to ETH using ${nickname}"`,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Rename a wallet
|
|
171
|
+
*/
|
|
172
|
+
async function handleRenameWallet(params: RenameWalletParams): Promise<unknown> {
|
|
173
|
+
const { currentNickname, newNickname } = params;
|
|
174
|
+
|
|
175
|
+
console.log('[walletManagement:renameWallet] Renaming wallet', {
|
|
176
|
+
from: currentNickname,
|
|
177
|
+
to: newNickname
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
const walletManager = getWalletManager();
|
|
181
|
+
|
|
182
|
+
// Get current info before rename
|
|
183
|
+
const wallet = await walletManager.resolve(currentNickname);
|
|
184
|
+
const address = await wallet.getAddress();
|
|
185
|
+
|
|
186
|
+
// Rename
|
|
187
|
+
await walletManager.renameWallet(currentNickname, newNickname);
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
success: true,
|
|
191
|
+
message: `Wallet renamed from "${currentNickname}" to "${newNickname}"`,
|
|
192
|
+
wallet: {
|
|
193
|
+
nickname: newNickname.toLowerCase(),
|
|
194
|
+
type: wallet.type,
|
|
195
|
+
address,
|
|
196
|
+
},
|
|
197
|
+
hint: `Now use: "swap 100 USDC using ${newNickname}"`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Remove a wallet
|
|
203
|
+
*/
|
|
204
|
+
async function handleRemoveWallet(params: RemoveWalletParams): Promise<unknown> {
|
|
205
|
+
const { nickname, confirm } = params;
|
|
206
|
+
|
|
207
|
+
console.log('[walletManagement:removeWallet] Removing wallet', { nickname, confirm });
|
|
208
|
+
|
|
209
|
+
const walletManager = getWalletManager();
|
|
210
|
+
|
|
211
|
+
// Get wallet info before removal
|
|
212
|
+
const wallet = await walletManager.resolve(nickname);
|
|
213
|
+
const address = await wallet.getAddress();
|
|
214
|
+
|
|
215
|
+
if (!confirm) {
|
|
216
|
+
return {
|
|
217
|
+
success: false,
|
|
218
|
+
requiresConfirmation: true,
|
|
219
|
+
message: `Are you sure you want to remove wallet "${nickname}" (${address})?`,
|
|
220
|
+
wallet: {
|
|
221
|
+
nickname: nickname.toLowerCase(),
|
|
222
|
+
type: wallet.type,
|
|
223
|
+
address,
|
|
224
|
+
},
|
|
225
|
+
hint: 'Call again with confirm: true to proceed',
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Remove
|
|
230
|
+
await walletManager.removeWallet(nickname);
|
|
231
|
+
|
|
232
|
+
// List remaining wallets
|
|
233
|
+
const remainingWallets = await walletManager.listWallets();
|
|
234
|
+
|
|
235
|
+
return {
|
|
236
|
+
success: true,
|
|
237
|
+
message: `Wallet "${nickname}" removed`,
|
|
238
|
+
remainingWallets: remainingWallets.map(w => ({
|
|
239
|
+
nickname: w.nickname,
|
|
240
|
+
type: w.type,
|
|
241
|
+
isDefault: w.isDefault,
|
|
242
|
+
})),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Set default wallet
|
|
248
|
+
*/
|
|
249
|
+
async function handleSetDefaultWallet(params: SetDefaultWalletParams): Promise<unknown> {
|
|
250
|
+
const { nickname } = params;
|
|
251
|
+
|
|
252
|
+
console.log('[walletManagement:setDefaultWallet] Setting default', { nickname });
|
|
253
|
+
|
|
254
|
+
const walletManager = getWalletManager();
|
|
255
|
+
|
|
256
|
+
// Validate wallet exists
|
|
257
|
+
const wallet = await walletManager.resolve(nickname);
|
|
258
|
+
const address = await wallet.getAddress();
|
|
259
|
+
|
|
260
|
+
// Set default
|
|
261
|
+
await walletManager.setDefaultWallet(nickname);
|
|
262
|
+
|
|
263
|
+
return {
|
|
264
|
+
success: true,
|
|
265
|
+
message: `Default wallet set to "${nickname}"`,
|
|
266
|
+
wallet: {
|
|
267
|
+
nickname: nickname.toLowerCase(),
|
|
268
|
+
type: wallet.type,
|
|
269
|
+
address,
|
|
270
|
+
chains: [...wallet.supportedChains],
|
|
271
|
+
},
|
|
272
|
+
hint: 'Operations without a wallet specified will now use this wallet',
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// ============================================================================
|
|
277
|
+
// Error Wrapper
|
|
278
|
+
// ============================================================================
|
|
279
|
+
|
|
280
|
+
function wrapHandler<T>(handler: (params: T) => Promise<unknown>) {
|
|
281
|
+
return async (params: unknown): Promise<unknown> => {
|
|
282
|
+
try {
|
|
283
|
+
return await handler(params as T);
|
|
284
|
+
} catch (error) {
|
|
285
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
286
|
+
console.error('[walletManagement] Error:', message);
|
|
287
|
+
return {
|
|
288
|
+
success: false,
|
|
289
|
+
error: message,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// ============================================================================
|
|
296
|
+
// Tool Registration
|
|
297
|
+
// ============================================================================
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Register wallet management tools
|
|
301
|
+
*/
|
|
302
|
+
export function registerWalletManagementTools(agentTools: AgentTools): void {
|
|
303
|
+
// 1. Add wallet
|
|
304
|
+
agentTools.register({
|
|
305
|
+
name: 'amped_add_wallet',
|
|
306
|
+
summary: 'Add a new wallet with a nickname for easy reference',
|
|
307
|
+
description:
|
|
308
|
+
'Add a wallet from evm-wallet-skill, Bankr, or environment variables. ' +
|
|
309
|
+
'Give it a memorable nickname like "trading", "savings", or "degen". ' +
|
|
310
|
+
'The wallet will be saved to config and available across sessions.',
|
|
311
|
+
schema: AddWalletSchema,
|
|
312
|
+
handler: wrapHandler(handleAddWallet),
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// 2. Rename wallet
|
|
316
|
+
agentTools.register({
|
|
317
|
+
name: 'amped_rename_wallet',
|
|
318
|
+
summary: 'Rename a wallet to a new nickname',
|
|
319
|
+
description:
|
|
320
|
+
'Change the nickname of an existing wallet. ' +
|
|
321
|
+
'The wallet address and configuration remain the same, only the nickname changes.',
|
|
322
|
+
schema: RenameWalletSchema,
|
|
323
|
+
handler: wrapHandler(handleRenameWallet),
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
// 3. Remove wallet
|
|
327
|
+
agentTools.register({
|
|
328
|
+
name: 'amped_remove_wallet',
|
|
329
|
+
summary: 'Remove a wallet from configuration',
|
|
330
|
+
description:
|
|
331
|
+
'Remove a wallet by nickname. This only removes it from the config file, ' +
|
|
332
|
+
'it does NOT delete the actual wallet or funds. Requires confirmation.',
|
|
333
|
+
schema: RemoveWalletSchema,
|
|
334
|
+
handler: wrapHandler(handleRemoveWallet),
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
// 4. Set default wallet
|
|
338
|
+
agentTools.register({
|
|
339
|
+
name: 'amped_set_default_wallet',
|
|
340
|
+
summary: 'Set which wallet to use by default',
|
|
341
|
+
description:
|
|
342
|
+
'Set the default wallet for operations. When you don\'t specify a wallet, ' +
|
|
343
|
+
'this one will be used automatically.',
|
|
344
|
+
schema: SetDefaultWalletSchema,
|
|
345
|
+
handler: wrapHandler(handleSetDefaultWallet),
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Export schemas and handlers for testing
|
|
350
|
+
export {
|
|
351
|
+
AddWalletSchema,
|
|
352
|
+
RenameWalletSchema,
|
|
353
|
+
RemoveWalletSchema,
|
|
354
|
+
SetDefaultWalletSchema,
|
|
355
|
+
handleAddWallet,
|
|
356
|
+
handleRenameWallet,
|
|
357
|
+
handleRemoveWallet,
|
|
358
|
+
handleSetDefaultWallet,
|
|
359
|
+
};
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common types for Amped DeFi plugin
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Static, TSchema } from '@sinclair/typebox';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Tool handler function type
|
|
9
|
+
*/
|
|
10
|
+
export type ToolHandler<T extends TSchema> = (params: Static<T>) => Promise<unknown>;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Agent tools registry interface
|
|
14
|
+
*/
|
|
15
|
+
export interface AgentTools {
|
|
16
|
+
register: <T extends TSchema>(tool: {
|
|
17
|
+
name: string;
|
|
18
|
+
summary: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
schema: T;
|
|
21
|
+
handler: ToolHandler<T>;
|
|
22
|
+
}) => void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Alternative registration interface with input/output schemas
|
|
27
|
+
*/
|
|
28
|
+
export interface AgentToolsTyped {
|
|
29
|
+
register<T extends TSchema, R extends TSchema>(config: {
|
|
30
|
+
name: string;
|
|
31
|
+
summary: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
schema: {
|
|
34
|
+
input: T;
|
|
35
|
+
output?: R;
|
|
36
|
+
};
|
|
37
|
+
handler: (input: Static<T>) => Promise<Static<R>>;
|
|
38
|
+
}): void;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Standard tool result wrapper
|
|
43
|
+
*/
|
|
44
|
+
export interface ToolResult<T = unknown> {
|
|
45
|
+
success: boolean;
|
|
46
|
+
data?: T;
|
|
47
|
+
error?: string;
|
|
48
|
+
message?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Transaction status
|
|
53
|
+
*/
|
|
54
|
+
export type TransactionStatus =
|
|
55
|
+
| 'pending'
|
|
56
|
+
| 'submitted'
|
|
57
|
+
| 'confirmed'
|
|
58
|
+
| 'failed'
|
|
59
|
+
| 'cancelled'
|
|
60
|
+
| 'unknown';
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Intent status from SODAX
|
|
64
|
+
*/
|
|
65
|
+
export interface IntentStatus {
|
|
66
|
+
intentHash: string;
|
|
67
|
+
status: 'pending' | 'filled' | 'cancelled' | 'expired' | 'failed';
|
|
68
|
+
spokeTxHash?: string;
|
|
69
|
+
hubTxHash?: string;
|
|
70
|
+
filledAmount?: string;
|
|
71
|
+
error?: string;
|
|
72
|
+
createdAt?: number;
|
|
73
|
+
updatedAt?: number;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Quote result
|
|
78
|
+
*/
|
|
79
|
+
export interface QuoteResult {
|
|
80
|
+
quoteId: string;
|
|
81
|
+
srcChainId: string;
|
|
82
|
+
dstChainId: string;
|
|
83
|
+
srcToken: string;
|
|
84
|
+
dstToken: string;
|
|
85
|
+
srcAmount: string;
|
|
86
|
+
dstAmount: string;
|
|
87
|
+
minDstAmount?: string;
|
|
88
|
+
slippageBps: number;
|
|
89
|
+
deadline: number;
|
|
90
|
+
fees: {
|
|
91
|
+
solverFee?: string;
|
|
92
|
+
partnerFee?: string;
|
|
93
|
+
gasFee?: string;
|
|
94
|
+
};
|
|
95
|
+
route?: unknown;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Bridge result
|
|
100
|
+
*/
|
|
101
|
+
export interface BridgeResult {
|
|
102
|
+
spokeTxHash: string;
|
|
103
|
+
hubTxHash?: string;
|
|
104
|
+
status: TransactionStatus;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Money market position
|
|
109
|
+
*/
|
|
110
|
+
export interface MoneyMarketPosition {
|
|
111
|
+
token: string;
|
|
112
|
+
supplied: string;
|
|
113
|
+
borrowed: string;
|
|
114
|
+
supplyApy: number;
|
|
115
|
+
borrowApy: number;
|
|
116
|
+
collateralFactor: number;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Money market reserve
|
|
121
|
+
*/
|
|
122
|
+
export interface MoneyMarketReserve {
|
|
123
|
+
token: string;
|
|
124
|
+
totalSupplied: string;
|
|
125
|
+
totalBorrowed: string;
|
|
126
|
+
supplyApy: number;
|
|
127
|
+
borrowApy: number;
|
|
128
|
+
utilizationRate: number;
|
|
129
|
+
collateralFactor: number;
|
|
130
|
+
liquidationThreshold: number;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Chain configuration
|
|
135
|
+
*/
|
|
136
|
+
export interface ChainConfig {
|
|
137
|
+
chainId: string;
|
|
138
|
+
name: string;
|
|
139
|
+
isHub: boolean;
|
|
140
|
+
nativeCurrency: {
|
|
141
|
+
symbol: string;
|
|
142
|
+
decimals: number;
|
|
143
|
+
};
|
|
144
|
+
rpcUrl?: string;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Token configuration
|
|
149
|
+
*/
|
|
150
|
+
export interface TokenConfig {
|
|
151
|
+
address: string;
|
|
152
|
+
symbol: string;
|
|
153
|
+
name: string;
|
|
154
|
+
decimals: number;
|
|
155
|
+
chainId: string;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Wallet information (safe to log)
|
|
160
|
+
*/
|
|
161
|
+
export interface WalletInfo {
|
|
162
|
+
walletId: string;
|
|
163
|
+
address: string;
|
|
164
|
+
mode: 'execute' | 'prepare';
|
|
165
|
+
chains: string[];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Operation context for logging
|
|
170
|
+
*/
|
|
171
|
+
export interface OperationContext {
|
|
172
|
+
requestId: string;
|
|
173
|
+
agentId?: string;
|
|
174
|
+
walletId: string;
|
|
175
|
+
operation: string;
|
|
176
|
+
chainIds: string[];
|
|
177
|
+
tokenAddresses?: string[];
|
|
178
|
+
timestamp: number;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Bridge operation parameters
|
|
183
|
+
*/
|
|
184
|
+
export interface BridgeOperation {
|
|
185
|
+
walletId: string;
|
|
186
|
+
srcChainId: string;
|
|
187
|
+
dstChainId: string;
|
|
188
|
+
srcToken: string;
|
|
189
|
+
dstToken: string;
|
|
190
|
+
amount: string;
|
|
191
|
+
recipient?: string;
|
|
192
|
+
timeoutMs?: number;
|
|
193
|
+
policyId?: string;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Wallet configuration
|
|
198
|
+
*/
|
|
199
|
+
export interface WalletConfig {
|
|
200
|
+
address: string;
|
|
201
|
+
privateKey?: string;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Policy configuration
|
|
206
|
+
*/
|
|
207
|
+
export interface PolicyConfig {
|
|
208
|
+
/** Maximum USD value for swap inputs */
|
|
209
|
+
maxSwapInputUsd?: number;
|
|
210
|
+
/** Maximum per-token amount for swap inputs */
|
|
211
|
+
maxSwapInputToken?: Record<string, number>;
|
|
212
|
+
/** Maximum per-token amount for bridge operations */
|
|
213
|
+
maxBridgeAmountToken?: Record<string, number>;
|
|
214
|
+
/** Maximum USD value for borrows */
|
|
215
|
+
maxBorrowUsd?: number;
|
|
216
|
+
/** Maximum per-token amount for borrows */
|
|
217
|
+
maxBorrowToken?: Record<string, number>;
|
|
218
|
+
/** Allowed chain IDs for operations */
|
|
219
|
+
allowedChains?: string[];
|
|
220
|
+
/** Allowed tokens per chain */
|
|
221
|
+
allowedTokensByChain?: Record<string, string[]>;
|
|
222
|
+
/** Blocked recipient addresses */
|
|
223
|
+
blockedRecipients?: string[];
|
|
224
|
+
/** Maximum slippage in basis points (100 = 1%) */
|
|
225
|
+
maxSlippageBps?: number;
|
|
226
|
+
/** Whether to require transaction simulation */
|
|
227
|
+
requireSimulation?: boolean;
|
|
228
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serialize SDK error objects for readable error messages
|
|
3
|
+
*/
|
|
4
|
+
function bigintReplacer(key: string, value: any): any {
|
|
5
|
+
return typeof value === 'bigint' ? value.toString() : value;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function serializeError(error: unknown): string {
|
|
9
|
+
if (error instanceof Error) return error.message;
|
|
10
|
+
if (typeof error === 'string') return error;
|
|
11
|
+
try {
|
|
12
|
+
return JSON.stringify(error, bigintReplacer, 2);
|
|
13
|
+
} catch {
|
|
14
|
+
return String(error);
|
|
15
|
+
}
|
|
16
|
+
}
|