diff --git a/packages/web3-core/src/web3_batch_request.ts b/packages/web3-core/src/web3_batch_request.ts index 5529895df05..0fa7c959cf8 100644 --- a/packages/web3-core/src/web3_batch_request.ts +++ b/packages/web3-core/src/web3_batch_request.ts @@ -15,21 +15,21 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -import { JsonRpcBatchResponse, JsonRpcOptionalRequest, JsonRpcRequest } from 'web3-types'; +import { JsonRpcBatchResponse, JsonRpcOptionalRequest, JsonRpcRequest, Web3APISpec } from 'web3-types'; import { jsonRpc, Web3DeferredPromise } from 'web3-utils'; import { OperationAbortError, OperationTimeoutError, ResponseError } from 'web3-errors'; import { Web3RequestManager } from './web3_request_manager'; export const DEFAULT_BATCH_REQUEST_TIMEOUT = 1000; -export class Web3BatchRequest { - private readonly _requestManager: Web3RequestManager; +export class Web3BatchRequest { + private readonly _requestManager: Web3RequestManager; private readonly _requests: Map< number, { payload: JsonRpcRequest; promise: Web3DeferredPromise } >; - public constructor(requestManager: Web3RequestManager) { + public constructor(requestManager: Web3RequestManager) { this._requestManager = requestManager; this._requests = new Map(); } diff --git a/packages/web3-core/src/web3_context.ts b/packages/web3-core/src/web3_context.ts index af138c199cd..ac5c337aac2 100644 --- a/packages/web3-core/src/web3_context.ts +++ b/packages/web3-core/src/web3_context.ts @@ -273,10 +273,10 @@ export class Web3Context< return true; } - public get BatchRequest(): new () => Web3BatchRequest { + public get BatchRequest(): new () => Web3BatchRequest { return Web3BatchRequest.bind( undefined, - this._requestManager as unknown as Web3RequestManager, + this._requestManager as unknown as Web3RequestManager, ); } } diff --git a/packages/web3-core/src/web3_request_manager.ts b/packages/web3-core/src/web3_request_manager.ts index eb448c85ebd..5212547f47e 100644 --- a/packages/web3-core/src/web3_request_manager.ts +++ b/packages/web3-core/src/web3_request_manager.ts @@ -26,7 +26,6 @@ import HttpProvider from 'web3-providers-http'; import IpcProvider from 'web3-providers-ipc'; import WSProvider from 'web3-providers-ws'; import { - EthExecutionAPI, JsonRpcBatchRequest, JsonRpcBatchResponse, JsonRpcPayload, @@ -63,7 +62,7 @@ const availableProviders = { }; export class Web3RequestManager< - API extends Web3APISpec = EthExecutionAPI, + API extends Web3APISpec, > extends Web3EventEmitter<{ [key in Web3RequestManagerEvent]: SupportedProviders | undefined; }> { diff --git a/packages/web3-core/src/web3_subscriptions.ts b/packages/web3-core/src/web3_subscriptions.ts index ef4293ebd82..877e509fa5f 100644 --- a/packages/web3-core/src/web3_subscriptions.ts +++ b/packages/web3-core/src/web3_subscriptions.ts @@ -23,10 +23,10 @@ import { Web3BaseProvider, Web3APISpec, Web3APIParams, - EthExecutionAPI, Log, JsonRpcNotification, JsonRpcSubscriptionResult, + Web3APIMethod, } from 'web3-types'; import { jsonRpc } from 'web3-utils'; import { Web3EventEmitter, Web3EventMap } from './web3_event_emitter'; @@ -34,10 +34,11 @@ import { Web3EventEmitter, Web3EventMap } from './web3_event_emitter'; import { Web3RequestManager } from './web3_request_manager'; export abstract class Web3Subscription< + API extends Web3APISpec, EventMap extends Web3EventMap, // eslint-disable-next-line @typescript-eslint/no-explicit-any ArgsType = any, - API extends Web3APISpec = EthExecutionAPI, + Method extends Web3APIMethod = any > extends Web3EventEmitter { private readonly _requestManager: Web3RequestManager; private readonly _lastBlock?: BlockOutput; @@ -65,7 +66,7 @@ export abstract class Web3Subscription< public async subscribe() { this._id = await this._requestManager.send({ - method: 'eth_subscribe', + method: this._buildSubscriptionMethod(), params: this._buildSubscriptionParams(), }); @@ -121,7 +122,13 @@ export abstract class Web3Subscription< } // eslint-disable-next-line class-methods-use-this - protected _buildSubscriptionParams(): Web3APIParams { + protected _buildSubscriptionMethod(): Method { + // This should be overridden in the subclass + throw new Error('Implement in the child class'); + } + + // eslint-disable-next-line class-methods-use-this + protected _buildSubscriptionParams(): Web3APIParams { // This should be overridden in the subclass throw new Error('Implement in the child class'); } @@ -130,7 +137,7 @@ export abstract class Web3Subscription< export type Web3SubscriptionConstructor< API extends Web3APISpec, // eslint-disable-next-line @typescript-eslint/no-explicit-any - SubscriptionType extends Web3Subscription = Web3Subscription, + SubscriptionType extends Web3Subscription = Web3Subscription, > = new ( // We accept any type of arguments here and don't deal with this type internally // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/web3-eth-contract/src/contract.ts b/packages/web3-eth-contract/src/contract.ts index ce40a04c162..205d698f6d7 100644 --- a/packages/web3-eth-contract/src/contract.ts +++ b/packages/web3-eth-contract/src/contract.ts @@ -15,7 +15,7 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -import { Web3Context, Web3EventEmitter, Web3PromiEvent } from 'web3-core'; +import { Web3Context, Web3EventEmitter, Web3PromiEvent, Web3SubscriptionConstructor } from 'web3-core'; import { ContractExecutionError, SubscriptionError, Web3ContractError } from 'web3-errors'; import { call, @@ -49,12 +49,12 @@ import { BlockNumberOrTag, BlockTags, Bytes, - EthExecutionAPI, Filter, HexString, LogsInput, Mutable, Common, + Web3APISpec, } from 'web3-types'; import { DataFormat, @@ -154,12 +154,23 @@ const contractSubscriptions = { newHeads: NewHeadsSubscription, newBlockHeaders: NewHeadsSubscription, }; +type ContractSubscriptions = { + logs: typeof LogsSubscription, + newHeads: typeof NewHeadsSubscription, + newBlockHeaders: typeof NewHeadsSubscription, +}; /** * The class designed to interact with smart contracts on the Ethereum blockchain. */ -export class Contract - extends Web3Context +export class Contract< + API extends Web3APISpec, + Abi extends ContractAbi, + RegisteredSubs extends { + [key: string]: Web3SubscriptionConstructor; + } = ContractSubscriptions +> + extends Web3Context implements Web3EventEmitter> { /** diff --git a/packages/web3-eth-contract/src/log_subscription.ts b/packages/web3-eth-contract/src/log_subscription.ts index faa5b3fc224..6ed9eba7e92 100644 --- a/packages/web3-eth-contract/src/log_subscription.ts +++ b/packages/web3-eth-contract/src/log_subscription.ts @@ -15,7 +15,7 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -import { LogsInput, HexString, Topic } from 'web3-types'; +import { LogsInput, HexString, Topic, Web3APISpec } from 'web3-types'; import { Web3RequestManager, Web3Subscription } from 'web3-core'; import { AbiEventFragment } from 'web3-eth-abi'; // eslint-disable-next-line import/no-cycle @@ -79,7 +79,8 @@ import { ContractAbiWithSignature, EventLog } from './types'; * } * ``` */ -export class LogsSubscription extends Web3Subscription< +export class LogsSubscription extends Web3Subscription< + API, { error: Error; connected: number; @@ -113,7 +114,7 @@ export class LogsSubscription extends Web3Subscription< jsonInterface: ContractAbiWithSignature; }, options: { - requestManager: Web3RequestManager; + requestManager: Web3RequestManager; returnFormat?: DataFormat; }, ) { @@ -125,6 +126,8 @@ export class LogsSubscription extends Web3Subscription< this.jsonInterface = args.jsonInterface; } + // TODO + // @ts-ignore protected _buildSubscriptionParams() { return ['logs', { address: this.address, topics: this.topics }] as [ 'logs', diff --git a/packages/web3-eth/src/web3_subscriptions.ts b/packages/web3-eth/src/web3_subscriptions.ts index 1a9771ba652..00e4f634715 100644 --- a/packages/web3-eth/src/web3_subscriptions.ts +++ b/packages/web3-eth/src/web3_subscriptions.ts @@ -25,6 +25,9 @@ import { Topic, BlockHeaderOutput, LogsOutput, + EthExecutionAPI, + Web3APIMethod, + Web3APIParams, } from 'web3-types'; import { Web3Subscription } from 'web3-core'; import { blockHeaderSchema, logSchema, syncSchema } from './schemas'; @@ -34,7 +37,8 @@ type CommonSubscriptionEvents = { connected: number; }; -export class LogsSubscription extends Web3Subscription< +export class LogsSubscription = 'eth_subscribe'> extends Web3Subscription< + EthExecutionAPI, CommonSubscriptionEvents & { data: LogsOutput; }, @@ -42,11 +46,16 @@ export class LogsSubscription extends Web3Subscription< readonly fromBlock?: BlockNumberOrTag; readonly address?: Address | Address[]; readonly topics?: Topic[]; - } + }, + Method > { + protected _buildSubscriptionMethod() { + return 'eth_subscribe' as Method + } + protected _buildSubscriptionParams() { // eslint-disable-next-line @typescript-eslint/no-explicit-any - return ['logs', this.args] as ['logs', any]; + return ['logs', this.args] as Web3APIParams } public _processSubscriptionResult(data: LogsOutput) { @@ -59,6 +68,7 @@ export class LogsSubscription extends Web3Subscription< } export class NewPendingTransactionsSubscription extends Web3Subscription< + EthExecutionAPI, CommonSubscriptionEvents & { data: HexString; } @@ -78,6 +88,7 @@ export class NewPendingTransactionsSubscription extends Web3Subscription< } export class NewHeadsSubscription extends Web3Subscription< + EthExecutionAPI, CommonSubscriptionEvents & { data: BlockHeaderOutput; } @@ -97,6 +108,7 @@ export class NewHeadsSubscription extends Web3Subscription< } export class SyncingSubscription extends Web3Subscription< + EthExecutionAPI, CommonSubscriptionEvents & { data: SyncOutput; changed: boolean; diff --git a/packages/web3-plugin-example/src/index.ts b/packages/web3-plugin-example/src/index.ts index db1545365bd..8a12b1dd00a 100644 --- a/packages/web3-plugin-example/src/index.ts +++ b/packages/web3-plugin-example/src/index.ts @@ -41,7 +41,7 @@ declare module 'web3' { } } -export class ChainlinkPlugin extends Web3PluginBase { +export class ChainlinkPlugin extends Web3PluginBase { public pluginNamespace = 'chainlink'; protected readonly _contract: Contract; diff --git a/packages/web3-rpc-methods/src/eth_rpc_methods.ts b/packages/web3-rpc-methods/src/eth_rpc_methods.ts index 57811421f2f..c25160df299 100644 --- a/packages/web3-rpc-methods/src/eth_rpc_methods.ts +++ b/packages/web3-rpc-methods/src/eth_rpc_methods.ts @@ -30,56 +30,56 @@ import { } from 'web3-types'; import { validator } from 'web3-validator'; -export async function getProtocolVersion(requestManager: Web3RequestManager) { +export async function getProtocolVersion(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_protocolVersion', params: [], }); } -export async function getSyncing(requestManager: Web3RequestManager) { +export async function getSyncing(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_syncing', params: [], }); } -export async function getCoinbase(requestManager: Web3RequestManager) { +export async function getCoinbase(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_coinbase', params: [], }); } -export async function getMining(requestManager: Web3RequestManager) { +export async function getMining(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_mining', params: [], }); } -export async function getHashRate(requestManager: Web3RequestManager) { +export async function getHashRate(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_hashrate', params: [], }); } -export async function getGasPrice(requestManager: Web3RequestManager) { +export async function getGasPrice(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_gasPrice', params: [], }); } -export async function getAccounts(requestManager: Web3RequestManager) { +export async function getAccounts(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_accounts', params: [], }); } -export async function getBlockNumber(requestManager: Web3RequestManager) { +export async function getBlockNumber(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_blockNumber', params: [], @@ -87,7 +87,7 @@ export async function getBlockNumber(requestManager: Web3RequestManager) { } export async function getBalance( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, address: Address, blockNumber: BlockNumberOrTag, ) { @@ -100,7 +100,7 @@ export async function getBalance( } export async function getStorageAt( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, address: Address, storageSlot: Uint256, blockNumber: BlockNumberOrTag, @@ -114,7 +114,7 @@ export async function getStorageAt( } export async function getTransactionCount( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, address: Address, blockNumber: BlockNumberOrTag, ) { @@ -127,7 +127,7 @@ export async function getTransactionCount( } export async function getBlockTransactionCountByHash( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, blockHash: HexString32Bytes, ) { validator.validate(['bytes32'], [blockHash]); @@ -139,7 +139,7 @@ export async function getBlockTransactionCountByHash( } export async function getBlockTransactionCountByNumber( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, blockNumber: BlockNumberOrTag, ) { validator.validate(['blockNumberOrTag'], [blockNumber]); @@ -151,7 +151,7 @@ export async function getBlockTransactionCountByNumber( } export async function getUncleCountByBlockHash( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, blockHash: HexString32Bytes, ) { validator.validate(['bytes32'], [blockHash]); @@ -163,7 +163,7 @@ export async function getUncleCountByBlockHash( } export async function getUncleCountByBlockNumber( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, blockNumber: BlockNumberOrTag, ) { validator.validate(['blockNumberOrTag'], [blockNumber]); @@ -175,7 +175,7 @@ export async function getUncleCountByBlockNumber( } export async function getCode( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, address: Address, blockNumber: BlockNumberOrTag, ) { @@ -188,7 +188,7 @@ export async function getCode( } export async function sign( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, address: Address, message: HexStringBytes, ) { @@ -205,7 +205,7 @@ export async function sign( // ? validateTransactionWithSender(transaction) // : validateTransactionWithSender(transaction, true) with true being a isPartial flag export async function signTransaction( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, transaction: TransactionWithSenderAPI | Partial, ) { return requestManager.send({ @@ -219,7 +219,7 @@ export async function signTransaction( // ? validateTransactionWithSender(transaction) // : validateTransactionWithSender(transaction, true) with true being a isPartial flag export async function sendTransaction( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, transaction: TransactionWithSenderAPI | Partial, ) { return requestManager.send({ @@ -229,7 +229,7 @@ export async function sendTransaction( } export async function sendRawTransaction( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, transaction: HexStringBytes, ) { validator.validate(['hex'], [transaction]); @@ -242,7 +242,7 @@ export async function sendRawTransaction( // TODO - validate transaction export async function call( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, transaction: TransactionCallAPI, blockNumber: BlockNumberOrTag, ) { @@ -257,7 +257,7 @@ export async function call( // TODO Not sure how to best validate Partial export async function estimateGas( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, transaction: Partial, blockNumber: BlockNumberOrTag, ) { @@ -270,7 +270,7 @@ export async function estimateGas( } export async function getBlockByHash( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, blockHash: HexString32Bytes, hydrated: boolean, ) { @@ -283,7 +283,7 @@ export async function getBlockByHash( } export async function getBlockByNumber( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, blockNumber: BlockNumberOrTag, hydrated: boolean, ) { @@ -296,7 +296,7 @@ export async function getBlockByNumber( } export async function getTransactionByHash( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, transactionHash: HexString32Bytes, ) { validator.validate(['bytes32'], [transactionHash]); @@ -308,7 +308,7 @@ export async function getTransactionByHash( } export async function getTransactionByBlockHashAndIndex( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, blockHash: HexString32Bytes, transactionIndex: Uint, ) { @@ -321,7 +321,7 @@ export async function getTransactionByBlockHashAndIndex( } export async function getTransactionByBlockNumberAndIndex( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, blockNumber: BlockNumberOrTag, transactionIndex: Uint, ) { @@ -334,7 +334,7 @@ export async function getTransactionByBlockNumberAndIndex( } export async function getTransactionReceipt( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, transactionHash: HexString32Bytes, ) { validator.validate(['bytes32'], [transactionHash]); @@ -346,7 +346,7 @@ export async function getTransactionReceipt( } export async function getUncleByBlockHashAndIndex( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, blockHash: HexString32Bytes, uncleIndex: Uint, ) { @@ -359,7 +359,7 @@ export async function getUncleByBlockHashAndIndex( } export async function getUncleByBlockNumberAndIndex( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, blockNumber: BlockNumberOrTag, uncleIndex: Uint, ) { @@ -371,14 +371,14 @@ export async function getUncleByBlockNumberAndIndex( }); } -export async function getCompilers(requestManager: Web3RequestManager) { +export async function getCompilers(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_getCompilers', params: [], }); } -export async function compileSolidity(requestManager: Web3RequestManager, code: string) { +export async function compileSolidity(requestManager: Web3RequestManager, code: string) { validator.validate(['string'], [code]); return requestManager.send({ @@ -387,7 +387,7 @@ export async function compileSolidity(requestManager: Web3RequestManager, code: }); } -export async function compileLLL(requestManager: Web3RequestManager, code: string) { +export async function compileLLL(requestManager: Web3RequestManager, code: string) { validator.validate(['string'], [code]); return requestManager.send({ @@ -396,7 +396,7 @@ export async function compileLLL(requestManager: Web3RequestManager, code: strin }); } -export async function compileSerpent(requestManager: Web3RequestManager, code: string) { +export async function compileSerpent(requestManager: Web3RequestManager, code: string) { validator.validate(['string'], [code]); return requestManager.send({ @@ -405,7 +405,7 @@ export async function compileSerpent(requestManager: Web3RequestManager, code: s }); } -export async function newFilter(requestManager: Web3RequestManager, filter: Filter) { +export async function newFilter(requestManager: Web3RequestManager, filter: Filter) { validator.validate(['filter'], [filter]); return requestManager.send({ @@ -414,21 +414,21 @@ export async function newFilter(requestManager: Web3RequestManager, filter: Filt }); } -export async function newBlockFilter(requestManager: Web3RequestManager) { +export async function newBlockFilter(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_newBlockFilter', params: [], }); } -export async function newPendingTransactionFilter(requestManager: Web3RequestManager) { +export async function newPendingTransactionFilter(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_newPendingTransactionFilter', params: [], }); } -export async function uninstallFilter(requestManager: Web3RequestManager, filterIdentifier: Uint) { +export async function uninstallFilter(requestManager: Web3RequestManager, filterIdentifier: Uint) { validator.validate(['hex'], [filterIdentifier]); return requestManager.send({ @@ -437,7 +437,7 @@ export async function uninstallFilter(requestManager: Web3RequestManager, filter }); } -export async function getFilterChanges(requestManager: Web3RequestManager, filterIdentifier: Uint) { +export async function getFilterChanges(requestManager: Web3RequestManager, filterIdentifier: Uint) { validator.validate(['hex'], [filterIdentifier]); return requestManager.send({ @@ -446,7 +446,7 @@ export async function getFilterChanges(requestManager: Web3RequestManager, filte }); } -export async function getFilterLogs(requestManager: Web3RequestManager, filterIdentifier: Uint) { +export async function getFilterLogs(requestManager: Web3RequestManager, filterIdentifier: Uint) { validator.validate(['hex'], [filterIdentifier]); return requestManager.send({ @@ -455,7 +455,7 @@ export async function getFilterLogs(requestManager: Web3RequestManager, filterId }); } -export async function getLogs(requestManager: Web3RequestManager, filter: Filter) { +export async function getLogs(requestManager: Web3RequestManager, filter: Filter) { validator.validate(['filter'], [filter]); return requestManager.send({ @@ -464,7 +464,7 @@ export async function getLogs(requestManager: Web3RequestManager, filter: Filter }); } -export async function getWork(requestManager: Web3RequestManager) { +export async function getWork(requestManager: Web3RequestManager) { return requestManager.send({ method: 'eth_getWork', params: [], @@ -472,7 +472,7 @@ export async function getWork(requestManager: Web3RequestManager) { } export async function submitWork( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, nonce: HexString8Bytes, hash: HexString32Bytes, digest: HexString32Bytes, @@ -486,7 +486,7 @@ export async function submitWork( } export async function submitHashrate( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, hashRate: HexString32Bytes, id: HexString32Bytes, ) { @@ -499,7 +499,7 @@ export async function submitHashrate( } export async function getFeeHistory( - requestManager: Web3RequestManager, + requestManager: Web3RequestManager, blockCount: Uint, newestBlock: BlockNumberOrTag, rewardPercentiles: number[],