@xyo-network/chain-api 1.3.17 → 1.3.18

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.
@@ -10,9 +10,10 @@ import express from "express";
10
10
  // src/manifest/getLocator.ts
11
11
  import { assertEx } from "@xylabs/assert";
12
12
  import { asAddress } from "@xylabs/hex";
13
+ import { MemoryArchivist } from "@xyo-network/archivist-memory";
13
14
  import { MongoDBArchivistV2 } from "@xyo-network/archivist-mongodb";
14
15
  import { ViewArchivist } from "@xyo-network/archivist-view";
15
- import { AddressBalanceDiviner, HeadValidationDiviner } from "@xyo-network/chain-modules";
16
+ import { AddressBalanceDiviner, ArchivistSyncDiviner, HeadValidationDiviner } from "@xyo-network/chain-modules";
16
17
  import { initTelemetry } from "@xyo-network/chain-telemetry";
17
18
  import { PayloadPointerDiviner } from "@xyo-network/diviner-payload-pointer";
18
19
  import { TemporalIndexingDiviner, TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner, TemporalIndexingDivinerIndexCandidateToIndexDiviner, TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner, TemporalIndexingDivinerStateToIndexCandidateDiviner } from "@xyo-network/diviner-temporal-indexing";
@@ -32,6 +33,9 @@ var getLocator = /* @__PURE__ */ __name(async () => {
32
33
  }
33
34
  });
34
35
  const locator = new ModuleFactoryLocator();
36
+ locator.register(MemoryArchivist, {
37
+ "network.xyo.storage.class": "memory"
38
+ });
35
39
  if (hasMongoDBConfig()) {
36
40
  locator.register(MongoDBArchivistV2, void 0, true);
37
41
  }
@@ -51,6 +55,7 @@ var getLocator = /* @__PURE__ */ __name(async () => {
51
55
  locator.register(TemporalIndexingDivinerStateToIndexCandidateDiviner);
52
56
  locator.register(TimestampWitness);
53
57
  locator.register(ViewArchivist);
58
+ locator.register(ArchivistSyncDiviner);
54
59
  return locator;
55
60
  }, "getLocator");
56
61
 
@@ -101,7 +106,7 @@ var Chain_default = {
101
106
  labels: {
102
107
  "network.xyo.storage.class": "mongodb"
103
108
  },
104
- name: "Validated",
109
+ name: "ValidatedMongo",
105
110
  payloadSdkConfig: {
106
111
  collection: "chain_validated"
107
112
  },
@@ -113,7 +118,7 @@ var Chain_default = {
113
118
  accountPath: "1/1'/2'",
114
119
  schema: "network.xyo.diviner.chain.head.validation.config",
115
120
  inArchivist: "Chain:Submissions",
116
- outArchivist: "Chain:Validated",
121
+ outArchivist: "Chain:ValidatedMongo",
117
122
  name: "HeadValidationDiviner"
118
123
  }
119
124
  },
@@ -122,7 +127,7 @@ var Chain_default = {
122
127
  accountPath: "1/1'/3'",
123
128
  automations: [
124
129
  {
125
- frequency: 100,
130
+ frequency: 500,
126
131
  frequencyUnits: "millis",
127
132
  schema: "network.xyo.automation.interval",
128
133
  type: "interval"
@@ -138,6 +143,47 @@ var Chain_default = {
138
143
  }
139
144
  ]
140
145
  }
146
+ },
147
+ {
148
+ config: {
149
+ accountPath: "1/1'/4'",
150
+ labels: {
151
+ "network.xyo.storage.class": "memory"
152
+ },
153
+ name: "Validated",
154
+ schema: "network.xyo.archivist.config"
155
+ }
156
+ },
157
+ {
158
+ config: {
159
+ accountPath: "1/1'/5'",
160
+ schema: "network.xyo.diviner.archivist.sync.config",
161
+ inArchivist: "Chain:ValidatedMongo",
162
+ outArchivist: "Chain:Validated",
163
+ name: "ValidatedSyncDiviner"
164
+ }
165
+ },
166
+ {
167
+ config: {
168
+ accountPath: "1/1'/6'",
169
+ automations: [
170
+ {
171
+ frequency: 500,
172
+ frequencyUnits: "millis",
173
+ schema: "network.xyo.automation.interval",
174
+ type: "interval"
175
+ }
176
+ ],
177
+ name: "ValidatedSyncSentinel",
178
+ schema: "network.xyo.sentinel.config",
179
+ synchronous: false,
180
+ tasks: [
181
+ {
182
+ mod: "ValidatedSyncDiviner",
183
+ endPoint: "divine"
184
+ }
185
+ ]
186
+ }
141
187
  }
