@xyo-network/chain-reward-redemption 1.15.17 → 1.15.19

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.
@@ -252,13 +252,32 @@ var ChainRewardsClaimSentinel = class extends AbstractSentinel {
252
252
  ChainRewardsClaimSentinelConfigSchema
253
253
  ];
254
254
  static defaultConfigSchema = ChainRewardsClaimSentinelConfigSchema;
255
+ _claimAttemptsCounter;
256
+ _claimCheckCounter;
257
+ _claimErrorCounter;
258
+ _claimSuccessCounter;
255
259
  _reportMutex = new Mutex();
256
260
  get gateway() {
257
261
  return this.params.gateway;
258
262
  }
263
+ async createHandler() {
264
+ await super.createHandler();
265
+ this._claimAttemptsCounter = this.meter?.createCounter("chain_rewards_claim_sentinel_attempts_total", {
266
+ description: "Number of claim attempts"
267
+ });
268
+ this._claimCheckCounter = this.meter?.createCounter("chain_rewards_claim_sentinel_check_total", {
269
+ description: "Number of claim checks"
270
+ });
271
+ this._claimSuccessCounter = this.meter?.createCounter("chain_rewards_claim_sentinel_success_total", {
272
+ description: "Number of claim successes"
273
+ });
274
+ this._claimErrorCounter = this.meter?.createCounter("chain_rewards_claim_sentinel_errors_total", {
275
+ description: "Number of claim errors"
276
+ });
277
+ }
259
278
  async reportHandler(payloads) {
260
279
  if (this._reportMutex.isLocked()) {
261
- this.logger?.debug(`ChainRewardsClaimSentinel [${this.id}] is already running, skipping divine [${Date.now()}]`);
280
+ this.logger?.debug(`ChainRewardsClaimSentinel [${this.id}] is already running, skipping report [${Date.now()}]`);
262
281
  return [];
263
282
  }
264
283
  return await this._reportMutex.runExclusive(async () => {
@@ -303,9 +322,8 @@ var ChainRewardsClaimSentinel = class extends AbstractSentinel {
303
322
  async claimAllSteps() {
304
323
  const results = [];
305
324
  const connection = await this.gateway.connection();
306
- const signer = await this.gateway.signer();
307
- const { viewer: viewer2, runner } = connection;
308
- if (isDefined4(viewer2) && isDefined4(runner) && isDefined4(signer)) {
325
+ const { viewer: viewer2 } = connection;
326
+ if (isDefined4(viewer2)) {
309
327
  for (const step of RewardableSteps2) {
310
328
  const from = 0;
311
329
  const to = await viewer2.currentBlockNumber();
@@ -325,22 +343,34 @@ var ChainRewardsClaimSentinel = class extends AbstractSentinel {
325
343
  return flattenHydratedTransactions(results);
326
344
  }
327
345
  async claimStepIdentity(stepIdentity) {
328
- const connection = await this.gateway.connection();
329
- const signer = await this.gateway.signer();
330
- const { viewer: viewer2, runner } = connection;
331
- if (isDefined4(viewer2) && isDefined4(runner) && isDefined4(signer)) {
332
- const stepRewardsAddress = completedStepRewardAddress(stepIdentity);
333
- const balance = await viewer2.accountBalance(stepRewardsAddress);
346
+ this.logger?.info(`Checking rewards to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`);
347
+ const claimCounterAttributes = {
348
+ step: stepIdentity.step.toString(),
349
+ block: stepIdentity.block.toString()
350
+ };
351
+ try {
352
+ this._claimCheckCounter?.add(1, claimCounterAttributes);
353
+ const connection = await this.gateway.connection();
354
+ const viewer2 = assertEx(connection.viewer, () => "Viewer is not defined in gateway connection");
355
+ const stepRewardAddress = completedStepRewardAddress(stepIdentity);
356
+ const balance = await viewer2.accountBalance(stepRewardAddress);
334
357
  if (balance > 0n) {
358
+ this.logger?.info(`Found rewards to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`);
359
+ this._claimAttemptsCounter?.add(1, claimCounterAttributes);
335
360
  const rewardsByStaker = await viewer2.networkStakeStepRewardPoolRewards(stepIdentity);
336
361
  const addressDistributions = this.calculateAddressDistributions(rewardsByStaker, balance);
337
- const tx = await this.submitRewardDistributionTransaction(stepRewardsAddress, addressDistributions, stepIdentity, this.gateway);
362
+ const tx = await this.submitRewardDistributionTransaction(stepRewardAddress, addressDistributions, stepIdentity, this.gateway);
363
+ this.logger?.info(`Claimed rewards for step ${stepIdentity.step} at block ${stepIdentity.block}`);
364
+ this._claimSuccessCounter?.add(1, claimCounterAttributes);
338
365
  return tx;
339
366
  }
367
+ } catch (error) {
368
+ this._claimErrorCounter?.add(1, claimCounterAttributes);
369
+ this.logger?.error(`Error claiming rewards for step ${stepIdentity.step} at block ${stepIdentity.block}:`, error);
340
370
  }
341
371
  }
342
- async submitRewardDistributionTransaction(stepRewardsAddress, addressDistributions, step, gateway) {
343
- const transferPayload = createTransferPayload(stepRewardsAddress, addressDistributions);
372
+ async submitRewardDistributionTransaction(stepRewardAddress, addressDistributions, step, gateway) {
373
+ const transferPayload = createTransferPayload(stepRewardAddress, addressDistributions);
344
374
  transferPayload.context = {
345
375
  step
346
376
  };
@@ -665,6 +695,28 @@ var node_default = {
665
695
  name: "ChainRewardsClaimSentinel",
666
696
  schema: "network.xyo.sentinel.chain.rewards.claim.config"
667
697
  }
698
+ },
699
+ {
700
+ config: {
701
+ accountPath: "1/1'/3'",
702
+ automations: [
703
+ {
704
+ frequency: 6e4,
705
+ frequencyUnits: "millis",
706
+ schema: "network.xyo.automation.interval",
707
+ type: "interval"
708
+ }
709
+ ],
710
+ name: "ChainRewardsClaimIntervalSentinel",
711
+ schema: "network.xyo.sentinel.config",
712
+ synchronous: true,
713
+ tasks: [
714
+ {
715
+ mod: "ChainRewardsClaimSentinel",
716
+ endPoint: "report"
717
+ }
718
+ ]
719
+ }
668
720
  }
669
721
  ],
670
722
  public: [
@@ -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/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/claimRange.ts","../../src/modules/ChainRewardsClaimSentinel.ts","../../src/modules/StepIdentityPayload.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","/* 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 { 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().min(0).optional(),\n toBlock: z.coerce.number().int().min(0).optional(),\n step: z.coerce.number().min(Math.min(...RewardableSteps)).max(Math.max(...RewardableSteps)).int().optional().default(3),\n})\nconst response = z.array(PayloadZodLoose)\n\nconst validateRequest = requestHandlerValidator({ query, response })\n\nconst getChainRewardsClaimSentinel = async (node: NodeInstance): Promise<SentinelInstance> => {\n const mod = await node.resolve('XYORewardRedemptionNode:ChainRewardsClaimSentinel')\n const sentinel = asSentinelInstance(mod)\n return assertEx(sentinel, () => 'ChainRewardsClaimSentinel 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 mod = await getChainRewardsClaimSentinel(node)\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 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 { 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 { isStepIdentityPayload } from './StepIdentityPayload.ts'\n\nexport const ChainRewardsClaimSentinelConfigSchema = 'network.xyo.sentinel.chain.rewards.claim.config'\nexport type ChainRewardsClaimSentinelConfigSchema = typeof ChainRewardsClaimSentinelConfigSchema\n\n/**\n * The configuration for the chain rewards claim sentinel\n */\nexport type ChainRewardsClaimSentinelConfig = SentinelConfig<{\n /**\n * The schema for the chain rewards claim sentinel config\n */\n schema: ChainRewardsClaimSentinelConfigSchema\n}>\n\ninterface ChainRewardsClaimSentinelParamFields {\n gateway: XyoGatewayProvider\n}\n\nexport type ChainRewardsClaimSentinelParams<\n TConfig extends AnyConfigSchema<ChainRewardsClaimSentinelConfig> = AnyConfigSchema<ChainRewardsClaimSentinelConfig>,\n> = SentinelParams<TConfig> & ChainRewardsClaimSentinelParamFields\n\nconst scope = 'reward-escrow'\nconst RewardableSteps = [3, 4, 5, 6, 7, 8]\n\nexport class ChainRewardsClaimSentinel<\n TParams extends ChainRewardsClaimSentinelParams = ChainRewardsClaimSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [ChainRewardsClaimSentinelConfigSchema]\n static override readonly defaultConfigSchema = ChainRewardsClaimSentinelConfigSchema\n private _reportMutex = new Mutex()\n\n protected get gateway(): XyoGatewayProvider {\n return this.params.gateway\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 divine [${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 signer = await this.gateway.signer()\n const { viewer, runner } = connection\n if (isDefined(viewer) && isDefined(runner) && isDefined(signer)) {\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 // No payloads to process, just do claims since last run\n const connection = await this.gateway.connection()\n const signer = await this.gateway.signer()\n const { viewer, runner } = connection\n if (isDefined(viewer) && isDefined(runner) && isDefined(signer)) {\n // If wallet has balance\n const stepRewardsAddress = completedStepRewardAddress(stepIdentity)\n const balance = await viewer.accountBalance(stepRewardsAddress)\n if (balance > 0n) {\n // For stakers\n const rewardsByStaker = await viewer.networkStakeStepRewardPoolRewards(stepIdentity)\n const addressDistributions = this.calculateAddressDistributions(rewardsByStaker, balance)\n // Create single transaction for all claims\n const tx = await this.submitRewardDistributionTransaction(stepRewardsAddress, addressDistributions, stepIdentity, this.gateway)\n // Return submitted transaction\n return tx\n }\n }\n }\n\n private async submitRewardDistributionTransaction(\n stepRewardsAddress: 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(stepRewardsAddress, 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 { 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 { assertEx } from '@xylabs/assert'\nimport type {\n Address,\n EthAddress, Hex,\n} from '@xylabs/hex'\nimport {\n hexToBigInt, toAddress, toHex,\n} from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport { createTransferPayload } from '@xyo-network/chain-protocol'\nimport { PayloadZodLoose } from '@xyo-network/payload-model'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { SignedHydratedTransaction, XyoGatewayProvider } from '@xyo-network/xl1-protocol'\nimport type {\n Config, EIP712Payload, EIP712SignaturePayload,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { verifyEIP712Message } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcXyoConnection, MemoryXyoGateway, MemoryXyoSigner, SignedHydratedTransactionZod,\n} from '@xyo-network/xl1-rpc'\nimport { z } from 'zod'\n\nimport { requestHandlerValidator } from '../../middleware/index.ts'\nimport type { RouteDefinition } from '../routeDefinition.ts'\n\nconst scope = 'reward-escrow'\n\n// const body = z.tuple([PayloadZodLoose, PayloadZodLoose])\nconst body = z.any()\nconst response = SignedHydratedTransactionZod\nconst validateRequest = requestHandlerValidator({\n body,\n response,\n})\n\nconst getGateway = async (\n config: Config,\n) => {\n const { mnemonic, chainRpcApiUrl: endpoint } = config.rewardRedemptionApi\n const account = await HDWallet.fromPhrase(assertEx(mnemonic, () => ''))\n const signer = new MemoryXyoSigner(account)\n const connection = new HttpRpcXyoConnection({ endpoint, account })\n const gateway = new MemoryXyoGateway(signer, connection)\n return gateway\n}\nconst submitRewardDistributionTransaction = async (\n to: Address,\n amount: string,\n nbf: number,\n exp: number,\n gateway: XyoGatewayProvider,\n): Promise<SignedHydratedTransaction | undefined> => {\n const signer = assertEx(await gateway.signer(), () => 'Signer is not defined in gateway')\n const from = await signer.address()\n // Create single transfer payload for all claims\n const transferPayload = createTransferPayload(from, { [to]: hexToBigInt(toHex(amount)) })\n // TODO: Context\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 chain = await viewer.chainId()\n const result = await gateway.addPayloadsToChain?.([transferPayload], [], {\n chain, nbf, exp,\n })\n if (isDefined(result)) return result[1]\n}\n\nexport type ConfirmedClaimValues = {\n 'To XL1 Address': string\n 'XL1 Amount': string\n 'XL1 Amount (Hex)': Hex\n 'XL1 Not after block': number\n 'XL1 Not before block': number\n 'from': EthAddress\n}\n\nexport const parseConfirmedClaimValues = (values: ConfirmedClaimValues) => {\n return {\n from: toAddress(values.from),\n to: values['To XL1 Address'],\n amount: values['XL1 Amount (Hex)'],\n nbf: values['XL1 Not before block'],\n exp: values['XL1 Not after block'],\n }\n}\n\nexport const postRedeem: RouteDefinition = {\n method: 'post',\n path: '/rewards/redeem',\n handlers: validateRequest(async (req, res) => {\n const { config } = req.app\n const { body } = req\n const [payload, signature] = body as [EIP712Payload, EIP712SignaturePayload]\n const valid = await verifyEIP712Message(payload, signature)\n if (valid) {\n const values = payload.values as ConfirmedClaimValues\n const {\n from, to, amount, nbf, exp,\n } = parseConfirmedClaimValues(values)\n assertEx(toAddress(signature.address) === toAddress(from), () => 'Signature does not match from address')\n const gateway = await getGateway(config)\n const receiver = toAddress(to)\n const tx = await submitRewardDistributionTransaction(receiver, amount, nbf, exp, gateway)\n if (isDefined(tx)) {\n res.status(200)\n res.json(tx)\n } else {\n res.status(500)\n res.json()\n }\n } else {\n res.status(404)\n res.json()\n }\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 // postClaim,\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 { 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 { ChainRewardsClaimSentinelParams } from '../modules/index.ts'\nimport { ChainRewardsClaimSentinel } 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 await registerChainRewardsClaimSentinel(locator, config, traceProvider, meterProvider, statusReporter)\n return locator\n}\n\nconst registerChainRewardsClaimSentinel = async (\n locator: ModuleFactoryLocator,\n config: Config,\n traceProvider?: TracerProvider,\n meterProvider?: MeterProvider,\n statusReporter?: ModuleStatusReporter,\n) => {\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 const chainRewardsClaimSentinelParams: Partial<ChainRewardsClaimSentinelParams> = {\n gateway, traceProvider, meterProvider, statusReporter,\n }\n locator.register(ChainRewardsClaimSentinel.factory(chainRewardsClaimSentinelParams))\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\": \"ChainRewardsClaimSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.rewards.claim.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","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","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","AsObjectFactory","isPayloadOfZodType","StepIdentityZod","StepIdentitySchema","isStepIdentityPayload","asStepIdentityPayload","create","ChainRewardsClaimSentinelConfigSchema","scope","RewardableSteps","ChainRewardsClaimSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_reportMutex","Mutex","gateway","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","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","signer","viewer","runner","from","to","currentBlockNumber","range","blockRangeSteps","flattenHydratedTransactions","stepRewardsAddress","completedStepRewardAddress","accountBalance","networkStakeStepRewardPoolRewards","addressDistributions","tx","submitRewardDistributionTransaction","transferPayload","createTransferPayload","context","chainId","currentBlock","addPayloadsToChain","chain","nbf","exp","query","z","object","fromBlock","coerce","number","int","min","optional","toBlock","step","Math","RewardableSteps","max","default","response","array","PayloadZodLoose","validateRequest","requestHandlerValidator","getChainRewardsClaimSentinel","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","hexToBigInt","toAddress","toHex","isDefined","createTransferPayload","HDWallet","verifyEIP712Message","HttpRpcXyoConnection","MemoryXyoGateway","MemoryXyoSigner","SignedHydratedTransactionZod","z","body","z","any","response","SignedHydratedTransactionZod","validateRequest","requestHandlerValidator","getGateway","config","mnemonic","chainRpcApiUrl","endpoint","rewardRedemptionApi","account","HDWallet","fromPhrase","assertEx","signer","MemoryXyoSigner","connection","HttpRpcXyoConnection","gateway","MemoryXyoGateway","submitRewardDistributionTransaction","to","amount","nbf","exp","from","address","transferPayload","createTransferPayload","hexToBigInt","toHex","viewer","chain","chainId","result","addPayloadsToChain","isDefined","parseConfirmedClaimValues","values","toAddress","postRedeem","method","path","handlers","req","res","app","payload","signature","valid","verifyEIP712Message","receiver","tx","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","registerChainRewardsClaimSentinel","mnemonic","chainRpcApiUrl","rewardRedemptionApi","walletPromise","HDWallet","fromPhrase","random","account","signer","MemoryXyoSigner","connection","HttpRpcXyoConnection","gateway","MemoryXyoGateway","chainRewardsClaimSentinelParams","ChainRewardsClaimSentinel","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/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/claimRange.ts","../../src/modules/ChainRewardsClaimSentinel.ts","../../src/modules/StepIdentityPayload.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","/* 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 { 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().min(0).optional(),\n toBlock: z.coerce.number().int().min(0).optional(),\n step: z.coerce.number().min(Math.min(...RewardableSteps)).max(Math.max(...RewardableSteps)).int().optional().default(3),\n})\nconst response = z.array(PayloadZodLoose)\n\nconst validateRequest = requestHandlerValidator({ query, response })\n\nconst getChainRewardsClaimSentinel = async (node: NodeInstance): Promise<SentinelInstance> => {\n const mod = await node.resolve('XYORewardRedemptionNode:ChainRewardsClaimSentinel')\n const sentinel = asSentinelInstance(mod)\n return assertEx(sentinel, () => 'ChainRewardsClaimSentinel 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 mod = await getChainRewardsClaimSentinel(node)\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 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 { isStepIdentityPayload } from './StepIdentityPayload.ts'\n\nexport const ChainRewardsClaimSentinelConfigSchema = 'network.xyo.sentinel.chain.rewards.claim.config'\nexport type ChainRewardsClaimSentinelConfigSchema = typeof ChainRewardsClaimSentinelConfigSchema\n\n/**\n * The configuration for the chain rewards claim sentinel\n */\nexport type ChainRewardsClaimSentinelConfig = SentinelConfig<{\n /**\n * The schema for the chain rewards claim sentinel config\n */\n schema: ChainRewardsClaimSentinelConfigSchema\n}>\n\ninterface ChainRewardsClaimSentinelParamFields {\n gateway: XyoGatewayProvider\n}\n\nexport type ChainRewardsClaimSentinelParams<\n TConfig extends AnyConfigSchema<ChainRewardsClaimSentinelConfig> = AnyConfigSchema<ChainRewardsClaimSentinelConfig>,\n> = SentinelParams<TConfig> & ChainRewardsClaimSentinelParamFields\n\nconst scope = 'reward-escrow'\nconst RewardableSteps = [3, 4, 5, 6, 7, 8]\n\nexport class ChainRewardsClaimSentinel<\n TParams extends ChainRewardsClaimSentinelParams = ChainRewardsClaimSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [ChainRewardsClaimSentinelConfigSchema]\n static override readonly defaultConfigSchema = ChainRewardsClaimSentinelConfigSchema\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_rewards_claim_sentinel_attempts_total', { description: 'Number of claim attempts' })\n this._claimCheckCounter = this.meter?.createCounter('chain_rewards_claim_sentinel_check_total', { description: 'Number of claim checks' })\n this._claimSuccessCounter = this.meter?.createCounter('chain_rewards_claim_sentinel_success_total', { description: 'Number of claim successes' })\n this._claimErrorCounter = this.meter?.createCounter('chain_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 rewards to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`)\n this._claimAttemptsCounter?.add(1, claimCounterAttributes)\n // For stakers\n const rewardsByStaker = await viewer.networkStakeStepRewardPoolRewards(stepIdentity)\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 { 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 { assertEx } from '@xylabs/assert'\nimport type {\n Address,\n EthAddress, Hex,\n} from '@xylabs/hex'\nimport {\n hexToBigInt, toAddress, toHex,\n} from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport { createTransferPayload } from '@xyo-network/chain-protocol'\nimport { PayloadZodLoose } from '@xyo-network/payload-model'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { SignedHydratedTransaction, XyoGatewayProvider } from '@xyo-network/xl1-protocol'\nimport type {\n Config, EIP712Payload, EIP712SignaturePayload,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { verifyEIP712Message } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcXyoConnection, MemoryXyoGateway, MemoryXyoSigner, SignedHydratedTransactionZod,\n} from '@xyo-network/xl1-rpc'\nimport { z } from 'zod'\n\nimport { requestHandlerValidator } from '../../middleware/index.ts'\nimport type { RouteDefinition } from '../routeDefinition.ts'\n\nconst scope = 'reward-escrow'\n\n// const body = z.tuple([PayloadZodLoose, PayloadZodLoose])\nconst body = z.any()\nconst response = SignedHydratedTransactionZod\nconst validateRequest = requestHandlerValidator({\n body,\n response,\n})\n\nconst getGateway = async (\n config: Config,\n) => {\n const { mnemonic, chainRpcApiUrl: endpoint } = config.rewardRedemptionApi\n const account = await HDWallet.fromPhrase(assertEx(mnemonic, () => ''))\n const signer = new MemoryXyoSigner(account)\n const connection = new HttpRpcXyoConnection({ endpoint, account })\n const gateway = new MemoryXyoGateway(signer, connection)\n return gateway\n}\nconst submitRewardDistributionTransaction = async (\n to: Address,\n amount: string,\n nbf: number,\n exp: number,\n gateway: XyoGatewayProvider,\n): Promise<SignedHydratedTransaction | undefined> => {\n const signer = assertEx(await gateway.signer(), () => 'Signer is not defined in gateway')\n const from = await signer.address()\n // Create single transfer payload for all claims\n const transferPayload = createTransferPayload(from, { [to]: hexToBigInt(toHex(amount)) })\n // TODO: Context\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 chain = await viewer.chainId()\n const result = await gateway.addPayloadsToChain?.([transferPayload], [], {\n chain, nbf, exp,\n })\n if (isDefined(result)) return result[1]\n}\n\nexport type ConfirmedClaimValues = {\n 'To XL1 Address': string\n 'XL1 Amount': string\n 'XL1 Amount (Hex)': Hex\n 'XL1 Not after block': number\n 'XL1 Not before block': number\n 'from': EthAddress\n}\n\nexport const parseConfirmedClaimValues = (values: ConfirmedClaimValues) => {\n return {\n from: toAddress(values.from),\n to: values['To XL1 Address'],\n amount: values['XL1 Amount (Hex)'],\n nbf: values['XL1 Not before block'],\n exp: values['XL1 Not after block'],\n }\n}\n\nexport const postRedeem: RouteDefinition = {\n method: 'post',\n path: '/rewards/redeem',\n handlers: validateRequest(async (req, res) => {\n const { config } = req.app\n const { body } = req\n const [payload, signature] = body as [EIP712Payload, EIP712SignaturePayload]\n const valid = await verifyEIP712Message(payload, signature)\n if (valid) {\n const values = payload.values as ConfirmedClaimValues\n const {\n from, to, amount, nbf, exp,\n } = parseConfirmedClaimValues(values)\n assertEx(toAddress(signature.address) === toAddress(from), () => 'Signature does not match from address')\n const gateway = await getGateway(config)\n const receiver = toAddress(to)\n const tx = await submitRewardDistributionTransaction(receiver, amount, nbf, exp, gateway)\n if (isDefined(tx)) {\n res.status(200)\n res.json(tx)\n } else {\n res.status(500)\n res.json()\n }\n } else {\n res.status(404)\n res.json()\n }\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 // postClaim,\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 { 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 { ChainRewardsClaimSentinelParams } from '../modules/index.ts'\nimport { ChainRewardsClaimSentinel } 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 await registerChainRewardsClaimSentinel(locator, config, traceProvider, meterProvider, statusReporter)\n return locator\n}\n\nconst registerChainRewardsClaimSentinel = async (\n locator: ModuleFactoryLocator,\n config: Config,\n traceProvider?: TracerProvider,\n meterProvider?: MeterProvider,\n statusReporter?: ModuleStatusReporter,\n) => {\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 const chainRewardsClaimSentinelParams: Partial<ChainRewardsClaimSentinelParams> = {\n gateway, traceProvider, meterProvider, statusReporter,\n }\n locator.register(ChainRewardsClaimSentinel.factory(chainRewardsClaimSentinelParams))\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\": \"ChainRewardsClaimSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.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\": \"ChainRewardsClaimSentinel\",\n \"endPoint\": \"report\"\n }\n ]\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":";;;;AAAA,SACEA,uBAAuBC,6BAA6BC,sCAAsCC,mBAAmBC,0BAA0BC,kBACvIC,gBAAgBC,yBACX;AAGP,OAAOC,iBAAiB;AACxB,OAAOC,UAAU;AAEjB,OAAOC,cAAa;;;ACTpB,SAASC,gCAAgC;AACzC,SAASC,8BAA8B;AACvC,SAASC,2BAA2B;AAS7B,IAAMC,qBAAqB,6BAAA;AAChC,QAAMC,mBAAmB;IAAC,IAAIC,oBAAAA;IAAuB,IAAIC,uBAAAA;;AACzDC,2BAAyB;IAAEH;EAAiB,CAAA;AAC9C,GAHkC;;;ACXlC,SAASI,4BAA4B;AACrC,SAASC,cAAc;AACvB,SAASC,iBAAiB;AAK1B,SAASC,2BAA2B;AAGpC,SAASC,sBAAsB;AAE/B,SAASC,cAAcC,kBAAkB;AAEzC,OAAOC,aAAa;AAGpB,IAAMC,mBAAmB,8BAAOC,MAAoBC,8BAAAA;AAClD,QAAMC,MAAM,MAAMF,KAAKG,QAAQF,yBAAAA;AAC/B,SAAOG,oBAAoBF,KAAK;IAAEG,UAAU;EAAK,CAAA;AACnD,GAHyB;AAKzB,IAAIC;AAEJ,IAAMC,eAAe,8BAAOP,MAAoBC,8BAAAA;AAC9C,MAAIO,UAAUF,iBAAAA,EAAoB,QAAOA;AACzCA,sBAAoB,MAAMP,iBAAiBC,MAAMC,yBAAAA;AACjD,SAAOK;AACT,GAJqB;AAWd,IAAMG,sBAAsB,wBAACC,YAAAA;AAClC,QAAM,EAAEV,MAAMC,0BAAyB,IAAKS;AAC5C,QAAMC,SAASC,QAAQC,OAAO;IAAEC,aAAa;EAAK,CAAA;AAElDH,SAAOI,KAAK,WAAW,OAAOC,KAAKC,QAAAA;AACjCC,yBAAqBD,GAAAA;AACrB,UAAME,QAAOC,MAAMC,QAAQL,IAAIG,IAAI,IAAIH,IAAIG,OAAO;MAACH,IAAIG;;AACvD,UAAMG,YAAY,MAAMC,eAAeC,UAAmBL,KAAAA,GAAOM,IAAIC,CAAAA,MAAKA,EAAE,CAAA,CAAE;AAC9E,UAAMC,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,MAAMD,UAAUE,OAAOP,QAAAA;AACtCL,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AAEAjB,SAAOqB,IAAI,SAAS,OAAOhB,KAAoCC,QAAAA;AAC7DC,yBAAqBD,GAAAA;AACrB,UAAMgB,SAASC,WAAWlB,IAAImB,MAAMF,MAAM,IAAIjB,IAAImB,MAAMF,SAASG;AACjE,UAAMC,QAAQ7B,UAAUQ,IAAImB,MAAME,KAAK,IAAIC,OAAOtB,IAAImB,MAAME,KAAK,IAAID;AACrE,UAAMG,OAAO/B,UAAUQ,IAAImB,MAAMI,IAAI,IAAIC,QAAQxB,IAAImB,MAAMI,IAAI,IAAIH;AACnE,UAAMK,QAAQzB,IAAImB,MAAMM,UAAU,QAAQ,QAAQ;AAClD,UAAM/B,WAAgC;MACpC2B;MAAOE;MAAME;MAAOR;IACtB;AACA,UAAMN,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,MAAMD,UAAUe,KAAKhC,QAAAA;AACpCO,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AACAjB,SAAOI,KAAK,SAAS,OAAOC,KAAwDC,QAAAA;AAClFC,yBAAqBD,GAAAA;AACrB,UAAMP,WAAUM,IAAIG;AACpB,UAAMQ,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,OAAOpB,UAAUE,QAAAA,IAAWiB,UAAUe,KAAKhC,QAAAA,IAAWiB,UAAUe,KAAI;AACnFzB,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AAEAjB,SAAOqB,IAAI,cAAc,OAAOhB,KAAKC,QAAAA;AACnCC,yBAAqBD,GAAAA;AACrB,UAAM,EAAE0B,MAAMC,QAAO,IAAK5B,IAAI6B;AAC9B,UAAMF,OAAOG,OAAOF,OAAAA;AACpB,QAAIpC,UAAUmC,IAAAA,GAAO;AACnB,YAAMhB,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,YAAM,CAAC8C,OAAAA,IAAW,MAAMpB,UAAUK,IAAI;QAACW;OAAK;AAC5C,UAAIK,aAAaD,OAAAA,GAAU;AACzB9B,YAAIc,KAAKgB,OAAAA;AACT;MACF,OAAO;AACL9B,YAAIa,OAAO,GAAA,EAAKmB,KAAI;AACpB;MACF;IACF;AACAhC,QAAIa,OAAO,GAAA,EAAKmB,KAAI;EACtB,CAAA;AAEA,SAAOtC;AACT,GArDmC;;;AC/B5B,IAAMuC,oBAAoB,wBAACC,QAAAA;AAChC,QAAM,EAAEC,KAAI,IAAKD;AACjB,QAAME,4BAA4B;AAClCF,MAAIG,IAAI,SAASC,oBAAoB;IAAEH;IAAMC;EAA0B,CAAA,CAAA;AACzE,GAJiC;;;ACFjC,SAASG,aAAAA,YAAWC,iBAAiB;AAIrC,SAASC,eAAeC,mBAAmB;AAE3C,SAASC,SAAS;AAKX,IAAMC,iBAAiBC,EAAEC,OAAO,CAAC,CAAA,EAAGC,SAASF,EAAEG,OAAM,CAAA;AAKrD,IAAMC,sBAAsBJ,EAAEC,OAAO,CAAC,CAAA,EAAGC,SAASF,EAAEK,MAAM;EAACL,EAAEG,OAAM;EAAIH,EAAEM,MAAMN,EAAEG,OAAM,CAAA;CAAI,CAAA;AAK3F,IAAMI,0BAA0B;EACrCC,QAAQT;EACRU,OAAOL;EACPM,MAAMV,EAAEW,KAAI,EAAGC,SAAQ;EACvBC,UAAUb,EAAEW,KAAI,EAAGC,SAAQ;AAC7B;AASO,SAASE,wBAKdC,SAKA;AAKA,QAAMC,aAAa;IAAE,GAAGT;IAAyB,GAAGQ;EAAQ;AAE5D,SAAO,CAACE,YAAAA;AACN,WAAO,OAAOC,KAAcC,KAAeC,SAAAA;AACzC,YAAMC,eAAeF,IAAIR,KAAKW,KAAKH,GAAAA;AACnC,UAAI;AAEF,cAAMI,SAAmB,CAAA;AACzB,cAAMC,OAAgC;UAAC;UAAU;UAAS;;AAC1D,mBAAWC,OAAOD,MAAM;AACtB,gBAAME,YAAYV,WAAWS,GAAAA;AAC7B,gBAAME,UAASD,UAAUE,UAAUV,IAAIO,GAAAA,CAAI;AAC3C,cAAIE,QAAOE,SAAS;AAClB,gBAAIC,WAAUH,QAAOI,IAAI,EAAGC,QAAOC,OAAOf,IAAIO,GAAAA,GAAME,QAAOI,IAAI;UACjE,OAAO;AACLR,mBAAOW,KAAI,GACNP,QAAOQ,MAAMC,OAAOC,IACrBC,CAAAA,UAAUA,MAAMC,KAAKC,WAAW,IAC5B,GAAGf,GAAAA,KAAQa,MAAMG,OAAO,KACxB,GAAGhB,GAAAA,IAAOa,MAAMC,KAAKG,KAAK,GAAA,CAAA,KAASJ,MAAMG,OAAO,EAAE,CAAA;UAG5D;QACF;AAGA,YAAIlB,OAAOiB,SAAS,GAAG;AACrB,gBAAMC,UAAUlB,OAAOmB,KAAK,IAAA;AAC5B,gBAAMC,MAAoB,IAAIC,MAAMH,OAAAA;AACpCE,cAAIE,OAAOC,cAAcC;AACzBJ,cAAIK,aAAaC,YAAYF;AAC7B3B,eAAKuB,GAAAA;AACL,iBAAO;QACT;AAGAxB,YAAIR,OAAO,CAACoB,SAAAA;AACV,gBAAMJ,UAASX,WAAWH,SAASe,UAAUG,IAAAA;AAC7C,cAAIJ,QAAOE,SAAS;AAClB,mBAAOR,aAAaM,QAAOI,IAAI;UACjC,OAAO;AACL,kBAAMU,UAAUd,QAAOQ,MAAMC,OAAOC,IAClCC,CAAAA,UAAUA,MAAMC,KAAKC,WAAW,IAC5B,aAAaF,MAAMG,OAAO,KAC1B,YAAYH,MAAMC,KAAKG,KAAK,GAAA,CAAA,KAASJ,MAAMG,OAAO,EAAE,EACxDC,KAAK,IAAA;AACP,kBAAMC,MAAoB,IAAIC,MAAMH,OAAAA;AACpCE,gBAAIE,OAAOC,cAAcI;AACzBP,gBAAIK,aAAaC,YAAYC;AAG7B/B,gBAAIR,OAAOU;AACX,kBAAMsB;UACR;QACF;AAGA,cAAMhB,SAASV,QAAQC,KAAYC,KAAYC,IAAAA;AAC/C,YAAIO,UAAUwB,UAAUxB,MAAAA,GAAS;AAC/B,gBAAMA;QACR;MACF,SAASgB,KAAK;AACZxB,YAAIR,OAAOU;AACXD,aAAKuB,GAAAA;MACP;IACF;EACF;AACF;AAlFgB7B;;;ACrChB,SAASsC,aAAAA,kBAAiB;AAE1B,SACEC,kBAAkBC,kBAAkBC,2BAC/B;AAEP,IAAIC;AAEG,IAAMC,sBAAsB,wBAACC,WAAAA;AAClC,MAAIC,WAAUH,MAAAA,EAAS,QAAOA;AAC9B,QAAMI,YAAY,IAAIC,iBAAiBH,OAAOI,oBAAoBC,gBAAgBC,mBAAAA;AAClFR,WAAS,IAAIS,iBAAiBL,SAAAA;AAC9B,SAAOJ;AACT,GALmC;;;ACR5B,IAAMU,kBAAkB;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;;;;ACA/C,SAASC,YAAAA,iBAAgB;AACzB,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,mBAAAA,wBAAuB;AAEhC,SAASC,kBAAAA,uBAAsB;AAE/B,SAASC,uBAAuB;AAEhC,SAASC,0BAA0B;AAEnC,SAASC,oBAAAA,yBAAwB;AACjC,SAASC,KAAAA,UAAS;;;ACVlB,SAASC,gBAAgB;AAEzB,SAASC,iBAAiB;AAC1B,SAASC,aAAAA,YAAWC,mBAAmB;AACvC,SAASC,iBAAiBC,6BAA6B;AAGvD,SAASC,wBAAwB;AAOjC,SAASC,kBAAkBC,+BAA+B;AAC1D,SACEC,4BAA4BC,uBAAuBC,4BAA4BC,mCAC1E;AACP,SAASC,aAAa;;;ACnBtB,SAASC,uBAAuB;AAEhC,SAASC,0BAA0B;AACnC,SAASC,uBAAuB;AAGzB,IAAMC,qBAAqB;AAU3B,IAAMC,wBAAwBH,mBAAwCC,iBAAiBC,kBAAAA;AAEvF,IAAME,wBAAwBL,gBAAgBM,OAAOF,qBAAAA;;;ADKrD,IAAMG,wCAAwC;AAqBrD,IAAMC,QAAQ;AACd,IAAMC,mBAAkB;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;;AAEjC,IAAMC,4BAAN,cAGGC,iBAAAA;EAjDV,OAiDUA;;;EACR,OAAyBC,gBAAgB;IAACL;;EAC1C,OAAyBM,sBAAsBN;EACvCO;EACAC;EACAC;EACAC;EACAC,eAAe,IAAIC,MAAAA;EAE3B,IAAcC,UAA8B;AAC1C,WAAO,KAAKC,OAAOD;EACrB;EAEA,MAAeE,gBAA+B;AAC5C,UAAM,MAAMA,cAAAA;AAEZ,SAAKR,wBAAwB,KAAKS,OAAOC,cAAc,+CAA+C;MAAEC,aAAa;IAA2B,CAAA;AAChJ,SAAKV,qBAAqB,KAAKQ,OAAOC,cAAc,4CAA4C;MAAEC,aAAa;IAAyB,CAAA;AACxI,SAAKR,uBAAuB,KAAKM,OAAOC,cAAc,8CAA8C;MAAEC,aAAa;IAA4B,CAAA;AAC/I,SAAKT,qBAAqB,KAAKO,OAAOC,cAAc,6CAA6C;MAAEC,aAAa;IAAyB,CAAA;EAC3I;EAEA,MAAeC,cAAcC,UAA0C;AACrE,QAAI,KAAKT,aAAaU,SAAQ,GAAI;AAChC,WAAKC,QAAQC,MAAM,8BAA8B,KAAKC,EAAE,0CAA0CC,KAAKC,IAAG,CAAA,GAAK;AAC/G,aAAO,CAAA;IACT;AACA,WAAO,MAAM,KAAKf,aAAagB,aAAa,YAAA;AAC1C,YAAMC,YAAsB,CAAA;AAC5B,UAAIC,YAAYT,QAAAA,KAAaA,SAASU,WAAW,GAAG;AAClD,cAAM,KAAKC,cAAa;MAC1B,OAAO;AAEL,cAAMC,iBAAiBZ,SACpBa,OAAOC,qBAAAA,EACPC,IAAkB,CAACC,MAAAA;AAClB,gBAAM,EAAEC,MAAMC,OAAOC,YAAW,IAAKH;AACrC,gBAAME,QAAQE,iBAAiBD,WAAAA;AAC/B,iBAAO;YAAEF;YAAMC;UAAM;QACvB,CAAA,EAAGL,OAAOQ,CAAAA,iBAAgBvC,iBAAgBwC,SAASD,aAAaJ,IAAI,CAAA;AACtE,mBAAWI,gBAAgBT,gBAAgB;AACzC,gBAAMW,SAAS,MAAM,KAAKC,kBAAkBH,YAAAA;AAC5C,cAAII,WAAUF,MAAAA,EAASf,CAAAA,UAASkB,KAAI,GAAIC,2BAA2BJ,MAAAA,CAAAA;QACrE;MACF;AACA,aAAOf;IACT,CAAA;EACF;EAEQoB,8BAA8BC,iBAA0CC,SAA2C;AACzH,UAAMC,gBAAyC,CAAC;AAChD,UAAMC,eAAeC,OAAOC,OAAOL,eAAAA,EAAiBM,OAAO,CAACC,KAAKC,QAAQD,MAAMC,KAAK,EAAE;AACtF,eAAW,CAACC,QAAQC,MAAAA,KAAWN,OAAOO,QAAQX,eAAAA,GAAkB;AAE9D,UAAIU,UAAU,GAAI;AAClB,YAAME,SAAUX,UAAUS,SAAUP;AAEpC,UAAIS,UAAU,GAAI;AAElB,YAAMC,iBAAiBC,sBAAsBC,UAAUN,MAAAA,GAASzD,KAAAA;AAChEkD,oBAAcW,cAAAA,IAAkBD;IAClC;AACA,UAAMI,eAAeZ,OAAOC,OAAOH,aAAAA,EAAeI,OAAO,CAACC,KAAKC,QAAQD,MAAMC,KAAK,EAAE;AACpFS,aAASD,gBAAgBf,SAAS,MAAM,yCAAA;AACxC,UAAMiB,YAAYjB,UAAUe;AAC5B,QAAIE,YAAY,IAAI;AAElBhB,oBAAciB,uBAAAA,IAA2BD;IAC3C;AACA,WAAOhB;EACT;EAEA,MAAcpB,gBAAoC;AAEhD,UAAMsC,UAAuC,CAAA;AAC7C,UAAMC,aAAa,MAAM,KAAKzD,QAAQyD,WAAU;AAChD,UAAM,EAAEC,QAAAA,QAAM,IAAKD;AACnB,QAAIzB,WAAU0B,OAAAA,GAAS;AACrB,iBAAWlC,QAAQnC,kBAAiB;AAElC,cAAMsE,OAAO;AACb,cAAMC,KAAK,MAAMF,QAAOG,mBAAkB;AAC1C,cAAMC,QAAuB;UAACnC,iBAAiBgC,IAAAA;UAAOhC,iBAAiBiC,EAAAA;;AAEvE,cAAMzC,iBAAiB4C,gBAAgBD,OAAO;UAACtC;SAAK;AACpD,mBAAWI,gBAAgBT,gBAAgB;AACzC,gBAAMW,SAAS,MAAM,KAAKC,kBAAkBH,YAAAA;AAC5C,cAAII,WAAUF,MAAAA,EAAS0B,SAAQvB,KAAKH,MAAAA;QACtC;MACF;IACF;AACA,WAAOkC,4BAA4BR,OAAAA;EACrC;EAEA,MAAczB,kBAAkBH,cAA4E;AAC1G,SAAKnB,QAAQwD,KAAK,sCAAsCrC,aAAaJ,IAAI,aAAaI,aAAaH,KAAK,EAAE;AAC1G,UAAMyC,yBAAyB;MAAE1C,MAAMI,aAAaJ,KAAK2C,SAAQ;MAAI1C,OAAOG,aAAaH,MAAM0C,SAAQ;IAAG;AAC1G,QAAI;AACF,WAAKxE,oBAAoByE,IAAI,GAAGF,sBAAAA;AAChC,YAAMT,aAAa,MAAM,KAAKzD,QAAQyD,WAAU;AAChD,YAAMC,UAASL,SAASI,WAAWC,QAAQ,MAAM,6CAAA;AAEjD,YAAMW,oBAAoBC,2BAA2B1C,YAAAA;AACrD,YAAMS,UAAU,MAAMqB,QAAOa,eAAeF,iBAAAA;AAC5C,UAAIhC,UAAU,IAAI;AAChB,aAAK5B,QAAQwD,KAAK,mCAAmCrC,aAAaJ,IAAI,aAAaI,aAAaH,KAAK,EAAE;AACvG,aAAK/B,uBAAuB0E,IAAI,GAAGF,sBAAAA;AAEnC,cAAM9B,kBAAkB,MAAMsB,QAAOc,kCAAkC5C,YAAAA;AACvE,cAAM6C,uBAAuB,KAAKtC,8BAA8BC,iBAAiBC,OAAAA;AAEjF,cAAMqC,KAAK,MAAM,KAAKC,oCAAoCN,mBAAmBI,sBAAsB7C,cAAc,KAAK5B,OAAO;AAC7H,aAAKS,QAAQwD,KAAK,4BAA4BrC,aAAaJ,IAAI,aAAaI,aAAaH,KAAK,EAAE;AAChG,aAAK5B,sBAAsBuE,IAAI,GAAGF,sBAAAA;AAElC,eAAOQ;MACT;IACF,SAASE,OAAO;AACd,WAAKhF,oBAAoBwE,IAAI,GAAGF,sBAAAA;AAChC,WAAKzD,QAAQmE,MAAM,mCAAmChD,aAAaJ,IAAI,aAAaI,aAAaH,KAAK,KAAKmD,KAAAA;IAC7G;EACF;EAEA,MAAcD,oCACZN,mBACAI,sBACAjD,MACAxB,SACgD;AAEhD,UAAM6E,kBAAkBC,sBAAsBT,mBAAmBI,oBAAAA;AACjEI,oBAAgBE,UAAU;MAAEvD;IAAK;AACjC,UAAMiC,aAAa,MAAMzD,QAAQyD,WAAU;AAC3C,UAAMC,UAASL,SAASI,WAAWC,QAAQ,MAAM,6CAAA;AACjD,UAAMsB,UAAU,MAAMtB,QAAOsB,QAAO;AACpC,UAAMC,eAAe,MAAMvB,QAAOG,mBAAkB;AACpD,UAAM/B,SAAS,MAAM9B,QAAQkF,qBAAqB;MAACL;OAAkB,CAAA,GAAI;MACvEM,OAAOH;MAASI,KAAKH;MAAcI,KAAKJ,eAAe;IACzD,CAAA;AACA,QAAIjD,WAAUF,MAAAA,EAAS,QAAOA,OAAO,CAAA;EACvC;AACF;;;AD7KA,IAAMwD,QAAQC,GAAEC,OAAO;EACrBC,WAAWF,GAAEG,OAAOC,OAAM,EAAGC,IAAG,EAAGC,IAAI,CAAA,EAAGC,SAAQ;EAClDC,SAASR,GAAEG,OAAOC,OAAM,EAAGC,IAAG,EAAGC,IAAI,CAAA,EAAGC,SAAQ;EAChDE,MAAMT,GAAEG,OAAOC,OAAM,EAAGE,IAAII,KAAKJ,IAAG,GAAIK,eAAAA,CAAAA,EAAkBC,IAAIF,KAAKE,IAAG,GAAID,eAAAA,CAAAA,EAAkBN,IAAG,EAAGE,SAAQ,EAAGM,QAAQ,CAAA;AACvH,CAAA;AACA,IAAMC,WAAWd,GAAEe,MAAMC,eAAAA;AAEzB,IAAMC,kBAAkBC,wBAAwB;EAAEnB;EAAOe;AAAS,CAAA;AAElE,IAAMK,+BAA+B,8BAAOC,SAAAA;AAC1C,QAAMC,MAAM,MAAMD,KAAKE,QAAQ,mDAAA;AAC/B,QAAMC,WAAWC,mBAAmBH,GAAAA;AACpC,SAAOI,UAASF,UAAU,MAAM,6CAAA;AAClC,GAJqC;AAM9B,IAAMG,iBAAkC;EAC7CC,QAAQ;EACRC,MAAM;EACNC,UAAUZ,gBAAgB,OAAOa,KAAKC,QAAAA;AACpC,UAAM,EAAEC,QAAQZ,KAAI,IAAKU,IAAIG;AAC7B,UAAMZ,MAAM,MAAMF,6BAA6BC,IAAAA;AAC/C,UAAM,EACJlB,WAAWM,SAASC,KAAI,IACtBT,GAAEkC,MAAMnC,OAAO+B,IAAI/B,KAAK;AAC5B,UAAMoC,UAASC,oBAAoBJ,MAAAA;AACnC,UAAMK,OAAOC,WAAUpC,SAAAA,IAAaA,YAAY;AAChD,UAAMqC,eAAe,MAAMJ,QAAOK,mBAAkB;AACpD,UAAMC,KAAKH,WAAU9B,OAAAA,IAAWE,KAAKJ,IAAIE,SAAS+B,YAAAA,IAAgBA;AAClE,QAAIE,MAAMJ,MAAM;AACdN,UAAIW,OAAO,GAAA;AACXX,UAAIY,KAAK,CAAA,CAAE;AACX;IACF;AACA,UAAMC,QAAuB;MAACC,kBAAiBR,IAAAA;MAAOQ,kBAAiBJ,EAAAA;;AAEvE,UAAMK,iBAAiBC,iBAAgBH,OAAO;MAACnC;KAAK;AACpD,UAAMuC,UAAqB,CAAA;AAC3B,eAAWC,gBAAgBH,gBAAgB;AACzC,YAAMI,sBAAsB,IAAIC,gBAAoC;QAAEC,QAAQC;MAAmB,CAAA,EAAGC,OAAOL,YAAAA,EAAcM,MAAK;AAC9H,YAAMC,SAAS,MAAMnC,IAAIoC,OAAO;QAACP;OAAoB;AACrDF,cAAQU,KAAI,GAAIF,MAAAA;IAClB;AACAzB,QAAIW,OAAO,GAAA;AACXX,QAAIY,KAAKK,OAAAA;EACX,CAAA;AACF;;;AG/DA,SAASW,YAAAA,iBAAgB;AAKzB,SACEC,aAAaC,aAAAA,YAAWC,aACnB;AACP,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,yBAAAA,8BAA6B;AAEtC,SAASC,gBAAgB;AAKzB,SAASC,2BAA2B;AACpC,SACEC,sBAAsBC,kBAAkBC,iBAAiBC,oCACpD;AACP,SAASC,KAAAA,UAAS;AAQlB,IAAMC,OAAOC,GAAEC,IAAG;AAClB,IAAMC,YAAWC;AACjB,IAAMC,mBAAkBC,wBAAwB;EAC9CN;EACAG,UAAAA;AACF,CAAA;AAEA,IAAMI,aAAa,8BACjBC,WAAAA;AAEA,QAAM,EAAEC,UAAUC,gBAAgBC,SAAQ,IAAKH,OAAOI;AACtD,QAAMC,UAAU,MAAMC,SAASC,WAAWC,UAASP,UAAU,MAAM,EAAA,CAAA;AACnE,QAAMQ,SAAS,IAAIC,gBAAgBL,OAAAA;AACnC,QAAMM,aAAa,IAAIC,qBAAqB;IAAET;IAAUE;EAAQ,CAAA;AAChE,QAAMQ,UAAU,IAAIC,iBAAiBL,QAAQE,UAAAA;AAC7C,SAAOE;AACT,GATmB;AAUnB,IAAME,sCAAsC,8BAC1CC,IACAC,QACAC,KACAC,KACAN,YAAAA;AAEA,QAAMJ,SAASD,UAAS,MAAMK,QAAQJ,OAAM,GAAI,MAAM,kCAAA;AACtD,QAAMW,OAAO,MAAMX,OAAOY,QAAO;AAEjC,QAAMC,kBAAkBC,uBAAsBH,MAAM;IAAE,CAACJ,EAAAA,GAAKQ,YAAYC,MAAMR,MAAAA,CAAAA;EAAS,CAAA;AAGvF,QAAMN,aAAa,MAAME,QAAQF,WAAU;AAC3C,QAAMe,UAASlB,UAASG,WAAWe,QAAQ,MAAM,6CAAA;AACjD,QAAMC,QAAQ,MAAMD,QAAOE,QAAO;AAClC,QAAMC,SAAS,MAAMhB,QAAQiB,qBAAqB;IAACR;KAAkB,CAAA,GAAI;IACvEK;IAAOT;IAAKC;EACd,CAAA;AACA,MAAIY,WAAUF,MAAAA,EAAS,QAAOA,OAAO,CAAA;AACvC,GApB4C;AA+BrC,IAAMG,4BAA4B,wBAACC,WAAAA;AACxC,SAAO;IACLb,MAAMc,WAAUD,OAAOb,IAAI;IAC3BJ,IAAIiB,OAAO,gBAAA;IACXhB,QAAQgB,OAAO,kBAAA;IACff,KAAKe,OAAO,sBAAA;IACZd,KAAKc,OAAO,qBAAA;EACd;AACF,GARyC;AAUlC,IAAME,aAA8B;EACzCC,QAAQ;EACRC,MAAM;EACNC,UAAUzC,iBAAgB,OAAO0C,KAAKC,QAAAA;AACpC,UAAM,EAAExC,OAAM,IAAKuC,IAAIE;AACvB,UAAM,EAAEjD,MAAAA,MAAI,IAAK+C;AACjB,UAAM,CAACG,SAASC,SAAAA,IAAanD;AAC7B,UAAMoD,QAAQ,MAAMC,oBAAoBH,SAASC,SAAAA;AACjD,QAAIC,OAAO;AACT,YAAMX,SAASS,QAAQT;AACvB,YAAM,EACJb,MAAMJ,IAAIC,QAAQC,KAAKC,IAAG,IACxBa,0BAA0BC,MAAAA;AAC9BzB,MAAAA,UAAS0B,WAAUS,UAAUtB,OAAO,MAAMa,WAAUd,IAAAA,GAAO,MAAM,uCAAA;AACjE,YAAMP,UAAU,MAAMd,WAAWC,MAAAA;AACjC,YAAM8C,WAAWZ,WAAUlB,EAAAA;AAC3B,YAAM+B,KAAK,MAAMhC,oCAAoC+B,UAAU7B,QAAQC,KAAKC,KAAKN,OAAAA;AACjF,UAAIkB,WAAUgB,EAAAA,GAAK;AACjBP,YAAIQ,OAAO,GAAA;AACXR,YAAIS,KAAKF,EAAAA;MACX,OAAO;AACLP,YAAIQ,OAAO,GAAA;AACXR,YAAIS,KAAI;MACV;IACF,OAAO;AACLT,UAAIQ,OAAO,GAAA;AACXR,UAAIS,KAAI;IACV;EACF,CAAA;AACF;;;AChHO,IAAMC,sBAAsB,6BAAA;AACjC,SAAO;IACLC;;IAEAC;;AAEJ,GANmC;;;ACC5B,IAAMC,4BAA4B,wBAACC,QAAAA;AACxC,QAAMC,mBAAmBC,oBAAAA;AACzB,aAAWC,cAAcF,kBAAkB;AACzCD,QAAIG,WAAWC,MAAM,EAAED,WAAWE,MAAMF,WAAWG,QAAQ;EAC7D;AACF,GALyC;;;ACClC,IAAMC,YAAY,wBAACC,QAAAA;AACxBC,oBAAkBD,GAAAA;AAClBE,4BAA0BF,GAAAA;AAC5B,GAHyB;;;AbSlB,IAAMG,SAAS,wBAACC,MAAoBC,WAAAA;AACzCC,qBAAAA;AACA,QAAMC,MAAMC,SAAAA;AACZD,MAAIE,IAAI,QAAQ,KAAA;AAChBF,MAAIG,IAAIC,KAAAA,CAAAA;AACRJ,MAAIG,IAAIE,YAAAA,CAAAA;AACRL,MAAIG,IAAIG,gBAAAA;AACRN,MAAIG,IAAII,kBAAkBC,yBAAyB;IAAEC,OAAO;EAAM,CAAA,CAAA,CAAA;AAClET,MAAIG,IAAIO,iBAAAA;AACRC,uCAAqCX,GAAAA;AACrCA,MAAIG,IAAIS,qBAAAA;AACRC,8BAA4Bb,GAAAA;AAC5BA,MAAIF,SAASA;AACbE,MAAIH,OAAOA;AACXiB,YAAUd,GAAAA;AACVA,MAAIG,IAAIY,cAAAA;AACR,SAAOf;AACT,GAjBsB;;;AcdtB,SAASgB,YAAAA,iBAAgB;AAEzB,SAASC,aAAAA,YAAWC,gBAAgB;AACpC,SAASC,YAAY;AAGrB,SAASC,YAAAA,iBAAgB;;;ACHzB,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,uBAAuB;AAChC,SAASC,0BAA0B;AACnC,SAASC,qBAAqB;AAC9B,SAASC,qBAAqB;AAC9B,SAASC,gBAAgBC,kCAAkC;AAC3D,SAASC,4BAA4B;AAGrC,SAASC,sBAAsB;AAC/B,SAASC,YAAAA,iBAAgB;AAEzB,SAASC,sBAAsB;AAC/B,SACEC,wBAAAA,uBAAsBC,oBAAAA,mBAAkBC,mBAAAA,wBACnC;AAeA,IAAMC,aAAa,8BAAOC,YAAAA;AAC/B,QAAM,EAAEC,QAAQC,OAAM,IAAKF;AAC3B,QAAM,EAAEG,aAAY,IAAKF,OAAOG,WAAWC,QAAQ,CAAC;AACpD,QAAM,EAAEC,eAAeC,cAAa,IAAK,MAAMC,cAAc;IAC3DC,YAAY;MACVC,aAAa;MACbC,gBAAgB;IAClB;IACAR;IACAS,eAAe;MACbC,UAAU;MACVC,MAAM;IACR;EACF,CAAA;AAEA,MAAIC,WAAUb,MAAAA,EAASc,gBAAeC,gBAAgBf;AACtD,QAAMgB,iBAAiBhB,SAAS,IAAIiB,2BAA2BjB,MAAAA,IAAUkB;AAEzE,QAAMC,UAAU,IAAIC,qBAAAA;AAEpB,QAAMC,cAActB,OAAOuB,SAASC;AACpC,MAAIC,eAAeH,WAAAA,GAAc;AAE/B,UAAM,EACJI,kBAAkBC,oBAAoBC,UAAUC,QAAQC,QAAQC,UAAUC,UAAUC,YAAYC,UAAUC,WAAU,IAClHb;AACJ,UAAMc,mBAA8C;MAClDT;MAAoBI;MAAUF;MAAQI;MAAYE;IACpD;AACA,UAAME,SAAyC;MAC7C/B;MAAe8B;MAAkBnB;MAAgBZ;IACnD;AAEAe,YAAQkB,SAASC,mBAAmBC,QAAQH,MAAAA,GAASlB,QAAW,IAAA;EAClE;AAEAC,UAAQkB,SAASG,gBAAgBD,QAAQ;IACvCnC;IAAeC;IAAeW;EAChC,CAAA,CAAA;AACAG,UAAQkB,SAASI,eAAeF,QAAQ;IACtCnC;IAAeC;IAAeW;EAChC,CAAA,CAAA;AACAG,UAAQkB,SAASK,cAAcH,QAAQ;IACrCnC;IAAeC;IAAeW;EAChC,CAAA,CAAA;AACA,QAAM2B,kCAAkCxB,SAASpB,QAAQK,eAAeC,eAAeW,cAAAA;AACvF,SAAOG;AACT,GA/C0B;AAiD1B,IAAMwB,oCAAoC,8BACxCxB,SACApB,QACAK,eACAC,eACAW,mBAAAA;AAEA,QAAM,EAAE4B,UAAUC,gBAAgBlC,SAAQ,IAAKZ,OAAO+C;AACtD,QAAMC,gBAAgBlC,WAAU+B,QAAAA,IAAYI,UAASC,WAAWL,QAAAA,IAAYI,UAASE,OAAM;AAC3F,QAAMC,UAAU,MAAMJ;AACtB,QAAMK,SAAS,IAAIC,iBAAgBF,OAAAA;AACnC,QAAMG,aAAa,IAAIC,sBAAqB;IAAE5C;IAAUwC;EAAQ,CAAA;AAChE,QAAMK,UAAU,IAAIC,kBAAiBL,QAAQE,UAAAA;AAC7C,QAAMI,kCAA4E;IAChFF;IAASpD;IAAeC;IAAeW;EACzC;AACAG,UAAQkB,SAASsB,0BAA0BpB,QAAQmB,+BAAAA,CAAAA;AACrD,GAjB0C;;;ACjF1C,SAASE,uBAAuB;;;ACDhC;AAAA,EACE,SAAW;AAAA,EACX,OAAS;AAAA,IACP;AAAA,MACE,QAAU;AAAA,QACR,aAAe;AAAA,QACf,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,SAAW;AAAA,QACT,SAAW;AAAA,UACT;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,MAAQ;AAAA,cACR,UAAY;AAAA,gBACV,SAAW;AAAA,gBACX,YAAc;AAAA,cAChB;AAAA,cACA,kBAAoB;AAAA,gBAClB,YAAc;AAAA,cAChB;AAAA,cACA,QAAU;AAAA,YACZ;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,MAAQ;AAAA,cACR,QAAU;AAAA,YACZ;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,aAAe;AAAA,gBACb;AAAA,kBACE,WAAa;AAAA,kBACb,gBAAkB;AAAA,kBAClB,QAAU;AAAA,kBACV,MAAQ;AAAA,gBACV;AAAA,cACF;AAAA,cACA,MAAQ;AAAA,cACR,QAAU;AAAA,cACV,aAAe;AAAA,cACf,OAAS;AAAA,gBACP;AAAA,kBACE,KAAO;AAAA,kBACP,UAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAU;AAAA,UACR;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,MAAQ;AAAA,cACR,gBAAkB;AAAA,gBAChB;AAAA,gBACA;AAAA,cACF;AAAA,cACA,UAAY;AAAA,gBACV,SAAW;AAAA,gBACX,YAAc;AAAA,cAChB;AAAA,cACA,iBAAmB;AAAA,cACnB,QAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAU;AACZ;;;ACtEO,IAAMC,eAAeC;;;ACJrB,IAAMC,wBAAwB,CAAA;;;ACE9B,IAAMC,uBAAyC,CAAA;;;AJgB/C,IAAMC,UAAU,8BAAOC,YAAAA;AAC5B,QAAM,EAAEC,OAAM,IAAKD;AACnB,QAAME,UAAU,MAAMC,WAAWH,OAAAA;AACjC,QAAMI,UAAU,IAAIC,gBAAgBC,cAAcL,QAAQC,SAASK,sBAAsBC,qBAAAA;AACzF,QAAM,CAACC,MAAM,GAAGC,UAAAA,IAAc,MAAMN,QAAQO,UAAS;AACrD,MAAID,YAAYE,SAAS,GAAG;AAC1B,UAAMC,QAAQC,IAAIJ,WAAWK,IAAIC,CAAAA,cAAaP,KAAKQ,SAASD,SAAAA,CAAAA,CAAAA;AAC5D,UAAMH,QAAQC,IAAIJ,WAAWK,IAAIC,CAAAA,cAAaP,KAAKS,OAAOF,UAAUG,SAAS,IAAA,CAAA,CAAA;EAC/E;AACA,SAAOV;AACT,GAVuB;;;AFTvB,IAAMW,WAAW;AAIjB,IAAMC,gBAAgB,8BAAOC,MAA6BC,QAAgBC,WAAAA;AACxE,QAAMC,mBAAmB,MAAMH,KAAKI,gBAAgBC,IAAI,IAAA;AACxDH,UAAQI,MAAM,6BAA6BH,gBAAAA,EAAkB;AAC7D,QAAM,EAAEI,SAAQ,IAAKN,OAAOO;AAC5B,MAAIC,SAASN,gBAAAA,KAAqBM,SAASF,QAAAA,GAAW;AACpDL,YAAQQ,KAAK,yFAAA;AACb,UAAMV,KAAKI,gBAAgBO,IAAI,MAAMJ,QAAAA;EACvC,OAAO;AACL,QAAIK;AACJ,QAAIH,SAASF,QAAAA,GAAW;AACtBK,mBAAaL;IACf,OAAO;AACLK,mBAAaC,UAASC,iBAAgB;AACtCZ,cAAQa,IAAI,mGAAA;AACZb,cAAQa,IAAI,sBAAsBH,UAAAA,EAAY;IAChD;AACA,UAAMZ,KAAKI,gBAAgBO,IAAI,MAAMC,UAAAA;EACvC;AACA,SAAOI,UAAS,MAAMhB,KAAKI,gBAAgBC,IAAI,IAAA,GAAO,MAAM,sCAAA;AAC9D,GAnBsB;AA2Bf,IAAMY,YAAY,8BAAOC,YAAAA;AAC9B,QAAM,EAAEhB,QAAQD,OAAM,IAAKiB;AAC3B,QAAM,EAAEC,MAAMZ,SAAQ,IAAKN,OAAOmB;AAClC,QAAMpB,OAAO,MAAMqB,KAAAA;AACnB,QAAMT,aAAaU,WAAUf,QAAAA,IAAYA,WAAW,MAAMR,cAAcC,MAAMC,QAAQC,MAAAA;AACtF,QAAMqB,SAAS,MAAMV,UAASW,WAAWZ,UAAAA;AACzC,QAAMa,cAAc;IAClBF;IAAQrB;IAAQD;EAClB;AACA,QAAMyB,OAAOR,QAAQQ,QAAQ,MAAMC,QAAQF,WAAAA;AAC3C,QAAMG,MAAMC,OAAOH,MAAMzB,MAAAA;AACzB,QAAM6B,SAASF,IAAIG,OAAOZ,MAAMrB,UAAU,MAAMI,QAAQa,IAAI,uCAAuCjB,QAAAA,IAAYqB,IAAAA,EAAM,CAAA;AACrHW,SAAOE,WAAW,IAAA;AAClB,SAAOF;AACT,GAdyB;","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","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","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","AsObjectFactory","isPayloadOfZodType","StepIdentityZod","StepIdentitySchema","isStepIdentityPayload","asStepIdentityPayload","create","ChainRewardsClaimSentinelConfigSchema","scope","RewardableSteps","ChainRewardsClaimSentinel","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","networkStakeStepRewardPoolRewards","addressDistributions","tx","submitRewardDistributionTransaction","error","transferPayload","createTransferPayload","context","chainId","currentBlock","addPayloadsToChain","chain","nbf","exp","query","z","object","fromBlock","coerce","number","int","min","optional","toBlock","step","Math","RewardableSteps","max","default","response","array","PayloadZodLoose","validateRequest","requestHandlerValidator","getChainRewardsClaimSentinel","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","hexToBigInt","toAddress","toHex","isDefined","createTransferPayload","HDWallet","verifyEIP712Message","HttpRpcXyoConnection","MemoryXyoGateway","MemoryXyoSigner","SignedHydratedTransactionZod","z","body","z","any","response","SignedHydratedTransactionZod","validateRequest","requestHandlerValidator","getGateway","config","mnemonic","chainRpcApiUrl","endpoint","rewardRedemptionApi","account","HDWallet","fromPhrase","assertEx","signer","MemoryXyoSigner","connection","HttpRpcXyoConnection","gateway","MemoryXyoGateway","submitRewardDistributionTransaction","to","amount","nbf","exp","from","address","transferPayload","createTransferPayload","hexToBigInt","toHex","viewer","chain","chainId","result","addPayloadsToChain","isDefined","parseConfirmedClaimValues","values","toAddress","postRedeem","method","path","handlers","req","res","app","payload","signature","valid","verifyEIP712Message","receiver","tx","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","registerChainRewardsClaimSentinel","mnemonic","chainRpcApiUrl","rewardRedemptionApi","walletPromise","HDWallet","fromPhrase","random","account","signer","MemoryXyoSigner","connection","HttpRpcXyoConnection","gateway","MemoryXyoGateway","chainRewardsClaimSentinelParams","ChainRewardsClaimSentinel","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"]}
@@ -21,8 +21,13 @@ export type ChainRewardsClaimSentinelParams<TConfig extends AnyConfigSchema<Chai
21
21
  export declare class ChainRewardsClaimSentinel<TParams extends ChainRewardsClaimSentinelParams = ChainRewardsClaimSentinelParams, TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>> extends AbstractSentinel<TParams, TEventData> {
22
22
  static readonly configSchemas: string[];
23
23
  static readonly defaultConfigSchema = "network.xyo.sentinel.chain.rewards.claim.config";
24
+ private _claimAttemptsCounter;
25
+ private _claimCheckCounter;
26
+ private _claimErrorCounter;
27
+ private _claimSuccessCounter;
24
28
  private _reportMutex;
25
29
  protected get gateway(): XyoGatewayProvider;
30
+ createHandler(): Promise<void>;
26
31
  reportHandler(payloads?: Payload[]): Promise<Payload[]>;
27
32
  private calculateAddressDistributions;
28
33
  private claimAllSteps;
@@ -1 +1 @@
1
- {"version":3,"file":"ChainRewardsClaimSentinel.d.ts","sourceRoot":"","sources":["../../../src/modules/ChainRewardsClaimSentinel.ts"],"names":[],"mappings":"AAKA,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;AASlC,eAAO,MAAM,qCAAqC,oDAAoD,CAAA;AACtG,MAAM,MAAM,qCAAqC,GAAG,OAAO,qCAAqC,CAAA;AAEhG;;GAEG;AACH,MAAM,MAAM,+BAA+B,GAAG,cAAc,CAAC;IAC3D;;OAEG;IACH,MAAM,EAAE,qCAAqC,CAAA;CAC9C,CAAC,CAAA;AAEF,UAAU,oCAAoC;IAC5C,OAAO,EAAE,kBAAkB,CAAA;CAC5B;AAED,MAAM,MAAM,+BAA+B,CACzC,OAAO,SAAS,eAAe,CAAC,+BAA+B,CAAC,GAAG,eAAe,CAAC,+BAA+B,CAAC,IACjH,cAAc,CAAC,OAAO,CAAC,GAAG,oCAAoC,CAAA;AAKlE,qBAAa,yBAAyB,CACpC,OAAO,SAAS,+BAA+B,GAAG,+BAA+B,EACjF,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,WAA0C;IAChF,gBAAyB,mBAAmB,qDAAwC;IACpF,OAAO,CAAC,YAAY,CAAc;IAElC,SAAS,KAAK,OAAO,IAAI,kBAAkB,CAE1C;IAEc,aAAa,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA2BtE,OAAO,CAAC,6BAA6B;YAuBvB,aAAa;YAuBb,iBAAiB;YAqBjB,mCAAmC;CAkBlD"}
1
+ {"version":3,"file":"ChainRewardsClaimSentinel.d.ts","sourceRoot":"","sources":["../../../src/modules/ChainRewardsClaimSentinel.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;AASlC,eAAO,MAAM,qCAAqC,oDAAoD,CAAA;AACtG,MAAM,MAAM,qCAAqC,GAAG,OAAO,qCAAqC,CAAA;AAEhG;;GAEG;AACH,MAAM,MAAM,+BAA+B,GAAG,cAAc,CAAC;IAC3D;;OAEG;IACH,MAAM,EAAE,qCAAqC,CAAA;CAC9C,CAAC,CAAA;AAEF,UAAU,oCAAoC;IAC5C,OAAO,EAAE,kBAAkB,CAAA;CAC5B;AAED,MAAM,MAAM,+BAA+B,CACzC,OAAO,SAAS,eAAe,CAAC,+BAA+B,CAAC,GAAG,eAAe,CAAC,+BAA+B,CAAC,IACjH,cAAc,CAAC,OAAO,CAAC,GAAG,oCAAoC,CAAA;AAKlE,qBAAa,yBAAyB,CACpC,OAAO,SAAS,+BAA+B,GAAG,+BAA+B,EACjF,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,WAA0C;IAChF,gBAAyB,mBAAmB,qDAAwC;IACpF,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/chain-reward-redemption",
3
- "version": "1.15.17",
3
+ "version": "1.15.19",
4
4
  "description": "XYO Layer One Rewards",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -63,8 +63,8 @@
63
63
  "@xyo-network/archivist-view": "~5.1.7",
64
64
  "@xyo-network/bios": "~7.1.1",
65
65
  "@xyo-network/boundwitness-model": "~5.1.7",
66
- "@xyo-network/chain-protocol": "~1.15.17",
67
- "@xyo-network/chain-telemetry": "~1.15.17",
66
+ "@xyo-network/chain-protocol": "~1.15.19",
67
+ "@xyo-network/chain-telemetry": "~1.15.19",
68
68
  "@xyo-network/manifest-model": "~5.1.7",
69
69
  "@xyo-network/manifest-wrapper": "~5.1.7",
70
70
  "@xyo-network/module-abstract": "~5.1.7",
@@ -80,8 +80,8 @@
80
80
  "@xyo-network/wallet": "~5.1.7",
81
81
  "@xyo-network/wallet-model": "~5.1.7",
82
82
  "@xyo-network/xl1-protocol": "~1.12.84",
83
- "@xyo-network/xl1-protocol-sdk": "~1.15.17",
84
- "@xyo-network/xl1-rpc": "~1.15.17",
83
+ "@xyo-network/xl1-protocol-sdk": "~1.15.19",
84
+ "@xyo-network/xl1-rpc": "~1.15.19",
85
85
  "async-mutex": "~0.5.0",
86
86
  "compression": "~1.8.1",
87
87
  "cors": "~2.8.5",
@@ -111,8 +111,8 @@
111
111
  "@xyo-network/archivist-mongodb": "~5.1.7",
112
112
  "@xyo-network/bios-model": "~7.1.1",
113
113
  "@xyo-network/boundwitness-builder": "~5.1.7",
114
- "@xyo-network/chain-protocol": "~1.15.17",
115
- "@xyo-network/chain-services": "~1.15.17",
114
+ "@xyo-network/chain-protocol": "~1.15.19",
115
+ "@xyo-network/chain-services": "~1.15.19",
116
116
  "@xyo-network/manifest-wrapper": "~5.1.7",
117
117
  "@xyo-network/module-abstract": "~5.1.7",
118
118
  "@xyo-network/module-abstract-mongodb": "~5.1.7",
@@ -29,6 +29,28 @@
29
29
  "name": "ChainRewardsClaimSentinel",
30
30
  "schema": "network.xyo.sentinel.chain.rewards.claim.config"
31
31
  }
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": "ChainRewardsClaimSentinel",
50
+ "endPoint": "report"
51
+ }
52
+ ]
53
+ }
32
54
  }
33
55
  ],
34
56
  "public": [
@@ -1,3 +1,4 @@
1
+ import type { Attributes, Counter } from '@opentelemetry/api'
1
2
  import { assertEx } from '@xylabs/assert'
2
3
  import type { Address } from '@xylabs/hex'
3
4
  import { toAddress } from '@xylabs/hex'
@@ -50,15 +51,28 @@ export class ChainRewardsClaimSentinel<
50
51
  > extends AbstractSentinel<TParams, TEventData> {
51
52
  static override readonly configSchemas = [ChainRewardsClaimSentinelConfigSchema]
52
53
  static override readonly defaultConfigSchema = ChainRewardsClaimSentinelConfigSchema
54
+ private _claimAttemptsCounter: Counter<Attributes> | undefined
55
+ private _claimCheckCounter: Counter<Attributes> | undefined
56
+ private _claimErrorCounter: Counter<Attributes> | undefined
57
+ private _claimSuccessCounter: Counter<Attributes> | undefined
53
58
  private _reportMutex = new Mutex()
54
59
 
55
60
  protected get gateway(): XyoGatewayProvider {
56
61
  return this.params.gateway
57
62
  }
58
63
 
64
+ override async createHandler(): Promise<void> {
65
+ await super.createHandler()
66
+ // Create meters for tracking claim attempts, successes, and errors.
67
+ this._claimAttemptsCounter = this.meter?.createCounter('chain_rewards_claim_sentinel_attempts_total', { description: 'Number of claim attempts' })
68
+ this._claimCheckCounter = this.meter?.createCounter('chain_rewards_claim_sentinel_check_total', { description: 'Number of claim checks' })
69
+ this._claimSuccessCounter = this.meter?.createCounter('chain_rewards_claim_sentinel_success_total', { description: 'Number of claim successes' })
70
+ this._claimErrorCounter = this.meter?.createCounter('chain_rewards_claim_sentinel_errors_total', { description: 'Number of claim errors' })
71
+ }
72
+
59
73
  override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {
60
74
  if (this._reportMutex.isLocked()) {
61
- this.logger?.debug(`ChainRewardsClaimSentinel [${this.id}] is already running, skipping divine [${Date.now()}]`)
75
+ this.logger?.debug(`ChainRewardsClaimSentinel [${this.id}] is already running, skipping report [${Date.now()}]`)
62
76
  return []
63
77
  }
64
78
  return await this._reportMutex.runExclusive(async () => {
@@ -110,9 +124,8 @@ export class ChainRewardsClaimSentinel<
110
124
  // No payloads to process, just do claims since last run
111
125
  const results: SignedHydratedTransaction[] = []
112
126
  const connection = await this.gateway.connection()
113
- const signer = await this.gateway.signer()
114
- const { viewer, runner } = connection
115
- if (isDefined(viewer) && isDefined(runner) && isDefined(signer)) {
127
+ const { viewer } = connection
128
+ if (isDefined(viewer)) {
116
129
  for (const step of RewardableSteps) {
117
130
  // Fetch unclaimed rewards and process claims
118
131
  const from = 0
@@ -130,34 +143,42 @@ export class ChainRewardsClaimSentinel<
130
143
  }
131
144
 
132
145
  private async claimStepIdentity(stepIdentity: StepIdentity): Promise<SignedHydratedTransaction | undefined> {
133
- // No payloads to process, just do claims since last run
134
- const connection = await this.gateway.connection()
135
- const signer = await this.gateway.signer()
136
- const { viewer, runner } = connection
137
- if (isDefined(viewer) && isDefined(runner) && isDefined(signer)) {
146
+ this.logger?.info(`Checking rewards to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`)
147
+ const claimCounterAttributes = { step: stepIdentity.step.toString(), block: stepIdentity.block.toString() }
148
+ try {
149
+ this._claimCheckCounter?.add(1, claimCounterAttributes)
150
+ const connection = await this.gateway.connection()
151
+ const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')
138
152
  // If wallet has balance
139
- const stepRewardsAddress = completedStepRewardAddress(stepIdentity)
140
- const balance = await viewer.accountBalance(stepRewardsAddress)
153
+ const stepRewardAddress = completedStepRewardAddress(stepIdentity)
154
+ const balance = await viewer.accountBalance(stepRewardAddress)
141
155
  if (balance > 0n) {
156
+ this.logger?.info(`Found rewards to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`)
157
+ this._claimAttemptsCounter?.add(1, claimCounterAttributes)
142
158
  // For stakers
143
159
  const rewardsByStaker = await viewer.networkStakeStepRewardPoolRewards(stepIdentity)
144
160
  const addressDistributions = this.calculateAddressDistributions(rewardsByStaker, balance)
145
161
  // Create single transaction for all claims
146
- const tx = await this.submitRewardDistributionTransaction(stepRewardsAddress, addressDistributions, stepIdentity, this.gateway)
162
+ const tx = await this.submitRewardDistributionTransaction(stepRewardAddress, addressDistributions, stepIdentity, this.gateway)
163
+ this.logger?.info(`Claimed rewards for step ${stepIdentity.step} at block ${stepIdentity.block}`)
164
+ this._claimSuccessCounter?.add(1, claimCounterAttributes)
147
165
  // Return submitted transaction
148
166
  return tx
149
167
  }
168
+ } catch (error) {
169
+ this._claimErrorCounter?.add(1, claimCounterAttributes)
170
+ this.logger?.error(`Error claiming rewards for step ${stepIdentity.step} at block ${stepIdentity.block}:`, error)
150
171
  }
151
172
  }
152
173
 
153
174
  private async submitRewardDistributionTransaction(
154
- stepRewardsAddress: Address,
175
+ stepRewardAddress: Address,
155
176
  addressDistributions: Record<Address, bigint>,
156
177
  step: StepIdentity,
157
178
  gateway: XyoGatewayProvider,
158
179
  ): Promise<SignedHydratedTransaction | undefined> {
159
180
  // Create single transfer payload for all claims
160
- const transferPayload = createTransferPayload(stepRewardsAddress, addressDistributions)
181
+ const transferPayload = createTransferPayload(stepRewardAddress, addressDistributions)
161
182
  transferPayload.context = { step }
162
183
  const connection = await gateway.connection()
163
184
  const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')