@subql/node-ethereum 5.4.1-0 → 5.4.1-2
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/CHANGELOG.md +6 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/blockchain.service.d.ts +30 -0
- package/dist/blockchain.service.js +112 -0
- package/dist/blockchain.service.js.map +1 -0
- package/dist/{indexer/project.service.test.js → blockchain.service.test.js} +7 -7
- package/dist/blockchain.service.test.js.map +1 -0
- package/dist/ethereum/api.service.ethereum.d.ts +2 -2
- package/dist/ethereum/api.service.ethereum.js +11 -8
- package/dist/ethereum/api.service.ethereum.js.map +1 -1
- package/dist/ethereum/api.service.ethereum.test.js +10 -2
- package/dist/ethereum/api.service.ethereum.test.js.map +1 -1
- package/dist/ethereum/ethers/celo/celo-provider.d.ts +18 -18
- package/dist/ethereum/ethers/op/op-provider.d.ts +20 -20
- package/dist/ethereum/utils.ethereum.js +1 -0
- package/dist/ethereum/utils.ethereum.js.map +1 -1
- package/dist/indexer/dictionary/ethDictionary.service.js +1 -1
- package/dist/indexer/dictionary/ethDictionary.service.js.map +1 -1
- package/dist/indexer/fetch.module.js +30 -24
- package/dist/indexer/fetch.module.js.map +1 -1
- package/dist/indexer/indexer.manager.d.ts +3 -5
- package/dist/indexer/indexer.manager.js +14 -12
- package/dist/indexer/indexer.manager.js.map +1 -1
- package/dist/indexer/unfinalizedBlocks.service.d.ts +3 -6
- package/dist/indexer/unfinalizedBlocks.service.js +10 -41
- package/dist/indexer/unfinalizedBlocks.service.js.map +1 -1
- package/dist/indexer/unfinalizedBlocks.service.spec.js +19 -9
- package/dist/indexer/unfinalizedBlocks.service.spec.js.map +1 -1
- package/dist/indexer/worker/worker-fetch.module.js +7 -18
- package/dist/indexer/worker/worker-fetch.module.js.map +1 -1
- package/dist/indexer/worker/worker.js.map +1 -1
- package/dist/indexer/worker/worker.service.js +1 -0
- package/dist/indexer/worker/worker.service.js.map +1 -1
- package/dist/init.js +1 -2
- package/dist/init.js.map +1 -1
- package/dist/subcommands/reindex.module.js +10 -11
- package/dist/subcommands/reindex.module.js.map +1 -1
- package/dist/subcommands/testing.module.js +14 -31
- package/dist/subcommands/testing.module.js.map +1 -1
- package/dist/subcommands/testing.service.d.ts +1 -3
- package/dist/subcommands/testing.service.js +0 -3
- package/dist/subcommands/testing.service.js.map +1 -1
- package/package.json +12 -12
- package/dist/indexer/blockDispatcher/block-dispatcher.service.d.ts +0 -15
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js +0 -51
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +0 -1
- package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.d.ts +0 -5
- package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.js +0 -5
- package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.js.map +0 -1
- package/dist/indexer/blockDispatcher/index.d.ts +0 -4
- package/dist/indexer/blockDispatcher/index.js +0 -10
- package/dist/indexer/blockDispatcher/index.js.map +0 -1
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.d.ts +0 -17
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +0 -48
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +0 -1
- package/dist/indexer/ds-processor.service.d.ts +0 -5
- package/dist/indexer/ds-processor.service.js +0 -22
- package/dist/indexer/ds-processor.service.js.map +0 -1
- package/dist/indexer/dynamic-ds.service.d.ts +0 -8
- package/dist/indexer/dynamic-ds.service.js +0 -69
- package/dist/indexer/dynamic-ds.service.js.map +0 -1
- package/dist/indexer/fetch.service.d.ts +0 -20
- package/dist/indexer/fetch.service.js +0 -74
- package/dist/indexer/fetch.service.js.map +0 -1
- package/dist/indexer/project.service.d.ts +0 -16
- package/dist/indexer/project.service.js +0 -77
- package/dist/indexer/project.service.js.map +0 -1
- package/dist/indexer/project.service.test.js.map +0 -1
- /package/dist/{indexer/project.service.test.d.ts → blockchain.service.test.d.ts} +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { EthereumHandlerKind, isCustomDs, isRuntimeDs, SubqlEthereumDataSource } from '@subql/common-ethereum';
|
|
2
|
+
import { DatasourceParams, Header, IBlock, IBlockchainService } from '@subql/node-core';
|
|
3
|
+
import { EthereumBlock, LightEthereumBlock, SubqlCustomDatasource, SubqlCustomHandler, SubqlDatasource, SubqlMapping } from '@subql/types-ethereum';
|
|
4
|
+
import { SubqueryProject } from './configure/SubqueryProject';
|
|
5
|
+
import { EthereumApiService } from './ethereum';
|
|
6
|
+
import SafeEthProvider from './ethereum/safe-api';
|
|
7
|
+
import { BlockContent } from './indexer/types';
|
|
8
|
+
import { IIndexerWorker } from './indexer/worker/worker';
|
|
9
|
+
export declare class BlockchainService implements IBlockchainService<SubqlDatasource, SubqlCustomDatasource<string, SubqlMapping<SubqlCustomHandler>>, SubqueryProject, SafeEthProvider, LightEthereumBlock, EthereumBlock, IIndexerWorker> {
|
|
10
|
+
private apiService;
|
|
11
|
+
blockHandlerKind: EthereumHandlerKind;
|
|
12
|
+
isCustomDs: typeof isCustomDs;
|
|
13
|
+
isRuntimeDs: typeof isRuntimeDs;
|
|
14
|
+
packageVersion: any;
|
|
15
|
+
constructor(apiService: EthereumApiService);
|
|
16
|
+
fetchBlocks(blockNums: number[]): Promise<IBlock<EthereumBlock>[] | IBlock<LightEthereumBlock>[]>;
|
|
17
|
+
fetchBlockWorker(worker: IIndexerWorker, blockNum: number, context: {
|
|
18
|
+
workers: IIndexerWorker[];
|
|
19
|
+
}): Promise<Header>;
|
|
20
|
+
getBlockSize(block: IBlock<BlockContent>): number;
|
|
21
|
+
getFinalizedHeader(): Promise<Header>;
|
|
22
|
+
getBestHeight(): Promise<number>;
|
|
23
|
+
getChainInterval(): Promise<number>;
|
|
24
|
+
getHeaderForHash(hash: string): Promise<Header>;
|
|
25
|
+
getHeaderForHeight(height: number): Promise<Header>;
|
|
26
|
+
getSafeApi(block: BlockContent): Promise<SafeEthProvider>;
|
|
27
|
+
getBlockTimestamp(height: number): Promise<Date | undefined>;
|
|
28
|
+
updateDynamicDs(params: DatasourceParams, dsObj: SubqlEthereumDataSource | SubqlCustomDatasource): Promise<void>;
|
|
29
|
+
onProjectChange(project: SubqueryProject): Promise<void> | void;
|
|
30
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
6
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
7
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
8
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
9
|
+
};
|
|
10
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
11
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
12
|
+
};
|
|
13
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
14
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.BlockchainService = void 0;
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const common_ethereum_1 = require("@subql/common-ethereum");
|
|
20
|
+
const class_transformer_1 = require("class-transformer");
|
|
21
|
+
const class_validator_1 = require("class-validator");
|
|
22
|
+
const ethereum_1 = require("./ethereum");
|
|
23
|
+
const utils_ethereum_1 = require("./ethereum/utils.ethereum");
|
|
24
|
+
const types_1 = require("./indexer/types");
|
|
25
|
+
const BLOCK_TIME_VARIANCE = 5000;
|
|
26
|
+
const INTERVAL_PERCENT = 0.9;
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
28
|
+
const { version: packageVersion } = require('../package.json');
|
|
29
|
+
let BlockchainService = class BlockchainService {
|
|
30
|
+
apiService;
|
|
31
|
+
blockHandlerKind = common_ethereum_1.EthereumHandlerKind.Block;
|
|
32
|
+
isCustomDs = common_ethereum_1.isCustomDs;
|
|
33
|
+
isRuntimeDs = common_ethereum_1.isRuntimeDs;
|
|
34
|
+
packageVersion = packageVersion;
|
|
35
|
+
constructor(apiService) {
|
|
36
|
+
this.apiService = apiService;
|
|
37
|
+
}
|
|
38
|
+
async fetchBlocks(blockNums) {
|
|
39
|
+
return this.apiService.fetchBlocks(blockNums);
|
|
40
|
+
}
|
|
41
|
+
async fetchBlockWorker(worker, blockNum, context) {
|
|
42
|
+
return worker.fetchBlock(blockNum, 0);
|
|
43
|
+
}
|
|
44
|
+
getBlockSize(block) {
|
|
45
|
+
return (0, types_1.getBlockSize)(block.block);
|
|
46
|
+
}
|
|
47
|
+
async getFinalizedHeader() {
|
|
48
|
+
const block = await this.apiService.api.getFinalizedBlock();
|
|
49
|
+
return (0, utils_ethereum_1.ethereumBlockToHeader)(block);
|
|
50
|
+
}
|
|
51
|
+
async getBestHeight() {
|
|
52
|
+
return this.apiService.api.getBestBlockHeight();
|
|
53
|
+
}
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
55
|
+
async getChainInterval() {
|
|
56
|
+
const CHAIN_INTERVAL = (0, utils_ethereum_1.calcInterval)(this.apiService.api) * INTERVAL_PERCENT;
|
|
57
|
+
return Math.min(BLOCK_TIME_VARIANCE, CHAIN_INTERVAL);
|
|
58
|
+
}
|
|
59
|
+
async getHeaderForHash(hash) {
|
|
60
|
+
const block = await this.apiService.api.getBlockByHeightOrHash(hash);
|
|
61
|
+
return (0, utils_ethereum_1.ethereumBlockToHeader)(block);
|
|
62
|
+
}
|
|
63
|
+
async getHeaderForHeight(height) {
|
|
64
|
+
const block = await this.apiService.api.getBlockByHeightOrHash(height);
|
|
65
|
+
return (0, utils_ethereum_1.ethereumBlockToHeader)(block);
|
|
66
|
+
}
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
68
|
+
async getSafeApi(block) {
|
|
69
|
+
return this.apiService.safeApi(block.number);
|
|
70
|
+
}
|
|
71
|
+
async getBlockTimestamp(height) {
|
|
72
|
+
const block = await this.apiService.unsafeApi.api.getBlock(height);
|
|
73
|
+
return new Date(block.timestamp * 1000); // TODO test and make sure its in MS not S
|
|
74
|
+
}
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
76
|
+
async updateDynamicDs(params, dsObj) {
|
|
77
|
+
if ((0, common_ethereum_1.isCustomDs)(dsObj)) {
|
|
78
|
+
dsObj.processor.options = {
|
|
79
|
+
...dsObj.processor.options,
|
|
80
|
+
...params.args,
|
|
81
|
+
};
|
|
82
|
+
// TODO how to retain this functionality
|
|
83
|
+
// await this.dsProcessorService.validateCustomDs([dsObj]);
|
|
84
|
+
}
|
|
85
|
+
else if ((0, common_ethereum_1.isRuntimeDs)(dsObj)) {
|
|
86
|
+
dsObj.options = {
|
|
87
|
+
...dsObj.options,
|
|
88
|
+
...params.args,
|
|
89
|
+
};
|
|
90
|
+
const parsedDs = (0, class_transformer_1.plainToClass)(common_ethereum_1.EthereumRuntimeDataSourceImpl, dsObj);
|
|
91
|
+
const errors = (0, class_validator_1.validateSync)(parsedDs, {
|
|
92
|
+
whitelist: true,
|
|
93
|
+
forbidNonWhitelisted: false,
|
|
94
|
+
});
|
|
95
|
+
if (errors.length) {
|
|
96
|
+
throw new Error(`Dynamic ds is invalid\n${errors
|
|
97
|
+
.map((e) => e.toString())
|
|
98
|
+
.join('\n')}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// return dsObj;
|
|
102
|
+
}
|
|
103
|
+
onProjectChange(project) {
|
|
104
|
+
this.apiService.updateBlockFetching();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
exports.BlockchainService = BlockchainService;
|
|
108
|
+
exports.BlockchainService = BlockchainService = __decorate([
|
|
109
|
+
__param(0, (0, common_1.Inject)('APIService')),
|
|
110
|
+
__metadata("design:paramtypes", [ethereum_1.EthereumApiService])
|
|
111
|
+
], BlockchainService);
|
|
112
|
+
//# sourceMappingURL=blockchain.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockchain.service.js","sourceRoot":"","sources":["../src/blockchain.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAwC;AACxC,4DAMgC;AAgBhC,yDAAiD;AACjD,qDAA+C;AAE/C,yCAAgD;AAEhD,8DAAgF;AAChF,2CAA6D;AAG7D,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/D,IAAa,iBAAiB,GAA9B,MAAa,iBAAiB;IAiBc;IAL1C,gBAAgB,GAAG,qCAAmB,CAAC,KAAK,CAAC;IAC7C,UAAU,GAAG,4BAAU,CAAC;IACxB,WAAW,GAAG,6BAAW,CAAC;IAC1B,cAAc,GAAG,cAAc,CAAC;IAEhC,YAA0C,UAA8B;QAA9B,eAAU,GAAV,UAAU,CAAoB;IAAG,CAAC;IAE5E,KAAK,CAAC,WAAW,CACf,SAAmB;QAEnB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,MAAsB,EACtB,QAAgB,EAChB,OAAsC;QAEtC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,YAAY,CAAC,KAA2B;QACtC,OAAO,IAAA,oBAAY,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC5D,OAAO,IAAA,sCAAqB,EAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;IAClD,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,gBAAgB;QACpB,MAAM,cAAc,GAAG,IAAA,6BAAY,EAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;QAE5E,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,IAAA,sCAAqB,EAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAAc;QACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACvE,OAAO,IAAA,sCAAqB,EAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,UAAU,CAAC,KAAmB;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAc;QACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEnE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,0CAA0C;IACrF,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,eAAe,CACnB,MAAwB,EACxB,KAAsD;QAEtD,IAAI,IAAA,4BAAU,EAAC,KAAK,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG;gBACxB,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO;gBAC1B,GAAG,MAAM,CAAC,IAAI;aACf,CAAC;YACF,wCAAwC;YACxC,2DAA2D;QAC7D,CAAC;aAAM,IAAI,IAAA,6BAAW,EAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,OAAO,GAAG;gBACd,GAAG,KAAK,CAAC,OAAO;gBAChB,GAAG,MAAM,CAAC,IAAI;aACf,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAA,gCAAY,EAAC,+CAA6B,EAAE,KAAK,CAAC,CAAC;YAEpE,MAAM,MAAM,GAAG,IAAA,8BAAY,EAAC,QAAQ,EAAE;gBACpC,SAAS,EAAE,IAAI;gBACf,oBAAoB,EAAE,KAAK;aAC5B,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM;qBAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;qBACxB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;YACJ,CAAC;QACH,CAAC;QACD,gBAAgB;IAClB,CAAC;IAED,eAAe,CAAC,OAAwB;QACtC,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;IACxC,CAAC;CACF,CAAA;AAhHY,8CAAiB;4BAAjB,iBAAiB;IAiBf,WAAA,IAAA,eAAM,EAAC,YAAY,CAAC,CAAA;qCAAqB,6BAAkB;GAjB7D,iBAAiB,CAgH7B","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject } from '@nestjs/common';\nimport {\n EthereumHandlerKind,\n EthereumRuntimeDataSourceImpl,\n isCustomDs,\n isRuntimeDs,\n SubqlEthereumDataSource,\n} from '@subql/common-ethereum';\nimport {\n DatasourceParams,\n Header,\n IBlock,\n IBlockchainService,\n} from '@subql/node-core';\nimport {\n EthereumBlock,\n LightEthereumBlock,\n SubqlCustomDatasource,\n SubqlCustomHandler,\n SubqlDatasource,\n SubqlMapping,\n SubqlRuntimeDatasource,\n} from '@subql/types-ethereum';\nimport { plainToClass } from 'class-transformer';\nimport { validateSync } from 'class-validator';\nimport { SubqueryProject } from './configure/SubqueryProject';\nimport { EthereumApiService } from './ethereum';\nimport SafeEthProvider from './ethereum/safe-api';\nimport { calcInterval, ethereumBlockToHeader } from './ethereum/utils.ethereum';\nimport { BlockContent, getBlockSize } from './indexer/types';\nimport { IIndexerWorker } from './indexer/worker/worker';\n\nconst BLOCK_TIME_VARIANCE = 5000;\n\nconst INTERVAL_PERCENT = 0.9;\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../package.json');\n\nexport class BlockchainService\n implements\n IBlockchainService<\n SubqlDatasource,\n SubqlCustomDatasource<string, SubqlMapping<SubqlCustomHandler>>,\n SubqueryProject,\n SafeEthProvider,\n LightEthereumBlock,\n EthereumBlock,\n IIndexerWorker\n >\n{\n blockHandlerKind = EthereumHandlerKind.Block;\n isCustomDs = isCustomDs;\n isRuntimeDs = isRuntimeDs;\n packageVersion = packageVersion;\n\n constructor(@Inject('APIService') private apiService: EthereumApiService) {}\n\n async fetchBlocks(\n blockNums: number[],\n ): Promise<IBlock<EthereumBlock>[] | IBlock<LightEthereumBlock>[]> {\n return this.apiService.fetchBlocks(blockNums);\n }\n\n async fetchBlockWorker(\n worker: IIndexerWorker,\n blockNum: number,\n context: { workers: IIndexerWorker[] },\n ): Promise<Header> {\n return worker.fetchBlock(blockNum, 0);\n }\n\n getBlockSize(block: IBlock<BlockContent>): number {\n return getBlockSize(block.block);\n }\n\n async getFinalizedHeader(): Promise<Header> {\n const block = await this.apiService.api.getFinalizedBlock();\n return ethereumBlockToHeader(block);\n }\n\n async getBestHeight(): Promise<number> {\n return this.apiService.api.getBestBlockHeight();\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getChainInterval(): Promise<number> {\n const CHAIN_INTERVAL = calcInterval(this.apiService.api) * INTERVAL_PERCENT;\n\n return Math.min(BLOCK_TIME_VARIANCE, CHAIN_INTERVAL);\n }\n\n async getHeaderForHash(hash: string): Promise<Header> {\n const block = await this.apiService.api.getBlockByHeightOrHash(hash);\n return ethereumBlockToHeader(block);\n }\n\n async getHeaderForHeight(height: number): Promise<Header> {\n const block = await this.apiService.api.getBlockByHeightOrHash(height);\n return ethereumBlockToHeader(block);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getSafeApi(block: BlockContent): Promise<SafeEthProvider> {\n return this.apiService.safeApi(block.number);\n }\n\n async getBlockTimestamp(height: number): Promise<Date | undefined> {\n const block = await this.apiService.unsafeApi.api.getBlock(height);\n\n return new Date(block.timestamp * 1000); // TODO test and make sure its in MS not S\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async updateDynamicDs(\n params: DatasourceParams,\n dsObj: SubqlEthereumDataSource | SubqlCustomDatasource,\n ): Promise<void> {\n if (isCustomDs(dsObj)) {\n dsObj.processor.options = {\n ...dsObj.processor.options,\n ...params.args,\n };\n // TODO how to retain this functionality\n // await this.dsProcessorService.validateCustomDs([dsObj]);\n } else if (isRuntimeDs(dsObj)) {\n dsObj.options = {\n ...dsObj.options,\n ...params.args,\n };\n\n const parsedDs = plainToClass(EthereumRuntimeDataSourceImpl, dsObj);\n\n const errors = validateSync(parsedDs, {\n whitelist: true,\n forbidNonWhitelisted: false,\n });\n if (errors.length) {\n throw new Error(\n `Dynamic ds is invalid\\n${errors\n .map((e) => e.toString())\n .join('\\n')}`,\n );\n }\n }\n // return dsObj;\n }\n\n onProjectChange(project: SubqueryProject): Promise<void> | void {\n this.apiService.updateBlockFetching();\n }\n}\n"]}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
6
|
-
const
|
|
7
|
-
const
|
|
6
|
+
const blockchain_service_1 = require("./blockchain.service");
|
|
7
|
+
const ethereum_1 = require("./ethereum");
|
|
8
8
|
const HTTP_ENDPOINT = 'https://ethereum.rpc.subquery.network/public';
|
|
9
9
|
const mockApiService = () => {
|
|
10
10
|
const ethApi = new ethereum_1.EthereumApi(HTTP_ENDPOINT, 20, new event_emitter_1.EventEmitter2());
|
|
@@ -13,15 +13,15 @@ const mockApiService = () => {
|
|
|
13
13
|
unsafeApi: ethApi,
|
|
14
14
|
};
|
|
15
15
|
};
|
|
16
|
-
describe('
|
|
17
|
-
let
|
|
16
|
+
describe('BlockchainService', () => {
|
|
17
|
+
let blockchainService;
|
|
18
18
|
beforeEach(() => {
|
|
19
19
|
const apiService = mockApiService();
|
|
20
|
-
|
|
20
|
+
blockchainService = new blockchain_service_1.BlockchainService(apiService);
|
|
21
21
|
});
|
|
22
22
|
it('can get a block timestamps', async () => {
|
|
23
|
-
const timestamp = await
|
|
23
|
+
const timestamp = await blockchainService.getBlockTimestamp(4_000_000);
|
|
24
24
|
expect(timestamp).toEqual(new Date('2017-07-09T20:52:47.000Z'));
|
|
25
25
|
});
|
|
26
26
|
});
|
|
27
|
-
//# sourceMappingURL=
|
|
27
|
+
//# sourceMappingURL=blockchain.service.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockchain.service.test.js","sourceRoot":"","sources":["../src/blockchain.service.test.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,yDAAsD;AACtD,6DAAyD;AACzD,yCAA6D;AAE7D,MAAM,aAAa,GAAG,8CAA8C,CAAC;AAErE,MAAM,cAAc,GAAG,GAAuB,EAAE;IAC9C,MAAM,MAAM,GAAG,IAAI,sBAAW,CAAC,aAAa,EAAE,EAAE,EAAE,IAAI,6BAAa,EAAE,CAAC,CAAC;IAEvE,uBAAuB;IAEvB,OAAO;QACL,SAAS,EAAE,MAAM;KACX,CAAC;AACX,CAAC,CAAC;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,iBAAoC,CAAC;IAEzC,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QAEpC,iBAAiB,GAAG,IAAI,sCAAiB,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEvE,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { BlockchainService } from './blockchain.service';\nimport { EthereumApi, EthereumApiService } from './ethereum';\n\nconst HTTP_ENDPOINT = 'https://ethereum.rpc.subquery.network/public';\n\nconst mockApiService = (): EthereumApiService => {\n const ethApi = new EthereumApi(HTTP_ENDPOINT, 20, new EventEmitter2());\n\n // await ethApi.init();\n\n return {\n unsafeApi: ethApi,\n } as any;\n};\n\ndescribe('BlockchainService', () => {\n let blockchainService: BlockchainService;\n\n beforeEach(() => {\n const apiService = mockApiService();\n\n blockchainService = new BlockchainService(apiService);\n });\n\n it('can get a block timestamps', async () => {\n const timestamp = await blockchainService.getBlockTimestamp(4_000_000);\n\n expect(timestamp).toEqual(new Date('2017-07-09T20:52:47.000Z'));\n });\n});\n"]}
|
|
@@ -10,8 +10,8 @@ export declare class EthereumApiService extends ApiService<EthereumApi, SafeEthP
|
|
|
10
10
|
private fetchBlocksFunction?;
|
|
11
11
|
private fetchBlocksBatches;
|
|
12
12
|
private nodeConfig;
|
|
13
|
-
constructor(
|
|
14
|
-
init(): Promise<EthereumApiService>;
|
|
13
|
+
private constructor();
|
|
14
|
+
static init(project: SubqueryProject, connectionPoolService: ConnectionPoolService<EthereumApiConnection>, eventEmitter: EventEmitter2, nodeConfig: NodeConfig): Promise<EthereumApiService>;
|
|
15
15
|
protected metadataMismatchError(metadata: string, expected: string, actual: string): Error;
|
|
16
16
|
get api(): EthereumApi;
|
|
17
17
|
safeApi(height: number): SafeEthProvider;
|
|
@@ -16,6 +16,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
16
16
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
|
+
var EthereumApiService_1;
|
|
19
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
21
|
exports.EthereumApiService = void 0;
|
|
21
22
|
const assert_1 = __importDefault(require("assert"));
|
|
@@ -26,7 +27,7 @@ const NodeConfig_1 = require("../configure/NodeConfig");
|
|
|
26
27
|
const project_1 = require("../utils/project");
|
|
27
28
|
const api_connection_1 = require("./api.connection");
|
|
28
29
|
const logger = (0, node_core_1.getLogger)('api');
|
|
29
|
-
let EthereumApiService = class EthereumApiService extends node_core_1.ApiService {
|
|
30
|
+
let EthereumApiService = EthereumApiService_1 = class EthereumApiService extends node_core_1.ApiService {
|
|
30
31
|
project;
|
|
31
32
|
fetchBlocksFunction;
|
|
32
33
|
fetchBlocksBatches = () => {
|
|
@@ -40,20 +41,22 @@ let EthereumApiService = class EthereumApiService extends node_core_1.ApiService
|
|
|
40
41
|
this.nodeConfig = new NodeConfig_1.EthereumNodeConfig(nodeConfig);
|
|
41
42
|
this.updateBlockFetching();
|
|
42
43
|
}
|
|
43
|
-
async init() {
|
|
44
|
+
static async init(project, connectionPoolService, eventEmitter, nodeConfig) {
|
|
44
45
|
let network;
|
|
45
46
|
try {
|
|
46
|
-
network =
|
|
47
|
+
network = project.network;
|
|
47
48
|
}
|
|
48
49
|
catch (e) {
|
|
49
50
|
(0, node_core_1.exitWithError)(new Error(`Failed to init api`, { cause: e }), logger);
|
|
50
51
|
}
|
|
51
|
-
if (
|
|
52
|
-
const [endpoint, config] =
|
|
52
|
+
if (nodeConfig.primaryNetworkEndpoint) {
|
|
53
|
+
const [endpoint, config] = nodeConfig.primaryNetworkEndpoint;
|
|
53
54
|
network.endpoint[endpoint] = config;
|
|
54
55
|
}
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
const ethNodeConfig = new NodeConfig_1.EthereumNodeConfig(nodeConfig);
|
|
57
|
+
const apiService = new EthereumApiService_1(project, connectionPoolService, eventEmitter, nodeConfig);
|
|
58
|
+
await apiService.createConnections(network, (endpoint, config) => api_connection_1.EthereumApiConnection.create(endpoint, ethNodeConfig.blockConfirmations, apiService.fetchBlocksBatches, eventEmitter, nodeConfig.unfinalizedBlocks, config));
|
|
59
|
+
return apiService;
|
|
57
60
|
}
|
|
58
61
|
metadataMismatchError(metadata, expected, actual) {
|
|
59
62
|
return Error(`Value of ${metadata} does not match across all endpoints. Please check that your endpoints are for the same network.\n
|
|
@@ -146,7 +149,7 @@ let EthereumApiService = class EthereumApiService extends node_core_1.ApiService
|
|
|
146
149
|
}
|
|
147
150
|
};
|
|
148
151
|
exports.EthereumApiService = EthereumApiService;
|
|
149
|
-
exports.EthereumApiService = EthereumApiService = __decorate([
|
|
152
|
+
exports.EthereumApiService = EthereumApiService = EthereumApiService_1 = __decorate([
|
|
150
153
|
(0, common_1.Injectable)(),
|
|
151
154
|
__param(0, (0, common_1.Inject)('ISubqueryProject')),
|
|
152
155
|
__metadata("design:paramtypes", [Object, node_core_1.ConnectionPoolService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.service.ethereum.js","sourceRoot":"","sources":["../../src/ethereum/api.service.ethereum.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport assert from 'assert';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n ConnectionPoolService,\n getLogger,\n NodeConfig,\n profilerWrap,\n IBlock,\n exitWithError,\n} from '@subql/node-core';\nimport { IEndpointConfig } from '@subql/types-core';\nimport {\n EthereumBlock,\n EthereumNetworkConfig,\n IEthereumEndpointConfig,\n LightEthereumBlock,\n} from '@subql/types-ethereum';\nimport { EthereumNodeConfig } from '../configure/NodeConfig';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { isOnlyEventHandlers } from '../utils/project';\nimport {\n EthereumApiConnection,\n FetchFunc,\n GetFetchFunc,\n} from './api.connection';\nimport { EthereumApi } from './api.ethereum';\nimport SafeEthProvider from './safe-api';\n\nconst logger = getLogger('api');\n\n@Injectable()\nexport class EthereumApiService extends ApiService<\n EthereumApi,\n SafeEthProvider,\n IBlock<EthereumBlock>[] | IBlock<LightEthereumBlock>[],\n EthereumApiConnection,\n IEthereumEndpointConfig\n> {\n private fetchBlocksFunction?: FetchFunc;\n private fetchBlocksBatches: GetFetchFunc = () => {\n assert(this.fetchBlocksFunction, 'Fetch blocks function is not defined');\n return this.fetchBlocksFunction;\n };\n private nodeConfig: EthereumNodeConfig;\n\n constructor(\n @Inject('ISubqueryProject') private project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<EthereumApiConnection>,\n eventEmitter: EventEmitter2,\n nodeConfig: NodeConfig,\n ) {\n super(connectionPoolService, eventEmitter);\n this.nodeConfig = new EthereumNodeConfig(nodeConfig);\n\n this.updateBlockFetching();\n }\n\n async init(): Promise<EthereumApiService> {\n let network: EthereumNetworkConfig;\n try {\n network = this.project.network;\n } catch (e) {\n exitWithError(new Error(`Failed to init api`, { cause: e }), logger);\n }\n\n if (this.nodeConfig.primaryNetworkEndpoint) {\n const [endpoint, config] = this.nodeConfig.primaryNetworkEndpoint;\n (network.endpoint as Record<string, IEndpointConfig>)[endpoint] = config;\n }\n\n await this.createConnections(network, (endpoint, config) =>\n EthereumApiConnection.create(\n endpoint,\n this.nodeConfig.blockConfirmations,\n this.fetchBlocksBatches,\n this.eventEmitter,\n this.nodeConfig.unfinalizedBlocks,\n config,\n ),\n );\n\n return this;\n }\n\n protected metadataMismatchError(\n metadata: string,\n expected: string,\n actual: string,\n ): Error {\n return Error(\n `Value of ${metadata} does not match across all endpoints. Please check that your endpoints are for the same network.\\n\n Expected: ${expected}\n Actual: ${actual}`,\n );\n }\n\n get api(): EthereumApi {\n return this.unsafeApi;\n }\n\n safeApi(height: number): SafeEthProvider {\n const maxRetries = 5;\n\n const retryErrorCodes = [\n 'UNKNOWN_ERROR',\n 'NOT_IMPLEMENTED',\n 'NETWORK_ERROR',\n 'SERVER_ERROR',\n 'TIMEOUT',\n 'BAD_DATA',\n 'CANCELLED',\n ];\n\n const handler: ProxyHandler<SafeEthProvider> = {\n get: (target, prop, receiver) => {\n const originalMethod = target[prop as keyof SafeEthProvider];\n if (typeof originalMethod === 'function') {\n return async (\n ...args: Parameters<typeof originalMethod>\n ): Promise<ReturnType<typeof originalMethod>> => {\n let retries = 0;\n let currentApi = target;\n let throwingError: Error | undefined;\n\n while (retries < maxRetries) {\n try {\n return await (originalMethod as Function).apply(\n currentApi,\n args,\n );\n } catch (error: any) {\n // other than retryErrorCodes, other errors does not have anything to do with network request, retrying would not change its outcome\n if (!retryErrorCodes.includes(error?.code)) {\n throw error;\n }\n\n logger.warn(\n `Request failed with api at height ${height} (retry ${retries}): ${error.message}`,\n );\n throwingError = error;\n currentApi = this.unsafeApi.getSafeApi(height);\n retries++;\n }\n }\n\n logger.error(\n `Maximum retries (${maxRetries}) exceeded for api at height ${height}`,\n );\n if (!throwingError) {\n throw new Error('Failed to make request, maximum retries failed');\n }\n throw throwingError;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n };\n\n return new Proxy(this.unsafeApi.getSafeApi(height), handler);\n }\n\n private async fetchFullBlocksBatch(\n api: EthereumApi,\n batch: number[],\n ): Promise<IBlock<EthereumBlock>[]> {\n return api.fetchBlocks(batch);\n }\n\n private async fetchLightBlocksBatch(\n api: EthereumApi,\n batch: number[],\n ): Promise<IBlock<LightEthereumBlock>[]> {\n return api.fetchBlocksLight(batch);\n }\n\n updateBlockFetching(): void {\n const onlyEventHandlers = isOnlyEventHandlers(this.project);\n const skipTransactions =\n this.nodeConfig.skipTransactions && onlyEventHandlers;\n\n if (this.nodeConfig.skipTransactions) {\n if (onlyEventHandlers) {\n logger.info(\n 'skipTransactions is enabled, only events and block headers will be fetched.',\n );\n } else {\n logger.info(\n `skipTransactions is disabled, the project contains handlers that aren't event handlers.`,\n );\n }\n } else {\n if (onlyEventHandlers) {\n logger.warn(\n 'skipTransactions is disabled, the project contains only event handlers, it could be enabled to improve indexing performance.',\n );\n } else {\n logger.info(`skipTransactions is disabled.`);\n }\n }\n\n const fetchFunc = skipTransactions\n ? this.fetchLightBlocksBatch.bind(this)\n : this.fetchFullBlocksBatch.bind(this);\n\n if (this.nodeConfig?.profiler) {\n this.fetchBlocksFunction = profilerWrap(\n fetchFunc,\n 'SubstrateUtil',\n 'fetchBlocksBatches',\n ) as FetchFunc;\n } else {\n this.fetchBlocksFunction = fetchFunc;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"api.service.ethereum.js","sourceRoot":"","sources":["../../src/ethereum/api.service.ethereum.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport assert from 'assert';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n ConnectionPoolService,\n getLogger,\n NodeConfig,\n profilerWrap,\n IBlock,\n exitWithError,\n} from '@subql/node-core';\nimport { IEndpointConfig } from '@subql/types-core';\nimport {\n EthereumBlock,\n EthereumNetworkConfig,\n IEthereumEndpointConfig,\n LightEthereumBlock,\n} from '@subql/types-ethereum';\nimport { EthereumNodeConfig } from '../configure/NodeConfig';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { isOnlyEventHandlers } from '../utils/project';\nimport {\n EthereumApiConnection,\n FetchFunc,\n GetFetchFunc,\n} from './api.connection';\nimport { EthereumApi } from './api.ethereum';\nimport SafeEthProvider from './safe-api';\n\nconst logger = getLogger('api');\n\n@Injectable()\nexport class EthereumApiService extends ApiService<\n EthereumApi,\n SafeEthProvider,\n IBlock<EthereumBlock>[] | IBlock<LightEthereumBlock>[],\n EthereumApiConnection,\n IEthereumEndpointConfig\n> {\n private fetchBlocksFunction?: FetchFunc;\n private fetchBlocksBatches: GetFetchFunc = () => {\n assert(this.fetchBlocksFunction, 'Fetch blocks function is not defined');\n return this.fetchBlocksFunction;\n };\n private nodeConfig: EthereumNodeConfig;\n\n private constructor(\n @Inject('ISubqueryProject') private project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<EthereumApiConnection>,\n eventEmitter: EventEmitter2,\n nodeConfig: NodeConfig,\n ) {\n super(connectionPoolService, eventEmitter);\n this.nodeConfig = new EthereumNodeConfig(nodeConfig);\n\n this.updateBlockFetching();\n }\n\n static async init(\n project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<EthereumApiConnection>,\n eventEmitter: EventEmitter2,\n nodeConfig: NodeConfig,\n ): Promise<EthereumApiService> {\n let network: EthereumNetworkConfig;\n try {\n network = project.network;\n } catch (e) {\n exitWithError(new Error(`Failed to init api`, { cause: e }), logger);\n }\n\n if (nodeConfig.primaryNetworkEndpoint) {\n const [endpoint, config] = nodeConfig.primaryNetworkEndpoint;\n (network.endpoint as Record<string, IEndpointConfig>)[endpoint] = config;\n }\n\n const ethNodeConfig = new EthereumNodeConfig(nodeConfig);\n\n const apiService = new EthereumApiService(\n project,\n connectionPoolService,\n eventEmitter,\n nodeConfig,\n );\n\n await apiService.createConnections(network, (endpoint, config) =>\n EthereumApiConnection.create(\n endpoint,\n ethNodeConfig.blockConfirmations,\n apiService.fetchBlocksBatches,\n eventEmitter,\n nodeConfig.unfinalizedBlocks,\n config,\n ),\n );\n\n return apiService;\n }\n\n protected metadataMismatchError(\n metadata: string,\n expected: string,\n actual: string,\n ): Error {\n return Error(\n `Value of ${metadata} does not match across all endpoints. Please check that your endpoints are for the same network.\\n\n Expected: ${expected}\n Actual: ${actual}`,\n );\n }\n\n get api(): EthereumApi {\n return this.unsafeApi;\n }\n\n safeApi(height: number): SafeEthProvider {\n const maxRetries = 5;\n\n const retryErrorCodes = [\n 'UNKNOWN_ERROR',\n 'NOT_IMPLEMENTED',\n 'NETWORK_ERROR',\n 'SERVER_ERROR',\n 'TIMEOUT',\n 'BAD_DATA',\n 'CANCELLED',\n ];\n\n const handler: ProxyHandler<SafeEthProvider> = {\n get: (target, prop, receiver) => {\n const originalMethod = target[prop as keyof SafeEthProvider];\n if (typeof originalMethod === 'function') {\n return async (\n ...args: Parameters<typeof originalMethod>\n ): Promise<ReturnType<typeof originalMethod>> => {\n let retries = 0;\n let currentApi = target;\n let throwingError: Error | undefined;\n\n while (retries < maxRetries) {\n try {\n return await (originalMethod as Function).apply(\n currentApi,\n args,\n );\n } catch (error: any) {\n // other than retryErrorCodes, other errors does not have anything to do with network request, retrying would not change its outcome\n if (!retryErrorCodes.includes(error?.code)) {\n throw error;\n }\n\n logger.warn(\n `Request failed with api at height ${height} (retry ${retries}): ${error.message}`,\n );\n throwingError = error;\n currentApi = this.unsafeApi.getSafeApi(height);\n retries++;\n }\n }\n\n logger.error(\n `Maximum retries (${maxRetries}) exceeded for api at height ${height}`,\n );\n if (!throwingError) {\n throw new Error('Failed to make request, maximum retries failed');\n }\n throw throwingError;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n };\n\n return new Proxy(this.unsafeApi.getSafeApi(height), handler);\n }\n\n private async fetchFullBlocksBatch(\n api: EthereumApi,\n batch: number[],\n ): Promise<IBlock<EthereumBlock>[]> {\n return api.fetchBlocks(batch);\n }\n\n private async fetchLightBlocksBatch(\n api: EthereumApi,\n batch: number[],\n ): Promise<IBlock<LightEthereumBlock>[]> {\n return api.fetchBlocksLight(batch);\n }\n\n updateBlockFetching(): void {\n const onlyEventHandlers = isOnlyEventHandlers(this.project);\n const skipTransactions =\n this.nodeConfig.skipTransactions && onlyEventHandlers;\n\n if (this.nodeConfig.skipTransactions) {\n if (onlyEventHandlers) {\n logger.info(\n 'skipTransactions is enabled, only events and block headers will be fetched.',\n );\n } else {\n logger.info(\n `skipTransactions is disabled, the project contains handlers that aren't event handlers.`,\n );\n }\n } else {\n if (onlyEventHandlers) {\n logger.warn(\n 'skipTransactions is disabled, the project contains only event handlers, it could be enabled to improve indexing performance.',\n );\n } else {\n logger.info(`skipTransactions is disabled.`);\n }\n }\n\n const fetchFunc = skipTransactions\n ? this.fetchLightBlocksBatch.bind(this)\n : this.fetchFullBlocksBatch.bind(this);\n\n if (this.nodeConfig?.profiler) {\n this.fetchBlocksFunction = profilerWrap(\n fetchFunc,\n 'SubstrateUtil',\n 'fetchBlocksBatches',\n ) as FetchFunc;\n } else {\n this.fetchBlocksFunction = fetchFunc;\n }\n }\n}\n"]}
|
|
@@ -37,14 +37,22 @@ const prepareApiService = async (endpoint = HTTP_ENDPOINT) => {
|
|
|
37
37
|
provide: 'ISubqueryProject',
|
|
38
38
|
useFactory: () => testSubqueryProject(endpoint),
|
|
39
39
|
},
|
|
40
|
-
|
|
40
|
+
{
|
|
41
|
+
provide: api_service_ethereum_1.EthereumApiService,
|
|
42
|
+
useFactory: api_service_ethereum_1.EthereumApiService.init,
|
|
43
|
+
inject: [
|
|
44
|
+
'ISubqueryProject',
|
|
45
|
+
node_core_1.ConnectionPoolService,
|
|
46
|
+
event_emitter_1.EventEmitter2,
|
|
47
|
+
node_core_1.NodeConfig,
|
|
48
|
+
],
|
|
49
|
+
},
|
|
41
50
|
],
|
|
42
51
|
imports: [event_emitter_1.EventEmitterModule.forRoot()],
|
|
43
52
|
}).compile();
|
|
44
53
|
const app = module.createNestApplication();
|
|
45
54
|
await app.init();
|
|
46
55
|
const apiService = app.get(api_service_ethereum_1.EthereumApiService);
|
|
47
|
-
await apiService.init();
|
|
48
56
|
return [apiService, app];
|
|
49
57
|
};
|
|
50
58
|
jest.setTimeout(90000);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.service.ethereum.test.js","sourceRoot":"","sources":["../../src/ethereum/api.service.ethereum.test.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAGnC,
|
|
1
|
+
{"version":3,"file":"api.service.ethereum.test.js","sourceRoot":"","sources":["../../src/ethereum/api.service.ethereum.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { INestApplication } from '@nestjs/common';\nimport { EventEmitter2, EventEmitterModule } from '@nestjs/event-emitter';\nimport { Test } from '@nestjs/testing';\nimport {\n ConnectionPoolService,\n ConnectionPoolStateManager,\n NodeConfig,\n} from '@subql/node-core';\nimport { GraphQLSchema } from 'graphql';\nimport { range } from 'lodash';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { EthereumApiService } from './api.service.ethereum';\n\n// Add api key to work\nconst WS_ENDPOINT = 'wss://eth.api.onfinality.io/ws?apikey=';\nconst HTTP_ENDPOINT = 'https://ethereum.rpc.subquery.network/public';\n\nfunction testSubqueryProject(endpoint: string): SubqueryProject {\n return {\n network: {\n endpoint: [endpoint],\n chainId: '1',\n },\n dataSources: [],\n id: 'test',\n root: './',\n schema: new GraphQLSchema({}),\n templates: [],\n } as any;\n}\n\nconst prepareApiService = async (\n endpoint: string = HTTP_ENDPOINT,\n): Promise<[EthereumApiService, INestApplication]> => {\n const module = await Test.createTestingModule({\n providers: [\n ConnectionPoolService,\n ConnectionPoolStateManager,\n {\n provide: NodeConfig,\n useFactory: () => ({}),\n },\n {\n provide: 'ISubqueryProject',\n useFactory: () => testSubqueryProject(endpoint),\n },\n {\n provide: EthereumApiService,\n useFactory: EthereumApiService.init,\n inject: [\n 'ISubqueryProject',\n ConnectionPoolService,\n EventEmitter2,\n NodeConfig,\n ],\n },\n ],\n imports: [EventEmitterModule.forRoot()],\n }).compile();\n\n const app = module.createNestApplication();\n await app.init();\n const apiService = app.get(EthereumApiService);\n return [apiService, app];\n};\n\njest.setTimeout(90000);\ndescribe('ApiService', () => {\n let apiService: EthereumApiService;\n let app: INestApplication;\n\n beforeEach(async () => {\n [apiService, app] = await prepareApiService();\n });\n\n afterEach(async () => {\n return app?.close();\n });\n\n it('can instantiate api', () => {\n expect(apiService.api.getChainId()).toEqual(1);\n });\n\n it('can fetch blocks', async () => {\n await expect(\n apiService.api.fetchBlocks(range(12369621, 12369625)),\n ).resolves.toHaveLength(4);\n });\n\n it('can get the finalized height', async () => {\n const height = (await apiService.api.getFinalizedBlock()).number;\n\n console.log('Finalized height', height);\n expect(height).toBeGreaterThan(16_000_000);\n });\n\n it('ensure api errorCode is exposed when throwing', async () => {\n await expect(\n apiService\n .safeApi(17520376)\n .getCode('0x75F0398549C9fDEa03BbDde388361827cb376D5'),\n ).rejects.toHaveProperty('code', 'INVALID_ARGUMENT');\n });\n it('should not retry on any errors not in the retry list', async () => {\n const callSpy = jest.spyOn(apiService.unsafeApi, 'getSafeApi');\n await expect(\n apiService\n .safeApi(17520376)\n .getCode('0x75F0398549C9fDEa03BbDde388361827cb376D5'),\n ).rejects.toHaveProperty('code', 'INVALID_ARGUMENT');\n\n expect(callSpy).toHaveBeenCalledTimes(1);\n });\n});\n"]}
|
|
@@ -4,7 +4,7 @@ import { JsonRpcBatchProvider } from '../json-rpc-batch-provider';
|
|
|
4
4
|
import { JsonRpcProvider } from '../json-rpc-provider';
|
|
5
5
|
export declare const CeloWsProvider: {
|
|
6
6
|
new (...args: any[]): {
|
|
7
|
-
"__#
|
|
7
|
+
"__#13@#flanHardForkBlock": BigNumber;
|
|
8
8
|
_networkPromise: Promise<import("@ethersproject/providers").Network>;
|
|
9
9
|
_network: import("@ethersproject/providers").Network;
|
|
10
10
|
_events: Array<import("@ethersproject/providers/lib/base-provider").Event>;
|
|
@@ -81,14 +81,14 @@ export declare const CeloWsProvider: {
|
|
|
81
81
|
perform(method: string, params: any): Promise<any>;
|
|
82
82
|
_startEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
83
83
|
_stopEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
84
|
-
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): any;
|
|
85
|
-
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
86
|
-
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
84
|
+
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): /*elided*/ any;
|
|
85
|
+
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
86
|
+
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
87
87
|
emit(eventName: import("@ethersproject/abstract-provider").EventType, ...args: Array<any>): boolean;
|
|
88
88
|
listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType): number;
|
|
89
89
|
listeners(eventName?: import("@ethersproject/abstract-provider").EventType): Array<import("@ethersproject/abstract-provider").Listener>;
|
|
90
|
-
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): any;
|
|
91
|
-
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): any;
|
|
90
|
+
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
91
|
+
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): /*elided*/ any;
|
|
92
92
|
getFeeData(): Promise<import("@ethersproject/abstract-provider").FeeData>;
|
|
93
93
|
addListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
94
94
|
removeListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
@@ -97,7 +97,7 @@ export declare const CeloWsProvider: {
|
|
|
97
97
|
} & typeof WebSocketProvider;
|
|
98
98
|
export declare const CeloJsonRpcProvider: {
|
|
99
99
|
new (...args: any[]): {
|
|
100
|
-
"__#
|
|
100
|
+
"__#13@#flanHardForkBlock": BigNumber;
|
|
101
101
|
_networkPromise: Promise<import("@ethersproject/providers").Network>;
|
|
102
102
|
_network: import("@ethersproject/providers").Network;
|
|
103
103
|
_events: Array<import("@ethersproject/providers/lib/base-provider").Event>;
|
|
@@ -174,14 +174,14 @@ export declare const CeloJsonRpcProvider: {
|
|
|
174
174
|
perform(method: string, params: any): Promise<any>;
|
|
175
175
|
_startEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
176
176
|
_stopEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
177
|
-
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): any;
|
|
178
|
-
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
179
|
-
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
177
|
+
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): /*elided*/ any;
|
|
178
|
+
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
179
|
+
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
180
180
|
emit(eventName: import("@ethersproject/abstract-provider").EventType, ...args: Array<any>): boolean;
|
|
181
181
|
listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType): number;
|
|
182
182
|
listeners(eventName?: import("@ethersproject/abstract-provider").EventType): Array<import("@ethersproject/abstract-provider").Listener>;
|
|
183
|
-
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): any;
|
|
184
|
-
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): any;
|
|
183
|
+
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
184
|
+
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): /*elided*/ any;
|
|
185
185
|
getFeeData(): Promise<import("@ethersproject/abstract-provider").FeeData>;
|
|
186
186
|
addListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
187
187
|
removeListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
@@ -190,7 +190,7 @@ export declare const CeloJsonRpcProvider: {
|
|
|
190
190
|
} & typeof JsonRpcProvider;
|
|
191
191
|
export declare const CeloJsonRpcBatchProvider: {
|
|
192
192
|
new (...args: any[]): {
|
|
193
|
-
"__#
|
|
193
|
+
"__#13@#flanHardForkBlock": BigNumber;
|
|
194
194
|
_networkPromise: Promise<import("@ethersproject/providers").Network>;
|
|
195
195
|
_network: import("@ethersproject/providers").Network;
|
|
196
196
|
_events: Array<import("@ethersproject/providers/lib/base-provider").Event>;
|
|
@@ -267,14 +267,14 @@ export declare const CeloJsonRpcBatchProvider: {
|
|
|
267
267
|
perform(method: string, params: any): Promise<any>;
|
|
268
268
|
_startEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
269
269
|
_stopEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
270
|
-
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): any;
|
|
271
|
-
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
272
|
-
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
270
|
+
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): /*elided*/ any;
|
|
271
|
+
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
272
|
+
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
273
273
|
emit(eventName: import("@ethersproject/abstract-provider").EventType, ...args: Array<any>): boolean;
|
|
274
274
|
listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType): number;
|
|
275
275
|
listeners(eventName?: import("@ethersproject/abstract-provider").EventType): Array<import("@ethersproject/abstract-provider").Listener>;
|
|
276
|
-
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): any;
|
|
277
|
-
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): any;
|
|
276
|
+
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
277
|
+
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): /*elided*/ any;
|
|
278
278
|
getFeeData(): Promise<import("@ethersproject/abstract-provider").FeeData>;
|
|
279
279
|
addListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
280
280
|
removeListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
@@ -80,14 +80,14 @@ export declare function OPFormatterMixin<B extends Constructor>(Base: B): {
|
|
|
80
80
|
perform(method: string, params: any): Promise<any>;
|
|
81
81
|
_startEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
82
82
|
_stopEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
83
|
-
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): any;
|
|
84
|
-
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
85
|
-
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
83
|
+
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): /*elided*/ any;
|
|
84
|
+
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
85
|
+
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
86
86
|
emit(eventName: import("@ethersproject/abstract-provider").EventType, ...args: Array<any>): boolean;
|
|
87
87
|
listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType): number;
|
|
88
88
|
listeners(eventName?: import("@ethersproject/abstract-provider").EventType): Array<import("@ethersproject/abstract-provider").Listener>;
|
|
89
|
-
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): any;
|
|
90
|
-
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): any;
|
|
89
|
+
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
90
|
+
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): /*elided*/ any;
|
|
91
91
|
getFeeData(): Promise<import("@ethersproject/abstract-provider").FeeData>;
|
|
92
92
|
addListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
93
93
|
removeListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
@@ -172,14 +172,14 @@ export declare const OPWsProvider: {
|
|
|
172
172
|
perform(method: string, params: any): Promise<any>;
|
|
173
173
|
_startEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
174
174
|
_stopEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
175
|
-
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): any;
|
|
176
|
-
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
177
|
-
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
175
|
+
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): /*elided*/ any;
|
|
176
|
+
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
177
|
+
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
178
178
|
emit(eventName: import("@ethersproject/abstract-provider").EventType, ...args: Array<any>): boolean;
|
|
179
179
|
listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType): number;
|
|
180
180
|
listeners(eventName?: import("@ethersproject/abstract-provider").EventType): Array<import("@ethersproject/abstract-provider").Listener>;
|
|
181
|
-
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): any;
|
|
182
|
-
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): any;
|
|
181
|
+
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
182
|
+
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): /*elided*/ any;
|
|
183
183
|
getFeeData(): Promise<import("@ethersproject/abstract-provider").FeeData>;
|
|
184
184
|
addListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
185
185
|
removeListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
@@ -264,14 +264,14 @@ export declare const OPJsonRpcProvider: {
|
|
|
264
264
|
perform(method: string, params: any): Promise<any>;
|
|
265
265
|
_startEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
266
266
|
_stopEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
267
|
-
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): any;
|
|
268
|
-
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
269
|
-
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
267
|
+
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): /*elided*/ any;
|
|
268
|
+
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
269
|
+
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
270
270
|
emit(eventName: import("@ethersproject/abstract-provider").EventType, ...args: Array<any>): boolean;
|
|
271
271
|
listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType): number;
|
|
272
272
|
listeners(eventName?: import("@ethersproject/abstract-provider").EventType): Array<import("@ethersproject/abstract-provider").Listener>;
|
|
273
|
-
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): any;
|
|
274
|
-
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): any;
|
|
273
|
+
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
274
|
+
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): /*elided*/ any;
|
|
275
275
|
getFeeData(): Promise<import("@ethersproject/abstract-provider").FeeData>;
|
|
276
276
|
addListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
277
277
|
removeListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
@@ -356,14 +356,14 @@ export declare const OPJsonRpcBatchProvider: {
|
|
|
356
356
|
perform(method: string, params: any): Promise<any>;
|
|
357
357
|
_startEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
358
358
|
_stopEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
|
|
359
|
-
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): any;
|
|
360
|
-
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
361
|
-
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
|
|
359
|
+
_addEventListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener, once: boolean): /*elided*/ any;
|
|
360
|
+
on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
361
|
+
once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
362
362
|
emit(eventName: import("@ethersproject/abstract-provider").EventType, ...args: Array<any>): boolean;
|
|
363
363
|
listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType): number;
|
|
364
364
|
listeners(eventName?: import("@ethersproject/abstract-provider").EventType): Array<import("@ethersproject/abstract-provider").Listener>;
|
|
365
|
-
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): any;
|
|
366
|
-
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): any;
|
|
365
|
+
off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): /*elided*/ any;
|
|
366
|
+
removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): /*elided*/ any;
|
|
367
367
|
getFeeData(): Promise<import("@ethersproject/abstract-provider").FeeData>;
|
|
368
368
|
addListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|
|
369
369
|
removeListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
|