From 2c1e3a11b0d5c4318e407cafe070e501242c351b Mon Sep 17 00:00:00 2001 From: Anxo Rodriguez Date: Fri, 19 Jul 2024 14:11:11 +0100 Subject: [PATCH 1/7] feat: add setting to throttle block consumption --- src/types/config.schema.json | 6 ++++++ src/types/types.d.ts | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/src/types/config.schema.json b/src/types/config.schema.json index 0fa1078..eae3f01 100644 --- a/src/types/config.schema.json +++ b/src/types/config.schema.json @@ -20,6 +20,12 @@ "watchdogTimeout": { "type": "integer" }, + "processEveryNumBlocks": { + "type": "integer", + "minimum": 1, + "description": "Throttle block processing to only process blocks every N blocks. Set to 1 to process every block, 2 to process every other block, etc.", + "default": 1 + }, "orderBookApi": { "type": "string", "format": "uri" diff --git a/src/types/types.d.ts b/src/types/types.d.ts index ad4b8d5..e7a35f0 100644 --- a/src/types/types.d.ts +++ b/src/types/types.d.ts @@ -13,6 +13,10 @@ export interface Config { rpc: string; deploymentBlock: number; watchdogTimeout?: number; + /** + * Throttle block processing to only process blocks every N blocks. Set to 1 to process every block, 2 to process every other block, etc. + */ + processEveryNumBlocks?: number; orderBookApi?: string; pageSize?: number; filterPolicy: { From aaa7e1f4747a3521d0b53f5ad9175a4d51b08691 Mon Sep 17 00:00:00 2001 From: Anxo Rodriguez Date: Fri, 19 Jul 2024 14:11:38 +0100 Subject: [PATCH 2/7] feat: implement setting to throttle block consumption --- src/services/chain.ts | 49 ++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/services/chain.ts b/src/services/chain.ts index 95ed594..b9e01b9 100644 --- a/src/services/chain.ts +++ b/src/services/chain.ts @@ -77,6 +77,8 @@ export class ChainContext { readonly dryRun: boolean; readonly watchdogTimeout: number; readonly addresses?: string[]; + readonly processEveryNumBlocks: number; + private sync: ChainSync = ChainSync.SYNCING; static chains: Chains = {}; @@ -106,6 +108,7 @@ export class ChainContext { this.deploymentBlock = deploymentBlock; this.pageSize = pageSize ?? PAGE_SIZE_DEFAULT; this.dryRun = dryRun; + this.processEveryNumBlocks = options.processEveryNumBlocks ?? 1; this.watchdogTimeout = watchdogTimeout ?? WATCHDOG_TIMEOUT_DEFAULT_SECS; this.addresses = owners; @@ -311,9 +314,8 @@ export class ChainContext { let lastBlockReceived = lastProcessedBlock; provider.on("block", async (blockNumber: number) => { try { - const block = await provider.getBlock(blockNumber); - log.debug(`New block ${blockNumber}`); + const block = await provider.getBlock(blockNumber); // Set the block time metric const _blockTime = block.timestamp - lastBlockReceived.timestamp; @@ -434,7 +436,7 @@ async function processBlock( blockNumberOverride?: number, blockTimestampOverride?: number ) { - const { provider, chainId } = context; + const { provider, chainId, processEveryNumBlocks } = context; const timer = metrics.processBlockDurationSeconds .labels(context.chainId.toString()) .startTimer(); @@ -463,24 +465,29 @@ async function processBlock( } } - // run action - const result = await checkForAndPlaceOrder( - context, - block, - blockNumberOverride, - blockTimestampOverride - ) - .then(() => true) - .catch(() => { - hasErrors = true; - log.error(`Error running "checkForAndPlaceOrder" action`); - return false; - }); - log.debug( - `Result of "checkForAndPlaceOrder" action for block ${ - block.number - }: ${_formatResult(result)}` - ); + // Decide if we should process this block + const shouldProcessBlock = block.number % processEveryNumBlocks === 0; + + // Check programmatic orders and place orders if necessary + if (shouldProcessBlock) { + const result = await checkForAndPlaceOrder( + context, + block, + blockNumberOverride, + blockTimestampOverride + ) + .then(() => true) + .catch(() => { + hasErrors = true; + log.error(`Error running "checkForAndPlaceOrder" action`); + return false; + }); + log.debug( + `Result of "checkForAndPlaceOrder" action for block ${ + block.number + }: ${_formatResult(result)}` + ); + } timer(); if (hasErrors) { From 0b215e88bde0a33954152749fd909ebe6a7356ab Mon Sep 17 00:00:00 2001 From: Anxo Rodriguez Date: Fri, 19 Jul 2024 15:01:09 +0100 Subject: [PATCH 3/7] docs: mention the default behaviour --- src/services/chain.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/services/chain.ts b/src/services/chain.ts index b9e01b9..e431f67 100644 --- a/src/services/chain.ts +++ b/src/services/chain.ts @@ -171,7 +171,7 @@ export class ChainContext { * @returns the run promises for what needs to be watched */ public async warmUp(oneShot?: boolean) { - const { provider, chainId } = this; + const { provider, chainId, processEveryNumBlocks } = this; const log = getLogger("chainContext:warmUp", chainId.toString()); let { lastProcessedBlock } = this.registry; const { pageSize } = this; @@ -216,7 +216,13 @@ export class ChainContext { log.info( `🔄 Start sync with from block ${fromBlock} to ${toBlock}. Pending ${ toBlock - fromBlock - } blocks (~${Math.ceil((toBlock - fromBlock) / pageSize)} pages)` + } blocks (~${Math.ceil( + (toBlock - fromBlock) / pageSize + )} pages, processing every ${ + processEveryNumBlocks > 1 + ? processEveryNumBlocks + " blocks" + : "block" + })` ); } From 6c1c6bc29694ddced579f8cf5d43b2439b1cf247 Mon Sep 17 00:00:00 2001 From: Anxo Rodriguez Date: Fri, 19 Jul 2024 15:04:44 +0100 Subject: [PATCH 4/7] fix: build issue --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 53fb23b..74ee527 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "lint": "eslint \"src/**/*.ts\" && prettier --check \"src/**/*.ts\"", "lint:fix": "eslint --fix \"src/**/*.ts\" && prettier --write \"src/**/*.ts\"", "test": "yarn build && jest ./dist", - "typechain": "typechain --target ethers-v5 --out-dir src/types/generated/ \"abi/*.json\"", + "typechain": "npx typechain --target ethers-v5 --out-dir src/types/generated/ \"abi/*.json\"", "configschema": "node ./src/types/build.js", "prepare": "husky install && yarn typechain && yarn configschema", "cli": "ts-node src/index.ts" From 95c771ff0673d1b55ca181be4567e6011ebdc44a Mon Sep 17 00:00:00 2001 From: Anxo Rodriguez Date: Fri, 19 Jul 2024 15:05:02 +0100 Subject: [PATCH 5/7] chore: document default setting --- src/types/config.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/config.schema.json b/src/types/config.schema.json index eae3f01..94f5706 100644 --- a/src/types/config.schema.json +++ b/src/types/config.schema.json @@ -23,7 +23,7 @@ "processEveryNumBlocks": { "type": "integer", "minimum": 1, - "description": "Throttle block processing to only process blocks every N blocks. Set to 1 to process every block, 2 to process every other block, etc.", + "description": "Throttle block processing to only process blocks every N blocks. Set to 1 to process every block (default), 2 to process every other block, etc.", "default": 1 }, "orderBookApi": { From 7fb00939c22dda5d58d9ecc1a3479ba65e1a9ac2 Mon Sep 17 00:00:00 2001 From: Anxo Rodriguez Date: Fri, 19 Jul 2024 19:34:40 +0100 Subject: [PATCH 6/7] fix: build --- Dockerfile | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index d1ba017..d130ed9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:alpine AS build +FROM node:22-alpine AS build WORKDIR /usr/src/app diff --git a/package.json b/package.json index 74ee527..53fb23b 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "lint": "eslint \"src/**/*.ts\" && prettier --check \"src/**/*.ts\"", "lint:fix": "eslint --fix \"src/**/*.ts\" && prettier --write \"src/**/*.ts\"", "test": "yarn build && jest ./dist", - "typechain": "npx typechain --target ethers-v5 --out-dir src/types/generated/ \"abi/*.json\"", + "typechain": "typechain --target ethers-v5 --out-dir src/types/generated/ \"abi/*.json\"", "configschema": "node ./src/types/build.js", "prepare": "husky install && yarn typechain && yarn configschema", "cli": "ts-node src/index.ts" From 7f9bb15aa08482e895790391dcbd9ac09e93ec07 Mon Sep 17 00:00:00 2001 From: Anxo Rodriguez Date: Fri, 19 Jul 2024 19:46:44 +0100 Subject: [PATCH 7/7] fix: docker build --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index d130ed9..f6f2047 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22-alpine AS build +FROM node:22.2-alpine AS build WORKDIR /usr/src/app