@aibtc/mcp-server 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 +340 -0
- package/dist/api.d.ts +9 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +79 -0
- package/dist/api.js.map +1 -0
- package/dist/config/contracts.d.ts +169 -0
- package/dist/config/contracts.d.ts.map +1 -0
- package/dist/config/contracts.js +250 -0
- package/dist/config/contracts.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/networks.d.ts +11 -0
- package/dist/config/networks.d.ts.map +1 -0
- package/dist/config/networks.js +21 -0
- package/dist/config/networks.js.map +1 -0
- package/dist/endpoints/index.d.ts +2 -0
- package/dist/endpoints/index.d.ts.map +1 -0
- package/dist/endpoints/index.js +2 -0
- package/dist/endpoints/index.js.map +1 -0
- package/dist/endpoints/registry.d.ts +38 -0
- package/dist/endpoints/registry.d.ts.map +1 -0
- package/dist/endpoints/registry.js +935 -0
- package/dist/endpoints/registry.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/services/bitflow.service.d.ts +159 -0
- package/dist/services/bitflow.service.d.ts.map +1 -0
- package/dist/services/bitflow.service.js +325 -0
- package/dist/services/bitflow.service.js.map +1 -0
- package/dist/services/bns.service.d.ts +87 -0
- package/dist/services/bns.service.d.ts.map +1 -0
- package/dist/services/bns.service.js +312 -0
- package/dist/services/bns.service.js.map +1 -0
- package/dist/services/defi.service.d.ts +146 -0
- package/dist/services/defi.service.d.ts.map +1 -0
- package/dist/services/defi.service.js +461 -0
- package/dist/services/defi.service.js.map +1 -0
- package/dist/services/hiro-api.d.ts +438 -0
- package/dist/services/hiro-api.d.ts.map +1 -0
- package/dist/services/hiro-api.js +376 -0
- package/dist/services/hiro-api.js.map +1 -0
- package/dist/services/nft.service.d.ts +70 -0
- package/dist/services/nft.service.d.ts.map +1 -0
- package/dist/services/nft.service.js +148 -0
- package/dist/services/nft.service.js.map +1 -0
- package/dist/services/sbtc.service.d.ts +44 -0
- package/dist/services/sbtc.service.d.ts.map +1 -0
- package/dist/services/sbtc.service.js +100 -0
- package/dist/services/sbtc.service.js.map +1 -0
- package/dist/services/scaffold.service.d.ts +41 -0
- package/dist/services/scaffold.service.d.ts.map +1 -0
- package/dist/services/scaffold.service.js +1055 -0
- package/dist/services/scaffold.service.js.map +1 -0
- package/dist/services/stacking.service.d.ts +58 -0
- package/dist/services/stacking.service.d.ts.map +1 -0
- package/dist/services/stacking.service.js +153 -0
- package/dist/services/stacking.service.js.map +1 -0
- package/dist/services/tokens.service.d.ts +62 -0
- package/dist/services/tokens.service.d.ts.map +1 -0
- package/dist/services/tokens.service.js +119 -0
- package/dist/services/tokens.service.js.map +1 -0
- package/dist/services/wallet-manager.d.ts +107 -0
- package/dist/services/wallet-manager.d.ts.map +1 -0
- package/dist/services/wallet-manager.js +389 -0
- package/dist/services/wallet-manager.js.map +1 -0
- package/dist/services/x402.service.d.ts +26 -0
- package/dist/services/x402.service.d.ts.map +1 -0
- package/dist/services/x402.service.js +125 -0
- package/dist/services/x402.service.js.map +1 -0
- package/dist/tools/bitflow.tools.d.ts +3 -0
- package/dist/tools/bitflow.tools.d.ts.map +1 -0
- package/dist/tools/bitflow.tools.js +501 -0
- package/dist/tools/bitflow.tools.js.map +1 -0
- package/dist/tools/bns.tools.d.ts +3 -0
- package/dist/tools/bns.tools.d.ts.map +1 -0
- package/dist/tools/bns.tools.js +164 -0
- package/dist/tools/bns.tools.js.map +1 -0
- package/dist/tools/contract.tools.d.ts +3 -0
- package/dist/tools/contract.tools.d.ts.map +1 -0
- package/dist/tools/contract.tools.js +126 -0
- package/dist/tools/contract.tools.js.map +1 -0
- package/dist/tools/defi.tools.d.ts +3 -0
- package/dist/tools/defi.tools.d.ts.map +1 -0
- package/dist/tools/defi.tools.js +425 -0
- package/dist/tools/defi.tools.js.map +1 -0
- package/dist/tools/endpoint.tools.d.ts +3 -0
- package/dist/tools/endpoint.tools.d.ts.map +1 -0
- package/dist/tools/endpoint.tools.js +157 -0
- package/dist/tools/endpoint.tools.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/nft.tools.d.ts +3 -0
- package/dist/tools/nft.tools.d.ts.map +1 -0
- package/dist/tools/nft.tools.js +154 -0
- package/dist/tools/nft.tools.js.map +1 -0
- package/dist/tools/openrouter.tools.d.ts +3 -0
- package/dist/tools/openrouter.tools.d.ts.map +1 -0
- package/dist/tools/openrouter.tools.js +664 -0
- package/dist/tools/openrouter.tools.js.map +1 -0
- package/dist/tools/query.tools.d.ts +3 -0
- package/dist/tools/query.tools.d.ts.map +1 -0
- package/dist/tools/query.tools.js +209 -0
- package/dist/tools/query.tools.js.map +1 -0
- package/dist/tools/sbtc.tools.d.ts +3 -0
- package/dist/tools/sbtc.tools.d.ts.map +1 -0
- package/dist/tools/sbtc.tools.js +103 -0
- package/dist/tools/sbtc.tools.js.map +1 -0
- package/dist/tools/scaffold.tools.d.ts +3 -0
- package/dist/tools/scaffold.tools.d.ts.map +1 -0
- package/dist/tools/scaffold.tools.js +216 -0
- package/dist/tools/scaffold.tools.js.map +1 -0
- package/dist/tools/stacking.tools.d.ts +3 -0
- package/dist/tools/stacking.tools.d.ts.map +1 -0
- package/dist/tools/stacking.tools.js +112 -0
- package/dist/tools/stacking.tools.js.map +1 -0
- package/dist/tools/tokens.tools.d.ts +3 -0
- package/dist/tools/tokens.tools.d.ts.map +1 -0
- package/dist/tools/tokens.tools.js +154 -0
- package/dist/tools/tokens.tools.js.map +1 -0
- package/dist/tools/transfer.tools.d.ts +3 -0
- package/dist/tools/transfer.tools.d.ts.map +1 -0
- package/dist/tools/transfer.tools.js +62 -0
- package/dist/tools/transfer.tools.js.map +1 -0
- package/dist/tools/wallet-management.tools.d.ts +6 -0
- package/dist/tools/wallet-management.tools.d.ts.map +1 -0
- package/dist/tools/wallet-management.tools.js +390 -0
- package/dist/tools/wallet-management.tools.js.map +1 -0
- package/dist/tools/wallet.tools.d.ts +3 -0
- package/dist/tools/wallet.tools.d.ts.map +1 -0
- package/dist/tools/wallet.tools.js +105 -0
- package/dist/tools/wallet.tools.js.map +1 -0
- package/dist/transactions/builder.d.ts +56 -0
- package/dist/transactions/builder.d.ts.map +1 -0
- package/dist/transactions/builder.js +134 -0
- package/dist/transactions/builder.js.map +1 -0
- package/dist/transactions/clarity-values.d.ts +67 -0
- package/dist/transactions/clarity-values.d.ts.map +1 -0
- package/dist/transactions/clarity-values.js +169 -0
- package/dist/transactions/clarity-values.js.map +1 -0
- package/dist/transactions/post-conditions.d.ts +27 -0
- package/dist/transactions/post-conditions.d.ts.map +1 -0
- package/dist/transactions/post-conditions.js +101 -0
- package/dist/transactions/post-conditions.js.map +1 -0
- package/dist/utils/encryption.d.ts +33 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +110 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/errors.d.ts +84 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +132 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatting.d.ts +51 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +114 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/storage.d.ts +90 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +196 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/validation.d.ts +67 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +74 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/wallet.d.ts +86 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +279 -0
- package/dist/wallet.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { generateWallet, getStxAddress } from "@stacks/wallet-sdk";
|
|
2
|
+
import { validateMnemonic, generateMnemonic } from "@scure/bip39";
|
|
3
|
+
import { wordlist } from "@scure/bip39/wordlists/english.js";
|
|
4
|
+
import { encrypt, decrypt, generateWalletId, initializeStorage, readWalletIndex, readKeystore, writeKeystore, readAppConfig, writeAppConfig, addWalletToIndex, removeWalletFromIndex, deleteWalletStorage, updateWalletMetadata, } from "../utils/index.js";
|
|
5
|
+
import { WalletNotFoundError, InvalidPasswordError, InvalidMnemonicError, } from "../utils/errors.js";
|
|
6
|
+
import { NETWORK } from "../config/networks.js";
|
|
7
|
+
/**
|
|
8
|
+
* Wallet manager singleton - handles wallet creation, encryption, and session management
|
|
9
|
+
*/
|
|
10
|
+
class WalletManager {
|
|
11
|
+
static instance;
|
|
12
|
+
session = null;
|
|
13
|
+
lockTimer = null;
|
|
14
|
+
initialized = false;
|
|
15
|
+
constructor() { }
|
|
16
|
+
/**
|
|
17
|
+
* Get singleton instance
|
|
18
|
+
*/
|
|
19
|
+
static getInstance() {
|
|
20
|
+
if (!WalletManager.instance) {
|
|
21
|
+
WalletManager.instance = new WalletManager();
|
|
22
|
+
}
|
|
23
|
+
return WalletManager.instance;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Ensure storage is initialized
|
|
27
|
+
*/
|
|
28
|
+
async ensureInitialized() {
|
|
29
|
+
if (!this.initialized) {
|
|
30
|
+
await initializeStorage();
|
|
31
|
+
this.initialized = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a new wallet with BIP39 mnemonic
|
|
36
|
+
*/
|
|
37
|
+
async createWallet(name, password, network) {
|
|
38
|
+
await this.ensureInitialized();
|
|
39
|
+
const walletNetwork = network || NETWORK;
|
|
40
|
+
// Generate 24-word mnemonic
|
|
41
|
+
const mnemonic = generateMnemonic(wordlist, 256);
|
|
42
|
+
// Generate wallet from mnemonic
|
|
43
|
+
const wallet = await generateWallet({
|
|
44
|
+
secretKey: mnemonic,
|
|
45
|
+
password: "",
|
|
46
|
+
});
|
|
47
|
+
const stacksAccount = wallet.accounts[0];
|
|
48
|
+
const address = getStxAddress(stacksAccount, walletNetwork);
|
|
49
|
+
// Encrypt mnemonic
|
|
50
|
+
const encrypted = await encrypt(mnemonic, password);
|
|
51
|
+
// Generate wallet ID
|
|
52
|
+
const walletId = generateWalletId();
|
|
53
|
+
// Create keystore
|
|
54
|
+
const keystore = {
|
|
55
|
+
version: 1,
|
|
56
|
+
encrypted,
|
|
57
|
+
addressIndex: 0,
|
|
58
|
+
};
|
|
59
|
+
// Save keystore
|
|
60
|
+
await writeKeystore(walletId, keystore);
|
|
61
|
+
// Add to index
|
|
62
|
+
const metadata = {
|
|
63
|
+
id: walletId,
|
|
64
|
+
name,
|
|
65
|
+
address,
|
|
66
|
+
network: walletNetwork,
|
|
67
|
+
createdAt: new Date().toISOString(),
|
|
68
|
+
};
|
|
69
|
+
await addWalletToIndex(metadata);
|
|
70
|
+
// Set as active wallet
|
|
71
|
+
const config = await readAppConfig();
|
|
72
|
+
config.activeWalletId = walletId;
|
|
73
|
+
await writeAppConfig(config);
|
|
74
|
+
return {
|
|
75
|
+
walletId,
|
|
76
|
+
address,
|
|
77
|
+
mnemonic, // Only returned once
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Import an existing wallet from mnemonic
|
|
82
|
+
*/
|
|
83
|
+
async importWallet(name, mnemonic, password, network) {
|
|
84
|
+
await this.ensureInitialized();
|
|
85
|
+
// Validate mnemonic
|
|
86
|
+
const normalizedMnemonic = mnemonic.trim().toLowerCase();
|
|
87
|
+
if (!validateMnemonic(normalizedMnemonic, wordlist)) {
|
|
88
|
+
throw new InvalidMnemonicError();
|
|
89
|
+
}
|
|
90
|
+
const walletNetwork = network || NETWORK;
|
|
91
|
+
// Generate wallet from mnemonic to get address
|
|
92
|
+
const wallet = await generateWallet({
|
|
93
|
+
secretKey: normalizedMnemonic,
|
|
94
|
+
password: "",
|
|
95
|
+
});
|
|
96
|
+
const stacksAccount = wallet.accounts[0];
|
|
97
|
+
const address = getStxAddress(stacksAccount, walletNetwork);
|
|
98
|
+
// Encrypt mnemonic
|
|
99
|
+
const encrypted = await encrypt(normalizedMnemonic, password);
|
|
100
|
+
// Generate wallet ID
|
|
101
|
+
const walletId = generateWalletId();
|
|
102
|
+
// Create keystore
|
|
103
|
+
const keystore = {
|
|
104
|
+
version: 1,
|
|
105
|
+
encrypted,
|
|
106
|
+
addressIndex: 0,
|
|
107
|
+
};
|
|
108
|
+
// Save keystore
|
|
109
|
+
await writeKeystore(walletId, keystore);
|
|
110
|
+
// Add to index
|
|
111
|
+
const metadata = {
|
|
112
|
+
id: walletId,
|
|
113
|
+
name,
|
|
114
|
+
address,
|
|
115
|
+
network: walletNetwork,
|
|
116
|
+
createdAt: new Date().toISOString(),
|
|
117
|
+
};
|
|
118
|
+
await addWalletToIndex(metadata);
|
|
119
|
+
// Set as active wallet
|
|
120
|
+
const config = await readAppConfig();
|
|
121
|
+
config.activeWalletId = walletId;
|
|
122
|
+
await writeAppConfig(config);
|
|
123
|
+
return {
|
|
124
|
+
walletId,
|
|
125
|
+
address,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Unlock a wallet for use
|
|
130
|
+
*/
|
|
131
|
+
async unlock(walletId, password) {
|
|
132
|
+
await this.ensureInitialized();
|
|
133
|
+
// Get wallet metadata
|
|
134
|
+
const index = await readWalletIndex();
|
|
135
|
+
const walletMeta = index.wallets.find((w) => w.id === walletId);
|
|
136
|
+
if (!walletMeta) {
|
|
137
|
+
throw new WalletNotFoundError(walletId);
|
|
138
|
+
}
|
|
139
|
+
// Read keystore
|
|
140
|
+
let keystore;
|
|
141
|
+
try {
|
|
142
|
+
keystore = await readKeystore(walletId);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
throw new WalletNotFoundError(walletId);
|
|
146
|
+
}
|
|
147
|
+
// Decrypt mnemonic
|
|
148
|
+
let mnemonic;
|
|
149
|
+
try {
|
|
150
|
+
mnemonic = await decrypt(keystore.encrypted, password);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
throw new InvalidPasswordError();
|
|
154
|
+
}
|
|
155
|
+
// Generate account from mnemonic
|
|
156
|
+
const wallet = await generateWallet({
|
|
157
|
+
secretKey: mnemonic,
|
|
158
|
+
password: "",
|
|
159
|
+
});
|
|
160
|
+
const stacksAccount = wallet.accounts[0];
|
|
161
|
+
const address = getStxAddress(stacksAccount, walletMeta.network);
|
|
162
|
+
const account = {
|
|
163
|
+
address,
|
|
164
|
+
privateKey: stacksAccount.stxPrivateKey,
|
|
165
|
+
network: walletMeta.network,
|
|
166
|
+
};
|
|
167
|
+
// Update last used timestamp
|
|
168
|
+
await updateWalletMetadata(walletId, {
|
|
169
|
+
lastUsed: new Date().toISOString(),
|
|
170
|
+
});
|
|
171
|
+
// Get auto-lock timeout
|
|
172
|
+
const config = await readAppConfig();
|
|
173
|
+
// Create session
|
|
174
|
+
const now = new Date();
|
|
175
|
+
this.session = {
|
|
176
|
+
walletId,
|
|
177
|
+
account,
|
|
178
|
+
unlockedAt: now,
|
|
179
|
+
expiresAt: config.autoLockTimeout > 0
|
|
180
|
+
? new Date(now.getTime() + config.autoLockTimeout * 60 * 1000)
|
|
181
|
+
: null,
|
|
182
|
+
};
|
|
183
|
+
// Start auto-lock timer
|
|
184
|
+
this.startAutoLockTimer(config.autoLockTimeout);
|
|
185
|
+
// Update active wallet
|
|
186
|
+
config.activeWalletId = walletId;
|
|
187
|
+
await writeAppConfig(config);
|
|
188
|
+
return account;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Lock the wallet (clear session)
|
|
192
|
+
*/
|
|
193
|
+
lock() {
|
|
194
|
+
this.clearAutoLockTimer();
|
|
195
|
+
this.session = null;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get the active account if unlocked
|
|
199
|
+
*/
|
|
200
|
+
getActiveAccount() {
|
|
201
|
+
if (!this.session) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
// Check if session expired
|
|
205
|
+
if (this.session.expiresAt && new Date() > this.session.expiresAt) {
|
|
206
|
+
this.lock();
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
return this.session.account;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Check if a wallet is unlocked
|
|
213
|
+
*/
|
|
214
|
+
isUnlocked() {
|
|
215
|
+
return this.getActiveAccount() !== null;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get session info (without sensitive data)
|
|
219
|
+
*/
|
|
220
|
+
getSessionInfo() {
|
|
221
|
+
if (!this.session) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
// Check expiry
|
|
225
|
+
if (this.session.expiresAt && new Date() > this.session.expiresAt) {
|
|
226
|
+
this.lock();
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
walletId: this.session.walletId,
|
|
231
|
+
address: this.session.account.address,
|
|
232
|
+
expiresAt: this.session.expiresAt,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* List all wallets (metadata only)
|
|
237
|
+
*/
|
|
238
|
+
async listWallets() {
|
|
239
|
+
await this.ensureInitialized();
|
|
240
|
+
const index = await readWalletIndex();
|
|
241
|
+
return index.wallets;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Check if any wallets exist
|
|
245
|
+
*/
|
|
246
|
+
async hasWallets() {
|
|
247
|
+
await this.ensureInitialized();
|
|
248
|
+
const index = await readWalletIndex();
|
|
249
|
+
return index.wallets.length > 0;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get active wallet ID from config
|
|
253
|
+
*/
|
|
254
|
+
async getActiveWalletId() {
|
|
255
|
+
await this.ensureInitialized();
|
|
256
|
+
const config = await readAppConfig();
|
|
257
|
+
return config.activeWalletId;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Switch active wallet (note: requires unlock after switching)
|
|
261
|
+
*/
|
|
262
|
+
async switchWallet(walletId) {
|
|
263
|
+
await this.ensureInitialized();
|
|
264
|
+
// Verify wallet exists
|
|
265
|
+
const index = await readWalletIndex();
|
|
266
|
+
const walletMeta = index.wallets.find((w) => w.id === walletId);
|
|
267
|
+
if (!walletMeta) {
|
|
268
|
+
throw new WalletNotFoundError(walletId);
|
|
269
|
+
}
|
|
270
|
+
// Lock current session
|
|
271
|
+
this.lock();
|
|
272
|
+
// Update active wallet
|
|
273
|
+
const config = await readAppConfig();
|
|
274
|
+
config.activeWalletId = walletId;
|
|
275
|
+
await writeAppConfig(config);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Delete a wallet (requires password confirmation)
|
|
279
|
+
*/
|
|
280
|
+
async deleteWallet(walletId, password) {
|
|
281
|
+
await this.ensureInitialized();
|
|
282
|
+
// Verify wallet exists
|
|
283
|
+
const index = await readWalletIndex();
|
|
284
|
+
const walletMeta = index.wallets.find((w) => w.id === walletId);
|
|
285
|
+
if (!walletMeta) {
|
|
286
|
+
throw new WalletNotFoundError(walletId);
|
|
287
|
+
}
|
|
288
|
+
// Verify password by attempting to decrypt
|
|
289
|
+
let keystore;
|
|
290
|
+
try {
|
|
291
|
+
keystore = await readKeystore(walletId);
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
throw new WalletNotFoundError(walletId);
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
await decrypt(keystore.encrypted, password);
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
throw new InvalidPasswordError();
|
|
301
|
+
}
|
|
302
|
+
// If this wallet is currently active, lock it
|
|
303
|
+
if (this.session?.walletId === walletId) {
|
|
304
|
+
this.lock();
|
|
305
|
+
}
|
|
306
|
+
// Delete wallet storage
|
|
307
|
+
await deleteWalletStorage(walletId);
|
|
308
|
+
// Remove from index
|
|
309
|
+
await removeWalletFromIndex(walletId);
|
|
310
|
+
// Update active wallet if needed
|
|
311
|
+
const config = await readAppConfig();
|
|
312
|
+
if (config.activeWalletId === walletId) {
|
|
313
|
+
const remainingWallets = (await readWalletIndex()).wallets;
|
|
314
|
+
config.activeWalletId =
|
|
315
|
+
remainingWallets.length > 0 ? remainingWallets[0].id : null;
|
|
316
|
+
await writeAppConfig(config);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Export mnemonic (requires password verification)
|
|
321
|
+
*/
|
|
322
|
+
async exportMnemonic(walletId, password) {
|
|
323
|
+
await this.ensureInitialized();
|
|
324
|
+
// Verify wallet exists
|
|
325
|
+
const index = await readWalletIndex();
|
|
326
|
+
const walletMeta = index.wallets.find((w) => w.id === walletId);
|
|
327
|
+
if (!walletMeta) {
|
|
328
|
+
throw new WalletNotFoundError(walletId);
|
|
329
|
+
}
|
|
330
|
+
// Read keystore
|
|
331
|
+
let keystore;
|
|
332
|
+
try {
|
|
333
|
+
keystore = await readKeystore(walletId);
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
throw new WalletNotFoundError(walletId);
|
|
337
|
+
}
|
|
338
|
+
// Decrypt and return mnemonic
|
|
339
|
+
try {
|
|
340
|
+
return await decrypt(keystore.encrypted, password);
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
throw new InvalidPasswordError();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Set auto-lock timeout
|
|
348
|
+
*/
|
|
349
|
+
async setAutoLockTimeout(minutes) {
|
|
350
|
+
await this.ensureInitialized();
|
|
351
|
+
const config = await readAppConfig();
|
|
352
|
+
config.autoLockTimeout = minutes;
|
|
353
|
+
await writeAppConfig(config);
|
|
354
|
+
// Update current session expiry if unlocked
|
|
355
|
+
if (this.session) {
|
|
356
|
+
this.session.expiresAt =
|
|
357
|
+
minutes > 0
|
|
358
|
+
? new Date(Date.now() + minutes * 60 * 1000)
|
|
359
|
+
: null;
|
|
360
|
+
this.startAutoLockTimer(minutes);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Start auto-lock timer
|
|
365
|
+
*/
|
|
366
|
+
startAutoLockTimer(minutes) {
|
|
367
|
+
this.clearAutoLockTimer();
|
|
368
|
+
if (minutes <= 0) {
|
|
369
|
+
return; // No auto-lock
|
|
370
|
+
}
|
|
371
|
+
this.lockTimer = setTimeout(() => {
|
|
372
|
+
this.lock();
|
|
373
|
+
}, minutes * 60 * 1000);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Clear auto-lock timer
|
|
377
|
+
*/
|
|
378
|
+
clearAutoLockTimer() {
|
|
379
|
+
if (this.lockTimer) {
|
|
380
|
+
clearTimeout(this.lockTimer);
|
|
381
|
+
this.lockTimer = null;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// Export singleton getter
|
|
386
|
+
export function getWalletManager() {
|
|
387
|
+
return WalletManager.getInstance();
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=wallet-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-manager.js","sourceRoot":"","sources":["../../src/services/wallet-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
import { type AxiosInstance } from "axios";
|
|
3
|
+
import { NETWORK, API_URL, type Network } from "../config/networks.js";
|
|
4
|
+
import type { Account } from "../transactions/builder.js";
|
|
5
|
+
/**
|
|
6
|
+
* Convert mnemonic to account
|
|
7
|
+
*/
|
|
8
|
+
export declare function mnemonicToAccount(mnemonic: string, network: Network): Promise<Account>;
|
|
9
|
+
/**
|
|
10
|
+
* Create an API client with x402 payment interceptor
|
|
11
|
+
*/
|
|
12
|
+
export declare function createApiClient(baseUrl?: string): Promise<AxiosInstance>;
|
|
13
|
+
/**
|
|
14
|
+
* Get wallet address - checks managed wallet first, then env mnemonic
|
|
15
|
+
*/
|
|
16
|
+
export declare function getWalletAddress(): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Get account - checks managed wallet first, then env mnemonic
|
|
19
|
+
*/
|
|
20
|
+
export declare function getAccount(): Promise<Account>;
|
|
21
|
+
/**
|
|
22
|
+
* Clear the client cache (useful for testing)
|
|
23
|
+
*/
|
|
24
|
+
export declare function clearClientCache(): void;
|
|
25
|
+
export { NETWORK, API_URL };
|
|
26
|
+
//# sourceMappingURL=x402.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.service.d.ts","sourceRoot":"","sources":["../../src/services/x402.service.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGlD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAM1D;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA4D9E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAmBxD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAkBnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
import { withPaymentInterceptor } from "x402-stacks";
|
|
4
|
+
import { generateWallet, getStxAddress } from "@stacks/wallet-sdk";
|
|
5
|
+
import { NETWORK, API_URL } from "../config/networks.js";
|
|
6
|
+
import { getWalletManager } from "./wallet-manager.js";
|
|
7
|
+
// Cache clients by base URL
|
|
8
|
+
const clientCache = new Map();
|
|
9
|
+
/**
|
|
10
|
+
* Convert mnemonic to account
|
|
11
|
+
*/
|
|
12
|
+
export async function mnemonicToAccount(mnemonic, network) {
|
|
13
|
+
const wallet = await generateWallet({
|
|
14
|
+
secretKey: mnemonic,
|
|
15
|
+
password: "",
|
|
16
|
+
});
|
|
17
|
+
const account = wallet.accounts[0];
|
|
18
|
+
const address = getStxAddress(account, network);
|
|
19
|
+
return {
|
|
20
|
+
address,
|
|
21
|
+
privateKey: account.stxPrivateKey,
|
|
22
|
+
network,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create an API client with x402 payment interceptor
|
|
27
|
+
*/
|
|
28
|
+
export async function createApiClient(baseUrl) {
|
|
29
|
+
const url = baseUrl || API_URL;
|
|
30
|
+
// Check cache
|
|
31
|
+
const cached = clientCache.get(url);
|
|
32
|
+
if (cached) {
|
|
33
|
+
return cached;
|
|
34
|
+
}
|
|
35
|
+
// Get account (from managed wallet or env mnemonic)
|
|
36
|
+
const account = await getAccount();
|
|
37
|
+
const axiosInstance = axios.create({
|
|
38
|
+
baseURL: url,
|
|
39
|
+
timeout: 60000,
|
|
40
|
+
transformResponse: [
|
|
41
|
+
(data) => {
|
|
42
|
+
if (typeof data !== "string") {
|
|
43
|
+
return data;
|
|
44
|
+
}
|
|
45
|
+
const trimmed = data.trim();
|
|
46
|
+
if (!trimmed) {
|
|
47
|
+
return data;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
return JSON.parse(trimmed);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return data;
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
});
|
|
58
|
+
// Ensure 402 payloads are parsed before x402-stacks validates them
|
|
59
|
+
axiosInstance.interceptors.response.use((response) => response, (error) => {
|
|
60
|
+
const data = error?.response?.data;
|
|
61
|
+
if (error?.response?.status === 402) {
|
|
62
|
+
console.error("x402 debug 402 payload", typeof data === "string" ? data : JSON.stringify(data));
|
|
63
|
+
}
|
|
64
|
+
if (typeof data === "string") {
|
|
65
|
+
const trimmed = data.trim();
|
|
66
|
+
if (trimmed) {
|
|
67
|
+
try {
|
|
68
|
+
error.response.data = JSON.parse(trimmed);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Leave as-is if it's not JSON
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return Promise.reject(error);
|
|
76
|
+
});
|
|
77
|
+
const client = withPaymentInterceptor(axiosInstance, account);
|
|
78
|
+
clientCache.set(url, client);
|
|
79
|
+
return client;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get wallet address - checks managed wallet first, then env mnemonic
|
|
83
|
+
*/
|
|
84
|
+
export async function getWalletAddress() {
|
|
85
|
+
// Check managed wallet session first
|
|
86
|
+
const walletManager = getWalletManager();
|
|
87
|
+
const sessionAccount = walletManager.getActiveAccount();
|
|
88
|
+
if (sessionAccount) {
|
|
89
|
+
return sessionAccount.address;
|
|
90
|
+
}
|
|
91
|
+
// Fall back to environment mnemonic
|
|
92
|
+
const mnemonic = process.env.CLIENT_MNEMONIC || "";
|
|
93
|
+
if (!mnemonic) {
|
|
94
|
+
throw new Error("No wallet available. Either unlock a managed wallet (wallet_unlock) " +
|
|
95
|
+
"or set CLIENT_MNEMONIC environment variable.");
|
|
96
|
+
}
|
|
97
|
+
const account = await mnemonicToAccount(mnemonic, NETWORK);
|
|
98
|
+
return account.address;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get account - checks managed wallet first, then env mnemonic
|
|
102
|
+
*/
|
|
103
|
+
export async function getAccount() {
|
|
104
|
+
// Check managed wallet session first
|
|
105
|
+
const walletManager = getWalletManager();
|
|
106
|
+
const sessionAccount = walletManager.getActiveAccount();
|
|
107
|
+
if (sessionAccount) {
|
|
108
|
+
return sessionAccount;
|
|
109
|
+
}
|
|
110
|
+
// Fall back to environment mnemonic
|
|
111
|
+
const mnemonic = process.env.CLIENT_MNEMONIC || "";
|
|
112
|
+
if (!mnemonic) {
|
|
113
|
+
throw new Error("No wallet available. Either unlock a managed wallet (wallet_unlock) " +
|
|
114
|
+
"or set CLIENT_MNEMONIC environment variable.");
|
|
115
|
+
}
|
|
116
|
+
return mnemonicToAccount(mnemonic, NETWORK);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Clear the client cache (useful for testing)
|
|
120
|
+
*/
|
|
121
|
+
export function clearClientCache() {
|
|
122
|
+
clientCache.clear();
|
|
123
|
+
}
|
|
124
|
+
export { NETWORK, API_URL };
|
|
125
|
+
//# sourceMappingURL=x402.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.service.js","sourceRoot":"","sources":["../../src/services/x402.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitflow.tools.d.ts","sourceRoot":"","sources":["../../src/tools/bitflow.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8kB5D"}
|