Skip to content

Commit

Permalink
Nikos/5939/eip1193 provider callback types (#5971)
Browse files Browse the repository at this point in the history
* Fix ProviderRpcError type

* Fix callbacks' types

* Update Eip1194Provider class

* Update socket provider

* Trigger workflow

* Update system tests utils

* Remove test console

* Update types

* Update socket provider

* Update import

* Fix tests

* Fix websocket test

* Update eip1193 tests

* Fix eip1193 class' emits

* More changes

* Replace waitForOpenConnection with waitSocketOpen

* Revert unit test

* Update types in tests

* modify websocket test

* Fix providerConnectInfo event

* Delete unused import

* Follow restrictions for once

* Follow restrictions for removeListener

* Update packages/web3-utils/src/socket_provider.ts

Co-authored-by: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com>

* Update packages/web3-types/src/web3_api_types.ts

Co-authored-by: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com>

* Revert

* Add on and once in socket provider

* Add sendSignedTransaction deploy with input test

* Add types to removeListener

* delete type

* Address feedback

* Move any to unknown

* Update changelog

* don't allow generic string as type in events' functions

Signed-off-by: Nikos Iliakis <nikoulai94@hotmail.com>

* Update changelog

---------

Signed-off-by: Nikos Iliakis <nikoulai94@hotmail.com>
Co-authored-by: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com>
  • Loading branch information
nikoulai and Muhammad-Altabba authored Apr 20, 2023
1 parent be06d3e commit 3d80e63
Show file tree
Hide file tree
Showing 13 changed files with 271 additions and 135 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ 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 <http://www.gnu.org/licenses/>.
*/
import { Web3Eth } from 'web3-eth';
import { Contract } from '../../src';
import { sleep } from '../shared_fixtures/utils';
import { ERC721TokenAbi, ERC721TokenBytecode } from '../shared_fixtures/build/ERC721Token';
Expand All @@ -27,6 +28,7 @@ import {
signTxAndSendEIP2930,
signTxAndSendEIP1559,
sendFewSampleTxs,
closeOpenConnection,
} from '../fixtures/system_test_utils';

describe('contract', () => {
Expand All @@ -36,7 +38,10 @@ describe('contract', () => {
let sendOptions: Record<string, unknown>;
let acc: { address: string; privateKey: string };
let pkAccount: { address: string; privateKey: string };
let web3Eth: Web3Eth;

beforeAll(async () => {
web3Eth = new Web3Eth(getSystemTestProvider());
deployOptions = {
data: GreeterBytecode,
arguments: ['My Greeting'],
Expand All @@ -49,6 +54,10 @@ describe('contract', () => {
});
sendOptions = { from: acc.address, gas: '1000000' };
});

afterAll(async () => {
await closeOpenConnection(web3Eth);
});
describe('local account', () => {
it.each([signTxAndSendEIP1559, signTxAndSendEIP2930])(
'should deploy the contract %p',
Expand All @@ -68,6 +77,24 @@ describe('contract', () => {
},
);

it.each([signTxAndSendEIP1559, signTxAndSendEIP2930])(
'should deploy the contract with input%p',
async signTxAndSend => {
pkAccount = await createNewAccount({ refill: true });

const deployData = contract.deploy(deployOptions);

const res = await signTxAndSend(
contract.provider,
{
input: deployData.encodeABI(),
},
pkAccount.privateKey,
);
expect(Number(res.status)).toBe(1);
},
);

it('should return estimated gas of contract constructor %p', async () => {
const estimatedGas = await new Contract(GreeterAbi, undefined, {
provider: getSystemTestProvider(),
Expand Down
48 changes: 21 additions & 27 deletions packages/web3-providers-ipc/test/integration/eip1193.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,8 @@ You should have received a copy of the GNU Lesser General Public License
along with web3.js. If not, see <http://www.gnu.org/licenses/>.
*/

import {
HexString,
ProviderConnectInfo,
ProviderRpcError,
Web3ProviderEventCallback,
} from 'web3-types';
import { hexToNumber } from 'web3-utils';
import { HexString, ProviderRpcError, ProviderConnectInfo } from 'web3-types';
import IpcProvider from '../../src/index';

import {
Expand Down Expand Up @@ -49,20 +44,19 @@ describeIf(isIpc)('IpcProvider - eip1193', () => {

describe('check events', () => {
it('should send connect event', async () => {
const { chainId } = await new Promise(resolve => {
socketProvider.on('connect', ((_error: unknown, data) => {
resolve(data as unknown as ProviderConnectInfo);
}) as Web3ProviderEventCallback<ProviderConnectInfo>);
const providerConnectInfo = await new Promise<ProviderConnectInfo>(resolve => {
socketProvider.on('connect', (data: ProviderConnectInfo) => {
resolve(data);
});
});
expect(hexToNumber(chainId)).toBeGreaterThan(0);
expect(hexToNumber(providerConnectInfo.chainId)).toBeGreaterThan(0);
});

it('should send disconnect event', async () => {
await waitForSocketConnect(socketProvider);
const disconnectPromise = new Promise<ProviderRpcError>(resolve => {
socketProvider.on('disconnect', ((error: ProviderRpcError) => {
socketProvider.on('disconnect', (error: ProviderRpcError) => {
resolve(error);
}) as Web3ProviderEventCallback<ProviderRpcError>);
});
});
socketProvider.disconnect(1000, 'Some extra data');

Expand All @@ -76,16 +70,16 @@ describeIf(isIpc)('IpcProvider - eip1193', () => {
socketProvider._chainId = '0x1';
socketProvider.disconnect(1000);
await waitForSocketDisconnect(socketProvider);
const chainChangedPromise = new Promise<ProviderConnectInfo>(resolve => {
socketProvider.on('chainChanged', ((_error, data) => {
resolve(data as unknown as ProviderConnectInfo);
}) as Web3ProviderEventCallback<ProviderConnectInfo>);
const chainChangedPromise = new Promise<HexString>(resolve => {
socketProvider.on('chainChanged', (result: HexString) => {
resolve(result);
});
});
socketProvider.connect();
await waitForSocketConnect(socketProvider);
const changedData = await chainChangedPromise;
expect(changedData.chainId).not.toBe('0x1');
expect(hexToNumber(changedData.chainId)).toBeGreaterThan(0);
const chainId = await chainChangedPromise;
expect(chainId).not.toBe('0x1');
expect(hexToNumber(chainId)).toBeGreaterThan(0);
});
it('should send accountsChanged event', async () => {
await waitForSocketConnect(socketProvider);
Expand All @@ -94,16 +88,16 @@ describeIf(isIpc)('IpcProvider - eip1193', () => {
socketProvider._accounts = ['1', '2'];
socketProvider.disconnect(1000);
await waitForSocketDisconnect(socketProvider);
const chainChangedPromise = new Promise<{ accounts: HexString[] }>(resolve => {
socketProvider.on('accountsChanged', ((_error, data) => {
resolve(data as unknown as { accounts: HexString[] });
}) as Web3ProviderEventCallback<{ accounts: HexString[] }>);
const chainChangedPromise = new Promise<HexString[]>(resolve => {
socketProvider.on('accountsChanged', (accounts: HexString[]) => {
resolve(accounts);
});
});
socketProvider.connect();
await waitForSocketConnect(socketProvider);
const changedData = await chainChangedPromise;
const accounts = await chainChangedPromise;

expect(JSON.stringify(changedData.accounts)).not.toBe(JSON.stringify(['1', '2']));
expect(JSON.stringify(accounts)).not.toBe(JSON.stringify(['1', '2']));
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ import {
describeIf,
getSystemTestProviderUrl,
isIpc,
waitForSocketConnect,
waitForCloseSocketConnection,
waitForEvent,
waitForOpenSocketConnection,
} from '../fixtures/system_test_utils';

describeIf(isIpc)('IpcSocketProvider - reconnection', () => {
Expand All @@ -49,7 +49,7 @@ describeIf(isIpc)('IpcSocketProvider - reconnection', () => {
delay: 5000,
maxAttempts: 5,
});
await waitForOpenSocketConnection(web3Provider);
await waitForSocketConnect(web3Provider);
web3Provider.disconnect(1000, 'test');
await waitForCloseSocketConnection(web3Provider);
});
Expand All @@ -61,7 +61,7 @@ describeIf(isIpc)('IpcSocketProvider - reconnection', () => {
);
// @ts-expect-error-next-line
expect(web3Provider._reconnectOptions).toEqual(reconnectionOptions);
await waitForOpenSocketConnection(web3Provider);
await waitForSocketConnect(web3Provider);
web3Provider.disconnect(1000, 'test');
await waitForCloseSocketConnection(web3Provider);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ import {
describeIf,
getSystemTestProviderUrl,
isWs,
waitForSocketConnect,
waitForCloseSocketConnection,
waitForOpenSocketConnection,
} from '../fixtures/system_test_utils';

describeIf(isWs)('Support of Basic Auth', () => {
Expand Down Expand Up @@ -81,14 +81,14 @@ describeIf(isWs)('Support of Basic Auth', () => {
afterEach(async () => {
// make sure we try to close the connection after it is established
if (webSocketProvider.getStatus() === 'connecting') {
await waitForOpenSocketConnection(webSocketProvider);
await waitForSocketConnect(webSocketProvider);
}
webSocketProvider.disconnect();
await waitForCloseSocketConnection(webSocketProvider);
});
// eslint-disable-next-line jest/expect-expect
test('should connect with basic auth', async () => {
await waitForOpenSocketConnection(webSocketProvider);
await waitForSocketConnect(webSocketProvider);
expect(webSocketProvider.getStatus()).toBe('connected');
});
});
47 changes: 21 additions & 26 deletions packages/web3-providers-ws/test/integration/eip1193.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,8 @@ You should have received a copy of the GNU Lesser General Public License
along with web3.js. If not, see <http://www.gnu.org/licenses/>.
*/

import {
HexString,
ProviderConnectInfo,
ProviderRpcError,
Web3ProviderEventCallback,
} from 'web3-types';
import { hexToNumber } from 'web3-utils';
import { HexString, ProviderConnectInfo, ProviderRpcError } from 'web3-types';
import WebSocketProvider from '../../src/index';

import {
Expand Down Expand Up @@ -49,19 +44,19 @@ describeIf(isWs)('WebSocketProvider - eip1193', () => {

describe('check events', () => {
it('should send connect event', async () => {
const { chainId } = await new Promise(resolve => {
socketProvider.on('connect', ((_error: unknown, data) => {
resolve(data as unknown as ProviderConnectInfo);
}) as Web3ProviderEventCallback<ProviderConnectInfo>);
const providerConnectInfo = await new Promise<ProviderConnectInfo>(resolve => {
socketProvider.on('connect', (data: ProviderConnectInfo) => {
resolve(data);
});
});
expect(hexToNumber(chainId)).toBeGreaterThan(0);
expect(hexToNumber(providerConnectInfo.chainId)).toBeGreaterThan(0);
});
it('should send disconnect event', async () => {
await waitForSocketConnect(socketProvider);
const disconnectPromise = new Promise<ProviderRpcError>(resolve => {
socketProvider.on('disconnect', ((error: ProviderRpcError) => {
socketProvider.on('disconnect', (error: ProviderRpcError) => {
resolve(error);
}) as Web3ProviderEventCallback<ProviderRpcError>);
});
});
socketProvider.disconnect(1000, 'Some extra data');

Expand All @@ -75,16 +70,16 @@ describeIf(isWs)('WebSocketProvider - eip1193', () => {
socketProvider._chainId = '0x1';
socketProvider.disconnect(1000);
await waitForSocketDisconnect(socketProvider);
const chainChangedPromise = new Promise<ProviderConnectInfo>(resolve => {
socketProvider.on('chainChanged', ((_error, data) => {
resolve(data as unknown as ProviderConnectInfo);
}) as Web3ProviderEventCallback<ProviderConnectInfo>);
const chainChangedPromise = new Promise<HexString>(resolve => {
socketProvider.on('chainChanged', (result: HexString) => {
resolve(result);
});
});
socketProvider.connect();
await waitForSocketConnect(socketProvider);
const changedData = await chainChangedPromise;
expect(changedData.chainId).not.toBe('0x1');
expect(hexToNumber(changedData.chainId)).toBeGreaterThan(0);
const chainId = await chainChangedPromise;
expect(chainId).not.toBe('0x1');
expect(hexToNumber(chainId)).toBeGreaterThan(0);
});
it('should send accountsChanged event', async () => {
await waitForSocketConnect(socketProvider);
Expand All @@ -93,16 +88,16 @@ describeIf(isWs)('WebSocketProvider - eip1193', () => {
socketProvider._accounts = ['1', '2'];
socketProvider.disconnect(1000);
await waitForSocketDisconnect(socketProvider);
const chainChangedPromise = new Promise<{ accounts: HexString[] }>(resolve => {
socketProvider.on('accountsChanged', ((_error, data) => {
resolve(data as unknown as { accounts: HexString[] });
}) as Web3ProviderEventCallback<{ accounts: HexString[] }>);
const chainChangedPromise = new Promise<HexString[]>(resolve => {
socketProvider.on('accountsChanged', (accounts: HexString[]) => {
resolve(accounts);
});
});
socketProvider.connect();
await waitForSocketConnect(socketProvider);
const changedData = await chainChangedPromise;
const accounts = await chainChangedPromise;

expect(JSON.stringify(changedData.accounts)).not.toBe(JSON.stringify(['1', '2']));
expect(JSON.stringify(accounts)).not.toBe(JSON.stringify(['1', '2']));
});
});
});
Loading

0 comments on commit 3d80e63

Please sign in to comment.