@moonpay/cli 0.3.10 → 0.4.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.
@@ -0,0 +1,13 @@
1
+ import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
+ import {
3
+ derivationPath,
4
+ deriveAllAddresses,
5
+ deriveKeyForChain
6
+ } from "./chunk-Z33PSOPD.js";
7
+ import "./chunk-EEBB5MQP.js";
8
+ export {
9
+ derivationPath,
10
+ deriveAllAddresses,
11
+ deriveKeyForChain
12
+ };
13
+ //# sourceMappingURL=chains-R754DQM5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,168 @@
1
+ import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
+
3
+ // src/tools/wallet/server.ts
4
+ import {
5
+ readFileSync,
6
+ readdirSync,
7
+ writeFileSync,
8
+ mkdirSync,
9
+ existsSync,
10
+ renameSync,
11
+ unlinkSync
12
+ } from "fs";
13
+ import { join, resolve } from "path";
14
+ import { homedir } from "os";
15
+ import { randomBytes } from "crypto";
16
+
17
+ // src/tools/wallet/models.ts
18
+ import { z } from "zod";
19
+ var chainSchema = z.enum([
20
+ "solana",
21
+ "ethereum",
22
+ "base",
23
+ "arbitrum",
24
+ "polygon",
25
+ "optimism",
26
+ "bnb",
27
+ "avalanche",
28
+ "bitcoin",
29
+ "tron"
30
+ ]);
31
+ var keyChainSchema = z.enum(["solana", "ethereum", "bitcoin", "tron"]);
32
+ var KEY_CHAIN_MAP = {
33
+ solana: "solana",
34
+ ethereum: "ethereum",
35
+ base: "ethereum",
36
+ arbitrum: "ethereum",
37
+ polygon: "ethereum",
38
+ optimism: "ethereum",
39
+ bnb: "ethereum",
40
+ avalanche: "ethereum",
41
+ bitcoin: "bitcoin",
42
+ tron: "tron"
43
+ };
44
+ var hdVaultEntrySchema = z.object({
45
+ id: z.string(),
46
+ type: z.literal("hd"),
47
+ mnemonic: z.string()
48
+ });
49
+ var importedVaultEntrySchema = z.object({
50
+ id: z.string(),
51
+ type: z.literal("imported"),
52
+ chain: keyChainSchema,
53
+ privateKey: z.string()
54
+ });
55
+ var vaultEntrySchema = z.discriminatedUnion("type", [
56
+ hdVaultEntrySchema,
57
+ importedVaultEntrySchema
58
+ ]);
59
+ var vaultDataSchema = z.object({
60
+ version: z.literal(1),
61
+ entries: z.record(z.string(), vaultEntrySchema)
62
+ });
63
+ var lockedVaultDataSchema = z.object({
64
+ version: z.literal(1),
65
+ locked: z.literal(true),
66
+ ciphertext: z.string(),
67
+ iv: z.string(),
68
+ salt: z.string(),
69
+ tag: z.string()
70
+ });
71
+ var walletMetadataSchema = z.object({
72
+ name: z.string(),
73
+ type: z.enum(["hd", "imported"]),
74
+ vaultRef: z.string(),
75
+ account: z.number().int().min(0).default(0),
76
+ addresses: z.record(keyChainSchema, z.string()),
77
+ createdAt: z.string()
78
+ });
79
+ var walletInfoSchema = walletMetadataSchema;
80
+
81
+ // src/tools/wallet/server.ts
82
+ var CONFIG_DIR = join(homedir(), ".config", "moonpay");
83
+ var WALLETS_DIR = join(CONFIG_DIR, "wallets");
84
+ function validateWalletName(name) {
85
+ if (!name || /[/\\]/.test(name) || name.includes("..") || name.includes("\0")) {
86
+ throw new Error(`Invalid wallet name: "${name}"`);
87
+ }
88
+ const resolved = resolve(WALLETS_DIR, `${name}.json`);
89
+ if (!resolved.startsWith(WALLETS_DIR + "/")) {
90
+ throw new Error(`Invalid wallet name: "${name}"`);
91
+ }
92
+ }
93
+ function ensureWalletsDir() {
94
+ mkdirSync(WALLETS_DIR, { recursive: true, mode: 448 });
95
+ }
96
+ function getWalletPath(name) {
97
+ validateWalletName(name);
98
+ return join(WALLETS_DIR, `${name}.json`);
99
+ }
100
+ function getWalletsDir() {
101
+ return WALLETS_DIR;
102
+ }
103
+ function saveWalletMetadata(metadata) {
104
+ ensureWalletsDir();
105
+ const filePath = getWalletPath(metadata.name);
106
+ if (existsSync(filePath)) {
107
+ throw new Error(`Wallet "${metadata.name}" already exists`);
108
+ }
109
+ const safeName = metadata.name.replace(/[^a-zA-Z0-9_-]/g, "_");
110
+ const tmpPath = join(
111
+ WALLETS_DIR,
112
+ `.${safeName}.${randomBytes(4).toString("hex")}.tmp`
113
+ );
114
+ writeFileSync(tmpPath, JSON.stringify(metadata, null, 2), { mode: 384 });
115
+ renameSync(tmpPath, filePath);
116
+ }
117
+ function loadWallet(nameOrAddress) {
118
+ ensureWalletsDir();
119
+ const files = readdirSync(WALLETS_DIR).filter(
120
+ (f) => f.endsWith(".json") && !f.startsWith(".")
121
+ );
122
+ for (const file of files) {
123
+ const raw = JSON.parse(readFileSync(join(WALLETS_DIR, file), "utf-8"));
124
+ const result = walletMetadataSchema.safeParse(raw);
125
+ if (!result.success) continue;
126
+ const wallet = result.data;
127
+ if (wallet.name === nameOrAddress) return wallet;
128
+ for (const address of Object.values(wallet.addresses)) {
129
+ if (address === nameOrAddress) return wallet;
130
+ }
131
+ }
132
+ throw new Error(`Wallet "${nameOrAddress}" not found`);
133
+ }
134
+ function loadAllWallets() {
135
+ ensureWalletsDir();
136
+ const dir = getWalletsDir();
137
+ const files = readdirSync(dir).filter(
138
+ (f) => f.endsWith(".json") && !f.startsWith(".")
139
+ );
140
+ const wallets = [];
141
+ for (const f of files) {
142
+ const raw = JSON.parse(readFileSync(join(dir, f), "utf-8"));
143
+ const result = walletMetadataSchema.safeParse(raw);
144
+ if (result.success) wallets.push(result.data);
145
+ }
146
+ return wallets;
147
+ }
148
+ function deleteWalletFile(name) {
149
+ const filePath = getWalletPath(name);
150
+ unlinkSync(filePath);
151
+ }
152
+
153
+ export {
154
+ chainSchema,
155
+ keyChainSchema,
156
+ KEY_CHAIN_MAP,
157
+ vaultDataSchema,
158
+ lockedVaultDataSchema,
159
+ walletInfoSchema,
160
+ ensureWalletsDir,
161
+ getWalletPath,
162
+ getWalletsDir,
163
+ saveWalletMetadata,
164
+ loadWallet,
165
+ loadAllWallets,
166
+ deleteWalletFile
167
+ };
168
+ //# sourceMappingURL=chunk-AGDVU2O5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/wallet/server.ts","../src/tools/wallet/models.ts"],"sourcesContent":["import {\n readFileSync,\n readdirSync,\n writeFileSync,\n mkdirSync,\n existsSync,\n renameSync,\n unlinkSync,\n} from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { randomBytes } from \"node:crypto\";\nimport {\n walletMetadataSchema,\n type WalletMetadata,\n type WalletInfo,\n} from \"./models\";\n\nexport type { WalletMetadata, WalletInfo };\n\nconst CONFIG_DIR = join(homedir(), \".config\", \"moonpay\");\nconst WALLETS_DIR = join(CONFIG_DIR, \"wallets\");\n\n/**\n * Validate a wallet name to prevent path traversal.\n */\nfunction validateWalletName(name: string): void {\n if (\n !name ||\n /[/\\\\]/.test(name) ||\n name.includes(\"..\") ||\n name.includes(\"\\0\")\n ) {\n throw new Error(`Invalid wallet name: \"${name}\"`);\n }\n const resolved = resolve(WALLETS_DIR, `${name}.json`);\n if (!resolved.startsWith(WALLETS_DIR + \"/\")) {\n throw new Error(`Invalid wallet name: \"${name}\"`);\n }\n}\n\nexport function ensureWalletsDir(): void {\n mkdirSync(WALLETS_DIR, { recursive: true, mode: 0o700 });\n}\n\nexport function getWalletPath(name: string): string {\n validateWalletName(name);\n return join(WALLETS_DIR, `${name}.json`);\n}\n\nexport function getWalletsDir(): string {\n return WALLETS_DIR;\n}\n\n/**\n * Save wallet metadata (no secrets — those go in the vault).\n */\nexport function saveWalletMetadata(metadata: WalletMetadata): void {\n ensureWalletsDir();\n const filePath = getWalletPath(metadata.name);\n if (existsSync(filePath)) {\n throw new Error(`Wallet \"${metadata.name}\" already exists`);\n }\n const safeName = metadata.name.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const tmpPath = join(\n WALLETS_DIR,\n `.${safeName}.${randomBytes(4).toString(\"hex\")}.tmp`,\n );\n writeFileSync(tmpPath, JSON.stringify(metadata, null, 2), { mode: 0o600 });\n renameSync(tmpPath, filePath);\n}\n\n/**\n * Load wallet metadata by name or by any address.\n */\nexport function loadWallet(nameOrAddress: string): WalletMetadata {\n ensureWalletsDir();\n const files = readdirSync(WALLETS_DIR).filter(\n (f) => f.endsWith(\".json\") && !f.startsWith(\".\"),\n );\n for (const file of files) {\n const raw = JSON.parse(readFileSync(join(WALLETS_DIR, file), \"utf-8\"));\n const result = walletMetadataSchema.safeParse(raw);\n if (!result.success) continue;\n const wallet = result.data;\n\n // Match by name\n if (wallet.name === nameOrAddress) return wallet;\n\n // Match by any address\n for (const address of Object.values(wallet.addresses)) {\n if (address === nameOrAddress) return wallet;\n }\n }\n\n throw new Error(`Wallet \"${nameOrAddress}\" not found`);\n}\n\n/**\n * Load all wallet metadata files.\n */\nexport function loadAllWallets(): WalletMetadata[] {\n ensureWalletsDir();\n const dir = getWalletsDir();\n const files = readdirSync(dir).filter(\n (f) => f.endsWith(\".json\") && !f.startsWith(\".\"),\n );\n const wallets: WalletMetadata[] = [];\n for (const f of files) {\n const raw = JSON.parse(readFileSync(join(dir, f), \"utf-8\"));\n const result = walletMetadataSchema.safeParse(raw);\n if (result.success) wallets.push(result.data);\n }\n return wallets;\n}\n\n/**\n * Delete a wallet metadata file by name.\n */\nexport function deleteWalletFile(name: string): void {\n const filePath = getWalletPath(name);\n unlinkSync(filePath);\n}\n","import { z } from \"zod\";\n\n// ── Chain types ─────────────────────────────────────────────\n\n/** All chains the user can specify in CLI commands */\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\n/** Key-derivation chains — EVM chains share one key */\nexport const keyChainSchema = z.enum([\"solana\", \"ethereum\", \"bitcoin\", \"tron\"]);\nexport type KeyChain = z.infer<typeof keyChainSchema>;\n\n/** Maps a user-facing chain to its key-derivation chain */\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\nexport const ALL_KEY_CHAINS: KeyChain[] = [\"solana\", \"ethereum\", \"bitcoin\", \"tron\"];\n\n// ── Vault schemas ───────────────────────────────────────────\n\nexport const hdVaultEntrySchema = z.object({\n id: z.string(),\n type: z.literal(\"hd\"),\n mnemonic: z.string(),\n});\nexport type HdVaultEntry = z.infer<typeof hdVaultEntrySchema>;\n\nexport const importedVaultEntrySchema = z.object({\n id: z.string(),\n type: z.literal(\"imported\"),\n chain: keyChainSchema,\n privateKey: z.string(),\n});\nexport type ImportedVaultEntry = z.infer<typeof importedVaultEntrySchema>;\n\nexport const vaultEntrySchema = z.discriminatedUnion(\"type\", [\n hdVaultEntrySchema,\n importedVaultEntrySchema,\n]);\nexport type VaultEntry = z.infer<typeof vaultEntrySchema>;\n\nexport const vaultDataSchema = z.object({\n version: z.literal(1),\n entries: z.record(z.string(), vaultEntrySchema),\n});\nexport type VaultData = z.infer<typeof vaultDataSchema>;\n\nexport const lockedVaultDataSchema = z.object({\n version: z.literal(1),\n locked: z.literal(true),\n ciphertext: z.string(),\n iv: z.string(),\n salt: z.string(),\n tag: z.string(),\n});\nexport type LockedVaultData = z.infer<typeof lockedVaultDataSchema>;\n\n// ── Wallet metadata schemas ─────────────────────────────────\n\nexport const walletMetadataSchema = z.object({\n name: z.string(),\n type: z.enum([\"hd\", \"imported\"]),\n vaultRef: z.string(),\n account: z.number().int().min(0).default(0),\n addresses: z.record(keyChainSchema, z.string()),\n createdAt: z.string(),\n});\nexport type WalletMetadata = z.infer<typeof walletMetadataSchema>;\n\n/** Safe for display — same as metadata (no secrets stored in metadata) */\nexport const walletInfoSchema = walletMetadataSchema;\nexport type WalletInfo = z.infer<typeof walletInfoSchema>;\n"],"mappings":"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","names":[]}
@@ -0,0 +1,12 @@
1
+ import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
3
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
4
+ }) : x)(function(x) {
5
+ if (typeof require !== "undefined") return require.apply(this, arguments);
6
+ throw Error('Dynamic require of "' + x + '" is not supported');
7
+ });
8
+
9
+ export {
10
+ __require
11
+ };
12
+ //# sourceMappingURL=chunk-EEBB5MQP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}