@xyo-network/chain-api 1.5.35 → 1.5.36
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/node/index.mjs +280 -249
- package/dist/node/index.mjs.map +1 -1
- package/dist/types/manifest/getLocator.d.ts +2 -1
- package/dist/types/manifest/getLocator.d.ts.map +1 -1
- package/dist/types/manifest/getNode.d.ts +5 -2
- package/dist/types/manifest/getNode.d.ts.map +1 -1
- package/dist/types/server/app.d.ts +2 -2
- package/dist/types/server/app.d.ts.map +1 -1
- package/dist/types/server/server.d.ts +3 -2
- package/dist/types/server/server.d.ts.map +1 -1
- package/package.json +42 -36
- package/src/manifest/getLocator.ts +38 -17
- package/src/manifest/getNode.ts +5 -6
- package/src/manifest/public/Chain.json +3 -3
- package/src/manifest/public/Pending.json +2 -2
- package/src/server/app.ts +3 -5
- package/src/server/server.ts +37 -5
package/dist/node/index.mjs
CHANGED
|
@@ -7,18 +7,247 @@ import compression from "compression";
|
|
|
7
7
|
import cors from "cors";
|
|
8
8
|
import express from "express";
|
|
9
9
|
|
|
10
|
-
// src/
|
|
10
|
+
// src/server/instrumentation.ts
|
|
11
|
+
import { registerInstrumentations } from "@opentelemetry/instrumentation";
|
|
12
|
+
import { ExpressInstrumentation } from "@opentelemetry/instrumentation-express";
|
|
13
|
+
import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
|
|
14
|
+
var addInstrumentation = /* @__PURE__ */ __name(() => {
|
|
15
|
+
const instrumentations = [
|
|
16
|
+
new HttpInstrumentation(),
|
|
17
|
+
new ExpressInstrumentation()
|
|
18
|
+
];
|
|
19
|
+
registerInstrumentations({
|
|
20
|
+
instrumentations
|
|
21
|
+
});
|
|
22
|
+
}, "addInstrumentation");
|
|
23
|
+
|
|
24
|
+
// src/server/routes/address/addNodeRoutes.ts
|
|
25
|
+
import { StatusCodes as StatusCodes3 } from "http-status-codes";
|
|
26
|
+
|
|
27
|
+
// src/server/routes/address/get/get.ts
|
|
11
28
|
import { assertEx } from "@xylabs/assert";
|
|
29
|
+
import { asyncHandler } from "@xylabs/express";
|
|
12
30
|
import { asAddress } from "@xylabs/hex";
|
|
31
|
+
import { isModuleIdentifierPart } from "@xyo-network/module-model";
|
|
32
|
+
import { trimAddressPrefix } from "@xyo-network/node-core-lib";
|
|
33
|
+
import { StatusCodes } from "http-status-codes";
|
|
34
|
+
var handler = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
35
|
+
const { address: rawAddress } = req.params;
|
|
36
|
+
const { node } = req.app;
|
|
37
|
+
const address = asAddress(rawAddress);
|
|
38
|
+
if (address !== void 0) {
|
|
39
|
+
let mod = node.address === address ? node : await node.resolve(address, {
|
|
40
|
+
direction: "down"
|
|
41
|
+
});
|
|
42
|
+
if (mod) {
|
|
43
|
+
res.json(await mod.state());
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (isModuleIdentifierPart(rawAddress)) {
|
|
48
|
+
const moduleIdentifier = trimAddressPrefix(rawAddress);
|
|
49
|
+
const mod = await node.resolve(moduleIdentifier, {
|
|
50
|
+
direction: "down"
|
|
51
|
+
});
|
|
52
|
+
if (mod) {
|
|
53
|
+
const moduleAddress = assertEx(mod?.address, () => "Error redirecting to module by address");
|
|
54
|
+
res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${moduleAddress}`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
next("route");
|
|
59
|
+
}, "handler");
|
|
60
|
+
var getAddress = asyncHandler(handler);
|
|
61
|
+
|
|
62
|
+
// src/server/routes/address/post/post.ts
|
|
63
|
+
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
64
|
+
import { asyncHandler as asyncHandler2 } from "@xylabs/express";
|
|
65
|
+
import { asAddress as asAddress2, isAddress } from "@xylabs/hex";
|
|
66
|
+
import { isQueryBoundWitness } from "@xyo-network/boundwitness-model";
|
|
67
|
+
import { ModuleErrorBuilder } from "@xyo-network/module-abstract";
|
|
68
|
+
import { trimAddressPrefix as trimAddressPrefix2 } from "@xyo-network/node-core-lib";
|
|
69
|
+
import { StatusCodes as StatusCodes2 } from "http-status-codes";
|
|
70
|
+
|
|
71
|
+
// src/server/routes/address/post/getQueryConfig.ts
|
|
72
|
+
import { BoundWitnessSchema } from "@xyo-network/boundwitness-model";
|
|
73
|
+
import { ModuleConfigSchema } from "@xyo-network/module-model";
|
|
74
|
+
var DEFAULT_DEPTH = 5;
|
|
75
|
+
var getQueryConfig = /* @__PURE__ */ __name((mod, req, bw, payloads) => {
|
|
76
|
+
const nestedBwAddresses = payloads?.flat(DEFAULT_DEPTH).filter((payload) => payload?.schema === BoundWitnessSchema).map((bw2) => bw2.addresses) || [];
|
|
77
|
+
const addresses = [
|
|
78
|
+
bw.addresses,
|
|
79
|
+
...nestedBwAddresses
|
|
80
|
+
].filter((address) => address.length > 0);
|
|
81
|
+
const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map((schema) => [
|
|
82
|
+
schema,
|
|
83
|
+
addresses
|
|
84
|
+
])) : {};
|
|
85
|
+
const security = {
|
|
86
|
+
allowed
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
schema: ModuleConfigSchema,
|
|
90
|
+
security
|
|
91
|
+
};
|
|
92
|
+
}, "getQueryConfig");
|
|
93
|
+
|
|
94
|
+
// src/server/routes/address/post/post.ts
|
|
95
|
+
var handler2 = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
96
|
+
const returnError = /* @__PURE__ */ __name((code, message = "An error occurred", details) => {
|
|
97
|
+
const error = new ModuleErrorBuilder().message(message).details(details).build();
|
|
98
|
+
res.locals.rawResponse = false;
|
|
99
|
+
res.status(code).json(error);
|
|
100
|
+
next();
|
|
101
|
+
}, "returnError");
|
|
102
|
+
const { address } = req.params;
|
|
103
|
+
const { node } = req.app;
|
|
104
|
+
const [bw, payloads] = Array.isArray(req.body) ? req.body : [];
|
|
105
|
+
if (!isAddress(address)) {
|
|
106
|
+
return returnError(StatusCodes2.BAD_REQUEST, "Missing address");
|
|
107
|
+
}
|
|
108
|
+
if (!bw) {
|
|
109
|
+
return returnError(StatusCodes2.BAD_REQUEST, "Missing boundwitness");
|
|
110
|
+
}
|
|
111
|
+
if (!isQueryBoundWitness(bw)) {
|
|
112
|
+
return returnError(StatusCodes2.BAD_REQUEST, "Invalid query boundwitness");
|
|
113
|
+
}
|
|
114
|
+
let modules = [];
|
|
115
|
+
const normalizedAddress = trimAddressPrefix2(address);
|
|
116
|
+
if (node.address === normalizedAddress) modules = [
|
|
117
|
+
node
|
|
118
|
+
];
|
|
119
|
+
else {
|
|
120
|
+
const typedAddress = asAddress2(address);
|
|
121
|
+
const byAddress = typedAddress === void 0 ? void 0 : await node.resolve(typedAddress, {
|
|
122
|
+
maxDepth: 10
|
|
123
|
+
});
|
|
124
|
+
if (byAddress) modules = [
|
|
125
|
+
byAddress
|
|
126
|
+
];
|
|
127
|
+
else {
|
|
128
|
+
const byName = await node.resolve(address, {
|
|
129
|
+
direction: "down"
|
|
130
|
+
});
|
|
131
|
+
if (byName) {
|
|
132
|
+
const moduleAddress = assertEx2(byName?.address, () => "Error redirecting to module by address");
|
|
133
|
+
res.redirect(StatusCodes2.TEMPORARY_REDIRECT, `/${moduleAddress}`);
|
|
134
|
+
return;
|
|
135
|
+
} else {
|
|
136
|
+
return returnError(StatusCodes2.NOT_FOUND, "Module not found", {
|
|
137
|
+
address
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (modules.length > 0) {
|
|
143
|
+
const mod = modules[0];
|
|
144
|
+
const queryConfig = getQueryConfig(mod, req, bw, payloads);
|
|
145
|
+
try {
|
|
146
|
+
const queryResult = await mod.query(bw, payloads, queryConfig);
|
|
147
|
+
res.json(queryResult);
|
|
148
|
+
} catch (ex) {
|
|
149
|
+
return returnError(StatusCodes2.INTERNAL_SERVER_ERROR, "Query Failed", {
|
|
150
|
+
message: ex?.message ?? "Unknown Error"
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
154
|
+
return returnError(StatusCodes2.NOT_FOUND, "Module not found", {
|
|
155
|
+
address
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}, "handler");
|
|
159
|
+
var postAddress = asyncHandler2(handler2);
|
|
160
|
+
|
|
161
|
+
// src/server/routes/address/addNodeRoutes.ts
|
|
162
|
+
var addNodeRoutes = /* @__PURE__ */ __name((app) => {
|
|
163
|
+
const defaultModule = app.node;
|
|
164
|
+
const address = defaultModule.address;
|
|
165
|
+
const defaultModuleEndpoint = `/${address}`;
|
|
166
|
+
app.get("/", (_req, res) => res.redirect(StatusCodes3.MOVED_TEMPORARILY, defaultModuleEndpoint));
|
|
167
|
+
app.post("/", (_req, res) => res.redirect(StatusCodes3.TEMPORARY_REDIRECT, defaultModuleEndpoint));
|
|
168
|
+
app.get("/:address", getAddress);
|
|
169
|
+
app.post("/:address", postAddress);
|
|
170
|
+
app.get("/:hash", (_req, res) => {
|
|
171
|
+
res.sendStatus(StatusCodes3.NOT_FOUND);
|
|
172
|
+
});
|
|
173
|
+
app.post("/:hash", (_req, res) => {
|
|
174
|
+
res.sendStatus(StatusCodes3.NOT_FOUND);
|
|
175
|
+
});
|
|
176
|
+
}, "addNodeRoutes");
|
|
177
|
+
|
|
178
|
+
// src/server/routes/rpc/routes/addRpcRoutes.ts
|
|
179
|
+
import { setRawResponseFormat } from "@xylabs/express";
|
|
180
|
+
import { NodeXyoViewer } from "@xyo-network/chain-rpc";
|
|
181
|
+
import { MemoryXyoProvider, NodeXyoRunner, rpcEngineFromProvider } from "@xyo-network/xl1-rpc";
|
|
182
|
+
var addRpcRoutes = /* @__PURE__ */ __name((app) => {
|
|
183
|
+
const { node } = app;
|
|
184
|
+
const runner = new NodeXyoRunner(node);
|
|
185
|
+
const viewer = new NodeXyoViewer(node);
|
|
186
|
+
const provider = new MemoryXyoProvider({
|
|
187
|
+
runner,
|
|
188
|
+
viewer
|
|
189
|
+
});
|
|
190
|
+
const engine = rpcEngineFromProvider(provider);
|
|
191
|
+
app.post("/rpc", (req, res) => {
|
|
192
|
+
setRawResponseFormat(res);
|
|
193
|
+
engine.handle(req.body, (_, rpcResponse) => {
|
|
194
|
+
res.json(rpcResponse);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
}, "addRpcRoutes");
|
|
198
|
+
|
|
199
|
+
// src/server/routes/addRoutes.ts
|
|
200
|
+
var addRoutes = /* @__PURE__ */ __name((app) => {
|
|
201
|
+
addRpcRoutes(app);
|
|
202
|
+
addNodeRoutes(app);
|
|
203
|
+
}, "addRoutes");
|
|
204
|
+
|
|
205
|
+
// src/server/app.ts
|
|
206
|
+
var getApp = /* @__PURE__ */ __name((node) => {
|
|
207
|
+
addInstrumentation();
|
|
208
|
+
const app = express();
|
|
209
|
+
app.set("etag", false);
|
|
210
|
+
app.use(cors());
|
|
211
|
+
app.use(compression());
|
|
212
|
+
app.use(responseProfiler);
|
|
213
|
+
app.use(getJsonBodyParser(getJsonBodyParserOptions({
|
|
214
|
+
limit: "1mb"
|
|
215
|
+
})));
|
|
216
|
+
app.use(standardResponses);
|
|
217
|
+
disableExpressDefaultPoweredByHeader(app);
|
|
218
|
+
app.use(customPoweredByHeader);
|
|
219
|
+
disableCaseSensitiveRouting(app);
|
|
220
|
+
app.node = node;
|
|
221
|
+
addRoutes(app);
|
|
222
|
+
app.use(standardErrors);
|
|
223
|
+
return app;
|
|
224
|
+
}, "getApp");
|
|
225
|
+
|
|
226
|
+
// src/server/server.ts
|
|
227
|
+
import { assertEx as assertEx4 } from "@xylabs/assert";
|
|
228
|
+
import { Base } from "@xylabs/base";
|
|
229
|
+
import { tryParseInt } from "@xylabs/express";
|
|
230
|
+
import { isString } from "@xylabs/typeof";
|
|
231
|
+
import { boot } from "@xyo-network/bios";
|
|
232
|
+
import { HDWallet } from "@xyo-network/wallet";
|
|
233
|
+
|
|
234
|
+
// src/manifest/getNode.ts
|
|
235
|
+
import { ManifestWrapper } from "@xyo-network/manifest-wrapper";
|
|
236
|
+
|
|
237
|
+
// src/manifest/getLocator.ts
|
|
238
|
+
import { assertEx as assertEx3 } from "@xylabs/assert";
|
|
239
|
+
import { asAddress as asAddress3, ZERO_ADDRESS } from "@xylabs/hex";
|
|
240
|
+
import { isDefined } from "@xylabs/typeof";
|
|
13
241
|
import { MemoryArchivist } from "@xyo-network/archivist-memory";
|
|
14
242
|
import { MongoDBArchivistV2 } from "@xyo-network/archivist-mongodb";
|
|
15
243
|
import { ViewArchivist } from "@xyo-network/archivist-view";
|
|
16
|
-
import {
|
|
244
|
+
import { AddressBalanceDivinerV2, ArchivistSyncDiviner, HeadValidationDiviner } from "@xyo-network/chain-modules";
|
|
17
245
|
import { initTelemetry } from "@xyo-network/chain-telemetry";
|
|
246
|
+
import { LoggerModuleStatusReporter } from "@xyo-network/module-abstract";
|
|
18
247
|
import { hasMongoDBConfig } from "@xyo-network/module-abstract-mongodb";
|
|
19
248
|
import { ModuleFactoryLocator } from "@xyo-network/module-factory-locator";
|
|
20
249
|
import { MemorySentinel } from "@xyo-network/sentinel-memory";
|
|
21
|
-
var getLocator = /* @__PURE__ */ __name(async () => {
|
|
250
|
+
var getLocator = /* @__PURE__ */ __name(async (logger) => {
|
|
22
251
|
const { traceProvider, meterProvider } = await initTelemetry({
|
|
23
252
|
attributes: {
|
|
24
253
|
serviceName: "xl1-api",
|
|
@@ -29,48 +258,50 @@ var getLocator = /* @__PURE__ */ __name(async () => {
|
|
|
29
258
|
port: 9465
|
|
30
259
|
}
|
|
31
260
|
});
|
|
261
|
+
const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : void 0;
|
|
32
262
|
const locator = new ModuleFactoryLocator();
|
|
33
263
|
if (hasMongoDBConfig()) {
|
|
34
264
|
locator.register(MongoDBArchivistV2.factory({
|
|
35
265
|
traceProvider,
|
|
36
|
-
meterProvider
|
|
37
|
-
|
|
266
|
+
meterProvider,
|
|
267
|
+
statusReporter
|
|
268
|
+
}), void 0, true);
|
|
38
269
|
}
|
|
39
|
-
locator.register(
|
|
270
|
+
locator.register(AddressBalanceDivinerV2.factory({
|
|
40
271
|
traceProvider,
|
|
41
|
-
meterProvider
|
|
272
|
+
meterProvider,
|
|
273
|
+
statusReporter
|
|
42
274
|
}));
|
|
275
|
+
const chainId = isDefined(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS) ? assertEx3(asAddress3(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS) ?? ZERO_ADDRESS, () => "XYO_EVM_STAKING_CONTRACT_ADDRESS is required and must be an Address") : ZERO_ADDRESS;
|
|
43
276
|
locator.register(HeadValidationDiviner.factory({
|
|
44
277
|
traceProvider,
|
|
45
278
|
meterProvider,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
id: assertEx(asAddress(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS), () => "XYO_EVM_STAKING_CONTRACT_ADDRESS is required and must be an Address")
|
|
49
|
-
}
|
|
279
|
+
statusReporter,
|
|
280
|
+
chainId
|
|
50
281
|
}));
|
|
51
282
|
locator.register(MemoryArchivist.factory({
|
|
52
283
|
traceProvider,
|
|
53
|
-
meterProvider
|
|
284
|
+
meterProvider,
|
|
285
|
+
statusReporter
|
|
54
286
|
}));
|
|
55
287
|
locator.register(MemorySentinel.factory({
|
|
56
288
|
traceProvider,
|
|
57
|
-
meterProvider
|
|
289
|
+
meterProvider,
|
|
290
|
+
statusReporter
|
|
58
291
|
}));
|
|
59
292
|
locator.register(ViewArchivist.factory({
|
|
60
293
|
traceProvider,
|
|
61
|
-
meterProvider
|
|
294
|
+
meterProvider,
|
|
295
|
+
statusReporter
|
|
62
296
|
}));
|
|
63
297
|
locator.register(ArchivistSyncDiviner.factory({
|
|
64
298
|
traceProvider,
|
|
65
|
-
meterProvider
|
|
299
|
+
meterProvider,
|
|
300
|
+
statusReporter
|
|
66
301
|
}));
|
|
67
302
|
return locator;
|
|
68
303
|
}, "getLocator");
|
|
69
304
|
|
|
70
|
-
// src/manifest/getNode.ts
|
|
71
|
-
import { ManifestWrapper } from "@xyo-network/manifest-wrapper";
|
|
72
|
-
import { HDWallet } from "@xyo-network/wallet";
|
|
73
|
-
|
|
74
305
|
// src/manifest/node.json
|
|
75
306
|
var node_default = {
|
|
76
307
|
$schema: "https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json",
|
|
@@ -119,7 +350,7 @@ var Chain_default = {
|
|
|
119
350
|
payloadSdkConfig: {
|
|
120
351
|
collection: "chain_validated"
|
|
121
352
|
},
|
|
122
|
-
schema: "network.xyo.archivist.
|
|
353
|
+
schema: "network.xyo.archivist.config"
|
|
123
354
|
}
|
|
124
355
|
},
|
|
125
356
|
{
|
|
@@ -195,7 +426,7 @@ var Chain_default = {
|
|
|
195
426
|
payloadSdkConfig: {
|
|
196
427
|
collection: "chain_submissions"
|
|
197
428
|
},
|
|
198
|
-
schema: "network.xyo.archivist.
|
|
429
|
+
schema: "network.xyo.archivist.config"
|
|
199
430
|
}
|
|
200
431
|
},
|
|
201
432
|
{
|
|
@@ -263,7 +494,7 @@ var Pending_default = {
|
|
|
263
494
|
payloadSdkConfig: {
|
|
264
495
|
collection: "pending_bundles"
|
|
265
496
|
},
|
|
266
|
-
schema: "network.xyo.archivist.
|
|
497
|
+
schema: "network.xyo.archivist.config"
|
|
267
498
|
}
|
|
268
499
|
}
|
|
269
500
|
]
|
|
@@ -282,244 +513,44 @@ var PublicChildManifests = [
|
|
|
282
513
|
];
|
|
283
514
|
|
|
284
515
|
// src/manifest/getNode.ts
|
|
285
|
-
var getNode = /* @__PURE__ */ __name(async (locator) => {
|
|
286
|
-
locator = locator ?? await getLocator();
|
|
287
|
-
const mnemonic = process.env.MNEMONIC;
|
|
288
|
-
const wallet = await (mnemonic === void 0 ? HDWallet.random() : HDWallet.fromPhrase(mnemonic));
|
|
516
|
+
var getNode = /* @__PURE__ */ __name(async (wallet, locator, logger) => {
|
|
517
|
+
locator = locator ?? await getLocator(logger);
|
|
289
518
|
const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests);
|
|
290
519
|
const [node, ...childNodes] = await wrapper.loadNodes();
|
|
291
520
|
if (childNodes?.length > 0) {
|
|
292
521
|
await Promise.all(childNodes.map((childNode) => node.register(childNode)));
|
|
293
522
|
await Promise.all(childNodes.map((childNode) => node.attach(childNode.address, true)));
|
|
294
523
|
}
|
|
295
|
-
console.log(await node.state());
|
|
296
524
|
return node;
|
|
297
525
|
}, "getNode");
|
|
298
526
|
|
|
299
|
-
// src/server/instrumentation.ts
|
|
300
|
-
import { registerInstrumentations } from "@opentelemetry/instrumentation";
|
|
301
|
-
import { ExpressInstrumentation } from "@opentelemetry/instrumentation-express";
|
|
302
|
-
import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
|
|
303
|
-
var addInstrumentation = /* @__PURE__ */ __name(() => {
|
|
304
|
-
const instrumentations = [
|
|
305
|
-
new HttpInstrumentation(),
|
|
306
|
-
new ExpressInstrumentation()
|
|
307
|
-
];
|
|
308
|
-
registerInstrumentations({
|
|
309
|
-
instrumentations
|
|
310
|
-
});
|
|
311
|
-
}, "addInstrumentation");
|
|
312
|
-
|
|
313
|
-
// src/server/routes/address/addNodeRoutes.ts
|
|
314
|
-
import { StatusCodes as StatusCodes3 } from "http-status-codes";
|
|
315
|
-
|
|
316
|
-
// src/server/routes/address/get/get.ts
|
|
317
|
-
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
318
|
-
import { asyncHandler } from "@xylabs/express";
|
|
319
|
-
import { asAddress as asAddress2 } from "@xylabs/hex";
|
|
320
|
-
import { isModuleIdentifierPart } from "@xyo-network/module-model";
|
|
321
|
-
import { trimAddressPrefix } from "@xyo-network/node-core-lib";
|
|
322
|
-
import { StatusCodes } from "http-status-codes";
|
|
323
|
-
var handler = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
324
|
-
const { address: rawAddress } = req.params;
|
|
325
|
-
const { node } = req.app;
|
|
326
|
-
const address = asAddress2(rawAddress);
|
|
327
|
-
if (address !== void 0) {
|
|
328
|
-
let mod = node.address === address ? node : await node.resolve(address, {
|
|
329
|
-
direction: "down"
|
|
330
|
-
});
|
|
331
|
-
if (mod) {
|
|
332
|
-
res.json(await mod.state());
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
if (isModuleIdentifierPart(rawAddress)) {
|
|
337
|
-
const moduleIdentifier = trimAddressPrefix(rawAddress);
|
|
338
|
-
const mod = await node.resolve(moduleIdentifier, {
|
|
339
|
-
direction: "down"
|
|
340
|
-
});
|
|
341
|
-
if (mod) {
|
|
342
|
-
const moduleAddress = assertEx2(mod?.address, () => "Error redirecting to module by address");
|
|
343
|
-
res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${moduleAddress}`);
|
|
344
|
-
return;
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
next("route");
|
|
348
|
-
}, "handler");
|
|
349
|
-
var getAddress = asyncHandler(handler);
|
|
350
|
-
|
|
351
|
-
// src/server/routes/address/post/post.ts
|
|
352
|
-
import { assertEx as assertEx3 } from "@xylabs/assert";
|
|
353
|
-
import { asyncHandler as asyncHandler2 } from "@xylabs/express";
|
|
354
|
-
import { asAddress as asAddress3, isAddress } from "@xylabs/hex";
|
|
355
|
-
import { isQueryBoundWitness } from "@xyo-network/boundwitness-model";
|
|
356
|
-
import { ModuleErrorBuilder } from "@xyo-network/module-abstract";
|
|
357
|
-
import { trimAddressPrefix as trimAddressPrefix2 } from "@xyo-network/node-core-lib";
|
|
358
|
-
import { StatusCodes as StatusCodes2 } from "http-status-codes";
|
|
359
|
-
|
|
360
|
-
// src/server/routes/address/post/getQueryConfig.ts
|
|
361
|
-
import { BoundWitnessSchema } from "@xyo-network/boundwitness-model";
|
|
362
|
-
import { ModuleConfigSchema } from "@xyo-network/module-model";
|
|
363
|
-
var DEFAULT_DEPTH = 5;
|
|
364
|
-
var getQueryConfig = /* @__PURE__ */ __name((mod, req, bw, payloads) => {
|
|
365
|
-
const nestedBwAddresses = payloads?.flat(DEFAULT_DEPTH).filter((payload) => payload?.schema === BoundWitnessSchema).map((bw2) => bw2.addresses) || [];
|
|
366
|
-
const addresses = [
|
|
367
|
-
bw.addresses,
|
|
368
|
-
...nestedBwAddresses
|
|
369
|
-
].filter((address) => address.length > 0);
|
|
370
|
-
const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map((schema) => [
|
|
371
|
-
schema,
|
|
372
|
-
addresses
|
|
373
|
-
])) : {};
|
|
374
|
-
const security = {
|
|
375
|
-
allowed
|
|
376
|
-
};
|
|
377
|
-
return {
|
|
378
|
-
schema: ModuleConfigSchema,
|
|
379
|
-
security
|
|
380
|
-
};
|
|
381
|
-
}, "getQueryConfig");
|
|
382
|
-
|
|
383
|
-
// src/server/routes/address/post/post.ts
|
|
384
|
-
var handler2 = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
385
|
-
const returnError = /* @__PURE__ */ __name((code, message = "An error occurred", details) => {
|
|
386
|
-
const error = new ModuleErrorBuilder().message(message).details(details).build();
|
|
387
|
-
res.locals.rawResponse = false;
|
|
388
|
-
res.status(code).json(error);
|
|
389
|
-
next();
|
|
390
|
-
}, "returnError");
|
|
391
|
-
const { address } = req.params;
|
|
392
|
-
const { node } = req.app;
|
|
393
|
-
const [bw, payloads] = Array.isArray(req.body) ? req.body : [];
|
|
394
|
-
if (!isAddress(address)) {
|
|
395
|
-
return returnError(StatusCodes2.BAD_REQUEST, "Missing address");
|
|
396
|
-
}
|
|
397
|
-
if (!bw) {
|
|
398
|
-
return returnError(StatusCodes2.BAD_REQUEST, "Missing boundwitness");
|
|
399
|
-
}
|
|
400
|
-
if (!isQueryBoundWitness(bw)) {
|
|
401
|
-
return returnError(StatusCodes2.BAD_REQUEST, "Invalid query boundwitness");
|
|
402
|
-
}
|
|
403
|
-
let modules = [];
|
|
404
|
-
const normalizedAddress = trimAddressPrefix2(address);
|
|
405
|
-
if (node.address === normalizedAddress) modules = [
|
|
406
|
-
node
|
|
407
|
-
];
|
|
408
|
-
else {
|
|
409
|
-
const typedAddress = asAddress3(address);
|
|
410
|
-
const byAddress = typedAddress === void 0 ? void 0 : await node.resolve(typedAddress, {
|
|
411
|
-
maxDepth: 10
|
|
412
|
-
});
|
|
413
|
-
if (byAddress) modules = [
|
|
414
|
-
byAddress
|
|
415
|
-
];
|
|
416
|
-
else {
|
|
417
|
-
const byName = await node.resolve(address, {
|
|
418
|
-
direction: "down"
|
|
419
|
-
});
|
|
420
|
-
if (byName) {
|
|
421
|
-
const moduleAddress = assertEx3(byName?.address, () => "Error redirecting to module by address");
|
|
422
|
-
res.redirect(StatusCodes2.TEMPORARY_REDIRECT, `/${moduleAddress}`);
|
|
423
|
-
return;
|
|
424
|
-
} else {
|
|
425
|
-
return returnError(StatusCodes2.NOT_FOUND, "Module not found", {
|
|
426
|
-
address
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
if (modules.length > 0) {
|
|
432
|
-
const mod = modules[0];
|
|
433
|
-
const queryConfig = getQueryConfig(mod, req, bw, payloads);
|
|
434
|
-
try {
|
|
435
|
-
const queryResult = await mod.query(bw, payloads, queryConfig);
|
|
436
|
-
res.json(queryResult);
|
|
437
|
-
} catch (ex) {
|
|
438
|
-
return returnError(StatusCodes2.INTERNAL_SERVER_ERROR, "Query Failed", {
|
|
439
|
-
message: ex?.message ?? "Unknown Error"
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
|
-
} else {
|
|
443
|
-
return returnError(StatusCodes2.NOT_FOUND, "Module not found", {
|
|
444
|
-
address
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
}, "handler");
|
|
448
|
-
var postAddress = asyncHandler2(handler2);
|
|
449
|
-
|
|
450
|
-
// src/server/routes/address/addNodeRoutes.ts
|
|
451
|
-
var addNodeRoutes = /* @__PURE__ */ __name((app) => {
|
|
452
|
-
const defaultModule = app.node;
|
|
453
|
-
const address = defaultModule.address;
|
|
454
|
-
const defaultModuleEndpoint = `/${address}`;
|
|
455
|
-
app.get("/", (_req, res) => res.redirect(StatusCodes3.MOVED_TEMPORARILY, defaultModuleEndpoint));
|
|
456
|
-
app.post("/", (_req, res) => res.redirect(StatusCodes3.TEMPORARY_REDIRECT, defaultModuleEndpoint));
|
|
457
|
-
app.get("/:address", getAddress);
|
|
458
|
-
app.post("/:address", postAddress);
|
|
459
|
-
app.get("/:hash", (_req, res) => {
|
|
460
|
-
res.sendStatus(StatusCodes3.NOT_FOUND);
|
|
461
|
-
});
|
|
462
|
-
app.post("/:hash", (_req, res) => {
|
|
463
|
-
res.sendStatus(StatusCodes3.NOT_FOUND);
|
|
464
|
-
});
|
|
465
|
-
}, "addNodeRoutes");
|
|
466
|
-
|
|
467
|
-
// src/server/routes/rpc/routes/addRpcRoutes.ts
|
|
468
|
-
import { setRawResponseFormat } from "@xylabs/express";
|
|
469
|
-
import { NodeXyoViewer } from "@xyo-network/chain-rpc";
|
|
470
|
-
import { MemoryXyoProvider, NodeXyoRunner, rpcEngineFromProvider } from "@xyo-network/xl1-rpc";
|
|
471
|
-
var addRpcRoutes = /* @__PURE__ */ __name((app) => {
|
|
472
|
-
const { node } = app;
|
|
473
|
-
const runner = new NodeXyoRunner(node);
|
|
474
|
-
const viewer = new NodeXyoViewer(node);
|
|
475
|
-
const provider = new MemoryXyoProvider({
|
|
476
|
-
runner,
|
|
477
|
-
viewer
|
|
478
|
-
});
|
|
479
|
-
const engine = rpcEngineFromProvider(provider);
|
|
480
|
-
app.post("/rpc", (req, res) => {
|
|
481
|
-
setRawResponseFormat(res);
|
|
482
|
-
engine.handle(req.body, (_, rpcResponse) => {
|
|
483
|
-
res.json(rpcResponse);
|
|
484
|
-
});
|
|
485
|
-
});
|
|
486
|
-
}, "addRpcRoutes");
|
|
487
|
-
|
|
488
|
-
// src/server/routes/addRoutes.ts
|
|
489
|
-
var addRoutes = /* @__PURE__ */ __name((app) => {
|
|
490
|
-
addRpcRoutes(app);
|
|
491
|
-
addNodeRoutes(app);
|
|
492
|
-
}, "addRoutes");
|
|
493
|
-
|
|
494
|
-
// src/server/app.ts
|
|
495
|
-
var getApp = /* @__PURE__ */ __name(async (node) => {
|
|
496
|
-
node = node ?? await getNode();
|
|
497
|
-
addInstrumentation();
|
|
498
|
-
const app = express();
|
|
499
|
-
app.set("etag", false);
|
|
500
|
-
app.use(cors());
|
|
501
|
-
app.use(compression());
|
|
502
|
-
app.use(responseProfiler);
|
|
503
|
-
app.use(getJsonBodyParser(getJsonBodyParserOptions({
|
|
504
|
-
limit: "1mb"
|
|
505
|
-
})));
|
|
506
|
-
app.use(standardResponses);
|
|
507
|
-
disableExpressDefaultPoweredByHeader(app);
|
|
508
|
-
app.use(customPoweredByHeader);
|
|
509
|
-
disableCaseSensitiveRouting(app);
|
|
510
|
-
app.node = node;
|
|
511
|
-
addRoutes(app);
|
|
512
|
-
app.use(standardErrors);
|
|
513
|
-
return app;
|
|
514
|
-
}, "getApp");
|
|
515
|
-
|
|
516
527
|
// src/server/server.ts
|
|
517
|
-
import { tryParseInt } from "@xylabs/express";
|
|
518
528
|
var hostname = "::";
|
|
519
|
-
var
|
|
520
|
-
const
|
|
521
|
-
|
|
522
|
-
const
|
|
529
|
+
var getSeedPhrase = /* @__PURE__ */ __name(async (bios, logger) => {
|
|
530
|
+
const storedSeedPhrase = await bios.seedPhraseStore.get("os");
|
|
531
|
+
console.log(`Stored seed phrase: ${storedSeedPhrase}`);
|
|
532
|
+
const envSeedPhrase = process.env.MNEMONIC;
|
|
533
|
+
if (isString(storedSeedPhrase) && isString(envSeedPhrase)) {
|
|
534
|
+
logger?.warn("Stored seed phrase does not match environment variable MNEMONIC. Updating to environment variable.");
|
|
535
|
+
await bios.seedPhraseStore.set("os", envSeedPhrase);
|
|
536
|
+
} else {
|
|
537
|
+
const seedPhrase = assertEx4(envSeedPhrase ?? (await HDWallet.random()).mnemonic?.phrase, () => "Unable to acquire seed phrase");
|
|
538
|
+
if (!isString(envSeedPhrase)) {
|
|
539
|
+
logger?.warn("No MNEMONIC environment variable set, using random seed phrase. This is not recommended for production use.");
|
|
540
|
+
logger?.info(`Seed phrase: ${seedPhrase}`);
|
|
541
|
+
}
|
|
542
|
+
await bios.seedPhraseStore.set("os", seedPhrase);
|
|
543
|
+
}
|
|
544
|
+
return assertEx4(await bios.seedPhraseStore.get("os"), () => "Unable to acquire seed phrase from bios seedPhraseStore");
|
|
545
|
+
}, "getSeedPhrase");
|
|
546
|
+
var getServer = /* @__PURE__ */ __name(async (port, node, logger = Base.defaultLogger ?? console) => {
|
|
547
|
+
const bios = await boot();
|
|
548
|
+
const seedPhrase = await getSeedPhrase(bios, logger);
|
|
549
|
+
const osWallet = await HDWallet.fromPhrase(seedPhrase);
|
|
550
|
+
const appPort = port ?? tryParseInt(process.env.APP_PORT) ?? 8080;
|
|
551
|
+
node = node ?? await getNode(osWallet, void 0, logger);
|
|
552
|
+
const app = getApp(node);
|
|
553
|
+
const server = app.listen(appPort, hostname, () => logger.log(`Server listening at http://${hostname}:${appPort}`));
|
|
523
554
|
server.setTimeout(2e4);
|
|
524
555
|
return server;
|
|
525
556
|
}, "getServer");
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/app.ts","../../src/manifest/getLocator.ts","../../src/manifest/getNode.ts","../../src/manifest/node.json","../../src/manifest/nodeManifest.ts","../../src/manifest/private/index.ts","../../src/manifest/public/Chain.json","../../src/manifest/public/Pending.json","../../src/manifest/public/index.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { MemoryNode } from '@xyo-network/node-memory'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { getNode } from '../manifest/index.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (node?: MemoryNode): Promise<Express> => {\n node = node ?? (await getNode())\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n // eslint-disable-next-line sonarjs/cors\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.node = node\n addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asAddress } from '@xylabs/hex'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'\nimport { ViewArchivist } from '@xyo-network/archivist-view'\nimport {\n AddressBalanceDiviner, ArchivistSyncDiviner, HeadValidationDiviner,\n} from '@xyo-network/chain-modules'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\n\n/**\n * Used for retrieving a locator with the necessary modules registered for testing\n * operation of the node (entirely in memory)\n * @returns A locator with the necessary modules registered\n */\nexport const getLocator = async () => {\n const { traceProvider, meterProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-api',\n serviceVersion: '1.0.0',\n },\n metricsConfig: {\n endpoint: '/metrics',\n port: 9465,\n },\n })\n const locator = new ModuleFactoryLocator()\n // If there's a MongoDB configuration\n if (hasMongoDBConfig()) {\n // Register the MongoDB Archivist & Diviners as the defaults\n locator.register(MongoDBArchivistV2.factory(\n { traceProvider, meterProvider },\n ))\n }\n locator.register(AddressBalanceDiviner.factory({ traceProvider, meterProvider }))\n locator.register(HeadValidationDiviner.factory({\n traceProvider,\n meterProvider,\n // logger: new IdLogger(console, () => 'HeadValidationDiviner'),\n chainIdentification: {\n id: assertEx(\n asAddress(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS),\n () => 'XYO_EVM_STAKING_CONTRACT_ADDRESS is required and must be an Address',\n ),\n },\n }))\n locator.register(MemoryArchivist.factory({ traceProvider, meterProvider }))\n locator.register(MemorySentinel.factory({ traceProvider, meterProvider }))\n locator.register(ViewArchivist.factory({ traceProvider, meterProvider }))\n locator.register(ArchivistSyncDiviner.factory({ traceProvider, meterProvider }))\n return locator\n}\n","import { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport { HDWallet } from '@xyo-network/wallet'\n\nimport { getLocator } from './getLocator.ts'\nimport { NodeManifest } from './nodeManifest.ts'\nimport { PrivateChildManifests } from './private/index.ts'\nimport { PublicChildManifests } from './public/index.ts'\n\n/**\n * Creates a node with the xyo-chain modules registered\n * @param locator The locator to use for the node\n * @returns A node with the xyo-chain modules registered\n */\nexport const getNode = async (locator?: ModuleFactoryLocator) => {\n locator = locator ?? await getLocator()\n const mnemonic = process.env.MNEMONIC\n const wallet = await (mnemonic === undefined ? HDWallet.random() : HDWallet.fromPhrase(mnemonic))\n const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)\n const [node, ...childNodes] = await wrapper.loadNodes()\n if (childNodes?.length > 0) {\n await Promise.all(childNodes.map(childNode => node.register(childNode)))\n await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))\n }\n console.log(await node.state())\n return node\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"44'/60'/1\",\n \"name\": \"XYOChain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": []\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport node from './node.json' with { type: 'json' }\n\n/**\n * Root Node Manifest\n */\nexport const NodeManifest = node as PackageManifestPayload\n","/**\n * Private Child Manifests\n */\nexport const PrivateChildManifests = []\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"1\",\n \"name\": \"Chain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"name\": \"Validated\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"chain_validated\"\n },\n \"schema\": \"network.xyo.archivist.mongodb.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/2'\",\n \"schema\": \"network.xyo.diviner.chain.head.validation.config\",\n \"eventSubscriptions\": [\n {\n \"sourceEvent\": \"inserted\",\n \"sourceModule\": \"Chain:Submissions\",\n \"targetModuleFunction\": \"divine\"\n }\n ],\n \"inArchivist\": \"Chain:Submissions\",\n \"outArchivist\": \"Chain:Validated\",\n \"name\": \"HeadValidationDiviner\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/3'\",\n \"automations\": [\n {\n \"frequency\": 10000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"ChainValidationSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"HeadValidationDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/4'\",\n \"automations\": [\n {\n \"frequency\": 60000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"AddressBalancePollingSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"AddressBalanceDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"Submissions\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"chain_submissions\"\n },\n \"schema\": \"network.xyo.archivist.mongodb.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/2\",\n \"name\": \"Finalized\",\n \"allowedQueries\": [\n \"network.xyo.query.archivist.get\",\n \"network.xyo.query.archivist.next\"\n ],\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"originArchivist\": \"Chain:Validated\",\n \"schema\": \"network.xyo.archivist.view.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/3\",\n \"schema\": \"network.xyo.diviner.chain.address.balance.config\",\n \"archivist\": \"Chain:Validated\",\n \"name\": \"AddressBalanceDiviner\",\n \"eventSubscriptions\": [\n {\n \"sourceEvent\": \"inserted\",\n \"sourceModule\": \"Chain:Validated\",\n \"targetModuleFunction\": \"divine\"\n }\n ]\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"2\",\n \"name\": \"Pending\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"2/1/2\",\n \"name\": \"PendingTransactions\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"payloadSdkConfig\": {\n \"collection\": \"pending_bundles\"\n },\n \"schema\": \"network.xyo.archivist.mongodb.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport Chain from './Chain.json' with { type: 'json' }\nimport Pending from './Pending.json' with { type: 'json' }\n\n/**\n * Chain Node Manifest\n */\nexport const ChainNodeManifest = Chain as PackageManifestPayload\n/**\n * Pending Node Manifest\n */\nexport const PendingNodeManifest = Pending as PackageManifestPayload\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = [\n ...ChainNodeManifest.nodes,\n ...PendingNodeManifest.nodes,\n]\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n *\n * @returns {void}\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport { asAddress } from '@xylabs/hex'\nimport { isModuleIdentifierPart } from '@xyo-network/module-model'\nimport { trimAddressPrefix } from '@xyo-network/node-core-lib'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: rawAddress } = req.params\n const { node } = req.app\n const address = asAddress(rawAddress)\n if (address !== undefined) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleIdentifierPart(rawAddress)) {\n const moduleIdentifier = trimAddressPrefix(rawAddress)\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n const moduleAddress = assertEx(mod?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${moduleAddress}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport {\n type Address, asAddress, isAddress,\n} from '@xylabs/hex'\nimport type { JsonObject } from '@xylabs/object'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { trimAddressPrefix } from '@xyo-network/node-core-lib'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = trimAddressPrefix(address) as Address\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) || []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n MemoryXyoProvider, NodeXyoRunner, rpcEngineFromProvider,\n} from '@xyo-network/xl1-rpc'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = (app: Express) => {\n const { node } = app\n const runner = new NodeXyoRunner(node)\n const viewer = new NodeXyoViewer(node)\n const provider = new MemoryXyoProvider({ runner, viewer })\n const engine = rpcEngineFromProvider(provider)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = (app: Express) => {\n addRpcRoutes(app)\n addNodeRoutes(app)\n}\n","import { tryParseInt } from '@xylabs/express'\nimport type { MemoryNode } from '@xyo-network/node-memory'\n\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\nexport const getServer = async (port?: number, node?: MemoryNode) => {\n const appPort = port ?? tryParseInt(process.env.APP_PORT) ?? 80\n const app = await getApp(node)\n const server = app.listen(appPort, hostname, () => console.log(`Server listening at http://${hostname}:${appPort}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","assertEx","asAddress","MemoryArchivist","MongoDBArchivistV2","ViewArchivist","AddressBalanceDiviner","ArchivistSyncDiviner","HeadValidationDiviner","initTelemetry","hasMongoDBConfig","ModuleFactoryLocator","MemorySentinel","getLocator","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","locator","ModuleFactoryLocator","hasMongoDBConfig","register","MongoDBArchivistV2","factory","AddressBalanceDiviner","HeadValidationDiviner","chainIdentification","id","assertEx","asAddress","process","env","XYO_EVM_STAKING_CONTRACT_ADDRESS","MemoryArchivist","MemorySentinel","ViewArchivist","ArchivistSyncDiviner","ManifestWrapper","HDWallet","NodeManifest","node","PrivateChildManifests","ChainNodeManifest","Chain","PendingNodeManifest","Pending","PublicChildManifests","nodes","getNode","locator","getLocator","mnemonic","process","env","MNEMONIC","wallet","undefined","HDWallet","random","fromPhrase","wrapper","ManifestWrapper","NodeManifest","PublicChildManifests","PrivateChildManifests","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","console","log","state","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","assertEx","asyncHandler","asAddress","isModuleIdentifierPart","trimAddressPrefix","StatusCodes","handler","req","res","next","address","rawAddress","params","node","app","asAddress","undefined","mod","resolve","direction","json","state","isModuleIdentifierPart","moduleIdentifier","trimAddressPrefix","moduleAddress","assertEx","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","assertEx","asyncHandler","asAddress","isAddress","isQueryBoundWitness","ModuleErrorBuilder","trimAddressPrefix","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","trimAddressPrefix","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","NodeXyoViewer","MemoryXyoProvider","NodeXyoRunner","rpcEngineFromProvider","addRpcRoutes","app","node","runner","NodeXyoRunner","viewer","NodeXyoViewer","provider","MemoryXyoProvider","engine","rpcEngineFromProvider","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addNodeRoutes","getApp","node","getNode","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","tryParseInt","hostname","getServer","port","node","appPort","tryParseInt","process","env","APP_PORT","app","getApp","server","listen","console","log","setTimeout"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts","../../src/manifest/getNode.ts","../../src/manifest/getLocator.ts","../../src/manifest/node.json","../../src/manifest/nodeManifest.ts","../../src/manifest/private/index.ts","../../src/manifest/public/Chain.json","../../src/manifest/public/Pending.json","../../src/manifest/public/index.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = (node: NodeInstance): Express => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.node = node\n addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n *\n * @returns {void}\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport { asAddress } from '@xylabs/hex'\nimport { isModuleIdentifierPart } from '@xyo-network/module-model'\nimport { trimAddressPrefix } from '@xyo-network/node-core-lib'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: rawAddress } = req.params\n const { node } = req.app\n const address = asAddress(rawAddress)\n if (address !== undefined) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleIdentifierPart(rawAddress)) {\n const moduleIdentifier = trimAddressPrefix(rawAddress)\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n const moduleAddress = assertEx(mod?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${moduleAddress}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport {\n type Address, asAddress, isAddress,\n} from '@xylabs/hex'\nimport type { JsonObject } from '@xylabs/object'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { trimAddressPrefix } from '@xyo-network/node-core-lib'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = trimAddressPrefix(address) as Address\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) || []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n MemoryXyoProvider, NodeXyoRunner, rpcEngineFromProvider,\n} from '@xyo-network/xl1-rpc'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = (app: Express) => {\n const { node } = app\n const runner = new NodeXyoRunner(node)\n const viewer = new NodeXyoViewer(node)\n const provider = new MemoryXyoProvider({ runner, viewer })\n const engine = rpcEngineFromProvider(provider)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = (app: Express) => {\n addRpcRoutes(app)\n addNodeRoutes(app)\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Base } from '@xylabs/base'\nimport { tryParseInt } from '@xylabs/express'\nimport type { Logger } from '@xylabs/logger'\nimport { isString } from '@xylabs/typeof'\nimport { boot } from '@xyo-network/bios'\nimport type { BiosExternalInterface } from '@xyo-network/bios-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { HDWallet } from '@xyo-network/wallet'\n\nimport { getNode } from '../manifest/getNode.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\nconst getSeedPhrase = async (bios: BiosExternalInterface, logger?: Logger): Promise<string> => {\n const storedSeedPhrase = await bios.seedPhraseStore.get('os')\n console.log(`Stored seed phrase: ${storedSeedPhrase}`)\n const envSeedPhrase = process.env.MNEMONIC\n if (isString(storedSeedPhrase) && isString(envSeedPhrase)) {\n logger?.warn('Stored seed phrase does not match environment variable MNEMONIC. Updating to environment variable.')\n await bios.seedPhraseStore.set('os', envSeedPhrase)\n } else {\n const seedPhrase = assertEx(envSeedPhrase ?? (await HDWallet.random()).mnemonic?.phrase, () => 'Unable to acquire seed phrase')\n if (!isString(envSeedPhrase)) {\n logger?.warn('No MNEMONIC environment variable set, using random seed phrase. This is not recommended for production use.')\n logger?.info(`Seed phrase: ${seedPhrase}`)\n }\n await bios.seedPhraseStore.set('os', seedPhrase)\n }\n return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire seed phrase from bios seedPhraseStore')\n}\n\nexport const getServer = async (port?: number, node?: NodeInstance, logger = Base.defaultLogger ?? console) => {\n // TODO: Make bios boot able to take a seed phrase as an argument (current behavior is always random 'os' seed phrase)\n // TODO: Make nodejs version of bios support round tripping seed phrase between boots\n const bios = await boot()\n const seedPhrase = await getSeedPhrase(bios, logger)\n const osWallet = await HDWallet.fromPhrase(seedPhrase)\n const appPort = port ?? tryParseInt(process.env.APP_PORT) ?? 8080\n node = node ?? await getNode(osWallet, undefined, logger)\n const app = getApp(node)\n const server = app.listen(appPort, hostname, () => logger.log(`Server listening at http://${hostname}:${appPort}`))\n server.setTimeout(20_000)\n return server\n}\n","import type { Logger } from '@xylabs/logger'\nimport { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\n\nimport { getLocator } from './getLocator.ts'\nimport { NodeManifest } from './nodeManifest.ts'\nimport { PrivateChildManifests } from './private/index.ts'\nimport { PublicChildManifests } from './public/index.ts'\n\n/**\n * Creates a node with the xyo-chain modules registered\n * @param locator The locator to use for the node\n * @returns A node with the xyo-chain modules registered\n */\nexport const getNode = async (wallet: WalletInstance, locator?: ModuleFactoryLocator, logger?: Logger) => {\n locator = locator ?? await getLocator(logger)\n const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)\n const [node, ...childNodes] = await wrapper.loadNodes()\n if (childNodes?.length > 0) {\n await Promise.all(childNodes.map(childNode => node.register(childNode)))\n await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))\n }\n // console.log(await node.state())\n return node\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asAddress, ZERO_ADDRESS } from '@xylabs/hex'\nimport type { Logger } from '@xylabs/logger'\nimport { isDefined } from '@xylabs/typeof'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'\nimport { ViewArchivist } from '@xyo-network/archivist-view'\nimport {\n AddressBalanceDivinerV2, ArchivistSyncDiviner, HeadValidationDiviner,\n} from '@xyo-network/chain-modules'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { LoggerModuleStatusReporter } from '@xyo-network/module-abstract'\nimport { hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\n\n/**\n * Used for retrieving a locator with the necessary modules registered for testing\n * operation of the node (entirely in memory)\n * @returns A locator with the necessary modules registered\n */\nexport const getLocator = async (logger?: Logger) => {\n const { traceProvider, meterProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-api',\n serviceVersion: '1.0.0',\n },\n metricsConfig: {\n endpoint: '/metrics',\n port: 9465,\n },\n })\n\n const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined\n\n const locator = new ModuleFactoryLocator()\n // If there's a MongoDB configuration\n if (hasMongoDBConfig()) {\n // Register the MongoDB Archivist & Diviners as the defaults\n locator.register(MongoDBArchivistV2.factory(\n {\n traceProvider, meterProvider, statusReporter,\n },\n ), undefined, true)\n }\n\n locator.register(AddressBalanceDivinerV2.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n\n const chainId = isDefined(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS)\n ? assertEx(\n asAddress(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS) ?? ZERO_ADDRESS,\n () => 'XYO_EVM_STAKING_CONTRACT_ADDRESS is required and must be an Address',\n )\n : ZERO_ADDRESS\n locator.register(HeadValidationDiviner.factory({\n traceProvider,\n meterProvider,\n statusReporter,\n chainId,\n }))\n locator.register(MemoryArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(MemorySentinel.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(ViewArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(ArchivistSyncDiviner.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n return locator\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"44'/60'/1\",\n \"name\": \"XYOChain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": []\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport node from './node.json' with { type: 'json' }\n\n/**\n * Root Node Manifest\n */\nexport const NodeManifest = node as PackageManifestPayload\n","/**\n * Private Child Manifests\n */\nexport const PrivateChildManifests = []\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"1\",\n \"name\": \"Chain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"name\": \"Validated\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"chain_validated\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/2'\",\n \"schema\": \"network.xyo.diviner.chain.head.validation.config\",\n \"eventSubscriptions\": [\n {\n \"sourceEvent\": \"inserted\",\n \"sourceModule\": \"Chain:Submissions\",\n \"targetModuleFunction\": \"divine\"\n }\n ],\n \"inArchivist\": \"Chain:Submissions\",\n \"outArchivist\": \"Chain:Validated\",\n \"name\": \"HeadValidationDiviner\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/3'\",\n \"automations\": [\n {\n \"frequency\": 10000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"ChainValidationSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"HeadValidationDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/4'\",\n \"automations\": [\n {\n \"frequency\": 60000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"AddressBalancePollingSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"AddressBalanceDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"Submissions\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"chain_submissions\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/2\",\n \"name\": \"Finalized\",\n \"allowedQueries\": [\n \"network.xyo.query.archivist.get\",\n \"network.xyo.query.archivist.next\"\n ],\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"originArchivist\": \"Chain:Validated\",\n \"schema\": \"network.xyo.archivist.view.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/3\",\n \"schema\": \"network.xyo.diviner.chain.address.balance.config\",\n \"archivist\": \"Chain:Validated\",\n \"name\": \"AddressBalanceDiviner\",\n \"eventSubscriptions\": [\n {\n \"sourceEvent\": \"inserted\",\n \"sourceModule\": \"Chain:Validated\",\n \"targetModuleFunction\": \"divine\"\n }\n ]\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"2\",\n \"name\": \"Pending\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"2/1/2\",\n \"name\": \"PendingTransactions\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"payloadSdkConfig\": {\n \"collection\": \"pending_bundles\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport Chain from './Chain.json' with { type: 'json' }\nimport Pending from './Pending.json' with { type: 'json' }\n\n/**\n * Chain Node Manifest\n */\nexport const ChainNodeManifest = Chain as PackageManifestPayload\n/**\n * Pending Node Manifest\n */\nexport const PendingNodeManifest = Pending as PackageManifestPayload\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = [\n ...ChainNodeManifest.nodes,\n ...PendingNodeManifest.nodes,\n]\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","assertEx","asyncHandler","asAddress","isModuleIdentifierPart","trimAddressPrefix","StatusCodes","handler","req","res","next","address","rawAddress","params","node","app","asAddress","undefined","mod","resolve","direction","json","state","isModuleIdentifierPart","moduleIdentifier","trimAddressPrefix","moduleAddress","assertEx","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","assertEx","asyncHandler","asAddress","isAddress","isQueryBoundWitness","ModuleErrorBuilder","trimAddressPrefix","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","trimAddressPrefix","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","NodeXyoViewer","MemoryXyoProvider","NodeXyoRunner","rpcEngineFromProvider","addRpcRoutes","app","node","runner","NodeXyoRunner","viewer","NodeXyoViewer","provider","MemoryXyoProvider","engine","rpcEngineFromProvider","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addNodeRoutes","getApp","node","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","Base","tryParseInt","isString","boot","HDWallet","ManifestWrapper","assertEx","asAddress","ZERO_ADDRESS","isDefined","MemoryArchivist","MongoDBArchivistV2","ViewArchivist","AddressBalanceDivinerV2","ArchivistSyncDiviner","HeadValidationDiviner","initTelemetry","LoggerModuleStatusReporter","hasMongoDBConfig","ModuleFactoryLocator","MemorySentinel","getLocator","logger","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","statusReporter","LoggerModuleStatusReporter","undefined","locator","ModuleFactoryLocator","hasMongoDBConfig","register","MongoDBArchivistV2","factory","AddressBalanceDivinerV2","chainId","isDefined","process","env","XYO_EVM_STAKING_CONTRACT_ADDRESS","assertEx","asAddress","ZERO_ADDRESS","HeadValidationDiviner","MemoryArchivist","MemorySentinel","ViewArchivist","ArchivistSyncDiviner","NodeManifest","node","PrivateChildManifests","ChainNodeManifest","Chain","PendingNodeManifest","Pending","PublicChildManifests","nodes","getNode","wallet","locator","logger","getLocator","wrapper","ManifestWrapper","NodeManifest","PublicChildManifests","PrivateChildManifests","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","hostname","getSeedPhrase","bios","logger","storedSeedPhrase","seedPhraseStore","get","console","log","envSeedPhrase","process","env","MNEMONIC","isString","warn","set","seedPhrase","assertEx","HDWallet","random","mnemonic","phrase","info","getServer","port","node","Base","defaultLogger","boot","osWallet","fromPhrase","appPort","tryParseInt","APP_PORT","getNode","undefined","app","getApp","server","listen","setTimeout"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import type { Logger } from '@xylabs/logger';
|
|
1
2
|
import { ModuleFactoryLocator } from '@xyo-network/module-factory-locator';
|
|
2
3
|
/**
|
|
3
4
|
* Used for retrieving a locator with the necessary modules registered for testing
|
|
4
5
|
* operation of the node (entirely in memory)
|
|
5
6
|
* @returns A locator with the necessary modules registered
|
|
6
7
|
*/
|
|
7
|
-
export declare const getLocator: () => Promise<ModuleFactoryLocator>;
|
|
8
|
+
export declare const getLocator: (logger?: Logger) => Promise<ModuleFactoryLocator>;
|
|
8
9
|
//# sourceMappingURL=getLocator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAW5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAG1E;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAU,SAAS,MAAM,kCAsD/C,CAAA"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import type { Logger } from '@xylabs/logger';
|
|
1
2
|
import type { ModuleFactoryLocator } from '@xyo-network/module-factory-locator';
|
|
3
|
+
import type { WalletInstance } from '@xyo-network/wallet-model';
|
|
2
4
|
/**
|
|
3
5
|
* Creates a node with the xyo-chain modules registered
|
|
4
6
|
* @param locator The locator to use for the node
|
|
5
7
|
* @returns A node with the xyo-chain modules registered
|
|
6
8
|
*/
|
|
7
|
-
export declare const getNode: (locator?: ModuleFactoryLocator) => Promise<import("@xyo-network/node-memory").MemoryNode<import("@xylabs/base").
|
|
9
|
+
export declare const getNode: (wallet: WalletInstance, locator?: ModuleFactoryLocator, logger?: Logger) => Promise<import("@xyo-network/node-memory").MemoryNode<import("@xylabs/base").BaseParams<{
|
|
8
10
|
account?: import("@xyo-network/account-model").AccountInstance | "random";
|
|
9
11
|
addToResolvers?: boolean;
|
|
10
12
|
additionalSigners?: import("@xyo-network/account-model").AccountInstance[];
|
|
@@ -12,5 +14,6 @@ export declare const getNode: (locator?: ModuleFactoryLocator) => Promise<import
|
|
|
12
14
|
config: import("@xyo-network/module-model").AnyConfigSchema<import("@xyo-network/node-model").NodeConfig>;
|
|
13
15
|
ephemeralQueryAccountEnabled?: boolean;
|
|
14
16
|
moduleIdentifierTransformers?: import("@xyo-network/module-model").ModuleIdentifierTransformer[];
|
|
15
|
-
|
|
17
|
+
statusReporter?: import("@xyo-network/module-model").ModuleStatusReporter;
|
|
18
|
+
} & import("@xyo-network/module-model").ModuleChildrenParams>, import("@xyo-network/node-model").NodeModuleEventData>>;
|
|
16
19
|
//# sourceMappingURL=getNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getNode.d.ts","sourceRoot":"","sources":["../../../src/manifest/getNode.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getNode.d.ts","sourceRoot":"","sources":["../../../src/manifest/getNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAO/D;;;;GAIG;AACH,eAAO,MAAM,OAAO,GAAU,QAAQ,cAAc,EAAE,UAAU,oBAAoB,EAAE,SAAS,MAAM;;;;;;;;;sHAUpG,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { NodeInstance } from '@xyo-network/node-model';
|
|
2
2
|
import type { Express } from 'express';
|
|
3
|
-
export declare const getApp: (node
|
|
3
|
+
export declare const getApp: (node: NodeInstance) => Express;
|
|
4
4
|
//# sourceMappingURL=app.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAG3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,MAAM,GAAI,MAAM,YAAY,KAAG,OAiB3C,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { Logger } from '@xylabs/logger';
|
|
2
|
+
import type { NodeInstance } from '@xyo-network/node-model';
|
|
3
|
+
export declare const getServer: (port?: number, node?: NodeInstance, logger?: Logger) => Promise<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>>;
|
|
3
4
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAI5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AA2B3D,eAAO,MAAM,SAAS,GAAU,OAAO,MAAM,EAAE,OAAO,YAAY,EAAE,eAAsC,gHAYzG,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-api",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.36",
|
|
4
4
|
"description": "XYO Layer One API",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -43,29 +43,33 @@
|
|
|
43
43
|
"@opentelemetry/instrumentation": "^0.202.0",
|
|
44
44
|
"@opentelemetry/instrumentation-express": "^0.51.0",
|
|
45
45
|
"@opentelemetry/instrumentation-http": "^0.202.0",
|
|
46
|
-
"@xylabs/assert": "^4.
|
|
47
|
-
"@xylabs/
|
|
48
|
-
"@xylabs/
|
|
49
|
-
"@
|
|
50
|
-
"@
|
|
51
|
-
"@
|
|
52
|
-
"@xyo-network/
|
|
53
|
-
"@xyo-network/
|
|
54
|
-
"@xyo-network/
|
|
55
|
-
"@xyo-network/
|
|
56
|
-
"@xyo-network/
|
|
57
|
-
"@xyo-network/
|
|
58
|
-
"@xyo-network/
|
|
59
|
-
"@xyo-network/
|
|
60
|
-
"@xyo-network/
|
|
61
|
-
"@xyo-network/
|
|
62
|
-
"@xyo-network/
|
|
63
|
-
"@xyo-network/
|
|
64
|
-
"@xyo-network/
|
|
65
|
-
"@xyo-network/
|
|
66
|
-
"@xyo-network/
|
|
67
|
-
"@xyo-network/
|
|
68
|
-
"@xyo-network/
|
|
46
|
+
"@xylabs/assert": "^4.12.29",
|
|
47
|
+
"@xylabs/base": "^4.12.29",
|
|
48
|
+
"@xylabs/express": "^4.12.29",
|
|
49
|
+
"@xylabs/hex": "^4.12.29",
|
|
50
|
+
"@xylabs/logger": "^4.12.29",
|
|
51
|
+
"@xylabs/typeof": "^4.12.29",
|
|
52
|
+
"@xyo-network/archivist-memory": "^3.18.10",
|
|
53
|
+
"@xyo-network/archivist-mongodb": "^3.18.10",
|
|
54
|
+
"@xyo-network/archivist-view": "^3.18.10",
|
|
55
|
+
"@xyo-network/bios": "^5.0.13",
|
|
56
|
+
"@xyo-network/boundwitness-model": "^3.18.10",
|
|
57
|
+
"@xyo-network/chain-modules": "^1.5.36",
|
|
58
|
+
"@xyo-network/chain-rpc": "^1.5.36",
|
|
59
|
+
"@xyo-network/chain-telemetry": "^1.5.36",
|
|
60
|
+
"@xyo-network/manifest-model": "^3.18.10",
|
|
61
|
+
"@xyo-network/manifest-wrapper": "^3.18.10",
|
|
62
|
+
"@xyo-network/module-abstract": "^3.18.10",
|
|
63
|
+
"@xyo-network/module-abstract-mongodb": "^3.18.10",
|
|
64
|
+
"@xyo-network/module-factory-locator": "^3.18.10",
|
|
65
|
+
"@xyo-network/module-model": "^3.18.10",
|
|
66
|
+
"@xyo-network/node-core-lib": "^3.7.16",
|
|
67
|
+
"@xyo-network/node-model": "^3.18.10",
|
|
68
|
+
"@xyo-network/payload-model": "^3.18.10",
|
|
69
|
+
"@xyo-network/sentinel-memory": "^3.18.10",
|
|
70
|
+
"@xyo-network/wallet": "^3.18.10",
|
|
71
|
+
"@xyo-network/wallet-model": "^3.18.10",
|
|
72
|
+
"@xyo-network/xl1-rpc": "^1.5.36",
|
|
69
73
|
"compression": "^1.8.0",
|
|
70
74
|
"cors": "^2.8.5",
|
|
71
75
|
"express": "^5.1.0",
|
|
@@ -75,20 +79,22 @@
|
|
|
75
79
|
"@types/compression": "^1.8.1",
|
|
76
80
|
"@types/cors": "^2.8.19",
|
|
77
81
|
"@types/express": "5.0.3",
|
|
78
|
-
"@types/node": "^24.0.
|
|
79
|
-
"@xylabs/object": "^4.
|
|
80
|
-
"@xylabs/ts-scripts-yarn3": "^6.5.
|
|
81
|
-
"@xylabs/tsconfig": "^6.5.
|
|
82
|
-
"@xyo-network/account": "^3.18.
|
|
83
|
-
"@xyo-network/account-model": "^3.18.
|
|
84
|
-
"@xyo-network/archivist-abstract": "^3.18.
|
|
85
|
-
"@xyo-network/
|
|
86
|
-
"@xyo-network/
|
|
87
|
-
"
|
|
88
|
-
"
|
|
82
|
+
"@types/node": "^24.0.8",
|
|
83
|
+
"@xylabs/object": "^4.12.29",
|
|
84
|
+
"@xylabs/ts-scripts-yarn3": "^6.5.12",
|
|
85
|
+
"@xylabs/tsconfig": "^6.5.12",
|
|
86
|
+
"@xyo-network/account": "^3.18.10",
|
|
87
|
+
"@xyo-network/account-model": "^3.18.10",
|
|
88
|
+
"@xyo-network/archivist-abstract": "^3.18.10",
|
|
89
|
+
"@xyo-network/bios-model": "^5.0.13",
|
|
90
|
+
"@xyo-network/boundwitness-builder": "^3.18.10",
|
|
91
|
+
"@xyo-network/node-core-model": "^3.7.16",
|
|
92
|
+
"@xyo-network/node-memory": "^3.18.10",
|
|
93
|
+
"dotenv": "^17.0.1",
|
|
94
|
+
"knip": "^5.61.3",
|
|
89
95
|
"nodemon": "^3.1.10",
|
|
90
96
|
"typescript": "^5.8.3",
|
|
91
|
-
"vitest": "^3.2.
|
|
97
|
+
"vitest": "^3.2.4",
|
|
92
98
|
"vitest-mock-extended": "^3.1.0"
|
|
93
99
|
},
|
|
94
100
|
"engines": {
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
|
-
import { asAddress } from '@xylabs/hex'
|
|
2
|
+
import { asAddress, ZERO_ADDRESS } from '@xylabs/hex'
|
|
3
|
+
import type { Logger } from '@xylabs/logger'
|
|
4
|
+
import { isDefined } from '@xylabs/typeof'
|
|
3
5
|
import { MemoryArchivist } from '@xyo-network/archivist-memory'
|
|
4
6
|
import { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'
|
|
5
7
|
import { ViewArchivist } from '@xyo-network/archivist-view'
|
|
6
8
|
import {
|
|
7
|
-
|
|
9
|
+
AddressBalanceDivinerV2, ArchivistSyncDiviner, HeadValidationDiviner,
|
|
8
10
|
} from '@xyo-network/chain-modules'
|
|
9
11
|
import { initTelemetry } from '@xyo-network/chain-telemetry'
|
|
12
|
+
import { LoggerModuleStatusReporter } from '@xyo-network/module-abstract'
|
|
10
13
|
import { hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'
|
|
11
14
|
import { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'
|
|
12
15
|
import { MemorySentinel } from '@xyo-network/sentinel-memory'
|
|
@@ -16,7 +19,7 @@ import { MemorySentinel } from '@xyo-network/sentinel-memory'
|
|
|
16
19
|
* operation of the node (entirely in memory)
|
|
17
20
|
* @returns A locator with the necessary modules registered
|
|
18
21
|
*/
|
|
19
|
-
export const getLocator = async () => {
|
|
22
|
+
export const getLocator = async (logger?: Logger) => {
|
|
20
23
|
const { traceProvider, meterProvider } = await initTelemetry({
|
|
21
24
|
attributes: {
|
|
22
25
|
serviceName: 'xl1-api',
|
|
@@ -27,29 +30,47 @@ export const getLocator = async () => {
|
|
|
27
30
|
port: 9465,
|
|
28
31
|
},
|
|
29
32
|
})
|
|
33
|
+
|
|
34
|
+
const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined
|
|
35
|
+
|
|
30
36
|
const locator = new ModuleFactoryLocator()
|
|
31
37
|
// If there's a MongoDB configuration
|
|
32
38
|
if (hasMongoDBConfig()) {
|
|
33
39
|
// Register the MongoDB Archivist & Diviners as the defaults
|
|
34
40
|
locator.register(MongoDBArchivistV2.factory(
|
|
35
|
-
{
|
|
36
|
-
|
|
41
|
+
{
|
|
42
|
+
traceProvider, meterProvider, statusReporter,
|
|
43
|
+
},
|
|
44
|
+
), undefined, true)
|
|
37
45
|
}
|
|
38
|
-
|
|
46
|
+
|
|
47
|
+
locator.register(AddressBalanceDivinerV2.factory({
|
|
48
|
+
traceProvider, meterProvider, statusReporter,
|
|
49
|
+
}))
|
|
50
|
+
|
|
51
|
+
const chainId = isDefined(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS)
|
|
52
|
+
? assertEx(
|
|
53
|
+
asAddress(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS) ?? ZERO_ADDRESS,
|
|
54
|
+
() => 'XYO_EVM_STAKING_CONTRACT_ADDRESS is required and must be an Address',
|
|
55
|
+
)
|
|
56
|
+
: ZERO_ADDRESS
|
|
39
57
|
locator.register(HeadValidationDiviner.factory({
|
|
40
58
|
traceProvider,
|
|
41
59
|
meterProvider,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
60
|
+
statusReporter,
|
|
61
|
+
chainId,
|
|
62
|
+
}))
|
|
63
|
+
locator.register(MemoryArchivist.factory({
|
|
64
|
+
traceProvider, meterProvider, statusReporter,
|
|
65
|
+
}))
|
|
66
|
+
locator.register(MemorySentinel.factory({
|
|
67
|
+
traceProvider, meterProvider, statusReporter,
|
|
68
|
+
}))
|
|
69
|
+
locator.register(ViewArchivist.factory({
|
|
70
|
+
traceProvider, meterProvider, statusReporter,
|
|
71
|
+
}))
|
|
72
|
+
locator.register(ArchivistSyncDiviner.factory({
|
|
73
|
+
traceProvider, meterProvider, statusReporter,
|
|
49
74
|
}))
|
|
50
|
-
locator.register(MemoryArchivist.factory({ traceProvider, meterProvider }))
|
|
51
|
-
locator.register(MemorySentinel.factory({ traceProvider, meterProvider }))
|
|
52
|
-
locator.register(ViewArchivist.factory({ traceProvider, meterProvider }))
|
|
53
|
-
locator.register(ArchivistSyncDiviner.factory({ traceProvider, meterProvider }))
|
|
54
75
|
return locator
|
|
55
76
|
}
|
package/src/manifest/getNode.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { Logger } from '@xylabs/logger'
|
|
1
2
|
import { ManifestWrapper } from '@xyo-network/manifest-wrapper'
|
|
2
3
|
import type { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'
|
|
3
|
-
import {
|
|
4
|
+
import type { WalletInstance } from '@xyo-network/wallet-model'
|
|
4
5
|
|
|
5
6
|
import { getLocator } from './getLocator.ts'
|
|
6
7
|
import { NodeManifest } from './nodeManifest.ts'
|
|
@@ -12,16 +13,14 @@ import { PublicChildManifests } from './public/index.ts'
|
|
|
12
13
|
* @param locator The locator to use for the node
|
|
13
14
|
* @returns A node with the xyo-chain modules registered
|
|
14
15
|
*/
|
|
15
|
-
export const getNode = async (locator?: ModuleFactoryLocator) => {
|
|
16
|
-
locator = locator ?? await getLocator()
|
|
17
|
-
const mnemonic = process.env.MNEMONIC
|
|
18
|
-
const wallet = await (mnemonic === undefined ? HDWallet.random() : HDWallet.fromPhrase(mnemonic))
|
|
16
|
+
export const getNode = async (wallet: WalletInstance, locator?: ModuleFactoryLocator, logger?: Logger) => {
|
|
17
|
+
locator = locator ?? await getLocator(logger)
|
|
19
18
|
const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)
|
|
20
19
|
const [node, ...childNodes] = await wrapper.loadNodes()
|
|
21
20
|
if (childNodes?.length > 0) {
|
|
22
21
|
await Promise.all(childNodes.map(childNode => node.register(childNode)))
|
|
23
22
|
await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))
|
|
24
23
|
}
|
|
25
|
-
console.log(await node.state())
|
|
24
|
+
// console.log(await node.state())
|
|
26
25
|
return node
|
|
27
26
|
}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"payloadSdkConfig": {
|
|
21
21
|
"collection": "chain_validated"
|
|
22
22
|
},
|
|
23
|
-
"schema": "network.xyo.archivist.
|
|
23
|
+
"schema": "network.xyo.archivist.config"
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
{
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
"payloadSdkConfig": {
|
|
97
97
|
"collection": "chain_submissions"
|
|
98
98
|
},
|
|
99
|
-
"schema": "network.xyo.archivist.
|
|
99
|
+
"schema": "network.xyo.archivist.config"
|
|
100
100
|
}
|
|
101
101
|
},
|
|
102
102
|
{
|
|
@@ -135,4 +135,4 @@
|
|
|
135
135
|
}
|
|
136
136
|
],
|
|
137
137
|
"schema": "network.xyo.manifest"
|
|
138
|
-
}
|
|
138
|
+
}
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"payloadSdkConfig": {
|
|
25
25
|
"collection": "pending_bundles"
|
|
26
26
|
},
|
|
27
|
-
"schema": "network.xyo.archivist.
|
|
27
|
+
"schema": "network.xyo.archivist.config"
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
]
|
|
@@ -32,4 +32,4 @@
|
|
|
32
32
|
}
|
|
33
33
|
],
|
|
34
34
|
"schema": "network.xyo.manifest"
|
|
35
|
-
}
|
|
35
|
+
}
|
package/src/server/app.ts
CHANGED
|
@@ -8,22 +8,20 @@ import {
|
|
|
8
8
|
standardErrors,
|
|
9
9
|
standardResponses,
|
|
10
10
|
} from '@xylabs/express'
|
|
11
|
-
import type {
|
|
11
|
+
import type { NodeInstance } from '@xyo-network/node-model'
|
|
12
12
|
import compression from 'compression'
|
|
13
13
|
import cors from 'cors'
|
|
14
14
|
import type { Express } from 'express'
|
|
15
15
|
import express from 'express'
|
|
16
16
|
|
|
17
|
-
import { getNode } from '../manifest/index.ts'
|
|
18
17
|
import { addInstrumentation } from './instrumentation.ts'
|
|
19
18
|
import { addRoutes } from './routes/index.ts'
|
|
20
19
|
|
|
21
|
-
export const getApp =
|
|
22
|
-
node = node ?? (await getNode())
|
|
20
|
+
export const getApp = (node: NodeInstance): Express => {
|
|
23
21
|
addInstrumentation()
|
|
24
22
|
const app = express()
|
|
25
23
|
app.set('etag', false)
|
|
26
|
-
|
|
24
|
+
|
|
27
25
|
app.use(cors())
|
|
28
26
|
app.use(compression())
|
|
29
27
|
app.use(responseProfiler)
|
package/src/server/server.ts
CHANGED
|
@@ -1,15 +1,47 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import { Base } from '@xylabs/base'
|
|
1
3
|
import { tryParseInt } from '@xylabs/express'
|
|
2
|
-
import type {
|
|
4
|
+
import type { Logger } from '@xylabs/logger'
|
|
5
|
+
import { isString } from '@xylabs/typeof'
|
|
6
|
+
import { boot } from '@xyo-network/bios'
|
|
7
|
+
import type { BiosExternalInterface } from '@xyo-network/bios-model'
|
|
8
|
+
import type { NodeInstance } from '@xyo-network/node-model'
|
|
9
|
+
import { HDWallet } from '@xyo-network/wallet'
|
|
3
10
|
|
|
11
|
+
import { getNode } from '../manifest/getNode.ts'
|
|
4
12
|
import { getApp } from './app.ts'
|
|
5
13
|
|
|
6
14
|
const hostname = '::'
|
|
7
15
|
// const hostname = '0.0.0.0'
|
|
8
16
|
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
const
|
|
17
|
+
const getSeedPhrase = async (bios: BiosExternalInterface, logger?: Logger): Promise<string> => {
|
|
18
|
+
const storedSeedPhrase = await bios.seedPhraseStore.get('os')
|
|
19
|
+
console.log(`Stored seed phrase: ${storedSeedPhrase}`)
|
|
20
|
+
const envSeedPhrase = process.env.MNEMONIC
|
|
21
|
+
if (isString(storedSeedPhrase) && isString(envSeedPhrase)) {
|
|
22
|
+
logger?.warn('Stored seed phrase does not match environment variable MNEMONIC. Updating to environment variable.')
|
|
23
|
+
await bios.seedPhraseStore.set('os', envSeedPhrase)
|
|
24
|
+
} else {
|
|
25
|
+
const seedPhrase = assertEx(envSeedPhrase ?? (await HDWallet.random()).mnemonic?.phrase, () => 'Unable to acquire seed phrase')
|
|
26
|
+
if (!isString(envSeedPhrase)) {
|
|
27
|
+
logger?.warn('No MNEMONIC environment variable set, using random seed phrase. This is not recommended for production use.')
|
|
28
|
+
logger?.info(`Seed phrase: ${seedPhrase}`)
|
|
29
|
+
}
|
|
30
|
+
await bios.seedPhraseStore.set('os', seedPhrase)
|
|
31
|
+
}
|
|
32
|
+
return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire seed phrase from bios seedPhraseStore')
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const getServer = async (port?: number, node?: NodeInstance, logger = Base.defaultLogger ?? console) => {
|
|
36
|
+
// TODO: Make bios boot able to take a seed phrase as an argument (current behavior is always random 'os' seed phrase)
|
|
37
|
+
// TODO: Make nodejs version of bios support round tripping seed phrase between boots
|
|
38
|
+
const bios = await boot()
|
|
39
|
+
const seedPhrase = await getSeedPhrase(bios, logger)
|
|
40
|
+
const osWallet = await HDWallet.fromPhrase(seedPhrase)
|
|
41
|
+
const appPort = port ?? tryParseInt(process.env.APP_PORT) ?? 8080
|
|
42
|
+
node = node ?? await getNode(osWallet, undefined, logger)
|
|
43
|
+
const app = getApp(node)
|
|
44
|
+
const server = app.listen(appPort, hostname, () => logger.log(`Server listening at http://${hostname}:${appPort}`))
|
|
13
45
|
server.setTimeout(20_000)
|
|
14
46
|
return server
|
|
15
47
|
}
|