142
188
  ],
143
189
  public: [
@@ -147,7 +193,7 @@ var Chain_default = {
147
193
  labels: {
148
194
  "network.xyo.storage.class": "mongodb"
149
195
  },
150
- name: "Submissions",
196
+ name: "SubmissionsMongo",
151
197
  payloadSdkConfig: {
152
198
  collection: "chain_submissions"
153
199
  },
@@ -174,6 +220,47 @@ var Chain_default = {
174
220
  archivist: "Chain:Validated",
175
221
  name: "AddressBalanceDiviner"
176
222
  }
223
+ },
224
+ {
225
+ config: {
226
+ accountPath: "1/1/4'",
227
+ labels: {
228
+ "network.xyo.storage.class": "memory"
229
+ },
230
+ name: "Submissions",
231
+ schema: "network.xyo.archivist.config"
232
+ }
233
+ },
234
+ {
235
+ config: {
236
+ accountPath: "1/1/5'",
237
+ schema: "network.xyo.diviner.archivist.sync.config",
238
+ inArchivist: "Chain:SubmissionsMongo",
239
+ outArchivist: "Chain:Submissions",
240
+ name: "SubmissionsSyncDiviner"
241
+ }
242
+ },
243
+ {
244
+ config: {
245
+ accountPath: "1/1/6'",
246
+ automations: [
247
+ {
248
+ frequency: 500,
249
+ frequencyUnits: "millis",
250
+ schema: "network.xyo.automation.interval",
251
+ type: "interval"
252
+ }
253
+ ],
254
+ name: "SubmissionsSyncSentinel",
255
+ schema: "network.xyo.sentinel.config",
256
+ synchronous: false,
257
+ tasks: [
258
+ {
259
+ mod: "SubmissionsSyncDiviner",
260
+ endPoint: "divine"
261
+ }
262
+ ]
263
+ }
177
264
  }
178
265
  ]
179
266
  }
@@ -335,11 +422,10 @@ var getAddress = asyncHandler(handler);
335
422
  // src/server/routes/address/post/post.ts
336
423
  import { assertEx as assertEx3 } from "@xylabs/assert";
337
424
  import { asyncHandler as asyncHandler2 } from "@xylabs/express";
338
- import { asAddress as asAddress3 } from "@xylabs/hex";
425
+ import { asAddress as asAddress3, isAddress } from "@xylabs/hex";
339
426
  import { isQueryBoundWitness } from "@xyo-network/boundwitness-model";
340
427
  import { ModuleErrorBuilder } from "@xyo-network/module-abstract";
341
428
  import { trimAddressPrefix as trimAddressPrefix2 } from "@xyo-network/node-core-lib";
342
- import { isAddress } from "ethers";
343
429
  import { StatusCodes as StatusCodes2 } from "http-status-codes";
344
430
 
345
431
  // src/server/routes/address/post/getQueryConfig.ts
