@fastxyz/cli 1.0.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/LICENSE +21 -0
- package/README.md +57 -0
- package/dist/_esm-PAFIJ3CY.js +3659 -0
- package/dist/app-IJ6QEQ2I.js +20 -0
- package/dist/ccip-25L4RSNC.js +15 -0
- package/dist/chunk-5U55A5N6.js +2248 -0
- package/dist/chunk-77HVPD4G.js +43 -0
- package/dist/chunk-FLS2KI2D.js +146 -0
- package/dist/chunk-MIRQRJSD.js +173 -0
- package/dist/chunk-MWATGKBS.js +409 -0
- package/dist/chunk-T7HRTMD7.js +370 -0
- package/dist/chunk-VOHYNW3B.js +6323 -0
- package/dist/database-NXA7GQKE.js +10 -0
- package/dist/main.js +19084 -0
- package/dist/network-5PLYLKX3.js +10 -0
- package/dist/secp256k1-CWQX754O.js +17 -0
- package/package.json +45 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
__export
|
|
4
|
+
} from "./chunk-77HVPD4G.js";
|
|
5
|
+
|
|
6
|
+
// src/services/storage/database.ts
|
|
7
|
+
import { chmodSync, existsSync, mkdirSync } from "fs";
|
|
8
|
+
import { homedir } from "os";
|
|
9
|
+
import { dirname, join } from "path";
|
|
10
|
+
import { fileURLToPath } from "url";
|
|
11
|
+
import Database from "better-sqlite3";
|
|
12
|
+
import {
|
|
13
|
+
drizzle
|
|
14
|
+
} from "drizzle-orm/better-sqlite3";
|
|
15
|
+
import { migrate } from "drizzle-orm/better-sqlite3/migrator";
|
|
16
|
+
import { Context, Effect, Layer } from "effect";
|
|
17
|
+
|
|
18
|
+
// src/db/schema.ts
|
|
19
|
+
var schema_exports = {};
|
|
20
|
+
__export(schema_exports, {
|
|
21
|
+
accounts: () => accounts,
|
|
22
|
+
customNetworks: () => customNetworks,
|
|
23
|
+
history: () => history,
|
|
24
|
+
metadata: () => metadata
|
|
25
|
+
});
|
|
26
|
+
import {
|
|
27
|
+
blob,
|
|
28
|
+
index,
|
|
29
|
+
integer,
|
|
30
|
+
sqliteTable,
|
|
31
|
+
text
|
|
32
|
+
} from "drizzle-orm/sqlite-core";
|
|
33
|
+
var accounts = sqliteTable("accounts", {
|
|
34
|
+
name: text("name").primaryKey(),
|
|
35
|
+
fastAddress: text("fast_address").notNull(),
|
|
36
|
+
evmAddress: text("evm_address").notNull(),
|
|
37
|
+
encryptedKey: blob("encrypted_key", { mode: "buffer" }).notNull(),
|
|
38
|
+
encrypted: integer("encrypted", { mode: "boolean" }).notNull().default(true),
|
|
39
|
+
isDefault: integer("is_default", { mode: "boolean" }).notNull().default(false),
|
|
40
|
+
createdAt: text("created_at").notNull()
|
|
41
|
+
});
|
|
42
|
+
var history = sqliteTable(
|
|
43
|
+
"history",
|
|
44
|
+
{
|
|
45
|
+
hash: text("hash").primaryKey(),
|
|
46
|
+
type: text("type").notNull().default("transfer"),
|
|
47
|
+
from: text("from").notNull(),
|
|
48
|
+
to: text("to").notNull(),
|
|
49
|
+
amount: text("amount").notNull(),
|
|
50
|
+
formatted: text("formatted").notNull(),
|
|
51
|
+
tokenName: text("token_name").notNull(),
|
|
52
|
+
tokenId: text("token_id").notNull(),
|
|
53
|
+
network: text("network").notNull(),
|
|
54
|
+
status: text("status").notNull(),
|
|
55
|
+
timestamp: text("timestamp").notNull(),
|
|
56
|
+
explorerUrl: text("explorer_url"),
|
|
57
|
+
route: text("route").notNull().default("fast"),
|
|
58
|
+
chainId: integer("chain_id")
|
|
59
|
+
},
|
|
60
|
+
(table) => [index("idx_history_timestamp").on(table.timestamp)]
|
|
61
|
+
);
|
|
62
|
+
var customNetworks = sqliteTable("custom_networks", {
|
|
63
|
+
name: text("name").primaryKey(),
|
|
64
|
+
config: text("config").notNull()
|
|
65
|
+
});
|
|
66
|
+
var metadata = sqliteTable("metadata", {
|
|
67
|
+
key: text("key").primaryKey(),
|
|
68
|
+
value: text("value").notNull()
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// src/errors/account.ts
|
|
72
|
+
import { Data } from "effect";
|
|
73
|
+
var AccountExistsError = class extends Data.TaggedError("AccountExistsError") {
|
|
74
|
+
exitCode = 2;
|
|
75
|
+
errorCode = "ACCOUNT_EXISTS";
|
|
76
|
+
get message() {
|
|
77
|
+
return `Account "${this.name}" already exists`;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
var AccountNotFoundError = class extends Data.TaggedError(
|
|
81
|
+
"AccountNotFoundError"
|
|
82
|
+
) {
|
|
83
|
+
exitCode = 2;
|
|
84
|
+
errorCode = "ACCOUNT_NOT_FOUND";
|
|
85
|
+
get message() {
|
|
86
|
+
return `Account "${this.name}" not found`;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
var NoDefaultAccountError = class extends Data.TaggedError(
|
|
90
|
+
"NoDefaultAccountError"
|
|
91
|
+
) {
|
|
92
|
+
exitCode = 2;
|
|
93
|
+
errorCode = "NO_DEFAULT_ACCOUNT";
|
|
94
|
+
get message() {
|
|
95
|
+
return "No default account found. Create one with `fast account create` or set a default with `fast account set-default`.";
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
var DefaultAccountError = class extends Data.TaggedError(
|
|
99
|
+
"DefaultAccountError"
|
|
100
|
+
) {
|
|
101
|
+
exitCode = 2;
|
|
102
|
+
errorCode = "DEFAULT_ACCOUNT";
|
|
103
|
+
get message() {
|
|
104
|
+
return `Cannot delete "${this.name}" because it is the default account. Use \`fast account set-default\` first.`;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
var PasswordRequiredError = class extends Data.TaggedError(
|
|
108
|
+
"PasswordRequiredError"
|
|
109
|
+
) {
|
|
110
|
+
exitCode = 2;
|
|
111
|
+
errorCode = "PASSWORD_REQUIRED";
|
|
112
|
+
get message() {
|
|
113
|
+
return "Password required. Use --password, FAST_PASSWORD env var, or run in interactive mode.";
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
var WrongPasswordError = class extends Data.TaggedError("WrongPasswordError") {
|
|
117
|
+
exitCode = 2;
|
|
118
|
+
errorCode = "WRONG_PASSWORD";
|
|
119
|
+
get message() {
|
|
120
|
+
return "Incorrect password";
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
// src/errors/io.ts
|
|
125
|
+
import { Data as Data2 } from "effect";
|
|
126
|
+
var DatabaseError = class extends Data2.TaggedError("DatabaseError") {
|
|
127
|
+
exitCode = 1;
|
|
128
|
+
errorCode = "DATABASE_ERROR";
|
|
129
|
+
};
|
|
130
|
+
var FileIOError = class extends Data2.TaggedError("FileIOError") {
|
|
131
|
+
exitCode = 1;
|
|
132
|
+
errorCode = "FILE_IO_ERROR";
|
|
133
|
+
};
|
|
134
|
+
var InternalError = class extends Data2.TaggedError("InternalError") {
|
|
135
|
+
exitCode = 1;
|
|
136
|
+
errorCode = "INTERNAL_ERROR";
|
|
137
|
+
};
|
|
138
|
+
var FastSdkError = class extends Data2.TaggedError("FastSdkError") {
|
|
139
|
+
exitCode = 1;
|
|
140
|
+
errorCode = "FAST_SDK_ERROR";
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// src/errors/network.ts
|
|
144
|
+
import { Data as Data3 } from "effect";
|
|
145
|
+
var NetworkExistsError = class extends Data3.TaggedError("NetworkExistsError") {
|
|
146
|
+
exitCode = 2;
|
|
147
|
+
errorCode = "NETWORK_EXISTS";
|
|
148
|
+
get message() {
|
|
149
|
+
return `Network "${this.name}" already exists`;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
var NetworkNotFoundError = class extends Data3.TaggedError(
|
|
153
|
+
"NetworkNotFoundError"
|
|
154
|
+
) {
|
|
155
|
+
exitCode = 2;
|
|
156
|
+
errorCode = "NETWORK_NOT_FOUND";
|
|
157
|
+
get message() {
|
|
158
|
+
return `Network "${this.name}" not found`;
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
var DefaultNetworkError = class extends Data3.TaggedError(
|
|
162
|
+
"DefaultNetworkError"
|
|
163
|
+
) {
|
|
164
|
+
exitCode = 2;
|
|
165
|
+
errorCode = "DEFAULT_NETWORK";
|
|
166
|
+
get message() {
|
|
167
|
+
return `Cannot remove "${this.name}" because it is the default network. Use \`fast network set-default\` first.`;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
var NoDefaultNetworkError = class extends Data3.TaggedError(
|
|
171
|
+
"NoDefaultNetworkError"
|
|
172
|
+
) {
|
|
173
|
+
exitCode = 2;
|
|
174
|
+
errorCode = "NO_DEFAULT_NETWORK";
|
|
175
|
+
get message() {
|
|
176
|
+
return "No default network set. Use `fast network set-default <name>` to set one.";
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
var ReservedNameError = class extends Data3.TaggedError("ReservedNameError") {
|
|
180
|
+
exitCode = 2;
|
|
181
|
+
errorCode = "RESERVED_NAME";
|
|
182
|
+
get message() {
|
|
183
|
+
return `"${this.name}" is a reserved name and cannot be modified`;
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
var InvalidNetworkConfigError = class extends Data3.TaggedError(
|
|
187
|
+
"InvalidNetworkConfigError"
|
|
188
|
+
) {
|
|
189
|
+
exitCode = 2;
|
|
190
|
+
errorCode = "INVALID_NETWORK_CONFIG";
|
|
191
|
+
get message() {
|
|
192
|
+
return `Invalid network config for "${this.name}"`;
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
var UnsupportedChainError = class extends Data3.TaggedError(
|
|
196
|
+
"UnsupportedChainError"
|
|
197
|
+
) {
|
|
198
|
+
exitCode = 2;
|
|
199
|
+
errorCode = "UNSUPPORTED_CHAIN";
|
|
200
|
+
get message() {
|
|
201
|
+
return `Unsupported chain "${this.chain}". Run \`fast info bridge-chains\` to list supported chains.`;
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
// src/errors/payment.ts
|
|
206
|
+
import { Data as Data4 } from "effect";
|
|
207
|
+
var PaymentRejectedError = class extends Data4.TaggedError(
|
|
208
|
+
"PaymentRejectedError"
|
|
209
|
+
) {
|
|
210
|
+
exitCode = 6;
|
|
211
|
+
errorCode = "PAYMENT_REJECTED";
|
|
212
|
+
};
|
|
213
|
+
var PaymentFailedError = class extends Data4.TaggedError(
|
|
214
|
+
"PaymentFailedError"
|
|
215
|
+
) {
|
|
216
|
+
exitCode = 1;
|
|
217
|
+
errorCode = "PAYMENT_FAILED";
|
|
218
|
+
};
|
|
219
|
+
var InvalidPaymentLinkError = class extends Data4.TaggedError(
|
|
220
|
+
"InvalidPaymentLinkError"
|
|
221
|
+
) {
|
|
222
|
+
exitCode = 2;
|
|
223
|
+
errorCode = "INVALID_PAYMENT_LINK";
|
|
224
|
+
};
|
|
225
|
+
var InsufficientPaymentBalanceError = class extends Data4.TaggedError(
|
|
226
|
+
"InsufficientPaymentBalanceError"
|
|
227
|
+
) {
|
|
228
|
+
exitCode = 4;
|
|
229
|
+
errorCode = "INSUFFICIENT_PAYMENT_BALANCE";
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
// src/errors/transaction.ts
|
|
233
|
+
import { Data as Data5 } from "effect";
|
|
234
|
+
var TxNotFoundError = class extends Data5.TaggedError("TxNotFoundError") {
|
|
235
|
+
exitCode = 1;
|
|
236
|
+
errorCode = "TX_NOT_FOUND";
|
|
237
|
+
get message() {
|
|
238
|
+
return `Transaction not found: ${this.hash}`;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
var TransactionFailedError = class extends Data5.TaggedError(
|
|
242
|
+
"TransactionFailedError"
|
|
243
|
+
) {
|
|
244
|
+
exitCode = 2;
|
|
245
|
+
errorCode = "TX_FAILED";
|
|
246
|
+
};
|
|
247
|
+
var InvalidAddressError = class extends Data5.TaggedError(
|
|
248
|
+
"InvalidAddressError"
|
|
249
|
+
) {
|
|
250
|
+
exitCode = 2;
|
|
251
|
+
errorCode = "INVALID_ADDRESS";
|
|
252
|
+
};
|
|
253
|
+
var InvalidAmountError = class extends Data5.TaggedError("InvalidAmountError") {
|
|
254
|
+
exitCode = 2;
|
|
255
|
+
errorCode = "INVALID_AMOUNT";
|
|
256
|
+
};
|
|
257
|
+
var InsufficientBalanceError = class extends Data5.TaggedError(
|
|
258
|
+
"InsufficientBalanceError"
|
|
259
|
+
) {
|
|
260
|
+
exitCode = 2;
|
|
261
|
+
errorCode = "INSUFFICIENT_BALANCE";
|
|
262
|
+
};
|
|
263
|
+
var InsufficientGasError = class extends Data5.TaggedError(
|
|
264
|
+
"InsufficientGasError"
|
|
265
|
+
) {
|
|
266
|
+
exitCode = 2;
|
|
267
|
+
errorCode = "INSUFFICIENT_GAS";
|
|
268
|
+
};
|
|
269
|
+
var TokenNotFoundError = class extends Data5.TaggedError("TokenNotFoundError") {
|
|
270
|
+
exitCode = 2;
|
|
271
|
+
errorCode = "TOKEN_NOT_FOUND";
|
|
272
|
+
get message() {
|
|
273
|
+
return `Unknown token "${this.token}". Run \`fast info bridge-tokens\` to list supported tokens.`;
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
var FundingRequiredError = class extends Data5.TaggedError(
|
|
277
|
+
"FundingRequiredError"
|
|
278
|
+
) {
|
|
279
|
+
exitCode = 4;
|
|
280
|
+
errorCode = "FUNDING_REQUIRED";
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
// src/errors/usage.ts
|
|
284
|
+
import { Data as Data6 } from "effect";
|
|
285
|
+
var InvalidUsageError = class extends Data6.TaggedError("InvalidUsageError") {
|
|
286
|
+
exitCode = 2;
|
|
287
|
+
errorCode = "INVALID_USAGE";
|
|
288
|
+
};
|
|
289
|
+
var NotImplementedError = class extends Data6.TaggedError(
|
|
290
|
+
"NotImplementedError"
|
|
291
|
+
) {
|
|
292
|
+
exitCode = 2;
|
|
293
|
+
errorCode = "NOT_IMPLEMENTED";
|
|
294
|
+
};
|
|
295
|
+
var UserCancelledError = class extends Data6.TaggedError("UserCancelledError") {
|
|
296
|
+
exitCode = 2;
|
|
297
|
+
errorCode = "USER_CANCELLED";
|
|
298
|
+
get message() {
|
|
299
|
+
return "Operation cancelled by user";
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
// src/services/storage/database.ts
|
|
304
|
+
var FAST_DIR = join(homedir(), ".fast");
|
|
305
|
+
var DB_PATH = join(FAST_DIR, "fast.db");
|
|
306
|
+
var DatabaseService = class extends Context.Tag("Database")() {
|
|
307
|
+
};
|
|
308
|
+
var DatabaseLive = Layer.sync(DatabaseService, () => {
|
|
309
|
+
mkdirSync(FAST_DIR, { recursive: true, mode: 448 });
|
|
310
|
+
try {
|
|
311
|
+
chmodSync(FAST_DIR, 448);
|
|
312
|
+
} catch {
|
|
313
|
+
}
|
|
314
|
+
const sqlite = new Database(DB_PATH);
|
|
315
|
+
sqlite.pragma("journal_mode = WAL");
|
|
316
|
+
sqlite.pragma("foreign_keys = ON");
|
|
317
|
+
const db = drizzle(sqlite, { schema: schema_exports });
|
|
318
|
+
const __dir = dirname(fileURLToPath(import.meta.url));
|
|
319
|
+
const migrationsFolder = [join(__dir, "../../../drizzle"), join(__dir, "../drizzle")].find(
|
|
320
|
+
(p) => existsSync(join(p, "meta/_journal.json"))
|
|
321
|
+
);
|
|
322
|
+
if (!migrationsFolder) {
|
|
323
|
+
throw new Error("Could not locate Drizzle migrations folder");
|
|
324
|
+
}
|
|
325
|
+
migrate(db, { migrationsFolder });
|
|
326
|
+
db.insert(metadata).values({ key: "default_network", value: "mainnet" }).onConflictDoNothing().run();
|
|
327
|
+
return {
|
|
328
|
+
query: (fn, message) => Effect.try({
|
|
329
|
+
try: () => fn(db),
|
|
330
|
+
catch: (cause) => new DatabaseError({ message, cause })
|
|
331
|
+
})
|
|
332
|
+
};
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
export {
|
|
336
|
+
AccountExistsError,
|
|
337
|
+
AccountNotFoundError,
|
|
338
|
+
NoDefaultAccountError,
|
|
339
|
+
DefaultAccountError,
|
|
340
|
+
PasswordRequiredError,
|
|
341
|
+
WrongPasswordError,
|
|
342
|
+
DatabaseError,
|
|
343
|
+
FileIOError,
|
|
344
|
+
InternalError,
|
|
345
|
+
FastSdkError,
|
|
346
|
+
NetworkExistsError,
|
|
347
|
+
NetworkNotFoundError,
|
|
348
|
+
DefaultNetworkError,
|
|
349
|
+
NoDefaultNetworkError,
|
|
350
|
+
ReservedNameError,
|
|
351
|
+
InvalidNetworkConfigError,
|
|
352
|
+
UnsupportedChainError,
|
|
353
|
+
PaymentRejectedError,
|
|
354
|
+
PaymentFailedError,
|
|
355
|
+
InvalidPaymentLinkError,
|
|
356
|
+
TxNotFoundError,
|
|
357
|
+
TransactionFailedError,
|
|
358
|
+
InvalidAddressError,
|
|
359
|
+
InvalidAmountError,
|
|
360
|
+
TokenNotFoundError,
|
|
361
|
+
FundingRequiredError,
|
|
362
|
+
InvalidUsageError,
|
|
363
|
+
UserCancelledError,
|
|
364
|
+
accounts,
|
|
365
|
+
history,
|
|
366
|
+
customNetworks,
|
|
367
|
+
metadata,
|
|
368
|
+
DatabaseService,
|
|
369
|
+
DatabaseLive
|
|
370
|
+
};
|