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[],