@xyo-network/chain-api 1.6.0 → 1.6.1
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 +87 -14
- package/dist/node/index.mjs.map +1 -1
- package/dist/types/driver/index.d.ts +2 -0
- package/dist/types/driver/index.d.ts.map +1 -0
- package/dist/types/driver/mongo/MongoMap.d.ts +17 -0
- package/dist/types/driver/mongo/MongoMap.d.ts.map +1 -0
- package/dist/types/driver/mongo/index.d.ts +2 -0
- package/dist/types/driver/mongo/index.d.ts.map +1 -0
- package/dist/types/manifest/getLocator.d.ts.map +1 -1
- package/dist/types/server/routes/address/get/get.d.ts.map +1 -1
- package/dist/types/server/routes/address/post/post.d.ts.map +1 -1
- package/package.json +38 -37
- package/src/driver/index.ts +1 -0
- package/src/driver/mongo/MongoMap.ts +60 -0
- package/src/driver/mongo/index.ts +1 -0
- package/src/manifest/getLocator.ts +17 -5
- package/src/server/routes/address/get/get.ts +2 -3
- package/src/server/routes/address/post/post.ts +2 -2
package/dist/node/index.mjs
CHANGED
|
@@ -27,9 +27,8 @@ import { StatusCodes as StatusCodes3 } from "http-status-codes";
|
|
|
27
27
|
// src/server/routes/address/get/get.ts
|
|
28
28
|
import { assertEx } from "@xylabs/assert";
|
|
29
29
|
import { asyncHandler } from "@xylabs/express";
|
|
30
|
-
import { asAddress } from "@xylabs/hex";
|
|
30
|
+
import { asAddress, toAddress } from "@xylabs/hex";
|
|
31
31
|
import { isModuleIdentifierPart } from "@xyo-network/module-model";
|
|
32
|
-
import { trimAddressPrefix } from "@xyo-network/node-core-lib";
|
|
33
32
|
import { StatusCodes } from "http-status-codes";
|
|
34
33
|
var handler = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
35
34
|
const { address: rawAddress } = req.params;
|
|
@@ -45,7 +44,7 @@ var handler = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
if (isModuleIdentifierPart(rawAddress)) {
|
|
48
|
-
const moduleIdentifier =
|
|
47
|
+
const moduleIdentifier = toAddress(rawAddress);
|
|
49
48
|
const mod = await node.resolve(moduleIdentifier, {
|
|
50
49
|
direction: "down"
|
|
51
50
|
});
|
|
@@ -62,10 +61,9 @@ var getAddress = asyncHandler(handler);
|
|
|
62
61
|
// src/server/routes/address/post/post.ts
|
|
63
62
|
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
64
63
|
import { asyncHandler as asyncHandler2 } from "@xylabs/express";
|
|
65
|
-
import { asAddress as asAddress2, isAddress } from "@xylabs/hex";
|
|
64
|
+
import { asAddress as asAddress2, isAddress, toAddress as toAddress2 } from "@xylabs/hex";
|
|
66
65
|
import { isQueryBoundWitness } from "@xyo-network/boundwitness-model";
|
|
67
66
|
import { ModuleErrorBuilder } from "@xyo-network/module-abstract";
|
|
68
|
-
import { trimAddressPrefix as trimAddressPrefix2 } from "@xyo-network/node-core-lib";
|
|
69
67
|
import { StatusCodes as StatusCodes2 } from "http-status-codes";
|
|
70
68
|
|
|
71
69
|
// src/server/routes/address/post/getQueryConfig.ts
|
|
@@ -112,7 +110,7 @@ var handler2 = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
|
112
110
|
return returnError(StatusCodes2.BAD_REQUEST, "Invalid query boundwitness");
|
|
113
111
|
}
|
|
114
112
|
let modules = [];
|
|
115
|
-
const normalizedAddress =
|
|
113
|
+
const normalizedAddress = toAddress2(address);
|
|
116
114
|
if (node.address === normalizedAddress) modules = [
|
|
117
115
|
node
|
|
118
116
|
];
|
|
@@ -224,7 +222,7 @@ var getApp = /* @__PURE__ */ __name((node) => {
|
|
|
224
222
|
}, "getApp");
|
|
225
223
|
|
|
226
224
|
// src/server/server.ts
|
|
227
|
-
import { assertEx as
|
|
225
|
+
import { assertEx as assertEx5 } from "@xylabs/assert";
|
|
228
226
|
import { Base } from "@xylabs/base";
|
|
229
227
|
import { tryParseInt } from "@xylabs/express";
|
|
230
228
|
import { isString } from "@xylabs/typeof";
|
|
@@ -235,18 +233,86 @@ import { HDWallet } from "@xyo-network/wallet";
|
|
|
235
233
|
import { ManifestWrapper } from "@xyo-network/manifest-wrapper";
|
|
236
234
|
|
|
237
235
|
// src/manifest/getLocator.ts
|
|
238
|
-
import { assertEx as
|
|
236
|
+
import { assertEx as assertEx4 } from "@xylabs/assert";
|
|
239
237
|
import { asAddress as asAddress3, ZERO_ADDRESS } from "@xylabs/hex";
|
|
240
238
|
import { isDefined } from "@xylabs/typeof";
|
|
241
239
|
import { MemoryArchivist } from "@xyo-network/archivist-memory";
|
|
242
240
|
import { MongoDBArchivistV2 } from "@xyo-network/archivist-mongodb";
|
|
243
241
|
import { ViewArchivist } from "@xyo-network/archivist-view";
|
|
244
|
-
import { AddressBalanceDivinerV2, ArchivistSyncDiviner, HeadValidationDiviner } from "@xyo-network/chain-modules";
|
|
242
|
+
import { AddressBalanceDivinerV2, ArchivistSyncDiviner, balanceSummaryRepositoryFromMap, HeadValidationDiviner } from "@xyo-network/chain-modules";
|
|
245
243
|
import { initTelemetry } from "@xyo-network/chain-telemetry";
|
|
246
244
|
import { LoggerModuleStatusReporter } from "@xyo-network/module-abstract";
|
|
247
|
-
import { hasMongoDBConfig } from "@xyo-network/module-abstract-mongodb";
|
|
245
|
+
import { getBaseMongoSdk, hasMongoDBConfig } from "@xyo-network/module-abstract-mongodb";
|
|
248
246
|
import { ModuleFactoryLocator } from "@xyo-network/module-factory-locator";
|
|
249
247
|
import { MemorySentinel } from "@xyo-network/sentinel-memory";
|
|
248
|
+
|
|
249
|
+
// src/driver/mongo/MongoMap.ts
|
|
250
|
+
import { assertEx as assertEx3 } from "@xylabs/assert";
|
|
251
|
+
import { creatable } from "@xylabs/creatable";
|
|
252
|
+
import { isNull } from "@xylabs/typeof";
|
|
253
|
+
import { BaseService } from "@xyo-network/chain-services";
|
|
254
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
255
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
256
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
257
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
258
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
259
|
+
}
|
|
260
|
+
__name(_ts_decorate, "_ts_decorate");
|
|
261
|
+
function stripMongoId(doc) {
|
|
262
|
+
const { _id, ...rest } = doc;
|
|
263
|
+
return rest;
|
|
264
|
+
}
|
|
265
|
+
__name(stripMongoId, "stripMongoId");
|
|
266
|
+
var MongoMap = class extends BaseService {
|
|
267
|
+
static {
|
|
268
|
+
__name(this, "MongoMap");
|
|
269
|
+
}
|
|
270
|
+
get sdk() {
|
|
271
|
+
return assertEx3(this.params.sdk, () => "No sdk specified");
|
|
272
|
+
}
|
|
273
|
+
async clear() {
|
|
274
|
+
await this.sdk.deleteMany({});
|
|
275
|
+
}
|
|
276
|
+
async delete(id) {
|
|
277
|
+
const filter = {
|
|
278
|
+
_id: id
|
|
279
|
+
};
|
|
280
|
+
const result = await this.sdk.deleteOne(filter);
|
|
281
|
+
return result.deletedCount > 0;
|
|
282
|
+
}
|
|
283
|
+
async get(id) {
|
|
284
|
+
const filter = {
|
|
285
|
+
_id: id
|
|
286
|
+
};
|
|
287
|
+
const doc = await this.sdk.findOne(filter);
|
|
288
|
+
return isNull(doc) ? void 0 : stripMongoId(doc);
|
|
289
|
+
}
|
|
290
|
+
async has(id) {
|
|
291
|
+
const filter = {
|
|
292
|
+
_id: id
|
|
293
|
+
};
|
|
294
|
+
const exists = await this.sdk.findOne(filter);
|
|
295
|
+
return isNull(exists) ? false : true;
|
|
296
|
+
}
|
|
297
|
+
async set(id, data) {
|
|
298
|
+
const filter = {
|
|
299
|
+
_id: id
|
|
300
|
+
};
|
|
301
|
+
await this.sdk.upsertOne(filter, {
|
|
302
|
+
...data,
|
|
303
|
+
_id: id
|
|
304
|
+
});
|
|
305
|
+
return this;
|
|
306
|
+
}
|
|
307
|
+
async startHandler() {
|
|
308
|
+
await super.startHandler();
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
MongoMap = _ts_decorate([
|
|
312
|
+
creatable()
|
|
313
|
+
], MongoMap);
|
|
314
|
+
|
|
315
|
+
// src/manifest/getLocator.ts
|
|
250
316
|
var getLocator = /* @__PURE__ */ __name(async (logger) => {
|
|
251
317
|
const { traceProvider, meterProvider } = await initTelemetry({
|
|
252
318
|
attributes: {
|
|
@@ -260,19 +326,26 @@ var getLocator = /* @__PURE__ */ __name(async (logger) => {
|
|
|
260
326
|
});
|
|
261
327
|
const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : void 0;
|
|
262
328
|
const locator = new ModuleFactoryLocator();
|
|
329
|
+
let summaryMap = /* @__PURE__ */ new Map();
|
|
263
330
|
if (hasMongoDBConfig()) {
|
|
264
331
|
locator.register(MongoDBArchivistV2.factory({
|
|
265
332
|
traceProvider,
|
|
266
333
|
meterProvider,
|
|
267
334
|
statusReporter
|
|
268
335
|
}), void 0, true);
|
|
336
|
+
const sdk = getBaseMongoSdk("balance_summary_map");
|
|
337
|
+
summaryMap = await MongoMap.create({
|
|
338
|
+
sdk
|
|
339
|
+
});
|
|
269
340
|
}
|
|
341
|
+
const summaryRepository = balanceSummaryRepositoryFromMap(summaryMap);
|
|
270
342
|
locator.register(AddressBalanceDivinerV2.factory({
|
|
271
343
|
traceProvider,
|
|
272
344
|
meterProvider,
|
|
273
|
-
statusReporter
|
|
345
|
+
statusReporter,
|
|
346
|
+
summaryRepository
|
|
274
347
|
}));
|
|
275
|
-
const chainId = isDefined(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS) ?
|
|
348
|
+
const chainId = isDefined(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS) ? assertEx4(asAddress3(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS), () => "XYO_EVM_STAKING_CONTRACT_ADDRESS is required and must be an Address") : ZERO_ADDRESS;
|
|
276
349
|
locator.register(HeadValidationDiviner.factory({
|
|
277
350
|
traceProvider,
|
|
278
351
|
meterProvider,
|
|
@@ -534,14 +607,14 @@ var getSeedPhrase = /* @__PURE__ */ __name(async (bios, logger) => {
|
|
|
534
607
|
logger?.warn("Stored seed phrase does not match environment variable MNEMONIC. Updating to environment variable.");
|
|
535
608
|
await bios.seedPhraseStore.set("os", envSeedPhrase);
|
|
536
609
|
} else {
|
|
537
|
-
const seedPhrase =
|
|
610
|
+
const seedPhrase = assertEx5(envSeedPhrase ?? (await HDWallet.random()).mnemonic?.phrase, () => "Unable to acquire seed phrase");
|
|
538
611
|
if (!isString(envSeedPhrase)) {
|
|
539
612
|
logger?.warn("No MNEMONIC environment variable set, using random seed phrase. This is not recommended for production use.");
|
|
540
613
|
logger?.info(`Seed phrase: ${seedPhrase}`);
|
|
541
614
|
}
|
|
542
615
|
await bios.seedPhraseStore.set("os", seedPhrase);
|
|
543
616
|
}
|
|
544
|
-
return
|
|
617
|
+
return assertEx5(await bios.seedPhraseStore.get("os"), () => "Unable to acquire seed phrase from bios seedPhraseStore");
|
|
545
618
|
}, "getSeedPhrase");
|
|
546
619
|
var getServer = /* @__PURE__ */ __name(async (port, node, logger = Base.defaultLogger ?? console) => {
|
|
547
620
|
const bios = await boot();
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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<HeadValidationDiviner>({\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
|
+
{"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/driver/mongo/MongoMap.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, toAddress } from '@xylabs/hex'\nimport { isModuleIdentifierPart } from '@xyo-network/module-model'\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 = toAddress(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 toAddress,\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 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 = toAddress(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 type { Hash } from '@xylabs/hex'\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, balanceSummaryRepositoryFromMap, HeadValidationDiviner,\n} from '@xyo-network/chain-modules'\nimport type { MapType } from '@xyo-network/chain-protocol'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { LoggerModuleStatusReporter } from '@xyo-network/module-abstract'\nimport { getBaseMongoSdk, hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'\n\nimport { MongoMap } from '../driver/index.ts'\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 // Initialize with an in-memory map for backing the summary repository\n let summaryMap: MapType<Hash, WithStorageMeta<BalancesStepSummary>> = new Map<Hash, WithStorageMeta<BalancesStepSummary>>()\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 // Use a persistent MongoMap for the summary repository if MongoDB is configured\n const sdk = getBaseMongoSdk<WithStorageMeta<BalancesStepSummary>>('balance_summary_map')\n summaryMap = await MongoMap.create<MongoMap<Hash, WithStorageMeta<BalancesStepSummary>>>({ sdk })\n }\n\n const summaryRepository = balanceSummaryRepositoryFromMap(summaryMap)\n locator.register(AddressBalanceDivinerV2.factory<AddressBalanceDivinerV2>({\n traceProvider, meterProvider, statusReporter, summaryRepository,\n }))\n\n const chainId = isDefined(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS)\n ? 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 : ZERO_ADDRESS\n locator.register(HeadValidationDiviner.factory<HeadValidationDiviner>({\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","import { assertEx } from '@xylabs/assert'\nimport { creatable } from '@xylabs/creatable'\nimport { BaseMongoSdk } from '@xylabs/mongo'\nimport { isNull } from '@xylabs/typeof'\nimport { AsynchronousMap } from '@xyo-network/chain-protocol'\nimport { BaseService, BaseServiceParams } from '@xyo-network/chain-services'\nimport {\n Document, Filter, WithId,\n} from 'mongodb'\n\nexport interface MongoMapParams<TData extends Document = Document> extends BaseServiceParams {\n sdk: BaseMongoSdk<TData>\n}\n\nfunction stripMongoId<V extends Document>(doc: WithId<V>): V {\n const { _id, ...rest } = doc\n return rest as unknown as V\n}\n\n@creatable()\nexport class MongoMap<K = string, V extends Document = Document>\n extends BaseService<MongoMapParams<V>>\n implements AsynchronousMap<K, V> {\n get sdk(): BaseMongoSdk<V> {\n return assertEx(this.params.sdk, () => 'No sdk specified')\n }\n\n async clear(): Promise<void> {\n await this.sdk.deleteMany({})\n }\n\n async delete(id: K): Promise<boolean> {\n const filter = { _id: id } as Filter<V>\n const result = await this.sdk.deleteOne(filter)\n return result.deletedCount > 0\n }\n\n async get(id: K): Promise<V | undefined> {\n const filter = { _id: id } as Filter<V>\n const doc = await this.sdk.findOne(filter)\n return isNull(doc) ? undefined : stripMongoId(doc)\n }\n\n async has(id: K): Promise<boolean> {\n const filter = { _id: id } as Filter<V>\n const exists = await this.sdk.findOne(filter)\n return isNull(exists) ? false : true\n }\n\n async set(id: K, data: V): Promise<this> {\n const filter = { _id: id } as Filter<V>\n await this.sdk.upsertOne(filter, { ...data, _id: id })\n return this\n }\n\n override async startHandler(): Promise<void> {\n await super.startHandler()\n // TODO: Ensure index\n }\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","toAddress","isModuleIdentifierPart","StatusCodes","handler","req","res","next","address","rawAddress","params","node","app","asAddress","undefined","mod","resolve","direction","json","state","isModuleIdentifierPart","moduleIdentifier","toAddress","moduleAddress","assertEx","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","assertEx","asyncHandler","asAddress","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","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","toAddress","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","balanceSummaryRepositoryFromMap","HeadValidationDiviner","initTelemetry","LoggerModuleStatusReporter","getBaseMongoSdk","hasMongoDBConfig","ModuleFactoryLocator","MemorySentinel","assertEx","creatable","isNull","BaseService","stripMongoId","doc","_id","rest","MongoMap","BaseService","sdk","assertEx","params","clear","deleteMany","delete","id","filter","result","deleteOne","deletedCount","get","findOne","isNull","undefined","has","exists","set","data","upsertOne","startHandler","getLocator","logger","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","statusReporter","LoggerModuleStatusReporter","undefined","locator","ModuleFactoryLocator","summaryMap","Map","hasMongoDBConfig","register","MongoDBArchivistV2","factory","sdk","getBaseMongoSdk","MongoMap","create","summaryRepository","balanceSummaryRepositoryFromMap","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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/driver/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseMongoSdk } from '@xylabs/mongo';
|
|
2
|
+
import { AsynchronousMap } from '@xyo-network/chain-protocol';
|
|
3
|
+
import { BaseService, BaseServiceParams } from '@xyo-network/chain-services';
|
|
4
|
+
import { Document } from 'mongodb';
|
|
5
|
+
export interface MongoMapParams<TData extends Document = Document> extends BaseServiceParams {
|
|
6
|
+
sdk: BaseMongoSdk<TData>;
|
|
7
|
+
}
|
|
8
|
+
export declare class MongoMap<K = string, V extends Document = Document> extends BaseService<MongoMapParams<V>> implements AsynchronousMap<K, V> {
|
|
9
|
+
get sdk(): BaseMongoSdk<V>;
|
|
10
|
+
clear(): Promise<void>;
|
|
11
|
+
delete(id: K): Promise<boolean>;
|
|
12
|
+
get(id: K): Promise<V | undefined>;
|
|
13
|
+
has(id: K): Promise<boolean>;
|
|
14
|
+
set(id: K, data: V): Promise<this>;
|
|
15
|
+
startHandler(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=MongoMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoMap.d.ts","sourceRoot":"","sources":["../../../../src/driver/mongo/MongoMap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC5E,OAAO,EACL,QAAQ,EACT,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,cAAc,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,iBAAiB;IAC1F,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;CACzB;AAOD,qBACa,QAAQ,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,QAAQ,GAAG,QAAQ,CAC7D,SAAQ,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CACrC,YAAW,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAEzB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAM/B,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAMlC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAM5B,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/driver/mongo/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA"}
|
|
@@ -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":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAY5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAO1E;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAU,SAAS,MAAM,kCA4D/C,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/get/get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/get/get.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAIzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAwBhE,eAAO,MAAM,UAAU,yOAAwB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/post/post.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/post/post.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAE7F,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAItE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAGhE,KAAK,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,SAAS,GAAG,OAAO,EAAE,CAAC,CAAA;AA2DxE,eAAO,MAAM,WAAW,wSAAwB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-api",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"description": "XYO Layer One API",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -43,53 +43,54 @@
|
|
|
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.12.
|
|
47
|
-
"@xylabs/base": "^4.12.
|
|
48
|
-
"@xylabs/express": "^4.12.
|
|
49
|
-
"@xylabs/hex": "^4.12.
|
|
50
|
-
"@xylabs/logger": "^4.12.
|
|
51
|
-
"@xylabs/
|
|
52
|
-
"@
|
|
53
|
-
"@xyo-network/archivist-
|
|
54
|
-
"@xyo-network/archivist-
|
|
55
|
-
"@xyo-network/
|
|
56
|
-
"@xyo-network/
|
|
57
|
-
"@xyo-network/
|
|
58
|
-
"@xyo-network/chain-
|
|
59
|
-
"@xyo-network/chain-
|
|
60
|
-
"@xyo-network/
|
|
61
|
-
"@xyo-network/
|
|
62
|
-
"@xyo-network/
|
|
63
|
-
"@xyo-network/
|
|
64
|
-
"@xyo-network/module-
|
|
65
|
-
"@xyo-network/module-
|
|
66
|
-
"@xyo-network/
|
|
67
|
-
"@xyo-network/
|
|
68
|
-
"@xyo-network/
|
|
69
|
-
"@xyo-network/
|
|
70
|
-
"@xyo-network/
|
|
71
|
-
"@xyo-network/wallet
|
|
72
|
-
"@xyo-network/
|
|
46
|
+
"@xylabs/assert": "^4.12.40",
|
|
47
|
+
"@xylabs/base": "^4.12.40",
|
|
48
|
+
"@xylabs/express": "^4.12.40",
|
|
49
|
+
"@xylabs/hex": "^4.12.40",
|
|
50
|
+
"@xylabs/logger": "^4.12.40",
|
|
51
|
+
"@xylabs/mongo": "^4.12.40",
|
|
52
|
+
"@xylabs/typeof": "^4.12.40",
|
|
53
|
+
"@xyo-network/archivist-memory": "^4.0.2",
|
|
54
|
+
"@xyo-network/archivist-mongodb": "^4.0.2",
|
|
55
|
+
"@xyo-network/archivist-view": "^4.0.2",
|
|
56
|
+
"@xyo-network/bios": "^6.0.0",
|
|
57
|
+
"@xyo-network/boundwitness-model": "^4.0.2",
|
|
58
|
+
"@xyo-network/chain-modules": "^1.6.1",
|
|
59
|
+
"@xyo-network/chain-rpc": "^1.6.1",
|
|
60
|
+
"@xyo-network/chain-services": "^1.6.1",
|
|
61
|
+
"@xyo-network/chain-telemetry": "^1.6.1",
|
|
62
|
+
"@xyo-network/manifest-model": "^4.0.2",
|
|
63
|
+
"@xyo-network/manifest-wrapper": "^4.0.2",
|
|
64
|
+
"@xyo-network/module-abstract": "^4.0.2",
|
|
65
|
+
"@xyo-network/module-abstract-mongodb": "^4.0.2",
|
|
66
|
+
"@xyo-network/module-factory-locator": "^4.0.2",
|
|
67
|
+
"@xyo-network/module-model": "^4.0.2",
|
|
68
|
+
"@xyo-network/node-model": "^4.0.2",
|
|
69
|
+
"@xyo-network/payload-model": "^4.0.2",
|
|
70
|
+
"@xyo-network/sentinel-memory": "^4.0.2",
|
|
71
|
+
"@xyo-network/wallet": "^4.0.2",
|
|
72
|
+
"@xyo-network/wallet-model": "^4.0.2",
|
|
73
|
+
"@xyo-network/xl1-rpc": "^1.6.1",
|
|
73
74
|
"compression": "^1.8.0",
|
|
74
75
|
"cors": "^2.8.5",
|
|
75
76
|
"express": "^5.1.0",
|
|
76
|
-
"http-status-codes": "^2.3.0"
|
|
77
|
+
"http-status-codes": "^2.3.0",
|
|
78
|
+
"mongodb": "^6.17.0"
|
|
77
79
|
},
|
|
78
80
|
"devDependencies": {
|
|
79
81
|
"@types/compression": "^1.8.1",
|
|
80
82
|
"@types/cors": "^2.8.19",
|
|
81
83
|
"@types/express": "5.0.3",
|
|
82
84
|
"@types/node": "^24.0.10",
|
|
83
|
-
"@xylabs/object": "^4.12.
|
|
85
|
+
"@xylabs/object": "^4.12.40",
|
|
84
86
|
"@xylabs/ts-scripts-yarn3": "^6.5.12",
|
|
85
87
|
"@xylabs/tsconfig": "^6.5.12",
|
|
86
|
-
"@xyo-network/account": "^4.0.
|
|
87
|
-
"@xyo-network/account-model": "^4.0.
|
|
88
|
-
"@xyo-network/archivist-abstract": "^4.0.
|
|
89
|
-
"@xyo-network/bios-model": "^
|
|
90
|
-
"@xyo-network/boundwitness-builder": "^4.0.
|
|
91
|
-
"@xyo-network/node-
|
|
92
|
-
"@xyo-network/node-memory": "^4.0.1",
|
|
88
|
+
"@xyo-network/account": "^4.0.2",
|
|
89
|
+
"@xyo-network/account-model": "^4.0.2",
|
|
90
|
+
"@xyo-network/archivist-abstract": "^4.0.2",
|
|
91
|
+
"@xyo-network/bios-model": "^6.0.0",
|
|
92
|
+
"@xyo-network/boundwitness-builder": "^4.0.2",
|
|
93
|
+
"@xyo-network/node-memory": "^4.0.2",
|
|
93
94
|
"dotenv": "^17.0.1",
|
|
94
95
|
"knip": "^5.61.3",
|
|
95
96
|
"nodemon": "^3.1.10",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './mongo/index.ts'
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import { creatable } from '@xylabs/creatable'
|
|
3
|
+
import { BaseMongoSdk } from '@xylabs/mongo'
|
|
4
|
+
import { isNull } from '@xylabs/typeof'
|
|
5
|
+
import { AsynchronousMap } from '@xyo-network/chain-protocol'
|
|
6
|
+
import { BaseService, BaseServiceParams } from '@xyo-network/chain-services'
|
|
7
|
+
import {
|
|
8
|
+
Document, Filter, WithId,
|
|
9
|
+
} from 'mongodb'
|
|
10
|
+
|
|
11
|
+
export interface MongoMapParams<TData extends Document = Document> extends BaseServiceParams {
|
|
12
|
+
sdk: BaseMongoSdk<TData>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function stripMongoId<V extends Document>(doc: WithId<V>): V {
|
|
16
|
+
const { _id, ...rest } = doc
|
|
17
|
+
return rest as unknown as V
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@creatable()
|
|
21
|
+
export class MongoMap<K = string, V extends Document = Document>
|
|
22
|
+
extends BaseService<MongoMapParams<V>>
|
|
23
|
+
implements AsynchronousMap<K, V> {
|
|
24
|
+
get sdk(): BaseMongoSdk<V> {
|
|
25
|
+
return assertEx(this.params.sdk, () => 'No sdk specified')
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async clear(): Promise<void> {
|
|
29
|
+
await this.sdk.deleteMany({})
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async delete(id: K): Promise<boolean> {
|
|
33
|
+
const filter = { _id: id } as Filter<V>
|
|
34
|
+
const result = await this.sdk.deleteOne(filter)
|
|
35
|
+
return result.deletedCount > 0
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async get(id: K): Promise<V | undefined> {
|
|
39
|
+
const filter = { _id: id } as Filter<V>
|
|
40
|
+
const doc = await this.sdk.findOne(filter)
|
|
41
|
+
return isNull(doc) ? undefined : stripMongoId(doc)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async has(id: K): Promise<boolean> {
|
|
45
|
+
const filter = { _id: id } as Filter<V>
|
|
46
|
+
const exists = await this.sdk.findOne(filter)
|
|
47
|
+
return isNull(exists) ? false : true
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async set(id: K, data: V): Promise<this> {
|
|
51
|
+
const filter = { _id: id } as Filter<V>
|
|
52
|
+
await this.sdk.upsertOne(filter, { ...data, _id: id })
|
|
53
|
+
return this
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
override async startHandler(): Promise<void> {
|
|
57
|
+
await super.startHandler()
|
|
58
|
+
// TODO: Ensure index
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MongoMap.ts'
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import type { Hash } from '@xylabs/hex'
|
|
2
3
|
import { asAddress, ZERO_ADDRESS } from '@xylabs/hex'
|
|
3
4
|
import type { Logger } from '@xylabs/logger'
|
|
4
5
|
import { isDefined } from '@xylabs/typeof'
|
|
@@ -6,13 +7,18 @@ import { MemoryArchivist } from '@xyo-network/archivist-memory'
|
|
|
6
7
|
import { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'
|
|
7
8
|
import { ViewArchivist } from '@xyo-network/archivist-view'
|
|
8
9
|
import {
|
|
9
|
-
AddressBalanceDivinerV2, ArchivistSyncDiviner, HeadValidationDiviner,
|
|
10
|
+
AddressBalanceDivinerV2, ArchivistSyncDiviner, balanceSummaryRepositoryFromMap, HeadValidationDiviner,
|
|
10
11
|
} from '@xyo-network/chain-modules'
|
|
12
|
+
import type { MapType } from '@xyo-network/chain-protocol'
|
|
11
13
|
import { initTelemetry } from '@xyo-network/chain-telemetry'
|
|
12
14
|
import { LoggerModuleStatusReporter } from '@xyo-network/module-abstract'
|
|
13
|
-
import { hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'
|
|
15
|
+
import { getBaseMongoSdk, hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'
|
|
14
16
|
import { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'
|
|
17
|
+
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
15
18
|
import { MemorySentinel } from '@xyo-network/sentinel-memory'
|
|
19
|
+
import type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'
|
|
20
|
+
|
|
21
|
+
import { MongoMap } from '../driver/index.ts'
|
|
16
22
|
|
|
17
23
|
/**
|
|
18
24
|
* Used for retrieving a locator with the necessary modules registered for testing
|
|
@@ -34,6 +40,8 @@ export const getLocator = async (logger?: Logger) => {
|
|
|
34
40
|
const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined
|
|
35
41
|
|
|
36
42
|
const locator = new ModuleFactoryLocator()
|
|
43
|
+
// Initialize with an in-memory map for backing the summary repository
|
|
44
|
+
let summaryMap: MapType<Hash, WithStorageMeta<BalancesStepSummary>> = new Map<Hash, WithStorageMeta<BalancesStepSummary>>()
|
|
37
45
|
// If there's a MongoDB configuration
|
|
38
46
|
if (hasMongoDBConfig()) {
|
|
39
47
|
// Register the MongoDB Archivist & Diviners as the defaults
|
|
@@ -42,15 +50,19 @@ export const getLocator = async (logger?: Logger) => {
|
|
|
42
50
|
traceProvider, meterProvider, statusReporter,
|
|
43
51
|
},
|
|
44
52
|
), undefined, true)
|
|
53
|
+
// Use a persistent MongoMap for the summary repository if MongoDB is configured
|
|
54
|
+
const sdk = getBaseMongoSdk<WithStorageMeta<BalancesStepSummary>>('balance_summary_map')
|
|
55
|
+
summaryMap = await MongoMap.create<MongoMap<Hash, WithStorageMeta<BalancesStepSummary>>>({ sdk })
|
|
45
56
|
}
|
|
46
57
|
|
|
47
|
-
|
|
48
|
-
|
|
58
|
+
const summaryRepository = balanceSummaryRepositoryFromMap(summaryMap)
|
|
59
|
+
locator.register(AddressBalanceDivinerV2.factory<AddressBalanceDivinerV2>({
|
|
60
|
+
traceProvider, meterProvider, statusReporter, summaryRepository,
|
|
49
61
|
}))
|
|
50
62
|
|
|
51
63
|
const chainId = isDefined(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS)
|
|
52
64
|
? assertEx(
|
|
53
|
-
asAddress(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS)
|
|
65
|
+
asAddress(process.env.XYO_EVM_STAKING_CONTRACT_ADDRESS),
|
|
54
66
|
() => 'XYO_EVM_STAKING_CONTRACT_ADDRESS is required and must be an Address',
|
|
55
67
|
)
|
|
56
68
|
: ZERO_ADDRESS
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
2
|
import { asyncHandler } from '@xylabs/express'
|
|
3
|
-
import { asAddress } from '@xylabs/hex'
|
|
3
|
+
import { asAddress, toAddress } from '@xylabs/hex'
|
|
4
4
|
import { isModuleIdentifierPart } from '@xyo-network/module-model'
|
|
5
|
-
import { trimAddressPrefix } from '@xyo-network/node-core-lib'
|
|
6
5
|
import type { Payload } from '@xyo-network/payload-model'
|
|
7
6
|
import type { RequestHandler } from 'express'
|
|
8
7
|
import { StatusCodes } from 'http-status-codes'
|
|
@@ -21,7 +20,7 @@ const handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, n
|
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
22
|
if (isModuleIdentifierPart(rawAddress)) {
|
|
24
|
-
const moduleIdentifier =
|
|
23
|
+
const moduleIdentifier = toAddress(rawAddress)
|
|
25
24
|
const mod = await node.resolve(moduleIdentifier, { direction: 'down' })
|
|
26
25
|
if (mod) {
|
|
27
26
|
const moduleAddress = assertEx(mod?.address, () => 'Error redirecting to module by address')
|
|
@@ -2,12 +2,12 @@ import { assertEx } from '@xylabs/assert'
|
|
|
2
2
|
import { asyncHandler } from '@xylabs/express'
|
|
3
3
|
import {
|
|
4
4
|
type Address, asAddress, isAddress,
|
|
5
|
+
toAddress,
|
|
5
6
|
} from '@xylabs/hex'
|
|
6
7
|
import type { JsonObject } from '@xylabs/object'
|
|
7
8
|
import { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'
|
|
8
9
|
import { ModuleErrorBuilder } from '@xyo-network/module-abstract'
|
|
9
10
|
import type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'
|
|
10
|
-
import { trimAddressPrefix } from '@xyo-network/node-core-lib'
|
|
11
11
|
import type { ModuleError, Payload } from '@xyo-network/payload-model'
|
|
12
12
|
import type { RequestHandler } from 'express'
|
|
13
13
|
import { StatusCodes } from 'http-status-codes'
|
|
@@ -41,7 +41,7 @@ const handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
let modules: ModuleInstance[] = []
|
|
44
|
-
const normalizedAddress =
|
|
44
|
+
const normalizedAddress = toAddress(address)
|
|
45
45
|
if (node.address === normalizedAddress) modules = [node]
|
|
46
46
|
else {
|
|
47
47
|
const typedAddress = asAddress(address)
|