Skip to content

Build the polytopelabs image against node-core from polytope-labs/subql - #2

Merged
Wizdave97 merged 1 commit into
mainfrom
polytope/node-core-from-fork
Sep 23, 2026
Merged

Wizdave97 merged 1 commit into
mainfrom
polytope/node-core-from-fork

Conversation

@Wizdave97

Copy link
Copy Markdown
Member

The EVM indexers need the node-core fixes made in polytope-labs/subql, such as the multichain rewind lock liveness fix in polytope-labs#3, before those fixes are released on npm. This builds polytopelabs/subql-node-ethereum against node-core from the fork instead of the npm package.

  • scripts/use-polytope-node-core.sh <subql checkout> builds and packs @subql/node-core from a polytope-labs/subql checkout into vendor/subql-node-core.tgz, then points @subql/node-ethereum at that tarball. node-core's other @subql/* dependencies still resolve from npm, because the fork only changes node-core and the substrate node.
  • packages/node/polytope/Dockerfile is the upstream Dockerfile, except it installs node-core from the tarball. The upstream Dockerfile is unchanged so upstream syncs stay clean.
  • .github/workflows/polytopelabs-docker.yml runs on manual dispatch (inputs subqlRef, default main, and isLatest) or when a node-ethereum/v* tag is pushed. It pushes v<version> and v<version>-<subql commit>, plus latest when requested. The commit tag pins the exact node-core build.

Tested by building the image locally for amd64 against the PR subquery#3 branch. The image contains exactly one @subql/node-core, version 19.3.4-0 with the rewind fix, and --version prints 6.5.0. The workflow itself has not been run yet.

Node-core fixes only reach the image once they are on the ref being built: main by default, which PR subquery#3 has not been merged into yet.

🤖 Generated with Claude Code

Adds a workflow that packs @subql/node-core from a polytope-labs/subql ref
(default main), points @subql/node-ethereum at that tarball instead of npm,
and publishes polytopelabs/subql-node-ethereum from a Dockerfile that
installs the same tarball.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Coverage report

Caution

Test run failed

St.❔
Category Percentage Covered / Total
🔴 Statements 47.77% 3016/6313
🟡 Branches 69.5% 319/459
🔴 Functions 39.1% 104/266
🔴 Lines 47.77% 3016/6313

Test suite run failed

