@alchemy/cli 0.3.1 → 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.
@@ -3,23 +3,27 @@ if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
3
  import {
4
4
  getRPCNetworkIds,
5
5
  getSetupMethod
6
- } from "./chunk-QDDJ3OYO.js";
6
+ } from "./chunk-5X6YRTPU.js";
7
+ import {
8
+ getUpdateNoticeLines
9
+ } from "./chunk-DUQFOLLZ.js";
7
10
  import {
8
- bgRgb,
9
11
  bold,
10
12
  brand,
11
13
  brandedHelp,
12
14
  configDir,
13
15
  dim,
14
- getUpdateNoticeLines,
15
16
  green,
16
- isJSONMode,
17
17
  load,
18
+ setBrandedHelpSuppressed
19
+ } from "./chunk-T2XSNZE3.js";
20
+ import {
21
+ bgRgb,
22
+ isJSONMode,
18
23
  noColor,
19
24
  rgb,
20
- setBrandedHelpSuppressed,
21
25
  setReplMode
22
- } from "./chunk-6XTLILDF.js";
26
+ } from "./chunk-56ZVYB4G.js";
23
27
 
24
28
  // src/commands/interactive.ts
25
29
  import * as readline from "readline";
@@ -118,7 +122,8 @@ function formatSetupMethodLabel() {
118
122
  const method = getSetupMethod(load());
119
123
  if (method === "api_key") return "API key";
120
124
  if (method === "access_key_app") return "Access key + app";
121
- if (method === "x402_wallet") return "x402 wallet";
125
+ if (method === "x402_wallet") return "SIWx wallet";
126
+ if (method === "auth_token") return "Auth token";
122
127
  return "Not configured";
123
128
  }
124
129
  function replHistoryPath() {
@@ -1,17 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
3
  import {
4
- AdminClient,
5
4
  generateAndPersistWallet,
6
5
  importAndPersistWallet,
7
6
  selectOrCreateApp
8
- } from "./chunk-J6RZM4CJ.js";
7
+ } from "./chunk-44OGGLN4.js";
8
+ import {
9
+ getUpdateNoticeLines
10
+ } from "./chunk-DUQFOLLZ.js";
9
11
  import {
12
+ AdminClient,
10
13
  bold,
11
14
  brand,
12
15
  brandedHelp,
13
16
  dim,
14
- getUpdateNoticeLines,
15
17
  green,
16
18
  load,
17
19
  maskIf,
@@ -19,17 +21,19 @@ import {
19
21
  promptSelect,
20
22
  promptText,
21
23
  save
22
- } from "./chunk-6XTLILDF.js";
24
+ } from "./chunk-T2XSNZE3.js";
25
+ import "./chunk-56ZVYB4G.js";
23
26
 
24
27
  // src/commands/onboarding.ts
