@xyo-network/chain-reward-redemption 1.15.24 → 1.15.26

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.
@@ -123,6 +123,7 @@ import { z as z3 } from "zod";
123
123
 
124
124
  // src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts
125
125
  import { assertEx } from "@xylabs/assert";
126
+ import { delay } from "@xylabs/delay";
126
127
  import { toAddress } from "@xylabs/hex";
127
128
  import { isDefined as isDefined2, isUndefined } from "@xylabs/typeof";
128
129
  import { blockRangeSteps, createTransferPayload } from "@xyo-network/chain-protocol";
@@ -131,23 +132,6 @@ import { asXL1BlockNumber, XYO_STEP_REWARD_ADDRESS } from "@xyo-network/xl1-prot
131
132
  import { completedStepRewardAddress, derivedReceiveAddress, flattenHydratedTransaction, flattenHydratedTransactions } from "@xyo-network/xl1-protocol-sdk";
132
133
  import { Mutex } from "async-mutex";
133
134
 
134
- // src/modules/helper/retry.ts
135
- import { delay } from "@xylabs/delay";
136
- async function retry(fn, delayMs = 1e3, retries = 3) {
137
- let lastError;
138
- for (let attempt = 1; attempt <= retries; attempt++) {
139
- try {
140
- return await fn();
141
- } catch (error) {
142
- lastError = error;
143
- if (attempt >= retries) throw lastError;
144
- if (delayMs > 0) await delay(delayMs);
145
- }
146
- }
147
- throw new Error("Retry logic failed unexpectedly");
148
- }
149
- __name(retry, "retry");
150
-
151
135
  // src/modules/ChainStepRewardsClaimSentinel/StepIdentityPayload.ts
152
136
  import { AsObjectFactory } from "@xylabs/object";
153
137
  import { isPayloadOfZodType } from "@xyo-network/payload-model";
@@ -158,8 +142,7 @@ var asStepIdentityPayload = AsObjectFactory.create(isStepIdentityPayload);
158
142
 
159
143
  // src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts
160
144
  var ChainStepRewardsClaimSentinelConfigSchema = "network.xyo.sentinel.chain.step.rewards.claim.config";
161
- var retryAttempts = 3;
162
- var retryDelayMs = 6e4;
145
+ var defaultStepClaimIntervalMs = 15e3;
163
146
  var scope = "reward-escrow";