Failed tests: 34/109. Failed suites: 8/16.
  ● Codegen spec › validate Abi.json Indexed Topic

    expect(received).resolves.toBeDefined()

    Received promise rejected instead of resolved
    Rejected to value: [TypeError: prepareDirPath is not a function]

      384 |     };
      385 |
    > 386 |     await expect(
          |           ^
      387 |       generateAbis([ds], PROJECT_PATH, undefined as any, undefined as any, undefined as any)
      388 |     ).resolves.toBeDefined();
      389 |   });

      at expect (node_modules/expect/build/index.js:105:15)
      at Object.<anonymous> (packages/common-ethereum/src/codegen/codegen-controller.spec.ts:386:11)


  ● UnfinalizedBlockService › handles a block fork

    TypeError: this.apiService.api.getBestBlockHeight is not a function

      84 |
      85 |   async getBestHeight(): Promise<number> {
    > 86 |     return this.apiService.api.getBestBlockHeight();
         |                                ^
      87 |   }
      88 |
      89 |   // eslint-disable-next-line @typescript-eslint/require-await

      at BlockchainService.getBestHeight (packages/node/src/blockchain.service.ts:86:32)
      at UnfinalizedBlocksService.registerUnfinalizedBlock (node_modules/@subql/node-core/src/indexer/unfinalizedBlocks.service.ts:146:61)
      at UnfinalizedBlocksService.processUnfinalizedBlockHeader (node_modules/@subql/node-core/src/indexer/unfinalizedBlocks.service.ts:109:33)
      at Object.<anonymous> (packages/node/src/indexer/unfinalizedBlocks.service.spec.ts:121:44)

  ● UnfinalizedBlockService › uses POI blocks if there are not enough cached unfinalized blocks

    TypeError: this.apiService.api.getBestBlockHeight is not a function

      84 |
      85 |   async getBestHeight(): Promise<number> {
    > 86 |     return this.apiService.api.getBestBlockHeight();
         |                                ^
      87 |   }
      88 |
      89 |   // eslint-disable-next-line @typescript-eslint/require-await

      at BlockchainService.getBestHeight (packages/node/src/blockchain.service.ts:86:32)
      at UnfinalizedBlocksService.registerUnfinalizedBlock (node_modules/@subql/node-core/src/indexer/unfinalizedBlocks.service.ts:146:61)
      at UnfinalizedBlocksService.processUnfinalizedBlockHeader (node_modules/@subql/node-core/src/indexer/unfinalizedBlocks.service.ts:109:33)
      at Object.<anonymous> (packages/node/src/indexer/unfinalizedBlocks.service.spec.ts:147:44)

  ● UnfinalizedBlockService › rewinds using blockForkReindex value if poi is not enabled

    invalid hex string (argument="value", value="0xABC-1f", code=INVALID_ARGUMENT, version=bytes/5.7.0)

      18 |
      19 | // Adds 0 padding so we can convert to POI block
    > 20 | const hexify = (input: string) => hexZeroPad(input, 4);
         |                                             ^
      21 |
      22 | // Mock 1740100000 is the timestamp of the genesis block
      23 | const genBlockTimestamp = (height: number) => (1740100000 + height) * 1000;

      at Logger.Object.<anonymous>.Logger.makeError (node_modules/@ethersproject/logger/src.ts/index.ts:269:28)
      at Logger.Object.<anonymous>.Logger.throwError (node_modules/@ethersproject/logger/src.ts/index.ts:281:20)
      at Logger.Object.<anonymous>.Logger.throwArgumentError (node_modules/@ethersproject/logger/src.ts/index.ts:285:21)
      at hexZeroPad (node_modules/@ethersproject/bytes/src.ts/index.ts:319:16)
      at hexify (packages/node/src/indexer/unfinalizedBlocks.service.spec.ts:20:45)
      at Object.getBlockByHeightOrHash (packages/node/src/indexer/unfinalizedBlocks.service.spec.ts:50:23)
      at BlockchainService.getHeaderForHeight (packages/node/src/blockchain.service.ts:102:45)
      at UnfinalizedBlocksService.getLastCorrectFinalizedBlock (packages/node/src/indexer/unfinalizedBlocks.service.ts:140:39)
      at UnfinalizedBlocksService.init (node_modules/@subql/node-core/src/indexer/unfinalizedBlocks.service.ts:83:28)
      at Object.<anonymous> (packages/node/src/indexer/unfinalizedBlocks.service.spec.ts:229:5)


  ● Api.ethereum › Should format transaction in logs, and the transaction gas should be bigInt type

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › should have the ability to get receipts via transactions from all types

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Decode nested logs in transactions

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Should decode transaction data and not clone object

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Should return raw logs, if decode fails

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Should not clone logs when parsing args

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Null filter support

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › !null filter support for logs, expect to filter out

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Null and 0x (empty) filter support for transaction data

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Null filter support, for undefined transaction.to

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Should return all tx if filter.to is not defined

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › filter.to Should support only null not undefined

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › If transaction is undefined, with null filter, should be supported

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Filters transaction type correctly

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Resolve the correct finalization tags for https://ethereum-rpc.publicnode.com

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Resolve the correct finalization tags for https://rpc.api.moonbeam.network

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Resolve the correct finalization tags for https://binance.llamarpc.com

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Resolve the correct finalization tags for https://polygon-rpc.com

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Assert blockHash on logs and block

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Should able to check is fullBlock

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15

  ● Api.ethereum › Should have the ERC-4844 Fields

    pruned history unavailable: requested 0, earliest available 15500000

      173 |             );
      174 |           } else if (payload.error) {
    > 175 |             const error = new Error(payload.error.message);
          |                           ^
      176 |             (<any>error).code = payload.error.code;
      177 |             (<any>error).data = payload.error.data;
      178 |             if (

      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:175:27
          at Array.forEach (<anonymous>)
      at packages/node/src/ethereum/ethers/json-rpc-batch-provider.ts:166:15


  ● rawBlockToEthBlock › successfully converts a block

    missing response (requestBody="[{\"method\":\"eth_getBlockByNumber\",\"params\":[\"0x3e579e\",true],\"id\":42,\"jsonrpc\":\"2.0\"}]", requestMethod="POST", serverError={"code":"ENOTFOUND","hostname":"ethereum.rpc.subquery.network"}, url="https://ethereum.rpc.subquery.network/public", code=SERVER_ERROR, version=web/5.7.1)

      371 |         response = (<any>error).response;
      372 |         if (response == null) runningTimeout.cancel();
    > 373 |         throw logger.throwError(
          |                      ^
      374 |           'missing response',
      375 |           Logger.errors.SERVER_ERROR,
      376 |           {

      at Logger.Object.<anonymous>.Logger.makeError (node_modules/@ethersproject/logger/src.ts/index.ts:269:28)
      at Logger.Object.<anonymous>.Logger.throwError (node_modules/@ethersproject/logger/src.ts/index.ts:281:20)
      at packages/node/src/ethereum/ethers/web/index.ts:373:22

  ● rawBlockToEthBlock › can fetch receipts

    missing response (requestBody="[{\"method\":\"eth_getBlockByNumber\",\"params\":[\"0x3e579e\",true],\"id\":42,\"jsonrpc\":\"2.0\"}]", requestMethod="POST", serverError={"code":"ENOTFOUND","hostname":"ethereum.rpc.subquery.network"}, url="https://ethereum.rpc.subquery.network/public", code=SERVER_ERROR, version=web/5.7.1)

      371 |         response = (<any>error).response;
      372 |         if (response == null) runningTimeout.cancel();
    > 373 |         throw logger.throwError(
          |                      ^
      374 |           'missing response',
      375 |           Logger.errors.SERVER_ERROR,
      376 |           {

      at Logger.Object.<anonymous>.Logger.makeError (node_modules/@ethersproject/logger/src.ts/index.ts:269:28)
      at Logger.Object.<anonymous>.Logger.throwError (node_modules/@ethersproject/logger/src.ts/index.ts:281:20)
      at packages/node/src/ethereum/ethers/web/index.ts:373:22


  ● Test suite failed to run

    Jest worker encountered 4 child process exceptions, exceeding retry limit

      at ChildProcessWorker.initialize (node_modules/jest-worker/build/workers/ChildProcessWorker.js:181:21)


  ● OPRPCProviders › should work with a network that isnt OP based

    could not detect network (event="noNetwork", code=NETWORK_ERROR, version=providers/5.7.2)

      at Logger.Object.<anonymous>.Logger.makeError (node_modules/@ethersproject/logger/src.ts/index.ts:269:28)
      at Logger.Object.<anonymous>.Logger.throwError (node_modules/@ethersproject/logger/src.ts/index.ts:281:20)
      at OPProvider.<anonymous> (node_modules/@ethersproject/providers/src.ts/json-rpc-provider.ts:483:23)
      at step (node_modules/@ethersproject/providers/lib/json-rpc-provider.js:48:23)
      at Object.throw (node_modules/@ethersproject/providers/lib/json-rpc-provider.js:29:53)
      at rejected (node_modules/@ethersproject/providers/lib/json-rpc-provider.js:21:65)


  ● ApiService › can instantiate api

    All endpoints failed to initialize. Please add healthier endpoints

      88 |     );
      89 |
    > 90 |     await apiService.createConnections(network, (endpoint, config) =>
         |     ^
      91 |       EthereumApiConnection.create(
      92 |         endpoint,
      93 |         ethNodeConfig.blockConfirmations,

      at EthereumApiService.createConnections (node_modules/@subql/node-core/src/api.service.ts:128:13)
      at InstanceWrapper.init [as metatype] (packages/node/src/ethereum/api.service.ethereum.ts:90:5)
      at TestingInjector.instantiateClass (node_modules/@nestjs/core/injector/injector.js:377:37)
      at callback (node_modules/@nestjs/core/injector/injector.js:65:34)
      at TestingInjector.resolveConstructorParams (node_modules/@nestjs/core/injector/injector.js:145:24)
      at TestingInjector.loadInstance (node_modules/@nestjs/core/injector/injector.js:70:13)
      at TestingInjector.loadProvider (node_modules/@nestjs/core/injector/injector.js:98:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:56:13
          at async Promise.all (index 7)
      at TestingInstanceLoader.createInstancesOfProviders (node_modules/@nestjs/core/injector/instance-loader.js:55:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:40:13
          at async Promise.all (index 1)
      at TestingInstanceLoader.createInstances (node_modules/@nestjs/core/injector/instance-loader.js:39:9)
      at TestingInstanceLoader.createInstancesOfDependencies (node_modules/@nestjs/core/injector/instance-loader.js:22:13)
      at TestingInstanceLoader.createInstancesOfDependencies (node_modules/@nestjs/testing/testing-instance-loader.js:9:9)
      at TestingModuleBuilder.createInstancesOfDependencies (node_modules/@nestjs/testing/testing-module.builder.js:118:9)
      at TestingModuleBuilder.compile (node_modules/@nestjs/testing/testing-module.builder.js:74:9)
      at prepareApiService (packages/node/src/ethereum/api.service.ethereum.test.ts:37:18)
      at Object.<anonymous> (packages/node/src/ethereum/api.service.ethereum.test.ts:75:25)

    Cause:
    AggregateError: All promises were rejected



  ● ApiService › can fetch blocks

    All endpoints failed to initialize. Please add healthier endpoints

      88 |     );
      89 |
    > 90 |     await apiService.createConnections(network, (endpoint, config) =>
         |     ^
      91 |       EthereumApiConnection.create(
      92 |         endpoint,
      93 |         ethNodeConfig.blockConfirmations,

      at EthereumApiService.createConnections (node_modules/@subql/node-core/src/api.service.ts:128:13)
      at InstanceWrapper.init [as metatype] (packages/node/src/ethereum/api.service.ethereum.ts:90:5)
      at TestingInjector.instantiateClass (node_modules/@nestjs/core/injector/injector.js:377:37)
      at callback (node_modules/@nestjs/core/injector/injector.js:65:34)
      at TestingInjector.resolveConstructorParams (node_modules/@nestjs/core/injector/injector.js:145:24)
      at TestingInjector.loadInstance (node_modules/@nestjs/core/injector/injector.js:70:13)
      at TestingInjector.loadProvider (node_modules/@nestjs/core/injector/injector.js:98:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:56:13
          at async Promise.all (index 7)
      at TestingInstanceLoader.createInstancesOfProviders (node_modules/@nestjs/core/injector/instance-loader.js:55:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:40:13
          at async Promise.all (index 1)
      at TestingInstanceLoader.createInstances (node_modules/@nestjs/core/injector/instance-loader.js:39:9)
      at TestingInstanceLoader.createInstancesOfDependencies (node_modules/@nestjs/core/injector/instance-loader.js:22:13)
      at TestingInstanceLoader.createInstancesOfDependencies (node_modules/@nestjs/testing/testing-instance-loader.js:9:9)
      at TestingModuleBuilder.createInstancesOfDependencies (node_modules/@nestjs/testing/testing-module.builder.js:118:9)
      at TestingModuleBuilder.compile (node_modules/@nestjs/testing/testing-module.builder.js:74:9)
      at prepareApiService (packages/node/src/ethereum/api.service.ethereum.test.ts:37:18)
      at Object.<anonymous> (packages/node/src/ethereum/api.service.ethereum.test.ts:75:25)

    Cause:
    AggregateError: All promises were rejected



  ● ApiService › can get the finalized height

    All endpoints failed to initialize. Please add healthier endpoints

      88 |     );
      89 |
    > 90 |     await apiService.createConnections(network, (endpoint, config) =>
         |     ^
      91 |       EthereumApiConnection.create(
      92 |         endpoint,
      93 |         ethNodeConfig.blockConfirmations,

      at EthereumApiService.createConnections (node_modules/@subql/node-core/src/api.service.ts:128:13)
      at InstanceWrapper.init [as metatype] (packages/node/src/ethereum/api.service.ethereum.ts:90:5)
      at TestingInjector.instantiateClass (node_modules/@nestjs/core/injector/injector.js:377:37)
      at callback (node_modules/@nestjs/core/injector/injector.js:65:34)
      at TestingInjector.resolveConstructorParams (node_modules/@nestjs/core/injector/injector.js:145:24)
      at TestingInjector.loadInstance (node_modules/@nestjs/core/injector/injector.js:70:13)
      at TestingInjector.loadProvider (node_modules/@nestjs/core/injector/injector.js:98:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:56:13
          at async Promise.all (index 7)
      at TestingInstanceLoader.createInstancesOfProviders (node_modules/@nestjs/core/injector/instance-loader.js:55:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:40:13
          at async Promise.all (index 1)
      at TestingInstanceLoader.createInstances (node_modules/@nestjs/core/injector/instance-loader.js:39:9)
      at TestingInstanceLoader.createInstancesOfDependencies (node_modules/@nestjs/core/injector/instance-loader.js:22:13)
      at TestingInstanceLoader.createInstancesOfDependencies (node_modules/@nestjs/testing/testing-instance-loader.js:9:9)
      at TestingModuleBuilder.createInstancesOfDependencies (node_modules/@nestjs/testing/testing-module.builder.js:118:9)
      at TestingModuleBuilder.compile (node_modules/@nestjs/testing/testing-module.builder.js:74:9)
      at prepareApiService (packages/node/src/ethereum/api.service.ethereum.test.ts:37:18)
      at Object.<anonymous> (packages/node/src/ethereum/api.service.ethereum.test.ts:75:25)

    Cause:
    AggregateError: All promises were rejected



  ● ApiService › ensure api errorCode is exposed when throwing

    All endpoints failed to initialize. Please add healthier endpoints

      88 |     );
      89 |
    > 90 |     await apiService.createConnections(network, (endpoint, config) =>
         |     ^
      91 |       EthereumApiConnection.create(
      92 |         endpoint,
      93 |         ethNodeConfig.blockConfirmations,

      at EthereumApiService.createConnections (node_modules/@subql/node-core/src/api.service.ts:128:13)
      at InstanceWrapper.init [as metatype] (packages/node/src/ethereum/api.service.ethereum.ts:90:5)
      at TestingInjector.instantiateClass (node_modules/@nestjs/core/injector/injector.js:377:37)
      at callback (node_modules/@nestjs/core/injector/injector.js:65:34)
      at TestingInjector.resolveConstructorParams (node_modules/@nestjs/core/injector/injector.js:145:24)
      at TestingInjector.loadInstance (node_modules/@nestjs/core/injector/injector.js:70:13)
      at TestingInjector.loadProvider (node_modules/@nestjs/core/injector/injector.js:98:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:56:13
          at async Promise.all (index 7)
      at TestingInstanceLoader.createInstancesOfProviders (node_modules/@nestjs/core/injector/instance-loader.js:55:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:40:13
          at async Promise.all (index 1)
      at TestingInstanceLoader.createInstances (node_modules/@nestjs/core/injector/instance-loader.js:39:9)
      at TestingInstanceLoader.createInstancesOfDependencies (node_modules/@nestjs/core/injector/instance-loader.js:22:13)
      at TestingInstanceLoader.createInstancesOfDependencies (node_modules/@nestjs/testing/testing-instance-loader.js:9:9)
      at TestingModuleBuilder.createInstancesOfDependencies (node_modules/@nestjs/testing/testing-module.builder.js:118:9)
      at TestingModuleBuilder.compile (node_modules/@nestjs/testing/testing-module.builder.js:74:9)
      at prepareApiService (packages/node/src/ethereum/api.service.ethereum.test.ts:37:18)
      at Object.<anonymous> (packages/node/src/ethereum/api.service.ethereum.test.ts:75:25)

    Cause:
    AggregateError: All promises were rejected



  ● ApiService › should not retry on any errors not in the retry list

    All endpoints failed to initialize. Please add healthier endpoints

      88 |     );
      89 |
    > 90 |     await apiService.createConnections(network, (endpoint, config) =>
         |     ^
      91 |       EthereumApiConnection.create(
      92 |         endpoint,
      93 |         ethNodeConfig.blockConfirmations,

      at EthereumApiService.createConnections (node_modules/@subql/node-core/src/api.service.ts:128:13)
      at InstanceWrapper.init [as metatype] (packages/node/src/ethereum/api.service.ethereum.ts:90:5)
      at TestingInjector.instantiateClass (node_modules/@nestjs/core/injector/injector.js:377:37)
      at callback (node_modules/@nestjs/core/injector/injector.js:65:34)
      at TestingInjector.resolveConstructorParams (node_modules/@nestjs/core/injector/injector.js:145:24)
      at TestingInjector.loadInstance (node_modules/@nestjs/core/injector/injector.js:70:13)
      at TestingInjector.loadProvider (node_modules/@nestjs/core/injector/injector.js:98:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:56:13
          at async Promise.all (index 7)
      at TestingInstanceLoader.createInstancesOfProviders (node_modules/@nestjs/core/injector/instance-loader.js:55:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:40:13
          at async Promise.all (index 1)
      at TestingInstanceLoader.createInstances (node_modules/@nestjs/core/injector/instance-loader.js:39:9)
      at TestingInstanceLoader.createInstancesOfDependencies (node_modules/@nestjs/core/injector/instance-loader.js:22:13)
      at TestingInstanceLoader.createInstancesOfDependencies (node_modules/@nestjs/testing/testing-instance-loader.js:9:9)
      at TestingModuleBuilder.createInstancesOfDependencies (node_modules/@nestjs/testing/testing-module.builder.js:118:9)
      at TestingModuleBuilder.compile (node_modules/@nestjs/testing/testing-module.builder.js:74:9)
      at prepareApiService (packages/node/src/ethereum/api.service.ethereum.test.ts:37:18)
      at Object.<anonymous> (packages/node/src/ethereum/api.service.ethereum.test.ts:75:25)

    Cause:
    AggregateError: All promises were rejected




  ● BlockchainService › can get a block timestamps

    could not detect network (event="noNetwork", code=NETWORK_ERROR, version=providers/5.7.2)

      at Logger.Object.<anonymous>.Logger.makeError (node_modules/@ethersproject/logger/src.ts/index.ts:269:28)
      at Logger.Object.<anonymous>.Logger.throwError (node_modules/@ethersproject/logger/src.ts/index.ts:281:20)
      at OPProvider.<anonymous> (node_modules/@ethersproject/providers/src.ts/json-rpc-provider.ts:483:23)
      at step (node_modules/@ethersproject/providers/lib/json-rpc-provider.js:48:23)
      at Object.throw (node_modules/@ethersproject/providers/lib/json-rpc-provider.js:29:53)
      at rejected (node_modules/@ethersproject/providers/lib/json-rpc-provider.js:21:65)

Report generated by 🧪jest coverage report action from 4415c24

@Wizdave97
Wizdave97 merged commit 8a8a665 into main Sep 23, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant