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,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Wallet Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages multiple wallet sources with nicknames:
|
|
5
|
+
* - evm-wallet-skill (main)
|
|
6
|
+
* - Bankr (bankr)
|
|
7
|
+
* - Environment variables (custom names)
|
|
8
|
+
*
|
|
9
|
+
* Auto-discovery order:
|
|
10
|
+
* 1. wallets.json config file
|
|
11
|
+
* 2. ~/.evm-wallet.json (evm-wallet-skill) → "main"
|
|
12
|
+
* 3. BANKR_API_KEY env → "bankr"
|
|
13
|
+
* 4. AMPED_OC_WALLETS_JSON env → named wallets
|
|
14
|
+
*/
|
|
15
|
+
import type { IWalletBackend, WalletInfo, WalletConfig } from './types';
|
|
16
|
+
/**
|
|
17
|
+
* Unified wallet manager
|
|
18
|
+
*/
|
|
19
|
+
export declare class WalletManager {
|
|
20
|
+
private wallets;
|
|
21
|
+
private defaultWallet;
|
|
22
|
+
private initialized;
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the wallet manager
|
|
25
|
+
* Auto-discovers wallets from all sources
|
|
26
|
+
*/
|
|
27
|
+
initialize(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Load wallets from config file
|
|
30
|
+
*/
|
|
31
|
+
private loadConfigFile;
|
|
32
|
+
/**
|
|
33
|
+
* Create backend from config entry
|
|
34
|
+
*/
|
|
35
|
+
private createBackendFromConfig;
|
|
36
|
+
/**
|
|
37
|
+
* Auto-discover wallets from environment
|
|
38
|
+
*/
|
|
39
|
+
private autoDiscover;
|
|
40
|
+
/**
|
|
41
|
+
* Determine default wallet
|
|
42
|
+
*/
|
|
43
|
+
private determineDefault;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve a wallet by nickname
|
|
46
|
+
* @param nickname Optional wallet nickname (uses default if not provided)
|
|
47
|
+
*/
|
|
48
|
+
resolve(nickname?: string): Promise<IWalletBackend>;
|
|
49
|
+
/**
|
|
50
|
+
* Check if a wallet exists
|
|
51
|
+
*/
|
|
52
|
+
has(nickname: string): Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* List all available wallets
|
|
55
|
+
*/
|
|
56
|
+
listWallets(): Promise<WalletInfo[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Get the default wallet nickname
|
|
59
|
+
*/
|
|
60
|
+
getDefaultWalletName(): Promise<string | null>;
|
|
61
|
+
/**
|
|
62
|
+
* Register a new wallet backend
|
|
63
|
+
*/
|
|
64
|
+
registerWallet(nickname: string, backend: IWalletBackend): void;
|
|
65
|
+
/**
|
|
66
|
+
* Get available wallet IDs (nicknames)
|
|
67
|
+
* Synchronous version - requires prior initialization
|
|
68
|
+
*/
|
|
69
|
+
getAvailableWalletIds(): string[];
|
|
70
|
+
/**
|
|
71
|
+
* Add a new wallet to the config file
|
|
72
|
+
*/
|
|
73
|
+
addWallet(nickname: string, config: WalletConfig): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Rename a wallet
|
|
76
|
+
*/
|
|
77
|
+
renameWallet(currentNickname: string, newNickname: string): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Remove a wallet from config
|
|
80
|
+
*/
|
|
81
|
+
removeWallet(nickname: string): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Set the default wallet
|
|
84
|
+
*/
|
|
85
|
+
setDefaultWallet(nickname: string): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Load config from file (creates empty if doesn't exist)
|
|
88
|
+
*/
|
|
89
|
+
private loadConfigFromFile;
|
|
90
|
+
/**
|
|
91
|
+
* Save config to file
|
|
92
|
+
*/
|
|
93
|
+
private saveConfigToFile;
|
|
94
|
+
/**
|
|
95
|
+
* Convert a backend to config (for saving auto-discovered wallets)
|
|
96
|
+
*/
|
|
97
|
+
private backendToConfig;
|
|
98
|
+
/**
|
|
99
|
+
* Reset the manager (for testing)
|
|
100
|
+
*/
|
|
101
|
+
reset(): void;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get the singleton WalletManager instance
|
|
105
|
+
*/
|
|
106
|
+
export declare function getWalletManager(): WalletManager;
|
|
107
|
+
/**
|
|
108
|
+
* Reset the singleton (for testing)
|
|
109
|
+
*/
|
|
110
|
+
export declare function resetWalletManager(): void;
|
|
111
|
+
//# sourceMappingURL=walletManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walletManager.d.ts","sourceRoot":"","sources":["../../src/wallet/walletManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAqB,YAAY,EAAE,MAAM,SAAS,CAAC;AAmB3F;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,WAAW,CAAS;IAE5B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBjC;;OAEG;YACW,cAAc;IAuB5B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAwC/B;;OAEG;YACW,YAAY;IA8C1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;;OAGG;IACG,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAwBzD;;OAEG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK7C;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAiD1C;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKpD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAK/D;;;OAGG;IACH,qBAAqB,IAAI,MAAM,EAAE;IAIjC;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCtE;;OAEG;IACG,YAAY,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiD/E;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCnD;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBvD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;YACW,eAAe;IAyB7B;;OAEG;IACH,KAAK,IAAI,IAAI;CAKd;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
|
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Wallet Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages multiple wallet sources with nicknames:
|
|
5
|
+
* - evm-wallet-skill (main)
|
|
6
|
+
* - Bankr (bankr)
|
|
7
|
+
* - Environment variables (custom names)
|
|
8
|
+
*
|
|
9
|
+
* Auto-discovery order:
|
|
10
|
+
* 1. wallets.json config file
|
|
11
|
+
* 2. ~/.evm-wallet.json (evm-wallet-skill) → "main"
|
|
12
|
+
* 3. BANKR_API_KEY env → "bankr"
|
|
13
|
+
* 4. AMPED_OC_WALLETS_JSON env → named wallets
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
16
|
+
import { join, dirname } from 'path';
|
|
17
|
+
import { homedir } from 'os';
|
|
18
|
+
import { createEvmWalletSkillBackend, createBankrBackend, createEnvBackend, loadWalletsFromEnv } from './backends';
|
|
19
|
+
/**
|
|
20
|
+
* Config file path
|
|
21
|
+
*/
|
|
22
|
+
const CONFIG_PATH = join(homedir(), '.openclaw', 'extensions', 'amped-defi', 'wallets.json');
|
|
23
|
+
const EVM_WALLET_PATH = join(homedir(), '.evm-wallet.json');
|
|
24
|
+
/**
|
|
25
|
+
* Singleton WalletManager instance
|
|
26
|
+
*/
|
|
27
|
+
let instance = null;
|
|
28
|
+
/**
|
|
29
|
+
* Unified wallet manager
|
|
30
|
+
*/
|
|
31
|
+
export class WalletManager {
|
|
32
|
+
wallets = new Map();
|
|
33
|
+
defaultWallet = null;
|
|
34
|
+
initialized = false;
|
|
35
|
+
/**
|
|
36
|
+
* Initialize the wallet manager
|
|
37
|
+
* Auto-discovers wallets from all sources
|
|
38
|
+
*/
|
|
39
|
+
async initialize() {
|
|
40
|
+
if (this.initialized)
|
|
41
|
+
return;
|
|
42
|
+
console.log('[WalletManager] Initializing...');
|
|
43
|
+
// 1. Load from config file if exists
|
|
44
|
+
await this.loadConfigFile();
|
|
45
|
+
// 2. Auto-discover from environment
|
|
46
|
+
await this.autoDiscover();
|
|
47
|
+
// 3. Set default
|
|
48
|
+
this.determineDefault();
|
|
49
|
+
this.initialized = true;
|
|
50
|
+
console.log(`[WalletManager] Initialized with ${this.wallets.size} wallet(s)`);
|
|
51
|
+
if (this.defaultWallet) {
|
|
52
|
+
console.log(`[WalletManager] Default wallet: ${this.defaultWallet}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Load wallets from config file
|
|
57
|
+
*/
|
|
58
|
+
async loadConfigFile() {
|
|
59
|
+
if (!existsSync(CONFIG_PATH))
|
|
60
|
+
return;
|
|
61
|
+
try {
|
|
62
|
+
const content = readFileSync(CONFIG_PATH, 'utf-8');
|
|
63
|
+
const config = JSON.parse(content);
|
|
64
|
+
for (const [name, walletConfig] of Object.entries(config.wallets)) {
|
|
65
|
+
const backend = this.createBackendFromConfig(name, walletConfig);
|
|
66
|
+
if (backend) {
|
|
67
|
+
this.wallets.set(name.toLowerCase(), backend);
|
|
68
|
+
console.log(`[WalletManager] Loaded wallet "${name}" from config`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (config.default) {
|
|
72
|
+
this.defaultWallet = config.default.toLowerCase();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.warn(`[WalletManager] Failed to load config: ${error}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Create backend from config entry
|
|
81
|
+
*/
|
|
82
|
+
createBackendFromConfig(name, config) {
|
|
83
|
+
try {
|
|
84
|
+
switch (config.source) {
|
|
85
|
+
case 'evm-wallet-skill':
|
|
86
|
+
return createEvmWalletSkillBackend({
|
|
87
|
+
nickname: name,
|
|
88
|
+
path: config.path,
|
|
89
|
+
chains: config.chains,
|
|
90
|
+
});
|
|
91
|
+
case 'bankr':
|
|
92
|
+
if (!config.apiKey) {
|
|
93
|
+
console.warn(`[WalletManager] Bankr wallet "${name}" missing apiKey`);
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
return createBankrBackend({
|
|
97
|
+
nickname: name,
|
|
98
|
+
apiKey: config.apiKey,
|
|
99
|
+
apiUrl: config.apiUrl,
|
|
100
|
+
});
|
|
101
|
+
case 'env':
|
|
102
|
+
return createEnvBackend({
|
|
103
|
+
nickname: name,
|
|
104
|
+
address: config.address,
|
|
105
|
+
privateKey: config.privateKey,
|
|
106
|
+
envVar: config.envVar,
|
|
107
|
+
chains: config.chains,
|
|
108
|
+
});
|
|
109
|
+
default:
|
|
110
|
+
console.warn(`[WalletManager] Unknown wallet source: ${config.source}`);
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.warn(`[WalletManager] Failed to create backend for "${name}": ${error}`);
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Auto-discover wallets from environment
|
|
121
|
+
*/
|
|
122
|
+
async autoDiscover() {
|
|
123
|
+
// evm-wallet-skill (if not already configured)
|
|
124
|
+
if (!this.wallets.has('main') && existsSync(EVM_WALLET_PATH)) {
|
|
125
|
+
try {
|
|
126
|
+
const backend = createEvmWalletSkillBackend({ nickname: 'main' });
|
|
127
|
+
if (await backend.isReady()) {
|
|
128
|
+
this.wallets.set('main', backend);
|
|
129
|
+
console.log('[WalletManager] Auto-discovered: evm-wallet-skill → "main"');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.debug(`[WalletManager] evm-wallet-skill not available: ${error}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Bankr (if API key present and not already configured)
|
|
137
|
+
const bankrApiKey = process.env.BANKR_API_KEY;
|
|
138
|
+
if (!this.wallets.has('bankr') && bankrApiKey) {
|
|
139
|
+
console.log('[WalletManager] Found BANKR_API_KEY, attempting to add Bankr wallet...');
|
|
140
|
+
try {
|
|
141
|
+
const backend = createBankrBackend({
|
|
142
|
+
nickname: 'bankr',
|
|
143
|
+
apiKey: bankrApiKey,
|
|
144
|
+
apiUrl: process.env.BANKR_API_URL,
|
|
145
|
+
});
|
|
146
|
+
const ready = await backend.isReady();
|
|
147
|
+
if (ready) {
|
|
148
|
+
this.wallets.set('bankr', backend);
|
|
149
|
+
console.log('[WalletManager] Auto-discovered: BANKR_API_KEY → "bankr"');
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
console.warn('[WalletManager] Bankr API key present but connectivity check failed');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
console.warn(`[WalletManager] Bankr auto-discovery failed: ${error}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Environment variable wallets
|
|
160
|
+
const envWallets = loadWalletsFromEnv();
|
|
161
|
+
for (const [name, backend] of envWallets) {
|
|
162
|
+
if (!this.wallets.has(name)) {
|
|
163
|
+
this.wallets.set(name, backend);
|
|
164
|
+
console.log(`[WalletManager] Auto-discovered: AMPED_OC_WALLETS_JSON → "${name}"`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Determine default wallet
|
|
170
|
+
*/
|
|
171
|
+
determineDefault() {
|
|
172
|
+
// If already set from config, verify it exists
|
|
173
|
+
if (this.defaultWallet && this.wallets.has(this.defaultWallet)) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// Priority: main > first available
|
|
177
|
+
if (this.wallets.has('main')) {
|
|
178
|
+
this.defaultWallet = 'main';
|
|
179
|
+
}
|
|
180
|
+
else if (this.wallets.size > 0) {
|
|
181
|
+
this.defaultWallet = Array.from(this.wallets.keys())[0];
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
this.defaultWallet = null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Resolve a wallet by nickname
|
|
189
|
+
* @param nickname Optional wallet nickname (uses default if not provided)
|
|
190
|
+
*/
|
|
191
|
+
async resolve(nickname) {
|
|
192
|
+
await this.initialize();
|
|
193
|
+
const name = (nickname || this.defaultWallet)?.toLowerCase();
|
|
194
|
+
if (!name) {
|
|
195
|
+
throw new Error('No wallet configured.\n\n' +
|
|
196
|
+
'To set up a wallet, install evm-wallet-skill:\n' +
|
|
197
|
+
' git clone https://github.com/amped-finance/evm-wallet-skill.git ~/.openclaw/skills/evm-wallet-skill\n' +
|
|
198
|
+
' cd ~/.openclaw/skills/evm-wallet-skill && npm install\n' +
|
|
199
|
+
' node src/setup.js');
|
|
200
|
+
}
|
|
201
|
+
const wallet = this.wallets.get(name);
|
|
202
|
+
if (!wallet) {
|
|
203
|
+
const available = Array.from(this.wallets.keys()).join(', ') || '(none)';
|
|
204
|
+
throw new Error(`Wallet "${name}" not found. Available wallets: ${available}`);
|
|
205
|
+
}
|
|
206
|
+
return wallet;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Check if a wallet exists
|
|
210
|
+
*/
|
|
211
|
+
async has(nickname) {
|
|
212
|
+
await this.initialize();
|
|
213
|
+
return this.wallets.has(nickname.toLowerCase());
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* List all available wallets
|
|
217
|
+
*/
|
|
218
|
+
async listWallets() {
|
|
219
|
+
await this.initialize();
|
|
220
|
+
const wallets = [];
|
|
221
|
+
for (const [name, backend] of this.wallets) {
|
|
222
|
+
try {
|
|
223
|
+
// Add timeout for slow backends (like Bankr)
|
|
224
|
+
const addressPromise = backend.getAddress();
|
|
225
|
+
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), 30000));
|
|
226
|
+
const address = await Promise.race([addressPromise, timeoutPromise]);
|
|
227
|
+
// Get Solana address for Bankr wallets
|
|
228
|
+
let solanaAddress;
|
|
229
|
+
if (backend.type === 'bankr' && backend.getSolanaAddress) {
|
|
230
|
+
try {
|
|
231
|
+
solanaAddress = await backend.getSolanaAddress() || undefined;
|
|
232
|
+
}
|
|
233
|
+
catch (e) {
|
|
234
|
+
console.warn(`[WalletManager] Failed to get Solana address for ${name}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
wallets.push({
|
|
238
|
+
nickname: name,
|
|
239
|
+
type: backend.type,
|
|
240
|
+
address,
|
|
241
|
+
chains: [...backend.supportedChains],
|
|
242
|
+
isDefault: name === this.defaultWallet,
|
|
243
|
+
solanaAddress,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
// Include wallet with placeholder address if we can't get it
|
|
248
|
+
console.warn(`[WalletManager] Failed to get address for "${name}": ${error}`);
|
|
249
|
+
wallets.push({
|
|
250
|
+
nickname: name,
|
|
251
|
+
type: backend.type,
|
|
252
|
+
address: '0x...', // Placeholder
|
|
253
|
+
chains: [...backend.supportedChains],
|
|
254
|
+
isDefault: name === this.defaultWallet,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return wallets;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get the default wallet nickname
|
|
262
|
+
*/
|
|
263
|
+
async getDefaultWalletName() {
|
|
264
|
+
await this.initialize();
|
|
265
|
+
return this.defaultWallet;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Register a new wallet backend
|
|
269
|
+
*/
|
|
270
|
+
registerWallet(nickname, backend) {
|
|
271
|
+
this.wallets.set(nickname.toLowerCase(), backend);
|
|
272
|
+
console.log(`[WalletManager] Registered wallet: ${nickname}`);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get available wallet IDs (nicknames)
|
|
276
|
+
* Synchronous version - requires prior initialization
|
|
277
|
+
*/
|
|
278
|
+
getAvailableWalletIds() {
|
|
279
|
+
return Array.from(this.wallets.keys());
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Add a new wallet to the config file
|
|
283
|
+
*/
|
|
284
|
+
async addWallet(nickname, config) {
|
|
285
|
+
await this.initialize();
|
|
286
|
+
const normalizedName = nickname.toLowerCase();
|
|
287
|
+
// Check if wallet already exists
|
|
288
|
+
if (this.wallets.has(normalizedName)) {
|
|
289
|
+
throw new Error(`Wallet "${nickname}" already exists. Use rename to change it.`);
|
|
290
|
+
}
|
|
291
|
+
// Create the backend to validate config
|
|
292
|
+
const backend = this.createBackendFromConfig(normalizedName, config);
|
|
293
|
+
if (!backend) {
|
|
294
|
+
throw new Error(`Failed to create wallet backend for "${nickname}"`);
|
|
295
|
+
}
|
|
296
|
+
// Validate the backend works
|
|
297
|
+
const ready = await backend.isReady();
|
|
298
|
+
if (!ready) {
|
|
299
|
+
throw new Error(`Wallet "${nickname}" configuration is invalid or not accessible`);
|
|
300
|
+
}
|
|
301
|
+
// Load existing config
|
|
302
|
+
const fileConfig = this.loadConfigFromFile();
|
|
303
|
+
// Add new wallet
|
|
304
|
+
fileConfig.wallets[normalizedName] = config;
|
|
305
|
+
// Save config
|
|
306
|
+
this.saveConfigToFile(fileConfig);
|
|
307
|
+
// Register in memory
|
|
308
|
+
this.wallets.set(normalizedName, backend);
|
|
309
|
+
console.log(`[WalletManager] Added wallet "${nickname}"`);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Rename a wallet
|
|
313
|
+
*/
|
|
314
|
+
async renameWallet(currentNickname, newNickname) {
|
|
315
|
+
await this.initialize();
|
|
316
|
+
const currentName = currentNickname.toLowerCase();
|
|
317
|
+
const newName = newNickname.toLowerCase();
|
|
318
|
+
// Check source exists
|
|
319
|
+
if (!this.wallets.has(currentName)) {
|
|
320
|
+
throw new Error(`Wallet "${currentNickname}" not found`);
|
|
321
|
+
}
|
|
322
|
+
// Check target doesn't exist
|
|
323
|
+
if (this.wallets.has(newName)) {
|
|
324
|
+
throw new Error(`Wallet "${newNickname}" already exists`);
|
|
325
|
+
}
|
|
326
|
+
// Load config
|
|
327
|
+
const fileConfig = this.loadConfigFromFile();
|
|
328
|
+
// Move wallet config
|
|
329
|
+
if (fileConfig.wallets[currentName]) {
|
|
330
|
+
fileConfig.wallets[newName] = fileConfig.wallets[currentName];
|
|
331
|
+
delete fileConfig.wallets[currentName];
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
// Wallet was auto-discovered, need to add it to config
|
|
335
|
+
const backend = this.wallets.get(currentName);
|
|
336
|
+
const config = await this.backendToConfig(backend);
|
|
337
|
+
fileConfig.wallets[newName] = config;
|
|
338
|
+
}
|
|
339
|
+
// Update default if needed
|
|
340
|
+
if (fileConfig.default === currentName) {
|
|
341
|
+
fileConfig.default = newName;
|
|
342
|
+
}
|
|
343
|
+
if (this.defaultWallet === currentName) {
|
|
344
|
+
this.defaultWallet = newName;
|
|
345
|
+
}
|
|
346
|
+
// Save config
|
|
347
|
+
this.saveConfigToFile(fileConfig);
|
|
348
|
+
// Update in-memory
|
|
349
|
+
const backend = this.wallets.get(currentName);
|
|
350
|
+
this.wallets.delete(currentName);
|
|
351
|
+
this.wallets.set(newName, backend);
|
|
352
|
+
console.log(`[WalletManager] Renamed wallet "${currentNickname}" to "${newNickname}"`);
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Remove a wallet from config
|
|
356
|
+
*/
|
|
357
|
+
async removeWallet(nickname) {
|
|
358
|
+
await this.initialize();
|
|
359
|
+
const name = nickname.toLowerCase();
|
|
360
|
+
if (!this.wallets.has(name)) {
|
|
361
|
+
throw new Error(`Wallet "${nickname}" not found`);
|
|
362
|
+
}
|
|
363
|
+
// Load config
|
|
364
|
+
const fileConfig = this.loadConfigFromFile();
|
|
365
|
+
// Remove from config
|
|
366
|
+
delete fileConfig.wallets[name];
|
|
367
|
+
// Update default if needed
|
|
368
|
+
if (fileConfig.default === name) {
|
|
369
|
+
delete fileConfig.default;
|
|
370
|
+
}
|
|
371
|
+
if (this.defaultWallet === name) {
|
|
372
|
+
this.defaultWallet = null;
|
|
373
|
+
this.determineDefault();
|
|
374
|
+
}
|
|
375
|
+
// Save config
|
|
376
|
+
this.saveConfigToFile(fileConfig);
|
|
377
|
+
// Remove from memory
|
|
378
|
+
this.wallets.delete(name);
|
|
379
|
+
console.log(`[WalletManager] Removed wallet "${nickname}"`);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Set the default wallet
|
|
383
|
+
*/
|
|
384
|
+
async setDefaultWallet(nickname) {
|
|
385
|
+
await this.initialize();
|
|
386
|
+
const name = nickname.toLowerCase();
|
|
387
|
+
if (!this.wallets.has(name)) {
|
|
388
|
+
throw new Error(`Wallet "${nickname}" not found`);
|
|
389
|
+
}
|
|
390
|
+
// Load config
|
|
391
|
+
const fileConfig = this.loadConfigFromFile();
|
|
392
|
+
// Update default
|
|
393
|
+
fileConfig.default = name;
|
|
394
|
+
this.defaultWallet = name;
|
|
395
|
+
// Save config
|
|
396
|
+
this.saveConfigToFile(fileConfig);
|
|
397
|
+
console.log(`[WalletManager] Set default wallet to "${nickname}"`);
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Load config from file (creates empty if doesn't exist)
|
|
401
|
+
*/
|
|
402
|
+
loadConfigFromFile() {
|
|
403
|
+
if (!existsSync(CONFIG_PATH)) {
|
|
404
|
+
return { wallets: {} };
|
|
405
|
+
}
|
|
406
|
+
try {
|
|
407
|
+
const content = readFileSync(CONFIG_PATH, 'utf-8');
|
|
408
|
+
return JSON.parse(content);
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
return { wallets: {} };
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Save config to file
|
|
416
|
+
*/
|
|
417
|
+
saveConfigToFile(config) {
|
|
418
|
+
// Ensure directory exists
|
|
419
|
+
const dir = dirname(CONFIG_PATH);
|
|
420
|
+
if (!existsSync(dir)) {
|
|
421
|
+
mkdirSync(dir, { recursive: true });
|
|
422
|
+
}
|
|
423
|
+
writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
424
|
+
console.log(`[WalletManager] Config saved to ${CONFIG_PATH}`);
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Convert a backend to config (for saving auto-discovered wallets)
|
|
428
|
+
*/
|
|
429
|
+
async backendToConfig(backend) {
|
|
430
|
+
const config = {
|
|
431
|
+
source: backend.type,
|
|
432
|
+
chains: [...backend.supportedChains],
|
|
433
|
+
};
|
|
434
|
+
// For evm-wallet-skill, just reference the default path
|
|
435
|
+
if (backend.type === 'evm-wallet-skill') {
|
|
436
|
+
config.path = EVM_WALLET_PATH;
|
|
437
|
+
}
|
|
438
|
+
// For env backends, we need address (privateKey should NOT be saved)
|
|
439
|
+
if (backend.type === 'env') {
|
|
440
|
+
config.address = await backend.getAddress();
|
|
441
|
+
// Note: We don't save privateKey to config for security
|
|
442
|
+
}
|
|
443
|
+
// For bankr, we need the API key
|
|
444
|
+
if (backend.type === 'bankr') {
|
|
445
|
+
config.apiKey = process.env.BANKR_API_KEY;
|
|
446
|
+
}
|
|
447
|
+
return config;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Reset the manager (for testing)
|
|
451
|
+
*/
|
|
452
|
+
reset() {
|
|
453
|
+
this.wallets.clear();
|
|
454
|
+
this.defaultWallet = null;
|
|
455
|
+
this.initialized = false;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Get the singleton WalletManager instance
|
|
460
|
+
*/
|
|
461
|
+
export function getWalletManager() {
|
|
462
|
+
if (!instance) {
|
|
463
|
+
instance = new WalletManager();
|
|
464
|
+
}
|
|
465
|
+
return instance;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Reset the singleton (for testing)
|
|
469
|
+
*/
|
|
470
|
+
export function resetWalletManager() {
|
|
471
|
+
if (instance) {
|
|
472
|
+
instance.reset();
|
|
473
|
+
instance = null;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=walletManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walletManager.js","sourceRoot":"","sources":["../../src/wallet/walletManager.ts"],"names":[],"mappings":"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"}
|