@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.
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
9
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
10
+ }) : x)(function(x) {
11
+ if (typeof require !== "undefined") return require.apply(this, arguments);
12
+ throw Error('Dynamic require of "' + x + '" is not supported');
13
+ });
14
+ var __commonJS = (cb, mod) => function __require2() {
15
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
16
+ };
17
+ var __export = (target, all) => {
18
+ for (var name in all)
19
+ __defProp(target, name, { get: all[name], enumerable: true });
20
+ };
21
+ var __copyProps = (to, from, except, desc) => {
22
+ if (from && typeof from === "object" || typeof from === "function") {
23
+ for (let key of __getOwnPropNames(from))
24
+ if (!__hasOwnProp.call(to, key) && key !== except)
25
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
26
+ }
27
+ return to;
28
+ };
29
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
30
+ // If the importer is in node compatibility mode or this is not an ESM
31
+ // file that has been converted to a CommonJS file using a Babel-
32
+ // compatible transform (i.e. "__esModule" has not been set), then set
33
+ // "default" to the CommonJS "module.exports" for node compatibility.
34
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
35
+ mod
36
+ ));
37
+
38
+ export {
39
+ __require,
40
+ __commonJS,
41
+ __export,
42
+ __toESM
43
+ };
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ AppConfig,
4
+ NetworkConfigSchema
5
+ } from "./chunk-MIRQRJSD.js";
6
+ import {
7
+ DatabaseService,
8
+ DefaultNetworkError,
9
+ FileIOError,
10
+ InvalidNetworkConfigError,
11
+ NetworkExistsError,
12
+ NetworkNotFoundError,
13
+ NoDefaultNetworkError,
14
+ ReservedNameError,
15
+ customNetworks,
16
+ metadata
17
+ } from "./chunk-T7HRTMD7.js";
18
+
19
+ // src/services/storage/network.ts
20
+ import { readFileSync } from "fs";
21
+ import { eq } from "drizzle-orm";
22
+ import { Effect, Schema } from "effect";
23
+ var getDefaultNetwork = (db) => db.select().from(metadata).where(eq(metadata.key, "default_network")).get();
24
+ var listCustomNetworks = (db) => db.select({ name: customNetworks.name }).from(customNetworks).all();
25
+ var getCustomNetwork = (db, name) => db.select().from(customNetworks).where(eq(customNetworks.name, name)).get();
26
+ var setDefaultNetwork = (db, name) => db.insert(metadata).values({ key: "default_network", value: name }).onConflictDoUpdate({ target: metadata.key, set: { value: name } }).run();
27
+ var deleteCustomNetwork = (db, name) => db.delete(customNetworks).where(eq(customNetworks.name, name)).run();
28
+ var getDefault = (handle) => Effect.flatMap(
29
+ handle.query(
30
+ (db) => getDefaultNetwork(db),
31
+ "Failed to get default network"
32
+ ),
33
+ (row) => row?.value !== void 0 ? Effect.succeed(row.value) : Effect.fail(new NoDefaultNetworkError())
34
+ );
35
+ var resolve = (context, name) => Effect.gen(function* () {
36
+ const bundled = context.config.getBundledNetwork(name);
37
+ if (bundled) return bundled;
38
+ const row = yield* context.handle.query(
39
+ (db) => getCustomNetwork(db, name),
40
+ "Failed to get network config"
41
+ );
42
+ if (!row) {
43
+ return yield* Effect.fail(new NetworkNotFoundError({ name }));
44
+ }
45
+ const json = JSON.parse(row.config);
46
+ return yield* Schema.decodeUnknown(NetworkConfigSchema)(json).pipe(
47
+ Effect.mapError(() => new InvalidNetworkConfigError({ name }))
48
+ );
49
+ });
50
+ var list = (context) => Effect.gen(function* () {
51
+ const defaultName = yield* getDefault(context.handle);
52
+ const customRows = yield* context.handle.query(
53
+ (db) => listCustomNetworks(db),
54
+ "Failed to list networks"
55
+ );
56
+ const names = [
57
+ ...Object.keys(context.config.bundledNetworks),
58
+ ...customRows.map((r) => r.name)
59
+ ];
60
+ return names.map((name) => {
61
+ const type = context.config.isBundledNetwork(name) ? "bundled" : "custom";
62
+ const isDefault = name === defaultName;
63
+ return { name, type, isDefault };
64
+ });
65
+ });
66
+ var setDefault = (context, name) => Effect.gen(function* () {
67
+ if (!context.config.isBundledNetwork(name)) {
68
+ const row = yield* context.handle.query(
69
+ (db) => getCustomNetwork(db, name),
70
+ "Failed to get network config"
71
+ );
72
+ if (!row) return yield* Effect.fail(new NetworkNotFoundError({ name }));
73
+ }
74
+ yield* context.handle.query(
75
+ (db) => setDefaultNetwork(db, name),
76
+ "Failed to set default network"
77
+ );
78
+ });
79
+ var add = (context, name, configPath) => Effect.gen(function* () {
80
+ if (context.config.isBundledNetwork(name)) {
81
+ return yield* Effect.fail(new ReservedNameError({ name }));
82
+ }
83
+ const existing = yield* context.handle.query(
84
+ (db) => getCustomNetwork(db, name),
85
+ "Failed to check existing networks"
86
+ );
87
+ if (existing) {
88
+ return yield* Effect.fail(new NetworkExistsError({ name }));
89
+ }
90
+ const raw = yield* Effect.try({
91
+ try: () => readFileSync(configPath, "utf-8"),
92
+ catch: (cause) => new FileIOError({
93
+ message: `Failed to read network config file at "${configPath}"`,
94
+ cause
95
+ })
96
+ });
97
+ yield* Schema.decodeUnknown(NetworkConfigSchema)(JSON.parse(raw)).pipe(
98
+ Effect.mapError(() => new InvalidNetworkConfigError({ name }))
99
+ );
100
+ yield* context.handle.query(
101
+ (db) => db.insert(customNetworks).values({ name, config: raw }).run(),
102
+ "Failed to save network config"
103
+ );
104
+ });
105
+ var remove = (context, name) => Effect.gen(function* () {
106
+ if (context.config.isBundledNetwork(name)) {
107
+ return yield* Effect.fail(new ReservedNameError({ name }));
108
+ }
109
+ const row = yield* context.handle.query(
110
+ (db) => getCustomNetwork(db, name),
111
+ "Failed to check network exists"
112
+ );
113
+ if (!row) {
114
+ return yield* Effect.fail(new NetworkNotFoundError({ name }));
115
+ }
116
+ const defaultName = yield* getDefault(context.handle);
117
+ if (defaultName === name) {
118
+ return yield* Effect.fail(new DefaultNetworkError({ name }));
119
+ }
120
+ yield* context.handle.query(
121
+ (db) => deleteCustomNetwork(db, name),
122
+ "Failed to remove network"
123
+ );
124
+ });
125
+ var ServiceEffect = Effect.gen(function* () {
126
+ const handle = yield* DatabaseService;
127
+ const config = yield* AppConfig;
128
+ const context = { handle, config };
129
+ return {
130
+ resolve: (name) => resolve(context, name),
131
+ list: () => list(context),
132
+ setDefault: (name) => setDefault(context, name),
133
+ add: (name, configPath) => add(context, name, configPath),
134
+ remove: (name) => remove(context, name),
135
+ getDefault: () => getDefault(context.handle)
136
+ };
137
+ });
138
+ var NetworkConfigService = class extends Effect.Service()(
139
+ "NetworkConfigService",
140
+ { effect: ServiceEffect }
141
+ ) {
142
+ };
143
+
144
+ export {
145
+ NetworkConfigService
146
+ };
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/services/config/app.ts
4
+ import { Context, Layer, Schema as Schema2 } from "effect";
5
+
6
+ // src/config/app.json
7
+ var app_default = {
8
+ name: "fast",
9
+ version: "1.0.0"
10
+ };
11
+
12
+ // src/config/networks.json
13
+ var networks_default = {
14
+ testnet: {
15
+ rpcUrl: "https://testnet.api.fast.xyz/proxy",
16
+ explorerUrl: "https://testnet.explorer.fast.xyz",
17
+ networkId: "fast:testnet",
18
+ allSet: {
19
+ crossSignUrl: "https://testnet.cross-sign.allset.fast.xyz",
20
+ portalApiUrl: "https://testnet.allset.fast.xyz/api",
21
+ chains: {
22
+ "arbitrum-sepolia": {
23
+ chainId: 421614,
24
+ bridgeContract: "0xb53600976275D6f541a3B929328d07714EFA581F",
25
+ fastBridgeAddress: "fast1tkmtqxulhnzeeg9zhuwxy3x95wr7waytm9cq40ndf7tkuwwcc6jseg24j8",
26
+ relayerUrl: "https://testnet.allset.fast.xyz/arbitrum-sepolia/relayer",
27
+ evmRpcUrl: "https://lb.drpc.live/arbitrum-sepolia/Av_ucIUlR08slbBUFg1E4U0n6sODvwMR8JF6QmlfqV1j",
28
+ evmExplorerUrl: "https://sepolia.arbiscan.io",
29
+ tokens: {
30
+ testUSDC: {
31
+ evmAddress: "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d",
32
+ fastTokenId: "0xd73a0679a2be46981e2a8aedecd951c8b6690e7d5f8502b34ed3ff4cc2163b46",
33
+ decimals: 6
34
+ }
35
+ }
36
+ },
37
+ "ethereum-sepolia": {
38
+ chainId: 11155111,
39
+ bridgeContract: "0xb53600976275D6f541a3B929328d07714EFA581F",
40
+ fastBridgeAddress: "fast1fxtkgpwcy7hnakw96gg7relph4wxx7ghrukm723p3l9adxuxljzsc6f958",
41
+ relayerUrl: "https://testnet.allset.fast.xyz/ethereum-sepolia/relayer",
42
+ evmRpcUrl: "https://lb.drpc.live/sepolia/Av_ucIUlR08slbBUFg1E4U0n6sODvwMR8JF6QmlfqV1j",
43
+ evmExplorerUrl: "https://sepolia.etherscan.io",
44
+ tokens: {
45
+ testUSDC: {
46
+ evmAddress: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
47
+ fastTokenId: "0xd73a0679a2be46981e2a8aedecd951c8b6690e7d5f8502b34ed3ff4cc2163b46",
48
+ decimals: 6
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+ },
55
+ mainnet: {
56
+ rpcUrl: "https://api.fast.xyz/proxy",
57
+ explorerUrl: "https://explorer.fast.xyz",
58
+ networkId: "fast:mainnet",
59
+ allSet: {
60
+ crossSignUrl: "https://cross-sign.allset.fast.xyz",
61
+ portalApiUrl: "https://allset.fast.xyz/api",
62
+ chains: {
63
+ ethereum: {
64
+ chainId: 1,
65
+ bridgeContract: "0x8677EdAA374b7A47ff0093947AABE4aCbB2D4538",
66
+ fastBridgeAddress: "fast1x8xphxc78pdaljjs0reh7xpp8xv6pnhyq2pmnmumne49axtjwm4seau7c8",
67
+ relayerUrl: "https://allset.fast.xyz/ethereum/relayer",
68
+ evmRpcUrl: "https://lb.drpc.live/ethereum/Av_ucIUlR08slbBUFg1E4U0n6sODvwMR8JF6QmlfqV1j",
69
+ evmExplorerUrl: "https://etherscan.io",
70
+ tokens: {
71
+ USDC: {
72
+ evmAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
73
+ fastTokenId: "0xc655a12330da6af361d281b197996d2bc135aaed3b66278e729c2222291e9130",
74
+ decimals: 6
75
+ }
76
+ }
77
+ },
78
+ arbitrum: {
79
+ chainId: 42161,
80
+ bridgeContract: "0x8677EdAA374b7A47ff0093947AABE4aCbB2D4538",
81
+ fastBridgeAddress: "fast1xzuzv3p3zl8pljk5cyq3xn0vpjj9jmhk53zlcv56mu04gwkg256s6ewung",
82
+ relayerUrl: "https://allset.fast.xyz/arbitrum/relayer",
83
+ evmRpcUrl: "https://lb.drpc.live/arbitrum/Av_ucIUlR08slbBUFg1E4U0n6sODvwMR8JF6QmlfqV1j",
84
+ evmExplorerUrl: "https://arbiscan.io",
85
+ tokens: {
86
+ USDC: {
87
+ evmAddress: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
88
+ fastTokenId: "0xc655a12330da6af361d281b197996d2bc135aaed3b66278e729c2222291e9130",
89
+ decimals: 6
90
+ }
91
+ }
92
+ },
93
+ base: {
94
+ chainId: 8453,
95
+ bridgeContract: "0x8677EdAA374b7A47ff0093947AABE4aCbB2D4538",
96
+ fastBridgeAddress: "fast1aq2hlz8t3ex0vke7056zraxzetmxmpaw84ws9lljdhpqtqkctu4spty8l6",
97
+ relayerUrl: "https://allset.fast.xyz/base/relayer",
98
+ evmRpcUrl: "https://lb.drpc.live/base/Av_ucIUlR08slbBUFg1E4U0n6sODvwMR8JF6QmlfqV1j",
99
+ evmExplorerUrl: "https://basescan.org",
100
+ tokens: {
101
+ USDC: {
102
+ evmAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
103
+ fastTokenId: "0xc655a12330da6af361d281b197996d2bc135aaed3b66278e729c2222291e9130",
104
+ decimals: 6
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
111
+ };
112
+
113
+ // src/schemas/networks.ts
114
+ import { Schema } from "effect";
115
+ var AllSetChainTokenSchema = Schema.Struct({
116
+ evmAddress: Schema.String,
117
+ fastTokenId: Schema.String,
118
+ decimals: Schema.Number
119
+ });
120
+ var AllSetChainSchema = Schema.Struct({
121
+ chainId: Schema.Number,
122
+ bridgeContract: Schema.String,
123
+ fastBridgeAddress: Schema.String,
124
+ relayerUrl: Schema.String,
125
+ evmRpcUrl: Schema.String,
126
+ evmExplorerUrl: Schema.String,
127
+ tokens: Schema.Record({ key: Schema.String, value: AllSetChainTokenSchema })
128
+ });
129
+ var AllSetConfigSchema = Schema.Struct({
130
+ crossSignUrl: Schema.String,
131
+ portalApiUrl: Schema.String,
132
+ chains: Schema.Record({ key: Schema.String, value: AllSetChainSchema })
133
+ });
134
+ var NetworkConfigSchema = Schema.Struct({
135
+ rpcUrl: Schema.String,
136
+ explorerUrl: Schema.String,
137
+ networkId: Schema.String,
138
+ allSet: Schema.optional(AllSetConfigSchema)
139
+ });
140
+ var BundledNetworksSchema = Schema.Record({
141
+ key: Schema.String,
142
+ value: NetworkConfigSchema
143
+ });
144
+
145
+ // src/services/config/app.ts
146
+ var bundledNetworks = Schema2.decodeUnknownSync(
147
+ BundledNetworksSchema
148
+ )(networks_default);
149
+ var getAppName = () => app_default.name;
150
+ var getVersion = () => app_default.version;
151
+ var getBundledNetworks = () => bundledNetworks;
152
+ var isBundledNetwork = (name) => Object.hasOwn(bundledNetworks, name);
153
+ var getBundledNetwork = (name) => bundledNetworks[name];
154
+ var AppConfig = class extends Context.Tag("AppConfig")() {
155
+ };
156
+ var AppConfigLive = Layer.sync(AppConfig, () => ({
157
+ name: getAppName(),
158
+ version: getVersion(),
159
+ bundledNetworks: getBundledNetworks(),
160
+ isBundledNetwork,
161
+ getBundledNetwork
162
+ }));
163
+
164
+ export {
165
+ NetworkConfigSchema,
166
+ getAppName,
167
+ getVersion,
168
+ getBundledNetworks,
169
+ isBundledNetwork,
170
+ getBundledNetwork,
171
+ AppConfig,
172
+ AppConfigLive
173
+ };