@xyo-network/chain-reward-redemption 1.20.4 → 1.20.8
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 +15 -37
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/manifest/getLocator.d.ts.map +1 -1
- package/dist/node/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.d.ts +2 -3
- package/dist/node/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.d.ts.map +1 -1
- package/dist/node/modules/DerivedAddressWalletTransferSentinel/DerivedAddressWalletTransferSentinel.d.ts +2 -3
- package/dist/node/modules/DerivedAddressWalletTransferSentinel/DerivedAddressWalletTransferSentinel.d.ts.map +1 -1
- package/dist/node/server/app.d.ts +2 -1
- package/dist/node/server/app.d.ts.map +1 -1
- package/dist/node/server/index.d.ts +2 -0
- package/dist/node/server/index.d.ts.map +1 -1
- package/dist/node/server/routes/address/get/get.d.ts +1 -1
- package/dist/node/server/routes/address/get/get.d.ts.map +1 -1
- package/dist/node/server/routes/address/post/post.d.ts +1 -1
- package/dist/node/server/routes/address/post/post.d.ts.map +1 -1
- package/dist/node/server/routes/rewardRedemption/routeDefinitions/routes/claimRange.d.ts.map +1 -1
- package/dist/node/server/server.d.ts +2 -2
- package/dist/node/server/server.d.ts.map +1 -1
- package/package.json +21 -42
- package/src/RewardRedemptionActor.ts +1 -1
- package/src/manifest/getLocator.ts +4 -3
- package/src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts +3 -4
- package/src/modules/DerivedAddressWalletTransferSentinel/DerivedAddressWalletTransferSentinel.ts +3 -4
- package/src/server/app.ts +6 -16
- package/src/server/index.ts +2 -0
- package/src/server/routes/address/post/post.ts +1 -1
- package/src/server/routes/rewardRedemption/routeDefinitions/routes/claimRange.ts +8 -17
- package/src/server/routes/rewardRedemption/routeDefinitions/routes/redeem.ts +4 -4
- package/src/server/server.ts +5 -3
package/dist/node/index.mjs
CHANGED
|
@@ -3,8 +3,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
3
3
|
|
|
4
4
|
// src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts
|
|
5
5
|
import { assertEx, delay, isDefined, isUndefined, toAddress } from "@xylabs/sdk-js";
|
|
6
|
-
import { asSchema } from "@xyo-network/sdk-js";
|
|
7
|
-
import { AbstractSentinel } from "@xyo-network/sentinel-abstract";
|
|
6
|
+
import { AbstractSentinel, asSchema } from "@xyo-network/sdk-js";
|
|
8
7
|
import { asXL1BlockNumber, asXL1BlockRange, blockRangeSteps, completedStepRewardAddress, createTransferPayload, derivedReceiveAddress, flattenHydratedTransaction, flattenHydratedTransactions, isStepIdentityPayload, XYO_STEP_REWARD_ADDRESS } from "@xyo-network/xl1-sdk";
|
|
9
8
|
import { Mutex } from "async-mutex";
|
|
10
9
|
var ChainStepRewardsClaimSentinelConfigSchema = asSchema("network.xyo.sentinel.chain.step.rewards.claim.config", true);
|
|
@@ -186,8 +185,7 @@ var ChainStepRewardsClaimSentinel = class extends AbstractSentinel {
|
|
|
186
185
|
|
|
187
186
|
// src/modules/DerivedAddressWalletTransferSentinel/DerivedAddressWalletTransferSentinel.ts
|
|
188
187
|
import { AddressZod, assertEx as assertEx2, EthAddressZod, hexToBigInt, HexZod, isDefined as isDefined2, isUndefined as isUndefined2, toAddress as toAddress2, toHex } from "@xylabs/sdk-js";
|
|
189
|
-
import { asSchema as asSchema2 } from "@xyo-network/sdk-js";
|
|
190
|
-
import { AbstractSentinel as AbstractSentinel2 } from "@xyo-network/sentinel-abstract";
|
|
188
|
+
import { AbstractSentinel as AbstractSentinel2, asSchema as asSchema2 } from "@xyo-network/sdk-js";
|
|
191
189
|
import { createTransferPayload as createTransferPayload2, derivedReceiveAddress as derivedReceiveAddress2, flattenHydratedTransaction as flattenHydratedTransaction2, isEIP712DataPayload, isEIP712SignaturePayload, verifyEIP712Message, XL1BlockNumberZod } from "@xyo-network/xl1-sdk";
|
|
192
190
|
import z from "zod";
|
|
193
191
|
var DerivedAddressWalletTransferSentinelConfigSchema = asSchema2("network.xyo.sentinel.chain.derived.address.wallet.transfer.config", true);
|
|
@@ -297,9 +295,8 @@ import { creatable } from "@xylabs/sdk-js";
|
|
|
297
295
|
import { ActorV3, asHostActorConfigContext, XyoGatewayRunnerMoniker } from "@xyo-network/xl1-sdk";
|
|
298
296
|
|
|
299
297
|
// src/server/app.ts
|
|
300
|
-
import {
|
|
301
|
-
import
|
|
302
|
-
import cors from "cors";
|
|
298
|
+
import { standardErrors } from "@xylabs/express";
|
|
299
|
+
import { sharedMiddleware } from "@xyo-network/chain-orchestration";
|
|
303
300
|
import express2 from "express";
|
|
304
301
|
|
|
305
302
|
// src/server/instrumentation.ts
|
|
@@ -409,9 +406,8 @@ import { addRouteDefinitions } from "@xylabs/express";
|
|
|
409
406
|
// src/server/routes/rewardRedemption/routeDefinitions/routes/claimRange.ts
|
|
410
407
|
import { requestHandlerValidator } from "@xylabs/express";
|
|
411
408
|
import { assertEx as assertEx3, isDefined as isDefined4 } from "@xylabs/sdk-js";
|
|
412
|
-
import { PayloadBuilder as PayloadBuilder2, PayloadZodLoose } from "@xyo-network/sdk-js";
|
|
413
|
-
import {
|
|
414
|
-
import { asXL1BlockRange as asXL1BlockRange2, blockRangeSteps as blockRangeSteps2, buildJsonRpcProviderLocator, HttpRpcRemoteConfigZod, HttpRpcTransport, StepIdentitySchema, XyoViewerMoniker } from "@xyo-network/xl1-sdk";
|
|
409
|
+
import { asSentinelInstance, PayloadBuilder as PayloadBuilder2, PayloadZodLoose } from "@xyo-network/sdk-js";
|
|
410
|
+
import { asXL1BlockRange as asXL1BlockRange2, blockRangeSteps as blockRangeSteps2, StepIdentitySchema, XyoViewerMoniker } from "@xyo-network/xl1-sdk";
|
|
415
411
|
import { z as z2 } from "zod";
|
|
416
412
|
|
|
417
413
|
// src/server/routes/rewardRedemption/routeDefinitions/util/rewardableSteps.ts
|
|
@@ -444,14 +440,8 @@ var postClaimRange = {
|
|
|
444
440
|
method: "post",
|
|
445
441
|
path: "/rewards/claimRange",
|
|
446
442
|
handlers: validateRequest(async (req, res) => {
|
|
447
|
-
const {
|
|
443
|
+
const { locator, node } = req.app;
|
|
448
444
|
const { fromBlock, toBlock, step } = z2.parse(query, req.query);
|
|
449
|
-
const httpRpcConfig = HttpRpcRemoteConfigZod.safeParse(config.remote?.rpc);
|
|
450
|
-
const endpoint = assertEx3(httpRpcConfig.success ? assertEx3(httpRpcConfig.data.url, () => "RPC URL is required for gateway [no httpConfig]") : void 0, () => "RPC URL is required for gateway");
|
|
451
|
-
const transportFactory = /* @__PURE__ */ __name((schemas) => new HttpRpcTransport(endpoint, schemas), "transportFactory");
|
|
452
|
-
const locator = await buildJsonRpcProviderLocator({
|
|
453
|
-
transportFactory
|
|
454
|
-
});
|
|
455
445
|
const viewer = await locator.getInstance(XyoViewerMoniker);
|
|
456
446
|
const from = isDefined4(fromBlock) ? fromBlock : 0;
|
|
457
447
|
const currentBlock = await viewer.currentBlockNumber();
|
|
@@ -489,8 +479,7 @@ var postClaimRange = {
|
|
|
489
479
|
// src/server/routes/rewardRedemption/routeDefinitions/routes/redeem.ts
|
|
490
480
|
import { requestHandlerValidator as requestHandlerValidator2 } from "@xylabs/express";
|
|
491
481
|
import { assertEx as assertEx4 } from "@xylabs/sdk-js";
|
|
492
|
-
import { PayloadZodLoose as PayloadZodLoose2, PayloadZodStrictOfSchema } from "@xyo-network/sdk-js";
|
|
493
|
-
import { asSentinelInstance as asSentinelInstance2 } from "@xyo-network/sentinel-model";
|
|
482
|
+
import { asSentinelInstance as asSentinelInstance2, PayloadZodLoose as PayloadZodLoose2, PayloadZodStrictOfSchema } from "@xyo-network/sdk-js";
|
|
494
483
|
import { EIP712DataPayloadFieldsZod, EIP712DataPayloadSchema, EIP712SignaturePayloadFieldsZod, EIP712SignaturePayloadSchema } from "@xyo-network/xl1-sdk";
|
|
495
484
|
import { z as z3 } from "zod";
|
|
496
485
|
var body = z3.tuple([
|
|
@@ -541,22 +530,13 @@ var addRoutes = /* @__PURE__ */ __name((app) => {
|
|
|
541
530
|
}, "addRoutes");
|
|
542
531
|
|
|
543
532
|
// src/server/app.ts
|
|
544
|
-
var getApp = /* @__PURE__ */ __name((node, config) => {
|
|
533
|
+
var getApp = /* @__PURE__ */ __name((node, config, locator) => {
|
|
545
534
|
addInstrumentation();
|
|
546
535
|
const app = express2();
|
|
547
|
-
app
|
|
548
|
-
app.use(cors());
|
|
549
|
-
app.use(compression());
|
|
550
|
-
app.use(responseProfiler);
|
|
551
|
-
app.use(getJsonBodyParser(getJsonBodyParserOptions({
|
|
552
|
-
limit: "1mb"
|
|
553
|
-
})));
|
|
554
|
-
app.use(standardResponses);
|
|
555
|
-
disableExpressDefaultPoweredByHeader(app);
|
|
556
|
-
app.use(customPoweredByHeader);
|
|
557
|
-
disableCaseSensitiveRouting(app);
|
|
536
|
+
sharedMiddleware(app);
|
|
558
537
|
app.config = config;
|
|
559
538
|
app.node = node;
|
|
539
|
+
app.locator = locator;
|
|
560
540
|
addRoutes(app);
|
|
561
541
|
app.use(standardErrors);
|
|
562
542
|
return app;
|
|
@@ -572,9 +552,7 @@ import { isDefined as isDefined5 } from "@xylabs/sdk-js";
|
|
|
572
552
|
import { MongoDBArchivistV2 } from "@xyo-network/archivist-mongodb";
|
|
573
553
|
import { ViewArchivist } from "@xyo-network/archivist-view";
|
|
574
554
|
import { initTelemetry } from "@xyo-network/chain-telemetry";
|
|
575
|
-
import { AbstractModule, LoggerModuleStatusReporter } from "@xyo-network/
|
|
576
|
-
import { MemoryArchivist, ModuleFactoryLocator } from "@xyo-network/sdk-js";
|
|
577
|
-
import { MemorySentinel } from "@xyo-network/sentinel-memory";
|
|
555
|
+
import { AbstractModule, LoggerModuleStatusReporter, MemoryArchivist, MemorySentinel, ModuleFactoryLocator } from "@xyo-network/sdk-js";
|
|
578
556
|
import { hasMongoConfig } from "@xyo-network/xl1-sdk";
|
|
579
557
|
var getLocator = /* @__PURE__ */ __name(async (context, gateway) => {
|
|
580
558
|
const { config, logger } = context;
|
|
@@ -777,14 +755,14 @@ var getSeedPhrase = /* @__PURE__ */ __name(async (bios, config, logger) => {
|
|
|
777
755
|
}
|
|
778
756
|
return assertEx5(await bios.seedPhraseStore.get("os"), () => "Unable to acquire mnemonic from bios");
|
|
779
757
|
}, "getSeedPhrase");
|
|
780
|
-
var getServer = /* @__PURE__ */ __name(async (context, gateway, providedNode) => {
|
|
758
|
+
var getServer = /* @__PURE__ */ __name(async (context, gateway, locator, providedNode) => {
|
|
781
759
|
const { logger, config } = context;
|
|
782
760
|
const { port, mnemonic } = config;
|
|
783
761
|
const bios = await boot();
|
|
784
762
|
const seedPhrase = isDefined6(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
|
|
785
763
|
const wallet = await HDWallet.fromPhrase(seedPhrase);
|
|
786
764
|
const node = providedNode ?? await getNode(context, gateway, wallet);
|
|
787
|
-
const app = getApp(node, config);
|
|
765
|
+
const app = getApp(node, config, locator);
|
|
788
766
|
const server = app.listen(port, hostname, () => logger?.log(`[RewardsRedemption] Server listening at http://${hostname}:${port}`));
|
|
789
767
|
server.setTimeout(12e4);
|
|
790
768
|
return server;
|
|
@@ -821,7 +799,7 @@ var RewardRedemptionActor = class extends ActorV3 {
|
|
|
821
799
|
this.stopServer();
|
|
822
800
|
}
|
|
823
801
|
async startServer() {
|
|
824
|
-
this.server = await getServer(asHostActorConfigContext(this.context, true), this._gatewayRunner);
|
|
802
|
+
this.server = await getServer(asHostActorConfigContext(this.context, true), this._gatewayRunner, this.locator);
|
|
825
803
|
}
|
|
826
804
|
stopServer() {
|
|
827
805
|
this.server?.close();
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts","../../src/modules/DerivedAddressWalletTransferSentinel/DerivedAddressWalletTransferSentinel.ts","../../src/RewardRedemptionActor.ts","../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rewardRedemption/addRewardRoutes.ts","../../src/server/routes/rewardRedemption/routeDefinitions/routes/claimRange.ts","../../src/server/routes/rewardRedemption/routeDefinitions/util/rewardableSteps.ts","../../src/server/routes/rewardRedemption/routeDefinitions/routes/redeem.ts","../../src/server/routes/rewardRedemption/routeDefinitions/getRouteDefinitions.ts","../../src/server/routes/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 type { Attributes, Counter } from '@opentelemetry/api'\nimport type { Address } from '@xylabs/sdk-js'\nimport {\n assertEx, delay, isDefined, isUndefined, toAddress,\n} from '@xylabs/sdk-js'\nimport type { AnyConfigSchema, Payload } from '@xyo-network/sdk-js'\nimport { asSchema } from '@xyo-network/sdk-js'\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,\n XyoConnection, XyoGatewayRunner, XyoViewer,\n} from '@xyo-network/xl1-sdk'\nimport {\n asXL1BlockNumber, asXL1BlockRange, blockRangeSteps,\n completedStepRewardAddress, createTransferPayload, derivedReceiveAddress, flattenHydratedTransaction, flattenHydratedTransactions,\n isStepIdentityPayload, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\n\nexport const ChainStepRewardsClaimSentinelConfigSchema = asSchema('network.xyo.sentinel.chain.step.rewards.claim.config', true)\nexport type ChainStepRewardsClaimSentinelConfigSchema = typeof ChainStepRewardsClaimSentinelConfigSchema\n\n/**\n * The configuration for the chain step rewards claim sentinel\n */\nexport type ChainStepRewardsClaimSentinelConfig = SentinelConfig<{\n /**\n * Whether to claim steps even if there are no rewardees within the\n * step to claim. Defaults to false preventing rollovers of empty steps\n * as the nominal use case has rewardees present.\n */\n claimEmptySteps?: boolean\n /**\n * The schema for the chain step rewards claim sentinel config\n */\n schema: ChainStepRewardsClaimSentinelConfigSchema\n /**\n * The interval in milliseconds between checking for step rewards to claim\n */\n stepClaimIntervalMs: number\n}>\n\ninterface ChainStepRewardsClaimSentinelParamFields {\n gateway: XyoGatewayRunner\n}\n\nexport type ChainStepRewardsClaimSentinelParams<\n TConfig extends AnyConfigSchema<ChainStepRewardsClaimSentinelConfig> = AnyConfigSchema<ChainStepRewardsClaimSentinelConfig>,\n> = SentinelParams<TConfig> & ChainStepRewardsClaimSentinelParamFields\n\nconst defaultStepClaimIntervalMs = 15_000\n// const retryAttempts = 3\n// const retryDelayMs = 60_000\nconst scope = 'reward-escrow'\nconst RewardableSteps = [3, 4, 5, 6, 7, 8]\n\nexport class ChainStepRewardsClaimSentinel<\n TParams extends ChainStepRewardsClaimSentinelParams = ChainStepRewardsClaimSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [ChainStepRewardsClaimSentinelConfigSchema]\n static override readonly defaultConfigSchema = ChainStepRewardsClaimSentinelConfigSchema\n private _claimAttemptsCounter: Counter<Attributes> | undefined\n private _claimCheckCounter: Counter<Attributes> | undefined\n private _claimErrorCounter: Counter<Attributes> | undefined\n private _claimSuccessCounter: Counter<Attributes> | undefined\n private _connection: XyoConnection | undefined\n private _gateway: XyoGatewayRunner | undefined\n private _reportMutex = new Mutex()\n private _viewer: XyoViewer | undefined\n\n protected get connection(): XyoConnection {\n return assertEx(this._connection, () => 'Connection is not defined')\n }\n\n protected get gateway(): XyoGatewayRunner {\n return assertEx(this._gateway, () => 'Gateway is not defined')\n }\n\n protected get stepClaimIntervalMs(): number {\n return isDefined(this.config.stepClaimIntervalMs) ? this.config.stepClaimIntervalMs : defaultStepClaimIntervalMs\n }\n\n protected get viewer(): XyoViewer {\n return assertEx(this._viewer, () => 'Viewer is not defined')\n }\n\n override async createHandler() {\n await super.createHandler()\n // Create meters for tracking claim attempts, successes, and errors.\n this._claimAttemptsCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_attempts_total', { description: 'Number of claim attempts' })\n this._claimCheckCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_check_total', { description: 'Number of claim checks' })\n this._claimSuccessCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_success_total', { description: 'Number of claim successes' })\n this._claimErrorCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_errors_total', { description: 'Number of claim errors' })\n\n const gateway = assertEx(this.params.gateway, () => 'Gateway parameter is required')\n const connection = assertEx(gateway.connection, () => 'Gateway connection is required')\n const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')\n // this._gateway = withRetry(gateway, retryDelayMs, retryAttempts)\n // this._connection = withRetry(connection, retryDelayMs, retryAttempts)\n // this._viewer = withRetry(viewer, retryDelayMs, retryAttempts)\n this._gateway = gateway // withRetry(gateway, retryDelayMs, retryAttempts)\n this._connection = connection // withRetry(connection, retryDelayMs, retryAttempts)\n this._viewer = viewer // withRetry(viewer, retryDelayMs, retryAttempts)\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n if (this._reportMutex.isLocked()) {\n this.logger?.debug(`ChainRewardsClaimSentinel [${this.id}] is already running, skipping report [${Date.now()}]`)\n return []\n }\n return await this._reportMutex.runExclusive(async () => {\n const response: Payload[] = []\n if (isUndefined(payloads) || payloads.length === 0) {\n await this.claimAllSteps()\n } else {\n // Process provided payloads\n const stepIdentities = payloads\n .filter(isStepIdentityPayload)\n .map<StepIdentity>((p) => {\n const { step, block: blockNumber } = p\n const block = asXL1BlockNumber(blockNumber, { name: 'reportHandler' })\n return { step, block }\n }).filter(stepIdentity => RewardableSteps.includes(stepIdentity.step))\n for (const stepIdentity of stepIdentities) {\n const result = await this.claimStepIdentity(stepIdentity)\n if (isDefined(result)) response.push(...flattenHydratedTransaction(result))\n }\n }\n return response\n })\n }\n\n private calculateAddressDistributions(rewardsByStaker: Record<Address, bigint>, balance: AttoXL1): Record<Address, bigint> {\n const addressClaims: Record<Address, bigint> = {}\n const totalRewards = Object.values(rewardsByStaker).reduce((acc, val) => acc + val, 0n)\n for (const [staker, amount] of Object.entries(rewardsByStaker)) {\n // Ensure they have accrued an amount\n if (amount <= 0n) continue\n const reward = (balance * amount) / totalRewards\n // Ensure they earned a reward\n if (reward <= 0n) continue\n // Accumulate rewards by address\n const receiveAddress = derivedReceiveAddress(toAddress(staker), scope)\n addressClaims[receiveAddress] = reward\n }\n const totalClaimed = Object.values(addressClaims).reduce((acc, val) => acc + val, 0n)\n assertEx(totalClaimed <= balance, () => 'Total claimed exceeds claimable balance')\n const unclaimed = balance - totalClaimed\n if (unclaimed > 0n) {\n // Return anything unclaimed (due to truncation/rounding) to step rewards pool address\n addressClaims[XYO_STEP_REWARD_ADDRESS] = unclaimed\n }\n return addressClaims\n }\n\n private async claimAllSteps(): Promise<Payload[]> {\n // No payloads to process, just do claims since last run\n const results: SignedHydratedTransaction[] = []\n\n for (const step of RewardableSteps) {\n // Fetch unclaimed rewards and process claims\n const from = 0\n const to = await this.viewer.currentBlockNumber()\n const range = asXL1BlockRange([from, to], { name: 'claimAllSteps' })\n // For each rewardable step in range\n const stepIdentities = blockRangeSteps(range, [step])\n for (const stepIdentity of stepIdentities) {\n const result = await this.claimStepIdentity(stepIdentity)\n if (isDefined(result)) {\n results.push(result)\n }\n await delay(this.stepClaimIntervalMs)\n }\n }\n return flattenHydratedTransactions(results)\n }\n\n private async claimStepIdentity(stepIdentity: StepIdentity): Promise<SignedHydratedTransaction | undefined> {\n this.logger?.info(`Checking rewards to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`)\n const claimCounterAttributes = { step: stepIdentity.step.toString(), block: stepIdentity.block.toString() }\n try {\n this._claimCheckCounter?.add(1, claimCounterAttributes)\n // If wallet has balance\n const stepRewardAddress = completedStepRewardAddress(stepIdentity)\n const balance = await this.viewer.account.balance.accountBalance(stepRewardAddress)\n this.logger?.info(\n `Found balance of ${balance} to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`\n + ` in step reward address ${stepRewardAddress}`,\n )\n if (balance > 0n) {\n this._claimAttemptsCounter?.add(1, claimCounterAttributes)\n // For stakers\n const rewardsByStaker = await this.viewer.networkStakeStepRewardPoolRewards(stepIdentity)\n const rewardRecipients = Object.keys(rewardsByStaker).length\n this.logger?.info(\n `Found ${rewardRecipients} reward recipients for step ${stepIdentity.step} at block ${stepIdentity.block}`,\n )\n // If not configured to claim empty steps\n if (!this.config.claimEmptySteps) {\n // Ensure there are rewards recipients\n assertEx(rewardRecipients > 0, () => 'No reward recipients for step')\n }\n const addressDistributions = this.calculateAddressDistributions(rewardsByStaker, balance)\n this.logger?.info(\n `Calculated address distributions for step ${stepIdentity.step} at block ${stepIdentity.block}`\n + ` with ${Object.keys(addressDistributions).length} addresses`,\n )\n // Create single transaction for all claims\n const tx = await this.submitRewardDistributionTransaction(stepRewardAddress, addressDistributions, stepIdentity, this.gateway)\n this.logger?.info(`Claimed rewards for step ${stepIdentity.step} at block ${stepIdentity.block}`)\n this._claimSuccessCounter?.add(1, claimCounterAttributes)\n // Return submitted transaction\n return tx\n }\n } catch (error) {\n this._claimErrorCounter?.add(1, claimCounterAttributes)\n this.logger?.error(`Error claiming rewards for step ${stepIdentity.step} at block ${stepIdentity.block}:`, error)\n }\n }\n\n private async submitRewardDistributionTransaction(\n stepRewardAddress: Address,\n addressDistributions: Record<Address, bigint>,\n step: StepIdentity,\n gateway: XyoGatewayRunner,\n ): Promise<SignedHydratedTransaction | undefined> {\n // Create single transfer payload for all claims\n const transferPayload = createTransferPayload(stepRewardAddress, addressDistributions)\n transferPayload.context = { step }\n const currentBlockNumber = await this.viewer.currentBlockNumber()\n const result = await gateway.addPayloadsToChain?.([transferPayload], [], { nbf: currentBlockNumber, exp: asXL1BlockNumber(currentBlockNumber + 10) })\n if (isDefined(result)) return result[1]\n }\n}\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport type { Address } from '@xylabs/sdk-js'\nimport {\n AddressZod, assertEx, EthAddressZod, hexToBigInt, HexZod, isDefined, isUndefined,\n toAddress, toHex,\n} from '@xylabs/sdk-js'\nimport type { AnyConfigSchema, Payload } from '@xyo-network/sdk-js'\nimport { asSchema } from '@xyo-network/sdk-js'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport type {\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport type {\n SignedHydratedTransaction, XL1BlockNumber, XyoGatewayRunner,\n} from '@xyo-network/xl1-sdk'\nimport {\n createTransferPayload,\n derivedReceiveAddress, flattenHydratedTransaction, isEIP712DataPayload, isEIP712SignaturePayload,\n verifyEIP712Message, XL1BlockNumberZod,\n} from '@xyo-network/xl1-sdk'\nimport z from 'zod'\n\nexport const DerivedAddressWalletTransferSentinelConfigSchema = asSchema('network.xyo.sentinel.chain.derived.address.wallet.transfer.config', true)\nexport type DerivedAddressWalletTransferSentinelConfigSchema = typeof DerivedAddressWalletTransferSentinelConfigSchema\n\n/**\n * The configuration for the derived address wallet transfer sentinel\n */\nexport type DerivedAddressWalletTransferSentinelConfig = SentinelConfig<{\n /**\n * The schema for the derived address wallet transfer sentinel config\n */\n schema: DerivedAddressWalletTransferSentinelConfigSchema\n}>\n\nexport interface DerivedAddressWalletTransferSentinelParamFields {\n gateway: XyoGatewayRunner\n}\n\nexport type DerivedAddressWalletTransferSentinelParams<\n TConfig extends AnyConfigSchema<DerivedAddressWalletTransferSentinelConfig> = AnyConfigSchema<DerivedAddressWalletTransferSentinelConfig>,\n> = SentinelParams<TConfig> & DerivedAddressWalletTransferSentinelParamFields\n\nconst scope = 'reward-escrow'\n\ninterface ParsedClaimValues {\n amount: string\n // chainId: ChainId\n exp: XL1BlockNumber\n from: Address\n nbf: XL1BlockNumber\n to: Address\n}\n\n// Assuming EthAddress and Hex are string-like (typical case)\nexport const ConfirmedClaimValuesZod = z.object({\n 'From': EthAddressZod,\n 'To XL1 Address': AddressZod,\n 'XL1 Amount': z.string(),\n 'XL1 Amount (Hex)': HexZod, // Hex\n 'XL1 Not after block': XL1BlockNumberZod,\n 'XL1 Not before block': XL1BlockNumberZod,\n})\n\nexport type ConfirmedClaimValues = z.infer<typeof ConfirmedClaimValuesZod>\n\nconst parseConfirmedClaimValues = (values: ConfirmedClaimValues): ParsedClaimValues => {\n return {\n amount: values['XL1 Amount (Hex)'],\n exp: values['XL1 Not after block'],\n from: toAddress(values.From),\n nbf: values['XL1 Not before block'],\n to: toAddress(values['To XL1 Address']),\n }\n}\n\nexport class DerivedAddressWalletTransferSentinel<\n TParams extends DerivedAddressWalletTransferSentinelParams = DerivedAddressWalletTransferSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [DerivedAddressWalletTransferSentinelConfigSchema]\n static override readonly defaultConfigSchema = DerivedAddressWalletTransferSentinelConfigSchema\n private _transferAttemptsCounter: Counter<Attributes> | undefined\n private _transferErrorCounter: Counter<Attributes> | undefined\n private _transferSuccessCounter: Counter<Attributes> | undefined\n\n protected get gateway(): XyoGatewayRunner {\n return this.params.gateway\n }\n\n override async createHandler() {\n await super.createHandler()\n // Create meters for tracking claim attempts, successes, and errors.\n this._transferAttemptsCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_attempts_total',\n { description: 'Number of transfer attempts' },\n )\n this._transferSuccessCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_success_total',\n { description: 'Number of transfer successes' },\n )\n this._transferErrorCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_errors_total',\n { description: 'Number of transfer errors' },\n )\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n const data = payloads?.find(x => isEIP712DataPayload(x))\n const signature = payloads?.find(x => isEIP712SignaturePayload(x))\n if (isUndefined(data) || isUndefined(signature)) return []\n this._transferAttemptsCounter?.add(1)\n const valid = await verifyEIP712Message(data, signature)\n if (!valid) {\n this._transferErrorCounter?.add(1)\n throw new Error('Invalid EIP712 signature')\n }\n const values = ConfirmedClaimValuesZod.parse(data.values)\n const parsed = parseConfirmedClaimValues(values)\n const signatureAddress = toAddress(signature.address)\n const parsedAddress = toAddress(parsed.from)\n if (signatureAddress === parsedAddress) {\n const tx = await this.submitRewardDistributionTransaction(parsed)\n if (isDefined(tx)) {\n this._transferSuccessCounter?.add(1)\n return flattenHydratedTransaction(tx)\n }\n }\n this._transferErrorCounter?.add(1)\n return []\n }\n\n protected submitRewardDistributionTransaction = async (claimValues: ParsedClaimValues): Promise<SignedHydratedTransaction | undefined> => {\n const {\n amount, from: address, to, nbf, exp,\n } = claimValues\n // Ensure necessary gateway pre-requisites are met\n const signer = assertEx(this.gateway.signer, () => 'Signer is not defined in gateway')\n const signerAddress = await signer.address()\n const connection = this.gateway.connection\n const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')\n\n // TODO: Validate chainId against supplied in ClaimValues to prevent replay attacks\n // const chainId = await viewer.chainId()\n\n // Ensure the transaction is within the valid block range\n const currentBlock = await viewer.currentBlockNumber()\n if (currentBlock < nbf || currentBlock > exp) throw new Error('Transaction is not within a valid block range')\n\n // Parse the signer's address\n const escrowAccount = derivedReceiveAddress(address, scope)\n\n // Ensure the escrow account has sufficient balance\n const balance = await viewer.account.balance.accountBalance(escrowAccount)\n // MEMO: Currently we require the full amount to be redeemed from the escrow account. We do\n // not allow partial escrow redemptions.\n const redemptionAmount = hexToBigInt(toHex(amount))\n assertEx(balance === redemptionAmount, () => 'Insufficient balance in escrow account')\n\n // Ensure we have enough allowance to transfer from the escrow account\n const allowance = await viewer.account.balance.accountBalance(signerAddress)\n assertEx(allowance > 1000n, () => 'Insufficient allowance to transfer from escrow account')\n\n // Create the transfer payload\n const transferPayload = createTransferPayload(escrowAccount, { [to]: hexToBigInt(toHex(amount)) })\n // Add required validation context\n transferPayload.context = { address, scope }\n const chain = await viewer.chainId()\n const result = await this.gateway.addPayloadsToChain?.([transferPayload], [], {\n chain, nbf, exp,\n })\n if (isDefined(result)) return result[1]\n }\n}\n","import { Server } from 'node:http'\n\nimport { creatable } from '@xylabs/sdk-js'\nimport { RewardRedemptionConfig } from '@xyo-network/chain-orchestration'\nimport {\n ActorParamsV3,\n ActorV3,\n asHostActorConfigContext,\n XyoGatewayRunner,\n XyoGatewayRunnerMoniker,\n} from '@xyo-network/xl1-sdk'\n\nimport { getServer } from './server/index.ts'\n\nexport type RewardRedemptionActorParams = ActorParamsV3<{\n config: RewardRedemptionConfig\n}>\n\n@creatable()\nexport class RewardRedemptionActor extends ActorV3<RewardRedemptionActorParams> {\n protected _gatewayRunner!: XyoGatewayRunner\n private server?: Server\n\n protected get gatewayRunner() {\n return this._gatewayRunner\n }\n\n override async createHandler() {\n await super.createHandler()\n this._gatewayRunner = await this.locator.getInstance(XyoGatewayRunnerMoniker)\n }\n\n override async startHandler() {\n await super.startHandler()\n this.stopServer()\n await this.startServer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopServer()\n }\n\n private async startServer() {\n this.server = await getServer(asHostActorConfigContext(this.context, true), this._gatewayRunner)\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","import {\n customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler,\n standardErrors, standardResponses,\n} from '@xylabs/express'\nimport type { RewardRedemptionConfig } from '@xyo-network/chain-orchestration'\nimport type { NodeInstance } from '@xyo-network/sdk-js'\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: RewardRedemptionConfig): 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, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, ModuleIdentifier,\n NextOptions, NodeInstance, Payload,\n} from '@xyo-network/sdk-js'\nimport {\n asArchivistInstance, isAnyPayload, isSequence, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n } else {\n res.status(404).send()\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app\n const archivistModuleIdentifier = 'Data'\n app.use('/data', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { addRouteDefinitions } from '@xylabs/express'\nimport type { Express } from 'express'\n\nimport { getRouteDefinitions } from './routeDefinitions/index.ts'\n\nexport const addRewardRedemptionRoutes = (app: Express) => {\n const routeDefinitions = getRouteDefinitions()\n addRouteDefinitions(app, routeDefinitions)\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { NodeInstance, Payload } from '@xyo-network/sdk-js'\nimport { PayloadBuilder, PayloadZodLoose } from '@xyo-network/sdk-js'\nimport type { SentinelInstance } from '@xyo-network/sentinel-model'\nimport { asSentinelInstance } from '@xyo-network/sentinel-model'\nimport type {\n RpcSchemaMap, StepIdentityPayload, TransportFactory, XyoViewer,\n} from '@xyo-network/xl1-sdk'\nimport {\n asXL1BlockRange, blockRangeSteps, buildJsonRpcProviderLocator,\n HttpRpcRemoteConfigZod,\n HttpRpcTransport,\n StepIdentitySchema, XyoViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { z } from 'zod'\n\nimport { RewardableSteps } from '../util/index.ts'\n\nconst query = z.object({\n fromBlock: z.coerce.number().int().nonnegative().optional(),\n toBlock: z.coerce.number().int().nonnegative().optional(),\n step: z.coerce.number().int().nonnegative().min(Math.min(...RewardableSteps)).max(Math.max(...RewardableSteps)).optional().default(3),\n})\nconst response = z.array(PayloadZodLoose)\n\nconst validateRequest = requestHandlerValidator({ query, response })\n\nconst getChainStepRewardsClaimSentinel = async (node: NodeInstance): Promise<SentinelInstance> => {\n const mod = await node.resolve('XYORewardRedemptionNode:ChainStepRewardsClaimSentinel')\n const sentinel = asSentinelInstance(mod)\n return assertEx(sentinel, () => 'ChainStepRewardsClaimSentinel not found on node')\n}\n\nexport const postClaimRange: RouteDefinition = {\n method: 'post',\n path: '/rewards/claimRange',\n handlers: validateRequest(async (req, res) => {\n const { config, node } = req.app\n const {\n fromBlock, toBlock, step,\n } = z.parse(query, req.query)\n const httpRpcConfig = HttpRpcRemoteConfigZod.safeParse(config.remote?.rpc)\n const endpoint = assertEx(\n httpRpcConfig.success ? assertEx(httpRpcConfig.data.url, () => 'RPC URL is required for gateway [no httpConfig]') : undefined,\n () => 'RPC URL is required for gateway',\n )\n const transportFactory: TransportFactory = (schemas: RpcSchemaMap) => new HttpRpcTransport(endpoint, schemas)\n const locator = await buildJsonRpcProviderLocator({ transportFactory })\n const viewer = await locator.getInstance<XyoViewer>(XyoViewerMoniker)\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 = asXL1BlockRange([from, to], { name: 'claimRange' })\n // For each rewardable step in range\n const stepIdentities = blockRangeSteps(range, [step])\n const results: Payload[] = []\n for (const stepIdentity of stepIdentities) {\n const mod = await getChainStepRewardsClaimSentinel(node)\n const stepIdentityPayload = new PayloadBuilder<StepIdentityPayload>({ schema: StepIdentitySchema }).fields(stepIdentity).build()\n const result = await mod.report([stepIdentityPayload])\n results.push(...result)\n }\n res.status(200)\n res.json(results)\n }),\n}\n","export const RewardableSteps = [3, 4, 5, 6, 7, 8]\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { NodeInstance } from '@xyo-network/sdk-js'\nimport { PayloadZodLoose, PayloadZodStrictOfSchema } from '@xyo-network/sdk-js'\nimport type { SentinelInstance } from '@xyo-network/sentinel-model'\nimport { asSentinelInstance } from '@xyo-network/sentinel-model'\nimport {\n EIP712DataPayloadFieldsZod, EIP712DataPayloadSchema, EIP712SignaturePayloadFieldsZod,\n EIP712SignaturePayloadSchema,\n} from '@xyo-network/xl1-sdk'\nimport { z } from 'zod'\n\nconst body = z.tuple([\n PayloadZodStrictOfSchema(EIP712DataPayloadSchema).extend(EIP712DataPayloadFieldsZod.shape),\n PayloadZodStrictOfSchema(EIP712SignaturePayloadSchema).extend(EIP712SignaturePayloadFieldsZod.shape),\n])\n\nconst response = z.array(PayloadZodLoose)\nconst validateRequest = requestHandlerValidator({\n body,\n response,\n})\n\nconst getDerivedAddressWalletTransferSentinel = async (node: NodeInstance): Promise<SentinelInstance> => {\n const mod = await node.resolve('XYORewardRedemptionNode:DerivedAddressWalletTransferSentinel')\n const sentinel = asSentinelInstance(mod)\n return assertEx(sentinel, () => 'DerivedAddressWalletTransferSentinel not found on node')\n}\n\nexport const postRedeem: RouteDefinition = {\n method: 'post',\n path: '/rewards/redeem',\n handlers: validateRequest(async (req, res) => {\n const { node } = req.app\n const { body } = req\n const sentinel = await getDerivedAddressWalletTransferSentinel(node)\n const result = await sentinel.report(body)\n res.status(200)\n res.json(result)\n }),\n}\n","import type { RouteDefinition } from '@xylabs/express'\n\nimport { postClaimRange, postRedeem } from './routes/index.ts'\n\nexport const getRouteDefinitions = (): RouteDefinition[] => {\n return [\n postClaimRange,\n postRedeem,\n ]\n}\n","import type { Express } from 'express'\n\nimport { 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 type { Logger } from '@xylabs/sdk-js'\nimport {\n assertEx, isDefined, isString,\n} from '@xylabs/sdk-js'\nimport { boot } from '@xyo-network/bios'\nimport type { BiosExternalInterface } from '@xyo-network/bios-model'\nimport type { RewardRedemptionConfig } from '@xyo-network/chain-orchestration'\nimport type { NodeInstance } from '@xyo-network/sdk-js'\nimport { HDWallet } from '@xyo-network/sdk-js'\nimport type { HostActorConfigContext, XyoGatewayRunner } from '@xyo-network/xl1-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: RewardRedemptionConfig, logger?: Logger): Promise<string> => {\n const storedSeedPhrase = await bios.seedPhraseStore.get('os')\n logger?.debug(`[RewardsRedemption] Stored mnemonic: ${storedSeedPhrase}`)\n const { mnemonic } = config\n if (isString(storedSeedPhrase) && isString(mnemonic)) {\n logger?.warn('[RewardsRedemption] 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('[RewardsRedemption] No mnemonic provided, using random mnemonic. This is not recommended for production use.')\n logger?.log(`[RewardsRedemption] 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\nexport const getServer = async (context: HostActorConfigContext, gateway: XyoGatewayRunner, providedNode?: NodeInstance) => {\n const { logger, config } = context\n const { port, mnemonic } = config\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 node = providedNode ?? await getNode(context, gateway, wallet)\n const app = getApp(node, config)\n const server = app.listen(port, hostname, () => logger?.log(`[RewardsRedemption] Server listening at http://${hostname}:${port}`))\n server.setTimeout(120_000)\n return server\n}\n","import { type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'\nimport { isDefined } from '@xylabs/sdk-js'\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 type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'\nimport { MemoryArchivist, ModuleFactoryLocator } from '@xyo-network/sdk-js'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport type { BaseConfigContext, XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport { hasMongoConfig } from '@xyo-network/xl1-sdk'\n\nimport type { ChainStepRewardsClaimSentinelParams, DerivedAddressWalletTransferSentinelParams } from '../modules/index.ts'\nimport { ChainStepRewardsClaimSentinel, DerivedAddressWalletTransferSentinel } from '../modules/index.ts'\n\n/**\n * Used for retrieving a locator with the necessary modules registered for testing\n * operation of the node (entirely in memory)\n * @returns A locator with the necessary modules registered\n */\nexport const getLocator = async (context: BaseConfigContext, gateway: XyoGatewayRunner) => {\n const { config, logger } = context\n const { otlpEndpoint } = config.telemetry?.otel ?? {}\n const { path: endpoint = '/metrics', port: port = 9467 } = config.telemetry?.metrics?.scrape ?? {}\n const { traceProvider, meterProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-reward-redemption',\n serviceVersion: '1.0.0',\n },\n otlpEndpoint,\n metricsConfig: { endpoint, port },\n })\n\n if (isDefined(logger)) AbstractModule.defaultLogger = logger\n const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined\n\n const locator = new ModuleFactoryLocator()\n // If there's a MongoDB configuration\n const mongoConfig = config.storage?.mongo\n if (hasMongoConfig(mongoConfig)) {\n // Create the MongoDB SDK from the configuration\n const {\n connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName,\n } = mongoConfig\n const payloadSdkConfig: BaseMongoSdkPrivateConfig = {\n dbConnectionString, dbDomain, dbName, dbPassword, dbUserName,\n }\n const params: Partial<MongoDBModuleParamsV2> = {\n meterProvider, payloadSdkConfig, statusReporter, traceProvider,\n }\n // Register the MongoDB Archivist as the default\n locator.register(MongoDBArchivistV2.factory(params), undefined, true)\n }\n\n locator.register(MemoryArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(MemorySentinel.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(ViewArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n // const gateway = await getGateway(config)\n const chainStepRewardsClaimSentinelParams: Partial<ChainStepRewardsClaimSentinelParams> = {\n gateway, traceProvider, meterProvider, statusReporter,\n }\n locator.register(ChainStepRewardsClaimSentinel.factory(chainStepRewardsClaimSentinelParams))\n const derivedAddressWalletTransferSentinelParams: Partial<DerivedAddressWalletTransferSentinelParams> = {\n gateway, traceProvider, meterProvider, statusReporter,\n }\n locator.register(DerivedAddressWalletTransferSentinel.factory(derivedAddressWalletTransferSentinelParams))\n return locator\n}\n\n// const getGateway = async (config: Config): Promise<XyoGatewayRunner | undefined> => {\n// const { mnemonic, chainRpcApiUrl } = config.actors.rewardRedemption\n\n// // Create locator\n// const transportFactory: TransportFactory = (schemas: RpcSchemaMap) => new HttpRpcTransport(chainRpcApiUrl, schemas)\n// const locator = await buildJsonRpcProviderLocator({ transportFactory })\n\n// // Register signer\n// const phrase = mnemonic ?? HDWallet.generateMnemonic()\n// const wallet = await generateXyoBaseWalletFromPhrase(phrase)\n// const account = await wallet.derivePath(ADDRESS_INDEX.XYO)\n// locator.register(SimpleXyoSigner.factory<SimpleXyoSigner>(SimpleXyoSigner.dependencies, { account }))\n// locator.register(SimpleXyoGatewayRunner.factory<SimpleXyoGatewayRunner>(SimpleXyoGatewayRunner.dependencies, {}))\n\n// // Use locator to get gateway\n// const gateway = await locator.getInstance<SimpleXyoGatewayRunner>(SimpleXyoGatewayRunner.defaultMoniker)\n// return gateway\n// }\n","import type { Logger } from '@xylabs/sdk-js'\nimport { ManifestWrapper } from '@xyo-network/sdk-js'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BaseConfigContext,\n Config, XyoGatewayRunner,\n} from '@xyo-network/xl1-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: BaseConfigContext, gateway: XyoGatewayRunner, wallet: WalletInstance) => {\n const locator = await getLocator(context, gateway)\n const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)\n const [node, ...childNodes] = await wrapper.loadNodes()\n if (childNodes?.length > 0) {\n await Promise.all(childNodes.map(childNode => node.register(childNode)))\n await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))\n }\n return node\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"44'/60'/1\",\n \"name\": \"XYORewardRedemptionNode\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"name\": \"DataPrivate\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"reward_redemption_api_datalake\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/2'\",\n \"name\": \"ChainStepRewardsClaimSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.step.rewards.claim.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/3'\",\n \"automations\": [\n {\n \"frequency\": 60000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"ChainRewardsClaimIntervalSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"ChainStepRewardsClaimSentinel\",\n \"endPoint\": \"report\"\n }\n ]\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/4'\",\n \"name\": \"DerivedAddressWalletTransferSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.derived.address.wallet.transfer.config\"\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"Data\",\n \"allowedQueries\": [\n \"network.xyo.query.archivist.get\",\n \"network.xyo.query.archivist.next\"\n ],\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"originArchivist\": \"DataPrivate\",\n \"schema\": \"network.xyo.archivist.view.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { PackageManifestPayload } from '@xyo-network/sdk-js'\n\nimport node from './node.json' with { type: 'json' }\n\n/**\n * Root Node Manifest\n */\nexport const NodeManifest = node as unknown as PackageManifestPayload\n","/**\n * Private Child Manifests\n */\nexport const PrivateChildManifests = []\n","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/sdk-js'\n\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = []\n"],"mappings":"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","names":["assertEx","delay","isDefined","isUndefined","toAddress","asSchema","AbstractSentinel","asXL1BlockNumber","asXL1BlockRange","blockRangeSteps","completedStepRewardAddress","createTransferPayload","derivedReceiveAddress","flattenHydratedTransaction","flattenHydratedTransactions","isStepIdentityPayload","XYO_STEP_REWARD_ADDRESS","Mutex","ChainStepRewardsClaimSentinelConfigSchema","asSchema","defaultStepClaimIntervalMs","scope","RewardableSteps","ChainStepRewardsClaimSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_claimAttemptsCounter","_claimCheckCounter","_claimErrorCounter","_claimSuccessCounter","_connection","_gateway","_reportMutex","Mutex","_viewer","connection","assertEx","gateway","stepClaimIntervalMs","isDefined","config","viewer","createHandler","meter","createCounter","description","params","reportHandler","payloads","isLocked","logger","debug","id","Date","now","runExclusive","response","isUndefined","length","claimAllSteps","stepIdentities","filter","isStepIdentityPayload","map","p","step","block","blockNumber","asXL1BlockNumber","name","stepIdentity","includes","result","claimStepIdentity","push","flattenHydratedTransaction","calculateAddressDistributions","rewardsByStaker","balance","addressClaims","totalRewards","Object","values","reduce","acc","val","staker","amount","entries","reward","receiveAddress","derivedReceiveAddress","toAddress","totalClaimed","unclaimed","XYO_STEP_REWARD_ADDRESS","results","from","to","currentBlockNumber","range","asXL1BlockRange","blockRangeSteps","delay","flattenHydratedTransactions","info","claimCounterAttributes","toString","add","stepRewardAddress","completedStepRewardAddress","account","accountBalance","networkStakeStepRewardPoolRewards","rewardRecipients","keys","claimEmptySteps","addressDistributions","tx","submitRewardDistributionTransaction","error","transferPayload","createTransferPayload","context","addPayloadsToChain","nbf","exp","AddressZod","assertEx","EthAddressZod","hexToBigInt","HexZod","isDefined","isUndefined","toAddress","toHex","asSchema","AbstractSentinel","createTransferPayload","derivedReceiveAddress","flattenHydratedTransaction","isEIP712DataPayload","isEIP712SignaturePayload","verifyEIP712Message","XL1BlockNumberZod","z","DerivedAddressWalletTransferSentinelConfigSchema","asSchema","scope","ConfirmedClaimValuesZod","z","object","EthAddressZod","AddressZod","string","HexZod","XL1BlockNumberZod","parseConfirmedClaimValues","values","amount","exp","from","toAddress","From","nbf","to","DerivedAddressWalletTransferSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_transferAttemptsCounter","_transferErrorCounter","_transferSuccessCounter","gateway","params","createHandler","meter","createCounter","description","reportHandler","payloads","data","find","x","isEIP712DataPayload","signature","isEIP712SignaturePayload","isUndefined","add","valid","verifyEIP712Message","Error","parse","parsed","signatureAddress","address","parsedAddress","tx","submitRewardDistributionTransaction","isDefined","flattenHydratedTransaction","claimValues","signer","assertEx","signerAddress","connection","viewer","currentBlock","currentBlockNumber","escrowAccount","derivedReceiveAddress","balance","account","accountBalance","redemptionAmount","hexToBigInt","toHex","allowance","transferPayload","createTransferPayload","context","chain","chainId","result","addPayloadsToChain","creatable","ActorV3","asHostActorConfigContext","XyoGatewayRunnerMoniker","customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","setRawResponseFormat","asHash","isDefined","asArchivistInstance","isAnyPayload","isSequence","PayloadBuilder","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","addRouteDefinitions","requestHandlerValidator","assertEx","isDefined","PayloadBuilder","PayloadZodLoose","asSentinelInstance","asXL1BlockRange","blockRangeSteps","buildJsonRpcProviderLocator","HttpRpcRemoteConfigZod","HttpRpcTransport","StepIdentitySchema","XyoViewerMoniker","z","RewardableSteps","query","z","object","fromBlock","coerce","number","int","nonnegative","optional","toBlock","step","min","Math","RewardableSteps","max","default","response","array","PayloadZodLoose","validateRequest","requestHandlerValidator","getChainStepRewardsClaimSentinel","node","mod","resolve","sentinel","asSentinelInstance","assertEx","postClaimRange","method","path","handlers","req","res","config","app","parse","httpRpcConfig","HttpRpcRemoteConfigZod","safeParse","remote","rpc","endpoint","success","data","url","undefined","transportFactory","schemas","HttpRpcTransport","locator","buildJsonRpcProviderLocator","viewer","getInstance","XyoViewerMoniker","from","isDefined","currentBlock","currentBlockNumber","to","status","json","range","asXL1BlockRange","name","stepIdentities","blockRangeSteps","results","stepIdentity","stepIdentityPayload","PayloadBuilder","schema","StepIdentitySchema","fields","build","result","report","push","requestHandlerValidator","assertEx","PayloadZodLoose","PayloadZodStrictOfSchema","asSentinelInstance","EIP712DataPayloadFieldsZod","EIP712DataPayloadSchema","EIP712SignaturePayloadFieldsZod","EIP712SignaturePayloadSchema","z","body","z","tuple","PayloadZodStrictOfSchema","EIP712DataPayloadSchema","extend","EIP712DataPayloadFieldsZod","shape","EIP712SignaturePayloadSchema","EIP712SignaturePayloadFieldsZod","response","array","PayloadZodLoose","validateRequest","requestHandlerValidator","getDerivedAddressWalletTransferSentinel","node","mod","resolve","sentinel","asSentinelInstance","assertEx","postRedeem","method","path","handlers","req","res","app","result","report","status","json","getRouteDefinitions","postClaimRange","postRedeem","addRewardRedemptionRoutes","app","routeDefinitions","getRouteDefinitions","addRouteDefinitions","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","MongoDBArchivistV2","ViewArchivist","initTelemetry","AbstractModule","LoggerModuleStatusReporter","MemoryArchivist","ModuleFactoryLocator","MemorySentinel","hasMongoConfig","getLocator","context","gateway","config","logger","otlpEndpoint","telemetry","otel","path","endpoint","port","metrics","scrape","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","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","chainStepRewardsClaimSentinelParams","ChainStepRewardsClaimSentinel","derivedAddressWalletTransferSentinelParams","DerivedAddressWalletTransferSentinel","ManifestWrapper","NodeManifest","node","PrivateChildManifests","PublicChildManifests","getNode","context","gateway","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","isString","warn","set","seedPhrase","HDWallet","generateMnemonic","log","assertEx","getServer","context","gateway","providedNode","port","boot","isDefined","wallet","fromPhrase","node","getNode","app","getApp","server","listen","setTimeout","RewardRedemptionActor","ActorV3","_gatewayRunner","server","gatewayRunner","createHandler","locator","getInstance","XyoGatewayRunnerMoniker","startHandler","stopServer","startServer","stopHandler","getServer","asHostActorConfigContext","context","close","undefined"]}
|
|
1
|
+
{"version":3,"sources":["../../src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts","../../src/modules/DerivedAddressWalletTransferSentinel/DerivedAddressWalletTransferSentinel.ts","../../src/RewardRedemptionActor.ts","../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rewardRedemption/addRewardRoutes.ts","../../src/server/routes/rewardRedemption/routeDefinitions/routes/claimRange.ts","../../src/server/routes/rewardRedemption/routeDefinitions/util/rewardableSteps.ts","../../src/server/routes/rewardRedemption/routeDefinitions/routes/redeem.ts","../../src/server/routes/rewardRedemption/routeDefinitions/getRouteDefinitions.ts","../../src/server/routes/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 type { Attributes, Counter } from '@opentelemetry/api'\nimport type { Address } from '@xylabs/sdk-js'\nimport {\n assertEx, delay, isDefined, isUndefined, toAddress,\n} from '@xylabs/sdk-js'\nimport type {\n AnyConfigSchema, Payload,\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sdk-js'\nimport { AbstractSentinel, asSchema } from '@xyo-network/sdk-js'\nimport type {\n AttoXL1, SignedHydratedTransaction, StepIdentity,\n XyoConnection, XyoGatewayRunner, XyoViewer,\n} from '@xyo-network/xl1-sdk'\nimport {\n asXL1BlockNumber, asXL1BlockRange, blockRangeSteps,\n completedStepRewardAddress, createTransferPayload, derivedReceiveAddress, flattenHydratedTransaction, flattenHydratedTransactions,\n isStepIdentityPayload, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\n\nexport const ChainStepRewardsClaimSentinelConfigSchema = asSchema('network.xyo.sentinel.chain.step.rewards.claim.config', true)\nexport type ChainStepRewardsClaimSentinelConfigSchema = typeof ChainStepRewardsClaimSentinelConfigSchema\n\n/**\n * The configuration for the chain step rewards claim sentinel\n */\nexport type ChainStepRewardsClaimSentinelConfig = SentinelConfig<{\n /**\n * Whether to claim steps even if there are no rewardees within the\n * step to claim. Defaults to false preventing rollovers of empty steps\n * as the nominal use case has rewardees present.\n */\n claimEmptySteps?: boolean\n /**\n * The schema for the chain step rewards claim sentinel config\n */\n schema: ChainStepRewardsClaimSentinelConfigSchema\n /**\n * The interval in milliseconds between checking for step rewards to claim\n */\n stepClaimIntervalMs: number\n}>\n\ninterface ChainStepRewardsClaimSentinelParamFields {\n gateway: XyoGatewayRunner\n}\n\nexport type ChainStepRewardsClaimSentinelParams<\n TConfig extends AnyConfigSchema<ChainStepRewardsClaimSentinelConfig> = AnyConfigSchema<ChainStepRewardsClaimSentinelConfig>,\n> = SentinelParams<TConfig> & ChainStepRewardsClaimSentinelParamFields\n\nconst defaultStepClaimIntervalMs = 15_000\n// const retryAttempts = 3\n// const retryDelayMs = 60_000\nconst scope = 'reward-escrow'\nconst RewardableSteps = [3, 4, 5, 6, 7, 8]\n\nexport class ChainStepRewardsClaimSentinel<\n TParams extends ChainStepRewardsClaimSentinelParams = ChainStepRewardsClaimSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [ChainStepRewardsClaimSentinelConfigSchema]\n static override readonly defaultConfigSchema = ChainStepRewardsClaimSentinelConfigSchema\n private _claimAttemptsCounter: Counter<Attributes> | undefined\n private _claimCheckCounter: Counter<Attributes> | undefined\n private _claimErrorCounter: Counter<Attributes> | undefined\n private _claimSuccessCounter: Counter<Attributes> | undefined\n private _connection: XyoConnection | undefined\n private _gateway: XyoGatewayRunner | undefined\n private _reportMutex = new Mutex()\n private _viewer: XyoViewer | undefined\n\n protected get connection(): XyoConnection {\n return assertEx(this._connection, () => 'Connection is not defined')\n }\n\n protected get gateway(): XyoGatewayRunner {\n return assertEx(this._gateway, () => 'Gateway is not defined')\n }\n\n protected get stepClaimIntervalMs(): number {\n return isDefined(this.config.stepClaimIntervalMs) ? this.config.stepClaimIntervalMs : defaultStepClaimIntervalMs\n }\n\n protected get viewer(): XyoViewer {\n return assertEx(this._viewer, () => 'Viewer is not defined')\n }\n\n override async createHandler() {\n await super.createHandler()\n // Create meters for tracking claim attempts, successes, and errors.\n this._claimAttemptsCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_attempts_total', { description: 'Number of claim attempts' })\n this._claimCheckCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_check_total', { description: 'Number of claim checks' })\n this._claimSuccessCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_success_total', { description: 'Number of claim successes' })\n this._claimErrorCounter = this.meter?.createCounter('chain_step_rewards_claim_sentinel_errors_total', { description: 'Number of claim errors' })\n\n const gateway = assertEx(this.params.gateway, () => 'Gateway parameter is required')\n const connection = assertEx(gateway.connection, () => 'Gateway connection is required')\n const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')\n // this._gateway = withRetry(gateway, retryDelayMs, retryAttempts)\n // this._connection = withRetry(connection, retryDelayMs, retryAttempts)\n // this._viewer = withRetry(viewer, retryDelayMs, retryAttempts)\n this._gateway = gateway // withRetry(gateway, retryDelayMs, retryAttempts)\n this._connection = connection // withRetry(connection, retryDelayMs, retryAttempts)\n this._viewer = viewer // withRetry(viewer, retryDelayMs, retryAttempts)\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n if (this._reportMutex.isLocked()) {\n this.logger?.debug(`ChainRewardsClaimSentinel [${this.id}] is already running, skipping report [${Date.now()}]`)\n return []\n }\n return await this._reportMutex.runExclusive(async () => {\n const response: Payload[] = []\n if (isUndefined(payloads) || payloads.length === 0) {\n await this.claimAllSteps()\n } else {\n // Process provided payloads\n const stepIdentities = payloads\n .filter(isStepIdentityPayload)\n .map<StepIdentity>((p) => {\n const { step, block: blockNumber } = p\n const block = asXL1BlockNumber(blockNumber, { name: 'reportHandler' })\n return { step, block }\n }).filter(stepIdentity => RewardableSteps.includes(stepIdentity.step))\n for (const stepIdentity of stepIdentities) {\n const result = await this.claimStepIdentity(stepIdentity)\n if (isDefined(result)) response.push(...flattenHydratedTransaction(result))\n }\n }\n return response\n })\n }\n\n private calculateAddressDistributions(rewardsByStaker: Record<Address, bigint>, balance: AttoXL1): Record<Address, bigint> {\n const addressClaims: Record<Address, bigint> = {}\n const totalRewards = Object.values(rewardsByStaker).reduce((acc, val) => acc + val, 0n)\n for (const [staker, amount] of Object.entries(rewardsByStaker)) {\n // Ensure they have accrued an amount\n if (amount <= 0n) continue\n const reward = (balance * amount) / totalRewards\n // Ensure they earned a reward\n if (reward <= 0n) continue\n // Accumulate rewards by address\n const receiveAddress = derivedReceiveAddress(toAddress(staker), scope)\n addressClaims[receiveAddress] = reward\n }\n const totalClaimed = Object.values(addressClaims).reduce((acc, val) => acc + val, 0n)\n assertEx(totalClaimed <= balance, () => 'Total claimed exceeds claimable balance')\n const unclaimed = balance - totalClaimed\n if (unclaimed > 0n) {\n // Return anything unclaimed (due to truncation/rounding) to step rewards pool address\n addressClaims[XYO_STEP_REWARD_ADDRESS] = unclaimed\n }\n return addressClaims\n }\n\n private async claimAllSteps(): Promise<Payload[]> {\n // No payloads to process, just do claims since last run\n const results: SignedHydratedTransaction[] = []\n\n for (const step of RewardableSteps) {\n // Fetch unclaimed rewards and process claims\n const from = 0\n const to = await this.viewer.currentBlockNumber()\n const range = asXL1BlockRange([from, to], { name: 'claimAllSteps' })\n // For each rewardable step in range\n const stepIdentities = blockRangeSteps(range, [step])\n for (const stepIdentity of stepIdentities) {\n const result = await this.claimStepIdentity(stepIdentity)\n if (isDefined(result)) {\n results.push(result)\n }\n await delay(this.stepClaimIntervalMs)\n }\n }\n return flattenHydratedTransactions(results)\n }\n\n private async claimStepIdentity(stepIdentity: StepIdentity): Promise<SignedHydratedTransaction | undefined> {\n this.logger?.info(`Checking rewards to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`)\n const claimCounterAttributes = { step: stepIdentity.step.toString(), block: stepIdentity.block.toString() }\n try {\n this._claimCheckCounter?.add(1, claimCounterAttributes)\n // If wallet has balance\n const stepRewardAddress = completedStepRewardAddress(stepIdentity)\n const balance = await this.viewer.account.balance.accountBalance(stepRewardAddress)\n this.logger?.info(\n `Found balance of ${balance} to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`\n + ` in step reward address ${stepRewardAddress}`,\n )\n if (balance > 0n) {\n this._claimAttemptsCounter?.add(1, claimCounterAttributes)\n // For stakers\n const rewardsByStaker = await this.viewer.networkStakeStepRewardPoolRewards(stepIdentity)\n const rewardRecipients = Object.keys(rewardsByStaker).length\n this.logger?.info(\n `Found ${rewardRecipients} reward recipients for step ${stepIdentity.step} at block ${stepIdentity.block}`,\n )\n // If not configured to claim empty steps\n if (!this.config.claimEmptySteps) {\n // Ensure there are rewards recipients\n assertEx(rewardRecipients > 0, () => 'No reward recipients for step')\n }\n const addressDistributions = this.calculateAddressDistributions(rewardsByStaker, balance)\n this.logger?.info(\n `Calculated address distributions for step ${stepIdentity.step} at block ${stepIdentity.block}`\n + ` with ${Object.keys(addressDistributions).length} addresses`,\n )\n // Create single transaction for all claims\n const tx = await this.submitRewardDistributionTransaction(stepRewardAddress, addressDistributions, stepIdentity, this.gateway)\n this.logger?.info(`Claimed rewards for step ${stepIdentity.step} at block ${stepIdentity.block}`)\n this._claimSuccessCounter?.add(1, claimCounterAttributes)\n // Return submitted transaction\n return tx\n }\n } catch (error) {\n this._claimErrorCounter?.add(1, claimCounterAttributes)\n this.logger?.error(`Error claiming rewards for step ${stepIdentity.step} at block ${stepIdentity.block}:`, error)\n }\n }\n\n private async submitRewardDistributionTransaction(\n stepRewardAddress: Address,\n addressDistributions: Record<Address, bigint>,\n step: StepIdentity,\n gateway: XyoGatewayRunner,\n ): Promise<SignedHydratedTransaction | undefined> {\n // Create single transfer payload for all claims\n const transferPayload = createTransferPayload(stepRewardAddress, addressDistributions)\n transferPayload.context = { step }\n const currentBlockNumber = await this.viewer.currentBlockNumber()\n const result = await gateway.addPayloadsToChain?.([transferPayload], [], { nbf: currentBlockNumber, exp: asXL1BlockNumber(currentBlockNumber + 10) })\n if (isDefined(result)) return result[1]\n }\n}\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport type { Address } from '@xylabs/sdk-js'\nimport {\n AddressZod, assertEx, EthAddressZod, hexToBigInt, HexZod, isDefined, isUndefined,\n toAddress, toHex,\n} from '@xylabs/sdk-js'\nimport type {\n AnyConfigSchema, Payload,\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sdk-js'\nimport { AbstractSentinel, asSchema } from '@xyo-network/sdk-js'\nimport type {\n SignedHydratedTransaction, XL1BlockNumber, XyoGatewayRunner,\n} from '@xyo-network/xl1-sdk'\nimport {\n createTransferPayload,\n derivedReceiveAddress, flattenHydratedTransaction, isEIP712DataPayload, isEIP712SignaturePayload,\n verifyEIP712Message, XL1BlockNumberZod,\n} from '@xyo-network/xl1-sdk'\nimport z from 'zod'\n\nexport const DerivedAddressWalletTransferSentinelConfigSchema = asSchema('network.xyo.sentinel.chain.derived.address.wallet.transfer.config', true)\nexport type DerivedAddressWalletTransferSentinelConfigSchema = typeof DerivedAddressWalletTransferSentinelConfigSchema\n\n/**\n * The configuration for the derived address wallet transfer sentinel\n */\nexport type DerivedAddressWalletTransferSentinelConfig = SentinelConfig<{\n /**\n * The schema for the derived address wallet transfer sentinel config\n */\n schema: DerivedAddressWalletTransferSentinelConfigSchema\n}>\n\nexport interface DerivedAddressWalletTransferSentinelParamFields {\n gateway: XyoGatewayRunner\n}\n\nexport type DerivedAddressWalletTransferSentinelParams<\n TConfig extends AnyConfigSchema<DerivedAddressWalletTransferSentinelConfig> = AnyConfigSchema<DerivedAddressWalletTransferSentinelConfig>,\n> = SentinelParams<TConfig> & DerivedAddressWalletTransferSentinelParamFields\n\nconst scope = 'reward-escrow'\n\ninterface ParsedClaimValues {\n amount: string\n // chainId: ChainId\n exp: XL1BlockNumber\n from: Address\n nbf: XL1BlockNumber\n to: Address\n}\n\n// Assuming EthAddress and Hex are string-like (typical case)\nexport const ConfirmedClaimValuesZod = z.object({\n 'From': EthAddressZod,\n 'To XL1 Address': AddressZod,\n 'XL1 Amount': z.string(),\n 'XL1 Amount (Hex)': HexZod, // Hex\n 'XL1 Not after block': XL1BlockNumberZod,\n 'XL1 Not before block': XL1BlockNumberZod,\n})\n\nexport type ConfirmedClaimValues = z.infer<typeof ConfirmedClaimValuesZod>\n\nconst parseConfirmedClaimValues = (values: ConfirmedClaimValues): ParsedClaimValues => {\n return {\n amount: values['XL1 Amount (Hex)'],\n exp: values['XL1 Not after block'],\n from: toAddress(values.From),\n nbf: values['XL1 Not before block'],\n to: toAddress(values['To XL1 Address']),\n }\n}\n\nexport class DerivedAddressWalletTransferSentinel<\n TParams extends DerivedAddressWalletTransferSentinelParams = DerivedAddressWalletTransferSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [DerivedAddressWalletTransferSentinelConfigSchema]\n static override readonly defaultConfigSchema = DerivedAddressWalletTransferSentinelConfigSchema\n private _transferAttemptsCounter: Counter<Attributes> | undefined\n private _transferErrorCounter: Counter<Attributes> | undefined\n private _transferSuccessCounter: Counter<Attributes> | undefined\n\n protected get gateway(): XyoGatewayRunner {\n return this.params.gateway\n }\n\n override async createHandler() {\n await super.createHandler()\n // Create meters for tracking claim attempts, successes, and errors.\n this._transferAttemptsCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_attempts_total',\n { description: 'Number of transfer attempts' },\n )\n this._transferSuccessCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_success_total',\n { description: 'Number of transfer successes' },\n )\n this._transferErrorCounter = this.meter?.createCounter(\n 'derived_address_wallet_transfer_sentinel_errors_total',\n { description: 'Number of transfer errors' },\n )\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n const data = payloads?.find(x => isEIP712DataPayload(x))\n const signature = payloads?.find(x => isEIP712SignaturePayload(x))\n if (isUndefined(data) || isUndefined(signature)) return []\n this._transferAttemptsCounter?.add(1)\n const valid = await verifyEIP712Message(data, signature)\n if (!valid) {\n this._transferErrorCounter?.add(1)\n throw new Error('Invalid EIP712 signature')\n }\n const values = ConfirmedClaimValuesZod.parse(data.values)\n const parsed = parseConfirmedClaimValues(values)\n const signatureAddress = toAddress(signature.address)\n const parsedAddress = toAddress(parsed.from)\n if (signatureAddress === parsedAddress) {\n const tx = await this.submitRewardDistributionTransaction(parsed)\n if (isDefined(tx)) {\n this._transferSuccessCounter?.add(1)\n return flattenHydratedTransaction(tx)\n }\n }\n this._transferErrorCounter?.add(1)\n return []\n }\n\n protected submitRewardDistributionTransaction = async (claimValues: ParsedClaimValues): Promise<SignedHydratedTransaction | undefined> => {\n const {\n amount, from: address, to, nbf, exp,\n } = claimValues\n // Ensure necessary gateway pre-requisites are met\n const signer = assertEx(this.gateway.signer, () => 'Signer is not defined in gateway')\n const signerAddress = await signer.address()\n const connection = this.gateway.connection\n const viewer = assertEx(connection.viewer, () => 'Viewer is not defined in gateway connection')\n\n // TODO: Validate chainId against supplied in ClaimValues to prevent replay attacks\n // const chainId = await viewer.chainId()\n\n // Ensure the transaction is within the valid block range\n const currentBlock = await viewer.currentBlockNumber()\n if (currentBlock < nbf || currentBlock > exp) throw new Error('Transaction is not within a valid block range')\n\n // Parse the signer's address\n const escrowAccount = derivedReceiveAddress(address, scope)\n\n // Ensure the escrow account has sufficient balance\n const balance = await viewer.account.balance.accountBalance(escrowAccount)\n // MEMO: Currently we require the full amount to be redeemed from the escrow account. We do\n // not allow partial escrow redemptions.\n const redemptionAmount = hexToBigInt(toHex(amount))\n assertEx(balance === redemptionAmount, () => 'Insufficient balance in escrow account')\n\n // Ensure we have enough allowance to transfer from the escrow account\n const allowance = await viewer.account.balance.accountBalance(signerAddress)\n assertEx(allowance > 1000n, () => 'Insufficient allowance to transfer from escrow account')\n\n // Create the transfer payload\n const transferPayload = createTransferPayload(escrowAccount, { [to]: hexToBigInt(toHex(amount)) })\n // Add required validation context\n transferPayload.context = { address, scope }\n const chain = await viewer.chainId()\n const result = await this.gateway.addPayloadsToChain?.([transferPayload], [], {\n chain, nbf, exp,\n })\n if (isDefined(result)) return result[1]\n }\n}\n","import { Server } from 'node:http'\n\nimport { creatable } from '@xylabs/sdk-js'\nimport { RewardRedemptionConfig } from '@xyo-network/chain-orchestration'\nimport {\n ActorParamsV3,\n ActorV3,\n asHostActorConfigContext,\n XyoGatewayRunner,\n XyoGatewayRunnerMoniker,\n} from '@xyo-network/xl1-sdk'\n\nimport { getServer } from './server/index.ts'\n\nexport type RewardRedemptionActorParams = ActorParamsV3<{\n config: RewardRedemptionConfig\n}>\n\n@creatable()\nexport class RewardRedemptionActor extends ActorV3<RewardRedemptionActorParams> {\n protected _gatewayRunner!: XyoGatewayRunner\n private server?: Server\n\n protected get gatewayRunner() {\n return this._gatewayRunner\n }\n\n override async createHandler() {\n await super.createHandler()\n this._gatewayRunner = await this.locator.getInstance(XyoGatewayRunnerMoniker)\n }\n\n override async startHandler() {\n await super.startHandler()\n this.stopServer()\n await this.startServer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopServer()\n }\n\n private async startServer() {\n this.server = await getServer(asHostActorConfigContext(this.context, true), this._gatewayRunner, this.locator)\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","import { standardErrors } from '@xylabs/express'\nimport type { RewardRedemptionConfig } from '@xyo-network/chain-orchestration'\nimport { sharedMiddleware } from '@xyo-network/chain-orchestration'\nimport type { NodeInstance } from '@xyo-network/sdk-js'\nimport type { ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'\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: RewardRedemptionConfig, locator: ProviderFactoryLocatorInstance): Express => {\n addInstrumentation()\n const app = express()\n sharedMiddleware(app)\n app.config = config\n app.node = node\n app.locator = locator\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, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, ModuleIdentifier,\n NextOptions, NodeInstance, Payload,\n} from '@xyo-network/sdk-js'\nimport {\n asArchivistInstance, isAnyPayload, isSequence, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n } else {\n res.status(404).send()\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app\n const archivistModuleIdentifier = 'Data'\n app.use('/data', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { addRouteDefinitions } from '@xylabs/express'\nimport type { Express } from 'express'\n\nimport { getRouteDefinitions } from './routeDefinitions/index.ts'\n\nexport const addRewardRedemptionRoutes = (app: Express) => {\n const routeDefinitions = getRouteDefinitions()\n addRouteDefinitions(app, routeDefinitions)\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type {\n NodeInstance, Payload, SentinelInstance,\n} from '@xyo-network/sdk-js'\nimport {\n asSentinelInstance, PayloadBuilder, PayloadZodLoose,\n} from '@xyo-network/sdk-js'\nimport type { StepIdentityPayload, XyoViewer } from '@xyo-network/xl1-sdk'\nimport {\n asXL1BlockRange, blockRangeSteps,\n StepIdentitySchema, XyoViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { z } from 'zod'\n\nimport { RewardableSteps } from '../util/index.ts'\n\nconst query = z.object({\n fromBlock: z.coerce.number().int().nonnegative().optional(),\n toBlock: z.coerce.number().int().nonnegative().optional(),\n step: z.coerce.number().int().nonnegative().min(Math.min(...RewardableSteps)).max(Math.max(...RewardableSteps)).optional().default(3),\n})\nconst response = z.array(PayloadZodLoose)\n\nconst validateRequest = requestHandlerValidator({ query, response })\n\nconst getChainStepRewardsClaimSentinel = async (node: NodeInstance): Promise<SentinelInstance> => {\n const mod = await node.resolve('XYORewardRedemptionNode:ChainStepRewardsClaimSentinel')\n const sentinel = asSentinelInstance(mod)\n return assertEx(sentinel, () => 'ChainStepRewardsClaimSentinel not found on node')\n}\n\nexport const postClaimRange: RouteDefinition = {\n method: 'post',\n path: '/rewards/claimRange',\n handlers: validateRequest(async (req, res) => {\n const { locator, node } = req.app\n const {\n fromBlock, toBlock, step,\n } = z.parse(query, req.query)\n const viewer = await locator.getInstance<XyoViewer>(XyoViewerMoniker)\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 = asXL1BlockRange([from, to], { name: 'claimRange' })\n // For each rewardable step in range\n const stepIdentities = blockRangeSteps(range, [step])\n const results: Payload[] = []\n for (const stepIdentity of stepIdentities) {\n const mod = await getChainStepRewardsClaimSentinel(node)\n const stepIdentityPayload = new PayloadBuilder<StepIdentityPayload>({ schema: StepIdentitySchema }).fields(stepIdentity).build()\n const result = await mod.report([stepIdentityPayload])\n results.push(...result)\n }\n res.status(200)\n res.json(results)\n }),\n}\n","export const RewardableSteps = [3, 4, 5, 6, 7, 8]\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { NodeInstance, SentinelInstance } from '@xyo-network/sdk-js'\nimport {\n asSentinelInstance, PayloadZodLoose, PayloadZodStrictOfSchema,\n} from '@xyo-network/sdk-js'\nimport {\n EIP712DataPayloadFieldsZod, EIP712DataPayloadSchema, EIP712SignaturePayloadFieldsZod,\n EIP712SignaturePayloadSchema,\n} from '@xyo-network/xl1-sdk'\nimport { z } from 'zod'\n\nconst body = z.tuple([\n PayloadZodStrictOfSchema(EIP712DataPayloadSchema).extend(EIP712DataPayloadFieldsZod.shape),\n PayloadZodStrictOfSchema(EIP712SignaturePayloadSchema).extend(EIP712SignaturePayloadFieldsZod.shape),\n])\n\nconst response = z.array(PayloadZodLoose)\nconst validateRequest = requestHandlerValidator({\n body,\n response,\n})\n\nconst getDerivedAddressWalletTransferSentinel = async (node: NodeInstance): Promise<SentinelInstance> => {\n const mod = await node.resolve('XYORewardRedemptionNode:DerivedAddressWalletTransferSentinel')\n const sentinel = asSentinelInstance(mod)\n return assertEx(sentinel, () => 'DerivedAddressWalletTransferSentinel not found on node')\n}\n\nexport const postRedeem: RouteDefinition = {\n method: 'post',\n path: '/rewards/redeem',\n handlers: validateRequest(async (req, res) => {\n const { node } = req.app\n const { body } = req\n const sentinel = await getDerivedAddressWalletTransferSentinel(node)\n const result = await sentinel.report(body)\n res.status(200)\n res.json(result)\n }),\n}\n","import type { RouteDefinition } from '@xylabs/express'\n\nimport { postClaimRange, postRedeem } from './routes/index.ts'\n\nexport const getRouteDefinitions = (): RouteDefinition[] => {\n return [\n postClaimRange,\n postRedeem,\n ]\n}\n","import type { Express } from 'express'\n\nimport { 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 type { Logger } from '@xylabs/sdk-js'\nimport {\n assertEx, isDefined, isString,\n} from '@xylabs/sdk-js'\nimport { boot } from '@xyo-network/bios'\nimport type { BiosExternalInterface } from '@xyo-network/bios-model'\nimport type { RewardRedemptionConfig } from '@xyo-network/chain-orchestration'\nimport type { NodeInstance } from '@xyo-network/sdk-js'\nimport { HDWallet } from '@xyo-network/sdk-js'\nimport type {\n HostActorConfigContext, ProviderFactoryLocatorInstance, XyoGatewayRunner,\n} from '@xyo-network/xl1-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: RewardRedemptionConfig, logger?: Logger): Promise<string> => {\n const storedSeedPhrase = await bios.seedPhraseStore.get('os')\n logger?.debug(`[RewardsRedemption] Stored mnemonic: ${storedSeedPhrase}`)\n const { mnemonic } = config\n if (isString(storedSeedPhrase) && isString(mnemonic)) {\n logger?.warn('[RewardsRedemption] 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('[RewardsRedemption] No mnemonic provided, using random mnemonic. This is not recommended for production use.')\n logger?.log(`[RewardsRedemption] 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\nexport const getServer = async (context: HostActorConfigContext, gateway: XyoGatewayRunner, locator: ProviderFactoryLocatorInstance, providedNode?: NodeInstance) => {\n const { logger, config } = context\n const { port, mnemonic } = config\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 node = providedNode ?? await getNode(context, gateway, wallet)\n const app = getApp(node, config, locator)\n const server = app.listen(port, hostname, () => logger?.log(`[RewardsRedemption] Server listening at http://${hostname}:${port}`))\n server.setTimeout(120_000)\n return server\n}\n","import { type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'\nimport { isDefined } from '@xylabs/sdk-js'\nimport { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'\nimport { ViewArchivist } from '@xyo-network/archivist-view'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'\nimport {\n AbstractModule, LoggerModuleStatusReporter,\n MemoryArchivist, MemorySentinel, ModuleFactoryLocator,\n} from '@xyo-network/sdk-js'\nimport type { BaseConfigContext, XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport { hasMongoConfig } from '@xyo-network/xl1-sdk'\n\nimport type { ChainStepRewardsClaimSentinelParams, DerivedAddressWalletTransferSentinelParams } from '../modules/index.ts'\nimport { ChainStepRewardsClaimSentinel, DerivedAddressWalletTransferSentinel } from '../modules/index.ts'\n\n/**\n * Used for retrieving a locator with the necessary modules registered for testing\n * operation of the node (entirely in memory)\n * @returns A locator with the necessary modules registered\n */\nexport const getLocator = async (context: BaseConfigContext, gateway: XyoGatewayRunner) => {\n const { config, logger } = context\n const { otlpEndpoint } = config.telemetry?.otel ?? {}\n const { path: endpoint = '/metrics', port: port = 9467 } = config.telemetry?.metrics?.scrape ?? {}\n const { traceProvider, meterProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-reward-redemption',\n serviceVersion: '1.0.0',\n },\n otlpEndpoint,\n metricsConfig: { endpoint, port },\n })\n\n if (isDefined(logger)) AbstractModule.defaultLogger = logger\n const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined\n\n const locator = new ModuleFactoryLocator()\n // If there's a MongoDB configuration\n const mongoConfig = config.storage?.mongo\n if (hasMongoConfig(mongoConfig)) {\n // Create the MongoDB SDK from the configuration\n const {\n connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName,\n } = mongoConfig\n const payloadSdkConfig: BaseMongoSdkPrivateConfig = {\n dbConnectionString, dbDomain, dbName, dbPassword, dbUserName,\n }\n const params: Partial<MongoDBModuleParamsV2> = {\n meterProvider, payloadSdkConfig, statusReporter, traceProvider,\n }\n // Register the MongoDB Archivist as the default\n locator.register(MongoDBArchivistV2.factory(params), undefined, true)\n }\n\n locator.register(MemoryArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(MemorySentinel.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(ViewArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n // const gateway = await getGateway(config)\n const chainStepRewardsClaimSentinelParams: Partial<ChainStepRewardsClaimSentinelParams> = {\n gateway, traceProvider, meterProvider, statusReporter,\n }\n locator.register(ChainStepRewardsClaimSentinel.factory(chainStepRewardsClaimSentinelParams))\n const derivedAddressWalletTransferSentinelParams: Partial<DerivedAddressWalletTransferSentinelParams> = {\n gateway, traceProvider, meterProvider, statusReporter,\n }\n locator.register(DerivedAddressWalletTransferSentinel.factory(derivedAddressWalletTransferSentinelParams))\n return locator\n}\n\n// const getGateway = async (config: Config): Promise<XyoGatewayRunner | undefined> => {\n// const { mnemonic, chainRpcApiUrl } = config.actors.rewardRedemption\n\n// // Create locator\n// const transportFactory: TransportFactory = (schemas: RpcSchemaMap) => new HttpRpcTransport(chainRpcApiUrl, schemas)\n// const locator = await buildJsonRpcProviderLocator({ transportFactory })\n\n// // Register signer\n// const phrase = mnemonic ?? HDWallet.generateMnemonic()\n// const wallet = await generateXyoBaseWalletFromPhrase(phrase)\n// const account = await wallet.derivePath(ADDRESS_INDEX.XYO)\n// locator.register(SimpleXyoSigner.factory<SimpleXyoSigner>(SimpleXyoSigner.dependencies, { account }))\n// locator.register(SimpleXyoGatewayRunner.factory<SimpleXyoGatewayRunner>(SimpleXyoGatewayRunner.dependencies, {}))\n\n// // Use locator to get gateway\n// const gateway = await locator.getInstance<SimpleXyoGatewayRunner>(SimpleXyoGatewayRunner.defaultMoniker)\n// return gateway\n// }\n","import type { Logger } from '@xylabs/sdk-js'\nimport { ManifestWrapper } from '@xyo-network/sdk-js'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BaseConfigContext,\n Config, XyoGatewayRunner,\n} from '@xyo-network/xl1-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: BaseConfigContext, gateway: XyoGatewayRunner, wallet: WalletInstance) => {\n const locator = await getLocator(context, gateway)\n const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)\n const [node, ...childNodes] = await wrapper.loadNodes()\n if (childNodes?.length > 0) {\n await Promise.all(childNodes.map(childNode => node.register(childNode)))\n await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))\n }\n return node\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"44'/60'/1\",\n \"name\": \"XYORewardRedemptionNode\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"name\": \"DataPrivate\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"reward_redemption_api_datalake\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/2'\",\n \"name\": \"ChainStepRewardsClaimSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.step.rewards.claim.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/3'\",\n \"automations\": [\n {\n \"frequency\": 60000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"ChainRewardsClaimIntervalSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"ChainStepRewardsClaimSentinel\",\n \"endPoint\": \"report\"\n }\n ]\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/4'\",\n \"name\": \"DerivedAddressWalletTransferSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.derived.address.wallet.transfer.config\"\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"Data\",\n \"allowedQueries\": [\n \"network.xyo.query.archivist.get\",\n \"network.xyo.query.archivist.next\"\n ],\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"originArchivist\": \"DataPrivate\",\n \"schema\": \"network.xyo.archivist.view.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { PackageManifestPayload } from '@xyo-network/sdk-js'\n\nimport node from './node.json' with { type: 'json' }\n\n/**\n * Root Node Manifest\n */\nexport const NodeManifest = node as unknown as PackageManifestPayload\n","/**\n * Private Child Manifests\n */\nexport const PrivateChildManifests = []\n","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/sdk-js'\n\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = []\n"],"mappings":"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","names":["assertEx","delay","isDefined","isUndefined","toAddress","AbstractSentinel","asSchema","asXL1BlockNumber","asXL1BlockRange","blockRangeSteps","completedStepRewardAddress","createTransferPayload","derivedReceiveAddress","flattenHydratedTransaction","flattenHydratedTransactions","isStepIdentityPayload","XYO_STEP_REWARD_ADDRESS","Mutex","ChainStepRewardsClaimSentinelConfigSchema","asSchema","defaultStepClaimIntervalMs","scope","RewardableSteps","ChainStepRewardsClaimSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_claimAttemptsCounter","_claimCheckCounter","_claimErrorCounter","_claimSuccessCounter","_connection","_gateway","_reportMutex","Mutex","_viewer","connection","assertEx","gateway","stepClaimIntervalMs","isDefined","config","viewer","createHandler","meter","createCounter","description","params","reportHandler","payloads","isLocked","logger","debug","id","Date","now","runExclusive","response","isUndefined","length","claimAllSteps","stepIdentities","filter","isStepIdentityPayload","map","p","step","block","blockNumber","asXL1BlockNumber","name","stepIdentity","includes","result","claimStepIdentity","push","flattenHydratedTransaction","calculateAddressDistributions","rewardsByStaker","balance","addressClaims","totalRewards","Object","values","reduce","acc","val","staker","amount","entries","reward","receiveAddress","derivedReceiveAddress","toAddress","totalClaimed","unclaimed","XYO_STEP_REWARD_ADDRESS","results","from","to","currentBlockNumber","range","asXL1BlockRange","blockRangeSteps","delay","flattenHydratedTransactions","info","claimCounterAttributes","toString","add","stepRewardAddress","completedStepRewardAddress","account","accountBalance","networkStakeStepRewardPoolRewards","rewardRecipients","keys","claimEmptySteps","addressDistributions","tx","submitRewardDistributionTransaction","error","transferPayload","createTransferPayload","context","addPayloadsToChain","nbf","exp","AddressZod","assertEx","EthAddressZod","hexToBigInt","HexZod","isDefined","isUndefined","toAddress","toHex","AbstractSentinel","asSchema","createTransferPayload","derivedReceiveAddress","flattenHydratedTransaction","isEIP712DataPayload","isEIP712SignaturePayload","verifyEIP712Message","XL1BlockNumberZod","z","DerivedAddressWalletTransferSentinelConfigSchema","asSchema","scope","ConfirmedClaimValuesZod","z","object","EthAddressZod","AddressZod","string","HexZod","XL1BlockNumberZod","parseConfirmedClaimValues","values","amount","exp","from","toAddress","From","nbf","to","DerivedAddressWalletTransferSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_transferAttemptsCounter","_transferErrorCounter","_transferSuccessCounter","gateway","params","createHandler","meter","createCounter","description","reportHandler","payloads","data","find","x","isEIP712DataPayload","signature","isEIP712SignaturePayload","isUndefined","add","valid","verifyEIP712Message","Error","parse","parsed","signatureAddress","address","parsedAddress","tx","submitRewardDistributionTransaction","isDefined","flattenHydratedTransaction","claimValues","signer","assertEx","signerAddress","connection","viewer","currentBlock","currentBlockNumber","escrowAccount","derivedReceiveAddress","balance","account","accountBalance","redemptionAmount","hexToBigInt","toHex","allowance","transferPayload","createTransferPayload","context","chain","chainId","result","addPayloadsToChain","creatable","ActorV3","asHostActorConfigContext","XyoGatewayRunnerMoniker","standardErrors","sharedMiddleware","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","setRawResponseFormat","asHash","isDefined","asArchivistInstance","isAnyPayload","isSequence","PayloadBuilder","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","addRouteDefinitions","requestHandlerValidator","assertEx","isDefined","asSentinelInstance","PayloadBuilder","PayloadZodLoose","asXL1BlockRange","blockRangeSteps","StepIdentitySchema","XyoViewerMoniker","z","RewardableSteps","query","z","object","fromBlock","coerce","number","int","nonnegative","optional","toBlock","step","min","Math","RewardableSteps","max","default","response","array","PayloadZodLoose","validateRequest","requestHandlerValidator","getChainStepRewardsClaimSentinel","node","mod","resolve","sentinel","asSentinelInstance","assertEx","postClaimRange","method","path","handlers","req","res","locator","app","parse","viewer","getInstance","XyoViewerMoniker","from","isDefined","currentBlock","currentBlockNumber","to","status","json","range","asXL1BlockRange","name","stepIdentities","blockRangeSteps","results","stepIdentity","stepIdentityPayload","PayloadBuilder","schema","StepIdentitySchema","fields","build","result","report","push","requestHandlerValidator","assertEx","asSentinelInstance","PayloadZodLoose","PayloadZodStrictOfSchema","EIP712DataPayloadFieldsZod","EIP712DataPayloadSchema","EIP712SignaturePayloadFieldsZod","EIP712SignaturePayloadSchema","z","body","z","tuple","PayloadZodStrictOfSchema","EIP712DataPayloadSchema","extend","EIP712DataPayloadFieldsZod","shape","EIP712SignaturePayloadSchema","EIP712SignaturePayloadFieldsZod","response","array","PayloadZodLoose","validateRequest","requestHandlerValidator","getDerivedAddressWalletTransferSentinel","node","mod","resolve","sentinel","asSentinelInstance","assertEx","postRedeem","method","path","handlers","req","res","app","result","report","status","json","getRouteDefinitions","postClaimRange","postRedeem","addRewardRedemptionRoutes","app","routeDefinitions","getRouteDefinitions","addRouteDefinitions","addRoutes","app","addDataLakeRoutes","addRewardRedemptionRoutes","getApp","node","config","locator","addInstrumentation","app","express","sharedMiddleware","addRoutes","use","standardErrors","assertEx","isDefined","isString","boot","HDWallet","isDefined","MongoDBArchivistV2","ViewArchivist","initTelemetry","AbstractModule","LoggerModuleStatusReporter","MemoryArchivist","MemorySentinel","ModuleFactoryLocator","hasMongoConfig","getLocator","context","gateway","config","logger","otlpEndpoint","telemetry","otel","path","endpoint","port","metrics","scrape","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","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","chainStepRewardsClaimSentinelParams","ChainStepRewardsClaimSentinel","derivedAddressWalletTransferSentinelParams","DerivedAddressWalletTransferSentinel","ManifestWrapper","NodeManifest","node","PrivateChildManifests","PublicChildManifests","getNode","context","gateway","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","isString","warn","set","seedPhrase","HDWallet","generateMnemonic","log","assertEx","getServer","context","gateway","locator","providedNode","port","boot","isDefined","wallet","fromPhrase","node","getNode","app","getApp","server","listen","setTimeout","RewardRedemptionActor","ActorV3","_gatewayRunner","server","gatewayRunner","createHandler","locator","getInstance","XyoGatewayRunnerMoniker","startHandler","stopServer","startServer","stopHandler","getServer","asHostActorConfigContext","context","close","undefined"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"AAMA,OAAO,EAE4B,oBAAoB,EACtD,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAM/E;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAU,SAAS,iBAAiB,EAAE,SAAS,gBAAgB,kCAqDrF,CAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type { AnyConfigSchema, Payload } from '@xyo-network/sdk-js';
|
|
2
|
-
import { AbstractSentinel } from '@xyo-network/
|
|
3
|
-
import type { SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams } from '@xyo-network/sentinel-model';
|
|
1
|
+
import type { AnyConfigSchema, Payload, SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams } from '@xyo-network/sdk-js';
|
|
2
|
+
import { AbstractSentinel } from '@xyo-network/sdk-js';
|
|
4
3
|
import type { XyoConnection, XyoGatewayRunner, XyoViewer } from '@xyo-network/xl1-sdk';
|
|
5
4
|
export declare const ChainStepRewardsClaimSentinelConfigSchema: "network.xyo.sentinel.chain.step.rewards.claim.config" & {
|
|
6
5
|
readonly __schema: true;
|
package/dist/node/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChainStepRewardsClaimSentinel.d.ts","sourceRoot":"","sources":["../../../../src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ChainStepRewardsClaimSentinel.d.ts","sourceRoot":"","sources":["../../../../src/modules/ChainStepRewardsClaimSentinel/ChainStepRewardsClaimSentinel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,eAAe,EAAE,OAAO,EACxB,cAAc,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,cAAc,EAC1E,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,gBAAgB,EAAY,MAAM,qBAAqB,CAAA;AAChE,OAAO,KAAK,EAEV,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAC3C,MAAM,sBAAsB,CAAA;AAQ7B,eAAO,MAAM,yCAAyC;;CAAyE,CAAA;AAC/H,MAAM,MAAM,yCAAyC,GAAG,OAAO,yCAAyC,CAAA;AAExG;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG,cAAc,CAAC;IAC/D;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;OAEG;IACH,MAAM,EAAE,yCAAyC,CAAA;IACjD;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAC,CAAA;AAEF,UAAU,wCAAwC;IAChD,OAAO,EAAE,gBAAgB,CAAA;CAC1B;AAED,MAAM,MAAM,mCAAmC,CAC7C,OAAO,SAAS,eAAe,CAAC,mCAAmC,CAAC,GAAG,eAAe,CAAC,mCAAmC,CAAC,IACzH,cAAc,CAAC,OAAO,CAAC,GAAG,wCAAwC,CAAA;AAQtE,qBAAa,6BAA6B,CACxC,OAAO,SAAS,mCAAmC,GAAG,mCAAmC,EACzF,UAAU,SAAS,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAC1H,SAAQ,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7C,gBAAyB,aAAa;;SAA8C;IACpF,gBAAyB,mBAAmB;;MAA4C;IACxF,OAAO,CAAC,qBAAqB,CAAiC;IAC9D,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,oBAAoB,CAAiC;IAC7D,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,OAAO,CAAuB;IAEtC,SAAS,KAAK,UAAU,IAAI,aAAa,CAExC;IAED,SAAS,KAAK,OAAO,IAAI,gBAAgB,CAExC;IAED,SAAS,KAAK,mBAAmB,IAAI,MAAM,CAE1C;IAED,SAAS,KAAK,MAAM,IAAI,SAAS,CAEhC;IAEc,aAAa;IAmBb,aAAa,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA2BtE,OAAO,CAAC,6BAA6B;YAuBvB,aAAa;YAsBb,iBAAiB;YA2CjB,mCAAmC;CAalD"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { Address } from '@xylabs/sdk-js';
|
|
2
|
-
import type { AnyConfigSchema, Payload } from '@xyo-network/sdk-js';
|
|
3
|
-
import { AbstractSentinel } from '@xyo-network/
|
|
4
|
-
import type { SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams } from '@xyo-network/sentinel-model';
|
|
2
|
+
import type { AnyConfigSchema, Payload, SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams } from '@xyo-network/sdk-js';
|
|
3
|
+
import { AbstractSentinel } from '@xyo-network/sdk-js';
|
|
5
4
|
import type { SignedHydratedTransaction, XL1BlockNumber, XyoGatewayRunner } from '@xyo-network/xl1-sdk';
|
|
6
5
|
import z from 'zod';
|
|
7
6
|
export declare const DerivedAddressWalletTransferSentinelConfigSchema: "network.xyo.sentinel.chain.derived.address.wallet.transfer.config" & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DerivedAddressWalletTransferSentinel.d.ts","sourceRoot":"","sources":["../../../../src/modules/DerivedAddressWalletTransferSentinel/DerivedAddressWalletTransferSentinel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAK7C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"DerivedAddressWalletTransferSentinel.d.ts","sourceRoot":"","sources":["../../../../src/modules/DerivedAddressWalletTransferSentinel/DerivedAddressWalletTransferSentinel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAK7C,OAAO,KAAK,EACV,eAAe,EAAE,OAAO,EACxB,cAAc,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,cAAc,EAC1E,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,gBAAgB,EAAY,MAAM,qBAAqB,CAAA;AAChE,OAAO,KAAK,EACV,yBAAyB,EAAE,cAAc,EAAE,gBAAgB,EAC5D,MAAM,sBAAsB,CAAA;AAM7B,OAAO,CAAC,MAAM,KAAK,CAAA;AAEnB,eAAO,MAAM,gDAAgD;;CAAsF,CAAA;AACnJ,MAAM,MAAM,gDAAgD,GAAG,OAAO,gDAAgD,CAAA;AAEtH;;GAEG;AACH,MAAM,MAAM,0CAA0C,GAAG,cAAc,CAAC;IACtE;;OAEG;IACH,MAAM,EAAE,gDAAgD,CAAA;CACzD,CAAC,CAAA;AAEF,MAAM,WAAW,+CAA+C;IAC9D,OAAO,EAAE,gBAAgB,CAAA;CAC1B;AAED,MAAM,MAAM,0CAA0C,CACpD,OAAO,SAAS,eAAe,CAAC,0CAA0C,CAAC,GAAG,eAAe,CAAC,0CAA0C,CAAC,IACvI,cAAc,CAAC,OAAO,CAAC,GAAG,+CAA+C,CAAA;AAI7E,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAA;IAEd,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,GAAG,EAAE,cAAc,CAAA;IACnB,EAAE,EAAE,OAAO,CAAA;CACZ;AAGD,eAAO,MAAM,uBAAuB;;;;;;;;;;;mBAOlC,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAY1E,qBAAa,oCAAoC,CAC/C,OAAO,SAAS,0CAA0C,GAAG,0CAA0C,EACvG,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;;SAAqD;IAC3F,gBAAyB,mBAAmB;;MAAmD;IAC/F,OAAO,CAAC,wBAAwB,CAAiC;IACjE,OAAO,CAAC,qBAAqB,CAAiC;IAC9D,OAAO,CAAC,uBAAuB,CAAiC;IAEhE,SAAS,KAAK,OAAO,IAAI,gBAAgB,CAExC;IAEc,aAAa;IAiBb,aAAa,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAyBtE,SAAS,CAAC,mCAAmC,GAAU,aAAa,iBAAiB,KAAG,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAwCrI;CACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { RewardRedemptionConfig } from '@xyo-network/chain-orchestration';
|
|
2
2
|
import type { NodeInstance } from '@xyo-network/sdk-js';
|
|
3
|
+
import type { ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk';
|
|
3
4
|
import type { Express } from 'express';
|
|
4
|
-
export declare const getApp: (node: NodeInstance, config: RewardRedemptionConfig) => Express;
|
|
5
|
+
export declare const getApp: (node: NodeInstance, config: RewardRedemptionConfig, locator: ProviderFactoryLocatorInstance) => Express;
|
|
5
6
|
//# sourceMappingURL=app.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAE9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAA;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,MAAM,GAAI,MAAM,YAAY,EAAE,QAAQ,sBAAsB,EAAE,SAAS,8BAA8B,KAAG,OAUpH,CAAA"}
|
|
@@ -2,10 +2,12 @@ export * from './app.ts';
|
|
|
2
2
|
export * from './server.ts';
|
|
3
3
|
import type { RewardRedemptionConfig } from '@xyo-network/chain-orchestration';
|
|
4
4
|
import type { NodeInstance } from '@xyo-network/sdk-js';
|
|
5
|
+
import type { ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk';
|
|
5
6
|
declare global {
|
|
6
7
|
namespace Express {
|
|
7
8
|
interface Application {
|
|
8
9
|
config: RewardRedemptionConfig;
|
|
10
|
+
locator: ProviderFactoryLocatorInstance;
|
|
9
11
|
node: NodeInstance;
|
|
10
12
|
}
|
|
11
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAE3B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAE3B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAA;AAE1E,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,OAAO,CAAC;QAChB,UAAU,WAAW;YACnB,MAAM,EAAE,sBAAsB,CAAA;YAC9B,OAAO,EAAE,8BAA8B,CAAA;YACvC,IAAI,EAAE,YAAY,CAAA;SACnB;KACF;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Payload } from '@xyo-network/sdk-js';
|
|
2
2
|
import type { AddressPathParams } from '../AddressPathParams.ts';
|
|
3
|
-
export declare const getAddress: (req: import("express").Request<AddressPathParams, Payload[], any, import("qs").ParsedQs, Record<string, any>>, res: import("express").Response<Payload[], Record<string, any
|
|
3
|
+
export declare const getAddress: (req: import("express-serve-static-core").Request<AddressPathParams, Payload[], any, import("qs").ParsedQs, Record<string, any>>, res: import("express-serve-static-core").Response<Payload[], Record<string, any>, number>, next: import("express-serve-static-core").NextFunction) => Promise<unknown>;
|
|
4
4
|
//# sourceMappingURL=get.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/get/get.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAsBhE,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/get/get.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAsBhE,eAAO,MAAM,UAAU,0SAAwB,CAAA"}
|
|
@@ -2,6 +2,6 @@ import { type QueryBoundWitness } from '@xyo-network/boundwitness-model';
|
|
|
2
2
|
import type { ModuleError, ModuleQueryResult, Payload } from '@xyo-network/sdk-js';
|
|
3
3
|
import type { AddressPathParams } from '../AddressPathParams.ts';
|
|
4
4
|
type PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]];
|
|
5
|
-
export declare const postAddress: (req: import("express").Request<AddressPathParams, ModuleError | ModuleQueryResult, PostAddressRequestBody, import("qs").ParsedQs, Record<string, any>>, res: import("express").Response<ModuleError | ModuleQueryResult, Record<string, any
|
|
5
|
+
export declare const postAddress: (req: import("express-serve-static-core").Request<AddressPathParams, ModuleError | ModuleQueryResult, PostAddressRequestBody, import("qs").ParsedQs, Record<string, any>>, res: import("express-serve-static-core").Response<ModuleError | ModuleQueryResult, Record<string, any>, number>, next: import("express-serve-static-core").NextFunction) => Promise<unknown>;
|
|
6
6
|
export {};
|
|
7
7
|
//# sourceMappingURL=post.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/post/post.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/address/post/post.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAC7F,OAAO,KAAK,EACV,WAAW,EAAkB,iBAAiB,EAAE,OAAO,EACxD,MAAM,qBAAqB,CAAA;AAK5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAGhE,KAAK,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,SAAS,GAAG,OAAO,EAAE,CAAC,CAAA;AA2DxE,eAAO,MAAM,WAAW,yWAAwB,CAAA"}
|
package/dist/node/server/routes/rewardRedemption/routeDefinitions/routes/claimRange.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claimRange.d.ts","sourceRoot":"","sources":["../../../../../../../src/server/routes/rewardRedemption/routeDefinitions/routes/claimRange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"claimRange.d.ts","sourceRoot":"","sources":["../../../../../../../src/server/routes/rewardRedemption/routeDefinitions/routes/claimRange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAiCtD,eAAO,MAAM,cAAc,EAAE,eA8B5B,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { NodeInstance } from '@xyo-network/sdk-js';
|
|
2
|
-
import type { HostActorConfigContext, XyoGatewayRunner } from '@xyo-network/xl1-sdk';
|
|
3
|
-
export declare const getServer: (context: HostActorConfigContext, gateway: XyoGatewayRunner, providedNode?: NodeInstance) => Promise<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>>;
|
|
2
|
+
import type { HostActorConfigContext, ProviderFactoryLocatorInstance, XyoGatewayRunner } from '@xyo-network/xl1-sdk';
|
|
3
|
+
export declare const getServer: (context: HostActorConfigContext, gateway: XyoGatewayRunner, locator: ProviderFactoryLocatorInstance, providedNode?: NodeInstance) => Promise<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>>;
|
|
4
4
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,OAAO,KAAK,EACV,sBAAsB,EAAE,8BAA8B,EAAE,gBAAgB,EACzE,MAAM,sBAAsB,CAAA;AA8B7B,eAAO,MAAM,SAAS,GAAU,SAAS,sBAAsB,EAAE,SAAS,gBAAgB,EAAE,SAAS,8BAA8B,EAAE,eAAe,YAAY,+HAW/J,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-reward-redemption",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.8",
|
|
4
4
|
"description": "XYO Layer One Rewards",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -52,51 +52,31 @@
|
|
|
52
52
|
"@opentelemetry/instrumentation": "~0.213.0",
|
|
53
53
|
"@opentelemetry/instrumentation-express": "~0.61.0",
|
|
54
54
|
"@opentelemetry/instrumentation-http": "~0.213.0",
|
|
55
|
-
"@xyo-network/archivist-mongodb": "~5.3.
|
|
56
|
-
"@xyo-network/archivist-view": "~5.3.
|
|
55
|
+
"@xyo-network/archivist-mongodb": "~5.3.16",
|
|
56
|
+
"@xyo-network/archivist-view": "~5.3.16",
|
|
57
57
|
"@xyo-network/bios": "~7.2.1",
|
|
58
|
-
"@xyo-network/boundwitness-model": "~5.3.
|
|
59
|
-
"@xyo-network/chain-orchestration": "~1.20.
|
|
60
|
-
"@xyo-network/chain-telemetry": "~1.20.
|
|
61
|
-
"@xyo-network/
|
|
62
|
-
"@xyo-network/
|
|
63
|
-
"@xyo-network/
|
|
64
|
-
"
|
|
65
|
-
"@xyo-network/sentinel-model": "~5.3.15",
|
|
66
|
-
"@xyo-network/wallet-model": "~5.3.15",
|
|
67
|
-
"@xyo-network/xl1-sdk": "~1.25.20",
|
|
68
|
-
"async-mutex": "~0.5.0",
|
|
69
|
-
"compression": "~1.8.1",
|
|
70
|
-
"cors": "~2.8.6"
|
|
58
|
+
"@xyo-network/boundwitness-model": "~5.3.16",
|
|
59
|
+
"@xyo-network/chain-orchestration": "~1.20.8",
|
|
60
|
+
"@xyo-network/chain-telemetry": "~1.20.8",
|
|
61
|
+
"@xyo-network/sdk-js": "~5.3.16",
|
|
62
|
+
"@xyo-network/wallet-model": "~5.3.16",
|
|
63
|
+
"@xyo-network/xl1-sdk": "~1.25.33",
|
|
64
|
+
"async-mutex": "~0.5.0"
|
|
71
65
|
},
|
|
72
66
|
"devDependencies": {
|
|
73
67
|
"@opentelemetry/api": "^1.9.0",
|
|
74
|
-
"@types/compression": "~1.8.1",
|
|
75
|
-
"@types/cors": "~2.8.19",
|
|
76
|
-
"@types/express": "^5.0.6",
|
|
77
68
|
"@types/express-serve-static-core": "~5.1.1",
|
|
78
|
-
"@types/node": "~25.
|
|
79
|
-
"@xylabs/express": "~5.0.
|
|
80
|
-
"@xylabs/mongo": "~5.0.
|
|
81
|
-
"@xylabs/sdk-js": "~5.0.
|
|
82
|
-
"@xylabs/ts-scripts-yarn3": "~7.4.
|
|
83
|
-
"@xylabs/tsconfig": "~7.4.
|
|
84
|
-
"@
|
|
85
|
-
"@xyo-network/account-model": "~5.3.15",
|
|
86
|
-
"@xyo-network/archivist-abstract": "~5.3.15",
|
|
87
|
-
"@xyo-network/archivist-mongodb": "~5.3.15",
|
|
69
|
+
"@types/node": "~25.5.0",
|
|
70
|
+
"@xylabs/express": "~5.0.86",
|
|
71
|
+
"@xylabs/mongo": "~5.0.86",
|
|
72
|
+
"@xylabs/sdk-js": "~5.0.86",
|
|
73
|
+
"@xylabs/ts-scripts-yarn3": "~7.4.25",
|
|
74
|
+
"@xylabs/tsconfig": "~7.4.25",
|
|
75
|
+
"@xyo-network/archivist-mongodb": "~5.3.16",
|
|
88
76
|
"@xyo-network/bios-model": "~7.2.1",
|
|
89
|
-
"@xyo-network/
|
|
90
|
-
"@xyo-network/
|
|
91
|
-
"@xyo-network/
|
|
92
|
-
"@xyo-network/chain-validation": "~1.20.4",
|
|
93
|
-
"@xyo-network/module-abstract": "~5.3.15",
|
|
94
|
-
"@xyo-network/module-abstract-mongodb": "~5.3.15",
|
|
95
|
-
"@xyo-network/module-model-mongodb": "~5.3.15",
|
|
96
|
-
"@xyo-network/node-memory": "~5.3.15",
|
|
97
|
-
"@xyo-network/sdk-js": "~5.3.15",
|
|
98
|
-
"@xyo-network/sentinel-memory": "~5.3.15",
|
|
99
|
-
"@xyo-network/xl1-sdk": "~1.25.20",
|
|
77
|
+
"@xyo-network/module-model-mongodb": "~5.3.16",
|
|
78
|
+
"@xyo-network/sdk-js": "~5.3.16",
|
|
79
|
+
"@xyo-network/xl1-sdk": "~1.25.33",
|
|
100
80
|
"axios": "^1.13.6",
|
|
101
81
|
"dotenv": "~17.3.1",
|
|
102
82
|
"ethers": "^6.16.0",
|
|
@@ -106,8 +86,7 @@
|
|
|
106
86
|
"nodemon": "~3.1.14",
|
|
107
87
|
"tslib": "~2.8.1",
|
|
108
88
|
"typescript": "~5.9.3",
|
|
109
|
-
"vitest": "
|
|
110
|
-
"vitest-mock-extended": "~3.1.0",
|
|
89
|
+
"vitest": "^4.1.1",
|
|
111
90
|
"zod": "^4.3.6"
|
|
112
91
|
},
|
|
113
92
|
"peerDependencies": {
|
|
@@ -42,7 +42,7 @@ export class RewardRedemptionActor extends ActorV3<RewardRedemptionActorParams>
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
private async startServer() {
|
|
45
|
-
this.server = await getServer(asHostActorConfigContext(this.context, true), this._gatewayRunner)
|
|
45
|
+
this.server = await getServer(asHostActorConfigContext(this.context, true), this._gatewayRunner, this.locator)
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
private stopServer() {
|
|
@@ -3,10 +3,11 @@ import { isDefined } from '@xylabs/sdk-js'
|
|
|
3
3
|
import { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'
|
|
4
4
|
import { ViewArchivist } from '@xyo-network/archivist-view'
|
|
5
5
|
import { initTelemetry } from '@xyo-network/chain-telemetry'
|
|
6
|
-
import { AbstractModule, LoggerModuleStatusReporter } from '@xyo-network/module-abstract'
|
|
7
6
|
import type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'
|
|
8
|
-
import {
|
|
9
|
-
|
|
7
|
+
import {
|
|
8
|
+
AbstractModule, LoggerModuleStatusReporter,
|
|
9
|
+
MemoryArchivist, MemorySentinel, ModuleFactoryLocator,
|
|
10
|
+
} from '@xyo-network/sdk-js'
|
|
10
11
|
import type { BaseConfigContext, XyoGatewayRunner } from '@xyo-network/xl1-sdk'
|
|
11
12
|
import { hasMongoConfig } from '@xyo-network/xl1-sdk'
|
|
12
13
|
|
|
@@ -3,12 +3,11 @@ import type { Address } from '@xylabs/sdk-js'
|
|
|
3
3
|
import {
|
|
4
4
|
assertEx, delay, isDefined, isUndefined, toAddress,
|
|
5
5
|
} from '@xylabs/sdk-js'
|
|
6
|
-
import type { AnyConfigSchema, Payload } from '@xyo-network/sdk-js'
|
|
7
|
-
import { asSchema } from '@xyo-network/sdk-js'
|
|
8
|
-
import { AbstractSentinel } from '@xyo-network/sentinel-abstract'
|
|
9
6
|
import type {
|
|
7
|
+
AnyConfigSchema, Payload,
|
|
10
8
|
SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,
|
|
11
|
-
} from '@xyo-network/
|
|
9
|
+
} from '@xyo-network/sdk-js'
|
|
10
|
+
import { AbstractSentinel, asSchema } from '@xyo-network/sdk-js'
|
|
12
11
|
import type {
|
|
13
12
|
AttoXL1, SignedHydratedTransaction, StepIdentity,
|
|
14
13
|
XyoConnection, XyoGatewayRunner, XyoViewer,
|
package/src/modules/DerivedAddressWalletTransferSentinel/DerivedAddressWalletTransferSentinel.ts
CHANGED
|
@@ -4,12 +4,11 @@ import {
|
|
|
4
4
|
AddressZod, assertEx, EthAddressZod, hexToBigInt, HexZod, isDefined, isUndefined,
|
|
5
5
|
toAddress, toHex,
|
|
6
6
|
} from '@xylabs/sdk-js'
|
|
7
|
-
import type { AnyConfigSchema, Payload } from '@xyo-network/sdk-js'
|
|
8
|
-
import { asSchema } from '@xyo-network/sdk-js'
|
|
9
|
-
import { AbstractSentinel } from '@xyo-network/sentinel-abstract'
|
|
10
7
|
import type {
|
|
8
|
+
AnyConfigSchema, Payload,
|
|
11
9
|
SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,
|
|
12
|
-
} from '@xyo-network/
|
|
10
|
+
} from '@xyo-network/sdk-js'
|
|
11
|
+
import { AbstractSentinel, asSchema } from '@xyo-network/sdk-js'
|
|
13
12
|
import type {
|
|
14
13
|
SignedHydratedTransaction, XL1BlockNumber, XyoGatewayRunner,
|
|
15
14
|
} from '@xyo-network/xl1-sdk'
|
package/src/server/app.ts
CHANGED
|
@@ -1,31 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler,
|
|
3
|
-
standardErrors, standardResponses,
|
|
4
|
-
} from '@xylabs/express'
|
|
1
|
+
import { standardErrors } from '@xylabs/express'
|
|
5
2
|
import type { RewardRedemptionConfig } from '@xyo-network/chain-orchestration'
|
|
3
|
+
import { sharedMiddleware } from '@xyo-network/chain-orchestration'
|
|
6
4
|
import type { NodeInstance } from '@xyo-network/sdk-js'
|
|
7
|
-
import
|
|
8
|
-
import cors from 'cors'
|
|
5
|
+
import type { ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'
|
|
9
6
|
import type { Express } from 'express'
|
|
10
7
|
import express from 'express'
|
|
11
8
|
|
|
12
9
|
import { addInstrumentation } from './instrumentation.ts'
|
|
13
10
|
import { addRoutes } from './routes/index.ts'
|
|
14
11
|
|
|
15
|
-
export const getApp = (node: NodeInstance, config: RewardRedemptionConfig): Express => {
|
|
12
|
+
export const getApp = (node: NodeInstance, config: RewardRedemptionConfig, locator: ProviderFactoryLocatorInstance): Express => {
|
|
16
13
|
addInstrumentation()
|
|
17
14
|
const app = express()
|
|
18
|
-
app
|
|
19
|
-
app.use(cors())
|
|
20
|
-
app.use(compression())
|
|
21
|
-
app.use(responseProfiler)
|
|
22
|
-
app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))
|
|
23
|
-
app.use(standardResponses)
|
|
24
|
-
disableExpressDefaultPoweredByHeader(app)
|
|
25
|
-
app.use(customPoweredByHeader)
|
|
26
|
-
disableCaseSensitiveRouting(app)
|
|
15
|
+
sharedMiddleware(app)
|
|
27
16
|
app.config = config
|
|
28
17
|
app.node = node
|
|
18
|
+
app.locator = locator
|
|
29
19
|
addRoutes(app)
|
|
30
20
|
app.use(standardErrors)
|
|
31
21
|
return app
|
package/src/server/index.ts
CHANGED
|
@@ -3,12 +3,14 @@ export * from './server.ts'
|
|
|
3
3
|
|
|
4
4
|
import type { RewardRedemptionConfig } from '@xyo-network/chain-orchestration'
|
|
5
5
|
import type { NodeInstance } from '@xyo-network/sdk-js'
|
|
6
|
+
import type { ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'
|
|
6
7
|
|
|
7
8
|
declare global {
|
|
8
9
|
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
9
10
|
namespace Express {
|
|
10
11
|
interface Application {
|
|
11
12
|
config: RewardRedemptionConfig
|
|
13
|
+
locator: ProviderFactoryLocatorInstance
|
|
12
14
|
node: NodeInstance
|
|
13
15
|
}
|
|
14
16
|
}
|
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
toAddress,
|
|
7
7
|
} from '@xylabs/sdk-js'
|
|
8
8
|
import { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'
|
|
9
|
-
import { ModuleErrorBuilder } from '@xyo-network/module-abstract'
|
|
10
9
|
import type {
|
|
11
10
|
ModuleError, ModuleInstance, ModuleQueryResult, Payload,
|
|
12
11
|
} from '@xyo-network/sdk-js'
|
|
12
|
+
import { ModuleErrorBuilder } from '@xyo-network/sdk-js'
|
|
13
13
|
import type { RequestHandler } from 'express'
|
|
14
14
|
import { StatusCodes } from 'http-status-codes'
|
|
15
15
|
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import type { RouteDefinition } from '@xylabs/express'
|
|
2
2
|
import { requestHandlerValidator } from '@xylabs/express'
|
|
3
3
|
import { assertEx, isDefined } from '@xylabs/sdk-js'
|
|
4
|
-
import type { NodeInstance, Payload } from '@xyo-network/sdk-js'
|
|
5
|
-
import { PayloadBuilder, PayloadZodLoose } from '@xyo-network/sdk-js'
|
|
6
|
-
import type { SentinelInstance } from '@xyo-network/sentinel-model'
|
|
7
|
-
import { asSentinelInstance } from '@xyo-network/sentinel-model'
|
|
8
4
|
import type {
|
|
9
|
-
|
|
10
|
-
} from '@xyo-network/
|
|
5
|
+
NodeInstance, Payload, SentinelInstance,
|
|
6
|
+
} from '@xyo-network/sdk-js'
|
|
7
|
+
import {
|
|
8
|
+
asSentinelInstance, PayloadBuilder, PayloadZodLoose,
|
|
9
|
+
} from '@xyo-network/sdk-js'
|
|
10
|
+
import type { StepIdentityPayload, XyoViewer } from '@xyo-network/xl1-sdk'
|
|
11
11
|
import {
|
|
12
|
-
asXL1BlockRange, blockRangeSteps,
|
|
13
|
-
HttpRpcRemoteConfigZod,
|
|
14
|
-
HttpRpcTransport,
|
|
12
|
+
asXL1BlockRange, blockRangeSteps,
|
|
15
13
|
StepIdentitySchema, XyoViewerMoniker,
|
|
16
14
|
} from '@xyo-network/xl1-sdk'
|
|
17
15
|
import { z } from 'zod'
|
|
@@ -37,17 +35,10 @@ export const postClaimRange: RouteDefinition = {
|
|
|
37
35
|
method: 'post',
|
|
38
36
|
path: '/rewards/claimRange',
|
|
39
37
|
handlers: validateRequest(async (req, res) => {
|
|
40
|
-
const {
|
|
38
|
+
const { locator, node } = req.app
|
|
41
39
|
const {
|
|
42
40
|
fromBlock, toBlock, step,
|
|
43
41
|
} = z.parse(query, req.query)
|
|
44
|
-
const httpRpcConfig = HttpRpcRemoteConfigZod.safeParse(config.remote?.rpc)
|
|
45
|
-
const endpoint = assertEx(
|
|
46
|
-
httpRpcConfig.success ? assertEx(httpRpcConfig.data.url, () => 'RPC URL is required for gateway [no httpConfig]') : undefined,
|
|
47
|
-
() => 'RPC URL is required for gateway',
|
|
48
|
-
)
|
|
49
|
-
const transportFactory: TransportFactory = (schemas: RpcSchemaMap) => new HttpRpcTransport(endpoint, schemas)
|
|
50
|
-
const locator = await buildJsonRpcProviderLocator({ transportFactory })
|
|
51
42
|
const viewer = await locator.getInstance<XyoViewer>(XyoViewerMoniker)
|
|
52
43
|
const from = isDefined(fromBlock) ? fromBlock : 0
|
|
53
44
|
const currentBlock = await viewer.currentBlockNumber()
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { RouteDefinition } from '@xylabs/express'
|
|
2
2
|
import { requestHandlerValidator } from '@xylabs/express'
|
|
3
3
|
import { assertEx } from '@xylabs/sdk-js'
|
|
4
|
-
import type { NodeInstance } from '@xyo-network/sdk-js'
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import type { NodeInstance, SentinelInstance } from '@xyo-network/sdk-js'
|
|
5
|
+
import {
|
|
6
|
+
asSentinelInstance, PayloadZodLoose, PayloadZodStrictOfSchema,
|
|
7
|
+
} from '@xyo-network/sdk-js'
|
|
8
8
|
import {
|
|
9
9
|
EIP712DataPayloadFieldsZod, EIP712DataPayloadSchema, EIP712SignaturePayloadFieldsZod,
|
|
10
10
|
EIP712SignaturePayloadSchema,
|
package/src/server/server.ts
CHANGED
|
@@ -7,7 +7,9 @@ import type { BiosExternalInterface } from '@xyo-network/bios-model'
|
|
|
7
7
|
import type { RewardRedemptionConfig } from '@xyo-network/chain-orchestration'
|
|
8
8
|
import type { NodeInstance } from '@xyo-network/sdk-js'
|
|
9
9
|
import { HDWallet } from '@xyo-network/sdk-js'
|
|
10
|
-
import type {
|
|
10
|
+
import type {
|
|
11
|
+
HostActorConfigContext, ProviderFactoryLocatorInstance, XyoGatewayRunner,
|
|
12
|
+
} from '@xyo-network/xl1-sdk'
|
|
11
13
|
|
|
12
14
|
import { getNode } from '../manifest/index.ts'
|
|
13
15
|
import { getApp } from './app.ts'
|
|
@@ -37,14 +39,14 @@ const getSeedPhrase = async (bios: BiosExternalInterface, config: RewardRedempti
|
|
|
37
39
|
return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire mnemonic from bios')
|
|
38
40
|
}
|
|
39
41
|
|
|
40
|
-
export const getServer = async (context: HostActorConfigContext, gateway: XyoGatewayRunner, providedNode?: NodeInstance) => {
|
|
42
|
+
export const getServer = async (context: HostActorConfigContext, gateway: XyoGatewayRunner, locator: ProviderFactoryLocatorInstance, providedNode?: NodeInstance) => {
|
|
41
43
|
const { logger, config } = context
|
|
42
44
|
const { port, mnemonic } = config
|
|
43
45
|
const bios = await boot()
|
|
44
46
|
const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)
|
|
45
47
|
const wallet = await HDWallet.fromPhrase(seedPhrase)
|
|
46
48
|
const node = providedNode ?? await getNode(context, gateway, wallet)
|
|
47
|
-
const app = getApp(node, config)
|
|
49
|
+
const app = getApp(node, config, locator)
|
|
48
50
|
const server = app.listen(port, hostname, () => logger?.log(`[RewardsRedemption] Server listening at http://${hostname}:${port}`))
|
|
49
51
|
server.setTimeout(120_000)
|
|
50
52
|
return server
|