@@ -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 { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'\nimport { ViewArchivist } from '@xyo-network/archivist-view'\nimport { AddressBalanceDiviner, HeadValidationDiviner } from '@xyo-network/chain-modules'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { PayloadPointerDiviner } from '@xyo-network/diviner-payload-pointer'\nimport {\n TemporalIndexingDiviner,\n TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner,\n TemporalIndexingDivinerIndexCandidateToIndexDiviner,\n TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner,\n TemporalIndexingDivinerStateToIndexCandidateDiviner,\n} from '@xyo-network/diviner-temporal-indexing'\nimport { hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { TimestampWitness } from '@xyo-network/witness-timestamp'\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 } = 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, undefined, true)\n }\n locator.register(AddressBalanceDiviner)\n locator.register(HeadValidationDiviner.factory({\n tracer: traceProvider.getTracer('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(MemorySentinel)\n locator.register(PayloadPointerDiviner)\n locator.register(TemporalIndexingDiviner)\n locator.register(TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner)\n locator.register(TemporalIndexingDivinerIndexCandidateToIndexDiviner)\n locator.register(TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner)\n locator.register(TemporalIndexingDivinerStateToIndexCandidateDiviner)\n locator.register(TimestampWitness)\n locator.register(ViewArchivist)\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 \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"name\": \"Validated\",\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 \"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\": 100,\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\": false,\n \"tasks\": [\n {\n \"mod\": \"HeadValidationDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"name\": \"Submissions\",\n \"payloadSdkConfig\": {\n \"collection\": \"chain_submissions\"\n },\n \"schema\": \"network.xyo.archivist.config\",\n \"sourceArchivist\": \"inArchivist\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/2\",\n \"allowedQueries\": [\n \"network.xyo.query.archivist.get\",\n \"network.xyo.query.archivist.next\"\n ],\n \"originArchivist\": \"Chain:Validated\",\n \"name\": \"Finalized\",\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 }\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 {\n \"config\": {\n \"accountPath\": \"2/1'/1'\",\n \"name\": \"TimestampWitness\",\n \"schema\": \"network.xyo.witness.timestamp.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"2/1'/3'\",\n \"archiving\": {\n \"archivists\": [\n \"Pending:PendingTransactions\"\n ]\n },\n \"automations\": [\n {\n \"frequency\": 1,\n \"frequencyUnits\": \"minute\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"TimeTransactionSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": false,\n \"tasks\": [\n {\n \"input\": true,\n \"mod\": \"TimestampWitness\"\n },\n {\n \"input\": [\n \"TimestampWitness\"\n ],\n \"mod\": \"AdHocChainTransactionWitness\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"2/1/1\",\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"language\": \"javascript\",\n \"name\": \"PendingTransactions\",\n \"payloadSdkConfig\": {\n \"collection\": \"pending\"\n },\n \"schema\": \"network.xyo.archivist.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 { type Address, asAddress } 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 { Module, ModuleQueryResult } from '@xyo-network/module-model'\nimport { trimAddressPrefix } from '@xyo-network/node-core-lib'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport { isAddress } from 'ethers'\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: Module[] = []\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 = await 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 { AbstractModule } from '@xyo-network/module-abstract'\nimport type { Module, ModuleConfig } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { ArchiveModuleConfig } from '@xyo-network/node-core-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 = async (mod: Module, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): Promise<ModuleConfig | undefined> => {\n const archivist = mod as unknown as AbstractModule\n const config = archivist?.config as unknown as ArchiveModuleConfig\n const archive = config?.archive\n // TODO: Filter based on query addresses?\n const requestCanAccessArchive = await Promise.resolve(true)\n if (archive && requestCanAccessArchive) {\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)\n const allowed = addresses.length > 0 ? Object.fromEntries(archivist.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n }\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","MongoDBArchivistV2","ViewArchivist","AddressBalanceDiviner","HeadValidationDiviner","initTelemetry","PayloadPointerDiviner","TemporalIndexingDiviner","TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner","TemporalIndexingDivinerIndexCandidateToIndexDiviner","TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner","TemporalIndexingDivinerStateToIndexCandidateDiviner","hasMongoDBConfig","ModuleFactoryLocator","MemorySentinel","TimestampWitness","getLocator","traceProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","locator","ModuleFactoryLocator","hasMongoDBConfig","register","MongoDBArchivistV2","undefined","AddressBalanceDiviner","HeadValidationDiviner","factory","tracer","getTracer","chainIdentification","id","assertEx","asAddress","process","env","XYO_EVM_STAKING_CONTRACT_ADDRESS","MemorySentinel","PayloadPointerDiviner","TemporalIndexingDiviner","TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner","TemporalIndexingDivinerIndexCandidateToIndexDiviner","TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner","TemporalIndexingDivinerStateToIndexCandidateDiviner","TimestampWitness","ViewArchivist","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","isQueryBoundWitness","ModuleErrorBuilder","trimAddressPrefix","isAddress","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","archivist","config","archive","requestCanAccessArchive","Promise","resolve","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/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 { PayloadPointerDiviner } from '@xyo-network/diviner-payload-pointer'\nimport {\n TemporalIndexingDiviner,\n TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner,\n TemporalIndexingDivinerIndexCandidateToIndexDiviner,\n TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner,\n TemporalIndexingDivinerStateToIndexCandidateDiviner,\n} from '@xyo-network/diviner-temporal-indexing'\nimport { hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { TimestampWitness } from '@xyo-network/witness-timestamp'\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 } = 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 locator.register(MemoryArchivist, { 'network.xyo.storage.class': 'memory' })\n if (hasMongoDBConfig()) {\n // Register the MongoDB Archivist & Diviners as the defaults\n locator.register(MongoDBArchivistV2, undefined, true)\n }\n locator.register(AddressBalanceDiviner)\n locator.register(HeadValidationDiviner.factory({\n tracer: traceProvider.getTracer('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(MemorySentinel)\n locator.register(PayloadPointerDiviner)\n locator.register(TemporalIndexingDiviner)\n locator.register(TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner)\n locator.register(TemporalIndexingDivinerIndexCandidateToIndexDiviner)\n locator.register(TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner)\n locator.register(TemporalIndexingDivinerStateToIndexCandidateDiviner)\n locator.register(TimestampWitness)\n locator.register(ViewArchivist)\n locator.register(ArchivistSyncDiviner)\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 \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"name\": \"ValidatedMongo\",\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 \"inArchivist\": \"Chain:Submissions\",\n \"outArchivist\": \"Chain:ValidatedMongo\",\n \"name\": \"HeadValidationDiviner\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/3'\",\n \"automations\": [\n {\n \"frequency\": 500,\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\": false,\n \"tasks\": [\n {\n \"mod\": \"HeadValidationDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/4'\",\n \"labels\": {\n \"network.xyo.storage.class\": \"memory\"\n },\n \"name\": \"Validated\",\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/5'\",\n \"schema\": \"network.xyo.diviner.archivist.sync.config\",\n \"inArchivist\": \"Chain:ValidatedMongo\",\n \"outArchivist\": \"Chain:Validated\",\n \"name\": \"ValidatedSyncDiviner\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/6'\",\n \"automations\": [\n {\n \"frequency\": 500,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"ValidatedSyncSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": false,\n \"tasks\": [\n {\n \"mod\": \"ValidatedSyncDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"name\": \"SubmissionsMongo\",\n \"payloadSdkConfig\": {\n \"collection\": \"chain_submissions\"\n },\n \"schema\": \"network.xyo.archivist.config\",\n \"sourceArchivist\": \"inArchivist\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/2\",\n \"allowedQueries\": [\n \"network.xyo.query.archivist.get\",\n \"network.xyo.query.archivist.next\"\n ],\n \"originArchivist\": \"Chain:Validated\",\n \"name\": \"Finalized\",\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 }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/4'\",\n \"labels\": {\n \"network.xyo.storage.class\": \"memory\"\n },\n \"name\": \"Submissions\",\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/5'\",\n \"schema\": \"network.xyo.diviner.archivist.sync.config\",\n \"inArchivist\": \"Chain:SubmissionsMongo\",\n \"outArchivist\": \"Chain:Submissions\",\n \"name\": \"SubmissionsSyncDiviner\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/6'\",\n \"automations\": [\n {\n \"frequency\": 500,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"SubmissionsSyncSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": false,\n \"tasks\": [\n {\n \"mod\": \"SubmissionsSyncDiviner\",\n \"endPoint\": \"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 {\n \"config\": {\n \"accountPath\": \"2/1'/1'\",\n \"name\": \"TimestampWitness\",\n \"schema\": \"network.xyo.witness.timestamp.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"2/1'/3'\",\n \"archiving\": {\n \"archivists\": [\n \"Pending:PendingTransactions\"\n ]\n },\n \"automations\": [\n {\n \"frequency\": 1,\n \"frequencyUnits\": \"minute\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"TimeTransactionSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": false,\n \"tasks\": [\n {\n \"input\": true,\n \"mod\": \"TimestampWitness\"\n },\n {\n \"input\": [\n \"TimestampWitness\"\n ],\n \"mod\": \"AdHocChainTransactionWitness\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"2/1/1\",\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"language\": \"javascript\",\n \"name\": \"PendingTransactions\",\n \"payloadSdkConfig\": {\n \"collection\": \"pending\"\n },\n \"schema\": \"network.xyo.archivist.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 { Module, 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: Module[] = []\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 = await 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 { AbstractModule } from '@xyo-network/module-abstract'\nimport type { Module, ModuleConfig } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { ArchiveModuleConfig } from '@xyo-network/node-core-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 = async (mod: Module, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): Promise<ModuleConfig | undefined> => {\n const archivist = mod as unknown as AbstractModule\n const config = archivist?.config as unknown as ArchiveModuleConfig\n const archive = config?.archive\n // TODO: Filter based on query addresses?\n const requestCanAccessArchive = await Promise.resolve(true)\n if (archive && requestCanAccessArchive) {\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)\n const allowed = addresses.length > 0 ? Object.fromEntries(archivist.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n }\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","PayloadPointerDiviner","TemporalIndexingDiviner","TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner","TemporalIndexingDivinerIndexCandidateToIndexDiviner","TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner","TemporalIndexingDivinerStateToIndexCandidateDiviner","hasMongoDBConfig","ModuleFactoryLocator","MemorySentinel","TimestampWitness","getLocator","traceProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","locator","ModuleFactoryLocator","register","MemoryArchivist","hasMongoDBConfig","MongoDBArchivistV2","undefined","AddressBalanceDiviner","HeadValidationDiviner","factory","tracer","getTracer","chainIdentification","id","assertEx","asAddress","process","env","XYO_EVM_STAKING_CONTRACT_ADDRESS","MemorySentinel","PayloadPointerDiviner","TemporalIndexingDiviner","TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner","TemporalIndexingDivinerIndexCandidateToIndexDiviner","TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner","TemporalIndexingDivinerStateToIndexCandidateDiviner","TimestampWitness","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","archivist","config","archive","requestCanAccessArchive","Promise","resolve","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 +1 @@
1
- {"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAI1E;;;;GAIG;AACH,eAAO,MAAM,UAAU,qCAqCtB,CAAA"}
1
+ {"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAI1E;;;;GAIG;AACH,eAAO,MAAM,UAAU,qCAuCtB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/post/post.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAE7F,OAAO,KAAK,EAAU,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAKtE,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"}
1
+ {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/post/post.ts"],"names":[],"mappings":"AAMA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAE7F,OAAO,KAAK,EAAU,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE1E,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,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json.schemastore.org/package.json",
3
3
  "name": "@xyo-network/chain-api",
4
- "version": "1.3.17",
4
+ "version": "1.3.18",
5
5
  "description": "XYO Layer One API",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -44,31 +44,32 @@
44
44
  "@opentelemetry/instrumentation": "^0.49.1",
45
45
  "@opentelemetry/instrumentation-express": "^0.49.0",
46
46
  "@opentelemetry/instrumentation-http": "^0.200.0",
47
- "@xylabs/assert": "^4.9.3",
48
- "@xylabs/express": "^4.9.3",
49
- "@xylabs/hex": "^4.9.3",
50
- "@xyo-network/archivist-mongodb": "^3.14.17",
51
- "@xyo-network/archivist-view": "^3.14.17",
52
- "@xyo-network/boundwitness-model": "^3.14.17",
53
- "@xyo-network/chain-modules": "^1.3.17",
54
- "@xyo-network/chain-rpc": "^1.3.17",
55
- "@xyo-network/chain-telemetry": "^1.3.17",
56
- "@xyo-network/diviner-payload-pointer": "^3.14.17",
57
- "@xyo-network/diviner-temporal-indexing": "^3.14.17",
58
- "@xyo-network/manifest-model": "^3.14.17",
59
- "@xyo-network/manifest-wrapper": "^3.14.17",
60
- "@xyo-network/module-abstract": "^3.14.17",
61
- "@xyo-network/module-abstract-mongodb": "^3.14.17",
62
- "@xyo-network/module-factory-locator": "^3.14.17",
63
- "@xyo-network/module-model": "^3.14.17",
47
+ "@xylabs/assert": "^4.9.4",
48
+ "@xylabs/express": "^4.9.4",
49
+ "@xylabs/hex": "^4.9.4",
50
+ "@xyo-network/archivist-memory": "^3.14.18",
51
+ "@xyo-network/archivist-mongodb": "^3.14.18",
52
+ "@xyo-network/archivist-view": "^3.14.18",
53
+ "@xyo-network/boundwitness-model": "^3.14.18",
54
+ "@xyo-network/chain-modules": "^1.3.18",
55
+ "@xyo-network/chain-rpc": "^1.3.18",
56
+ "@xyo-network/chain-telemetry": "^1.3.18",
57
+ "@xyo-network/diviner-payload-pointer": "^3.14.18",
58
+ "@xyo-network/diviner-temporal-indexing": "^3.14.18",
59
+ "@xyo-network/manifest-model": "^3.14.18",
60
+ "@xyo-network/manifest-wrapper": "^3.14.18",
61
+ "@xyo-network/module-abstract": "^3.14.18",
62
+ "@xyo-network/module-abstract-mongodb": "^3.14.18",
63
+ "@xyo-network/module-factory-locator": "^3.14.18",
64
+ "@xyo-network/module-model": "^3.14.18",
64
65
  "@xyo-network/node-core-lib": "^3.6.4",
65
- "@xyo-network/node-memory": "^3.14.17",
66
- "@xyo-network/node-model": "^3.14.17",
67
- "@xyo-network/payload-model": "^3.14.17",
68
- "@xyo-network/sentinel-memory": "^3.14.17",
69
- "@xyo-network/wallet": "^3.14.17",
70
- "@xyo-network/witness-timestamp": "^3.14.17",
71
- "@xyo-network/xl1-rpc": "^1.3.17",
66
+ "@xyo-network/node-memory": "^3.14.18",
67
+ "@xyo-network/node-model": "^3.14.18",
68
+ "@xyo-network/payload-model": "^3.14.18",
69
+ "@xyo-network/sentinel-memory": "^3.14.18",
70
+ "@xyo-network/wallet": "^3.14.18",
71
+ "@xyo-network/witness-timestamp": "^3.14.18",
72
+ "@xyo-network/xl1-rpc": "^1.3.18",
72
73
  "compression": "^1.8.0",
73
74
  "cors": "^2.8.5",
74
75
  "express": "^4.21.2",
@@ -76,19 +77,19 @@
76
77
  },
77
78
  "devDependencies": {
78
79
  "@types/compression": "^1.7.5",
79
- "@types/cors": "^2.8.17",
80
+ "@types/cors": "^2.8.18",
80
81
  "@types/express": "5.0.1",
81
- "@types/node": "^22.15.14",
82
- "@xylabs/object": "^4.9.3",
82
+ "@types/node": "^22.15.17",
83
+ "@xylabs/object": "^4.9.4",
83
84
  "@xylabs/ts-scripts-yarn3": "^6.5.5",
84
85
  "@xylabs/tsconfig": "^6.5.5",
85
- "@xyo-network/account": "^3.14.17",
86
- "@xyo-network/account-model": "^3.14.17",
87
- "@xyo-network/archivist-abstract": "^3.14.17",
88
- "@xyo-network/boundwitness-builder": "^3.14.17",
86
+ "@xyo-network/account": "^3.14.18",
87
+ "@xyo-network/account-model": "^3.14.18",
88
+ "@xyo-network/archivist-abstract": "^3.14.18",
89
+ "@xyo-network/boundwitness-builder": "^3.14.18",
89
90
  "@xyo-network/node-core-model": "^3.6.4",
90
91
  "dotenv": "^16.5.0",
91
- "knip": "^5.54.1",
92
+ "knip": "^5.55.1",
92
93
  "nodemon": "^3.1.10",
93
94
  "typescript": "^5.8.3",
94
95
  "vitest": "^3.1.3",
@@ -1,8 +1,11 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
2
  import { asAddress } from '@xylabs/hex'
3
+ import { MemoryArchivist } from '@xyo-network/archivist-memory'
3
4
  import { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'
4
5
  import { ViewArchivist } from '@xyo-network/archivist-view'
5
- import { AddressBalanceDiviner, HeadValidationDiviner } from '@xyo-network/chain-modules'
6
+ import {
7
+ AddressBalanceDiviner, ArchivistSyncDiviner, HeadValidationDiviner,
8
+ } from '@xyo-network/chain-modules'
6
9
  import { initTelemetry } from '@xyo-network/chain-telemetry'
7
10
  import { PayloadPointerDiviner } from '@xyo-network/diviner-payload-pointer'
8
11
  import {
@@ -35,6 +38,7 @@ export const getLocator = async () => {
35
38
  })
36
39
  const locator = new ModuleFactoryLocator()
37
40
  // If there's a MongoDB configuration
41
+ locator.register(MemoryArchivist, { 'network.xyo.storage.class': 'memory' })
38
42
  if (hasMongoDBConfig()) {
39
43
  // Register the MongoDB Archivist & Diviners as the defaults
40
44
  locator.register(MongoDBArchivistV2, undefined, true)
@@ -58,5 +62,6 @@ export const getLocator = async () => {
58
62
  locator.register(TemporalIndexingDivinerStateToIndexCandidateDiviner)
59
63
  locator.register(TimestampWitness)
60
64
  locator.register(ViewArchivist)
65
+ locator.register(ArchivistSyncDiviner)
61
66
  return locator
62
67
  }
@@ -15,7 +15,7 @@
15
15
  "labels": {
16
16
  "network.xyo.storage.class": "mongodb"
17
17
  },
18
- "name": "Validated",
18
+ "name": "ValidatedMongo",
19
19
  "payloadSdkConfig": {
20
20
  "collection": "chain_validated"
21
21
  },
@@ -27,7 +27,7 @@
27
27
  "accountPath": "1/1'/2'",
28
28
  "schema": "network.xyo.diviner.chain.head.validation.config",
29
29
  "inArchivist": "Chain:Submissions",
30
- "outArchivist": "Chain:Validated",
30
+ "outArchivist": "Chain:ValidatedMongo",
31
31
  "name": "HeadValidationDiviner"
32
32
  }
33
33
  },
@@ -36,7 +36,7 @@
36
36
  "accountPath": "1/1'/3'",
37
37
  "automations": [
38
38
  {
39
- "frequency": 100,
39
+ "frequency": 500,
40
40
  "frequencyUnits": "millis",
41
41
  "schema": "network.xyo.automation.interval",
42
42
  "type": "interval"
@@ -52,6 +52,47 @@
52
52
  }
53
53
  ]
54
54
  }
55
+ },
56
+ {
57
+ "config": {
58
+ "accountPath": "1/1'/4'",
59
+ "labels": {
60
+ "network.xyo.storage.class": "memory"
61
+ },
62
+ "name": "Validated",
63
+ "schema": "network.xyo.archivist.config"
64
+ }
65
+ },
66
+ {
67
+ "config": {
68
+ "accountPath": "1/1'/5'",
69
+ "schema": "network.xyo.diviner.archivist.sync.config",
70
+ "inArchivist": "Chain:ValidatedMongo",
71
+ "outArchivist": "Chain:Validated",
72
+ "name": "ValidatedSyncDiviner"
73
+ }
74
+ },
75
+ {
76
+ "config": {
77
+ "accountPath": "1/1'/6'",
78
+ "automations": [
79
+ {
80
+ "frequency": 500,
81
+ "frequencyUnits": "millis",
82
+ "schema": "network.xyo.automation.interval",
83
+ "type": "interval"
84
+ }
85
+ ],
86
+ "name": "ValidatedSyncSentinel",
87
+ "schema": "network.xyo.sentinel.config",
88
+ "synchronous": false,
89
+ "tasks": [
90
+ {
91
+ "mod": "ValidatedSyncDiviner",
92
+ "endPoint": "divine"
93
+ }
94
+ ]
95
+ }
55
96
  }
