@moonpay/cli 0.6.15 → 0.6.17
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/dist/chunk-77AT5BZQ.js +25 -0
- package/dist/chunk-WLQU5BOQ.js +3 -0
- package/dist/index.js +15 -405
- package/dist/mcp-L2RILWER.js +2 -0
- package/dist/store-XV77WYWO.js +2 -0
- package/package.json +1 -1
- package/skills/moonpay-buy-crypto/SKILL.md +4 -3
- package/dist/chunk-7KJP7F5Q.js +0 -7866
- package/dist/chunk-7KJP7F5Q.js.map +0 -1
- package/dist/chunk-ZYYH3VNA.js +0 -511
- package/dist/chunk-ZYYH3VNA.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/mcp-7EFPAPL5.js +0 -128
- package/dist/mcp-7EFPAPL5.js.map +0 -1
- package/dist/store-6OIOBMHW.js +0 -22
- package/dist/store-6OIOBMHW.js.map +0 -1
package/dist/chunk-ZYYH3VNA.js
DELETED
|
@@ -1,511 +0,0 @@
|
|
|
1
|
-
import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
|
|
2
|
-
|
|
3
|
-
// src/tools/wallet/store.ts
|
|
4
|
-
import {
|
|
5
|
-
existsSync as existsSync2,
|
|
6
|
-
readFileSync as readFileSync2,
|
|
7
|
-
writeFileSync as writeFileSync2,
|
|
8
|
-
mkdirSync as mkdirSync2,
|
|
9
|
-
renameSync
|
|
10
|
-
} from "fs";
|
|
11
|
-
import { join as join2 } from "path";
|
|
12
|
-
import { homedir as homedir2 } from "os";
|
|
13
|
-
import { randomBytes as randomBytes3 } from "crypto";
|
|
14
|
-
|
|
15
|
-
// src/tools/wallet/models.ts
|
|
16
|
-
import { z as z2 } from "zod";
|
|
17
|
-
|
|
18
|
-
// src/crypto.ts
|
|
19
|
-
import {
|
|
20
|
-
randomBytes,
|
|
21
|
-
scryptSync,
|
|
22
|
-
createCipheriv,
|
|
23
|
-
createDecipheriv
|
|
24
|
-
} from "crypto";
|
|
25
|
-
import { z } from "zod";
|
|
26
|
-
var SCRYPT_N = 2 ** 18;
|
|
27
|
-
var SCRYPT_R = 8;
|
|
28
|
-
var SCRYPT_P = 1;
|
|
29
|
-
var KEY_LENGTH = 32;
|
|
30
|
-
var SCRYPT_MAXMEM = 512 * 1024 * 1024;
|
|
31
|
-
var encryptedFileSchema = z.object({
|
|
32
|
-
encryption: z.object({
|
|
33
|
-
cipher: z.literal("aes-256-gcm"),
|
|
34
|
-
kdf: z.literal("scrypt"),
|
|
35
|
-
kdfparams: z.object({
|
|
36
|
-
n: z.number(),
|
|
37
|
-
r: z.number(),
|
|
38
|
-
p: z.number()
|
|
39
|
-
}),
|
|
40
|
-
salt: z.string(),
|
|
41
|
-
iv: z.string(),
|
|
42
|
-
tag: z.string()
|
|
43
|
-
}),
|
|
44
|
-
data: z.string()
|
|
45
|
-
});
|
|
46
|
-
function encrypt(data, encryptionKey) {
|
|
47
|
-
const salt = randomBytes(32);
|
|
48
|
-
const aesKey = scryptSync(encryptionKey, salt, KEY_LENGTH, {
|
|
49
|
-
N: SCRYPT_N,
|
|
50
|
-
r: SCRYPT_R,
|
|
51
|
-
p: SCRYPT_P,
|
|
52
|
-
maxmem: SCRYPT_MAXMEM
|
|
53
|
-
});
|
|
54
|
-
const iv = randomBytes(12);
|
|
55
|
-
const cipher = createCipheriv("aes-256-gcm", aesKey, iv);
|
|
56
|
-
const encrypted = Buffer.concat([
|
|
57
|
-
cipher.update(data, "utf8"),
|
|
58
|
-
cipher.final()
|
|
59
|
-
]);
|
|
60
|
-
return {
|
|
61
|
-
encryption: {
|
|
62
|
-
cipher: "aes-256-gcm",
|
|
63
|
-
kdf: "scrypt",
|
|
64
|
-
kdfparams: { n: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P },
|
|
65
|
-
salt: salt.toString("base64"),
|
|
66
|
-
iv: iv.toString("base64"),
|
|
67
|
-
tag: cipher.getAuthTag().toString("base64")
|
|
68
|
-
},
|
|
69
|
-
data: encrypted.toString("base64")
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
function decrypt(file, encryptionKey) {
|
|
73
|
-
const { salt, iv, tag, kdfparams } = file.encryption;
|
|
74
|
-
const aesKey = scryptSync(
|
|
75
|
-
encryptionKey,
|
|
76
|
-
Buffer.from(salt, "base64"),
|
|
77
|
-
KEY_LENGTH,
|
|
78
|
-
{ N: kdfparams.n, r: kdfparams.r, p: kdfparams.p, maxmem: SCRYPT_MAXMEM }
|
|
79
|
-
);
|
|
80
|
-
const decipher = createDecipheriv(
|
|
81
|
-
"aes-256-gcm",
|
|
82
|
-
aesKey,
|
|
83
|
-
Buffer.from(iv, "base64"),
|
|
84
|
-
{ authTagLength: 16 }
|
|
85
|
-
);
|
|
86
|
-
decipher.setAuthTag(Buffer.from(tag, "base64"));
|
|
87
|
-
return Buffer.concat([
|
|
88
|
-
decipher.update(Buffer.from(file.data, "base64")),
|
|
89
|
-
decipher.final()
|
|
90
|
-
]).toString("utf8");
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// src/tools/wallet/models.ts
|
|
94
|
-
var chainSchema = z2.enum([
|
|
95
|
-
"solana",
|
|
96
|
-
"ethereum",
|
|
97
|
-
"base",
|
|
98
|
-
"arbitrum",
|
|
99
|
-
"polygon",
|
|
100
|
-
"optimism",
|
|
101
|
-
"bnb",
|
|
102
|
-
"avalanche",
|
|
103
|
-
"bitcoin",
|
|
104
|
-
"tron"
|
|
105
|
-
]);
|
|
106
|
-
var keyChainSchema = z2.enum(["solana", "ethereum", "bitcoin", "tron"]);
|
|
107
|
-
var KEY_CHAIN_MAP = {
|
|
108
|
-
solana: "solana",
|
|
109
|
-
ethereum: "ethereum",
|
|
110
|
-
base: "ethereum",
|
|
111
|
-
arbitrum: "ethereum",
|
|
112
|
-
polygon: "ethereum",
|
|
113
|
-
optimism: "ethereum",
|
|
114
|
-
bnb: "ethereum",
|
|
115
|
-
avalanche: "ethereum",
|
|
116
|
-
bitcoin: "bitcoin",
|
|
117
|
-
tron: "tron"
|
|
118
|
-
};
|
|
119
|
-
var addressesSchema = z2.object({
|
|
120
|
-
solana: z2.string().optional(),
|
|
121
|
-
ethereum: z2.string().optional(),
|
|
122
|
-
bitcoin: z2.string().optional(),
|
|
123
|
-
tron: z2.string().optional()
|
|
124
|
-
});
|
|
125
|
-
var EVM_CHAINS = ["base", "arbitrum", "polygon", "optimism", "bnb", "avalanche"];
|
|
126
|
-
function expandAddresses(addresses) {
|
|
127
|
-
const result = {};
|
|
128
|
-
if (addresses.solana) result.solana = addresses.solana;
|
|
129
|
-
if (addresses.ethereum) {
|
|
130
|
-
result.ethereum = addresses.ethereum;
|
|
131
|
-
for (const chain of EVM_CHAINS) result[chain] = addresses.ethereum;
|
|
132
|
-
}
|
|
133
|
-
if (addresses.bitcoin) result.bitcoin = addresses.bitcoin;
|
|
134
|
-
if (addresses.tron) result.tron = addresses.tron;
|
|
135
|
-
return result;
|
|
136
|
-
}
|
|
137
|
-
var hdWalletSchema = z2.object({
|
|
138
|
-
name: z2.string(),
|
|
139
|
-
type: z2.literal("hd"),
|
|
140
|
-
mnemonic: z2.string(),
|
|
141
|
-
addresses: addressesSchema,
|
|
142
|
-
createdAt: z2.string()
|
|
143
|
-
});
|
|
144
|
-
var importedWalletSchema = z2.object({
|
|
145
|
-
name: z2.string(),
|
|
146
|
-
type: z2.literal("imported"),
|
|
147
|
-
chain: keyChainSchema,
|
|
148
|
-
privateKey: z2.string(),
|
|
149
|
-
addresses: addressesSchema,
|
|
150
|
-
createdAt: z2.string()
|
|
151
|
-
});
|
|
152
|
-
var walletSchema = z2.discriminatedUnion("type", [
|
|
153
|
-
hdWalletSchema,
|
|
154
|
-
importedWalletSchema
|
|
155
|
-
]);
|
|
156
|
-
var walletInfoSchema = z2.object({
|
|
157
|
-
name: z2.string(),
|
|
158
|
-
type: z2.enum(["hd", "imported"]),
|
|
159
|
-
addresses: z2.record(z2.string(), z2.string()),
|
|
160
|
-
createdAt: z2.string()
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
// src/tools/wallet/session.ts
|
|
164
|
-
import { execFileSync, execSync } from "child_process";
|
|
165
|
-
import { randomBytes as randomBytes2 } from "crypto";
|
|
166
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
167
|
-
import { homedir, platform } from "os";
|
|
168
|
-
import { join } from "path";
|
|
169
|
-
var SERVICE = "moonpay-cli";
|
|
170
|
-
var ACCOUNT = "encryption-key";
|
|
171
|
-
var CONFIG_DIR = join(homedir(), ".config", "moonpay");
|
|
172
|
-
var KEY_FILE = join(CONFIG_DIR, ".encryption-key");
|
|
173
|
-
function storeMacOS(value) {
|
|
174
|
-
try {
|
|
175
|
-
execFileSync("security", [
|
|
176
|
-
"delete-generic-password",
|
|
177
|
-
"-s",
|
|
178
|
-
SERVICE,
|
|
179
|
-
"-a",
|
|
180
|
-
ACCOUNT
|
|
181
|
-
], { stdio: "ignore" });
|
|
182
|
-
} catch {
|
|
183
|
-
}
|
|
184
|
-
execFileSync("security", [
|
|
185
|
-
"add-generic-password",
|
|
186
|
-
"-s",
|
|
187
|
-
SERVICE,
|
|
188
|
-
"-a",
|
|
189
|
-
ACCOUNT,
|
|
190
|
-
"-w",
|
|
191
|
-
value
|
|
192
|
-
], { stdio: "ignore" });
|
|
193
|
-
}
|
|
194
|
-
function getMacOS() {
|
|
195
|
-
try {
|
|
196
|
-
return execFileSync("security", [
|
|
197
|
-
"find-generic-password",
|
|
198
|
-
"-s",
|
|
199
|
-
SERVICE,
|
|
200
|
-
"-a",
|
|
201
|
-
ACCOUNT,
|
|
202
|
-
"-w"
|
|
203
|
-
], { encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
204
|
-
} catch {
|
|
205
|
-
return null;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
function storeLinux(value) {
|
|
209
|
-
execSync(
|
|
210
|
-
`printf '%s' | secret-tool store --label="${SERVICE}" service "${SERVICE}" account "${ACCOUNT}"`,
|
|
211
|
-
{ input: value, stdio: ["pipe", "ignore", "ignore"] }
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
function getLinux() {
|
|
215
|
-
try {
|
|
216
|
-
return execFileSync("secret-tool", [
|
|
217
|
-
"lookup",
|
|
218
|
-
"service",
|
|
219
|
-
SERVICE,
|
|
220
|
-
"account",
|
|
221
|
-
ACCOUNT
|
|
222
|
-
], { encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
223
|
-
} catch {
|
|
224
|
-
return null;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
function storeInFile(value) {
|
|
228
|
-
mkdirSync(CONFIG_DIR, { recursive: true, mode: 448 });
|
|
229
|
-
writeFileSync(KEY_FILE, value, { encoding: "utf-8", mode: 384 });
|
|
230
|
-
}
|
|
231
|
-
function getFromFile() {
|
|
232
|
-
try {
|
|
233
|
-
if (!existsSync(KEY_FILE)) return null;
|
|
234
|
-
return readFileSync(KEY_FILE, "utf-8").trim() || null;
|
|
235
|
-
} catch {
|
|
236
|
-
return null;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
function storeInKeychain(value) {
|
|
240
|
-
try {
|
|
241
|
-
const os = platform();
|
|
242
|
-
if (os === "darwin") {
|
|
243
|
-
storeMacOS(value);
|
|
244
|
-
return true;
|
|
245
|
-
}
|
|
246
|
-
if (os === "linux") {
|
|
247
|
-
storeLinux(value);
|
|
248
|
-
return true;
|
|
249
|
-
}
|
|
250
|
-
return false;
|
|
251
|
-
} catch {
|
|
252
|
-
return false;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
function getFromKeychain() {
|
|
256
|
-
const os = platform();
|
|
257
|
-
if (os === "darwin") return getMacOS();
|
|
258
|
-
if (os === "linux") return getLinux();
|
|
259
|
-
return null;
|
|
260
|
-
}
|
|
261
|
-
function getEncryptionKey() {
|
|
262
|
-
const envKey = process.env.MOONPAY_ENCRYPTION_KEY;
|
|
263
|
-
if (envKey) return envKey;
|
|
264
|
-
return getFromKeychain() ?? getFromFile();
|
|
265
|
-
}
|
|
266
|
-
function ensureEncryptionKey() {
|
|
267
|
-
const existing = getEncryptionKey();
|
|
268
|
-
if (existing) return existing;
|
|
269
|
-
const key = randomBytes2(32).toString("hex");
|
|
270
|
-
const stored = storeInKeychain(key);
|
|
271
|
-
if (!stored) {
|
|
272
|
-
storeInFile(key);
|
|
273
|
-
process.stderr.write(
|
|
274
|
-
"Note: Keychain unavailable. Encryption key stored in " + KEY_FILE + "\n"
|
|
275
|
-
);
|
|
276
|
-
}
|
|
277
|
-
return key;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// src/tools/wallet/chains.ts
|
|
281
|
-
import { createHash } from "crypto";
|
|
282
|
-
import { HDKey } from "@scure/bip32";
|
|
283
|
-
import { mnemonicToSeedSync } from "@scure/bip39";
|
|
284
|
-
import { keccak_256 } from "@noble/hashes/sha3";
|
|
285
|
-
import { derivePath } from "ed25519-hd-key";
|
|
286
|
-
import * as bitcoin from "bitcoinjs-lib";
|
|
287
|
-
import ECPairFactory from "ecpair";
|
|
288
|
-
import * as ecc from "tiny-secp256k1";
|
|
289
|
-
import { Keypair } from "@solana/web3.js";
|
|
290
|
-
import bs58 from "bs58";
|
|
291
|
-
var ECPair = ECPairFactory(ecc);
|
|
292
|
-
function derivationPath(chain, account = 0) {
|
|
293
|
-
switch (chain) {
|
|
294
|
-
case "solana":
|
|
295
|
-
return `m/44'/501'/${account}'/0'`;
|
|
296
|
-
case "ethereum":
|
|
297
|
-
return `m/44'/60'/${account}'/0/0`;
|
|
298
|
-
case "bitcoin":
|
|
299
|
-
return `m/84'/0'/${account}'/0/0`;
|
|
300
|
-
case "tron":
|
|
301
|
-
return `m/44'/195'/${account}'/0/0`;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
function deriveKeyForChain(mnemonic, chain, account = 0) {
|
|
305
|
-
switch (chain) {
|
|
306
|
-
case "solana":
|
|
307
|
-
return deriveSolana(mnemonic, account);
|
|
308
|
-
case "ethereum":
|
|
309
|
-
return deriveEthereum(mnemonic, account);
|
|
310
|
-
case "bitcoin":
|
|
311
|
-
return deriveBitcoin(mnemonic, account);
|
|
312
|
-
case "tron":
|
|
313
|
-
return deriveTron(mnemonic, account);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
function deriveAllAddresses(mnemonic, account = 0) {
|
|
317
|
-
return {
|
|
318
|
-
solana: deriveKeyForChain(mnemonic, "solana", account).address,
|
|
319
|
-
ethereum: deriveKeyForChain(mnemonic, "ethereum", account).address,
|
|
320
|
-
bitcoin: deriveKeyForChain(mnemonic, "bitcoin", account).address,
|
|
321
|
-
tron: deriveKeyForChain(mnemonic, "tron", account).address
|
|
322
|
-
};
|
|
323
|
-
}
|
|
324
|
-
function deriveSolana(mnemonic, account) {
|
|
325
|
-
const seed = mnemonicToSeedSync(mnemonic);
|
|
326
|
-
const path = derivationPath("solana", account);
|
|
327
|
-
const { key } = derivePath(path, Buffer.from(seed).toString("hex"));
|
|
328
|
-
const keypair = Keypair.fromSeed(Uint8Array.from(key));
|
|
329
|
-
return {
|
|
330
|
-
privateKey: keypair.secretKey,
|
|
331
|
-
address: keypair.publicKey.toBase58()
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
function deriveEthereum(mnemonic, account) {
|
|
335
|
-
const seed = mnemonicToSeedSync(mnemonic);
|
|
336
|
-
const hdkey = HDKey.fromMasterSeed(seed);
|
|
337
|
-
const path = derivationPath("ethereum", account);
|
|
338
|
-
const child = hdkey.derive(path);
|
|
339
|
-
if (!child.privateKey) throw new Error("Failed to derive EVM private key");
|
|
340
|
-
const address = publicKeyToEthAddress(child.publicKey);
|
|
341
|
-
return {
|
|
342
|
-
privateKey: child.privateKey,
|
|
343
|
-
address
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
function publicKeyToEthAddress(compressedPubKey) {
|
|
347
|
-
const uncompressed = ecc.pointCompress(compressedPubKey, false);
|
|
348
|
-
const hash = keccak256(uncompressed.slice(1));
|
|
349
|
-
const addressBytes = hash.slice(-20);
|
|
350
|
-
const address = "0x" + Buffer.from(addressBytes).toString("hex");
|
|
351
|
-
return toChecksumAddress(address);
|
|
352
|
-
}
|
|
353
|
-
function keccak256(data) {
|
|
354
|
-
return keccak_256(data);
|
|
355
|
-
}
|
|
356
|
-
function toChecksumAddress(address) {
|
|
357
|
-
const addr = address.toLowerCase().replace("0x", "");
|
|
358
|
-
const hash = Buffer.from(keccak_256(Buffer.from(addr, "utf8"))).toString("hex");
|
|
359
|
-
let checksummed = "0x";
|
|
360
|
-
for (let i = 0; i < addr.length; i++) {
|
|
361
|
-
checksummed += parseInt(hash[i], 16) >= 8 ? addr[i].toUpperCase() : addr[i];
|
|
362
|
-
}
|
|
363
|
-
return checksummed;
|
|
364
|
-
}
|
|
365
|
-
function deriveBitcoin(mnemonic, account) {
|
|
366
|
-
const seed = mnemonicToSeedSync(mnemonic);
|
|
367
|
-
const hdkey = HDKey.fromMasterSeed(seed);
|
|
368
|
-
const path = derivationPath("bitcoin", account);
|
|
369
|
-
const child = hdkey.derive(path);
|
|
370
|
-
if (!child.privateKey) throw new Error("Failed to derive Bitcoin private key");
|
|
371
|
-
const keyPair = ECPair.fromPrivateKey(Buffer.from(child.privateKey));
|
|
372
|
-
const { address } = bitcoin.payments.p2wpkh({
|
|
373
|
-
pubkey: Buffer.from(keyPair.publicKey)
|
|
374
|
-
});
|
|
375
|
-
if (!address) throw new Error("Failed to derive Bitcoin address");
|
|
376
|
-
return {
|
|
377
|
-
privateKey: child.privateKey,
|
|
378
|
-
address
|
|
379
|
-
};
|
|
380
|
-
}
|
|
381
|
-
function deriveTron(mnemonic, account) {
|
|
382
|
-
const seed = mnemonicToSeedSync(mnemonic);
|
|
383
|
-
const hdkey = HDKey.fromMasterSeed(seed);
|
|
384
|
-
const path = derivationPath("tron", account);
|
|
385
|
-
const child = hdkey.derive(path);
|
|
386
|
-
if (!child.privateKey) throw new Error("Failed to derive Tron private key");
|
|
387
|
-
const address = publicKeyToTronAddress(child.publicKey);
|
|
388
|
-
return { privateKey: child.privateKey, address };
|
|
389
|
-
}
|
|
390
|
-
function publicKeyToTronAddress(compressedPubKey) {
|
|
391
|
-
const uncompressed = ecc.pointCompress(compressedPubKey, false);
|
|
392
|
-
const hash = keccak256(uncompressed.slice(1));
|
|
393
|
-
const addressBytes = hash.slice(-20);
|
|
394
|
-
const prefixed = Buffer.concat([Buffer.from([65]), Buffer.from(addressBytes)]);
|
|
395
|
-
const hash1 = createHash("sha256").update(prefixed).digest();
|
|
396
|
-
const hash2 = createHash("sha256").update(hash1).digest();
|
|
397
|
-
const raw = Buffer.concat([prefixed, hash2.slice(0, 4)]);
|
|
398
|
-
return bs58.encode(raw);
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// src/tools/wallet/store.ts
|
|
402
|
-
import bs582 from "bs58";
|
|
403
|
-
var CONFIG_DIR2 = join2(homedir2(), ".config", "moonpay");
|
|
404
|
-
var WALLETS_PATH = join2(CONFIG_DIR2, "wallets.json");
|
|
405
|
-
function ensureConfigDir() {
|
|
406
|
-
mkdirSync2(CONFIG_DIR2, { recursive: true, mode: 448 });
|
|
407
|
-
}
|
|
408
|
-
function loadWallets() {
|
|
409
|
-
if (!existsSync2(WALLETS_PATH)) return [];
|
|
410
|
-
const encryptionKey = getEncryptionKey();
|
|
411
|
-
if (!encryptionKey) {
|
|
412
|
-
throw new Error(
|
|
413
|
-
"Encryption key not found. Set MOONPAY_ENCRYPTION_KEY or ensure OS keychain is accessible."
|
|
414
|
-
);
|
|
415
|
-
}
|
|
416
|
-
const raw = JSON.parse(readFileSync2(WALLETS_PATH, "utf-8"));
|
|
417
|
-
const file = encryptedFileSchema.parse(raw);
|
|
418
|
-
const decrypted = decrypt(file, encryptionKey);
|
|
419
|
-
const parsed = JSON.parse(decrypted);
|
|
420
|
-
return (parsed.wallets ?? []).map((w) => walletSchema.parse(w));
|
|
421
|
-
}
|
|
422
|
-
function saveWallets(wallets) {
|
|
423
|
-
const encryptionKey = ensureEncryptionKey();
|
|
424
|
-
const data = JSON.stringify({ wallets });
|
|
425
|
-
const file = encrypt(data, encryptionKey);
|
|
426
|
-
ensureConfigDir();
|
|
427
|
-
const tmpPath = join2(CONFIG_DIR2, `.wallets.${randomBytes3(4).toString("hex")}.tmp`);
|
|
428
|
-
writeFileSync2(tmpPath, JSON.stringify(file, null, 2), { mode: 384 });
|
|
429
|
-
renameSync(tmpPath, WALLETS_PATH);
|
|
430
|
-
}
|
|
431
|
-
function mutateWallets(fn) {
|
|
432
|
-
const wallets = loadWallets();
|
|
433
|
-
fn(wallets);
|
|
434
|
-
saveWallets(wallets);
|
|
435
|
-
}
|
|
436
|
-
function findWallet(nameOrAddress) {
|
|
437
|
-
const wallets = loadWallets();
|
|
438
|
-
for (const wallet of wallets) {
|
|
439
|
-
if (wallet.name === nameOrAddress) return wallet;
|
|
440
|
-
for (const address of Object.values(wallet.addresses)) {
|
|
441
|
-
if (address === nameOrAddress) return wallet;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
return null;
|
|
445
|
-
}
|
|
446
|
-
function findWalletOrThrow(nameOrAddress) {
|
|
447
|
-
const wallet = findWallet(nameOrAddress);
|
|
448
|
-
if (!wallet) throw new Error(`Wallet "${nameOrAddress}" not found`);
|
|
449
|
-
return wallet;
|
|
450
|
-
}
|
|
451
|
-
function addWallet(wallet) {
|
|
452
|
-
mutateWallets((wallets) => {
|
|
453
|
-
if (wallets.some((w) => w.name === wallet.name)) {
|
|
454
|
-
throw new Error(`Wallet "${wallet.name}" already exists`);
|
|
455
|
-
}
|
|
456
|
-
wallets.push(wallet);
|
|
457
|
-
});
|
|
458
|
-
}
|
|
459
|
-
function removeWallet(name) {
|
|
460
|
-
mutateWallets((wallets) => {
|
|
461
|
-
const idx = wallets.findIndex((w) => w.name === name);
|
|
462
|
-
if (idx === -1) throw new Error(`Wallet "${name}" not found`);
|
|
463
|
-
wallets.splice(idx, 1);
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
function resolveSigningKey(wallet, chain) {
|
|
467
|
-
const keyChain = KEY_CHAIN_MAP[chain];
|
|
468
|
-
if (wallet.type === "imported") {
|
|
469
|
-
if (wallet.chain !== keyChain) {
|
|
470
|
-
throw new Error(
|
|
471
|
-
`Wallet "${wallet.name}" was imported for ${wallet.chain}, cannot sign for ${chain}.`
|
|
472
|
-
);
|
|
473
|
-
}
|
|
474
|
-
return {
|
|
475
|
-
privateKey: decodePrivateKey(wallet.privateKey, keyChain),
|
|
476
|
-
address: wallet.addresses[keyChain]
|
|
477
|
-
};
|
|
478
|
-
}
|
|
479
|
-
const derived = deriveKeyForChain(wallet.mnemonic, keyChain);
|
|
480
|
-
return { privateKey: derived.privateKey, address: derived.address };
|
|
481
|
-
}
|
|
482
|
-
function decodePrivateKey(key, chain) {
|
|
483
|
-
if (chain === "solana") {
|
|
484
|
-
return bs582.decode(key);
|
|
485
|
-
}
|
|
486
|
-
const hex = key.startsWith("0x") ? key.slice(2) : key;
|
|
487
|
-
return Uint8Array.from(Buffer.from(hex, "hex"));
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
export {
|
|
491
|
-
encryptedFileSchema,
|
|
492
|
-
encrypt,
|
|
493
|
-
decrypt,
|
|
494
|
-
getEncryptionKey,
|
|
495
|
-
ensureEncryptionKey,
|
|
496
|
-
deriveAllAddresses,
|
|
497
|
-
chainSchema,
|
|
498
|
-
KEY_CHAIN_MAP,
|
|
499
|
-
addressesSchema,
|
|
500
|
-
expandAddresses,
|
|
501
|
-
walletInfoSchema,
|
|
502
|
-
loadWallets,
|
|
503
|
-
saveWallets,
|
|
504
|
-
mutateWallets,
|
|
505
|
-
findWallet,
|
|
506
|
-
findWalletOrThrow,
|
|
507
|
-
addWallet,
|
|
508
|
-
removeWallet,
|
|
509
|
-
resolveSigningKey
|
|
510
|
-
};
|
|
511
|
-
//# sourceMappingURL=chunk-ZYYH3VNA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/wallet/store.ts","../src/tools/wallet/models.ts","../src/crypto.ts","../src/tools/wallet/session.ts","../src/tools/wallet/chains.ts"],"sourcesContent":["import {\n existsSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n renameSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { randomBytes } from \"node:crypto\";\nimport {\n walletsFileSchema,\n walletSchema,\n type Wallet,\n type Chain,\n type KeyChain,\n KEY_CHAIN_MAP,\n} from \"./models\";\nimport { encrypt, decrypt } from \"../../crypto\";\nimport { getEncryptionKey, ensureEncryptionKey } from \"./session\";\nimport { deriveKeyForChain } from \"./chains\";\nimport bs58 from \"bs58\";\n\n// ── Paths ───────────────────────────────────────────────────\n\nconst CONFIG_DIR = join(homedir(), \".config\", \"moonpay\");\nconst WALLETS_PATH = join(CONFIG_DIR, \"wallets.json\");\n\nfunction ensureConfigDir(): void {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n}\n\n// ── Load / Save ─────────────────────────────────────────────\n\nexport function loadWallets(): Wallet[] {\n if (!existsSync(WALLETS_PATH)) return [];\n\n const encryptionKey = getEncryptionKey();\n if (!encryptionKey) {\n throw new Error(\n \"Encryption key not found. Set MOONPAY_ENCRYPTION_KEY or ensure OS keychain is accessible.\",\n );\n }\n\n const raw = JSON.parse(readFileSync(WALLETS_PATH, \"utf-8\"));\n const file = walletsFileSchema.parse(raw);\n const decrypted = decrypt(file, encryptionKey);\n const parsed = JSON.parse(decrypted);\n\n return (parsed.wallets ?? []).map((w: unknown) => walletSchema.parse(w));\n}\n\nexport function saveWallets(wallets: Wallet[]): void {\n const encryptionKey = ensureEncryptionKey();\n const data = JSON.stringify({ wallets });\n const file = encrypt(data, encryptionKey);\n\n ensureConfigDir();\n const tmpPath = join(CONFIG_DIR, `.wallets.${randomBytes(4).toString(\"hex\")}.tmp`);\n writeFileSync(tmpPath, JSON.stringify(file, null, 2), { mode: 0o600 });\n renameSync(tmpPath, WALLETS_PATH);\n}\n\nexport function mutateWallets(fn: (wallets: Wallet[]) => void): void {\n const wallets = loadWallets();\n fn(wallets);\n saveWallets(wallets);\n}\n\n// ── Wallet operations ───────────────────────────────────────\n\nexport function findWallet(nameOrAddress: string): Wallet | null {\n const wallets = loadWallets();\n\n for (const wallet of wallets) {\n if (wallet.name === nameOrAddress) return wallet;\n for (const address of Object.values(wallet.addresses)) {\n if (address === nameOrAddress) return wallet;\n }\n }\n\n return null;\n}\n\nexport function findWalletOrThrow(nameOrAddress: string): Wallet {\n const wallet = findWallet(nameOrAddress);\n if (!wallet) throw new Error(`Wallet \"${nameOrAddress}\" not found`);\n return wallet;\n}\n\nexport function addWallet(wallet: Wallet): void {\n mutateWallets((wallets) => {\n if (wallets.some((w) => w.name === wallet.name)) {\n throw new Error(`Wallet \"${wallet.name}\" already exists`);\n }\n wallets.push(wallet);\n });\n}\n\nexport function removeWallet(name: string): void {\n mutateWallets((wallets) => {\n const idx = wallets.findIndex((w) => w.name === name);\n if (idx === -1) throw new Error(`Wallet \"${name}\" not found`);\n wallets.splice(idx, 1);\n });\n}\n\n// ── Key resolution ──────────────────────────────────────────\n\nexport function resolveSigningKey(\n wallet: Wallet,\n chain: Chain,\n): { privateKey: Uint8Array; address: string } {\n const keyChain = KEY_CHAIN_MAP[chain];\n\n if (wallet.type === \"imported\") {\n if (wallet.chain !== keyChain) {\n throw new Error(\n `Wallet \"${wallet.name}\" was imported for ${wallet.chain}, cannot sign for ${chain}.`,\n );\n }\n return {\n privateKey: decodePrivateKey(wallet.privateKey, keyChain),\n address: wallet.addresses[keyChain]!,\n };\n }\n\n const derived = deriveKeyForChain(wallet.mnemonic, keyChain);\n return { privateKey: derived.privateKey, address: derived.address };\n}\n\nfunction decodePrivateKey(key: string, chain: KeyChain): Uint8Array {\n if (chain === \"solana\") {\n return bs58.decode(key);\n }\n const hex = key.startsWith(\"0x\") ? key.slice(2) : key;\n return Uint8Array.from(Buffer.from(hex, \"hex\"));\n}\n","import { z } from \"zod\";\nimport { encryptedFileSchema, type EncryptedFile } from \"../../crypto\";\n\nexport { encryptedFileSchema as walletsFileSchema };\nexport type WalletsFile = EncryptedFile;\n\n// ── Chain types ─────────────────────────────────────────────\n\nexport const chainSchema = z.enum([\n \"solana\",\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"polygon\",\n \"optimism\",\n \"bnb\",\n \"avalanche\",\n \"bitcoin\",\n \"tron\",\n]);\nexport type Chain = z.infer<typeof chainSchema>;\n\nexport const keyChainSchema = z.enum([\"solana\", \"ethereum\", \"bitcoin\", \"tron\"]);\nexport type KeyChain = z.infer<typeof keyChainSchema>;\n\nexport const KEY_CHAIN_MAP: Record<Chain, KeyChain> = {\n solana: \"solana\",\n ethereum: \"ethereum\",\n base: \"ethereum\",\n arbitrum: \"ethereum\",\n polygon: \"ethereum\",\n optimism: \"ethereum\",\n bnb: \"ethereum\",\n avalanche: \"ethereum\",\n bitcoin: \"bitcoin\",\n tron: \"tron\",\n};\n\n// ── Addresses ───────────────────────────────────────────────\n\nexport const addressesSchema = z.object({\n solana: z.string().optional(),\n ethereum: z.string().optional(),\n bitcoin: z.string().optional(),\n tron: z.string().optional(),\n});\nexport type Addresses = z.infer<typeof addressesSchema>;\n\nconst EVM_CHAINS = [\"base\", \"arbitrum\", \"polygon\", \"optimism\", \"bnb\", \"avalanche\"] as const;\n\nexport function expandAddresses(addresses: Addresses): Record<string, string> {\n const result: Record<string, string> = {};\n if (addresses.solana) result.solana = addresses.solana;\n if (addresses.ethereum) {\n result.ethereum = addresses.ethereum;\n for (const chain of EVM_CHAINS) result[chain] = addresses.ethereum;\n }\n if (addresses.bitcoin) result.bitcoin = addresses.bitcoin;\n if (addresses.tron) result.tron = addresses.tron;\n return result;\n}\n\n// ── Wallet types (internal, includes secrets) ───────────────\n\nexport const hdWalletSchema = z.object({\n name: z.string(),\n type: z.literal(\"hd\"),\n mnemonic: z.string(),\n addresses: addressesSchema,\n createdAt: z.string(),\n});\nexport type HdWallet = z.infer<typeof hdWalletSchema>;\n\nexport const importedWalletSchema = z.object({\n name: z.string(),\n type: z.literal(\"imported\"),\n chain: keyChainSchema,\n privateKey: z.string(),\n addresses: addressesSchema,\n createdAt: z.string(),\n});\nexport type ImportedWallet = z.infer<typeof importedWalletSchema>;\n\nexport const walletSchema = z.discriminatedUnion(\"type\", [\n hdWalletSchema,\n importedWalletSchema,\n]);\nexport type Wallet = z.infer<typeof walletSchema>;\n\n// ── Encrypted file format (re-exported from shared crypto) ──\n\n// ── Public wallet info (no secrets) ─────────────────────────\n\nexport const walletInfoSchema = z.object({\n name: z.string(),\n type: z.enum([\"hd\", \"imported\"]),\n addresses: z.record(z.string(), z.string()),\n createdAt: z.string(),\n});\nexport type WalletInfo = z.infer<typeof walletInfoSchema>;\n","import {\n randomBytes,\n scryptSync,\n createCipheriv,\n createDecipheriv,\n} from \"node:crypto\";\nimport { z } from \"zod\";\n\nconst SCRYPT_N = 2 ** 18;\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst KEY_LENGTH = 32;\nconst SCRYPT_MAXMEM = 512 * 1024 * 1024;\n\nexport const encryptedFileSchema = z.object({\n encryption: z.object({\n cipher: z.literal(\"aes-256-gcm\"),\n kdf: z.literal(\"scrypt\"),\n kdfparams: z.object({\n n: z.number(),\n r: z.number(),\n p: z.number(),\n }),\n salt: z.string(),\n iv: z.string(),\n tag: z.string(),\n }),\n data: z.string(),\n});\nexport type EncryptedFile = z.infer<typeof encryptedFileSchema>;\n\nexport function encrypt(data: string, encryptionKey: string): EncryptedFile {\n const salt = randomBytes(32);\n const aesKey = scryptSync(encryptionKey, salt, KEY_LENGTH, {\n N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P, maxmem: SCRYPT_MAXMEM,\n });\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", aesKey, iv);\n\n const encrypted = Buffer.concat([\n cipher.update(data, \"utf8\"),\n cipher.final(),\n ]);\n\n return {\n encryption: {\n cipher: \"aes-256-gcm\",\n kdf: \"scrypt\",\n kdfparams: { n: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P },\n salt: salt.toString(\"base64\"),\n iv: iv.toString(\"base64\"),\n tag: cipher.getAuthTag().toString(\"base64\"),\n },\n data: encrypted.toString(\"base64\"),\n };\n}\n\nexport function decrypt(file: EncryptedFile, encryptionKey: string): string {\n const { salt, iv, tag, kdfparams } = file.encryption;\n\n const aesKey = scryptSync(\n encryptionKey,\n Buffer.from(salt, \"base64\"),\n KEY_LENGTH,\n { N: kdfparams.n, r: kdfparams.r, p: kdfparams.p, maxmem: SCRYPT_MAXMEM },\n );\n\n const decipher = createDecipheriv(\n \"aes-256-gcm\",\n aesKey,\n Buffer.from(iv, \"base64\"),\n { authTagLength: 16 },\n );\n decipher.setAuthTag(Buffer.from(tag, \"base64\"));\n\n return Buffer.concat([\n decipher.update(Buffer.from(file.data, \"base64\")),\n decipher.final(),\n ]).toString(\"utf8\");\n}\n","import { execFileSync, execSync } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir, platform } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst SERVICE = \"moonpay-cli\";\nconst ACCOUNT = \"encryption-key\";\nconst CONFIG_DIR = join(homedir(), \".config\", \"moonpay\");\nconst KEY_FILE = join(CONFIG_DIR, \".encryption-key\");\n\n// ── macOS Keychain ──────────────────────────────────────────\n\nfunction storeMacOS(value: string): void {\n try {\n execFileSync(\"security\", [\n \"delete-generic-password\", \"-s\", SERVICE, \"-a\", ACCOUNT,\n ], { stdio: \"ignore\" });\n } catch {}\n execFileSync(\"security\", [\n \"add-generic-password\", \"-s\", SERVICE, \"-a\", ACCOUNT, \"-w\", value,\n ], { stdio: \"ignore\" });\n}\n\nfunction getMacOS(): string | null {\n try {\n return execFileSync(\"security\", [\n \"find-generic-password\", \"-s\", SERVICE, \"-a\", ACCOUNT, \"-w\",\n ], { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] }).trim();\n } catch {\n return null;\n }\n}\n\n// ── Linux libsecret ─────────────────────────────────────────\n\nfunction storeLinux(value: string): void {\n execSync(\n `printf '%s' | secret-tool store --label=\"${SERVICE}\" service \"${SERVICE}\" account \"${ACCOUNT}\"`,\n { input: value, stdio: [\"pipe\", \"ignore\", \"ignore\"] },\n );\n}\n\nfunction getLinux(): string | null {\n try {\n return execFileSync(\"secret-tool\", [\n \"lookup\", \"service\", SERVICE, \"account\", ACCOUNT,\n ], { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] }).trim();\n } catch {\n return null;\n }\n}\n\n// ── File-based fallback ─────────────────────────────────────\n\nfunction storeInFile(value: string): void {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n writeFileSync(KEY_FILE, value, { encoding: \"utf-8\", mode: 0o600 });\n}\n\nfunction getFromFile(): string | null {\n try {\n if (!existsSync(KEY_FILE)) return null;\n return readFileSync(KEY_FILE, \"utf-8\").trim() || null;\n } catch {\n return null;\n }\n}\n\n// ── Platform dispatch ───────────────────────────────────────\n\nfunction storeInKeychain(value: string): boolean {\n try {\n const os = platform();\n if (os === \"darwin\") { storeMacOS(value); return true; }\n if (os === \"linux\") { storeLinux(value); return true; }\n return false;\n } catch {\n return false;\n }\n}\n\nfunction getFromKeychain(): string | null {\n const os = platform();\n if (os === \"darwin\") return getMacOS();\n if (os === \"linux\") return getLinux();\n return null;\n}\n\n// ── Public API ──────────────────────────────────────────────\n\nexport function getEncryptionKey(): string | null {\n const envKey = process.env.MOONPAY_ENCRYPTION_KEY;\n if (envKey) return envKey;\n return getFromKeychain() ?? getFromFile();\n}\n\nexport function ensureEncryptionKey(): string {\n const existing = getEncryptionKey();\n if (existing) return existing;\n\n const key = randomBytes(32).toString(\"hex\");\n const stored = storeInKeychain(key);\n if (!stored) {\n storeInFile(key);\n process.stderr.write(\n \"Note: Keychain unavailable. Encryption key stored in \" + KEY_FILE + \"\\n\",\n );\n }\n return key;\n}\n","import { createHash } from \"node:crypto\";\nimport { HDKey } from \"@scure/bip32\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport { keccak_256 } from \"@noble/hashes/sha3\";\nimport { derivePath } from \"ed25519-hd-key\";\nimport * as bitcoin from \"bitcoinjs-lib\";\nimport ECPairFactory from \"ecpair\";\nimport * as ecc from \"tiny-secp256k1\";\nimport { Keypair } from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport type { KeyChain } from \"./models\";\n\nconst ECPair = ECPairFactory(ecc);\n\n// ── BIP44 derivation paths ──────────────────────────────────\n\nexport function derivationPath(chain: KeyChain, account = 0): string {\n switch (chain) {\n case \"solana\":\n return `m/44'/501'/${account}'/0'`;\n case \"ethereum\":\n return `m/44'/60'/${account}'/0/0`;\n case \"bitcoin\":\n return `m/84'/0'/${account}'/0/0`;\n case \"tron\":\n return `m/44'/195'/${account}'/0/0`;\n }\n}\n\n// ── Key derivation ──────────────────────────────────────────\n\nexport interface DerivedKey {\n privateKey: Uint8Array;\n address: string;\n}\n\nexport function deriveKeyForChain(\n mnemonic: string,\n chain: KeyChain,\n account = 0,\n): DerivedKey {\n switch (chain) {\n case \"solana\":\n return deriveSolana(mnemonic, account);\n case \"ethereum\":\n return deriveEthereum(mnemonic, account);\n case \"bitcoin\":\n return deriveBitcoin(mnemonic, account);\n case \"tron\":\n return deriveTron(mnemonic, account);\n }\n}\n\nexport function deriveAllAddresses(\n mnemonic: string,\n account = 0,\n): Record<KeyChain, string> {\n return {\n solana: deriveKeyForChain(mnemonic, \"solana\", account).address,\n ethereum: deriveKeyForChain(mnemonic, \"ethereum\", account).address,\n bitcoin: deriveKeyForChain(mnemonic, \"bitcoin\", account).address,\n tron: deriveKeyForChain(mnemonic, \"tron\", account).address,\n };\n}\n\n// ── Solana (ed25519 via SLIP-0010) ──────────────────────────\n\nfunction deriveSolana(mnemonic: string, account: number): DerivedKey {\n const seed = mnemonicToSeedSync(mnemonic);\n const path = derivationPath(\"solana\", account);\n const { key } = derivePath(path, Buffer.from(seed).toString(\"hex\"));\n const keypair = Keypair.fromSeed(Uint8Array.from(key));\n return {\n privateKey: keypair.secretKey,\n address: keypair.publicKey.toBase58(),\n };\n}\n\n// ── Ethereum / EVM (secp256k1 via BIP32) ────────────────────\n\nfunction deriveEthereum(mnemonic: string, account: number): DerivedKey {\n const seed = mnemonicToSeedSync(mnemonic);\n const hdkey = HDKey.fromMasterSeed(seed);\n const path = derivationPath(\"ethereum\", account);\n const child = hdkey.derive(path);\n if (!child.privateKey) throw new Error(\"Failed to derive EVM private key\");\n\n const address = publicKeyToEthAddress(child.publicKey!);\n return {\n privateKey: child.privateKey,\n address,\n };\n}\n\nfunction publicKeyToEthAddress(compressedPubKey: Uint8Array): string {\n const uncompressed = ecc.pointCompress(compressedPubKey, false);\n const hash = keccak256(uncompressed.slice(1));\n const addressBytes = hash.slice(-20);\n const address = \"0x\" + Buffer.from(addressBytes).toString(\"hex\");\n return toChecksumAddress(address);\n}\n\nfunction keccak256(data: Uint8Array): Uint8Array {\n return keccak_256(data);\n}\n\nfunction toChecksumAddress(address: string): string {\n const addr = address.toLowerCase().replace(\"0x\", \"\");\n const hash = Buffer.from(keccak_256(Buffer.from(addr, \"utf8\"))).toString(\"hex\");\n let checksummed = \"0x\";\n for (let i = 0; i < addr.length; i++) {\n checksummed += parseInt(hash[i], 16) >= 8 ? addr[i].toUpperCase() : addr[i];\n }\n return checksummed;\n}\n\n// ── Bitcoin (secp256k1 via BIP32, native segwit) ────────────\n\nfunction deriveBitcoin(mnemonic: string, account: number): DerivedKey {\n const seed = mnemonicToSeedSync(mnemonic);\n const hdkey = HDKey.fromMasterSeed(seed);\n const path = derivationPath(\"bitcoin\", account);\n const child = hdkey.derive(path);\n if (!child.privateKey) throw new Error(\"Failed to derive Bitcoin private key\");\n\n const keyPair = ECPair.fromPrivateKey(Buffer.from(child.privateKey));\n const { address } = bitcoin.payments.p2wpkh({\n pubkey: Buffer.from(keyPair.publicKey),\n });\n if (!address) throw new Error(\"Failed to derive Bitcoin address\");\n\n return {\n privateKey: child.privateKey,\n address,\n };\n}\n\n// ── Tron (secp256k1 via BIP32, Base58Check) ─────────────────\n\nfunction deriveTron(mnemonic: string, account: number): DerivedKey {\n const seed = mnemonicToSeedSync(mnemonic);\n const hdkey = HDKey.fromMasterSeed(seed);\n const path = derivationPath(\"tron\", account);\n const child = hdkey.derive(path);\n if (!child.privateKey) throw new Error(\"Failed to derive Tron private key\");\n\n const address = publicKeyToTronAddress(child.publicKey!);\n return { privateKey: child.privateKey, address };\n}\n\nfunction publicKeyToTronAddress(compressedPubKey: Uint8Array): string {\n const uncompressed = ecc.pointCompress(compressedPubKey, false);\n const hash = keccak256(uncompressed.slice(1));\n const addressBytes = hash.slice(-20);\n\n // Tron: 0x41 prefix + 20 address bytes + 4-byte double-SHA256 checksum\n const prefixed = Buffer.concat([Buffer.from([0x41]), Buffer.from(addressBytes)]);\n const hash1 = createHash(\"sha256\").update(prefixed).digest();\n const hash2 = createHash(\"sha256\").update(hash1).digest();\n const raw = Buffer.concat([prefixed, hash2.slice(0, 4)]);\n\n return bs58.encode(raw);\n}\n"],"mappings":"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","names":["existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","randomBytes","z","z","randomBytes","bs58","CONFIG_DIR","join","homedir","mkdirSync","existsSync","readFileSync","randomBytes","writeFileSync"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/format.ts","../src/version-check.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from \"module\";\nimport { Command } from \"commander\";\nimport { resolveBaseUrl } from \"./auth\";\n\nimport { callTool } from \"./client\";\nimport { color, formatOutput, type OutputFormat } from \"./format\";\nimport { startVersionCheck } from \"./version-check\";\nimport type { Tool } from \"./tools/shared\";\nimport schemas from \"./generated/schemas.json\";\nimport { LOCAL_TOOLS, consentCheck } from \"./local-tools\";\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\") as { version: string };\n\nconst getUpdateNotice = startVersionCheck(version);\n\nconst program = new Command();\n\nprogram\n .name(\"moonpay\")\n .description(\n \"MoonPay CLI — the crypto onramp for AI agents\\n\\n\" +\n \" Your agents need money. MoonPay gives them wallets, funds, and tools\\n\" +\n \" to buy, swap, bridge, and transact — all from the command line.\\n\\n\" +\n \" Run `mp skill install` to install AI skills for Claude Code.\\n\\n\" +\n \" Terms of Service: https://www.moonpay.com/legal/terms_of_use_usa\\n\" +\n \" Privacy Policy: https://www.moonpay.com/legal/privacy_policy\\n\" +\n \" Swaps by: https://swaps.xyz/terms\",\n )\n .version(version)\n .option(\"--json\", \"Output as JSON instead of YAML\");\n\nfunction getFormat(): OutputFormat {\n return program.opts().json ? \"json\" : \"yaml\";\n}\n\nfunction printResult(result: unknown): void {\n console.log(formatOutput(result, getFormat()));\n}\n\nfunction printUpdateNotice(): void {\n const notice = getUpdateNotice();\n if (notice) process.stderr.write(notice);\n}\n\nprogram\n .command(\"mcp\")\n .description(\"Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)\")\n .action(async () => {\n const { startMcpServer } = await import(\"./mcp\");\n await startMcpServer();\n });\n\n// ── Nested command helpers ─────────────────────────────────────\n\n/**\n * Get or create nested command groups from name segments.\n * e.g. [\"token\", \"swap\"] → program > token > swap\n */\nfunction getOrCreateGroup(parent: Command, segments: string[]): Command {\n let current = parent;\n for (const segment of segments) {\n let existing = current.commands.find((c) => c.name() === segment);\n if (!existing) {\n existing = current.command(segment);\n }\n current = existing;\n }\n return current;\n}\n\n// ── Schema flattening ────────────────────────────────────────────\n\ntype FlatField = {\n flatKey: string;\n field: any;\n path: string[];\n};\n\n/**\n * Walk a Zod object shape and flatten nested ZodObjects into\n * hyphenated keys: { from: { wallet, chain } } → from-wallet, from-chain\n */\nfunction flattenShape(shape: Record<string, any>, prefix = \"\"): FlatField[] {\n const fields: FlatField[] = [];\n for (const [key, field] of Object.entries(shape)) {\n const flatKey = prefix ? `${prefix}-${key}` : key;\n let inner = field;\n while (inner._def.typeName === \"ZodEffects\") inner = inner._def.schema;\n\n // Unwrap nullable to check if inner is an object\n let unwrapped = inner;\n if (unwrapped._def.typeName === \"ZodNullable\") unwrapped = unwrapped._def.innerType;\n\n if (unwrapped._def.typeName === \"ZodObject\" && unwrapped.shape) {\n fields.push(...flattenShape(unwrapped.shape, flatKey));\n } else {\n fields.push({ flatKey, field, path: flatKey.split(\"-\") });\n }\n }\n return fields;\n}\n\n/**\n * Reconstruct nested object from flat hyphenated params.\n * { \"from-wallet\": \"test\", \"from-chain\": \"solana\" } → { from: { wallet: \"test\", chain: \"solana\" } }\n */\nfunction unflattenParams(\n flat: Record<string, unknown>,\n fields: FlatField[],\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const { flatKey, path } of fields) {\n // Commander camelCases --from-wallet → fromWallet, so check both\n const camelKey = flatKey.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n const value = camelKey in flat ? flat[camelKey] : flat[flatKey];\n\n if (path.length === 1) {\n result[path[0]] = value;\n } else {\n let obj = result;\n for (let i = 0; i < path.length - 1; i++) {\n if (!obj[path[i]] || typeof obj[path[i]] !== \"object\") {\n obj[path[i]] = {};\n }\n obj = obj[path[i]] as Record<string, unknown>;\n }\n obj[path[path.length - 1]] = value;\n }\n }\n\n return result;\n}\n\n// ── Local tool registration ────────────────────────────────────\n\nfunction registerLocalTools(parent: Command, tools: Tool<any>[]): void {\n for (const tool of tools) {\n const segments = tool.schema.name.split(\"_\");\n const leafName = segments.pop()!;\n const group = getOrCreateGroup(parent, segments);\n\n const cmd = group.command(leafName).description(tool.schema.description);\n\n const shape = (tool.schema.input as any).shape ?? {};\n const flatFields = flattenShape(shape);\n const nullableKeys: string[] = [];\n const numberKeys: string[] = [];\n const jsonKeys: string[] = [];\n\n for (const { flatKey, field } of flatFields) {\n const desc = field.description ?? flatKey;\n let inner = field;\n while (inner._def.typeName === \"ZodEffects\") inner = inner._def.schema;\n const typeName = inner._def.typeName;\n\n let checkInner = inner;\n if (checkInner._def.typeName === \"ZodNullable\") checkInner = checkInner._def.innerType;\n if (checkInner._def.typeName === \"ZodNumber\") numberKeys.push(flatKey);\n if (checkInner._def.typeName === \"ZodRecord\") jsonKeys.push(flatKey);\n\n if (typeName === \"ZodBoolean\") {\n cmd.option(`--${flatKey}`, desc, false);\n } else if (typeName === \"ZodNullable\") {\n cmd.option(`--${flatKey} <${flatKey}>`, desc);\n nullableKeys.push(flatKey);\n } else {\n cmd.requiredOption(`--${flatKey} <${flatKey}>`, desc);\n }\n }\n\n cmd.action(async (options: Record<string, unknown>) => {\n if (!tool.schema.name.startsWith(\"consent_\")) {\n await consentCheck.handler({});\n }\n\n // Coerce types on the flat keys (commander camelCases them)\n for (const key of nullableKeys) {\n const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n if (options[camelKey] === undefined) options[camelKey] = null;\n }\n for (const key of numberKeys) {\n const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n if (options[camelKey] != null && typeof options[camelKey] === \"string\") {\n options[camelKey] = Number(options[camelKey]);\n }\n }\n for (const key of jsonKeys) {\n const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n if (typeof options[camelKey] === \"string\") {\n try {\n options[camelKey] = JSON.parse(options[camelKey] as string);\n } catch {\n console.error(`Invalid JSON for --${key}`);\n process.exit(1);\n }\n }\n }\n\n const params = unflattenParams(options, flatFields);\n\n try {\n const result = await tool.handler(params);\n printResult(result);\n } catch (error) {\n console.error((error as Error).message);\n process.exit(1);\n }\n });\n }\n}\n\n// ── Remote tool registration ───────────────────────────────────\n\ninterface JsonSchemaProperty {\n type?: string | string[];\n description?: string;\n enum?: string[];\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n anyOf?: { type: string }[];\n}\n\ninterface JsonSchema {\n $ref?: string;\n definitions?: Record<string, JsonSchemaProperty>;\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n}\n\nfunction resolveJsonSchema(inputSchema: JsonSchema): JsonSchemaProperty {\n if (inputSchema.$ref && inputSchema.definitions) {\n const defName = inputSchema.$ref.replace(\"#/definitions/\", \"\");\n return inputSchema.definitions[defName];\n }\n return inputSchema;\n}\n\nfunction isNullableProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(\"null\");\n if (prop.anyOf) return prop.anyOf.some((t) => t.type === \"null\");\n return false;\n}\n\nfunction isObjectProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(\"object\");\n if (prop.anyOf) return prop.anyOf.some((t) => t.type === \"object\");\n return prop.type === \"object\";\n}\n\nfunction isNumberProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.some((t) => t === \"number\" || t === \"integer\");\n if (prop.anyOf) return prop.anyOf.some((t) => t.type === \"number\" || t.type === \"integer\");\n return prop.type === \"number\" || prop.type === \"integer\";\n}\n\nconst HIDDEN_TOOLS = new Set([\n \"swaps_transaction_build\",\n \"token_transfer\",\n \"transaction_register\",\n]);\n\nfunction registerRemoteTools(\n parent: Command,\n remoteSchemas: { name: string; description: string; inputSchema: JsonSchema }[],\n): void {\n for (const schema of remoteSchemas) {\n if (HIDDEN_TOOLS.has(schema.name)) continue;\n const segments = schema.name.split(\"_\");\n const leafName = segments.pop()!;\n const group = getOrCreateGroup(parent, segments);\n\n // Skip if a local tool already registered this command\n if (group.commands.find((c) => c.name() === leafName)) continue;\n\n const cmd = group.command(leafName).description(schema.description);\n\n const resolved = resolveJsonSchema(schema.inputSchema);\n const props = resolved.properties ?? {};\n const requiredSet = new Set(resolved.required ?? []);\n const nullableKeys: string[] = [];\n const numberKeys: string[] = [];\n const objectKeys: string[] = [];\n\n for (const [key, prop] of Object.entries(props)) {\n const desc = prop.description ?? key;\n const nullable = isNullableProperty(prop);\n const isObj = isObjectProperty(prop);\n const isNum = isNumberProperty(prop);\n\n if (isNum) numberKeys.push(key);\n\n if (isObj) {\n objectKeys.push(key);\n if (requiredSet.has(key) && !nullable) {\n cmd.requiredOption(`--${key} <json>`, `${desc} (as JSON)`);\n } else {\n cmd.option(`--${key} <json>`, `${desc} (as JSON)`);\n nullableKeys.push(key);\n }\n } else if (nullable || !requiredSet.has(key)) {\n cmd.option(`--${key} <${key}>`, desc);\n nullableKeys.push(key);\n } else {\n cmd.requiredOption(`--${key} <${key}>`, desc);\n }\n }\n\n cmd.action(async (options: Record<string, unknown>) => {\n await consentCheck.handler({});\n\n // Coerce types\n for (const key of nullableKeys) {\n if (options[key] === undefined) options[key] = null;\n }\n for (const key of numberKeys) {\n if (options[key] != null && typeof options[key] === \"string\") {\n options[key] = Number(options[key]);\n }\n }\n for (const key of objectKeys) {\n if (typeof options[key] === \"string\") {\n try {\n options[key] = JSON.parse(options[key] as string);\n } catch {\n console.error(`Invalid JSON for --${key}`);\n process.exit(1);\n }\n }\n }\n\n try {\n const baseUrl = resolveBaseUrl();\n const result = await callTool(baseUrl, schema.name, options as Record<string, unknown>);\n printResult(result);\n printUpdateNotice();\n } catch (error) {\n console.error((error as Error).message);\n process.exit(1);\n }\n });\n }\n}\n\n// ── Register all tools ─────────────────────────────────────────\n\nregisterLocalTools(program, LOCAL_TOOLS);\nregisterRemoteTools(program, schemas as any);\n\n\n// ── Tools listing ──────────────────────────────────────────────\n\nprogram\n .command(\"tools\")\n .description(\"List available tools\")\n .action(() => {\n const allTools = [\n ...LOCAL_TOOLS.map((t) => ({\n name: t.schema.name,\n description: t.schema.description,\n })),\n ...schemas\n .filter((s) => !LOCAL_TOOLS.some((l) => l.schema.name === s.name) && !HIDDEN_TOOLS.has(s.name))\n .map((s) => ({ name: s.name, description: s.description })),\n ].sort((a, b) => a.name.localeCompare(b.name));\n\n const lines: string[] = [];\n for (const tool of allTools) {\n const cmdName = tool.name.replace(/_/g, \" \");\n lines.push(` ${color.green(cmdName.padEnd(28))} ${color.dim(tool.description)}`);\n }\n lines.push(\"\");\n lines.push(color.dim(`${allTools.length} tools`));\n console.log(lines.join(\"\\n\"));\n printUpdateNotice();\n });\n\nprogram.parse();\n","const useColor =\n !process.env.NO_COLOR && process.stdout.isTTY === true;\n\nfunction ansi(code: string) {\n return (text: string) => (useColor ? `${code}${text}\\x1b[0m` : text);\n}\n\nexport const color = {\n bold: ansi(\"\\x1b[1m\"),\n dim: ansi(\"\\x1b[2m\"),\n green: ansi(\"\\x1b[32m\"),\n yellow: ansi(\"\\x1b[33m\"),\n cyan: ansi(\"\\x1b[36m\"),\n red: ansi(\"\\x1b[31m\"),\n};\n\nfunction isScalar(val: unknown): boolean {\n if (val === null || val === undefined) return true;\n const t = typeof val;\n return t === \"string\" || t === \"number\" || t === \"boolean\";\n}\n\nfunction scalarString(val: unknown): string {\n if (val === null || val === undefined) return \"-\";\n return String(val);\n}\n\nfunction renderYaml(data: unknown, indent = 0): string {\n const pad = \" \".repeat(indent);\n\n if (isScalar(data)) return `${pad}${scalarString(data)}`;\n\n if (Array.isArray(data)) {\n if (data.length === 0) return `${pad}${color.dim(\"(empty)\")}`;\n\n if (data.every(isScalar)) {\n return data.map((v) => `${pad}- ${scalarString(v)}`).join(\"\\n\");\n }\n\n return data\n .map((item) => {\n if (typeof item !== \"object\" || item === null) {\n return `${pad}- ${scalarString(item)}`;\n }\n const entries = Object.entries(item as Record<string, unknown>);\n const lines: string[] = [];\n const [firstKey, firstVal] = entries[0];\n if (isScalar(firstVal)) {\n lines.push(`${pad}- ${color.bold(firstKey)}: ${scalarString(firstVal)}`);\n } else {\n lines.push(`${pad}- ${color.bold(firstKey)}:`);\n lines.push(renderYaml(firstVal, indent + 2));\n }\n for (const [k, v] of entries.slice(1)) {\n if (isScalar(v)) {\n lines.push(`${pad} ${color.bold(k)}: ${scalarString(v)}`);\n } else {\n lines.push(`${pad} ${color.bold(k)}:`);\n lines.push(renderYaml(v, indent + 2));\n }\n }\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n\");\n }\n\n if (typeof data === \"object\" && data !== null) {\n const entries = Object.entries(data as Record<string, unknown>);\n return entries\n .map(([k, v]) => {\n if (isScalar(v)) return `${pad}${color.bold(k)}: ${scalarString(v)}`;\n return `${pad}${color.bold(k)}:\\n${renderYaml(v, indent + 1)}`;\n })\n .join(\"\\n\");\n }\n\n return \"\";\n}\n\nfunction unwrap(result: unknown): unknown {\n if (typeof result !== \"object\" || result === null) return result;\n const obj = result as Record<string, unknown>;\n if (\"data\" in obj) return obj.data;\n if (\"items\" in obj && Array.isArray(obj.items)) {\n const otherKeys = Object.keys(obj).filter((k) => k !== \"items\");\n if (otherKeys.length === 0) return obj.items;\n }\n return result;\n}\n\nexport { renderYaml as renderTable };\n\nexport type OutputFormat = \"yaml\" | \"json\";\n\nexport function formatOutput(result: unknown, format: OutputFormat): string {\n if (format === \"json\") return JSON.stringify(result, null, 2);\n return renderYaml(unwrap(result));\n}\n","import { readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { color } from \"./format\";\n\nconst CACHE_DIR = join(homedir(), \".config\", \"moonpay\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 3000;\n\ntype CacheData = {\n latest: string;\n checkedAt: number;\n};\n\nfunction readCache(): CacheData | null {\n try {\n const raw = readFileSync(CACHE_FILE, \"utf-8\");\n return JSON.parse(raw) as CacheData;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(data: CacheData): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(data));\n } catch {\n // Ignore write errors\n }\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n const a = latest.split(\".\").map(Number);\n const b = current.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((a[i] ?? 0) > (b[i] ?? 0)) return true;\n if ((a[i] ?? 0) < (b[i] ?? 0)) return false;\n }\n return false;\n}\n\nfunction formatNotice(current: string, latest: string): string {\n return [\n \"\",\n color.yellow(`Update available: ${current} → ${latest}`),\n color.dim(\"Run `npm i -g @moonpay/cli` to update.\"),\n \"\",\n ].join(\"\\n\");\n}\n\nexport function startVersionCheck(\n currentVersion: string,\n): () => string | null {\n let notice: string | null = null;\n\n const cache = readCache();\n\n if (cache && Date.now() - cache.checkedAt < ONE_DAY_MS) {\n if (isNewer(cache.latest, currentVersion)) {\n notice = formatNotice(currentVersion, cache.latest);\n }\n return () => notice;\n }\n\n // Fire async fetch — non-blocking\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n\n fetch(\"https://registry.npmjs.org/@moonpay%2fcli/latest\", {\n signal: controller.signal,\n })\n .then((res) => res.json())\n .then((data: unknown) => {\n const latest = (data as { version?: string }).version;\n if (latest) {\n writeCache({ latest, checkedAt: Date.now() });\n if (isNewer(latest, currentVersion)) {\n notice = formatNotice(currentVersion, latest);\n }\n }\n })\n .catch(() => {\n // Silently ignore fetch errors\n })\n .finally(() => clearTimeout(timeout));\n\n return () => notice;\n}\n"],"mappings":"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","names":["require"]}
|