164
147
  var RewardableSteps = [
165
148
  3,
@@ -181,9 +164,21 @@ var ChainStepRewardsClaimSentinel = class extends AbstractSentinel {
181
164
  _claimCheckCounter;
182
165
  _claimErrorCounter;
183
166
  _claimSuccessCounter;
167
+ _connection;
168
+ _gateway;
184
169
  _reportMutex = new Mutex();
170
+ _viewer;
171
+ get connection() {
172
+ return assertEx(this._connection, () => "Connection is not defined");
173
+ }
185
174
  get gateway() {
186
- return this.params.gateway;
175
+ return assertEx(this._gateway, () => "Gateway is not defined");
176
+ }
177
+ get stepClaimIntervalMs() {
178
+ return isDefined2(this.config.stepClaimIntervalMs) ? this.config.stepClaimIntervalMs : defaultStepClaimIntervalMs;
179
+ }
180
+ get viewer() {
181
+ return assertEx(this._viewer, () => "Viewer is not defined");
187
182
  }
188
183
  async createHandler() {
189
184
  await super.createHandler();
@@ -199,6 +194,12 @@ var ChainStepRewardsClaimSentinel = class extends AbstractSentinel {
199
194
  this._claimErrorCounter = this.meter?.createCounter("chain_step_rewards_claim_sentinel_errors_total", {
200
195
  description: "Number of claim errors"
201
196
  });
197
+ const gateway = assertEx(this.params.gateway, () => "Gateway parameter is required");
198
+ const connection = assertEx(await gateway.connection(), () => "Gateway connection is required");
199
+ const viewer2 = assertEx(connection.viewer, () => "Viewer is not defined in gateway connection");
200
+ this._gateway = gateway;
201
+ this._connection = connection;
202
+ this._viewer = viewer2;
202
203
  }
203
204
  async reportHandler(payloads) {
204
205
  if (this._reportMutex.isLocked()) {
@@ -246,23 +247,22 @@ var ChainStepRewardsClaimSentinel = class extends AbstractSentinel {
246
247
  }
247
248
  async claimAllSteps() {
248
249
  const results = [];
249
- const connection = await this.gateway.connection();
250
- const { viewer: viewer2 } = connection;
251
- if (isDefined2(viewer2)) {
252
- for (const step of RewardableSteps) {
253
- const from = 0;
254
- const to = await viewer2.currentBlockNumber();
255
- const range = [
256
- asXL1BlockNumber(from),
257
- asXL1BlockNumber(to)
258
- ];
259
- const stepIdentities = blockRangeSteps(range, [
260
- step
261
- ]);
262
- for (const stepIdentity of stepIdentities) {
263
- const result = await this.claimStepIdentity(stepIdentity);
264
- if (isDefined2(result)) results.push(result);
250
+ for (const step of RewardableSteps) {
251
+ const from = 0;
252
+ const to = await this.viewer.currentBlockNumber();
253
+ const range = [
254
+ asXL1BlockNumber(from),
255
+ asXL1BlockNumber(to)
256
+ ];
257
+ const stepIdentities = blockRangeSteps(range, [
258
+ step
259
+ ]);
260
+ for (const stepIdentity of stepIdentities) {
261
+ const result = await this.claimStepIdentity(stepIdentity);
262
+ if (isDefined2(result)) {
263
+ results.push(result);
265
264
  }
265
+ await delay(this.stepClaimIntervalMs);
266
266
  }
267
267
  }
268
268
  return flattenHydratedTransactions(results);
@@ -275,15 +275,14 @@ var ChainStepRewardsClaimSentinel = class extends AbstractSentinel {
275
275
  };
276
276
  try {
277
277
  this._claimCheckCounter?.add(1, claimCounterAttributes);
278
- const connection = await this.gateway.connection();
279
- const viewer2 = assertEx(connection.viewer, () => "Viewer is not defined in gateway connection");
280
278
  const stepRewardAddress = completedStepRewardAddress(stepIdentity);
281
- const balance = await viewer2.accountBalance(stepRewardAddress);
279
+ const balance = await this.viewer.accountBalance(stepRewardAddress);
282
280
  if (balance > 0n) {
283
281
  this.logger?.info(`Found balance of ${balance} to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`);
284
282
  this._claimAttemptsCounter?.add(1, claimCounterAttributes);
285
- const rewardsByStaker = await retry(() => viewer2.networkStakeStepRewardPoolRewards(stepIdentity), retryDelayMs, retryAttempts);
283
+ const rewardsByStaker = await this.viewer.networkStakeStepRewardPoolRewards(stepIdentity);
286
284
  const addressDistributions = this.calculateAddressDistributions(rewardsByStaker, balance);
285
+ this.logger?.info(`Calculated address distributions for step ${stepIdentity.step} at block ${stepIdentity.block} with ${Object.keys(addressDistributions).length} addresses`);
287
286
  const tx = await this.submitRewardDistributionTransaction(stepRewardAddress, addressDistributions, stepIdentity, this.gateway);
288
287
  this.logger?.info(`Claimed rewards for step ${stepIdentity.step} at block ${stepIdentity.block}`);
289
288
  this._claimSuccessCounter?.add(1, claimCounterAttributes);
@@ -299,16 +298,12 @@ var ChainStepRewardsClaimSentinel = class extends AbstractSentinel {
299
298
  transferPayload.context = {
300
299
  step
301
300
  };
302
- const connection = await gateway.connection();
303
- const viewer2 = assertEx(connection.viewer, () => "Viewer is not defined in gateway connection");
304
- const chainId = await viewer2.chainId();
305
- const currentBlock = await viewer2.currentBlockNumber();
301
+ const currentBlockNumber = await this.viewer.currentBlockNumber();
306
302
  const result = await gateway.addPayloadsToChain?.([
307
303
  transferPayload
308
304
  ], [], {
309
- chain: chainId,
310
- nbf: currentBlock,
311
- exp: currentBlock + 1e3
305
+ nbf: currentBlockNumber,
306
+ exp: currentBlockNumber + 10
312
307
  });
313
308
  if (isDefined2(result)) return result[1];
314
309
  }
@@ -377,7 +372,7 @@ var DerivedAddressWalletTransferSentinel = class extends AbstractSentinel2 {
377
372
  this._transferErrorCounter?.add(1);
378
373
  throw new Error("Invalid EIP712 signature");
379
374
  }
380
- const values = data.values;
375
+ const values = ConfirmedClaimValuesZod.parse(data.values);
381
376
  const parsed = parseConfirmedClaimValues(values);
382
377
  const signatureAddress = toAddress2(signature.address);
383
378
  const parsedAddress = toAddress2(parsed.from);
@@ -397,7 +392,6 @@ var DerivedAddressWalletTransferSentinel = class extends AbstractSentinel2 {
397
392
  const signerAddress = await signer.address();
398
393
  const connection = await this.gateway.connection();
399
394
  const viewer2 = assertEx2(connection.viewer, () => "Viewer is not defined in gateway connection");
400
- const chainId = await viewer2.chainId();
401
395
  const currentBlock = await viewer2.currentBlockNumber();
402
396
  if (currentBlock < nbf || currentBlock > exp) throw new Error("Transaction is not within a valid block range");
403
397
  const escrowAccount = derivedReceiveAddress2(address, scope2);
@@ -784,6 +778,28 @@ var node_default = {
784
778
  schema: "network.xyo.sentinel.chain.step.rewards.claim.config"
785
779
  }
786
780
  },
781
+ {
782
+ config: {
783
+ accountPath: "1/1'/3'",
784
+ automations: [
785
+ {
786
+ frequency: 6e4,
787
+ frequencyUnits: "millis",
788
+ schema: "network.xyo.automation.interval",
789
+ type: "interval"
790
+ }
791
+ ],
792
+ name: "ChainRewardsClaimIntervalSentinel",
793
+ schema: "network.xyo.sentinel.config",
794
+ synchronous: true,
795
+ tasks: [
796
+ {
797
+ mod: "ChainStepRewardsClaimSentinel",
798
+ endPoint: "report"
799
+ }
800
+ ]
801
+ }
802
+ },
787
803
  {
788
804
  config: {
789
805
  accountPath: "1/1'/4'",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rewardRedemption/routeDefinitions/routes/claimRange.ts","../../src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts","../../src/modules/helper/retry.ts","../../src/modules/ChainStepRewardsClaimSentinel/StepIdentityPayload.ts","../../src/modules/DerivedAddressWalletTransferSentinel/DerivedAddressWalletTransferSentinel.ts","../../src/server/routes/rewardRedemption/middleware/requestHandlerValidator.ts","../../src/server/routes/rewardRedemption/routeDefinitions/util/getViewerFromConfig.ts","../../src/server/routes/rewardRedemption/routeDefinitions/util/rewardableSteps.ts","../../src/server/routes/rewardRedemption/routeDefinitions/routes/redeem.ts","../../src/server/routes/rewardRedemption/routeDefinitions/getRouteDefinitions.ts","../../src/server/routes/rewardRedemption/addRewardRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.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/index.ts"],"sourcesContent":["import {\n customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler,\n standardErrors, standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\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, config: Config): Express => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\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.config = config\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 */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n } else {\n res.status(404).send()\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app\n const archivistModuleIdentifier = 'Data'\n app.use('/data', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isDefined } from '@xylabs/typeof'\nimport { blockRangeSteps } from '@xyo-network/chain-protocol'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { PayloadZodLoose } from '@xyo-network/payload-model'\nimport type { SentinelInstance } from '@xyo-network/sentinel-model'\nimport { asSentinelInstance } from '@xyo-network/sentinel-model'\nimport type { XL1BlockRange } from '@xyo-network/xl1-protocol'\nimport { asXL1BlockNumber } from '@xyo-network/xl1-protocol'\nimport { z } from 'zod'\n\nimport { type StepIdentityPayload, StepIdentitySchema } from '../../../../../modules/index.ts'\nimport { requestHandlerValidator } from '../../middleware/index.ts'\nimport type { RouteDefinition } from '../routeDefinition.ts'\nimport { getViewerFromConfig, RewardableSteps } from '../util/index.ts'\n\nconst query = z.object({\n fromBlock: z.coerce.number().int().nonnegative().optional(),\n toBlock: z.coerce.number().int().nonnegative().optional(),\n step: z.coerce.number().int().nonnegative().min(Math.min(...RewardableSteps)).max(Math.max(...RewardableSteps)).optional().default(3),\n})\nconst response = z.array(PayloadZodLoose)\n\nconst validateRequest = requestHandlerValidator({ query, response })\n\nconst getChainStepRewardsClaimSentinel = async (node: NodeInstance): Promise<SentinelInstance> => {\n const mod = await node.resolve('XYORewardRedemptionNode:ChainStepRewardsClaimSentinel')\n const sentinel = asSentinelInstance(mod)\n return assertEx(sentinel, () => 'ChainStepRewardsClaimSentinel not found on node')\n}\n\nexport const postClaimRange: RouteDefinition = {\n method: 'post',\n path: '/rewards/claimRange',\n handlers: validateRequest(async (req, res) => {\n const { config, node } = req.app\n const {\n fromBlock, toBlock, step,\n } = z.parse(query, req.query)\n const viewer = getViewerFromConfig(config)\n const from = isDefined(fromBlock) ? fromBlock : 0\n const currentBlock = await viewer.currentBlockNumber()\n const to = isDefined(toBlock) ? Math.min(toBlock, currentBlock) : currentBlock\n if (to <= from) {\n res.status(400)\n res.json([])\n return\n }\n const range: XL1BlockRange = [asXL1BlockNumber(from), asXL1BlockNumber(to)]\n // For each rewardable step in range\n const stepIdentities = blockRangeSteps(range, [step])\n const results: Payload[] = []\n for (const stepIdentity of stepIdentities) {\n const mod = await getChainStepRewardsClaimSentinel(node)\n const stepIdentityPayload = new PayloadBuilder<StepIdentityPayload>({ schema: StepIdentitySchema }).fields(stepIdentity).build()\n const result = await mod.report([stepIdentityPayload])\n results.push(...result)\n }\n res.status(200)\n res.json(results)\n }),\n}\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { toAddress } from '@xylabs/hex'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { blockRangeSteps, createTransferPayload } from '@xyo-network/chain-protocol'\nimport type { AnyConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport type {\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport type {\n AttoXL1, SignedHydratedTransaction, StepIdentity, XL1BlockRange, XyoGatewayProvider,\n} from '@xyo-network/xl1-protocol'\nimport { asXL1BlockNumber, XYO_STEP_REWARD_ADDRESS } from '@xyo-network/xl1-protocol'\nimport {\n completedStepRewardAddress, derivedReceiveAddress, flattenHydratedTransaction, flattenHydratedTransactions,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { retry } from '../helper/index.ts'\nimport { isStepIdentityPayload } from './StepIdentityPayload.ts'\n\nexport const ChainStepRewardsClaimSentinelConfigSchema = 'network.xyo.sentinel.chain.step.rewards.claim.config'\nexport type ChainStepRewardsClaimSentinelConfigSchema = typeof ChainStepRewardsClaimSentinelConfigSchema\n\n/**\n * The configuration for the chain step rewards claim sentinel\n */\nexport type ChainStepRewardsClaimSentinelConfig = SentinelConfig<{\n /**\n * The schema for the chain step rewards claim sentinel config\n */\n schema: ChainStepRewardsClaimSentinelConfigSchema\n}>\n\ninterface ChainStepRewardsClaimSentinelParamFields {\n gateway: XyoGatewayProvider\n}\n\nexport type ChainStepRewardsClaimSentinelParams<\n TConfig extends AnyConfigSchema<ChainStepRewardsClaimSentinelConfig> = AnyConfigSchema<ChainStepRewardsClaimSentinelConfig>,\n> = SentinelParams<TConfig> & ChainStepRewardsClaimSentinelParamFields\n\nconst retryAttempts = 3\nconst retryDelayMs = 60_000\nconst scope = 'reward-escrow'\nconst RewardableSteps = [3, 4, 5, 6, 7, 8]\n\nexport class ChainStepRewardsClaimSentinel<\n TParams extends ChainStepRewardsClaimSentinelParams = ChainStepRewardsClaimSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [ChainStepRewardsClaimSentinelConfigSchema]\n static override readonly defaultConfigSchema = ChainStepRewardsClaimSentinelConfigSchema\n private _claimAttemptsCounter: Counter<Attributes> | undefined\n private _claimCheckCounter: Counter<Attributes> | undefined\n private _claimErrorCounter: Counter<Attributes> | undefined\n private _claimSuccessCounter: Counter<Attributes> | undefined\n private _reportMutex = new Mutex()\n\n protected get gateway(): XyoGatewayProvider {\n return this.params.gateway\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n // Create meters for tracking claim attempts, successes, and errors.\n this._claimAttemptsCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_attempts_total', { description: 'Number of claim attempts' })\n this._claimCheckCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_check_total', { description: 'Number of claim checks' })\n this._claimSuccessCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_success_total', { description: 'Number of claim successes' })\n this._claimErrorCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_errors_total', { description: 'Number of claim errors' })\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n if (this._reportMutex.isLocked()) {\n this.logger?.debug(`ChainRewardsClaimSentinel [${this.id}] is already running, skipping report [${Date.now()}]`)\n return []\n }\n return await this._reportMutex.runExclusive(async () => {\n const response: Payload[] = []\n if (isUndefined(payloads) || payloads.length === 0) {\n await this.claimAllSteps()\n } else {\n // Process provided payloads\n const stepIdentities = payloads\n .filter(isStepIdentityPayload)\n .map<StepIdentity>((p) => {\n const { step, block: blockNumber } = p\n const block = asXL1BlockNumber(blockNumber)\n return { step, block }\n }).filter(stepIdentity => RewardableSteps.includes(stepIdentity.step))\n for (const stepIdentity of stepIdentities) {\n const result = await this.claimStepIdentity(stepIdentity)\n if (isDefined(result)) response.push(...flattenHydratedTransaction(result))\n }\n }\n return response\n })\n }\n\n private calculateAddressDistributions(rewardsByStaker: Record<Address, bigint>, balance: AttoXL1): Record<Address, bigint> {\n const addressClaims: Record<Address, bigint> = {}\n const totalRewards = Object.values(rewardsByStaker).reduce((acc, val) => acc + val, 0n)\n for (const [staker, amount] of Object.entries(rewardsByStaker)) {\n // Ensure they have accrued an amount\n if (amount <= 0n) continue\n const reward = (balance * amount) / totalRewards\n // Ensure they earned a reward\n if (reward <= 0n) continue\n // Accumulate rewards by address\n const receiveAddress = derivedReceiveAddress(toAddress(staker), scope)\n addressClaims[receiveAddress] = reward\n }\n const totalClaimed = Object.values(addressClaims).reduce((acc, val) => acc + val, 0n)\n assertEx(totalClaimed <= balance, () => 'Total claimed exceeds claimable balance')\n const unclaimed = balance - totalClaimed\n if (unclaimed > 0n) {\n // Return anything unclaimed (due to truncation/rounding) to step rewards pool address\n addressClaims[XYO_STEP_REWARD_ADDRESS] = unclaimed\n }\n return addressClaims\n }\n\n private async claimAllSteps(): Promise<Payload[]> {\n // No payloads to process, just do claims since last run\n const results: SignedHydratedTransaction[] = []\n const connection = await this.gateway.connection()\n const { viewer } = connection\n if (isDefined(viewer)) {\n for (const step of RewardableSteps) {\n // Fetch unclaimed rewards and process claims\n const from = 0\n const to = await viewer.currentBlockNumber()\n const range: XL1BlockRange = [asXL1BlockNumber(from), asXL1BlockNumber(to)]\n // For each rewardable step in range\n const stepIdentities = blockRangeSteps(range, [step])\n for (const stepIdentity of stepIdentities) {\n const result = await this.claimStepIdentity(stepIdentity)\n if (isDefined(result)) results.push(result)\n }\n }\n }\n return flattenHydratedTransactions(results)\n }\n\n private async claimStepIdentity(stepIdentity: StepIdentity): Promise<SignedHydratedTransaction | undefined> {\n this.logger?.info(`Checking rewards to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`)\n const claimCounterAttributes = { step: stepIdentity.step.toString(), block: stepIdentity.block.toString() }\n try {\n this._claimCheckCounter?.add(1, claimCounterAttributes)\n const connection = await this.gateway.connection()\n const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')\n // If wallet has balance\n const stepRewardAddress = completedStepRewardAddress(stepIdentity)\n const balance = await viewer.accountBalance(stepRewardAddress)\n if (balance > 0n) {\n this.logger?.info(`Found balance of ${balance} to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`)\n this._claimAttemptsCounter?.add(1, claimCounterAttributes)\n // For stakers\n const rewardsByStaker = await retry(() => viewer.networkStakeStepRewardPoolRewards(stepIdentity), retryDelayMs, retryAttempts)\n const addressDistributions = this.calculateAddressDistributions(rewardsByStaker, balance)\n // Create single transaction for all claims\n const tx = await this.submitRewardDistributionTransaction(stepRewardAddress, addressDistributions, stepIdentity, this.gateway)\n this.logger?.info(`Claimed rewards for step ${stepIdentity.step} at block ${stepIdentity.block}`)\n this._claimSuccessCounter?.add(1, claimCounterAttributes)\n // Return submitted transaction\n return tx\n }\n } catch (error) {\n this._claimErrorCounter?.add(1, claimCounterAttributes)\n this.logger?.error(`Error claiming rewards for step ${stepIdentity.step} at block ${stepIdentity.block}:`, error)\n }\n }\n\n private async submitRewardDistributionTransaction(\n stepRewardAddress: Address,\n addressDistributions: Record<Address, bigint>,\n step: StepIdentity,\n gateway: XyoGatewayProvider,\n ): Promise<SignedHydratedTransaction | undefined> {\n // Create single transfer payload for all claims\n const transferPayload = createTransferPayload(stepRewardAddress, addressDistributions)\n transferPayload.context = { step }\n const connection = await gateway.connection()\n const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')\n const chainId = await viewer.chainId()\n const currentBlock = await viewer.currentBlockNumber()\n const result = await gateway.addPayloadsToChain?.([transferPayload], [], {\n chain: chainId, nbf: currentBlock, exp: currentBlock + 1000,\n })\n if (isDefined(result)) return result[1]\n }\n}\n","import { delay } from '@xylabs/delay'\n\n/**\n * Retries a function a specified number of times with a delay between attempts.\n * @param fn The function to retry\n * @param delayMs Delay between retries\n * @param retries The number of retries\n * @returns The return value of the supplied function\n */\nexport async function retry<T>(\n fn: () => Promise<T> | T,\n delayMs = 1000,\n retries = 3,\n): Promise<T> {\n let lastError: unknown\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n return await fn()\n } catch (error) {\n // Store the last error\n lastError = error\n // If attempts exhausted throw the last error\n if (attempt >= retries) throw lastError\n // Otherwise, delay before the next attempt\n if (delayMs > 0) await delay(delayMs)\n }\n }\n // This should be unreachable\n throw new Error('Retry logic failed unexpectedly')\n}\n","import { AsObjectFactory } from '@xylabs/object'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isPayloadOfZodType } from '@xyo-network/payload-model'\nimport { StepIdentityZod } from '@xyo-network/xl1-rpc'\nimport type { z } from 'zod'\n\nexport const StepIdentitySchema = 'network.xyo.chain.step.identity' as const\nexport type StepIdentitySchema = typeof StepIdentitySchema\n\ntype StepIdentityFieldsZod = z.infer<typeof StepIdentityZod>\n\n/**\n * A Step Identity Payload\n */\nexport type StepIdentityPayload = Payload<StepIdentityFieldsZod, StepIdentitySchema>\n\nexport const isStepIdentityPayload = isPayloadOfZodType<StepIdentityPayload>(StepIdentityZod, StepIdentitySchema)\n\nexport const asStepIdentityPayload = AsObjectFactory.create(isStepIdentityPayload)\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport {\n AddressZod, EthAddressZod, hexToBigInt, HexZod, toAddress, toHex,\n} from '@xylabs/hex'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { createTransferPayload } from '@xyo-network/chain-protocol'\nimport type { AnyConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport type {\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport type { SignedHydratedTransaction, XyoGatewayProvider } from '@xyo-network/xl1-protocol'\nimport {\n derivedReceiveAddress, flattenHydratedTransaction, isEIP712DataPayload, isEIP712SignaturePayload, verifyEIP712Message,\n} from '@xyo-network/xl1-protocol-sdk'\nimport z from 'zod'\n\nexport const DerivedAddressWalletTransferSentinelConfigSchema = 'network.xyo.sentinel.chain.derived.address.wallet.transfer.config'\nexport type DerivedAddressWalletTransferSentinelConfigSchema = typeof DerivedAddressWalletTransferSentinelConfigSchema\n\n/**\n * The configuration for the derived address wallet transfer sentinel\n */\nexport type DerivedAddressWalletTransferSentinelConfig = SentinelConfig<{\n /**\n * The schema for the derived address wallet transfer sentinel config\n */\n schema: DerivedAddressWalletTransferSentinelConfigSchema\n}>\n\nexport interface DerivedAddressWalletTransferSentinelParamFields {\n gateway: XyoGatewayProvider\n}\n\nexport type DerivedAddressWalletTransferSentinelParams<\n TConfig extends AnyConfigSchema<DerivedAddressWalletTransferSentinelConfig> = AnyConfigSchema<DerivedAddressWalletTransferSentinelConfig>,\n> = SentinelParams<TConfig> & DerivedAddressWalletTransferSentinelParamFields\n\nconst scope = 'reward-escrow'\n\ninterface ParsedClaimValues {\n amount: string\n // chainId: ChainId\n exp: number\n from: Address\n nbf: number\n to: Address\n}\n\n// Assuming EthAddress and Hex are string-like (typical case)\nexport const ConfirmedClaimValuesZod = z.object({\n 'From': EthAddressZod,\n 'To XL1 Address': AddressZod,\n 'XL1 Amount': z.string(),\n 'XL1 Amount (Hex)': HexZod, // Hex\n 'XL1 Not after block': z.number().int().nonnegative(),\n 'XL1 Not before block': z.number().int().nonnegative(),\n})\n\nexport type ConfirmedClaimValues = z.infer<typeof ConfirmedClaimValuesZod>\n\nconst parseConfirmedClaimValues = (values: ConfirmedClaimValues): ParsedClaimValues => {\n return {\n amount: values['XL1 Amount (Hex)'],\n exp: values['XL1 Not after block'],\n from: toAddress(values.From),\n nbf: values['XL1 Not before block'],\n to: toAddress(values['To XL1 Address']),\n }\n}\n\nexport class DerivedAddressWalletTransferSentinel<\n TParams extends DerivedAddressWalletTransferSentinelParams = DerivedAddressWalletTransferSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [DerivedAddressWalletTransferSentinelConfigSchema]\n static override readonly defaultConfigSchema = DerivedAddressWalletTransferSentinelConfigSchema\n private _transferAttemptsCounter: Counter<Attributes> | undefined\n private _transferErrorCounter: Counter<Attributes> | undefined\n private _transferSuccessCounter: Counter<Attributes> | undefined\n\n protected get gateway(): XyoGatewayProvider {\n return this.params.gateway\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n // Create meters for tracking claim attempts, successes, and errors.\n this._transferAttemptsCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_attempts_total',\n { description: 'Number of transfer attempts' },\n )\n this._transferSuccessCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_success_total',\n { description: 'Number of transfer successes' },\n )\n this._transferErrorCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_errors_total',\n { description: 'Number of transfer errors' },\n )\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n const data = payloads?.find(isEIP712DataPayload)\n const signature = payloads?.find(isEIP712SignaturePayload)\n if (isUndefined(data) || isUndefined(signature)) return []\n this._transferAttemptsCounter?.add(1)\n const valid = await verifyEIP712Message(data, signature)\n if (!valid) {\n this._transferErrorCounter?.add(1)\n throw new Error('Invalid EIP712 signature')\n }\n const values = data.values as ConfirmedClaimValues\n const parsed = parseConfirmedClaimValues(values)\n const signatureAddress = toAddress(signature.address)\n const parsedAddress = toAddress(parsed.from)\n if (signatureAddress === parsedAddress) {\n const tx = await this.submitRewardDistributionTransaction(parsed)\n if (isDefined(tx)) {\n this._transferSuccessCounter?.add(1)\n return flattenHydratedTransaction(tx)\n }\n }\n this._transferErrorCounter?.add(1)\n return []\n }\n\n protected submitRewardDistributionTransaction = async (claimValues: ParsedClaimValues): Promise<SignedHydratedTransaction | undefined> => {\n const {\n amount, from: address, to, nbf, exp,\n } = claimValues\n // Ensure necessary gateway pre-requisites are met\n const signer = assertEx(await this.gateway.signer(), () => 'Signer is not defined in gateway')\n const signerAddress = await signer.address()\n const connection = await this.gateway.connection()\n const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')\n\n // TODO: Validate chainId against supplied in ClaimValues to prevent replay attacks\n const chainId = await viewer.chainId()\n\n // Ensure the transaction is within the valid block range\n const currentBlock = await viewer.currentBlockNumber()\n if (currentBlock < nbf || currentBlock > exp) throw new Error('Transaction is not within a valid block range')\n\n // Parse the signer's address\n const escrowAccount = derivedReceiveAddress(address, scope)\n\n // Ensure the escrow account has sufficient balance\n const balance = await viewer.accountBalance(escrowAccount)\n // NOTE: Currently we require the full amount to be redeemed from the escrow account. We do\n // not allow partial escrow redemptions.\n const redemptionAmount = hexToBigInt(toHex(amount))\n assertEx(balance === redemptionAmount, () => 'Insufficient balance in escrow account')\n\n // Ensure we have enough allowance to transfer from the escrow account\n const allowance = await viewer.accountBalance(signerAddress)\n assertEx(allowance > 1000n, () => 'Insufficient allowance to transfer from escrow account')\n\n // Create the transfer payload\n const transferPayload = createTransferPayload(escrowAccount, { [to]: hexToBigInt(toHex(amount)) })\n // Add required validation context\n transferPayload.context = { address, scope }\n const chain = await viewer.chainId()\n const result = await this.gateway.addPayloadsToChain?.([transferPayload], [], {\n chain, nbf, exp,\n })\n if (isDefined(result)) return result[1]\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { ExpressError } from '@xylabs/express'\nimport { isDefined, isPromise } from '@xylabs/typeof'\nimport type {\n NextFunction, Request, RequestHandler, Response,\n} from 'express'\nimport { ReasonPhrases, StatusCodes } from 'http-status-codes'\nimport type { ZodType } from 'zod'\nimport { z } from 'zod'\n\n/**\n * Empty Zod schema for requests with no parameters.\n */\nexport const EmptyParamsZod = z.object({}).catchall(z.string())\n\n/**\n * Empty Zod schema for requests with no query parameters.\n */\nexport const EmptyQueryParamsZod = z.object({}).catchall(z.union([z.string(), z.array(z.string())]))\n\n/**\n * Default validation schemas for request handler validator.\n */\nexport const ValidateRequestDefaults = {\n params: EmptyParamsZod,\n query: EmptyQueryParamsZod,\n body: z.json().optional(),\n response: z.json().optional(),\n}\n\ntype ValidatableRequestKey = 'params' | 'query' | 'body'\n\n/**\n * Factory for Express middleware that validates request and response objects using Zod schemas.\n * @param schemas The Zod schemas to use for validation.\n * @returns A middleware function for validating requests and responses.\n */\nexport function requestHandlerValidator<\n TParams extends typeof EmptyQueryParamsZod | ZodType<Record<string, string>> = typeof EmptyQueryParamsZod,\n TQuery extends typeof EmptyQueryParamsZod | ZodType<Record<string, string | string[]>> = typeof EmptyQueryParamsZod,\n TBody extends ZodType<unknown> = ZodType<unknown>,\n TResponse extends ZodType<unknown> = ZodType<unknown>,\n>(schemas?: Partial<{\n body: TBody\n params: TParams\n query: TQuery\n response: TResponse\n}>) {\n type Params = z.infer<TParams>\n type Query = z.infer<TQuery>\n type Body = z.infer<TBody>\n type Res = z.infer<TResponse>\n const validators = { ...ValidateRequestDefaults, ...schemas }\n\n return (handler: (req: Request<Params, Res, Body, Query>, res: Response<Res>, next: NextFunction) => unknown): RequestHandler => {\n return async (req: Request, res: Response, next: NextFunction) => {\n const originalJson = res.json.bind(res)\n try {\n // Validate incoming request\n const errors: string[] = []\n const keys: ValidatableRequestKey[] = ['params', 'query', 'body']\n for (const key of keys) {\n const validator = validators[key]\n const result = validator.safeParse(req[key])\n if (result.success) {\n if (isDefined(result.data)) Object.assign(req[key], result.data)\n } else {\n errors.push(\n ...result.error.issues.map(\n issue => (issue.path.length === 0)\n ? `${key}: ${issue.message}`\n : `${key}.${issue.path.join('.')}: ${issue.message}`,\n ),\n )\n }\n }\n\n // If there were validation errors, short-circuit and return Bad Request\n if (errors.length > 0) {\n const message = errors.join('; ')\n const err: ExpressError = new Error(message)\n err.name = ReasonPhrases.BAD_REQUEST\n err.statusCode = StatusCodes.BAD_REQUEST\n next(err)\n return false\n }\n\n // Wrap res.json to validate outgoing response\n res.json = (data: any) => {\n const result = validators.response.safeParse(data)\n if (result.success) {\n return originalJson(result.data)\n } else {\n const message = result.error.issues.map(\n issue => (issue.path.length === 0)\n ? `response: ${issue.message}`\n : `response.${issue.path.join('.')}: ${issue.message}`,\n ).join('; ')\n const err: ExpressError = new Error(message)\n err.name = ReasonPhrases.INTERNAL_SERVER_ERROR\n err.statusCode = StatusCodes.INTERNAL_SERVER_ERROR\n\n // Restore original json function in case the error handler wants to use it\n res.json = originalJson\n throw err\n }\n }\n\n // Automatically handle async errors\n const result = handler(req as any, res as any, next)\n if (result && isPromise(result)) {\n await result\n }\n } catch (err) {\n res.json = originalJson\n next(err)\n }\n }\n }\n}\n","import { isDefined } from '@xylabs/typeof'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcTransport, JsonRpcXyoViewer, XyoViewerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\n\nlet viewer: JsonRpcXyoViewer | undefined\n\nexport const getViewerFromConfig = (config: Config): JsonRpcXyoViewer => {\n if (isDefined(viewer)) return viewer\n const transport = new HttpRpcTransport(config.rewardRedemptionApi.chainRpcApiUrl, XyoViewerRpcSchemas)\n viewer = new JsonRpcXyoViewer(transport)\n return viewer\n}\n","export const RewardableSteps = [3, 4, 5, 6, 7, 8]\n","import { assertEx } from '@xylabs/assert'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadZodLoose, PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport type { SentinelInstance } from '@xyo-network/sentinel-model'\nimport { asSentinelInstance } from '@xyo-network/sentinel-model'\nimport {\n EIP712DataPayloadFieldsZod, EIP712DataPayloadSchema, EIP712SignaturePayloadFieldsZod,\n EIP712SignaturePayloadSchema,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { z } from 'zod'\n\nimport { requestHandlerValidator } from '../../middleware/index.ts'\nimport type { RouteDefinition } from '../routeDefinition.ts'\n\nconst body = z.tuple([\n PayloadZodStrictOfSchema(EIP712DataPayloadSchema).extend(EIP712DataPayloadFieldsZod.shape),\n PayloadZodStrictOfSchema(EIP712SignaturePayloadSchema).extend(EIP712SignaturePayloadFieldsZod.shape),\n])\n\nconst response = z.array(PayloadZodLoose)\nconst validateRequest = requestHandlerValidator({\n body,\n response,\n})\n\nconst getDerivedAddressWalletTransferSentinel = async (node: NodeInstance): Promise<SentinelInstance> => {\n const mod = await node.resolve('XYORewardRedemptionNode:DerivedAddressWalletTransferSentinel')\n const sentinel = asSentinelInstance(mod)\n return assertEx(sentinel, () => 'DerivedAddressWalletTransferSentinel not found on node')\n}\n\nexport const postRedeem: RouteDefinition = {\n method: 'post',\n path: '/rewards/redeem',\n handlers: validateRequest(async (req, res) => {\n const { node } = req.app\n const { body } = req\n const sentinel = await getDerivedAddressWalletTransferSentinel(node)\n const result = await sentinel.report(body)\n res.status(200)\n res.json(result)\n }),\n}\n","import type { RouteDefinition } from './routeDefinition.ts'\nimport { postClaimRange, postRedeem } from './routes/index.ts'\n\nexport const getRouteDefinitions = (): RouteDefinition[] => {\n return [\n postClaimRange,\n postRedeem,\n ]\n}\n","import type { Express } from 'express'\n\nimport { getRouteDefinitions } from './routeDefinitions/index.ts'\n\nexport const addRewardRedemptionRoutes = (app: Express) => {\n const routeDefinitions = getRouteDefinitions()\n for (const definition of routeDefinitions) {\n app[definition.method](definition.path, definition.handlers)\n }\n}\n","import type { Express } from 'express'\n\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRewardRedemptionRoutes } from './rewardRedemption/index.ts'\n\nexport const addRoutes = (app: Express) => {\n addDataLakeRoutes(app)\n addRewardRedemptionRoutes(app)\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Logger } from '@xylabs/logger'\nimport { isDefined, 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'\nimport { type Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getNode } from '../manifest/index.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\n// TODO: Make nodejs version of bios support round tripping mnemonic between boots\nconst getSeedPhrase = async (bios: BiosExternalInterface, config: Config, logger?: Logger): Promise<string> => {\n const storedSeedPhrase = await bios.seedPhraseStore.get('os')\n logger?.debug(`[Bridge] Stored mnemonic: ${storedSeedPhrase}`)\n const { mnemonic } = config.api\n if (isString(storedSeedPhrase) && isString(mnemonic)) {\n logger?.warn('[Bridge] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.')\n await bios.seedPhraseStore.set('os', mnemonic)\n } else {\n let seedPhrase: string\n if (isString(mnemonic)) {\n seedPhrase = mnemonic\n } else {\n seedPhrase = HDWallet.generateMnemonic()\n logger?.log('[Bridge] No mnemonic provided, using random mnemonic. This is not recommended for production use.')\n logger?.log(`[Bridge] Mnemonic: ${seedPhrase}`)\n }\n await bios.seedPhraseStore.set('os', seedPhrase)\n }\n return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire mnemonic from bios')\n}\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport const getServer = async (context: GetServerContext) => {\n const { logger, config } = context\n const { port, mnemonic } = config.rewardRedemptionApi\n const bios = await boot()\n const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)\n const wallet = await HDWallet.fromPhrase(seedPhrase)\n const nodeContext = {\n wallet, logger, config,\n }\n const node = context.node ?? await getNode(nodeContext)\n const app = getApp(node, config)\n const server = app.listen(port, hostname, () => logger?.log(`[Bridge] Server listening at http://${hostname}:${port}`))\n server.setTimeout(120_000)\n return server\n}\n","import type { MeterProvider, TracerProvider } from '@opentelemetry/api'\nimport type { Logger } from '@xylabs/logger'\nimport { type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'\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 { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { AbstractModule, LoggerModuleStatusReporter } from '@xyo-network/module-abstract'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport type { ModuleStatusReporter } from '@xyo-network/module-model'\nimport type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { XyoGatewayProvider } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { hasMongoConfig } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcXyoConnection, MemoryXyoGateway, MemoryXyoSigner,\n} from '@xyo-network/xl1-rpc'\n\nimport type { ChainStepRewardsClaimSentinelParams, DerivedAddressWalletTransferSentinelParams } from '../modules/index.ts'\nimport { ChainStepRewardsClaimSentinel, DerivedAddressWalletTransferSentinel } from '../modules/index.ts'\n\nexport interface GetLocatorContext {\n config: Config\n logger?: Logger\n}\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 (context: GetLocatorContext) => {\n const { config, logger } = context\n const { otlpEndpoint } = config.telemetry?.otel ?? {}\n const { traceProvider, meterProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-rewards',\n serviceVersion: '1.0.0',\n },\n otlpEndpoint,\n metricsConfig: {\n endpoint: '/metrics',\n port: 9465,\n },\n })\n\n if (isDefined(logger)) AbstractModule.defaultLogger = logger\n const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined\n\n const locator = new ModuleFactoryLocator()\n // If there's a MongoDB configuration\n const mongoConfig = config.storage?.mongo\n if (hasMongoConfig(mongoConfig)) {\n // Create the MongoDB SDK from the configuration\n const {\n connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName,\n } = mongoConfig\n const payloadSdkConfig: BaseMongoSdkPrivateConfig = {\n dbConnectionString, dbDomain, dbName, dbPassword, dbUserName,\n }\n const params: Partial<MongoDBModuleParamsV2> = {\n meterProvider, payloadSdkConfig, statusReporter, traceProvider,\n }\n // Register the MongoDB Archivist as the default\n locator.register(MongoDBArchivistV2.factory(params), undefined, true)\n }\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 const gateway = await getGateway(config)\n const chainStepRewardsClaimSentinelParams: Partial<ChainStepRewardsClaimSentinelParams> = {\n gateway, traceProvider, meterProvider, statusReporter,\n }\n locator.register(ChainStepRewardsClaimSentinel.factory(chainStepRewardsClaimSentinelParams))\n const derivedAddressWalletTransferSentinelParams: Partial<DerivedAddressWalletTransferSentinelParams> = {\n gateway, traceProvider, meterProvider, statusReporter,\n }\n locator.register(DerivedAddressWalletTransferSentinel.factory(derivedAddressWalletTransferSentinelParams))\n return locator\n}\n\nconst getGateway = async (\n config: Config,\n): Promise<XyoGatewayProvider> => {\n const { mnemonic, chainRpcApiUrl: endpoint } = config.rewardRedemptionApi\n const walletPromise = isDefined(mnemonic) ? HDWallet.fromPhrase(mnemonic) : HDWallet.random()\n const account = await walletPromise\n const signer = new MemoryXyoSigner(account)\n const connection = new HttpRpcXyoConnection({ endpoint, account })\n const gateway = new MemoryXyoGateway(signer, connection)\n return gateway\n}\n","import type { Logger } from '@xylabs/logger'\nimport { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getLocator } from './getLocator.ts'\nimport { NodeManifest } from './nodeManifest.ts'\nimport { PrivateChildManifests } from './private/index.ts'\nimport { PublicChildManifests } from './public/index.ts'\n\nexport interface GetNodeContext {\n config: Config\n logger?: Logger\n wallet: WalletInstance\n}\n\n/**\n * Creates a node with the xyo-chain modules registered\n * @param context The context to use for the node\n * @returns A node with the xyo-chain modules registered\n */\nexport const getNode = async (context: GetNodeContext) => {\n const { wallet } = context\n const locator = await getLocator(context)\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 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\": \"XYORewardRedemptionNode\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"name\": \"DataPrivate\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"reward_redemption_api_datalake\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/2'\",\n \"name\": \"ChainStepRewardsClaimSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.step.rewards.claim.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/4'\",\n \"name\": \"DerivedAddressWalletTransferSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.derived.address.wallet.transfer.config\"\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"Data\",\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\": \"DataPrivate\",\n \"schema\": \"network.xyo.archivist.view.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\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","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/manifest-model'\n\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = []\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","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","archivistModuleIdentifier","use","archivistMiddleware","assertEx","isDefined","blockRangeSteps","PayloadBuilder","PayloadZodLoose","asSentinelInstance","asXL1BlockNumber","z","assertEx","toAddress","isDefined","isUndefined","blockRangeSteps","createTransferPayload","AbstractSentinel","asXL1BlockNumber","XYO_STEP_REWARD_ADDRESS","completedStepRewardAddress","derivedReceiveAddress","flattenHydratedTransaction","flattenHydratedTransactions","Mutex","delay","retry","fn","delayMs","retries","lastError","attempt","error","delay","Error","AsObjectFactory","isPayloadOfZodType","StepIdentityZod","StepIdentitySchema","isStepIdentityPayload","asStepIdentityPayload","create","ChainStepRewardsClaimSentinelConfigSchema","retryAttempts","retryDelayMs","scope","RewardableSteps","ChainStepRewardsClaimSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_claimAttemptsCounter","_claimCheckCounter","_claimErrorCounter","_claimSuccessCounter","_reportMutex","Mutex","gateway","params","createHandler","meter","createCounter","description","reportHandler","payloads","isLocked","logger","debug","id","Date","now","runExclusive","response","isUndefined","length","claimAllSteps","stepIdentities","filter","isStepIdentityPayload","map","p","step","block","blockNumber","asXL1BlockNumber","stepIdentity","includes","result","claimStepIdentity","isDefined","push","flattenHydratedTransaction","calculateAddressDistributions","rewardsByStaker","balance","addressClaims","totalRewards","Object","values","reduce","acc","val","staker","amount","entries","reward","receiveAddress","derivedReceiveAddress","toAddress","totalClaimed","assertEx","unclaimed","XYO_STEP_REWARD_ADDRESS","results","connection","viewer","from","to","currentBlockNumber","range","blockRangeSteps","flattenHydratedTransactions","info","claimCounterAttributes","toString","add","stepRewardAddress","completedStepRewardAddress","accountBalance","retry","networkStakeStepRewardPoolRewards","addressDistributions","tx","submitRewardDistributionTransaction","error","transferPayload","createTransferPayload","context","chainId","currentBlock","addPayloadsToChain","chain","nbf","exp","assertEx","AddressZod","EthAddressZod","hexToBigInt","HexZod","toAddress","toHex","isDefined","isUndefined","createTransferPayload","AbstractSentinel","derivedReceiveAddress","flattenHydratedTransaction","isEIP712DataPayload","isEIP712SignaturePayload","verifyEIP712Message","z","DerivedAddressWalletTransferSentinelConfigSchema","scope","ConfirmedClaimValuesZod","z","object","EthAddressZod","AddressZod","string","HexZod","number","int","nonnegative","parseConfirmedClaimValues","values","amount","exp","from","toAddress","From","nbf","to","DerivedAddressWalletTransferSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_transferAttemptsCounter","_transferErrorCounter","_transferSuccessCounter","gateway","params","createHandler","meter","createCounter","description","reportHandler","payloads","data","find","isEIP712DataPayload","signature","isEIP712SignaturePayload","isUndefined","add","valid","verifyEIP712Message","Error","parsed","signatureAddress","address","parsedAddress","tx","submitRewardDistributionTransaction","isDefined","flattenHydratedTransaction","claimValues","signer","assertEx","signerAddress","connection","viewer","chainId","currentBlock","currentBlockNumber","escrowAccount","derivedReceiveAddress","balance","accountBalance","redemptionAmount","hexToBigInt","toHex","allowance","transferPayload","createTransferPayload","context","chain","result","addPayloadsToChain","isDefined","isPromise","ReasonPhrases","StatusCodes","z","EmptyParamsZod","z","object","catchall","string","EmptyQueryParamsZod","union","array","ValidateRequestDefaults","params","query","body","json","optional","response","requestHandlerValidator","schemas","validators","handler","req","res","next","originalJson","bind","errors","keys","key","validator","result","safeParse","success","isDefined","data","Object","assign","push","error","issues","map","issue","path","length","message","join","err","Error","name","ReasonPhrases","BAD_REQUEST","statusCode","StatusCodes","INTERNAL_SERVER_ERROR","isPromise","isDefined","HttpRpcTransport","JsonRpcXyoViewer","XyoViewerRpcSchemas","viewer","getViewerFromConfig","config","isDefined","transport","HttpRpcTransport","rewardRedemptionApi","chainRpcApiUrl","XyoViewerRpcSchemas","JsonRpcXyoViewer","RewardableSteps","query","z","object","fromBlock","coerce","number","int","nonnegative","optional","toBlock","step","min","Math","RewardableSteps","max","default","response","array","PayloadZodLoose","validateRequest","requestHandlerValidator","getChainStepRewardsClaimSentinel","node","mod","resolve","sentinel","asSentinelInstance","assertEx","postClaimRange","method","path","handlers","req","res","config","app","parse","viewer","getViewerFromConfig","from","isDefined","currentBlock","currentBlockNumber","to","status","json","range","asXL1BlockNumber","stepIdentities","blockRangeSteps","results","stepIdentity","stepIdentityPayload","PayloadBuilder","schema","StepIdentitySchema","fields","build","result","report","push","assertEx","PayloadZodLoose","PayloadZodStrictOfSchema","asSentinelInstance","EIP712DataPayloadFieldsZod","EIP712DataPayloadSchema","EIP712SignaturePayloadFieldsZod","EIP712SignaturePayloadSchema","z","body","z","tuple","PayloadZodStrictOfSchema","EIP712DataPayloadSchema","extend","EIP712DataPayloadFieldsZod","shape","EIP712SignaturePayloadSchema","EIP712SignaturePayloadFieldsZod","response","array","PayloadZodLoose","validateRequest","requestHandlerValidator","getDerivedAddressWalletTransferSentinel","node","mod","resolve","sentinel","asSentinelInstance","assertEx","postRedeem","method","path","handlers","req","res","app","result","report","status","json","getRouteDefinitions","postClaimRange","postRedeem","addRewardRedemptionRoutes","app","routeDefinitions","getRouteDefinitions","definition","method","path","handlers","addRoutes","app","addDataLakeRoutes","addRewardRedemptionRoutes","getApp","node","config","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","isDefined","isString","boot","HDWallet","isDefined","MemoryArchivist","MongoDBArchivistV2","ViewArchivist","initTelemetry","AbstractModule","LoggerModuleStatusReporter","ModuleFactoryLocator","MemorySentinel","HDWallet","hasMongoConfig","HttpRpcXyoConnection","MemoryXyoGateway","MemoryXyoSigner","getLocator","context","config","logger","otlpEndpoint","telemetry","otel","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","isDefined","AbstractModule","defaultLogger","statusReporter","LoggerModuleStatusReporter","undefined","locator","ModuleFactoryLocator","mongoConfig","storage","mongo","hasMongoConfig","connectionString","dbConnectionString","database","dbName","domain","dbDomain","password","dbPassword","username","dbUserName","payloadSdkConfig","params","register","MongoDBArchivistV2","factory","MemoryArchivist","MemorySentinel","ViewArchivist","gateway","getGateway","chainStepRewardsClaimSentinelParams","ChainStepRewardsClaimSentinel","derivedAddressWalletTransferSentinelParams","DerivedAddressWalletTransferSentinel","mnemonic","chainRpcApiUrl","rewardRedemptionApi","walletPromise","HDWallet","fromPhrase","random","account","signer","MemoryXyoSigner","connection","HttpRpcXyoConnection","MemoryXyoGateway","ManifestWrapper","NodeManifest","node","PrivateChildManifests","PublicChildManifests","getNode","context","wallet","locator","getLocator","wrapper","ManifestWrapper","NodeManifest","PublicChildManifests","PrivateChildManifests","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","hostname","getSeedPhrase","bios","config","logger","storedSeedPhrase","seedPhraseStore","get","debug","mnemonic","api","isString","warn","set","seedPhrase","HDWallet","generateMnemonic","log","assertEx","getServer","context","port","rewardRedemptionApi","boot","isDefined","wallet","fromPhrase","nodeContext","node","getNode","app","getApp","server","listen","setTimeout"]}
1
+ {"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rewardRedemption/routeDefinitions/routes/claimRange.ts","../../src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts","../../src/modules/ChainStepRewardsClaimSentinel/StepIdentityPayload.ts","../../src/modules/DerivedAddressWalletTransferSentinel/DerivedAddressWalletTransferSentinel.ts","../../src/server/routes/rewardRedemption/middleware/requestHandlerValidator.ts","../../src/server/routes/rewardRedemption/routeDefinitions/util/getViewerFromConfig.ts","../../src/server/routes/rewardRedemption/routeDefinitions/util/rewardableSteps.ts","../../src/server/routes/rewardRedemption/routeDefinitions/routes/redeem.ts","../../src/server/routes/rewardRedemption/routeDefinitions/getRouteDefinitions.ts","../../src/server/routes/rewardRedemption/addRewardRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.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/index.ts"],"sourcesContent":["import {\n customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler,\n standardErrors, standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\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, config: Config): Express => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\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.config = config\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 */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n } else {\n res.status(404).send()\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app\n const archivistModuleIdentifier = 'Data'\n app.use('/data', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isDefined } from '@xylabs/typeof'\nimport { blockRangeSteps } from '@xyo-network/chain-protocol'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { PayloadZodLoose } from '@xyo-network/payload-model'\nimport type { SentinelInstance } from '@xyo-network/sentinel-model'\nimport { asSentinelInstance } from '@xyo-network/sentinel-model'\nimport type { XL1BlockRange } from '@xyo-network/xl1-protocol'\nimport { asXL1BlockNumber } from '@xyo-network/xl1-protocol'\nimport { z } from 'zod'\n\nimport { type StepIdentityPayload, StepIdentitySchema } from '../../../../../modules/index.ts'\nimport { requestHandlerValidator } from '../../middleware/index.ts'\nimport type { RouteDefinition } from '../routeDefinition.ts'\nimport { getViewerFromConfig, RewardableSteps } from '../util/index.ts'\n\nconst query = z.object({\n fromBlock: z.coerce.number().int().nonnegative().optional(),\n toBlock: z.coerce.number().int().nonnegative().optional(),\n step: z.coerce.number().int().nonnegative().min(Math.min(...RewardableSteps)).max(Math.max(...RewardableSteps)).optional().default(3),\n})\nconst response = z.array(PayloadZodLoose)\n\nconst validateRequest = requestHandlerValidator({ query, response })\n\nconst getChainStepRewardsClaimSentinel = async (node: NodeInstance): Promise<SentinelInstance> => {\n const mod = await node.resolve('XYORewardRedemptionNode:ChainStepRewardsClaimSentinel')\n const sentinel = asSentinelInstance(mod)\n return assertEx(sentinel, () => 'ChainStepRewardsClaimSentinel not found on node')\n}\n\nexport const postClaimRange: RouteDefinition = {\n method: 'post',\n path: '/rewards/claimRange',\n handlers: validateRequest(async (req, res) => {\n const { config, node } = req.app\n const {\n fromBlock, toBlock, step,\n } = z.parse(query, req.query)\n const viewer = getViewerFromConfig(config)\n const from = isDefined(fromBlock) ? fromBlock : 0\n const currentBlock = await viewer.currentBlockNumber()\n const to = isDefined(toBlock) ? Math.min(toBlock, currentBlock) : currentBlock\n if (to <= from) {\n res.status(400)\n res.json([])\n return\n }\n const range: XL1BlockRange = [asXL1BlockNumber(from), asXL1BlockNumber(to)]\n // For each rewardable step in range\n const stepIdentities = blockRangeSteps(range, [step])\n const results: Payload[] = []\n for (const stepIdentity of stepIdentities) {\n const mod = await getChainStepRewardsClaimSentinel(node)\n const stepIdentityPayload = new PayloadBuilder<StepIdentityPayload>({ schema: StepIdentitySchema }).fields(stepIdentity).build()\n const result = await mod.report([stepIdentityPayload])\n results.push(...result)\n }\n res.status(200)\n res.json(results)\n }),\n}\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport type { Address } from '@xylabs/hex'\nimport { toAddress } from '@xylabs/hex'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { blockRangeSteps, createTransferPayload } from '@xyo-network/chain-protocol'\nimport type { AnyConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport type {\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport type {\n AttoXL1, SignedHydratedTransaction, StepIdentity, XL1BlockRange, XyoConnection, XyoGatewayProvider,\n XyoViewer,\n} from '@xyo-network/xl1-protocol'\nimport { asXL1BlockNumber, XYO_STEP_REWARD_ADDRESS } from '@xyo-network/xl1-protocol'\nimport {\n completedStepRewardAddress, derivedReceiveAddress, flattenHydratedTransaction, flattenHydratedTransactions,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { isStepIdentityPayload } from './StepIdentityPayload.ts'\n\nexport const ChainStepRewardsClaimSentinelConfigSchema = 'network.xyo.sentinel.chain.step.rewards.claim.config'\nexport type ChainStepRewardsClaimSentinelConfigSchema = typeof ChainStepRewardsClaimSentinelConfigSchema\n\n/**\n * The configuration for the chain step rewards claim sentinel\n */\nexport type ChainStepRewardsClaimSentinelConfig = SentinelConfig<{\n /**\n * The schema for the chain step rewards claim sentinel config\n */\n schema: ChainStepRewardsClaimSentinelConfigSchema\n /**\n * The interval in milliseconds between checking for step rewards to claim\n */\n stepClaimIntervalMs: number\n}>\n\ninterface ChainStepRewardsClaimSentinelParamFields {\n gateway: XyoGatewayProvider\n}\n\nexport type ChainStepRewardsClaimSentinelParams<\n TConfig extends AnyConfigSchema<ChainStepRewardsClaimSentinelConfig> = AnyConfigSchema<ChainStepRewardsClaimSentinelConfig>,\n> = SentinelParams<TConfig> & ChainStepRewardsClaimSentinelParamFields\n\nconst defaultStepClaimIntervalMs = 15_000\n// const retryAttempts = 3\n// const retryDelayMs = 60_000\nconst scope = 'reward-escrow'\nconst RewardableSteps = [3, 4, 5, 6, 7, 8]\n\nexport class ChainStepRewardsClaimSentinel<\n TParams extends ChainStepRewardsClaimSentinelParams = ChainStepRewardsClaimSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [ChainStepRewardsClaimSentinelConfigSchema]\n static override readonly defaultConfigSchema = ChainStepRewardsClaimSentinelConfigSchema\n private _claimAttemptsCounter: Counter<Attributes> | undefined\n private _claimCheckCounter: Counter<Attributes> | undefined\n private _claimErrorCounter: Counter<Attributes> | undefined\n private _claimSuccessCounter: Counter<Attributes> | undefined\n private _connection: XyoConnection | undefined\n private _gateway: XyoGatewayProvider | undefined\n private _reportMutex = new Mutex()\n private _viewer: XyoViewer | undefined\n\n protected get connection(): XyoConnection {\n return assertEx(this._connection, () => 'Connection is not defined')\n }\n\n protected get gateway(): XyoGatewayProvider {\n return assertEx(this._gateway, () => 'Gateway is not defined')\n }\n\n protected get stepClaimIntervalMs(): number {\n return isDefined(this.config.stepClaimIntervalMs) ? this.config.stepClaimIntervalMs : defaultStepClaimIntervalMs\n }\n\n protected get viewer(): XyoViewer {\n return assertEx(this._viewer, () => 'Viewer is not defined')\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n // Create meters for tracking claim attempts, successes, and errors.\n this._claimAttemptsCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_attempts_total', { description: 'Number of claim attempts' })\n this._claimCheckCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_check_total', { description: 'Number of claim checks' })\n this._claimSuccessCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_success_total', { description: 'Number of claim successes' })\n this._claimErrorCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_errors_total', { description: 'Number of claim errors' })\n\n const gateway = assertEx(this.params.gateway, () => 'Gateway parameter is required')\n const connection = assertEx(await gateway.connection(), () => 'Gateway connection is required')\n const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')\n // this._gateway = withRetry(gateway, retryDelayMs, retryAttempts)\n // this._connection = withRetry(connection, retryDelayMs, retryAttempts)\n // this._viewer = withRetry(viewer, retryDelayMs, retryAttempts)\n this._gateway = gateway // withRetry(gateway, retryDelayMs, retryAttempts)\n this._connection = connection // withRetry(connection, retryDelayMs, retryAttempts)\n this._viewer = viewer // withRetry(viewer, retryDelayMs, retryAttempts)\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n if (this._reportMutex.isLocked()) {\n this.logger?.debug(`ChainRewardsClaimSentinel [${this.id}] is already running, skipping report [${Date.now()}]`)\n return []\n }\n return await this._reportMutex.runExclusive(async () => {\n const response: Payload[] = []\n if (isUndefined(payloads) || payloads.length === 0) {\n await this.claimAllSteps()\n } else {\n // Process provided payloads\n const stepIdentities = payloads\n .filter(isStepIdentityPayload)\n .map<StepIdentity>((p) => {\n const { step, block: blockNumber } = p\n const block = asXL1BlockNumber(blockNumber)\n return { step, block }\n }).filter(stepIdentity => RewardableSteps.includes(stepIdentity.step))\n for (const stepIdentity of stepIdentities) {\n const result = await this.claimStepIdentity(stepIdentity)\n if (isDefined(result)) response.push(...flattenHydratedTransaction(result))\n }\n }\n return response\n })\n }\n\n private calculateAddressDistributions(rewardsByStaker: Record<Address, bigint>, balance: AttoXL1): Record<Address, bigint> {\n const addressClaims: Record<Address, bigint> = {}\n const totalRewards = Object.values(rewardsByStaker).reduce((acc, val) => acc + val, 0n)\n for (const [staker, amount] of Object.entries(rewardsByStaker)) {\n // Ensure they have accrued an amount\n if (amount <= 0n) continue\n const reward = (balance * amount) / totalRewards\n // Ensure they earned a reward\n if (reward <= 0n) continue\n // Accumulate rewards by address\n const receiveAddress = derivedReceiveAddress(toAddress(staker), scope)\n addressClaims[receiveAddress] = reward\n }\n const totalClaimed = Object.values(addressClaims).reduce((acc, val) => acc + val, 0n)\n assertEx(totalClaimed <= balance, () => 'Total claimed exceeds claimable balance')\n const unclaimed = balance - totalClaimed\n if (unclaimed > 0n) {\n // Return anything unclaimed (due to truncation/rounding) to step rewards pool address\n addressClaims[XYO_STEP_REWARD_ADDRESS] = unclaimed\n }\n return addressClaims\n }\n\n private async claimAllSteps(): Promise<Payload[]> {\n // No payloads to process, just do claims since last run\n const results: SignedHydratedTransaction[] = []\n\n for (const step of RewardableSteps) {\n // Fetch unclaimed rewards and process claims\n const from = 0\n const to = await this.viewer.currentBlockNumber()\n const range: XL1BlockRange = [asXL1BlockNumber(from), asXL1BlockNumber(to)]\n // For each rewardable step in range\n const stepIdentities = blockRangeSteps(range, [step])\n for (const stepIdentity of stepIdentities) {\n const result = await this.claimStepIdentity(stepIdentity)\n if (isDefined(result)) {\n results.push(result)\n }\n await delay(this.stepClaimIntervalMs)\n }\n }\n return flattenHydratedTransactions(results)\n }\n\n private async claimStepIdentity(stepIdentity: StepIdentity): Promise<SignedHydratedTransaction | undefined> {\n this.logger?.info(`Checking rewards to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`)\n const claimCounterAttributes = { step: stepIdentity.step.toString(), block: stepIdentity.block.toString() }\n try {\n this._claimCheckCounter?.add(1, claimCounterAttributes)\n // If wallet has balance\n const stepRewardAddress = completedStepRewardAddress(stepIdentity)\n const balance = await this.viewer.accountBalance(stepRewardAddress)\n if (balance > 0n) {\n this.logger?.info(`Found balance of ${balance} to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`)\n this._claimAttemptsCounter?.add(1, claimCounterAttributes)\n // For stakers\n const rewardsByStaker = await this.viewer.networkStakeStepRewardPoolRewards(stepIdentity)\n const addressDistributions = this.calculateAddressDistributions(rewardsByStaker, balance)\n this.logger?.info(\n `Calculated address distributions for step ${stepIdentity.step} at block ${stepIdentity.block}`\n + ` with ${Object.keys(addressDistributions).length} addresses`,\n )\n // Create single transaction for all claims\n const tx = await this.submitRewardDistributionTransaction(stepRewardAddress, addressDistributions, stepIdentity, this.gateway)\n this.logger?.info(`Claimed rewards for step ${stepIdentity.step} at block ${stepIdentity.block}`)\n this._claimSuccessCounter?.add(1, claimCounterAttributes)\n // Return submitted transaction\n return tx\n }\n } catch (error) {\n this._claimErrorCounter?.add(1, claimCounterAttributes)\n this.logger?.error(`Error claiming rewards for step ${stepIdentity.step} at block ${stepIdentity.block}:`, error)\n }\n }\n\n private async submitRewardDistributionTransaction(\n stepRewardAddress: Address,\n addressDistributions: Record<Address, bigint>,\n step: StepIdentity,\n gateway: XyoGatewayProvider,\n ): Promise<SignedHydratedTransaction | undefined> {\n // Create single transfer payload for all claims\n const transferPayload = createTransferPayload(stepRewardAddress, addressDistributions)\n transferPayload.context = { step }\n const currentBlockNumber = await this.viewer.currentBlockNumber()\n const result = await gateway.addPayloadsToChain?.([transferPayload], [], { nbf: currentBlockNumber, exp: currentBlockNumber + 10 })\n if (isDefined(result)) return result[1]\n }\n}\n","import { AsObjectFactory } from '@xylabs/object'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isPayloadOfZodType } from '@xyo-network/payload-model'\nimport { StepIdentityZod } from '@xyo-network/xl1-rpc'\nimport type { z } from 'zod'\n\nexport const StepIdentitySchema = 'network.xyo.chain.step.identity' as const\nexport type StepIdentitySchema = typeof StepIdentitySchema\n\ntype StepIdentityFieldsZod = z.infer<typeof StepIdentityZod>\n\n/**\n * A Step Identity Payload\n */\nexport type StepIdentityPayload = Payload<StepIdentityFieldsZod, StepIdentitySchema>\n\nexport const isStepIdentityPayload = isPayloadOfZodType<StepIdentityPayload>(StepIdentityZod, StepIdentitySchema)\n\nexport const asStepIdentityPayload = AsObjectFactory.create(isStepIdentityPayload)\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport {\n AddressZod, EthAddressZod, hexToBigInt, HexZod, toAddress, toHex,\n} from '@xylabs/hex'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { createTransferPayload } from '@xyo-network/chain-protocol'\nimport type { AnyConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport type {\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport type { SignedHydratedTransaction, XyoGatewayProvider } from '@xyo-network/xl1-protocol'\nimport {\n derivedReceiveAddress, flattenHydratedTransaction, isEIP712DataPayload, isEIP712SignaturePayload, verifyEIP712Message,\n} from '@xyo-network/xl1-protocol-sdk'\nimport z from 'zod'\n\nexport const DerivedAddressWalletTransferSentinelConfigSchema = 'network.xyo.sentinel.chain.derived.address.wallet.transfer.config'\nexport type DerivedAddressWalletTransferSentinelConfigSchema = typeof DerivedAddressWalletTransferSentinelConfigSchema\n\n/**\n * The configuration for the derived address wallet transfer sentinel\n */\nexport type DerivedAddressWalletTransferSentinelConfig = SentinelConfig<{\n /**\n * The schema for the derived address wallet transfer sentinel config\n */\n schema: DerivedAddressWalletTransferSentinelConfigSchema\n}>\n\nexport interface DerivedAddressWalletTransferSentinelParamFields {\n gateway: XyoGatewayProvider\n}\n\nexport type DerivedAddressWalletTransferSentinelParams<\n TConfig extends AnyConfigSchema<DerivedAddressWalletTransferSentinelConfig> = AnyConfigSchema<DerivedAddressWalletTransferSentinelConfig>,\n> = SentinelParams<TConfig> & DerivedAddressWalletTransferSentinelParamFields\n\nconst scope = 'reward-escrow'\n\ninterface ParsedClaimValues {\n amount: string\n // chainId: ChainId\n exp: number\n from: Address\n nbf: number\n to: Address\n}\n\n// Assuming EthAddress and Hex are string-like (typical case)\nexport const ConfirmedClaimValuesZod = z.object({\n 'From': EthAddressZod,\n 'To XL1 Address': AddressZod,\n 'XL1 Amount': z.string(),\n 'XL1 Amount (Hex)': HexZod, // Hex\n 'XL1 Not after block': z.number().int().nonnegative(),\n 'XL1 Not before block': z.number().int().nonnegative(),\n})\n\nexport type ConfirmedClaimValues = z.infer<typeof ConfirmedClaimValuesZod>\n\nconst parseConfirmedClaimValues = (values: ConfirmedClaimValues): ParsedClaimValues => {\n return {\n amount: values['XL1 Amount (Hex)'],\n exp: values['XL1 Not after block'],\n from: toAddress(values.From),\n nbf: values['XL1 Not before block'],\n to: toAddress(values['To XL1 Address']),\n }\n}\n\nexport class DerivedAddressWalletTransferSentinel<\n TParams extends DerivedAddressWalletTransferSentinelParams = DerivedAddressWalletTransferSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [DerivedAddressWalletTransferSentinelConfigSchema]\n static override readonly defaultConfigSchema = DerivedAddressWalletTransferSentinelConfigSchema\n private _transferAttemptsCounter: Counter<Attributes> | undefined\n private _transferErrorCounter: Counter<Attributes> | undefined\n private _transferSuccessCounter: Counter<Attributes> | undefined\n\n protected get gateway(): XyoGatewayProvider {\n return this.params.gateway\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n // Create meters for tracking claim attempts, successes, and errors.\n this._transferAttemptsCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_attempts_total',\n { description: 'Number of transfer attempts' },\n )\n this._transferSuccessCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_success_total',\n { description: 'Number of transfer successes' },\n )\n this._transferErrorCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_errors_total',\n { description: 'Number of transfer errors' },\n )\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n const data = payloads?.find(isEIP712DataPayload)\n const signature = payloads?.find(isEIP712SignaturePayload)\n if (isUndefined(data) || isUndefined(signature)) return []\n this._transferAttemptsCounter?.add(1)\n const valid = await verifyEIP712Message(data, signature)\n if (!valid) {\n this._transferErrorCounter?.add(1)\n throw new Error('Invalid EIP712 signature')\n }\n const values = ConfirmedClaimValuesZod.parse(data.values)\n const parsed = parseConfirmedClaimValues(values)\n const signatureAddress = toAddress(signature.address)\n const parsedAddress = toAddress(parsed.from)\n if (signatureAddress === parsedAddress) {\n const tx = await this.submitRewardDistributionTransaction(parsed)\n if (isDefined(tx)) {\n this._transferSuccessCounter?.add(1)\n return flattenHydratedTransaction(tx)\n }\n }\n this._transferErrorCounter?.add(1)\n return []\n }\n\n protected submitRewardDistributionTransaction = async (claimValues: ParsedClaimValues): Promise<SignedHydratedTransaction | undefined> => {\n const {\n amount, from: address, to, nbf, exp,\n } = claimValues\n // Ensure necessary gateway pre-requisites are met\n const signer = assertEx(await this.gateway.signer(), () => 'Signer is not defined in gateway')\n const signerAddress = await signer.address()\n const connection = await this.gateway.connection()\n const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')\n\n // TODO: Validate chainId against supplied in ClaimValues to prevent replay attacks\n // const chainId = await viewer.chainId()\n\n // Ensure the transaction is within the valid block range\n const currentBlock = await viewer.currentBlockNumber()\n if (currentBlock < nbf || currentBlock > exp) throw new Error('Transaction is not within a valid block range')\n\n // Parse the signer's address\n const escrowAccount = derivedReceiveAddress(address, scope)\n\n // Ensure the escrow account has sufficient balance\n const balance = await viewer.accountBalance(escrowAccount)\n // NOTE: Currently we require the full amount to be redeemed from the escrow account. We do\n // not allow partial escrow redemptions.\n const redemptionAmount = hexToBigInt(toHex(amount))\n assertEx(balance === redemptionAmount, () => 'Insufficient balance in escrow account')\n\n // Ensure we have enough allowance to transfer from the escrow account\n const allowance = await viewer.accountBalance(signerAddress)\n assertEx(allowance > 1000n, () => 'Insufficient allowance to transfer from escrow account')\n\n // Create the transfer payload\n const transferPayload = createTransferPayload(escrowAccount, { [to]: hexToBigInt(toHex(amount)) })\n // Add required validation context\n transferPayload.context = { address, scope }\n const chain = await viewer.chainId()\n const result = await this.gateway.addPayloadsToChain?.([transferPayload], [], {\n chain, nbf, exp,\n })\n if (isDefined(result)) return result[1]\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { ExpressError } from '@xylabs/express'\nimport { isDefined, isPromise } from '@xylabs/typeof'\nimport type {\n NextFunction, Request, RequestHandler, Response,\n} from 'express'\nimport { ReasonPhrases, StatusCodes } from 'http-status-codes'\nimport type { ZodType } from 'zod'\nimport { z } from 'zod'\n\n/**\n * Empty Zod schema for requests with no parameters.\n */\nexport const EmptyParamsZod = z.object({}).catchall(z.string())\n\n/**\n * Empty Zod schema for requests with no query parameters.\n */\nexport const EmptyQueryParamsZod = z.object({}).catchall(z.union([z.string(), z.array(z.string())]))\n\n/**\n * Default validation schemas for request handler validator.\n */\nexport const ValidateRequestDefaults = {\n params: EmptyParamsZod,\n query: EmptyQueryParamsZod,\n body: z.json().optional(),\n response: z.json().optional(),\n}\n\ntype ValidatableRequestKey = 'params' | 'query' | 'body'\n\n/**\n * Factory for Express middleware that validates request and response objects using Zod schemas.\n * @param schemas The Zod schemas to use for validation.\n * @returns A middleware function for validating requests and responses.\n */\nexport function requestHandlerValidator<\n TParams extends typeof EmptyQueryParamsZod | ZodType<Record<string, string>> = typeof EmptyQueryParamsZod,\n TQuery extends typeof EmptyQueryParamsZod | ZodType<Record<string, string | string[]>> = typeof EmptyQueryParamsZod,\n TBody extends ZodType<unknown> = ZodType<unknown>,\n TResponse extends ZodType<unknown> = ZodType<unknown>,\n>(schemas?: Partial<{\n body: TBody\n params: TParams\n query: TQuery\n response: TResponse\n}>) {\n type Params = z.infer<TParams>\n type Query = z.infer<TQuery>\n type Body = z.infer<TBody>\n type Res = z.infer<TResponse>\n const validators = { ...ValidateRequestDefaults, ...schemas }\n\n return (handler: (req: Request<Params, Res, Body, Query>, res: Response<Res>, next: NextFunction) => unknown): RequestHandler => {\n return async (req: Request, res: Response, next: NextFunction) => {\n const originalJson = res.json.bind(res)\n try {\n // Validate incoming request\n const errors: string[] = []\n const keys: ValidatableRequestKey[] = ['params', 'query', 'body']\n for (const key of keys) {\n const validator = validators[key]\n const result = validator.safeParse(req[key])\n if (result.success) {\n if (isDefined(result.data)) Object.assign(req[key], result.data)\n } else {\n errors.push(\n ...result.error.issues.map(\n issue => (issue.path.length === 0)\n ? `${key}: ${issue.message}`\n : `${key}.${issue.path.join('.')}: ${issue.message}`,\n ),\n )\n }\n }\n\n // If there were validation errors, short-circuit and return Bad Request\n if (errors.length > 0) {\n const message = errors.join('; ')\n const err: ExpressError = new Error(message)\n err.name = ReasonPhrases.BAD_REQUEST\n err.statusCode = StatusCodes.BAD_REQUEST\n next(err)\n return false\n }\n\n // Wrap res.json to validate outgoing response\n res.json = (data: any) => {\n const result = validators.response.safeParse(data)\n if (result.success) {\n return originalJson(result.data)\n } else {\n const message = result.error.issues.map(\n issue => (issue.path.length === 0)\n ? `response: ${issue.message}`\n : `response.${issue.path.join('.')}: ${issue.message}`,\n ).join('; ')\n const err: ExpressError = new Error(message)\n err.name = ReasonPhrases.INTERNAL_SERVER_ERROR\n err.statusCode = StatusCodes.INTERNAL_SERVER_ERROR\n\n // Restore original json function in case the error handler wants to use it\n res.json = originalJson\n throw err\n }\n }\n\n // Automatically handle async errors\n const result = handler(req as any, res as any, next)\n if (result && isPromise(result)) {\n await result\n }\n } catch (err) {\n res.json = originalJson\n next(err)\n }\n }\n }\n}\n","import { isDefined } from '@xylabs/typeof'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcTransport, JsonRpcXyoViewer, XyoViewerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\n\nlet viewer: JsonRpcXyoViewer | undefined\n\nexport const getViewerFromConfig = (config: Config): JsonRpcXyoViewer => {\n if (isDefined(viewer)) return viewer\n const transport = new HttpRpcTransport(config.rewardRedemptionApi.chainRpcApiUrl, XyoViewerRpcSchemas)\n viewer = new JsonRpcXyoViewer(transport)\n return viewer\n}\n","export const RewardableSteps = [3, 4, 5, 6, 7, 8]\n","import { assertEx } from '@xylabs/assert'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadZodLoose, PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport type { SentinelInstance } from '@xyo-network/sentinel-model'\nimport { asSentinelInstance } from '@xyo-network/sentinel-model'\nimport {\n EIP712DataPayloadFieldsZod, EIP712DataPayloadSchema, EIP712SignaturePayloadFieldsZod,\n EIP712SignaturePayloadSchema,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { z } from 'zod'\n\nimport { requestHandlerValidator } from '../../middleware/index.ts'\nimport type { RouteDefinition } from '../routeDefinition.ts'\n\nconst body = z.tuple([\n PayloadZodStrictOfSchema(EIP712DataPayloadSchema).extend(EIP712DataPayloadFieldsZod.shape),\n PayloadZodStrictOfSchema(EIP712SignaturePayloadSchema).extend(EIP712SignaturePayloadFieldsZod.shape),\n])\n\nconst response = z.array(PayloadZodLoose)\nconst validateRequest = requestHandlerValidator({\n body,\n response,\n})\n\nconst getDerivedAddressWalletTransferSentinel = async (node: NodeInstance): Promise<SentinelInstance> => {\n const mod = await node.resolve('XYORewardRedemptionNode:DerivedAddressWalletTransferSentinel')\n const sentinel = asSentinelInstance(mod)\n return assertEx(sentinel, () => 'DerivedAddressWalletTransferSentinel not found on node')\n}\n\nexport const postRedeem: RouteDefinition = {\n method: 'post',\n path: '/rewards/redeem',\n handlers: validateRequest(async (req, res) => {\n const { node } = req.app\n const { body } = req\n const sentinel = await getDerivedAddressWalletTransferSentinel(node)\n const result = await sentinel.report(body)\n res.status(200)\n res.json(result)\n }),\n}\n","import type { RouteDefinition } from './routeDefinition.ts'\nimport { postClaimRange, postRedeem } from './routes/index.ts'\n\nexport const getRouteDefinitions = (): RouteDefinition[] => {\n return [\n postClaimRange,\n postRedeem,\n ]\n}\n","import type { Express } from 'express'\n\nimport { getRouteDefinitions } from './routeDefinitions/index.ts'\n\nexport const addRewardRedemptionRoutes = (app: Express) => {\n const routeDefinitions = getRouteDefinitions()\n for (const definition of routeDefinitions) {\n app[definition.method](definition.path, definition.handlers)\n }\n}\n","import type { Express } from 'express'\n\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRewardRedemptionRoutes } from './rewardRedemption/index.ts'\n\nexport const addRoutes = (app: Express) => {\n addDataLakeRoutes(app)\n addRewardRedemptionRoutes(app)\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Logger } from '@xylabs/logger'\nimport { isDefined, 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'\nimport { type Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getNode } from '../manifest/index.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\n// TODO: Make nodejs version of bios support round tripping mnemonic between boots\nconst getSeedPhrase = async (bios: BiosExternalInterface, config: Config, logger?: Logger): Promise<string> => {\n const storedSeedPhrase = await bios.seedPhraseStore.get('os')\n logger?.debug(`[Bridge] Stored mnemonic: ${storedSeedPhrase}`)\n const { mnemonic } = config.api\n if (isString(storedSeedPhrase) && isString(mnemonic)) {\n logger?.warn('[Bridge] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.')\n await bios.seedPhraseStore.set('os', mnemonic)\n } else {\n let seedPhrase: string\n if (isString(mnemonic)) {\n seedPhrase = mnemonic\n } else {\n seedPhrase = HDWallet.generateMnemonic()\n logger?.log('[Bridge] No mnemonic provided, using random mnemonic. This is not recommended for production use.')\n logger?.log(`[Bridge] Mnemonic: ${seedPhrase}`)\n }\n await bios.seedPhraseStore.set('os', seedPhrase)\n }\n return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire mnemonic from bios')\n}\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport const getServer = async (context: GetServerContext) => {\n const { logger, config } = context\n const { port, mnemonic } = config.rewardRedemptionApi\n const bios = await boot()\n const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)\n const wallet = await HDWallet.fromPhrase(seedPhrase)\n const nodeContext = {\n wallet, logger, config,\n }\n const node = context.node ?? await getNode(nodeContext)\n const app = getApp(node, config)\n const server = app.listen(port, hostname, () => logger?.log(`[Bridge] Server listening at http://${hostname}:${port}`))\n server.setTimeout(120_000)\n return server\n}\n","import type { Logger } from '@xylabs/logger'\nimport { type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'\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 { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { AbstractModule, LoggerModuleStatusReporter } from '@xyo-network/module-abstract'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { XyoGatewayProvider } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { hasMongoConfig } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcXyoConnection, MemoryXyoGateway, MemoryXyoSigner,\n} from '@xyo-network/xl1-rpc'\n\nimport type { ChainStepRewardsClaimSentinelParams, DerivedAddressWalletTransferSentinelParams } from '../modules/index.ts'\nimport { ChainStepRewardsClaimSentinel, DerivedAddressWalletTransferSentinel } from '../modules/index.ts'\n\nexport interface GetLocatorContext {\n config: Config\n logger?: Logger\n}\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 (context: GetLocatorContext) => {\n const { config, logger } = context\n const { otlpEndpoint } = config.telemetry?.otel ?? {}\n const { traceProvider, meterProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-rewards',\n serviceVersion: '1.0.0',\n },\n otlpEndpoint,\n metricsConfig: {\n endpoint: '/metrics',\n port: 9465,\n },\n })\n\n if (isDefined(logger)) AbstractModule.defaultLogger = logger\n const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined\n\n const locator = new ModuleFactoryLocator()\n // If there's a MongoDB configuration\n const mongoConfig = config.storage?.mongo\n if (hasMongoConfig(mongoConfig)) {\n // Create the MongoDB SDK from the configuration\n const {\n connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName,\n } = mongoConfig\n const payloadSdkConfig: BaseMongoSdkPrivateConfig = {\n dbConnectionString, dbDomain, dbName, dbPassword, dbUserName,\n }\n const params: Partial<MongoDBModuleParamsV2> = {\n meterProvider, payloadSdkConfig, statusReporter, traceProvider,\n }\n // Register the MongoDB Archivist as the default\n locator.register(MongoDBArchivistV2.factory(params), undefined, true)\n }\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 const gateway = await getGateway(config)\n const chainStepRewardsClaimSentinelParams: Partial<ChainStepRewardsClaimSentinelParams> = {\n gateway, traceProvider, meterProvider, statusReporter,\n }\n locator.register(ChainStepRewardsClaimSentinel.factory(chainStepRewardsClaimSentinelParams))\n const derivedAddressWalletTransferSentinelParams: Partial<DerivedAddressWalletTransferSentinelParams> = {\n gateway, traceProvider, meterProvider, statusReporter,\n }\n locator.register(DerivedAddressWalletTransferSentinel.factory(derivedAddressWalletTransferSentinelParams))\n return locator\n}\n\nconst getGateway = async (\n config: Config,\n): Promise<XyoGatewayProvider> => {\n const { mnemonic, chainRpcApiUrl: endpoint } = config.rewardRedemptionApi\n const walletPromise = isDefined(mnemonic) ? HDWallet.fromPhrase(mnemonic) : HDWallet.random()\n const account = await walletPromise\n const signer = new MemoryXyoSigner(account)\n const connection = new HttpRpcXyoConnection({ endpoint, account })\n const gateway = new MemoryXyoGateway(signer, connection)\n return gateway\n}\n","import type { Logger } from '@xylabs/logger'\nimport { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getLocator } from './getLocator.ts'\nimport { NodeManifest } from './nodeManifest.ts'\nimport { PrivateChildManifests } from './private/index.ts'\nimport { PublicChildManifests } from './public/index.ts'\n\nexport interface GetNodeContext {\n config: Config\n logger?: Logger\n wallet: WalletInstance\n}\n\n/**\n * Creates a node with the xyo-chain modules registered\n * @param context The context to use for the node\n * @returns A node with the xyo-chain modules registered\n */\nexport const getNode = async (context: GetNodeContext) => {\n const { wallet } = context\n const locator = await getLocator(context)\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 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\": \"XYORewardRedemptionNode\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"name\": \"DataPrivate\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"reward_redemption_api_datalake\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/2'\",\n \"name\": \"ChainStepRewardsClaimSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.step.rewards.claim.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/3'\",\n \"automations\": [\n {\n \"frequency\": 60000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"ChainRewardsClaimIntervalSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"ChainStepRewardsClaimSentinel\",\n \"endPoint\": \"report\"\n }\n ]\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/4'\",\n \"name\": \"DerivedAddressWalletTransferSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.derived.address.wallet.transfer.config\"\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"Data\",\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\": \"DataPrivate\",\n \"schema\": \"network.xyo.archivist.view.config\"\n }\n }\n ]\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","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/manifest-model'\n\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = []\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","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","archivistModuleIdentifier","use","archivistMiddleware","assertEx","isDefined","blockRangeSteps","PayloadBuilder","PayloadZodLoose","asSentinelInstance","asXL1BlockNumber","z","assertEx","delay","toAddress","isDefined","isUndefined","blockRangeSteps","createTransferPayload","AbstractSentinel","asXL1BlockNumber","XYO_STEP_REWARD_ADDRESS","completedStepRewardAddress","derivedReceiveAddress","flattenHydratedTransaction","flattenHydratedTransactions","Mutex","AsObjectFactory","isPayloadOfZodType","StepIdentityZod","StepIdentitySchema","isStepIdentityPayload","asStepIdentityPayload","create","ChainStepRewardsClaimSentinelConfigSchema","defaultStepClaimIntervalMs","scope","RewardableSteps","ChainStepRewardsClaimSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_claimAttemptsCounter","_claimCheckCounter","_claimErrorCounter","_claimSuccessCounter","_connection","_gateway","_reportMutex","Mutex","_viewer","connection","assertEx","gateway","stepClaimIntervalMs","isDefined","config","viewer","createHandler","meter","createCounter","description","params","reportHandler","payloads","isLocked","logger","debug","id","Date","now","runExclusive","response","isUndefined","length","claimAllSteps","stepIdentities","filter","isStepIdentityPayload","map","p","step","block","blockNumber","asXL1BlockNumber","stepIdentity","includes","result","claimStepIdentity","push","flattenHydratedTransaction","calculateAddressDistributions","rewardsByStaker","balance","addressClaims","totalRewards","Object","values","reduce","acc","val","staker","amount","entries","reward","receiveAddress","derivedReceiveAddress","toAddress","totalClaimed","unclaimed","XYO_STEP_REWARD_ADDRESS","results","from","to","currentBlockNumber","range","blockRangeSteps","delay","flattenHydratedTransactions","info","claimCounterAttributes","toString","add","stepRewardAddress","completedStepRewardAddress","accountBalance","networkStakeStepRewardPoolRewards","addressDistributions","keys","tx","submitRewardDistributionTransaction","error","transferPayload","createTransferPayload","context","addPayloadsToChain","nbf","exp","assertEx","AddressZod","EthAddressZod","hexToBigInt","HexZod","toAddress","toHex","isDefined","isUndefined","createTransferPayload","AbstractSentinel","derivedReceiveAddress","flattenHydratedTransaction","isEIP712DataPayload","isEIP712SignaturePayload","verifyEIP712Message","z","DerivedAddressWalletTransferSentinelConfigSchema","scope","ConfirmedClaimValuesZod","z","object","EthAddressZod","AddressZod","string","HexZod","number","int","nonnegative","parseConfirmedClaimValues","values","amount","exp","from","toAddress","From","nbf","to","DerivedAddressWalletTransferSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_transferAttemptsCounter","_transferErrorCounter","_transferSuccessCounter","gateway","params","createHandler","meter","createCounter","description","reportHandler","payloads","data","find","isEIP712DataPayload","signature","isEIP712SignaturePayload","isUndefined","add","valid","verifyEIP712Message","Error","parse","parsed","signatureAddress","address","parsedAddress","tx","submitRewardDistributionTransaction","isDefined","flattenHydratedTransaction","claimValues","signer","assertEx","signerAddress","connection","viewer","currentBlock","currentBlockNumber","escrowAccount","derivedReceiveAddress","balance","accountBalance","redemptionAmount","hexToBigInt","toHex","allowance","transferPayload","createTransferPayload","context","chain","chainId","result","addPayloadsToChain","isDefined","isPromise","ReasonPhrases","StatusCodes","z","EmptyParamsZod","z","object","catchall","string","EmptyQueryParamsZod","union","array","ValidateRequestDefaults","params","query","body","json","optional","response","requestHandlerValidator","schemas","validators","handler","req","res","next","originalJson","bind","errors","keys","key","validator","result","safeParse","success","isDefined","data","Object","assign","push","error","issues","map","issue","path","length","message","join","err","Error","name","ReasonPhrases","BAD_REQUEST","statusCode","StatusCodes","INTERNAL_SERVER_ERROR","isPromise","isDefined","HttpRpcTransport","JsonRpcXyoViewer","XyoViewerRpcSchemas","viewer","getViewerFromConfig","config","isDefined","transport","HttpRpcTransport","rewardRedemptionApi","chainRpcApiUrl","XyoViewerRpcSchemas","JsonRpcXyoViewer","RewardableSteps","query","z","object","fromBlock","coerce","number","int","nonnegative","optional","toBlock","step","min","Math","RewardableSteps","max","default","response","array","PayloadZodLoose","validateRequest","requestHandlerValidator","getChainStepRewardsClaimSentinel","node","mod","resolve","sentinel","asSentinelInstance","assertEx","postClaimRange","method","path","handlers","req","res","config","app","parse","viewer","getViewerFromConfig","from","isDefined","currentBlock","currentBlockNumber","to","status","json","range","asXL1BlockNumber","stepIdentities","blockRangeSteps","results","stepIdentity","stepIdentityPayload","PayloadBuilder","schema","StepIdentitySchema","fields","build","result","report","push","assertEx","PayloadZodLoose","PayloadZodStrictOfSchema","asSentinelInstance","EIP712DataPayloadFieldsZod","EIP712DataPayloadSchema","EIP712SignaturePayloadFieldsZod","EIP712SignaturePayloadSchema","z","body","z","tuple","PayloadZodStrictOfSchema","EIP712DataPayloadSchema","extend","EIP712DataPayloadFieldsZod","shape","EIP712SignaturePayloadSchema","EIP712SignaturePayloadFieldsZod","response","array","PayloadZodLoose","validateRequest","requestHandlerValidator","getDerivedAddressWalletTransferSentinel","node","mod","resolve","sentinel","asSentinelInstance","assertEx","postRedeem","method","path","handlers","req","res","app","result","report","status","json","getRouteDefinitions","postClaimRange","postRedeem","addRewardRedemptionRoutes","app","routeDefinitions","getRouteDefinitions","definition","method","path","handlers","addRoutes","app","addDataLakeRoutes","addRewardRedemptionRoutes","getApp","node","config","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","isDefined","isString","boot","HDWallet","isDefined","MemoryArchivist","MongoDBArchivistV2","ViewArchivist","initTelemetry","AbstractModule","LoggerModuleStatusReporter","ModuleFactoryLocator","MemorySentinel","HDWallet","hasMongoConfig","HttpRpcXyoConnection","MemoryXyoGateway","MemoryXyoSigner","getLocator","context","config","logger","otlpEndpoint","telemetry","otel","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","isDefined","AbstractModule","defaultLogger","statusReporter","LoggerModuleStatusReporter","undefined","locator","ModuleFactoryLocator","mongoConfig","storage","mongo","hasMongoConfig","connectionString","dbConnectionString","database","dbName","domain","dbDomain","password","dbPassword","username","dbUserName","payloadSdkConfig","params","register","MongoDBArchivistV2","factory","MemoryArchivist","MemorySentinel","ViewArchivist","gateway","getGateway","chainStepRewardsClaimSentinelParams","ChainStepRewardsClaimSentinel","derivedAddressWalletTransferSentinelParams","DerivedAddressWalletTransferSentinel","mnemonic","chainRpcApiUrl","rewardRedemptionApi","walletPromise","HDWallet","fromPhrase","random","account","signer","MemoryXyoSigner","connection","HttpRpcXyoConnection","MemoryXyoGateway","ManifestWrapper","NodeManifest","node","PrivateChildManifests","PublicChildManifests","getNode","context","wallet","locator","getLocator","wrapper","ManifestWrapper","NodeManifest","PublicChildManifests","PrivateChildManifests","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","hostname","getSeedPhrase","bios","config","logger","storedSeedPhrase","seedPhraseStore","get","debug","mnemonic","api","isString","warn","set","seedPhrase","HDWallet","generateMnemonic","log","assertEx","getServer","context","port","rewardRedemptionApi","boot","isDefined","wallet","fromPhrase","nodeContext","node","getNode","app","getApp","server","listen","setTimeout"]}
@@ -1 +1 @@
1
- {"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAQ5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAM1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAS3D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAU,SAAS,iBAAiB,kCAuD1D,CAAA"}
1
+ {"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAQ5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAK1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAS3D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAU,SAAS,iBAAiB,kCAuD1D,CAAA"}
@@ -2,7 +2,7 @@ import type { AnyConfigSchema } from '@xyo-network/module-model';
2
2
  import type { Payload } from '@xyo-network/payload-model';
3
3
  import { AbstractSentinel } from '@xyo-network/sentinel-abstract';
4
4
  import type { SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams } from '@xyo-network/sentinel-model';
5
- import type { XyoGatewayProvider } from '@xyo-network/xl1-protocol';
5
+ import type { XyoConnection, XyoGatewayProvider, XyoViewer } from '@xyo-network/xl1-protocol';
6
6
  export declare const ChainStepRewardsClaimSentinelConfigSchema = "network.xyo.sentinel.chain.step.rewards.claim.config";
7
7
  export type ChainStepRewardsClaimSentinelConfigSchema = typeof ChainStepRewardsClaimSentinelConfigSchema;
8
8
  /**
@@ -13,6 +13,10 @@ export type ChainStepRewardsClaimSentinelConfig = SentinelConfig<{
13
13
  * The schema for the chain step rewards claim sentinel config
14
14
  */
15
15
  schema: ChainStepRewardsClaimSentinelConfigSchema;
16
+ /**
17
+ * The interval in milliseconds between checking for step rewards to claim
18
+ */
19
+ stepClaimIntervalMs: number;
16
20
  }>;
17
21
  interface ChainStepRewardsClaimSentinelParamFields {
18
22
  gateway: XyoGatewayProvider;
@@ -25,8 +29,14 @@ export declare class ChainStepRewardsClaimSentinel<TParams extends ChainStepRewa
25
29
  private _claimCheckCounter;
26
30
  private _claimErrorCounter;
27
31
  private _claimSuccessCounter;
32
+ private _connection;
33
+ private _gateway;
28
34
  private _reportMutex;
35
+ private _viewer;
36
+ protected get connection(): XyoConnection;
29
37
  protected get gateway(): XyoGatewayProvider;
38
+ protected get stepClaimIntervalMs(): number;
39
+ protected get viewer(): XyoViewer;
30
40
  createHandler(): Promise<void>;
31
41
  reportHandler(payloads?: Payload[]): Promise<Payload[]>;
32
42
  private calculateAddressDistributions;
@@ -1 +1 @@
1
- {"version":3,"file":"ChainStepRewardsClaimSentinel.d.ts","sourceRoot":"","sources":["../../../../src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,KAAK,EACV,cAAc,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,cAAc,EAC1E,MAAM,6BAA6B,CAAA;AACpC,OAAO,KAAK,EACuD,kBAAkB,EACpF,MAAM,2BAA2B,CAAA;AAUlC,eAAO,MAAM,yCAAyC,yDAAyD,CAAA;AAC/G,MAAM,MAAM,yCAAyC,GAAG,OAAO,yCAAyC,CAAA;AAExG;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG,cAAc,CAAC;IAC/D;;OAEG;IACH,MAAM,EAAE,yCAAyC,CAAA;CAClD,CAAC,CAAA;AAEF,UAAU,wCAAwC;IAChD,OAAO,EAAE,kBAAkB,CAAA;CAC5B;AAED,MAAM,MAAM,mCAAmC,CAC7C,OAAO,SAAS,eAAe,CAAC,mCAAmC,CAAC,GAAG,eAAe,CAAC,mCAAmC,CAAC,IACzH,cAAc,CAAC,OAAO,CAAC,GAAG,wCAAwC,CAAA;AAOtE,qBAAa,6BAA6B,CACxC,OAAO,SAAS,mCAAmC,GAAG,mCAAmC,EACzF,UAAU,SAAS,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAC1H,SAAQ,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7C,gBAAyB,aAAa,WAA8C;IACpF,gBAAyB,mBAAmB,0DAA4C;IACxF,OAAO,CAAC,qBAAqB,CAAiC;IAC9D,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,oBAAoB,CAAiC;IAC7D,OAAO,CAAC,YAAY,CAAc;IAElC,SAAS,KAAK,OAAO,IAAI,kBAAkB,CAE1C;IAEc,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,aAAa,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA2BtE,OAAO,CAAC,6BAA6B;YAuBvB,aAAa;YAsBb,iBAAiB;YA6BjB,mCAAmC;CAkBlD"}
1
+ {"version":3,"file":"ChainStepRewardsClaimSentinel.d.ts","sourceRoot":"","sources":["../../../../src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,KAAK,EACV,cAAc,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,cAAc,EAC1E,MAAM,6BAA6B,CAAA;AACpC,OAAO,KAAK,EACuD,aAAa,EAAE,kBAAkB,EAClG,SAAS,EACV,MAAM,2BAA2B,CAAA;AASlC,eAAO,MAAM,yCAAyC,yDAAyD,CAAA;AAC/G,MAAM,MAAM,yCAAyC,GAAG,OAAO,yCAAyC,CAAA;AAExG;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG,cAAc,CAAC;IAC/D;;OAEG;IACH,MAAM,EAAE,yCAAyC,CAAA;IACjD;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAC,CAAA;AAEF,UAAU,wCAAwC;IAChD,OAAO,EAAE,kBAAkB,CAAA;CAC5B;AAED,MAAM,MAAM,mCAAmC,CAC7C,OAAO,SAAS,eAAe,CAAC,mCAAmC,CAAC,GAAG,eAAe,CAAC,mCAAmC,CAAC,IACzH,cAAc,CAAC,OAAO,CAAC,GAAG,wCAAwC,CAAA;AAQtE,qBAAa,6BAA6B,CACxC,OAAO,SAAS,mCAAmC,GAAG,mCAAmC,EACzF,UAAU,SAAS,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAC1H,SAAQ,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7C,gBAAyB,aAAa,WAA8C;IACpF,gBAAyB,mBAAmB,0DAA4C;IACxF,OAAO,CAAC,qBAAqB,CAAiC;IAC9D,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,oBAAoB,CAAiC;IAC7D,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,OAAO,CAAuB;IAEtC,SAAS,KAAK,UAAU,IAAI,aAAa,CAExC;IAED,SAAS,KAAK,OAAO,IAAI,kBAAkB,CAE1C;IAED,SAAS,KAAK,mBAAmB,IAAI,MAAM,CAE1C;IAED,SAAS,KAAK,MAAM,IAAI,SAAS,CAEhC;IAEc,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB9B,aAAa,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA2BtE,OAAO,CAAC,6BAA6B;YAuBvB,aAAa;YAsBb,iBAAiB;YA+BjB,mCAAmC;CAalD"}
@@ -1,2 +1,3 @@
1
1
  export * from './retry.ts';
2
+ export * from './withRetry.ts';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/helper/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/helper/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function withRetry<T extends object>(instance: T, delayMs?: number, retries?: number): T;
2
+ //# sourceMappingURL=withRetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withRetry.d.ts","sourceRoot":"","sources":["../../../../src/modules/helper/withRetry.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EACxC,QAAQ,EAAE,CAAC,EACX,OAAO,SAAO,EACd,OAAO,SAAI,GACV,CAAC,CAeH"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/chain-reward-redemption",
3
- "version": "1.15.24",
3
+ "version": "1.15.26",
4
4
  "description": "XYO Layer One Rewards",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -50,11 +50,10 @@
50
50
  "@opentelemetry/instrumentation-express": "~0.56.0",
51
51
  "@opentelemetry/instrumentation-http": "~0.207.0",
52
52
  "@xylabs/assert": "~5.0.17",
53
- "@xylabs/creatable": "~5.0.17",
53
+ "@xylabs/delay": "~5.0.17",
54
54
  "@xylabs/express": "~5.0.17",
55
55
  "@xylabs/hex": "~5.0.17",
56
56
  "@xylabs/logger": "~5.0.17",
57
- "@xylabs/mongo": "~5.0.17",
58
57
  "@xylabs/object": "~5.0.17",
59
58
  "@xylabs/typeof": "~5.0.17",
60
59
  "@xylabs/vitest-extended": "~5.0.17",
@@ -64,8 +63,8 @@
64
63
  "@xyo-network/archivist-view": "~5.1.15",
65
64
  "@xyo-network/bios": "~7.1.1",
66
65
  "@xyo-network/boundwitness-model": "~5.1.15",
67
- "@xyo-network/chain-protocol": "~1.15.24",
68
- "@xyo-network/chain-telemetry": "~1.15.24",
66
+ "@xyo-network/chain-protocol": "~1.15.26",
67
+ "@xyo-network/chain-telemetry": "~1.15.26",
69
68
  "@xyo-network/manifest-model": "~5.1.15",
70
69
  "@xyo-network/manifest-wrapper": "~5.1.15",
71
70
  "@xyo-network/module-abstract": "~5.1.15",
@@ -77,19 +76,16 @@
77
76
  "@xyo-network/sentinel-abstract": "~5.1.15",
78
77
  "@xyo-network/sentinel-memory": "~5.1.15",
79
78
  "@xyo-network/sentinel-model": "~5.1.15",
80
- "@xyo-network/typechain": "~4.0.10",
81
79
  "@xyo-network/wallet": "~5.1.15",
82
80
  "@xyo-network/wallet-model": "~5.1.15",
83
- "@xyo-network/xl1-protocol": "~1.12.89",
84
- "@xyo-network/xl1-protocol-sdk": "~1.15.24",
85
- "@xyo-network/xl1-rpc": "~1.15.24",
81
+ "@xyo-network/xl1-protocol": "~1.12.95",
82
+ "@xyo-network/xl1-protocol-sdk": "~1.15.26",
83
+ "@xyo-network/xl1-rpc": "~1.15.26",
86
84
  "async-mutex": "~0.5.0",
87
85
  "compression": "~1.8.1",
88
86
  "cors": "~2.8.5",
89
87
  "express": "~5.1.0",
90
88
  "http-status-codes": "~2.3.0",
91
- "mongodb": "~6.20.0",
92
- "rxjs": "~7.8.2",
93
89
  "zod": "~4.1.12"
94
90
  },
95
91
  "devDependencies": {
@@ -101,6 +97,7 @@
101
97
  "@types/node": "~24.9.2",
102
98
  "@xylabs/base": "~5.0.17",
103
99
  "@xylabs/delay": "~5.0.17",
100
+ "@xylabs/mongo": "~5.0.17",
104
101
  "@xylabs/object": "~5.0.17",
105
102
  "@xylabs/promise": "~5.0.17",
106
103
  "@xylabs/ts-scripts-yarn3": "~7.1.8",
@@ -112,8 +109,8 @@
112
109
  "@xyo-network/archivist-mongodb": "~5.1.15",
113
110
  "@xyo-network/bios-model": "~7.1.1",
114
111
  "@xyo-network/boundwitness-builder": "~5.1.15",
115
- "@xyo-network/chain-protocol": "~1.15.24",
116
- "@xyo-network/chain-services": "~1.15.24",
112
+ "@xyo-network/chain-protocol": "~1.15.26",
113
+ "@xyo-network/chain-services": "~1.15.26",
117
114
  "@xyo-network/manifest-wrapper": "~5.1.15",
118
115
  "@xyo-network/module-abstract": "~5.1.15",
119
116
  "@xyo-network/module-abstract-mongodb": "~5.1.15",
@@ -121,9 +118,9 @@
121
118
  "@xyo-network/node-memory": "~5.1.15",
122
119
  "@xyo-network/payload-builder": "~5.1.15",
123
120
  "@xyo-network/sentinel-memory": "~5.1.15",
124
- "@xyo-network/xl1-protocol": "~1.12.89",
121
+ "@xyo-network/xl1-protocol": "~1.12.95",
125
122
  "dotenv": "~17.2.3",
126
- "eslint": "^9.38.0",
123
+ "eslint": "^9.39.0",
127
124
  "ethers": "~6.15.0",
128
125
  "http-status-codes": "~2.3.0",
129
126
  "nodemon": "~3.1.10",
@@ -1,4 +1,3 @@
1
- import type { MeterProvider, TracerProvider } from '@opentelemetry/api'
2
1
  import type { Logger } from '@xylabs/logger'
3
2
  import { type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'
4
3
  import { isDefined } from '@xylabs/typeof'
@@ -8,7 +7,6 @@ import { ViewArchivist } from '@xyo-network/archivist-view'
8
7
  import { initTelemetry } from '@xyo-network/chain-telemetry'
9
8
  import { AbstractModule, LoggerModuleStatusReporter } from '@xyo-network/module-abstract'
10
9
  import { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'
11
- import type { ModuleStatusReporter } from '@xyo-network/module-model'
12
10
  import type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'
13
11
  import { MemorySentinel } from '@xyo-network/sentinel-memory'
14
12
  import { HDWallet } from '@xyo-network/wallet'
@@ -30,6 +30,28 @@
30
30
  "schema": "network.xyo.sentinel.chain.step.rewards.claim.config"
31
31
  }
32
32
  },
33
+ {
34
+ "config": {
35
+ "accountPath": "1/1'/3'",
36
+ "automations": [
37
+ {
38
+ "frequency": 60000,
39
+ "frequencyUnits": "millis",
40
+ "schema": "network.xyo.automation.interval",
41
+ "type": "interval"
42
+ }
43
+ ],
44
+ "name": "ChainRewardsClaimIntervalSentinel",
45
+ "schema": "network.xyo.sentinel.config",
46
+ "synchronous": true,
47
+ "tasks": [
48
+ {
49
+ "mod": "ChainStepRewardsClaimSentinel",
50
+ "endPoint": "report"
51
+ }
52
+ ]
53
+ }
54
+ },
33
55
  {
34
56
  "config": {
35
57
  "accountPath": "1/1'/4'",
@@ -60,4 +82,4 @@
60
82
  }
61
83
  ],
62
84
  "schema": "network.xyo.manifest"
63
- }
85
+ }
@@ -1,5 +1,6 @@
1
1
  import type { Attributes, Counter } from '@opentelemetry/api'
2
2
  import { assertEx } from '@xylabs/assert'
3
+ import { delay } from '@xylabs/delay'
3
4
  import type { Address } from '@xylabs/hex'
4
5
  import { toAddress } from '@xylabs/hex'
5
6
  import { isDefined, isUndefined } from '@xylabs/typeof'
@@ -11,7 +12,8 @@ import type {
11
12
  SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,
12
13
  } from '@xyo-network/sentinel-model'
13
14
  import type {
14
- AttoXL1, SignedHydratedTransaction, StepIdentity, XL1BlockRange, XyoGatewayProvider,
15
+ AttoXL1, SignedHydratedTransaction, StepIdentity, XL1BlockRange, XyoConnection, XyoGatewayProvider,
16
+ XyoViewer,
15
17
  } from '@xyo-network/xl1-protocol'
16
18
  import { asXL1BlockNumber, XYO_STEP_REWARD_ADDRESS } from '@xyo-network/xl1-protocol'
17
19
  import {
@@ -19,7 +21,6 @@ import {
19
21
  } from '@xyo-network/xl1-protocol-sdk'
20
22
  import { Mutex } from 'async-mutex'
21
23
 
22
- import { retry } from '../helper/index.ts'
23
24
  import { isStepIdentityPayload } from './StepIdentityPayload.ts'
24
25
 
25
26
  export const ChainStepRewardsClaimSentinelConfigSchema = 'network.xyo.sentinel.chain.step.rewards.claim.config'
@@ -33,6 +34,10 @@ export type ChainStepRewardsClaimSentinelConfig = SentinelConfig<{
33
34
  * The schema for the chain step rewards claim sentinel config
34
35
  */
35
36
  schema: ChainStepRewardsClaimSentinelConfigSchema
37
+ /**
38
+ * The interval in milliseconds between checking for step rewards to claim
39
+ */
40
+ stepClaimIntervalMs: number
36
41
  }>
37
42
 
38
43
  interface ChainStepRewardsClaimSentinelParamFields {
@@ -43,8 +48,9 @@ export type ChainStepRewardsClaimSentinelParams<
43
48
  TConfig extends AnyConfigSchema<ChainStepRewardsClaimSentinelConfig> = AnyConfigSchema<ChainStepRewardsClaimSentinelConfig>,
44
49
  > = SentinelParams<TConfig> & ChainStepRewardsClaimSentinelParamFields
45
50
 
46
- const retryAttempts = 3
47
- const retryDelayMs = 60_000
51
+ const defaultStepClaimIntervalMs = 15_000
52
+ // const retryAttempts = 3
53
+ // const retryDelayMs = 60_000
48
54
  const scope = 'reward-escrow'
49
55
  const RewardableSteps = [3, 4, 5, 6, 7, 8]
50
56
 
@@ -58,10 +64,25 @@ export class ChainStepRewardsClaimSentinel<
58
64
  private _claimCheckCounter: Counter<Attributes> | undefined
59
65
  private _claimErrorCounter: Counter<Attributes> | undefined
60
66
  private _claimSuccessCounter: Counter<Attributes> | undefined
67
+ private _connection: XyoConnection | undefined
68
+ private _gateway: XyoGatewayProvider | undefined
61
69
  private _reportMutex = new Mutex()
70
+ private _viewer: XyoViewer | undefined
71
+
72
+ protected get connection(): XyoConnection {
73
+ return assertEx(this._connection, () => 'Connection is not defined')
74
+ }
62
75
 
63
76
  protected get gateway(): XyoGatewayProvider {
64
- return this.params.gateway
77
+ return assertEx(this._gateway, () => 'Gateway is not defined')
78
+ }
79
+
80
+ protected get stepClaimIntervalMs(): number {
81
+ return isDefined(this.config.stepClaimIntervalMs) ? this.config.stepClaimIntervalMs : defaultStepClaimIntervalMs
82
+ }
83
+
84
+ protected get viewer(): XyoViewer {
85
+ return assertEx(this._viewer, () => 'Viewer is not defined')
65
86
  }
66
87
 
67
88
  override async createHandler(): Promise<void> {
@@ -71,6 +92,16 @@ export class ChainStepRewardsClaimSentinel<
71
92
  this._claimCheckCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_check_total', { description: 'Number of claim checks' })
72
93
  this._claimSuccessCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_success_total', { description: 'Number of claim successes' })
73
94
  this._claimErrorCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_errors_total', { description: 'Number of claim errors' })
95
+
96
+ const gateway = assertEx(this.params.gateway, () => 'Gateway parameter is required')
97
+ const connection = assertEx(await gateway.connection(), () => 'Gateway connection is required')
98
+ const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')
99
+ // this._gateway = withRetry(gateway, retryDelayMs, retryAttempts)
100
+ // this._connection = withRetry(connection, retryDelayMs, retryAttempts)
101
+ // this._viewer = withRetry(viewer, retryDelayMs, retryAttempts)
102
+ this._gateway = gateway // withRetry(gateway, retryDelayMs, retryAttempts)
103
+ this._connection = connection // withRetry(connection, retryDelayMs, retryAttempts)
104
+ this._viewer = viewer // withRetry(viewer, retryDelayMs, retryAttempts)
74
105
  }
75
106
 
76
107
  override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {
@@ -126,20 +157,20 @@ export class ChainStepRewardsClaimSentinel<
126
157
  private async claimAllSteps(): Promise<Payload[]> {
127
158
  // No payloads to process, just do claims since last run
128
159
  const results: SignedHydratedTransaction[] = []
129
- const connection = await this.gateway.connection()
130
- const { viewer } = connection
131
- if (isDefined(viewer)) {
132
- for (const step of RewardableSteps) {
133
- // Fetch unclaimed rewards and process claims
134
- const from = 0
135
- const to = await viewer.currentBlockNumber()
136
- const range: XL1BlockRange = [asXL1BlockNumber(from), asXL1BlockNumber(to)]
137
- // For each rewardable step in range
138
- const stepIdentities = blockRangeSteps(range, [step])
139
- for (const stepIdentity of stepIdentities) {
140
- const result = await this.claimStepIdentity(stepIdentity)
141
- if (isDefined(result)) results.push(result)
160
+
161
+ for (const step of RewardableSteps) {
162
+ // Fetch unclaimed rewards and process claims
163
+ const from = 0
164
+ const to = await this.viewer.currentBlockNumber()
165
+ const range: XL1BlockRange = [asXL1BlockNumber(from), asXL1BlockNumber(to)]
166
+ // For each rewardable step in range
167
+ const stepIdentities = blockRangeSteps(range, [step])
168
+ for (const stepIdentity of stepIdentities) {
169
+ const result = await this.claimStepIdentity(stepIdentity)
170
+ if (isDefined(result)) {
171
+ results.push(result)
142
172
  }
173
+ await delay(this.stepClaimIntervalMs)
143
174
  }
144
175
  }
145
176
  return flattenHydratedTransactions(results)
@@ -150,17 +181,19 @@ export class ChainStepRewardsClaimSentinel<
150
181
  const claimCounterAttributes = { step: stepIdentity.step.toString(), block: stepIdentity.block.toString() }
151
182
  try {
152
183
  this._claimCheckCounter?.add(1, claimCounterAttributes)
153
- const connection = await this.gateway.connection()
154
- const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')
155
184
  // If wallet has balance
156
185
  const stepRewardAddress = completedStepRewardAddress(stepIdentity)
157
- const balance = await viewer.accountBalance(stepRewardAddress)
186
+ const balance = await this.viewer.accountBalance(stepRewardAddress)
158
187
  if (balance > 0n) {
159
188
  this.logger?.info(`Found balance of ${balance} to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`)
160
189
  this._claimAttemptsCounter?.add(1, claimCounterAttributes)
161
190
  // For stakers
162
- const rewardsByStaker = await retry(() => viewer.networkStakeStepRewardPoolRewards(stepIdentity), retryDelayMs, retryAttempts)
191
+ const rewardsByStaker = await this.viewer.networkStakeStepRewardPoolRewards(stepIdentity)
163
192
  const addressDistributions = this.calculateAddressDistributions(rewardsByStaker, balance)
193
+ this.logger?.info(
194
+ `Calculated address distributions for step ${stepIdentity.step} at block ${stepIdentity.block}`
195
+ + ` with ${Object.keys(addressDistributions).length} addresses`,
196
+ )
164
197
  // Create single transaction for all claims
165
198
  const tx = await this.submitRewardDistributionTransaction(stepRewardAddress, addressDistributions, stepIdentity, this.gateway)
166
199
  this.logger?.info(`Claimed rewards for step ${stepIdentity.step} at block ${stepIdentity.block}`)
@@ -180,16 +213,11 @@ export class ChainStepRewardsClaimSentinel<
180
213
  step: StepIdentity,
181
214
  gateway: XyoGatewayProvider,
182
215
  ): Promise<SignedHydratedTransaction | undefined> {
183
- // Create single transfer payload for all claims
216
+ // Create single transfer payload for all claims
184
217
  const transferPayload = createTransferPayload(stepRewardAddress, addressDistributions)
185
218
  transferPayload.context = { step }
186
- const connection = await gateway.connection()
187
- const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')
188
- const chainId = await viewer.chainId()
189
- const currentBlock = await viewer.currentBlockNumber()
190
- const result = await gateway.addPayloadsToChain?.([transferPayload], [], {
191
- chain: chainId, nbf: currentBlock, exp: currentBlock + 1000,
192
- })
219
+ const currentBlockNumber = await this.viewer.currentBlockNumber()
220
+ const result = await gateway.addPayloadsToChain?.([transferPayload], [], { nbf: currentBlockNumber, exp: currentBlockNumber + 10 })
193
221
  if (isDefined(result)) return result[1]
194
222
  }
195
223
  }
@@ -113,7 +113,7 @@ export class DerivedAddressWalletTransferSentinel<
113
113
  this._transferErrorCounter?.add(1)
114
114
  throw new Error('Invalid EIP712 signature')
115
115
  }
116
- const values = data.values as ConfirmedClaimValues
116
+ const values = ConfirmedClaimValuesZod.parse(data.values)
117
117
  const parsed = parseConfirmedClaimValues(values)
118
118
  const signatureAddress = toAddress(signature.address)
119
119
  const parsedAddress = toAddress(parsed.from)
@@ -139,7 +139,7 @@ export class DerivedAddressWalletTransferSentinel<
139
139
  const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')
140
140
 
141
141
  // TODO: Validate chainId against supplied in ClaimValues to prevent replay attacks
142
- const chainId = await viewer.chainId()
142
+ // const chainId = await viewer.chainId()
143
143
 
144
144
  // Ensure the transaction is within the valid block range
145
145
  const currentBlock = await viewer.currentBlockNumber()
@@ -1 +1,2 @@
1
1
  export * from './retry.ts'
2
+ export * from './withRetry.ts'
@@ -0,0 +1,22 @@
1
+ import { retry } from './retry.ts'
2
+
3
+ export function withRetry<T extends object>(
4
+ instance: T,
5
+ delayMs = 1000,
6
+ retries = 3,
7
+ ): T {
8
+ return new Proxy(instance, {
9
+ get(target, prop, receiver) {
10
+ const original = Reflect.get(target, prop, receiver)
11
+
12
+ // Only wrap functions (methods)
13
+ if (typeof original === 'function') {
14
+ return async (...args: unknown[]) =>
15
+ await retry(() => original.apply(target, args), delayMs, retries)
16
+ }
17
+
18
+ // Non-function properties are returned as-is
19
+ return original
20
+ },
21
+ })
22
+ }
@@ -14,7 +14,7 @@ export const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBound
14
14
  = payloads
15
15
  ?.flat(DEFAULT_DEPTH)
16
16
  .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)
17
- .map(bw => bw.addresses) || []
17
+ .map(bw => bw.addresses) ?? []
18
18
  // TODO: Do we want to end up with a list of addresses or a list of address lists?
19
19
  const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)
20
20
  const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}