56
97
  ],
57
98
  "public": [
@@ -61,7 +102,7 @@
61
102
  "labels": {
62
103
  "network.xyo.storage.class": "mongodb"
63
104
  },
64
- "name": "Submissions",
105
+ "name": "SubmissionsMongo",
65
106
  "payloadSdkConfig": {
66
107
  "collection": "chain_submissions"
67
108
  },
@@ -88,10 +129,51 @@
88
129
  "archivist": "Chain:Validated",
89
130
  "name": "AddressBalanceDiviner"
90
131
  }
132
+ },
133
+ {
134
+ "config": {
135
+ "accountPath": "1/1/4'",
136
+ "labels": {
137
+ "network.xyo.storage.class": "memory"
138
+ },
139
+ "name": "Submissions",
140
+ "schema": "network.xyo.archivist.config"
141
+ }
142
+ },
143
+ {
144
+ "config": {
145
+ "accountPath": "1/1/5'",
146
+ "schema": "network.xyo.diviner.archivist.sync.config",
147
+ "inArchivist": "Chain:SubmissionsMongo",
148
+ "outArchivist": "Chain:Submissions",
149
+ "name": "SubmissionsSyncDiviner"
150
+ }
151
+ },
152
+ {
153
+ "config": {
154
+ "accountPath": "1/1/6'",
155
+ "automations": [
156
+ {
157
+ "frequency": 500,
158
+ "frequencyUnits": "millis",
159
+ "schema": "network.xyo.automation.interval",
160
+ "type": "interval"
161
+ }
162
+ ],
163
+ "name": "SubmissionsSyncSentinel",
164
+ "schema": "network.xyo.sentinel.config",
165
+ "synchronous": false,
166
+ "tasks": [
167
+ {
168
+ "mod": "SubmissionsSyncDiviner",
169
+ "endPoint": "divine"
170
+ }
171
+ ]
172
+ }
91
173
  }
92
174
  ]
93
175
  }
94
176
  }
95
177
  ],
96
178
  "schema": "network.xyo.manifest"
97
- }
179
+ }
@@ -1,13 +1,14 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
2
  import { asyncHandler } from '@xylabs/express'
3
- import { type Address, asAddress } from '@xylabs/hex'
3
+ import {
4
+ type Address, asAddress, isAddress,
5
+ } from '@xylabs/hex'
4
6
  import type { JsonObject } from '@xylabs/object'
5
7
  import { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'
6
8
  import { ModuleErrorBuilder } from '@xyo-network/module-abstract'
7
9
  import type { Module, ModuleQueryResult } from '@xyo-network/module-model'
8
10
  import { trimAddressPrefix } from '@xyo-network/node-core-lib'
9
11
  import type { ModuleError, Payload } from '@xyo-network/payload-model'
10
- import { isAddress } from 'ethers'
11
12
  import type { RequestHandler } from 'express'
12
13
  import { StatusCodes } from 'http-status-codes'
13
14