@xyo-network/chain-reward-redemption 1.15.18 → 1.15.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node/index.mjs +66 -14
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/modules/ChainRewardsClaimSentinel.d.ts +5 -0
- package/dist/node/modules/ChainRewardsClaimSentinel.d.ts.map +1 -1
- package/dist/node/server/routes/rewardRedemption/routeDefinitions/routes/redeem.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/manifest/node.json +22 -0
- package/src/modules/ChainRewardsClaimSentinel.ts +35 -14
- package/src/server/routes/rewardRedemption/routeDefinitions/routes/claimRange.ts +1 -1
- package/src/server/routes/rewardRedemption/routeDefinitions/routes/redeem.ts +1 -3
package/dist/node/index.mjs
CHANGED
|
@@ -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
|
|
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
|
|
307
|
-
|
|
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
|
-
|
|
329
|
-
const
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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(
|
|
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(
|
|
343
|
-
const transferPayload = createTransferPayload(
|
|
372
|
+
async submitRewardDistributionTransaction(stepRewardAddress, addressDistributions, step, gateway) {
|
|
373
|
+
const transferPayload = createTransferPayload(stepRewardAddress, addressDistributions);
|
|
344
374
|
transferPayload.context = {
|
|
345
375
|
step
|
|
346
376
|
};
|
|
@@ -380,7 +410,6 @@ var postClaimRange = {
|
|
|
380
410
|
path: "/rewards/claimRange",
|
|
381
411
|
handlers: validateRequest(async (req, res) => {
|
|
382
412
|
const { config, node } = req.app;
|
|
383
|
-
const mod = await getChainRewardsClaimSentinel(node);
|
|
384
413
|
const { fromBlock, toBlock, step } = z2.parse(query, req.query);
|
|
385
414
|
const viewer2 = getViewerFromConfig(config);
|
|
386
415
|
const from = isDefined5(fromBlock) ? fromBlock : 0;
|
|
@@ -400,6 +429,7 @@ var postClaimRange = {
|
|
|
400
429
|
]);
|
|
401
430
|
const results = [];
|
|
402
431
|
for (const stepIdentity of stepIdentities) {
|
|
432
|
+
const mod = await getChainRewardsClaimSentinel(node);
|
|
403
433
|
const stepIdentityPayload = new PayloadBuilder2({
|
|
404
434
|
schema: StepIdentitySchema
|
|
405
435
|
}).fields(stepIdentity).build();
|
|
@@ -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: [
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -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 {\n fromBlock, toBlock, step,\n } = z.parse(query, req.query)\n const viewer = getViewerFromConfig(config)\n const from = isDefined(fromBlock) ? fromBlock : 0\n const currentBlock = await viewer.currentBlockNumber()\n const to = isDefined(toBlock) ? Math.min(toBlock, currentBlock) : currentBlock\n if (to <= from) {\n res.status(400)\n res.json([])\n return\n }\n const range: XL1BlockRange = [asXL1BlockNumber(from), asXL1BlockNumber(to)]\n // For each rewardable step in range\n const stepIdentities = blockRangeSteps(range, [step])\n const results: Payload[] = []\n for (const stepIdentity of stepIdentities) {\n const mod = await getChainRewardsClaimSentinel(node)\n const stepIdentityPayload = new PayloadBuilder<StepIdentityPayload>({ schema: StepIdentitySchema }).fields(stepIdentity).build()\n const result = await mod.report([stepIdentityPayload])\n results.push(...result)\n }\n res.status(200)\n res.json(results)\n }),\n}\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { toAddress } from '@xylabs/hex'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { blockRangeSteps, createTransferPayload } from '@xyo-network/chain-protocol'\nimport type { AnyConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport type {\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport type {\n AttoXL1, SignedHydratedTransaction, StepIdentity, XL1BlockRange, XyoGatewayProvider,\n} from '@xyo-network/xl1-protocol'\nimport { asXL1BlockNumber, XYO_STEP_REWARD_ADDRESS } from '@xyo-network/xl1-protocol'\nimport {\n completedStepRewardAddress, derivedReceiveAddress, flattenHydratedTransaction, flattenHydratedTransactions,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { 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, 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 { 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":"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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","_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":"
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redeem.d.ts","sourceRoot":"","sources":["../../../../../../../src/server/routes/rewardRedemption/routeDefinitions/routes/redeem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"redeem.d.ts","sourceRoot":"","sources":["../../../../../../../src/server/routes/rewardRedemption/routeDefinitions/routes/redeem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACD,UAAU,EAAE,GAAG,EACzB,MAAM,aAAa,CAAA;AAkBpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AA4C5D,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,GAAG,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,MAAM,EAAE,UAAU,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,yBAAyB,GAAI,QAAQ,oBAAoB;;;;;;;;;;;;CAQrE,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,eA6BxB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-reward-redemption",
|
|
3
|
-
"version": "1.15.
|
|
3
|
+
"version": "1.15.20",
|
|
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.
|
|
67
|
-
"@xyo-network/chain-telemetry": "~1.15.
|
|
66
|
+
"@xyo-network/chain-protocol": "~1.15.20",
|
|
67
|
+
"@xyo-network/chain-telemetry": "~1.15.20",
|
|
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.
|
|
84
|
-
"@xyo-network/xl1-rpc": "~1.15.
|
|
83
|
+
"@xyo-network/xl1-protocol-sdk": "~1.15.20",
|
|
84
|
+
"@xyo-network/xl1-rpc": "~1.15.20",
|
|
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.
|
|
115
|
-
"@xyo-network/chain-services": "~1.15.
|
|
114
|
+
"@xyo-network/chain-protocol": "~1.15.20",
|
|
115
|
+
"@xyo-network/chain-services": "~1.15.20",
|
|
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",
|
package/src/manifest/node.json
CHANGED
|
@@ -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
|
|
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
|
|
114
|
-
|
|
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
|
-
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
|
140
|
-
const balance = await viewer.accountBalance(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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')
|
|
@@ -36,7 +36,6 @@ export const postClaimRange: RouteDefinition = {
|
|
|
36
36
|
path: '/rewards/claimRange',
|
|
37
37
|
handlers: validateRequest(async (req, res) => {
|
|
38
38
|
const { config, node } = req.app
|
|
39
|
-
const mod = await getChainRewardsClaimSentinel(node)
|
|
40
39
|
const {
|
|
41
40
|
fromBlock, toBlock, step,
|
|
42
41
|
} = z.parse(query, req.query)
|
|
@@ -54,6 +53,7 @@ export const postClaimRange: RouteDefinition = {
|
|
|
54
53
|
const stepIdentities = blockRangeSteps(range, [step])
|
|
55
54
|
const results: Payload[] = []
|
|
56
55
|
for (const stepIdentity of stepIdentities) {
|
|
56
|
+
const mod = await getChainRewardsClaimSentinel(node)
|
|
57
57
|
const stepIdentityPayload = new PayloadBuilder<StepIdentityPayload>({ schema: StepIdentitySchema }).fields(stepIdentity).build()
|
|
58
58
|
const result = await mod.report([stepIdentityPayload])
|
|
59
59
|
results.push(...result)
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
2
|
import type {
|
|
3
|
-
Address,
|
|
4
|
-
EthAddress, Hex,
|
|
3
|
+
Address, EthAddress, Hex,
|
|
5
4
|
} from '@xylabs/hex'
|
|
6
5
|
import {
|
|
7
6
|
hexToBigInt, toAddress, toHex,
|
|
8
7
|
} from '@xylabs/hex'
|
|
9
8
|
import { isDefined } from '@xylabs/typeof'
|
|
10
9
|
import { createTransferPayload } from '@xyo-network/chain-protocol'
|
|
11
|
-
import { PayloadZodLoose } from '@xyo-network/payload-model'
|
|
12
10
|
import { HDWallet } from '@xyo-network/wallet'
|
|
13
11
|
import type { SignedHydratedTransaction, XyoGatewayProvider } from '@xyo-network/xl1-protocol'
|
|
14
12
|
import type {
|