25
28
  function printNextSteps(method) {
26
29
  const commandsByMethod = {
30
+ "browser-login": ["alchemy auth"],
27
31
  "api-key": ["alchemy config set api-key <key>"],
28
32
  "access-key": [
29
33
  "alchemy config set access-key <key>",
30
34
  "alchemy config set app <app-id>"
31
35
  ],
32
- x402: [
36
+ siwx: [
33
37
  "alchemy wallet generate",
34
38
  "alchemy config set wallet-key-file <path>",
35
39
  "alchemy config set x402 true"
@@ -83,15 +87,15 @@ async function runAccessKeyOnboarding() {
83
87
  console.log(` ${green("\u2713")} Saved access key`);
84
88
  await selectOrCreateApp(new AdminClient(key.trim()));
85
89
  }
86
- async function runX402Onboarding() {
90
+ async function runSiwxOnboarding() {
87
91
  const action = await promptSelect({
88
- message: "x402 wallet setup",
92
+ message: "SIWx wallet setup",
89
93
  options: [
90
94
  { label: "Generate a new wallet", value: "generate" },
91
95
  { label: "Import wallet from key file", value: "import" }
92
96
  ],
93
97
  initialValue: "generate",
94
- cancelMessage: "Skipped x402 setup."
98
+ cancelMessage: "Skipped SIWx setup."
95
99
  });
96
100
  if (!action) return;
97
101
  const wallet = action === "generate" ? generateAndPersistWallet() : await (async () => {
@@ -105,7 +109,18 @@ async function runX402Onboarding() {
105
109
  if (!wallet) return;
106
110
  const cfg = load();
107
111
  save({ ...cfg, x402: true });
108
- console.log(` ${green("\u2713")} x402 enabled with wallet ${wallet.address}`);
112
+ console.log(` ${green("\u2713")} SIWx enabled with wallet ${wallet.address}`);
113
+ try {
114
+ const { signSiwe } = await import("@alchemy/x402");
115
+ const { readFileSync } = await import("fs");
116
+ const keyPath = wallet.keyFile;
117
+ const privateKey = readFileSync(keyPath, "utf-8").trim();
118
+ const siweToken = await signSiwe({ privateKey, expiresAfter: "1h" });
119
+ const expiresAt = new Date(Date.now() + 60 * 60 * 1e3).toISOString();
120
+ save({ ...load(), siwe_token: siweToken, siwe_token_expires_at: expiresAt });
121
+ console.log(` ${green("\u2713")} Signed SIWE token (cached for 1h)`);
122
+ } catch {
123
+ }
109
124
  }
110
125
  async function runOnboarding(_program, latestUpdate = null) {
111
126
  process.stdout.write(brandedHelp({ force: true }));
@@ -125,6 +140,11 @@ async function runOnboarding(_program, latestUpdate = null) {
125
140
  const method = await promptSelect({
126
141
  message: "Choose an auth setup path",
127
142
  options: [
143
+ {
144
+ label: "Browser login",
145
+ hint: "Log in via browser (recommended)",
146
+ value: "browser-login"
147
+ },
128
148
  {
129
149
  label: "API key",
130
150
  hint: "Query Alchemy RPC nodes",
@@ -136,16 +156,16 @@ async function runOnboarding(_program, latestUpdate = null) {
136
156
  value: "access-key"
137
157
  },
138
158
  {
139
- label: "x402",
140
- hint: "Agentic API access and payment",
141
- value: "x402"
159
+ label: "SIWx",
160
+ hint: "Sign-In with Ethereum/Solana wallet",
161
+ value: "siwx"
142
162
  },
143
163
  {
144
164
  label: "exit",
145
165
  value: "exit"
146
166
  }
147
167
  ],
148
- initialValue: "api-key",
168
+ initialValue: "browser-login",
149
169
  cancelMessage: "Skipped onboarding."
150
170
  });
151
171
  if (!method) return false;
@@ -153,6 +173,28 @@ async function runOnboarding(_program, latestUpdate = null) {
153
173
  console.log(` ${dim("Exited onboarding.")}`);
154
174
  return false;
155
175
  }
176
+ if (method === "browser-login") {
177
+ const { performBrowserLogin, AUTH_PORT, getLoginUrl } = await import("./auth-E26YCAJV.js");
178
+ console.log(` Opening browser to log in...`);
179
+ console.log(` ${dim(getLoginUrl(AUTH_PORT))}`);
180
+ console.log(` ${dim("Waiting for authentication...")}`);
181
+ try {
182
+ const result = await performBrowserLogin();
183
+ const cfg2 = load();
184
+ save({
185
+ ...cfg2,
186
+ auth_token: result.token,
187
+ auth_token_expires_at: result.expiresAt
188
+ });
189
+ console.log(` ${green("\u2713")} Logged in successfully`);
190
+ const { selectAppAfterAuth } = await import("./auth-7E33EMAI.js");
191
+ await selectAppAfterAuth(result.token);
192
+ return true;
193
+ } catch (err) {
194
+ console.log(` ${dim(`Login failed: ${err instanceof Error ? err.message : String(err)}`)}`);
195
+ return false;
196
+ }
197
+ }
156
198
  if (method === "api-key") {
157
199
  await runAPIKeyOnboarding();
158
200
  const complete2 = Boolean(load().api_key?.trim());
@@ -172,11 +214,11 @@ async function runOnboarding(_program, latestUpdate = null) {
172
214
  }
173
215
  return complete2;
174
216
  }
175
- await runX402Onboarding();
217
+ await runSiwxOnboarding();
176
218
  const cfg = load();
177
219
  const complete = cfg.x402 === true && Boolean(cfg.wallet_key_file?.trim());
178
220
  if (!complete) {
179
- printNextSteps("x402");
221
+ printNextSteps("siwx");
180
222
  }
181
223
  return complete;
182
224
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alchemy/cli",
3
- "version": "0.3.1",
3
+ "version": "0.5.0",
4
4
  "description": "Alchemy CLI — interact with blockchain data",
5
5
  "type": "module",
6
6
  "bin": {