From da09d803d0deafe733eae68e59240e8e07a79a91 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Thu, 19 Jan 2023 18:03:00 -0500 Subject: [PATCH 01/10] remove array --- packages/web3/src/types.ts | 8 +- packages/web3/src/web3.ts | 13 --- .../test/integration/web3.setProvider.test.ts | 80 +++++++++++++++++++ 3 files changed, 83 insertions(+), 18 deletions(-) create mode 100644 packages/web3/test/integration/web3.setProvider.test.ts diff --git a/packages/web3/src/types.ts b/packages/web3/src/types.ts index 8a15b7252c3..7a2f7857e62 100644 --- a/packages/web3/src/types.ts +++ b/packages/web3/src/types.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 { EthExecutionAPI, SupportedProviders, Address, Bytes, Transaction } from 'web3-types'; +import { Address, Bytes, Transaction } from 'web3-types'; import Eth from 'web3-eth'; import { ContractAbi, @@ -42,10 +42,8 @@ import { ENS } from 'web3-eth-ens'; import Net from 'web3-net'; import { Iban } from 'web3-eth-iban'; -export type Web3ContractConstructor = Omit & { - new (jsonInterface: Abi, address?: Address, options?: ContractInitOptions): Contract; - setProvider: (provider: SupportedProviders) => void; -}; +export type Web3ContractConstructor = Omit & + (new (jsonInterface: Abi, address?: Address, options?: ContractInitOptions) => Contract); /** * The Ethereum interface for main web3 object. It provides extra methods in addition to `web3-eth` interface. diff --git a/packages/web3/src/web3.ts b/packages/web3/src/web3.ts index 7d0e6a8fc56..f61130d6a9a 100644 --- a/packages/web3/src/web3.ts +++ b/packages/web3/src/web3.ts @@ -68,9 +68,6 @@ export class Web3 extends Web3Context { const self = this; class ContractBuilder extends Contract { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private static readonly _contracts: Contract[] = []; - public constructor(jsonInterface: Abi); public constructor(jsonInterface: Abi, address: Address); public constructor(jsonInterface: Abi, options: ContractInitOptions); @@ -91,16 +88,6 @@ export class Web3 extends Web3Context { } else { super(jsonInterface, self.getContextObject()); } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ContractBuilder._contracts.push(this as Contract); - } - - public static setProvider(_provider: SupportedProviders): boolean { - for (const contract of ContractBuilder._contracts) { - contract.provider = _provider; - } - return true; } } diff --git a/packages/web3/test/integration/web3.setProvider.test.ts b/packages/web3/test/integration/web3.setProvider.test.ts new file mode 100644 index 00000000000..e3b4d92386f --- /dev/null +++ b/packages/web3/test/integration/web3.setProvider.test.ts @@ -0,0 +1,80 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + getSystemTestProvider, + waitForOpenConnection, + closeOpenConnection, + isWs, + isHttp, + describeIf, +} from '../shared_fixtures/system_tests_utils'; +import Web3 from '../../src/index'; + +describeIf(isWs || isHttp)('web3.contract.setProvider', () => { + let clientUrl: string; + let secontUrl: string; + let web3: Web3; + + beforeAll(async () => { + clientUrl = getSystemTestProvider(); + secontUrl = clientUrl.startsWith('http') + ? clientUrl.replace('http', 'ws') + : clientUrl.replace('ws', 'http'); + web3 = new Web3(clientUrl); + + await waitForOpenConnection(web3); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + test('create few contracts and check providers', () => { + const c1 = new web3.eth.Contract([]); + const c2 = new web3.eth.Contract([]); + + expect(c1.provider).toBe(web3.provider); + expect(c2.provider).toBe(web3.provider); + }); + + test('create few contracts and check providers. set different provider', () => { + const c1 = new web3.eth.Contract([]); + const c2 = new web3.eth.Contract([]); + + expect(c1.provider).toBe(web3.provider); + expect(c2.provider).toBe(web3.provider); + + web3.setProvider(secontUrl); + + expect(c1.provider).toBe(web3.provider); + expect(c2.provider).toBe(web3.provider); + }); + + test('create few contracts, set different provider to contract and check other contract', () => { + const c1 = new web3.eth.Contract([]); + const c2 = new web3.eth.Contract([]); + + expect(c1.provider).toBe(web3.provider); + expect(c2.provider).toBe(web3.provider); + + c1.setProvider(secontUrl); + + expect(c1.provider).toBe(web3.provider); + expect(c2.provider).toBe(web3.provider); + }); +}); From d26bbf6ab806824185e0c173a6671e708bf3958e Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 30 Jan 2023 12:21:30 -0500 Subject: [PATCH 02/10] fix a problem --- packages/web3-eth/src/web3_eth.ts | 2 +- packages/web3/src/web3.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/web3-eth/src/web3_eth.ts b/packages/web3-eth/src/web3_eth.ts index 9efbe426efa..37bdf9ca652 100644 --- a/packages/web3-eth/src/web3_eth.ts +++ b/packages/web3-eth/src/web3_eth.ts @@ -58,7 +58,7 @@ type RegisteredSubscription = { syncing: typeof SyncingSubscription; }; -const registeredSubscriptions = { +export const registeredSubscriptions = { logs: LogsSubscription, newPendingTransactions: NewPendingTransactionsSubscription, newHeads: NewHeadsSubscription, diff --git a/packages/web3/src/web3.ts b/packages/web3/src/web3.ts index f61130d6a9a..3f49043ca68 100644 --- a/packages/web3/src/web3.ts +++ b/packages/web3/src/web3.ts @@ -16,7 +16,7 @@ along with web3.js. If not, see . */ // eslint-disable-next-line max-classes-per-file import { Web3Context } from 'web3-core'; -import Web3Eth from 'web3-eth'; +import Web3Eth, { registeredSubscriptions } from 'web3-eth'; import { ContractAbi } from 'web3-eth-abi'; import Contract, { ContractInitOptions } from 'web3-eth-contract'; import { ENS, registryAddresses } from 'web3-eth-ens'; @@ -47,7 +47,7 @@ export class Web3 extends Web3Context { public eth: Web3EthInterface; public constructor(provider?: SupportedProviders | string) { - super({ provider }); + super({ provider, registeredSubscriptions }); if (isNullish(provider) || (typeof provider === 'string' && provider.trim() === '')) { console.warn( From b615e3978ebd5a269078140c36fc4ee51bcaa42a Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 30 Jan 2023 12:25:40 -0500 Subject: [PATCH 03/10] revert --- packages/web3/src/types.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/web3/src/types.ts b/packages/web3/src/types.ts index 7a2f7857e62..d41674ad19b 100644 --- a/packages/web3/src/types.ts +++ b/packages/web3/src/types.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 { Address, Bytes, Transaction } from 'web3-types'; +import { Address, Bytes, EthExecutionAPI, SupportedProviders, Transaction } from 'web3-types'; import Eth from 'web3-eth'; import { ContractAbi, @@ -42,8 +42,10 @@ import { ENS } from 'web3-eth-ens'; import Net from 'web3-net'; import { Iban } from 'web3-eth-iban'; -export type Web3ContractConstructor = Omit & - (new (jsonInterface: Abi, address?: Address, options?: ContractInitOptions) => Contract); +export type Web3ContractConstructor = Omit & { + new (jsonInterface: Abi, address?: Address, options?: ContractInitOptions): Contract; + setProvider: (provider: SupportedProviders) => void; +}; /** * The Ethereum interface for main web3 object. It provides extra methods in addition to `web3-eth` interface. From 6eb71e74f635207fa56df0020a5b6ddf03dbd2d4 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 30 Jan 2023 12:26:19 -0500 Subject: [PATCH 04/10] revert --- packages/web3/src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web3/src/types.ts b/packages/web3/src/types.ts index d41674ad19b..8a15b7252c3 100644 --- a/packages/web3/src/types.ts +++ b/packages/web3/src/types.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 { Address, Bytes, EthExecutionAPI, SupportedProviders, Transaction } from 'web3-types'; +import { EthExecutionAPI, SupportedProviders, Address, Bytes, Transaction } from 'web3-types'; import Eth from 'web3-eth'; import { ContractAbi, From 0b2503b39ab8273c1450f5ba353b2a9354ab2ca3 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 30 Jan 2023 13:27:43 -0500 Subject: [PATCH 05/10] fix types --- packages/web3/src/types.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/web3/src/types.ts b/packages/web3/src/types.ts index 8a15b7252c3..7a2f7857e62 100644 --- a/packages/web3/src/types.ts +++ b/packages/web3/src/types.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 { EthExecutionAPI, SupportedProviders, Address, Bytes, Transaction } from 'web3-types'; +import { Address, Bytes, Transaction } from 'web3-types'; import Eth from 'web3-eth'; import { ContractAbi, @@ -42,10 +42,8 @@ import { ENS } from 'web3-eth-ens'; import Net from 'web3-net'; import { Iban } from 'web3-eth-iban'; -export type Web3ContractConstructor = Omit & { - new (jsonInterface: Abi, address?: Address, options?: ContractInitOptions): Contract; - setProvider: (provider: SupportedProviders) => void; -}; +export type Web3ContractConstructor = Omit & + (new (jsonInterface: Abi, address?: Address, options?: ContractInitOptions) => Contract); /** * The Ethereum interface for main web3 object. It provides extra methods in addition to `web3-eth` interface. From 7b38ceecd78242026d3e0534bbcc7c7ab7123769 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 30 Jan 2023 15:21:04 -0500 Subject: [PATCH 06/10] fix ws test --- scripts/system_tests_utils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/system_tests_utils.ts b/scripts/system_tests_utils.ts index b696366c072..b3ecc36275e 100644 --- a/scripts/system_tests_utils.ts +++ b/scripts/system_tests_utils.ts @@ -53,6 +53,7 @@ import Web3 from 'web3'; // eslint-disable-next-line import/no-extraneous-dependencies import { NonPayableMethodObject } from 'web3-eth-contract'; // eslint-disable-next-line import/no-extraneous-dependencies +import HttpProvider from 'web3-providers-http'; import accountsString from './accounts.json'; /** @@ -125,7 +126,7 @@ export const waitForOpenConnection = async ( }); export const closeOpenConnection = async (web3Context: Web3Context) => { - if (!isSocket) { + if (!isSocket || web3Context.provider instanceof HttpProvider) { return; } From e8682e1a6066efcdba4e699986ce05849512fad6 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 30 Jan 2023 16:20:09 -0500 Subject: [PATCH 07/10] fix --- scripts/system_tests_utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system_tests_utils.ts b/scripts/system_tests_utils.ts index b3ecc36275e..1a533dc0915 100644 --- a/scripts/system_tests_utils.ts +++ b/scripts/system_tests_utils.ts @@ -126,7 +126,7 @@ export const waitForOpenConnection = async ( }); export const closeOpenConnection = async (web3Context: Web3Context) => { - if (!isSocket || web3Context.provider instanceof HttpProvider) { + if (!isSocket || web3Context?.provider instanceof HttpProvider) { return; } From 02c9cb422c7d4ec82c6d6d84914a9cb08c8b29fa Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Tue, 31 Jan 2023 09:53:43 -0500 Subject: [PATCH 08/10] changelog --- CHANGELOG.md | 6 ++++++ packages/web3/CHANGELOG.md | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff0bf758f8c..422dd52c24d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1138,3 +1138,9 @@ should use 4.0.1-alpha.0 for testing. ## [Unreleased] - Added rpc exception codes following eip-1474 as an experimental feature (if `useRpcCallSpecification` at `enableExperimentalFeatures` is `true`) (#5525) + +#### web3 + +##### Removed + +- Private static `_contracts:Contract[]` and static `setProvider` function was removed diff --git a/packages/web3/CHANGELOG.md b/packages/web3/CHANGELOG.md index a08f5baf67f..e1351f9e530 100644 --- a/packages/web3/CHANGELOG.md +++ b/packages/web3/CHANGELOG.md @@ -66,3 +66,7 @@ web3.currentProvider.disconnect(); - `build` entry from `package.json` (#5755) ## [Unreleased] + +### Removed + +- Private static `_contracts:Contract[]` and static `setProvider` function was removed From e3ddbb0eda1d282db4b266a6f132db9cc854d6b0 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Tue, 31 Jan 2023 09:57:33 -0500 Subject: [PATCH 09/10] added log --- CHANGELOG.md | 4 ++++ packages/web3/CHANGELOG.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 422dd52c24d..35dbcf2684f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1144,3 +1144,7 @@ should use 4.0.1-alpha.0 for testing. ##### Removed - Private static `_contracts:Contract[]` and static `setProvider` function was removed + +##### Added + +- `registeredSubscriptions` was added by default in web3 constructor diff --git a/packages/web3/CHANGELOG.md b/packages/web3/CHANGELOG.md index e1351f9e530..ee034629cba 100644 --- a/packages/web3/CHANGELOG.md +++ b/packages/web3/CHANGELOG.md @@ -70,3 +70,7 @@ web3.currentProvider.disconnect(); ### Removed - Private static `_contracts:Contract[]` and static `setProvider` function was removed + +### Added + +- `registeredSubscriptions` was added by default in web3 constructor From c6026b8c9973be1be982151961f5879f9dd55287 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Tue, 31 Jan 2023 12:23:57 -0500 Subject: [PATCH 10/10] add pr number --- CHANGELOG.md | 4 ++-- packages/web3/CHANGELOG.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35dbcf2684f..b858ceaea56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1143,8 +1143,8 @@ should use 4.0.1-alpha.0 for testing. ##### Removed -- Private static `_contracts:Contract[]` and static `setProvider` function was removed +- Private static `_contracts:Contract[]` and static `setProvider` function was removed (#5792) ##### Added -- `registeredSubscriptions` was added by default in web3 constructor +- `registeredSubscriptions` was added by default in web3 constructor (#5792) diff --git a/packages/web3/CHANGELOG.md b/packages/web3/CHANGELOG.md index ee034629cba..c4f4d81b494 100644 --- a/packages/web3/CHANGELOG.md +++ b/packages/web3/CHANGELOG.md @@ -69,8 +69,8 @@ web3.currentProvider.disconnect(); ### Removed -- Private static `_contracts:Contract[]` and static `setProvider` function was removed +- Private static `_contracts:Contract[]` and static `setProvider` function was removed (#5792) ### Added -- `registeredSubscriptions` was added by default in web3 constructor +- `registeredSubscriptions` was added by default in web3 constructor (#5792)