@moonpay/cli 0.4.2 → 0.5.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/dist/chunk-AH5VMN63.js +6608 -0
- package/dist/chunk-AH5VMN63.js.map +1 -0
- package/dist/chunk-V7MA7WNX.js +441 -0
- package/dist/chunk-V7MA7WNX.js.map +1 -0
- package/dist/index.js +145 -51
- package/dist/index.js.map +1 -1
- package/dist/{mcp-QLBMU7OH.js → mcp-VOEHXIOY.js} +66 -46
- package/dist/mcp-VOEHXIOY.js.map +1 -0
- package/dist/store-HCN56E6A.js +22 -0
- package/package.json +4 -2
- package/skills/moonpay-auth/SKILL.md +19 -28
- package/skills/moonpay-missions/SKILL.md +31 -38
- package/skills/moonpay-swap-tokens/SKILL.md +52 -42
- package/skills/moonpay-virtual-account/SKILL.md +18 -81
- package/dist/chains-R754DQM5.js +0 -13
- package/dist/chunk-AGDVU2O5.js +0 -168
- package/dist/chunk-AGDVU2O5.js.map +0 -1
- package/dist/chunk-DAQDHLPY.js +0 -2444
- package/dist/chunk-DAQDHLPY.js.map +0 -1
- package/dist/chunk-EEBB5MQP.js +0 -12
- package/dist/chunk-EEBB5MQP.js.map +0 -1
- package/dist/chunk-Z33PSOPD.js +0 -128
- package/dist/chunk-Z33PSOPD.js.map +0 -1
- package/dist/mcp-QLBMU7OH.js.map +0 -1
- package/dist/server-IUOCZFT7.js +0 -21
- package/dist/server-IUOCZFT7.js.map +0 -1
- /package/dist/{chains-R754DQM5.js.map → store-HCN56E6A.js.map} +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: moonpay-virtual-account
|
|
3
|
-
description: Set up a virtual account for fiat on
|
|
4
|
-
tags: [
|
|
3
|
+
description: Set up a virtual account for fiat on-ramp. Covers KYC, wallet registration, and onramp (fiat to stablecoin).
|
|
4
|
+
tags: [fiat]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# Virtual account (fiat on
|
|
7
|
+
# Virtual account (fiat on-ramp)
|
|
8
8
|
|
|
9
9
|
## Goal
|
|
10
10
|
|
|
11
|
-
Set up and use a MoonPay virtual account to convert
|
|
11
|
+
Set up and use a MoonPay virtual account to convert fiat (USD/EUR) to stablecoins (USDC/USDT/EURC) on Solana.
|
|
12
12
|
|
|
13
13
|
## Setup flow
|
|
14
14
|
|
|
@@ -24,7 +24,7 @@ mp virtual-account create
|
|
|
24
24
|
mp virtual-account retrieve
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
The `status` field shows where you are. The `
|
|
27
|
+
The `status` field shows where you are. The `nextStep` field tells you what to do next.
|
|
28
28
|
|
|
29
29
|
### 3. Complete KYC verification
|
|
30
30
|
|
|
@@ -33,7 +33,7 @@ The `status` field shows where you are. The `next_step` field tells you what to
|
|
|
33
33
|
mp virtual-account identification create
|
|
34
34
|
|
|
35
35
|
# Check verification status
|
|
36
|
-
mp virtual-account identification retrieve
|
|
36
|
+
mp virtual-account identification retrieve --identificationId <id>
|
|
37
37
|
|
|
38
38
|
# List all verifications
|
|
39
39
|
mp virtual-account identification list
|
|
@@ -52,23 +52,15 @@ mp virtual-account signing create --contentId <content-id>
|
|
|
52
52
|
mp virtual-account signing list
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
### 5. Register a wallet
|
|
56
|
-
|
|
57
|
-
The wallet must be verified via a signed message before it can receive funds.
|
|
55
|
+
### 5. Register a wallet (one step)
|
|
58
56
|
|
|
59
57
|
```bash
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
# Sign the message with your local wallet
|
|
64
|
-
mp message sign --wallet <address> --message "<verification-message>"
|
|
58
|
+
mp virtual-account wallet register --wallet main --chain solana
|
|
59
|
+
```
|
|
65
60
|
|
|
66
|
-
|
|
67
|
-
mp virtual-account wallet register \
|
|
68
|
-
--wallet <address> \
|
|
69
|
-
--message "<verification-message>" \
|
|
70
|
-
--signature <base58-signature>
|
|
61
|
+
This creates the verification message, signs it locally, and registers — all in one command.
|
|
71
62
|
|
|
63
|
+
```bash
|
|
72
64
|
# List registered wallets
|
|
73
65
|
mp virtual-account wallet list
|
|
74
66
|
```
|
|
@@ -76,17 +68,18 @@ mp virtual-account wallet list
|
|
|
76
68
|
## Onramp (fiat to stablecoin)
|
|
77
69
|
|
|
78
70
|
```bash
|
|
79
|
-
# Create an onramp
|
|
71
|
+
# Create an onramp (specify which registered wallet receives funds)
|
|
80
72
|
mp virtual-account onramp create \
|
|
81
73
|
--name "My Onramp" \
|
|
82
74
|
--fiat USD \
|
|
83
|
-
--stablecoin USDC
|
|
75
|
+
--stablecoin USDC \
|
|
76
|
+
--wallet <registered-wallet-address>
|
|
84
77
|
|
|
85
78
|
# Get onramp details (includes bank info for wire/ACH)
|
|
86
79
|
mp virtual-account onramp retrieve --onrampId <id>
|
|
87
80
|
|
|
88
81
|
# List onramps
|
|
89
|
-
mp virtual-account onramp list --status
|
|
82
|
+
mp virtual-account onramp list --status Approved
|
|
90
83
|
|
|
91
84
|
# Create an open banking payment
|
|
92
85
|
mp virtual-account onramp payment create \
|
|
@@ -100,59 +93,6 @@ mp virtual-account onramp payment retrieve \
|
|
|
100
93
|
--paymentId <payment-id>
|
|
101
94
|
```
|
|
102
95
|
|
|
103
|
-
## Offramp (stablecoin to fiat)
|
|
104
|
-
|
|
105
|
-
### Register a bank account first
|
|
106
|
-
|
|
107
|
-
```bash
|
|
108
|
-
# USD bank account
|
|
109
|
-
mp virtual-account bank-account usd register \
|
|
110
|
-
--type ACH \
|
|
111
|
-
--accountNumber <number> \
|
|
112
|
-
--routingNumber <number> \
|
|
113
|
-
--address "123 Main St" \
|
|
114
|
-
--email user@example.com \
|
|
115
|
-
--phoneNumber "+1..." \
|
|
116
|
-
--providerCountry US \
|
|
117
|
-
--providerName "Bank Name" \
|
|
118
|
-
--givenName "First" \
|
|
119
|
-
--familyName "Last"
|
|
120
|
-
|
|
121
|
-
# EUR bank account
|
|
122
|
-
mp virtual-account bank-account eur register \
|
|
123
|
-
--iban <iban> \
|
|
124
|
-
--address "123 Main St" \
|
|
125
|
-
--email user@example.com \
|
|
126
|
-
--phoneNumber "+1..." \
|
|
127
|
-
--providerCountry DE \
|
|
128
|
-
--providerName "Bank Name" \
|
|
129
|
-
--givenName "First" \
|
|
130
|
-
--familyName "Last"
|
|
131
|
-
|
|
132
|
-
# List bank accounts
|
|
133
|
-
mp virtual-account bank-account list
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### Create and execute offramp
|
|
137
|
-
|
|
138
|
-
```bash
|
|
139
|
-
# Create offramp
|
|
140
|
-
mp virtual-account offramp create \
|
|
141
|
-
--name "My Offramp" \
|
|
142
|
-
--fiat USD \
|
|
143
|
-
--stablecoin USDC
|
|
144
|
-
|
|
145
|
-
# Build the send transaction
|
|
146
|
-
mp virtual-account offramp initiate \
|
|
147
|
-
--offrampId <id> \
|
|
148
|
-
--wallet <address> \
|
|
149
|
-
--amount 100
|
|
150
|
-
|
|
151
|
-
# Sign and send the transaction
|
|
152
|
-
mp transaction sign --transaction <base64-tx> --wallet <address>
|
|
153
|
-
mp transaction send --transaction <signed-tx> --message "Offramp 100 USDC"
|
|
154
|
-
```
|
|
155
|
-
|
|
156
96
|
## Other commands
|
|
157
97
|
|
|
158
98
|
```bash
|
|
@@ -161,13 +101,10 @@ mp virtual-account transaction list
|
|
|
161
101
|
|
|
162
102
|
# Delete account
|
|
163
103
|
mp virtual-account delete
|
|
164
|
-
|
|
165
|
-
# Delete a bank account
|
|
166
|
-
mp virtual-account bank-account delete --bankAccountId <id>
|
|
167
104
|
```
|
|
168
105
|
|
|
169
106
|
## Related skills
|
|
170
107
|
|
|
171
|
-
- **moonpay-auth** — Login and wallet setup (required before virtual account)
|
|
172
|
-
- **moonpay-check-wallet** — Check stablecoin balances
|
|
173
|
-
- **moonpay-swap-tokens** — Swap
|
|
108
|
+
- **moonpay-auth** — Login and wallet setup (required before virtual account)
|
|
109
|
+
- **moonpay-check-wallet** — Check stablecoin balances
|
|
110
|
+
- **moonpay-swap-tokens** — Swap or bridge stablecoins after onramp
|
package/dist/chains-R754DQM5.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
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
|
package/dist/chunk-AGDVU2O5.js
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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":[]}
|