@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.
- package/dist/auth-7E33EMAI.js +13 -0
- package/dist/auth-E26YCAJV.js +23 -0
- package/dist/chunk-44OGGLN4.js +681 -0
- package/dist/chunk-56ZVYB4G.js +536 -0
- package/dist/{chunk-QDDJ3OYO.js → chunk-5X6YRTPU.js} +15 -5
- package/dist/chunk-DUQFOLLZ.js +118 -0
- package/dist/chunk-IGD4NIK7.js +300 -0
- package/dist/chunk-LYUW7O6X.js +231 -0
- package/dist/chunk-T2XSNZE3.js +1398 -0
- package/dist/index.js +417 -204
- package/dist/{interactive-CLPT5QDZ.js → interactive-K7XOS6U6.js} +12 -7
- package/dist/{onboarding-XNAWN5BR.js → onboarding-F5PZMFZU.js} +57 -15
- package/package.json +1 -1
- package/dist/chunk-6XTLILDF.js +0 -1246
- package/dist/chunk-J6RZM4CJ.js +0 -1333
|
@@ -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-
|
|
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-
|
|
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 "
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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
|
|
90
|
+
async function runSiwxOnboarding() {
|
|
87
91
|
const action = await promptSelect({
|
|
88
|
-
message: "
|
|
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
|
|
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")}
|
|
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: "
|
|
140
|
-
hint: "
|
|
141
|
-
value: "
|
|
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: "
|
|
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
|
|
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("
|
|
221
|
+
printNextSteps("siwx");
|
|
180
222
|
}
|
|
181
223
|
return complete;
|
|
182
224
|
}
|