@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.
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  name: moonpay-virtual-account
3
- description: Set up a virtual account for fiat on/off-ramp. Covers KYC, bank accounts, onramp (fiat to stablecoin), offramp (stablecoin to fiat), and wallet registration.
4
- tags: [defi]
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/off-ramp)
7
+ # Virtual account (fiat on-ramp)
8
8
 
9
9
  ## Goal
10
10
 
11
- Set up and use a MoonPay virtual account to convert between fiat (USD/EUR) and stablecoins (USDC/USDT/EURC) on Solana. Covers the full lifecycle: account creation, KYC, bank account registration, onramp, and offramp.
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 `next_step` field tells you what to do next.
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
- # Create verification message
61
- mp virtual-account wallet registration-message create --wallet <address>
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
- # Register the wallet with the signature
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 Created
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 stablecoins for other tokens after onramp.
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
@@ -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
@@ -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":[]}