diff --git a/.yarn/patches/buffer-equal-constant-time-npm-1.0.1-41826f3419.patch b/.yarn/patches/buffer-equal-constant-time-npm-1.0.1-41826f3419.patch new file mode 100644 index 000000000..5cef971d8 --- /dev/null +++ b/.yarn/patches/buffer-equal-constant-time-npm-1.0.1-41826f3419.patch @@ -0,0 +1,27 @@ +diff --git a/index.js b/index.js +index 5462c1f830bdbe79bf2b1fcfd811cd9799b4dd11..e8fe7e61083d95714bba6f2d4544d0426749a64f 100644 +--- a/index.js ++++ b/index.js +@@ -28,14 +28,19 @@ function bufferEq(a, b) { + } + + bufferEq.install = function() { +- Buffer.prototype.equal = SlowBuffer.prototype.equal = function equal(that) { ++ Buffer.prototype.equal = function equal(that) { + return bufferEq(this, that); + }; ++ if (SlowBuffer) { ++ SlowBuffer.prototype.equal = Buffer.prototype.equal; ++ } + }; + + var origBufEqual = Buffer.prototype.equal; +-var origSlowBufEqual = SlowBuffer.prototype.equal; ++var origSlowBufEqual = SlowBuffer ? SlowBuffer.prototype.equal : undefined; + bufferEq.restore = function() { + Buffer.prototype.equal = origBufEqual; +- SlowBuffer.prototype.equal = origSlowBufEqual; ++ if (SlowBuffer && origSlowBufEqual) { ++ SlowBuffer.prototype.equal = origSlowBufEqual; ++ } + }; diff --git a/package.json b/package.json index 498129028..7a8528cd1 100644 --- a/package.json +++ b/package.json @@ -54,11 +54,10 @@ "typescript": "5.3.3" }, "resolutions": { - "web3": "1.10.4", - "web3-utils": "1.10.4", "blind-threshold-bls": "npm:@celo/blind-threshold-bls@1.0.0-beta", "@types/bn.js": "4.11.6", - "bignumber.js": "9.0.0" + "bignumber.js": "9.0.0", + "buffer-equal-constant-time@npm:1.0.1": "patch:buffer-equal-constant-time@npm%3A1.0.1#~/.yarn/patches/buffer-equal-constant-time-npm-1.0.1-41826f3419.patch" }, "dependencies": { "@changesets/cli": "^2.29.5" diff --git a/packages/cli/package.json b/packages/cli/package.json index 086e16035..626a4dece 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -74,8 +74,7 @@ "fs-extra": "^8.1.0", "humanize-duration": "^3.32.1", "prompts": "^2.0.1", - "viem": "^2.33.2", - "web3": "1.10.4" + "viem": "^2.33.2" }, "devDependencies": { "@celo/dev-utils": "workspace:^", diff --git a/packages/cli/src/base.test.ts b/packages/cli/src/base.test.ts index fef8f219c..15d80ba5c 100644 --- a/packages/cli/src/base.test.ts +++ b/packages/cli/src/base.test.ts @@ -7,7 +7,6 @@ import http from 'http' import { tmpdir } from 'os' import { MethodNotFoundRpcError } from 'viem' import { privateKeyToAddress } from 'viem/accounts' -import Web3 from 'web3' import { BaseCommand } from './base' import Set from './commands/config/set' import CustomHelp from './help' @@ -105,7 +104,7 @@ jest.mock('../package.json', () => ({ version: '5.2.3', })) -testWithAnvilL2('BaseCommand', (web3: Web3) => { +testWithAnvilL2('BaseCommand', (client) => { const logSpy = jest.spyOn(console, 'log').mockImplementation() beforeEach(() => { @@ -118,7 +117,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { const storedDerivationPath = readConfig(tmpdir()).derivationPath console.info('storedDerivationPath', storedDerivationPath) expect(storedDerivationPath).not.toBe(undefined) - await testLocallyWithWeb3Node(BasicCommand, ['--useLedger'], web3) + await testLocallyWithWeb3Node(BasicCommand, ['--useLedger'], client) expect(WalletLedgerExports.newLedgerWalletWithSetup).toHaveBeenCalledWith( expect.anything(), expect.objectContaining({ @@ -134,8 +133,8 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { it('uses custom derivationPath', async () => { const storedDerivationPath = readConfig(tmpdir()).derivationPath const customPath = "m/44'/9000'/0'" - await testLocallyWithWeb3Node(Set, ['--derivationPath', customPath], web3) - await testLocallyWithWeb3Node(BasicCommand, ['--useLedger'], web3) + await testLocallyWithWeb3Node(Set, ['--derivationPath', customPath], client) + await testLocallyWithWeb3Node(BasicCommand, ['--useLedger'], client) expect(WalletLedgerExports.newLedgerWalletWithSetup).toHaveBeenCalledWith( expect.anything(), expect.objectContaining({ @@ -147,12 +146,12 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { baseDerivationPath: customPath, }) ) - await testLocallyWithWeb3Node(Set, ['--derivationPath', storedDerivationPath], web3) + await testLocallyWithWeb3Node(Set, ['--derivationPath', storedDerivationPath], client) }) }) it('--ledgerAddresses passes derivationPathIndexes to LedgerWallet', async () => { - await testLocallyWithWeb3Node(BasicCommand, ['--useLedger', '--ledgerAddresses', '5'], web3) + await testLocallyWithWeb3Node(BasicCommand, ['--useLedger', '--ledgerAddresses', '5'], client) expect(WalletLedgerExports.newLedgerWalletWithSetup).toHaveBeenCalledWith( expect.anything(), @@ -200,7 +199,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { await testLocallyWithWeb3Node( BasicCommand, ['--useLedger', '--ledgerLiveMode', '--ledgerAddresses', '5'], - web3 + client ) expect(WalletLedgerExports.newLedgerWalletWithSetup).toHaveBeenCalledWith( @@ -249,7 +248,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { await testLocallyWithWeb3Node( BasicCommand, ['--useLedger', '--ledgerLiveMode', '--ledgerCustomAddresses', '[1,8,9]'], - web3 + client ) expect(WalletLedgerExports.newLedgerWalletWithSetup).toHaveBeenCalledWith( @@ -296,7 +295,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { await testLocallyWithWeb3Node( BasicCommand, ['--useLedger', '--ledgerCustomAddresses', '[1,8,9]'], - web3 + client ) expect(WalletLedgerExports.newLedgerWalletWithSetup).toHaveBeenCalledWith( @@ -350,7 +349,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { '--from', '0x1234567890123456789012345678901234567890', ], - web3 + client ) expect(ViemAccountLedgerExports.ledgerToWalletClient).toHaveBeenCalledWith( @@ -381,7 +380,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { const errorSpy = jest.spyOn(console, 'error').mockImplementation() await expect( - testLocallyWithWeb3Node(TestErrorCommand, [], web3) + testLocallyWithWeb3Node(TestErrorCommand, [], client) ).rejects.toThrowErrorMatchingInlineSnapshot( `"Unable to create an RPC Wallet Client, the node is not unlocked. Did you forget to use \`--privateKey\` or \`--useLedger\`?"` ) @@ -399,7 +398,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { const errorSpy = jest.spyOn(console, 'error').mockImplementation() await expect( - testLocallyWithWeb3Node(TestErrorCommand, [], web3) + testLocallyWithWeb3Node(TestErrorCommand, [], client) ).rejects.toThrowErrorMatchingInlineSnapshot(`"test error"`) expect(errorSpy.mock.calls).toMatchInlineSnapshot(` @@ -432,7 +431,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { const errorSpy = jest.spyOn(console, 'error').mockImplementation() await expect( - testLocallyWithWeb3Node(TestErrorCommand, ['--output', 'csv'], web3) + testLocallyWithWeb3Node(TestErrorCommand, ['--output', 'csv'], client) ).rejects.toThrowErrorMatchingInlineSnapshot(`"test error"`) expect(errorSpy.mock.calls).toMatchInlineSnapshot(`[]`) @@ -453,7 +452,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { throw new Error('Mock connection stop error') }) - await testLocallyWithWeb3Node(TestConnectionStopErrorCommand, [], web3) + await testLocallyWithWeb3Node(TestConnectionStopErrorCommand, [], client) expect(logSpy.mock.calls).toMatchInlineSnapshot(` [ @@ -492,7 +491,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { testLocallyWithWeb3Node( TestPrivateKeyCommand, ['--privateKey', privateKey, '--from', wrongFromAddress], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot( `"The --from address ${wrongFromAddress} does not match the address derived from the provided private key 0x1Be31A94361a391bBaFB2a4CCd704F57dc04d4bb."` @@ -518,7 +517,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { testLocallyWithWeb3Node( TestPrivateKeyCommand, ['--privateKey', privateKey, '--from', correctFromAddress], - web3 + client ) ).resolves.not.toThrow() }) @@ -538,7 +537,7 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { } await expect( - testLocallyWithWeb3Node(TestPrivateKeyCommand, ['--privateKey', privateKey], web3) + testLocallyWithWeb3Node(TestPrivateKeyCommand, ['--privateKey', privateKey], client) ).resolves.not.toThrow() }) }) @@ -687,7 +686,6 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { }) delete process.env.TELEMETRY_ENABLED - process.env.TELEMETRY_URL = 'http://localhost:3000/' const fetchSpy = jest.spyOn(global, 'fetch') @@ -697,13 +695,17 @@ testWithAnvilL2('BaseCommand', (web3: Web3) => { }, 5000) // Higher timeout than the telemetry logic uses }) - server.listen(3000, async () => { + server.listen(0, async () => { + const address = server.address() as { port: number } + const telemetryUrl = `http://localhost:${address.port}/` + process.env.TELEMETRY_URL = telemetryUrl + // Make sure the command actually returns await expect(TestTelemetryCommand.run([])).resolves.toBe(EXPECTED_COMMAND_RESULT) expect(fetchSpy.mock.calls.length).toEqual(1) - expect(fetchSpy.mock.calls[0][0]).toMatchInlineSnapshot(`"http://localhost:3000/"`) + expect(fetchSpy.mock.calls[0][0]).toEqual(telemetryUrl) expect(fetchSpy.mock.calls[0][1]?.body).toMatchInlineSnapshot(` " celocli_invocation{success="true", version="5.2.3", command="test:telemetry-timeout"} 1 diff --git a/packages/cli/src/base.ts b/packages/cli/src/base.ts index 3856b7927..dcd800148 100644 --- a/packages/cli/src/base.ts +++ b/packages/cli/src/base.ts @@ -5,8 +5,9 @@ import { ETHEREUM_DERIVATION_PATH, StrongAddress, } from '@celo/base' -import { ReadOnlyWallet } from '@celo/connect' +import { ReadOnlyWallet, Web3 } from '@celo/connect' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' +import { getWeb3ForKit } from '@celo/contractkit/lib/setupForKits' import { ledgerToWalletClient } from '@celo/viem-account-ledger' import { AzureHSMWallet } from '@celo/wallet-hsm-azure' import { AddressValidation, newLedgerWalletWithSetup } from '@celo/wallet-ledger' @@ -16,7 +17,6 @@ import { Command, Flags, ux } from '@oclif/core' import { CLIError } from '@oclif/core/lib/errors' import { ArgOutput, FlagOutput, Input, ParserOutput } from '@oclif/core/lib/interfaces/parser' import chalk from 'chalk' -import net from 'net' import { createPublicClient, createWalletClient, @@ -30,7 +30,6 @@ import { import { privateKeyToAccount } from 'viem/accounts' import { celo, celoSepolia } from 'viem/chains' import { ipc } from 'viem/node' -import Web3 from 'web3' import createRpcWalletClient from './packages-to-be/rpc-client' import { failWith } from './utils/cli' import { CustomFlags } from './utils/command' @@ -153,7 +152,8 @@ export abstract class BaseCommand extends Command { async getWeb3() { if (!this._web3) { - this._web3 = await this.newWeb3() + const kit = await this.getKit() + this._web3 = kit.web3 } return this._web3 } @@ -174,15 +174,12 @@ export abstract class BaseCommand extends Command { async newWeb3() { const nodeUrl = await this.getNodeUrl() - - return nodeUrl && nodeUrl.endsWith('.ipc') - ? new Web3(new Web3.providers.IpcProvider(nodeUrl, net)) - : new Web3(nodeUrl) + return getWeb3ForKit(nodeUrl, undefined) } async getKit() { if (!this._kit) { - this._kit = newKitFromWeb3(await this.getWeb3()) + this._kit = newKitFromWeb3(await this.newWeb3()) } const res = await this.parse() @@ -324,7 +321,10 @@ export abstract class BaseCommand extends Command { } catch (e) { let code: number | undefined try { - const error = JSON.parse((e as any).details) as { code: number; message: string } + const error = JSON.parse((e as Error & { details: string }).details) as { + code: number + message: string + } code = error.code } catch (_) { // noop @@ -348,7 +348,7 @@ export abstract class BaseCommand extends Command { const res = await this.parse(BaseCommand) const isLedgerLiveMode = res.flags.ledgerLiveMode const indicesToIterateOver: number[] = res.raw.some( - (value: any) => value.flag === 'ledgerCustomAddresses' + (value) => (value as { flag?: string }).flag === 'ledgerCustomAddresses' ) ? JSON.parse(res.flags.ledgerCustomAddresses) : Array.from(new Array(res.flags.ledgerAddresses).keys()) @@ -401,7 +401,7 @@ export abstract class BaseCommand extends Command { try { const isLedgerLiveMode = res.flags.ledgerLiveMode const indicesToIterateOver: number[] = res.raw.some( - (value) => (value as any).flag === 'ledgerCustomAddresses' + (value) => (value as { flag?: string }).flag === 'ledgerCustomAddresses' ) ? JSON.parse(res.flags.ledgerCustomAddresses) : Array.from(new Array(res.flags.ledgerAddresses).keys()) @@ -511,7 +511,7 @@ export abstract class BaseCommand extends Command { return false } - async finally(arg: Error | undefined): Promise { + async finally(arg: Error | undefined): Promise { const hideExtraOutput = await this.shouldHideExtraOutput(arg) try { diff --git a/packages/cli/src/commands/account/authorize.test.ts b/packages/cli/src/commands/account/authorize.test.ts index 0d8f10415..8c721e240 100644 --- a/packages/cli/src/commands/account/authorize.test.ts +++ b/packages/cli/src/commands/account/authorize.test.ts @@ -1,6 +1,5 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { PROOF_OF_POSSESSION_SIGNATURE } from '../../test-utils/constants' import Lock from '../lockedcelo/lock' @@ -10,7 +9,7 @@ import Register from './register' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('account:authorize cmd', (web3: Web3) => { +testWithAnvilL2('account:authorize cmd', (client) => { const logMock = jest.spyOn(console, 'log') const errorMock = jest.spyOn(console, 'error') @@ -22,11 +21,11 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { afterEach(() => jest.clearAllMocks()) test('can authorize vote signer', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const notRegisteredAccount = accounts[0] const signerNotRegisteredAccount = accounts[1] - await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], web3) + await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], client) logMock.mockClear() @@ -42,7 +41,7 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { '--signature', PROOF_OF_POSSESSION_SIGNATURE, ], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -67,11 +66,11 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { }) test('can authorize attestation signer', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const notRegisteredAccount = accounts[0] const signerNotRegisteredAccount = accounts[1] - await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], web3) + await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], client) logMock.mockClear() @@ -87,7 +86,7 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { '--signature', PROOF_OF_POSSESSION_SIGNATURE, ], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -112,11 +111,11 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { }) test('can authorize validator signer before validator is registered', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const notRegisteredAccount = accounts[0] const signerNotRegisteredAccount = accounts[1] - await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], web3) + await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], client) logMock.mockClear() @@ -132,7 +131,7 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { '--signature', PROOF_OF_POSSESSION_SIGNATURE, ], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -158,20 +157,20 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { }) it('can authorize validator signer after validator is registered', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const notRegisteredAccount = accounts[0] const signerNotRegisteredAccount = accounts[1] - const ecdsaPublicKey = await addressToPublicKey(notRegisteredAccount, web3.eth.sign) - await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], web3) + const ecdsaPublicKey = await addressToPublicKey(notRegisteredAccount, client.eth.sign) + await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], client) await testLocallyWithWeb3Node( Lock, ['--from', notRegisteredAccount, '--value', '10000000000000000000000'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorRegister, ['--from', notRegisteredAccount, '--ecdsaKey', ecdsaPublicKey, '--yes'], - web3 + client ) logMock.mockClear() @@ -188,7 +187,7 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { '--signature', PROOF_OF_POSSESSION_SIGNATURE, ], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -213,20 +212,20 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { }) it('fails when using BLS keys on L2', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const notRegisteredAccount = accounts[0] const signerNotRegisteredAccount = accounts[1] - const ecdsaPublicKey = await addressToPublicKey(notRegisteredAccount, web3.eth.sign) - await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], web3) + const ecdsaPublicKey = await addressToPublicKey(notRegisteredAccount, client.eth.sign) + await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], client) await testLocallyWithWeb3Node( Lock, ['--from', notRegisteredAccount, '--value', '10000000000000000000000'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorRegister, ['--from', notRegisteredAccount, '--ecdsaKey', ecdsaPublicKey, '--yes'], - web3 + client ) logMock.mockClear() @@ -249,7 +248,7 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { '0xcdb77255037eb68897cd487fdd85388cbda448f617f874449d4b11588b0b7ad8ddc20d9bb450b513bb35664ea3923900', ], - web3 + client ) ).rejects.toMatchInlineSnapshot(` [Error: Nonexistent flags: --blsKey, --blsPop @@ -260,20 +259,20 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { }) test('can force authorize validator signer without BLS after validator is registered', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const notRegisteredAccount = accounts[0] const signerNotRegisteredAccount = accounts[1] - const ecdsaPublicKey = await addressToPublicKey(notRegisteredAccount, web3.eth.sign) - await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], web3) + const ecdsaPublicKey = await addressToPublicKey(notRegisteredAccount, client.eth.sign) + await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], client) await testLocallyWithWeb3Node( Lock, ['--from', notRegisteredAccount, '--value', '10000000000000000000000'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorRegister, ['--from', notRegisteredAccount, '--ecdsaKey', ecdsaPublicKey, '--yes'], - web3 + client ) logMock.mockClear() @@ -291,7 +290,7 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { PROOF_OF_POSSESSION_SIGNATURE, '--force', ], - web3 + client ) expect(stripAnsiCodesFromNestedArray(errorMock.mock.calls)).toMatchInlineSnapshot(`[]`) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -316,7 +315,7 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { }) test('fails if from is not an account', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const notRegisteredAccount = accounts[0] const signerNotRegisteredAccount = accounts[1] @@ -336,7 +335,7 @@ testWithAnvilL2('account:authorize cmd', (web3: Web3) => { PROOF_OF_POSSESSION_SIGNATURE, ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(stripAnsiCodesFromNestedArray(errorMock.mock.calls)).toMatchInlineSnapshot(`[]`) diff --git a/packages/cli/src/commands/account/balance.test.ts b/packages/cli/src/commands/account/balance.test.ts index 7009d0b10..ed88fc19d 100644 --- a/packages/cli/src/commands/account/balance.test.ts +++ b/packages/cli/src/commands/account/balance.test.ts @@ -1,7 +1,6 @@ import { ContractKit, newKitFromWeb3, StableToken } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { topUpWithToken } from '../../test-utils/chain-setup' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Lock from '../lockedcelo/lock' @@ -10,24 +9,24 @@ import Balance from './balance' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('account:balance cmd', (web3: Web3) => { +testWithAnvilL2('account:balance cmd', (client) => { const consoleMock = jest.spyOn(console, 'log') let accounts: string[] = [] let kit: ContractKit beforeEach(async () => { - kit = newKitFromWeb3(web3) - accounts = await web3.eth.getAccounts() + kit = newKitFromWeb3(client) + accounts = await client.eth.getAccounts() consoleMock.mockClear() }) it('shows the balance of the account for CELO only', async () => { - await testLocallyWithWeb3Node(Lock, ['--from', accounts[0], '--value', '1234567890'], web3) - await testLocallyWithWeb3Node(Unlock, ['--from', accounts[0], '--value', '890'], web3) + await testLocallyWithWeb3Node(Lock, ['--from', accounts[0], '--value', '1234567890'], client) + await testLocallyWithWeb3Node(Unlock, ['--from', accounts[0], '--value', '890'], client) consoleMock.mockClear() - await testLocallyWithWeb3Node(Balance, [accounts[0]], web3) + await testLocallyWithWeb3Node(Balance, [accounts[0]], client) // Instead of exact snapshot matching, let's verify the balance structure and ranges const calls = stripAnsiCodesFromNestedArray(consoleMock.mock.calls) @@ -55,7 +54,7 @@ testWithAnvilL2('account:balance cmd', (web3: Web3) => { await testLocallyWithWeb3Node( Balance, [accounts[0], '--erc20Address', (await kit.contracts.getGoldToken()).address], - web3 + client ) expect(stripAnsiCodesFromNestedArray(consoleMock.mock.calls)).toMatchInlineSnapshot(` diff --git a/packages/cli/src/commands/account/claims.test.ts b/packages/cli/src/commands/account/claims.test.ts index ab9e288f6..ade565fb1 100644 --- a/packages/cli/src/commands/account/claims.test.ts +++ b/packages/cli/src/commands/account/claims.test.ts @@ -6,7 +6,6 @@ import { ux } from '@oclif/core' import { readFileSync, writeFileSync } from 'fs' import humanizeDuration from 'humanize-duration' import { tmpdir } from 'os' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import ClaimAccount from './claim-account' import ClaimDomain from './claim-domain' @@ -17,14 +16,14 @@ import RegisterMetadata from './register-metadata' import ShowMetadata from './show-metadata' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('account metadata cmds', (web3: Web3) => { +testWithAnvilL2('account metadata cmds', (client) => { let account: string let accounts: string[] let kit: ContractKit beforeEach(async () => { - accounts = await web3.eth.getAccounts() - kit = newKitFromWeb3(web3) + accounts = await client.eth.getAccounts() + kit = newKitFromWeb3(client) account = accounts[0] }) @@ -40,7 +39,7 @@ testWithAnvilL2('account metadata cmds', (web3: Web3) => { test('account:create-metadata cmd', async () => { const newFilePath = `${tmpdir()}/newfile.json` - await testLocallyWithWeb3Node(CreateMetadata, ['--from', account, newFilePath], web3) + await testLocallyWithWeb3Node(CreateMetadata, ['--from', account, newFilePath], client) const res = JSON.parse(readFileSync(newFilePath).toString()) expect(res.meta.address).toEqual(account) }) @@ -51,7 +50,7 @@ testWithAnvilL2('account metadata cmds', (web3: Web3) => { await testLocallyWithWeb3Node( ClaimName, ['--from', account, '--name', name, emptyFilePath], - web3 + client ) const metadata = await readFile() const claim = metadata.findClaim(ClaimTypes.NAME) @@ -65,7 +64,7 @@ testWithAnvilL2('account metadata cmds', (web3: Web3) => { await testLocallyWithWeb3Node( ClaimDomain, ['--from', account, '--domain', domain, emptyFilePath], - web3 + client ) const metadata = await readFile() const claim = metadata.findClaim(ClaimTypes.DOMAIN) @@ -81,7 +80,7 @@ testWithAnvilL2('account metadata cmds', (web3: Web3) => { testLocallyWithWeb3Node( ClaimRpcUrl, [emptyFilePath, '--from', account, '--rpcUrl', 'http://127.0.0.1:8545'], - web3 + client ) ).rejects.toMatchInlineSnapshot(` [Error: Parsing --rpcUrl @@ -92,7 +91,7 @@ testWithAnvilL2('account metadata cmds', (web3: Web3) => { await testLocallyWithWeb3Node( ClaimRpcUrl, [emptyFilePath, '--from', account, '--rpcUrl', rpcUrl], - web3 + client ) const metadata = await readFile() @@ -104,7 +103,7 @@ testWithAnvilL2('account metadata cmds', (web3: Web3) => { const infoMock = jest.spyOn(console, 'info') const writeMock = jest.spyOn(ux.write, 'stdout') - await testLocallyWithWeb3Node(ShowMetadata, [emptyFilePath, '--csv'], web3) + await testLocallyWithWeb3Node(ShowMetadata, [emptyFilePath, '--csv'], client) expect(stripAnsiCodesFromNestedArray(infoMock.mock.calls)).toMatchInlineSnapshot(` [ @@ -136,7 +135,7 @@ testWithAnvilL2('account metadata cmds', (web3: Web3) => { await testLocallyWithWeb3Node( ClaimAccount, ['--from', account, '--address', otherAccount, emptyFilePath], - web3 + client ) const metadata = await readFile() const claim = metadata.findClaim(ClaimTypes.ACCOUNT) @@ -156,13 +155,13 @@ testWithAnvilL2('account metadata cmds', (web3: Web3) => { await testLocallyWithWeb3Node( RegisterMetadata, ['--force', '--from', account, '--url', 'https://example.com'], - web3 + client ) }) test('fails if url is missing', async () => { await expect( - testLocallyWithWeb3Node(RegisterMetadata, ['--force', '--from', account], web3) + testLocallyWithWeb3Node(RegisterMetadata, ['--force', '--from', account], client) ).rejects.toThrow('Missing required flag') }) }) @@ -172,7 +171,7 @@ testWithAnvilL2('account metadata cmds', (web3: Web3) => { testLocallyWithWeb3Node( RegisterMetadata, ['--force', '--from', account, '--url', 'https://example.com'], - web3 + client ) ).rejects.toThrow("Some checks didn't pass!") }) diff --git a/packages/cli/src/commands/account/deauthorize.test.ts b/packages/cli/src/commands/account/deauthorize.test.ts index b1db34e28..aec207394 100644 --- a/packages/cli/src/commands/account/deauthorize.test.ts +++ b/packages/cli/src/commands/account/deauthorize.test.ts @@ -7,12 +7,12 @@ import Register from './register' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('account:deauthorize cmd', (web3) => { +testWithAnvilL2('account:deauthorize cmd', (client) => { test('can deauthorize attestation signer', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const notRegisteredAccount = accounts[0] const signerNotRegisteredAccount = accounts[1] - await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], client) await testLocallyWithWeb3Node( Authorize, [ @@ -25,7 +25,7 @@ testWithAnvilL2('account:deauthorize cmd', (web3) => { '--signature', PROOF_OF_POSSESSION_SIGNATURE, ], - web3 + client ) const logMock = jest.spyOn(console, 'log') @@ -40,7 +40,7 @@ testWithAnvilL2('account:deauthorize cmd', (web3) => { '--signer', signerNotRegisteredAccount, ], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -56,10 +56,10 @@ testWithAnvilL2('account:deauthorize cmd', (web3) => { }) test('cannot deauthorize a non-authorized signer', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const notRegisteredAccount = accounts[0] const signerNotRegisteredAccount = accounts[1] - await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], web3) + await testLocallyWithWeb3Node(Register, ['--from', notRegisteredAccount], client) await expect( testLocallyWithWeb3Node( @@ -73,7 +73,7 @@ testWithAnvilL2('account:deauthorize cmd', (web3) => { signerNotRegisteredAccount, ], - web3 + client ) ).rejects.toMatchInlineSnapshot( `[Error: Invalid signer argument: 0x6Ecbe1DB9EF729CBe972C83Fb886247691Fb6beb. The current signer for this role is: 0x5409ED021D9299bf6814279A6A1411A7e866A631]` diff --git a/packages/cli/src/commands/account/new.test.ts b/packages/cli/src/commands/account/new.test.ts index 0f8c17565..edc585013 100644 --- a/packages/cli/src/commands/account/new.test.ts +++ b/packages/cli/src/commands/account/new.test.ts @@ -1,7 +1,6 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import fs from 'node:fs' import path from 'node:path' -import Web3 from 'web3' import { stripAnsiCodesAndTxHashes, stripAnsiCodesFromNestedArray, @@ -11,7 +10,7 @@ import NewAccount from './new' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('account:new cmd', (web3: Web3) => { +testWithAnvilL2('account:new cmd', (client) => { const writeMock = jest.spyOn(NewAccount.prototype, 'log').mockImplementation(() => { // noop }) @@ -24,7 +23,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { consoleMock.mockClear() }) it('generates mnemonic and lets people know which derivation path is being used when called with no flags', async () => { - await testLocallyWithWeb3Node(NewAccount, [], web3) + await testLocallyWithWeb3Node(NewAccount, [], client) expect(stripAnsiCodesFromNestedArray(writeMock.mock.calls)).toMatchInlineSnapshot(` [ @@ -46,7 +45,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { }) it("when called with --derivationPath eth it generates mnemonic using m/44'/60'/0'", async () => { - await testLocallyWithWeb3Node(NewAccount, ['--derivationPath', 'eth'], web3) + await testLocallyWithWeb3Node(NewAccount, ['--derivationPath', 'eth'], client) expect(deRandomize(consoleMock.mock.lastCall?.[0])).toMatchInlineSnapshot(` "mnemonic: *** *** @@ -58,7 +57,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { }) it(`when called with --derivationPath celoLegacy it generates with "m/44'/52752'/0'"`, async () => { - await testLocallyWithWeb3Node(NewAccount, ['--derivationPath', 'celoLegacy'], web3) + await testLocallyWithWeb3Node(NewAccount, ['--derivationPath', 'celoLegacy'], client) expect(deRandomize(consoleMock.mock.lastCall?.[0])).toMatchInlineSnapshot(` "mnemonic: *** *** @@ -72,7 +71,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { describe('bad data --derivationPath', () => { it(`with invalid alias "notARealPath" throws"`, async () => { await expect( - testLocallyWithWeb3Node(NewAccount, ['--derivationPath', 'notARealPath'], web3) + testLocallyWithWeb3Node(NewAccount, ['--derivationPath', 'notARealPath'], client) ).rejects.toThrowErrorMatchingInlineSnapshot(` "Parsing --derivationPath Invalid derivationPath: notARealPath. should be in format "m / 44' / coin_type' / account'" @@ -81,7 +80,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { }) it(`with invalid bip44 throws"`, async () => { await expect( - testLocallyWithWeb3Node(NewAccount, ['--derivationPath', 'm/44/1/1/2/10'], web3) + testLocallyWithWeb3Node(NewAccount, ['--derivationPath', 'm/44/1/1/2/10'], client) ).rejects.toThrowErrorMatchingInlineSnapshot(` "Parsing --derivationPath Invalid derivationPath: m/44/1/1/2/10. should be in format "m / 44' / coin_type' / account'" @@ -90,7 +89,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { }) it('with bip44 with changeIndex 4 throws', async () => { await expect( - testLocallyWithWeb3Node(NewAccount, ['--derivationPath', "m/44'/52752'/0/0'"], web3) + testLocallyWithWeb3Node(NewAccount, ['--derivationPath', "m/44'/52752'/0/0'"], client) ).rejects.toThrowErrorMatchingInlineSnapshot(` "Parsing --derivationPath Invalid derivationPath: m/44'/52752'/0/0'. should be in format "m / 44' / coin_type' / account'" @@ -99,7 +98,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { }) it('with bip44 including changeIndex 4 and addressIndex 5 throws', async () => { await expect( - testLocallyWithWeb3Node(NewAccount, ['--derivationPath', "m/44'/52752'/0/0/0'"], web3) + testLocallyWithWeb3Node(NewAccount, ['--derivationPath', "m/44'/52752'/0/0/0'"], client) ).rejects.toThrowErrorMatchingInlineSnapshot(` "Parsing --derivationPath Invalid derivationPath: m/44'/52752'/0/0/0'. should be in format "m / 44' / coin_type' / account'" @@ -107,7 +106,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { `) }) it(`with path ending in "/" removes the slash`, async () => { - await testLocallyWithWeb3Node(NewAccount, ['--derivationPath', "m/44'/60'/0'/"], web3) + await testLocallyWithWeb3Node(NewAccount, ['--derivationPath', "m/44'/60'/0'/"], client) expect(deRandomize(consoleMock.mock.lastCall?.[0])).toMatchInlineSnapshot(` "mnemonic: *** *** @@ -133,7 +132,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { }) it('generates using eth derivation path', async () => { - await testLocallyWithWeb3Node(NewAccount, [`--mnemonicPath`, MNEMONIC_PATH], web3) + await testLocallyWithWeb3Node(NewAccount, [`--mnemonicPath`, MNEMONIC_PATH], client) expect(stripAnsiCodesAndTxHashes(consoleMock.mock.lastCall?.[0])).toMatchInlineSnapshot(` "mnemonic: hamster label near volume denial spawn stable orbit trade only crawl learn forest fire test feel bubble found angle also olympic obscure fork venue @@ -148,7 +147,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { await testLocallyWithWeb3Node( NewAccount, ['--derivationPath', 'celoLegacy', `--mnemonicPath`, MNEMONIC_PATH], - web3 + client ) expect(stripAnsiCodesAndTxHashes(consoleMock.mock.lastCall?.[0])).toMatchInlineSnapshot(` @@ -164,7 +163,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { await testLocallyWithWeb3Node( NewAccount, [`--mnemonicPath`, MNEMONIC_PATH, '--derivationPath', "m/44'/60'/0'"], - web3 + client ) expect(stripAnsiCodesAndTxHashes(consoleMock.mock.lastCall?.[0])).toMatchInlineSnapshot(` @@ -179,7 +178,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { await testLocallyWithWeb3Node( NewAccount, [`--mnemonicPath`, MNEMONIC_PATH, '--derivationPath', 'eth', '--changeIndex', '2'], - web3 + client ) expect(stripAnsiCodesAndTxHashes(consoleMock.mock.lastCall?.[0])).toMatchInlineSnapshot(` @@ -194,7 +193,7 @@ testWithAnvilL2('account:new cmd', (web3: Web3) => { await testLocallyWithWeb3Node( NewAccount, [`--mnemonicPath`, MNEMONIC_PATH, '--derivationPath', 'eth', '--addressIndex', '3'], - web3 + client ) expect(stripAnsiCodesAndTxHashes(consoleMock.mock.lastCall?.[0])).toMatchInlineSnapshot(` diff --git a/packages/cli/src/commands/account/register.test.ts b/packages/cli/src/commands/account/register.test.ts index e97c78c0b..7cd76bd67 100644 --- a/packages/cli/src/commands/account/register.test.ts +++ b/packages/cli/src/commands/account/register.test.ts @@ -1,29 +1,28 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from './register' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('account:register cmd', (web3: Web3) => { +testWithAnvilL2('account:register cmd', (client) => { test('can register account', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() await testLocallyWithWeb3Node( Register, ['--from', accounts[0], '--name', 'Chapulin Colorado'], - web3 + client ) - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const account = await kit.contracts.getAccounts() expect(await account.getName(accounts[0])).toMatchInlineSnapshot(`"Chapulin Colorado"`) }) test('fails if from is missing', async () => { - await expect(testLocallyWithWeb3Node(Register, [], web3)).rejects.toThrow( + await expect(testLocallyWithWeb3Node(Register, [], client)).rejects.toThrow( 'Missing required flag' ) }) diff --git a/packages/cli/src/commands/account/set-name.test.ts b/packages/cli/src/commands/account/set-name.test.ts index b0e01bc5a..c002b3366 100644 --- a/packages/cli/src/commands/account/set-name.test.ts +++ b/packages/cli/src/commands/account/set-name.test.ts @@ -1,37 +1,36 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' import SetName from './set-name' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('account:set-name cmd', (web3: Web3) => { +testWithAnvilL2('account:set-name cmd', (client) => { test('can set the name of an account', async () => { - const accounts = await web3.eth.getAccounts() - await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], web3) - await testLocallyWithWeb3Node(SetName, ['--account', accounts[0], '--name', 'TestName'], web3) + const accounts = await client.eth.getAccounts() + await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], client) + await testLocallyWithWeb3Node(SetName, ['--account', accounts[0], '--name', 'TestName'], client) }) test('fails if account is not registered', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() await expect( - testLocallyWithWeb3Node(SetName, ['--account', accounts[0], '--name', 'TestName'], web3) + testLocallyWithWeb3Node(SetName, ['--account', accounts[0], '--name', 'TestName'], client) ).rejects.toThrow("Some checks didn't pass!") }) test('fails if account is not provided', async () => { - await expect(testLocallyWithWeb3Node(SetName, ['--name', 'TestName'], web3)).rejects.toThrow( + await expect(testLocallyWithWeb3Node(SetName, ['--name', 'TestName'], client)).rejects.toThrow( 'Missing required flag' ) }) test('fails if name is not provided', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() await expect( - testLocallyWithWeb3Node(SetName, ['--account', accounts[0]], web3) + testLocallyWithWeb3Node(SetName, ['--account', accounts[0]], client) ).rejects.toThrow('Missing required flag') }) }) diff --git a/packages/cli/src/commands/election/activate.test.ts b/packages/cli/src/commands/election/activate.test.ts index 124643235..54411ad60 100644 --- a/packages/cli/src/commands/election/activate.test.ts +++ b/packages/cli/src/commands/election/activate.test.ts @@ -1,10 +1,10 @@ +import { Web3 } from '@celo/connect' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { setBalance, testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' import BigNumber from 'bignumber.js' import { generatePrivateKey, privateKeyToAccount, toAccount } from 'viem/accounts' import { celo } from 'viem/chains' -import Web3 from 'web3' import { MIN_LOCKED_CELO_VALUE, registerAccount, @@ -37,11 +37,11 @@ process.env.NO_SYNCCHECK = 'true' testWithAnvilL2( 'election:activate', - (web3: Web3) => { + (client) => { beforeEach(async () => { // need to set multical deployment on the address it was found on alfajores // since this test impersonates the old alfajores chain id. Even though it runs on anvil - await deployMultiCall(web3, '0xcA11bde05977b3631167028862bE2a173976CA11') + await deployMultiCall(client, '0xcA11bde05977b3631167028862bE2a173976CA11') }) const timers: ReturnType[] = [] @@ -54,19 +54,19 @@ testWithAnvilL2( }) it('fails when no flags are provided', async () => { - await expect(testLocallyWithWeb3Node(ElectionActivate, [], web3)).rejects.toThrow( + await expect(testLocallyWithWeb3Node(ElectionActivate, [], client)).rejects.toThrow( 'Missing required flag from' ) }) it('shows no pending votes', async () => { - const kit = newKitFromWeb3(web3) - const [userAddress] = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const [userAddress] = await client.eth.getAccounts() const writeMock = jest.spyOn(ux.write, 'stdout') await registerAccount(kit, userAddress) - await testLocallyWithWeb3Node(ElectionActivate, ['--from', userAddress], web3) + await testLocallyWithWeb3Node(ElectionActivate, ['--from', userAddress], client) expect(writeMock.mock.calls).toMatchInlineSnapshot(` [ @@ -79,8 +79,8 @@ testWithAnvilL2( }) it('shows no activatable votes yet', async () => { - const kit = newKitFromWeb3(web3) - const [groupAddress, validatorAddress, userAddress] = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const [groupAddress, validatorAddress, userAddress] = await client.eth.getAccounts() const writeMock = jest.spyOn(ux.write, 'stdout') @@ -88,7 +88,7 @@ testWithAnvilL2( await registerAccountWithLockedGold(kit, userAddress) await voteForGroupFrom(kit, userAddress, groupAddress, new BigNumber(10)) - await testLocallyWithWeb3Node(ElectionActivate, ['--from', userAddress], web3) + await testLocallyWithWeb3Node(ElectionActivate, ['--from', userAddress], client) expect(writeMock.mock.calls).toMatchInlineSnapshot(` [ @@ -101,8 +101,8 @@ testWithAnvilL2( }) it('activate votes', async () => { - const kit = newKitFromWeb3(web3) - const [groupAddress, validatorAddress, userAddress] = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const [groupAddress, validatorAddress, userAddress] = await client.eth.getAccounts() const election = await kit.contracts.getElection() const writeMock = jest.spyOn(ux.write, 'stdout') const activateAmount = 12345 @@ -115,9 +115,9 @@ testWithAnvilL2( expect((await election.getVotesForGroupByAccount(userAddress, groupAddress)).active).toEqual( new BigNumber(0) ) - await timeTravelAndSwitchEpoch(kit, web3, userAddress) + await timeTravelAndSwitchEpoch(kit, client, userAddress) await expect(election.hasActivatablePendingVotes(userAddress)).resolves.toBe(true) - await testLocallyWithWeb3Node(ElectionActivate, ['--from', userAddress], web3) + await testLocallyWithWeb3Node(ElectionActivate, ['--from', userAddress], client) expect(writeMock.mock.calls).toMatchInlineSnapshot(`[]`) expect((await election.getVotesForGroupByAccount(userAddress, groupAddress)).active).toEqual( @@ -128,9 +128,9 @@ testWithAnvilL2( it( 'activate votes with --wait flag', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const [groupAddress, validatorAddress, userAddress, otherUserAddress] = - await web3.eth.getAccounts() + await client.eth.getAccounts() const election = await kit.contracts.getElection() const writeMock = jest.spyOn(ux.write, 'stdout') const activateAmount = 12345 @@ -145,12 +145,12 @@ testWithAnvilL2( ).toEqual(new BigNumber(0)) await Promise.all([ - testLocallyWithWeb3Node(ElectionActivate, ['--from', userAddress, '--wait'], web3), + testLocallyWithWeb3Node(ElectionActivate, ['--from', userAddress, '--wait'], client), new Promise((resolve) => { // at least the amount the --wait flag waits in the check const timer = setTimeout(async () => { // switch with a different account - await timeTravelAndSwitchEpoch(kit, web3, otherUserAddress) + await timeTravelAndSwitchEpoch(kit, client, otherUserAddress) resolve() }, 1000) timers.push(timer) @@ -199,9 +199,9 @@ testWithAnvilL2( ) it('activate votes for other address', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const [groupAddress, validatorAddress, userAddress, otherUserAddress] = - await web3.eth.getAccounts() + await client.eth.getAccounts() const election = await kit.contracts.getElection() const writeMock = jest.spyOn(ux.write, 'stdout') const activateAmount = 54321 @@ -218,12 +218,12 @@ testWithAnvilL2( (await election.getVotesForGroupByAccount(otherUserAddress, groupAddress)).active ).toEqual(new BigNumber(0)) - await timeTravelAndSwitchEpoch(kit, web3, userAddress) + await timeTravelAndSwitchEpoch(kit, client, userAddress) await expect(election.hasActivatablePendingVotes(userAddress)).resolves.toBe(true) await testLocallyWithWeb3Node( ElectionActivate, ['--from', otherUserAddress, '--for', userAddress], - web3 + client ) expect(writeMock.mock.calls).toMatchInlineSnapshot(`[]`) @@ -238,7 +238,7 @@ testWithAnvilL2( it('activate votes for other address with --wait flag', async () => { const privKey = generatePrivateKey() const newAccount = privateKeyToAccount(privKey) - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const [ groupAddress, @@ -247,7 +247,7 @@ testWithAnvilL2( yetAnotherAddress, secondGroupAddress, secondValidatorAddress, - ] = await web3.eth.getAccounts() + ] = await client.eth.getAccounts() const election = await kit.contracts.getElection() const writeMock = jest.spyOn(ux.write, 'stdout') @@ -255,7 +255,7 @@ testWithAnvilL2( const activateAmountGroupTwo = 12345 const logMock = jest.spyOn(console, 'log') - await setBalance(web3, newAccount.address, MIN_LOCKED_CELO_VALUE) + await setBalance(client, newAccount.address, MIN_LOCKED_CELO_VALUE) await setupGroupAndAffiliateValidator(kit, groupAddress, validatorAddress) await setupGroupAndAffiliateValidator(kit, secondGroupAddress, secondValidatorAddress) await registerAccountWithLockedGold(kit, userAddress) @@ -279,13 +279,13 @@ testWithAnvilL2( testLocallyWithWeb3Node( ElectionActivate, ['--from', newAccount.address, '--for', userAddress, '--wait', '-k', privKey], - web3 + client ), new Promise((resolve) => { // at least the amount the --wait flag waits in the check const timer = setTimeout(async () => { // switch with a different account - await timeTravelAndSwitchEpoch(kit, web3, yetAnotherAddress) + await timeTravelAndSwitchEpoch(kit, client, yetAnotherAddress) resolve() }, 1000) timers.push(timer) @@ -349,7 +349,7 @@ testWithAnvilL2( let signTransactionSpy: jest.Mock beforeEach(async () => { signTransactionSpy = jest.fn().mockResolvedValue('0xtxhash') - const [userAddress] = await web3.eth.getAccounts() + const [userAddress] = await client.eth.getAccounts() jest.spyOn(ViemLedger, 'ledgerToWalletClient').mockImplementation(async () => { const accounts = [ @@ -360,7 +360,7 @@ testWithAnvilL2( signMessage: jest.fn(), signTypedData: jest.fn(), }), - publicKey: (await addressToPublicKey(userAddress, web3.eth.sign)) as Hex, + publicKey: (await addressToPublicKey(userAddress, client.eth.sign)) as Hex, source: 'ledger' as const, }, ] @@ -368,7 +368,7 @@ testWithAnvilL2( return { ...createWalletClient({ chain: celo, - transport: http(extractHostFromWeb3(web3)), + transport: http(extractHostFromWeb3(client)), account: accounts[0], }), getAddresses: async () => accounts.map((account) => account.address), @@ -378,15 +378,15 @@ testWithAnvilL2( }) it('send the transactions to ledger for signing', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const activateAmount = 1234 - const [userAddress, groupAddress, validatorAddress] = await web3.eth.getAccounts() + const [userAddress, groupAddress, validatorAddress] = await client.eth.getAccounts() await setupGroupAndAffiliateValidator(kit, groupAddress, validatorAddress) await registerAccountWithLockedGold(kit, userAddress) await voteForGroupFrom(kit, userAddress, groupAddress, new BigNumber(activateAmount)) - await timeTravelAndSwitchEpoch(kit, web3, userAddress) + await timeTravelAndSwitchEpoch(kit, client, userAddress) jest.spyOn(console, 'log') const writeMock = jest.spyOn(ux.write, 'stdout') @@ -407,7 +407,7 @@ testWithAnvilL2( await testLocallyWithWeb3Node( ElectionActivate, ['--from', userAddress, '--useLedger'], - web3 + client ) expect(ViemLedger.ledgerToWalletClient).toHaveBeenCalledWith( expect.objectContaining({ @@ -441,10 +441,10 @@ testWithAnvilL2( }, { chainId: 42220 } ) -async function timeTravelAndSwitchEpoch(kit: ContractKit, web3: Web3, userAddress: string) { +async function timeTravelAndSwitchEpoch(kit: ContractKit, client: Web3, userAddress: string) { const epochManagerWrapper = await kit.contracts.getEpochManager() const epochDuration = await epochManagerWrapper.epochDuration() - await timeTravel(epochDuration + 60, web3) - await testLocallyWithWeb3Node(Switch, ['--from', userAddress], web3) - await timeTravel(60, web3) + await timeTravel(epochDuration + 60, client) + await testLocallyWithWeb3Node(Switch, ['--from', userAddress], client) + await timeTravel(60, client) } diff --git a/packages/cli/src/commands/election/current.test.ts b/packages/cli/src/commands/election/current.test.ts index 127ee713c..188812de7 100644 --- a/packages/cli/src/commands/election/current.test.ts +++ b/packages/cli/src/commands/election/current.test.ts @@ -2,7 +2,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { impersonateAccount, testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' import { Address } from 'viem' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Current from './current' @@ -13,7 +12,7 @@ afterEach(async () => { jest.restoreAllMocks() }) -testWithAnvilL2('election:current cmd', async (web3: Web3) => { +testWithAnvilL2('election:current cmd', async (client) => { let logMock: ReturnType let warnMock: ReturnType let writeMock: ReturnType @@ -23,7 +22,7 @@ testWithAnvilL2('election:current cmd', async (web3: Web3) => { writeMock = jest.spyOn(ux.write, 'stdout') }) it('shows list with no --valset provided', async () => { - await testLocallyWithWeb3Node(Current, ['--csv'], web3) + await testLocallyWithWeb3Node(Current, ['--csv'], client) expect(writeMock.mock.calls).toMatchInlineSnapshot(` [ @@ -62,7 +61,7 @@ testWithAnvilL2('election:current cmd', async (web3: Web3) => { }) it('shows list with --valset provided', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const epochManager = await kit.contracts.getEpochManager() const accountsContract = await kit.contracts.getAccounts() @@ -75,9 +74,9 @@ testWithAnvilL2('election:current cmd', async (web3: Web3) => { ) // Set the names - await impersonateAccount(web3, validator1) + await impersonateAccount(client, validator1) await accountsContract.setName('Validator #1').sendAndWaitForReceipt({ from: validator1 }) - await impersonateAccount(web3, validator2) + await impersonateAccount(client, validator2) await accountsContract.setName('Validator #2').sendAndWaitForReceipt({ from: validator2 }) // // change the signer @@ -95,7 +94,7 @@ testWithAnvilL2('election:current cmd', async (web3: Web3) => { // The actual test - await testLocallyWithWeb3Node(Current, ['--csv', '--valset'], web3) + await testLocallyWithWeb3Node(Current, ['--csv', '--valset'], client) expect(writeMock.mock.calls).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/election/list.test.ts b/packages/cli/src/commands/election/list.test.ts index 036ab3411..69c7a1879 100644 --- a/packages/cli/src/commands/election/list.test.ts +++ b/packages/cli/src/commands/election/list.test.ts @@ -2,13 +2,12 @@ import { ElectionWrapper, ValidatorGroupVote } from '@celo/contractkit/lib/wrapp import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import ElectionList from './list' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('election:list cmd', (web3: Web3) => { +testWithAnvilL2('election:list cmd', (client) => { test('shows list when no arguments provided', async () => { const getValidatorGroupsVotesMock = jest.spyOn( ElectionWrapper.prototype, @@ -35,7 +34,7 @@ testWithAnvilL2('election:list cmd', (web3: Web3) => { const writeMock = jest.spyOn(ux.write, 'stdout') - await testLocallyWithWeb3Node(ElectionList, ['--csv'], web3) + await testLocallyWithWeb3Node(ElectionList, ['--csv'], client) expect(getValidatorGroupsVotesMock).toHaveBeenCalled() expect(writeMock.mock.calls).toMatchInlineSnapshot(` diff --git a/packages/cli/src/commands/election/revoke.test.ts b/packages/cli/src/commands/election/revoke.test.ts index 9ef8458cd..b8f65de71 100644 --- a/packages/cli/src/commands/election/revoke.test.ts +++ b/packages/cli/src/commands/election/revoke.test.ts @@ -1,7 +1,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { registerAccount, registerAccountWithLockedGold, @@ -13,24 +12,26 @@ import Revoke from './revoke' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('election:revoke', (web3: Web3) => { +testWithAnvilL2('election:revoke', (client) => { afterEach(async () => { jest.clearAllMocks() }) it('fails when no flags are provided', async () => { - await expect(testLocallyWithWeb3Node(Revoke, [], web3)).rejects.toThrow('Missing required flag') + await expect(testLocallyWithWeb3Node(Revoke, [], client)).rejects.toThrow( + 'Missing required flag' + ) }) it('fails when address is not an account', async () => { const logMock = jest.spyOn(console, 'log') - const [fromAddress, groupAddress] = await web3.eth.getAccounts() + const [fromAddress, groupAddress] = await client.eth.getAccounts() await expect( testLocallyWithWeb3Node( Revoke, ['--from', fromAddress, '--for', groupAddress, '--value', '1'], - web3 + client ) ).rejects.toMatchInlineSnapshot(`[Error: Some checks didn't pass!]`) expect(logMock.mock.calls[1][0]).toContain( @@ -39,8 +40,8 @@ testWithAnvilL2('election:revoke', (web3: Web3) => { }) it('fails when trying to revoke more votes than voted', async () => { - const kit = newKitFromWeb3(web3) - const [fromAddress, groupAddress] = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const [fromAddress, groupAddress] = await client.eth.getAccounts() await registerAccount(kit, fromAddress) @@ -48,7 +49,7 @@ testWithAnvilL2('election:revoke', (web3: Web3) => { testLocallyWithWeb3Node( Revoke, ['--from', fromAddress, '--for', groupAddress, '--value', '1'], - web3 + client ) ).rejects.toThrow( `can't revoke more votes for ${groupAddress} than have been made by ${fromAddress}` @@ -56,10 +57,10 @@ testWithAnvilL2('election:revoke', (web3: Web3) => { }) it('successfuly revokes all votes', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const election = await kit.contracts.getElection() const amount = new BigNumber(12345) - const [fromAddress, validatorAddress, groupAddress] = await web3.eth.getAccounts() + const [fromAddress, validatorAddress, groupAddress] = await client.eth.getAccounts() await registerAccountWithLockedGold(kit, fromAddress) await setupGroupAndAffiliateValidator(kit, groupAddress, validatorAddress) @@ -72,7 +73,7 @@ testWithAnvilL2('election:revoke', (web3: Web3) => { await testLocallyWithWeb3Node( Revoke, ['--from', fromAddress, '--for', groupAddress, '--value', amount.toFixed()], - web3 + client ) expect((await election.getVotesForGroupByAccount(fromAddress, groupAddress)).active).toEqual( @@ -81,11 +82,11 @@ testWithAnvilL2('election:revoke', (web3: Web3) => { }) it('successfuly revokes votes partially', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const election = await kit.contracts.getElection() const amount = new BigNumber(54321) const revokeAmount = new BigNumber(4321) - const [fromAddress, validatorAddress, groupAddress] = await web3.eth.getAccounts() + const [fromAddress, validatorAddress, groupAddress] = await client.eth.getAccounts() await registerAccountWithLockedGold(kit, fromAddress) await setupGroupAndAffiliateValidator(kit, groupAddress, validatorAddress) @@ -98,7 +99,7 @@ testWithAnvilL2('election:revoke', (web3: Web3) => { await testLocallyWithWeb3Node( Revoke, ['--from', fromAddress, '--for', groupAddress, '--value', revokeAmount.toFixed()], - web3 + client ) expect((await election.getVotesForGroupByAccount(fromAddress, groupAddress)).active).toEqual( diff --git a/packages/cli/src/commands/election/run.test.ts b/packages/cli/src/commands/election/run.test.ts index 144d49d84..cdbec20ea 100644 --- a/packages/cli/src/commands/election/run.test.ts +++ b/packages/cli/src/commands/election/run.test.ts @@ -1,12 +1,11 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' -import Web3 from 'web3' import { stripAnsiCodesAndTxHashes, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Run from './run' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('election:run', (web3: Web3) => { +testWithAnvilL2('election:run', (client) => { afterEach(async () => { jest.clearAllMocks() }) @@ -17,7 +16,7 @@ testWithAnvilL2('election:run', (web3: Web3) => { const warnMock = jest.spyOn(console, 'warn') const writeMock = jest.spyOn(ux.write, 'stdout') - await testLocallyWithWeb3Node(Run, ['--csv'], web3) + await testLocallyWithWeb3Node(Run, ['--csv'], client) expect(writeMock.mock.calls).toMatchInlineSnapshot(` [ @@ -46,7 +45,7 @@ testWithAnvilL2('election:run', (web3: Web3) => { const warnMock = jest.spyOn(console, 'warn') const writeMock = jest.spyOn(ux.write, 'stdout') - await testLocallyWithWeb3Node(Run, ['--csv'], web3) + await testLocallyWithWeb3Node(Run, ['--csv'], client) expect(writeMock.mock.calls).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/election/show.test.ts b/packages/cli/src/commands/election/show.test.ts index 302ac75f3..1849ec501 100644 --- a/packages/cli/src/commands/election/show.test.ts +++ b/packages/cli/src/commands/election/show.test.ts @@ -2,7 +2,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { timeTravel } from '@celo/dev-utils/ganache-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { EXTRA_LONG_TIMEOUT_MS, stripAnsiCodesAndTxHashes, @@ -21,25 +20,25 @@ process.env.NO_SYNCCHECK = 'true' testWithAnvilL2( 'election:show', - (web3: Web3) => { + (client) => { beforeEach(async () => { // need to set multical deployment on the address it was found on alfajores // since this test impersonates the old alfajores chain id - await deployMultiCall(web3, '0xcA11bde05977b3631167028862bE2a173976CA11') + await deployMultiCall(client, '0xcA11bde05977b3631167028862bE2a173976CA11') const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) - const [voterAddress] = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const [voterAddress] = await client.eth.getAccounts() const validatorsWrapper = await kit.contracts.getValidators() const epochManagerWrapper = await kit.contracts.getEpochManager() const epochDuration = new BigNumber(await epochManagerWrapper.epochDuration()) const [group1, group2] = await validatorsWrapper.getRegisteredValidatorGroups() - await testLocallyWithWeb3Node(Register, ['--from', voterAddress], web3) + await testLocallyWithWeb3Node(Register, ['--from', voterAddress], client) await testLocallyWithWeb3Node( Lock, - ['--value', web3.utils.toWei('10', 'ether'), '--from', voterAddress], - web3 + ['--value', client.utils.toWei('10', 'ether'), '--from', voterAddress], + client ) await testLocallyWithWeb3Node( ElectionVote, @@ -49,13 +48,13 @@ testWithAnvilL2( '--for', group1.address, '--value', - web3.utils.toWei('1', 'ether'), + client.utils.toWei('1', 'ether'), ], - web3 + client ) - await timeTravel(epochDuration.plus(1).toNumber(), web3) - await testLocallyWithWeb3Node(Switch, ['--from', voterAddress], web3) - await testLocallyWithWeb3Node(ElectionActivate, ['--from', voterAddress], web3) + await timeTravel(epochDuration.plus(1).toNumber(), client) + await testLocallyWithWeb3Node(Switch, ['--from', voterAddress], client) + await testLocallyWithWeb3Node(ElectionActivate, ['--from', voterAddress], client) await testLocallyWithWeb3Node( ElectionVote, [ @@ -64,9 +63,9 @@ testWithAnvilL2( '--for', group2.address, '--value', - web3.utils.toWei('9', 'ether'), + client.utils.toWei('9', 'ether'), ], - web3 + client ) logMock.mockClear() @@ -77,25 +76,25 @@ testWithAnvilL2( }) it('fails when no args are provided', async () => { - await expect(testLocallyWithWeb3Node(Show, [], web3)).rejects.toThrow( + await expect(testLocallyWithWeb3Node(Show, [], client)).rejects.toThrow( "Voter or Validator Groups's address" ) }) it('fails when no flags are provided', async () => { - const [groupAddress] = await web3.eth.getAccounts() - await expect(testLocallyWithWeb3Node(Show, [groupAddress], web3)).rejects.toThrow( + const [groupAddress] = await client.eth.getAccounts() + await expect(testLocallyWithWeb3Node(Show, [groupAddress], client)).rejects.toThrow( 'Must select --voter or --group' ) }) it('fails when provided address is not a group', async () => { const logMock = jest.spyOn(console, 'log') - const [groupAddress] = await web3.eth.getAccounts() + const [groupAddress] = await client.eth.getAccounts() - await expect(testLocallyWithWeb3Node(Show, [groupAddress, '--group'], web3)).rejects.toThrow( - "Some checks didn't pass!" - ) + await expect( + testLocallyWithWeb3Node(Show, [groupAddress, '--group'], client) + ).rejects.toThrow("Some checks didn't pass!") expect(stripAnsiCodesAndTxHashes(logMock.mock.calls[1][0])).toContain( `✘ ${groupAddress} is ValidatorGroup` ) @@ -103,10 +102,10 @@ testWithAnvilL2( it('fails when provided address is not a voter', async () => { const logMock = jest.spyOn(console, 'log') - const [_, nonVoterAddress] = await web3.eth.getAccounts() + const [_, nonVoterAddress] = await client.eth.getAccounts() await expect( - testLocallyWithWeb3Node(Show, [nonVoterAddress, '--voter'], web3) + testLocallyWithWeb3Node(Show, [nonVoterAddress, '--voter'], client) ).rejects.toThrow("Some checks didn't pass!") expect(stripAnsiCodesAndTxHashes(logMock.mock.calls[1][0])).toContain( `${nonVoterAddress} is not registered as an account. Try running account:register` @@ -114,13 +113,13 @@ testWithAnvilL2( }) it('shows data for a group', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const logMock = jest.spyOn(console, 'log').mockClear() const validatorsWrapper = await kit.contracts.getValidators() const [_, group] = await validatorsWrapper.getRegisteredValidatorGroups() await expect( - testLocallyWithWeb3Node(Show, [group.address, '--group'], web3) + testLocallyWithWeb3Node(Show, [group.address, '--group'], client) ).resolves.toBeUndefined() const logs = stripAnsiCodesFromNestedArray(logMock.mock.calls) expect(logs[0]).toContain('Running Checks:') @@ -135,9 +134,9 @@ testWithAnvilL2( it('shows data for an account', async () => { const logMock = jest.spyOn(console, 'log') - const [voterAddress] = await web3.eth.getAccounts() + const [voterAddress] = await client.eth.getAccounts() - await testLocallyWithWeb3Node(Show, [voterAddress, '--voter'], web3) + await testLocallyWithWeb3Node(Show, [voterAddress, '--voter'], client) expect( logMock.mock.calls.map((args) => args.map(stripAnsiCodesAndTxHashes)) diff --git a/packages/cli/src/commands/election/vote.test.ts b/packages/cli/src/commands/election/vote.test.ts index 43e33e316..a2b48a0c1 100644 --- a/packages/cli/src/commands/election/vote.test.ts +++ b/packages/cli/src/commands/election/vote.test.ts @@ -2,7 +2,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { registerAccount, registerAccountWithLockedGold, @@ -13,24 +12,24 @@ import Vote from './vote' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('election:vote', (web3: Web3) => { +testWithAnvilL2('election:vote', (client) => { afterEach(async () => { jest.clearAllMocks() }) it('fails when no flags are provided', async () => { - await expect(testLocallyWithWeb3Node(Vote, [], web3)).rejects.toThrow('Missing required flag') + await expect(testLocallyWithWeb3Node(Vote, [], client)).rejects.toThrow('Missing required flag') }) it('fails when voter is not an account', async () => { const logMock = jest.spyOn(console, 'log') - const [fromAddress, groupAddress] = await web3.eth.getAccounts() + const [fromAddress, groupAddress] = await client.eth.getAccounts() await expect( testLocallyWithWeb3Node( Vote, ['--from', fromAddress, '--for', groupAddress, '--value', '1'], - web3 + client ) ).rejects.toThrow() @@ -40,9 +39,9 @@ testWithAnvilL2('election:vote', (web3: Web3) => { }) it('fails when "for" is not a validator group', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const logMock = jest.spyOn(console, 'log') - const [fromAddress, groupAddress] = await web3.eth.getAccounts() + const [fromAddress, groupAddress] = await client.eth.getAccounts() await registerAccount(kit, fromAddress) @@ -50,7 +49,7 @@ testWithAnvilL2('election:vote', (web3: Web3) => { testLocallyWithWeb3Node( Vote, ['--from', fromAddress, '--for', groupAddress, '--value', '1'], - web3 + client ) ).rejects.toThrow() @@ -60,9 +59,9 @@ testWithAnvilL2('election:vote', (web3: Web3) => { }) it('fails when value is too high', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const logMock = jest.spyOn(console, 'log') - const [fromAddress, groupAddress, validatorAddress] = await web3.eth.getAccounts() + const [fromAddress, groupAddress, validatorAddress] = await client.eth.getAccounts() await registerAccount(kit, fromAddress) await setupGroupAndAffiliateValidator(kit, groupAddress, validatorAddress) @@ -71,7 +70,7 @@ testWithAnvilL2('election:vote', (web3: Web3) => { testLocallyWithWeb3Node( Vote, ['--from', fromAddress, '--for', groupAddress, '--value', '1'], - web3 + client ) ).rejects.toThrow() @@ -81,10 +80,10 @@ testWithAnvilL2('election:vote', (web3: Web3) => { }) it('successfuly votes for a group', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const logMock = jest.spyOn(console, 'log') const writeMock = jest.spyOn(ux.write, 'stdout') - const [fromAddress, groupAddress, validatorAddress] = await web3.eth.getAccounts() + const [fromAddress, groupAddress, validatorAddress] = await client.eth.getAccounts() const amount = new BigNumber(12345) const election = await kit.contracts.getElection() @@ -99,7 +98,7 @@ testWithAnvilL2('election:vote', (web3: Web3) => { testLocallyWithWeb3Node( Vote, ['--from', fromAddress, '--for', groupAddress, '--value', amount.toFixed()], - web3 + client ) ).resolves.not.toThrow() diff --git a/packages/cli/src/commands/epochs/finish.test.ts b/packages/cli/src/commands/epochs/finish.test.ts index 875b9c324..c2d5f5f45 100644 --- a/packages/cli/src/commands/epochs/finish.test.ts +++ b/packages/cli/src/commands/epochs/finish.test.ts @@ -8,10 +8,10 @@ import Start from './start' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('epochs:finish cmd', (web3) => { +testWithAnvilL2('epochs:finish cmd', (client) => { it('Warns when epoch process is not yet started', async () => { const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const accounts = await kit.web3.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() expect( @@ -20,7 +20,7 @@ testWithAnvilL2('epochs:finish cmd', (web3) => { expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) await expect( - testLocallyWithWeb3Node(Finish, ['--from', accounts[0]], web3) + testLocallyWithWeb3Node(Finish, ['--from', accounts[0]], client) ).resolves.toMatchInlineSnapshot(`"Epoch process is not started yet"`) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(`[]`) @@ -28,19 +28,19 @@ testWithAnvilL2('epochs:finish cmd', (web3) => { it('finishes epoch process successfully', async () => { const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const accounts = await kit.web3.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() const epochDuration = new BigNumber(await epochManagerWrapper.epochDuration()) - await timeTravel(epochDuration.plus(1).toNumber(), web3) + await timeTravel(epochDuration.plus(1).toNumber(), client) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) expect(await epochManagerWrapper.isTimeForNextEpoch()).toEqual(true) - await testLocallyWithWeb3Node(Start, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(Start, ['--from', accounts[0]], client) - await testLocallyWithWeb3Node(Finish, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(Finish, ['--from', accounts[0]], client) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(5) expect(await epochManagerWrapper.isTimeForNextEpoch()).toEqual(false) diff --git a/packages/cli/src/commands/epochs/process-groups.test.ts b/packages/cli/src/commands/epochs/process-groups.test.ts index 1c50dba0a..6515088f4 100644 --- a/packages/cli/src/commands/epochs/process-groups.test.ts +++ b/packages/cli/src/commands/epochs/process-groups.test.ts @@ -8,17 +8,17 @@ import Start from './start' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('epochs:process-groups cmd', (web3) => { +testWithAnvilL2('epochs:process-groups cmd', (client) => { it('Warns when epoch process is not yet started', async () => { const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const accounts = await kit.web3.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) await expect( - testLocallyWithWeb3Node(ProcessGroups, ['--from', accounts[0]], web3) + testLocallyWithWeb3Node(ProcessGroups, ['--from', accounts[0]], client) ).resolves.toMatchInlineSnapshot(`"Epoch process is not started yet"`) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) @@ -27,18 +27,18 @@ testWithAnvilL2('epochs:process-groups cmd', (web3) => { it('processes groups and finishes epoch process successfully when epoch process not started', async () => { const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const accounts = await kit.web3.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() const epochDuration = new BigNumber(await epochManagerWrapper.epochDuration()) - await timeTravel(epochDuration.plus(1).toNumber(), web3) + await timeTravel(epochDuration.plus(1).toNumber(), client) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) expect(await epochManagerWrapper.isTimeForNextEpoch()).toEqual(true) - await testLocallyWithWeb3Node(Start, ['--from', accounts[0]], web3) - await testLocallyWithWeb3Node(ProcessGroups, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(Start, ['--from', accounts[0]], client) + await testLocallyWithWeb3Node(ProcessGroups, ['--from', accounts[0]], client) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(5) expect(await epochManagerWrapper.isTimeForNextEpoch()).toEqual(false) @@ -68,13 +68,13 @@ testWithAnvilL2('epochs:process-groups cmd', (web3) => { it('processes groups and finishes epoch process successfully when a single group is processed individually', async () => { const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const [from] = await kit.web3.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() const validatorsWrapper = await kit.contracts.getValidators() const epochDuration = new BigNumber(await epochManagerWrapper.epochDuration()) - await timeTravel(epochDuration.plus(1).toNumber(), web3) + await timeTravel(epochDuration.plus(1).toNumber(), client) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) expect(await epochManagerWrapper.isTimeForNextEpoch()).toEqual(true) @@ -106,7 +106,7 @@ testWithAnvilL2('epochs:process-groups cmd', (web3) => { '0' ) - await testLocallyWithWeb3Node(ProcessGroups, ['--from', from], web3) + await testLocallyWithWeb3Node(ProcessGroups, ['--from', from], client) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(5) expect(await epochManagerWrapper.isTimeForNextEpoch()).toEqual(false) diff --git a/packages/cli/src/commands/epochs/send-validator-payment.test.ts b/packages/cli/src/commands/epochs/send-validator-payment.test.ts index fd4cf4a58..8963eb3b8 100644 --- a/packages/cli/src/commands/epochs/send-validator-payment.test.ts +++ b/packages/cli/src/commands/epochs/send-validator-payment.test.ts @@ -6,7 +6,7 @@ import SendValidatorPayment from './send-validator-payment' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('epochs:send-validator-payment cmd', (web3) => { +testWithAnvilL2('epochs:send-validator-payment cmd', (client) => { const logMock = jest.spyOn(console, 'log') const errorMock = jest.spyOn(console, 'error') @@ -14,12 +14,12 @@ testWithAnvilL2('epochs:send-validator-payment cmd', (web3) => { logMock.mockClear() errorMock.mockClear() - await activateAllValidatorGroupsVotes(newKitFromWeb3(web3)) + await activateAllValidatorGroupsVotes(newKitFromWeb3(client)) }) it('successfuly sends the payments', async () => { - const kit = newKitFromWeb3(web3) - const [sender] = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const [sender] = await client.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() const validatorsWrapper = await kit.contracts.getValidators() const electedValidators = await epochManagerWrapper.getElectedAccounts() @@ -31,7 +31,7 @@ testWithAnvilL2('epochs:send-validator-payment cmd', (web3) => { await testLocallyWithWeb3Node( SendValidatorPayment, ['--for', validatorAddress, '--from', sender], - web3 + client ) // TODO as the numbers are not deterministic, we can't assert the exact values, so it's tested separately @@ -66,13 +66,13 @@ testWithAnvilL2('epochs:send-validator-payment cmd', (web3) => { }) it('fails if not a validator', async () => { - const [nonValidatorAccount, sender] = await web3.eth.getAccounts() + const [nonValidatorAccount, sender] = await client.eth.getAccounts() await expect( testLocallyWithWeb3Node( SendValidatorPayment, ['--for', nonValidatorAccount, '--from', sender], - web3 + client ) ).rejects.toMatchInlineSnapshot(`[Error: Some checks didn't pass!]`) diff --git a/packages/cli/src/commands/epochs/start.test.ts b/packages/cli/src/commands/epochs/start.test.ts index 0bd3f2a7d..54837ddf1 100644 --- a/packages/cli/src/commands/epochs/start.test.ts +++ b/packages/cli/src/commands/epochs/start.test.ts @@ -7,16 +7,16 @@ import Start from './start' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('epochs:start cmd', (web3) => { +testWithAnvilL2('epochs:start cmd', (client) => { it('Warns only when next epoch is not due', async () => { const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const accounts = await kit.web3.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) await expect( - testLocallyWithWeb3Node(Start, ['--from', accounts[0]], web3) + testLocallyWithWeb3Node(Start, ['--from', accounts[0]], client) ).resolves.toMatchInlineSnapshot(`"It is not time for the next epoch yet"`) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(`[]`) @@ -24,17 +24,17 @@ testWithAnvilL2('epochs:start cmd', (web3) => { it('starts process successfully', async () => { const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const accounts = await kit.web3.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() const epochDuration = new BigNumber(await epochManagerWrapper.epochDuration()) - await timeTravel(epochDuration.plus(1).toNumber(), web3) + await timeTravel(epochDuration.plus(1).toNumber(), client) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) expect(await epochManagerWrapper.isTimeForNextEpoch()).toEqual(true) - await testLocallyWithWeb3Node(Start, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(Start, ['--from', accounts[0]], client) expect(await epochManagerWrapper.isOnEpochProcess()).toEqual(true) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` diff --git a/packages/cli/src/commands/epochs/status.test.ts b/packages/cli/src/commands/epochs/status.test.ts index 5991dc72b..dfa60c494 100644 --- a/packages/cli/src/commands/epochs/status.test.ts +++ b/packages/cli/src/commands/epochs/status.test.ts @@ -9,14 +9,14 @@ import Start from './start' import Status from './status' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('epochs:status cmd', (web3) => { +testWithAnvilL2('epochs:status cmd', (client) => { it('shows the current status of the epoch', async () => { const consoleMock = jest.spyOn(ux.write, 'stdout') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const epochManagerWrapper = await kit.contracts.getEpochManager() expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) - await expect(testLocallyWithWeb3Node(Status, ['--output', 'csv'], web3)).resolves.toBe(true) + await expect(testLocallyWithWeb3Node(Status, ['--output', 'csv'], client)).resolves.toBe(true) expect(consoleMock.mock.calls).toMatchInlineSnapshot(` [ @@ -57,16 +57,16 @@ testWithAnvilL2('epochs:status cmd', (web3) => { }) describe('when the epoch has is processing', () => { beforeEach(async () => { - const accounts = await web3.eth.getAccounts() - await testLocallyWithWeb3Node(Start, ['--from', accounts[0]], web3) + const accounts = await client.eth.getAccounts() + await testLocallyWithWeb3Node(Start, ['--from', accounts[0]], client) }) it('shows the current status of the epoch', async () => { const consoleMock = jest.spyOn(ux.write, 'stdout') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const epochManagerWrapper = await kit.contracts.getEpochManager() expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) - await expect(testLocallyWithWeb3Node(Status, ['--output', 'csv'], web3)).resolves.toBe(true) + await expect(testLocallyWithWeb3Node(Status, ['--output', 'csv'], client)).resolves.toBe(true) // Check that the output contains the expected structure and values, but be flexible about timing-dependent fields const calls = consoleMock.mock.calls @@ -113,7 +113,7 @@ testWithAnvilL2('epochs:status cmd', (web3) => { const consoleMock = jest.spyOn(ux.write, 'stdout') jest.spyOn(epochManager, 'getEpochManagerContract').mockResolvedValue(mockEpochManager as any) - await expect(testLocallyWithWeb3Node(Status, ['--output', 'csv'], web3)).resolves.toBe(true) + await expect(testLocallyWithWeb3Node(Status, ['--output', 'csv'], client)).resolves.toBe(true) expect(consoleMock.mock.calls).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/epochs/switch.test.ts b/packages/cli/src/commands/epochs/switch.test.ts index b513f23bd..2b87fee37 100644 --- a/packages/cli/src/commands/epochs/switch.test.ts +++ b/packages/cli/src/commands/epochs/switch.test.ts @@ -8,16 +8,16 @@ import Switch from './switch' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('epochs:switch cmd', (web3) => { +testWithAnvilL2('epochs:switch cmd', (client) => { it('Warns only when next epoch is not due when switching', async () => { const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const accounts = await kit.web3.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) await expect( - testLocallyWithWeb3Node(Switch, ['--from', accounts[0]], web3) + testLocallyWithWeb3Node(Switch, ['--from', accounts[0]], client) ).resolves.toMatchInlineSnapshot(`"It is not time for the next epoch yet"`) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(`[]`) @@ -25,17 +25,17 @@ testWithAnvilL2('epochs:switch cmd', (web3) => { it('switches epoch successfully', async () => { const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const accounts = await kit.web3.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() const epochDuration = new BigNumber(await epochManagerWrapper.epochDuration()) - await timeTravel(epochDuration.plus(1).toNumber(), web3) + await timeTravel(epochDuration.plus(1).toNumber(), client) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) expect(await epochManagerWrapper.isTimeForNextEpoch()).toEqual(true) - await testLocallyWithWeb3Node(Switch, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(Switch, ['--from', accounts[0]], client) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(5) expect(await epochManagerWrapper.isTimeForNextEpoch()).toEqual(false) @@ -59,18 +59,18 @@ testWithAnvilL2('epochs:switch cmd', (web3) => { it('switches epoch successfully which already has started process', async () => { const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const accounts = await kit.web3.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() const epochDuration = new BigNumber(await epochManagerWrapper.epochDuration()) - await timeTravel(epochDuration.plus(1).toNumber(), web3) + await timeTravel(epochDuration.plus(1).toNumber(), client) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(4) expect(await epochManagerWrapper.isTimeForNextEpoch()).toEqual(true) - await testLocallyWithWeb3Node(Start, ['--from', accounts[0]], web3) - await testLocallyWithWeb3Node(Switch, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(Start, ['--from', accounts[0]], client) + await testLocallyWithWeb3Node(Switch, ['--from', accounts[0]], client) expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(5) expect(await epochManagerWrapper.isTimeForNextEpoch()).toEqual(false) diff --git a/packages/cli/src/commands/governance/approve.test.ts b/packages/cli/src/commands/governance/approve.test.ts index 2e3bb2db9..49a558370 100644 --- a/packages/cli/src/commands/governance/approve.test.ts +++ b/packages/cli/src/commands/governance/approve.test.ts @@ -16,7 +16,6 @@ import Safe, { } from '@safe-global/protocol-kit' import BigNumber from 'bignumber.js' import fetch from 'cross-fetch' -import Web3 from 'web3' import { changeMultiSigOwner } from '../../test-utils/chain-setup' import { stripAnsiCodesAndTxHashes, @@ -34,13 +33,13 @@ process.env.NO_SYNCCHECK = 'true' testWithAnvilL2( 'governance:approve cmd', - (web3: Web3) => { + (client) => { const HOTFIX_HASH = '0xbf670baa773b342120e1af45433a465bbd6fa289a5cf72763d63d95e4e22482d' const HOTFIX_BUFFER = hexToBuffer(HOTFIX_HASH) beforeEach(async () => { // need to set multical deployment on the address it was found on alfajores // since this test impersonates the old alfajores chain id - await deployMultiCall(web3, '0xcA11bde05977b3631167028862bE2a173976CA11') + await deployMultiCall(client, '0xcA11bde05977b3631167028862bE2a173976CA11') jest.spyOn(console, 'log').mockImplementation(() => { // noop }) @@ -51,14 +50,14 @@ testWithAnvilL2( describe('hotfix', () => { it('fails when address is not security council multisig signatory', async () => { - const kit = newKitFromWeb3(web3) - const accounts = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const accounts = await client.eth.getAccounts() const governance = await kit.contracts.getGovernance() const writeMock = jest.spyOn(ux.write, 'stdout') const logMock = jest.spyOn(console, 'log') const multisig = await governance.getApproverMultisig() - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setApprover to 0x5409ED021D9299bf6814279A6A1411A7e866A631 to avoid "Council cannot be approver" error await ( await kit.sendTransaction({ @@ -93,7 +92,7 @@ testWithAnvilL2( '--type', 'securityCouncil', ], - web3 + client ) ).rejects.toThrow("Some checks didn't pass!") @@ -130,8 +129,8 @@ testWithAnvilL2( }) it('fails when address is not approver multisig signatory', async () => { - const kit = newKitFromWeb3(web3) - const accounts = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const accounts = await client.eth.getAccounts() const governance = await kit.contracts.getGovernance() const writeMock = jest.spyOn(ux.write, 'stdout') const logMock = jest.spyOn(console, 'log') @@ -140,7 +139,7 @@ testWithAnvilL2( testLocallyWithWeb3Node( Approve, ['--from', accounts[0], '--hotfix', HOTFIX_HASH, '--useMultiSig'], - web3 + client ) ).rejects.toThrow("Some checks didn't pass!") @@ -177,13 +176,13 @@ testWithAnvilL2( }) it('fails when address is not security council', async () => { - const [approver, securityCouncil, account] = await web3.eth.getAccounts() - const kit = newKitFromWeb3(web3) + const [approver, securityCouncil, account] = await client.eth.getAccounts() + const kit = newKitFromWeb3(client) const governance = await kit.contracts.getGovernance() const writeMock = jest.spyOn(ux.write, 'stdout') const logMock = jest.spyOn(console, 'log') - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setApprover to approver value await ( await kit.sendTransaction({ @@ -209,7 +208,7 @@ testWithAnvilL2( testLocallyWithWeb3Node( Approve, ['--from', account, '--hotfix', HOTFIX_HASH, '--type', 'securityCouncil'], - web3 + client ) ).rejects.toThrow("Some checks didn't pass!") @@ -243,13 +242,13 @@ testWithAnvilL2( }) it('fails when address is not approver', async () => { - const kit = newKitFromWeb3(web3) - const [approver, securityCouncil, account] = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const [approver, securityCouncil, account] = await client.eth.getAccounts() const governance = await kit.contracts.getGovernance() const writeMock = jest.spyOn(ux.write, 'stdout') const logMock = jest.spyOn(console, 'log') - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setApprover to approver value await ( await kit.sendTransaction({ @@ -272,7 +271,7 @@ testWithAnvilL2( }) await expect( - testLocallyWithWeb3Node(Approve, ['--from', account, '--hotfix', HOTFIX_HASH], web3) + testLocallyWithWeb3Node(Approve, ['--from', account, '--hotfix', HOTFIX_HASH], client) ).rejects.toThrow("Some checks didn't pass!") expect(await governance.getHotfixRecord(HOTFIX_BUFFER)).toMatchInlineSnapshot(` @@ -305,13 +304,13 @@ testWithAnvilL2( }) it('succeeds when address is a direct security council', async () => { - const [approver, securityCouncil] = await web3.eth.getAccounts() - const kit = newKitFromWeb3(web3) + const [approver, securityCouncil] = await client.eth.getAccounts() + const kit = newKitFromWeb3(client) const governance = await kit.contracts.getGovernance() const writeMock = jest.spyOn(ux.write, 'stdout') const logMock = jest.spyOn(console, 'log') - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setApprover to approver value await ( await kit.sendTransaction({ @@ -336,7 +335,7 @@ testWithAnvilL2( await testLocallyWithWeb3Node( Approve, ['--from', securityCouncil, '--hotfix', HOTFIX_HASH, '--type', 'securityCouncil'], - web3 + client ) expect(await governance.getHotfixRecord(HOTFIX_BUFFER)).toMatchInlineSnapshot(` @@ -385,13 +384,13 @@ testWithAnvilL2( }) it('succeeds when address is a direct approver', async () => { - const kit = newKitFromWeb3(web3) - const [approver, securityCouncil] = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const [approver, securityCouncil] = await client.eth.getAccounts() const governance = await kit.contracts.getGovernance() const writeMock = jest.spyOn(ux.write, 'stdout') const logMock = jest.spyOn(console, 'log') - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setApprover to approver value await ( await kit.sendTransaction({ @@ -413,7 +412,11 @@ testWithAnvilL2( ).waitReceipt() }) - await testLocallyWithWeb3Node(Approve, ['--from', approver, '--hotfix', HOTFIX_HASH], web3) + await testLocallyWithWeb3Node( + Approve, + ['--from', approver, '--hotfix', HOTFIX_HASH], + client + ) expect(await governance.getHotfixRecord(HOTFIX_BUFFER)).toMatchInlineSnapshot(` { @@ -461,8 +464,8 @@ testWithAnvilL2( }) it('succeeds when address is security council multisig signatory', async () => { - const kit = newKitFromWeb3(web3) - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] + const kit = newKitFromWeb3(client) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] const governance = await kit.contracts.getGovernance() const writeMock = jest.spyOn(ux.write, 'stdout') const logMock = jest.spyOn(console, 'log') @@ -470,7 +473,7 @@ testWithAnvilL2( await changeMultiSigOwner(kit, accounts[0]) - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setApprover to 0x5409ED021D9299bf6814279A6A1411A7e866A631 to avoid "Council cannot be approver" error await ( await kit.sendTransaction({ @@ -509,7 +512,7 @@ testWithAnvilL2( '--type', 'securityCouncil', ], - web3 + client ) expect(await governance.getHotfixRecord(HOTFIX_BUFFER)).toMatchInlineSnapshot(` @@ -555,11 +558,11 @@ testWithAnvilL2( }) it('succeeds when address is security council safe signatory', async () => { - await setupSafeContracts(web3) + await setupSafeContracts(client) - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const [approver, securityCouncilSafeSignatory1] = - (await web3.eth.getAccounts()) as StrongAddress[] + (await client.eth.getAccounts()) as StrongAddress[] const securityCouncilSafeSignatory2: StrongAddress = '0x6C666E57A5E8715cFE93f92790f98c4dFf7b69e2' const securityCouncilSafeSignatory2PrivateKey = @@ -579,23 +582,25 @@ testWithAnvilL2( const protocolKit = await Safe.init({ predictedSafe: predictSafe, - provider: (web3.currentProvider as any as CeloProvider).toEip1193Provider(), + provider: (client.currentProvider as unknown as CeloProvider).toEip1193Provider(), signer: securityCouncilSafeSignatory1, }) const deploymentTransaction = await protocolKit.createSafeDeploymentTransaction() - const receipt = await web3.eth.sendTransaction({ + const receipt = await client.eth.sendTransaction({ from: securityCouncilSafeSignatory1, ...deploymentTransaction, }) - // @ts-expect-error the function is able to extract safe adddress without having - const safeAddress = getSafeAddressFromDeploymentTx(receipt, '1.3.0') + const safeAddress = getSafeAddressFromDeploymentTx( + receipt as unknown as Parameters[0], + '1.3.0' + ) protocolKit.connect({ safeAddress }) - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setApprover to 0x5409ED021D9299bf6814279A6A1411A7e866A631 to avoid "Council cannot be approver" error await ( await kit.sendTransaction({ @@ -647,7 +652,7 @@ testWithAnvilL2( '--type', 'securityCouncil', ], - web3 + client ) // Run the same command twice with same arguments to make sure it doesn't have any effect @@ -662,7 +667,7 @@ testWithAnvilL2( '--type', 'securityCouncil', ], - web3 + client ) expect(await governance.getHotfixRecord(HOTFIX_BUFFER)).toMatchInlineSnapshot(` @@ -676,9 +681,9 @@ testWithAnvilL2( // Make sure the account has enough balance to pay for the transaction await setBalance( - web3, + client, securityCouncilSafeSignatory2, - BigInt(web3.utils.toWei('1', 'ether')) + BigInt(client.utils.toWei('1', 'ether')) ) await testLocallyWithWeb3Node( Approve, @@ -694,7 +699,7 @@ testWithAnvilL2( '--privateKey', securityCouncilSafeSignatory2PrivateKey, ], - web3 + client ) expect(await governance.getHotfixRecord(HOTFIX_BUFFER)).toMatchInlineSnapshot(` @@ -771,8 +776,8 @@ testWithAnvilL2( }) it('succeeds when address is approver multisig signatory', async () => { - const kit = newKitFromWeb3(web3) - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] + const kit = newKitFromWeb3(client) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] await changeMultiSigOwner(kit, accounts[0]) @@ -783,7 +788,7 @@ testWithAnvilL2( await testLocallyWithWeb3Node( Approve, ['--from', accounts[0], '--hotfix', HOTFIX_HASH, '--useMultiSig'], - web3 + client ) expect(await governance.getHotfixRecord(HOTFIX_BUFFER)).toMatchInlineSnapshot(` @@ -828,8 +833,8 @@ testWithAnvilL2( }) it('succeeds when address is security council multisig signatory', async () => { - const kit = newKitFromWeb3(web3) - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] + const kit = newKitFromWeb3(client) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] await changeMultiSigOwner(kit, accounts[0]) @@ -838,7 +843,7 @@ testWithAnvilL2( const logMock = jest.spyOn(console, 'log') const multisig = await governance.getApproverMultisig() - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setApprover to 0x5409ED021D9299bf6814279A6A1411A7e866A631 to avoid "Council cannot be approver" error await ( await kit.sendTransaction({ @@ -872,7 +877,7 @@ testWithAnvilL2( '--type', 'securityCouncil', ], - web3 + client ) expect(await governance.getHotfixRecord(HOTFIX_BUFFER)).toMatchInlineSnapshot(` @@ -923,8 +928,8 @@ testWithAnvilL2( let accounts: StrongAddress[] beforeEach(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] - const kit = newKitFromWeb3(web3) + accounts = (await client.eth.getAccounts()) as StrongAddress[] + const kit = newKitFromWeb3(client) governance = await kit.contracts.getGovernance() // Create and dequeue a proposal @@ -938,7 +943,7 @@ testWithAnvilL2( // Dequeue the proposal const dequeueFrequency = (await governance.dequeueFrequency()).toNumber() const { timeTravel } = await import('@celo/dev-utils/ganache-test') - await timeTravel(dequeueFrequency + 1, web3) + await timeTravel(dequeueFrequency + 1, client) await governance.dequeueProposalsIfReady().sendAndWaitForReceipt({ from: accounts[0] }) // Make accounts[0] the multisig owner @@ -952,7 +957,7 @@ testWithAnvilL2( await testLocallyWithWeb3Node( Approve, ['--from', accounts[0], '--proposalID', proposalId.toString(), '--useMultiSig'], - web3 + client ) expect(await governance.isApproved(proposalId)).toBe(true) @@ -1024,7 +1029,7 @@ testWithAnvilL2( '--useMultiSig', '--submit', ], - web3 + client ) ).rejects.toThrow("Some checks didn't pass!") @@ -1080,7 +1085,7 @@ testWithAnvilL2( '--useMultiSig', '--submit', ], - web3 + client ) ).resolves.toBeUndefined() @@ -1124,13 +1129,13 @@ testWithAnvilL2( it('should confirm existing multisig transaction when --multisigTx is provided', async () => { const logMock = jest.spyOn(console, 'log') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) // Create a 2-signer multisig so the transaction won't execute immediately const twoSignerMultisig = await createMultisig(kit, [accounts[0], accounts[1]], 2, 2) // Set the new multisig as the governance approver - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { await ( await kit.sendTransaction({ to: governance.address, @@ -1184,7 +1189,7 @@ testWithAnvilL2( '--multisigTx', '0', ], - web3 + client ) ).resolves.toBeUndefined() @@ -1261,7 +1266,7 @@ testWithAnvilL2( '--multisigTx', '0', // Invalid ID ], - web3 + client ) ).rejects.toThrow("Some checks didn't pass!") @@ -1319,7 +1324,7 @@ testWithAnvilL2( await testLocallyWithWeb3Node( Approve, ['--from', accounts[0], '--proposalID', proposalId.toString(), '--useMultiSig'], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` diff --git a/packages/cli/src/commands/governance/approve.ts b/packages/cli/src/commands/governance/approve.ts index 72173cbe3..07e53668e 100644 --- a/packages/cli/src/commands/governance/approve.ts +++ b/packages/cli/src/commands/governance/approve.ts @@ -1,5 +1,5 @@ import { StrongAddress } from '@celo/base' -import { CeloTransactionObject } from '@celo/connect' +import { CeloTransactionObject, Web3 } from '@celo/connect' import { GovernanceWrapper } from '@celo/contractkit/lib/wrappers/Governance' import { MultiSigWrapper } from '@celo/contractkit/lib/wrappers/MultiSig' import { toBuffer } from '@ethereumjs/util' @@ -7,8 +7,6 @@ import { Flags } from '@oclif/core' import fetch from 'cross-fetch' import debugFactory from 'debug' import { Hex } from 'viem' - -import Web3 from 'web3' import { BaseCommand } from '../../base' import { newCheckBuilder } from '../../utils/checks' import { displaySendTx, failWith } from '../../utils/cli' @@ -111,7 +109,7 @@ export default class Approve extends BaseCommand { governanceApproverMultiSig ) - let governanceTx: CeloTransactionObject + let governanceTx: CeloTransactionObject let logEvent: string if (id) { if (await governance.isQueued(id)) { @@ -172,18 +170,18 @@ export default class Approve extends BaseCommand { governanceTx.txo ) - await displaySendTx('approveTx', tx, {}, logEvent) + await displaySendTx('approveTx', tx as CeloTransactionObject, {}, logEvent) } else if (res.flags.multisigTx && useMultiSig) { const tx = await governanceApproverMultiSig!.confirmTransaction( parseInt(res.flags.multisigTx) ) - await displaySendTx('approveTx', tx, {}, logEvent) + await displaySendTx('approveTx', tx, {}, logEvent) } else if (res.flags.submit && useMultiSig) { const tx = await governanceApproverMultiSig!.submitTransaction( governance.address, governanceTx.txo ) - await displaySendTx('approveTx', tx, {}, logEvent) + await displaySendTx('approveTx', tx, {}, logEvent) } else { const tx = useMultiSig ? await governanceApproverMultiSig!.submitOrConfirmTransaction( @@ -191,7 +189,7 @@ export default class Approve extends BaseCommand { governanceTx.txo ) : governanceTx - await displaySendTx('approveTx', tx, {}, logEvent) + await displaySendTx('approveTx', tx, {}, logEvent) } } } diff --git a/packages/cli/src/commands/governance/build-proposals.test.ts b/packages/cli/src/commands/governance/build-proposals.test.ts index 6bcf10fa3..619c2409e 100644 --- a/packages/cli/src/commands/governance/build-proposals.test.ts +++ b/packages/cli/src/commands/governance/build-proposals.test.ts @@ -2,7 +2,6 @@ import CeloTokenABI from '@celo/abis/GoldToken.json' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { readJSON, removeSync } from 'fs-extra' import inquirer from 'inquirer' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import BuildProposal from './build-proposal' @@ -13,7 +12,7 @@ jest.mock('inquirer') const TX_PATH_FOR_TEST = './test-tx.json' -testWithAnvilL2('governance:build-proposal cmd', (web3: Web3) => { +testWithAnvilL2('governance:build-proposal cmd', (client) => { describe('building proposal to transfer funds from governance', () => { beforeEach(async () => { const promptSpy = jest @@ -37,7 +36,7 @@ testWithAnvilL2('governance:build-proposal cmd', (web3: Web3) => { promptSpy.mockResolvedValueOnce({ 'Celo Contract': '✔ done' }) }) it('generates the json', async () => { - await testLocallyWithWeb3Node(BuildProposal, ['--output', TX_PATH_FOR_TEST], web3) + await testLocallyWithWeb3Node(BuildProposal, ['--output', TX_PATH_FOR_TEST], client) const result = await readJSON(TX_PATH_FOR_TEST) expect(result).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/governance/dequeue.test.ts b/packages/cli/src/commands/governance/dequeue.test.ts index db19e39e3..008660713 100644 --- a/packages/cli/src/commands/governance/dequeue.test.ts +++ b/packages/cli/src/commands/governance/dequeue.test.ts @@ -1,16 +1,15 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { timeTravel } from '@celo/dev-utils/ganache-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Dequeue from './dequeue' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('governance:dequeue cmd', (web3: Web3) => { +testWithAnvilL2('governance:dequeue cmd', (client) => { it('does not dequeue anything if no proposals are ready', async () => { - const kit = newKitFromWeb3(web3) - const [account] = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const [account] = await client.eth.getAccounts() const governanceWrapper = await kit.contracts.getGovernance() const minDeposit = (await governanceWrapper.minDeposit()).toFixed() @@ -26,7 +25,7 @@ testWithAnvilL2('governance:dequeue cmd', (web3: Web3) => { .sendAndWaitForReceipt({ from: account, value: minDeposit }) // Run dequeue operation - await testLocallyWithWeb3Node(Dequeue, ['--from', account], web3) + await testLocallyWithWeb3Node(Dequeue, ['--from', account], client) // After first dequeue, we should have either proposal dequeued or still in queue const afterFirstDequeue = await governanceWrapper.getDequeue() @@ -40,7 +39,7 @@ testWithAnvilL2('governance:dequeue cmd', (web3: Web3) => { .sendAndWaitForReceipt({ from: account, value: minDeposit }) // Run dequeue again - await testLocallyWithWeb3Node(Dequeue, ['--from', account], web3) + await testLocallyWithWeb3Node(Dequeue, ['--from', account], client) // After second dequeue, we should have 2 total proposals in the system const finalDequeue = await governanceWrapper.getDequeue() @@ -50,8 +49,8 @@ testWithAnvilL2('governance:dequeue cmd', (web3: Web3) => { }) it('dequeues proposals after time has passed', async () => { - const kit = newKitFromWeb3(web3) - const [account] = await web3.eth.getAccounts() + const kit = newKitFromWeb3(client) + const [account] = await client.eth.getAccounts() const governanceWrapper = await kit.contracts.getGovernance() const minDeposit = (await governanceWrapper.minDeposit()).toFixed() const dequeueFrequency = (await governanceWrapper.dequeueFrequency()).toNumber() @@ -66,7 +65,7 @@ testWithAnvilL2('governance:dequeue cmd', (web3: Web3) => { .sendAndWaitForReceipt({ from: account, value: minDeposit }) // Run dequeue immediately (should not dequeue due to timing) - await testLocallyWithWeb3Node(Dequeue, ['--from', account], web3) + await testLocallyWithWeb3Node(Dequeue, ['--from', account], client) // Should have 1 proposal total in the system const afterFirstDequeue = await governanceWrapper.getDequeue() @@ -79,10 +78,10 @@ testWithAnvilL2('governance:dequeue cmd', (web3: Web3) => { .sendAndWaitForReceipt({ from: account, value: minDeposit }) // Advance time to allow dequeuing - await timeTravel(dequeueFrequency + 1, web3) + await timeTravel(dequeueFrequency + 1, client) // Now dequeue should work - await testLocallyWithWeb3Node(Dequeue, ['--from', account], web3) + await testLocallyWithWeb3Node(Dequeue, ['--from', account], client) // Should have 2 proposals total, and some should be dequeued const finalDequeue = await governanceWrapper.getDequeue() diff --git a/packages/cli/src/commands/governance/execute.test.ts b/packages/cli/src/commands/governance/execute.test.ts index 10b67b33e..fbc163efc 100644 --- a/packages/cli/src/commands/governance/execute.test.ts +++ b/packages/cli/src/commands/governance/execute.test.ts @@ -10,13 +10,12 @@ import { import { timeTravel } from '@celo/dev-utils/ganache-test' import fs from 'fs' import path from 'node:path' -import Web3 from 'web3' import { stripAnsiCodesAndTxHashes, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Execute from './execute' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('governance:execute cmd', (web3: Web3) => { +testWithAnvilL2('governance:execute cmd', (client) => { const PROPOSAL_TRANSACTION_TEST_KEY = '3' const PROPOSAL_TRANSACTION_TEST_VALUE = '4' const PROPOSAL_TRANSACTIONS = [ @@ -64,9 +63,9 @@ testWithAnvilL2('governance:execute cmd', (web3: Web3) => { }) it('should execute a proposal successfuly', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const governanceWrapper = await kit.contracts.getGovernance() - const [approver, proposer, voter] = await web3.eth.getAccounts() + const [approver, proposer, voter] = await client.eth.getAccounts() const minDeposit = (await governanceWrapper.minDeposit()).toFixed() const lockedGold = await kit.contracts.getLockedGold() const majorityOfVotes = (await lockedGold.getTotalLockedGold()).multipliedBy(0.6) @@ -74,7 +73,7 @@ testWithAnvilL2('governance:execute cmd', (web3: Web3) => { const dequeueFrequency = (await governanceWrapper.dequeueFrequency()).toNumber() const proposalId = 1 - await setCode(web3, PROXY_ADMIN_ADDRESS, TEST_TRANSACTIONS_BYTECODE) + await setCode(client, PROXY_ADMIN_ADDRESS, TEST_TRANSACTIONS_BYTECODE) await governanceWrapper .propose(PROPOSAL_TRANSACTIONS, 'URL') @@ -88,7 +87,7 @@ testWithAnvilL2('governance:execute cmd', (web3: Web3) => { .lock() .sendAndWaitForReceipt({ from: voter, value: majorityOfVotes.toFixed() }) - await timeTravel(dequeueFrequency + 1, web3) + await timeTravel(dequeueFrequency + 1, client) await governanceWrapper.dequeueProposalsIfReady().sendAndWaitForReceipt({ from: proposer, @@ -106,11 +105,11 @@ testWithAnvilL2('governance:execute cmd', (web3: Web3) => { await kit.sendTransaction({ to: DEFAULT_OWNER_ADDRESS, from: approver, - value: web3.utils.toWei('1', 'ether'), + value: client.utils.toWei('1', 'ether'), }) ).waitReceipt() - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setApprover to approverAccount await ( await kit.sendTransaction({ @@ -125,9 +124,9 @@ testWithAnvilL2('governance:execute cmd', (web3: Web3) => { await lockedGoldWrapper.lock().sendAndWaitForReceipt({ from: voter, value: minDeposit }) await (await governanceWrapper.vote(proposalId, 'Yes')).sendAndWaitForReceipt({ from: voter }) - await timeTravel((await governanceWrapper.stageDurations()).Referendum.toNumber() + 1, web3) + await timeTravel((await governanceWrapper.stageDurations()).Referendum.toNumber() + 1, client) - const testTransactionsContract = new web3.eth.Contract( + const testTransactionsContract = new client.eth.Contract( TEST_TRANSACTIONS_ABI, PROXY_ADMIN_ADDRESS ) @@ -142,7 +141,7 @@ testWithAnvilL2('governance:execute cmd', (web3: Web3) => { await testLocallyWithWeb3Node( Execute, ['--proposalID', proposalId.toString(), '--from', proposer], - web3 + client ) expect( diff --git a/packages/cli/src/commands/governance/executehotfix.test.ts b/packages/cli/src/commands/governance/executehotfix.test.ts index b2c3314e7..a9d8d90f3 100644 --- a/packages/cli/src/commands/governance/executehotfix.test.ts +++ b/packages/cli/src/commands/governance/executehotfix.test.ts @@ -10,7 +10,6 @@ import { } from '@celo/dev-utils/anvil-test' import fs from 'fs' import path from 'node:path' -import Web3 from 'web3' import { AbiItem, PROXY_ADMIN_ADDRESS } from '../../../../sdk/connect/lib' import { EXTRA_LONG_TIMEOUT_MS, @@ -23,7 +22,7 @@ import PrepareHotfix from './preparehotfix' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('governance:executehotfix cmd', (web3: Web3) => { +testWithAnvilL2('governance:executehotfix cmd', (client) => { const HOTFIX_HASH = '0x8ad3719bb2577b277bcafc1f00ac2f1c3fa5e565173303684d0a8d4f3661680c' const HOTFIX_BUFFER = hexToBuffer(HOTFIX_HASH) const HOTFIX_TRANSACTION_TEST_KEY = '3' @@ -75,23 +74,23 @@ testWithAnvilL2('governance:executehotfix cmd', (web3: Web3) => { it( 'should execute a hotfix successfuly', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const governanceWrapper = await kit.contracts.getGovernance() - const [approverAccount, securityCouncilAccount] = await web3.eth.getAccounts() + const [approverAccount, securityCouncilAccount] = await client.eth.getAccounts() const logMock = jest.spyOn(console, 'log') - await setCode(web3, PROXY_ADMIN_ADDRESS, TEST_TRANSACTIONS_BYTECODE) + await setCode(client, PROXY_ADMIN_ADDRESS, TEST_TRANSACTIONS_BYTECODE) // send some funds to DEFAULT_OWNER_ADDRESS to execute transactions await ( await kit.sendTransaction({ to: DEFAULT_OWNER_ADDRESS, from: approverAccount, - value: web3.utils.toWei('1', 'ether'), + value: client.utils.toWei('1', 'ether'), }) ).waitReceipt() - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setHotfixExecutionTimeWindow to EXECUTION_TIME_LIMIT (86400) await ( await kit.sendTransaction({ @@ -127,22 +126,22 @@ testWithAnvilL2('governance:executehotfix cmd', (web3: Web3) => { await testLocallyWithWeb3Node( Approve, ['--hotfix', HOTFIX_HASH, '--from', approverAccount], - web3 + client ) await testLocallyWithWeb3Node( Approve, ['--hotfix', HOTFIX_HASH, '--from', securityCouncilAccount, '--type', 'securityCouncil'], - web3 + client ) await testLocallyWithWeb3Node( PrepareHotfix, ['--hash', HOTFIX_HASH, '--from', approverAccount], - web3 + client ) - const testTransactionsContract = new web3.eth.Contract( + const testTransactionsContract = new client.eth.Contract( TEST_TRANSACTIONS_ABI, PROXY_ADMIN_ADDRESS ) @@ -164,7 +163,7 @@ testWithAnvilL2('governance:executehotfix cmd', (web3: Web3) => { '--salt', SALT, ], - web3 + client ) expect( @@ -214,23 +213,23 @@ testWithAnvilL2('governance:executehotfix cmd', (web3: Web3) => { it( 'fails if execution time limit has been reached', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const governanceWrapper = await kit.contracts.getGovernance() - const [approverAccount, securityCouncilAccount] = await web3.eth.getAccounts() + const [approverAccount, securityCouncilAccount] = await client.eth.getAccounts() const logMock = jest.spyOn(console, 'log') - await setCode(web3, PROXY_ADMIN_ADDRESS, TEST_TRANSACTIONS_BYTECODE) + await setCode(client, PROXY_ADMIN_ADDRESS, TEST_TRANSACTIONS_BYTECODE) // send some funds to DEFAULT_OWNER_ADDRESS to execute transactions await ( await kit.sendTransaction({ to: DEFAULT_OWNER_ADDRESS, from: approverAccount, - value: web3.utils.toWei('1', 'ether'), + value: client.utils.toWei('1', 'ether'), }) ).waitReceipt() - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setHotfixExecutionTimeWindow to 1 second await ( await kit.sendTransaction({ @@ -266,22 +265,22 @@ testWithAnvilL2('governance:executehotfix cmd', (web3: Web3) => { await testLocallyWithWeb3Node( Approve, ['--hotfix', HOTFIX_HASH, '--from', approverAccount], - web3 + client ) await testLocallyWithWeb3Node( Approve, ['--hotfix', HOTFIX_HASH, '--from', securityCouncilAccount, '--type', 'securityCouncil'], - web3 + client ) await testLocallyWithWeb3Node( PrepareHotfix, ['--hash', HOTFIX_HASH, '--from', approverAccount], - web3 + client ) - const testTransactionsContract = new web3.eth.Contract( + const testTransactionsContract = new client.eth.Contract( TEST_TRANSACTIONS_ABI, PROXY_ADMIN_ADDRESS ) @@ -299,7 +298,7 @@ testWithAnvilL2('governance:executehotfix cmd', (web3: Web3) => { .spyOn(global.Date, 'now') .mockImplementation(() => timestampAfterExecutionLimit.multipliedBy(1000).toNumber()) - await setNextBlockTimestamp(web3, timestampAfterExecutionLimit.toNumber()) + await setNextBlockTimestamp(client, timestampAfterExecutionLimit.toNumber()) logMock.mockClear() @@ -314,7 +313,7 @@ testWithAnvilL2('governance:executehotfix cmd', (web3: Web3) => { '--salt', SALT, ], - web3 + client ) ).rejects.toThrow("Some checks didn't pass!") diff --git a/packages/cli/src/commands/governance/hashhotfix.test.ts b/packages/cli/src/commands/governance/hashhotfix.test.ts index 37acf253d..12f6cc798 100644 --- a/packages/cli/src/commands/governance/hashhotfix.test.ts +++ b/packages/cli/src/commands/governance/hashhotfix.test.ts @@ -2,13 +2,12 @@ import { PROXY_ADMIN_ADDRESS } from '@celo/connect' import { setCode, testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import fs from 'fs' import path from 'node:path' -import Web3 from 'web3' import { stripAnsiCodesAndTxHashes, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import HashHotfix from './hashhotfix' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('governance:hashhotfix cmd', (web3: Web3) => { +testWithAnvilL2('governance:hashhotfix cmd', (client) => { const SALT = '0x614dccb5ac13cba47c2430bdee7829bb8c8f3603a8ace22e7680d317b39e3658' const HOTFIX_TRANSACTION_TEST_KEY = '3' const HOTFIX_TRANSACTION_TEST_VALUE = '4' @@ -40,7 +39,7 @@ testWithAnvilL2('governance:hashhotfix cmd', (web3: Web3) => { await testLocallyWithWeb3Node( HashHotfix, ['--jsonTransactions', HOTFIX_TRANSACTIONS_FILE_PATH, '--salt', SALT, '--force'], - web3 + client ) expect( @@ -58,14 +57,14 @@ testWithAnvilL2('governance:hashhotfix cmd', (web3: Web3) => { }) it('should verify and hash a hotfix successfuly', async () => { - await setCode(web3, PROXY_ADMIN_ADDRESS, TEST_TRANSACTIONS_BYTECODE) + await setCode(client, PROXY_ADMIN_ADDRESS, TEST_TRANSACTIONS_BYTECODE) const logMock = jest.spyOn(console, 'log') await testLocallyWithWeb3Node( HashHotfix, ['--jsonTransactions', HOTFIX_TRANSACTIONS_FILE_PATH, '--salt', SALT], - web3 + client ) expect( @@ -94,7 +93,7 @@ testWithAnvilL2('governance:hashhotfix cmd', (web3: Web3) => { await testLocallyWithWeb3Node( HashHotfix, ['--jsonTransactions', HOTFIX_TRANSACTIONS_FILE_PATH, '--salt', SALT], - web3 + client ) expect( diff --git a/packages/cli/src/commands/governance/preparehotfix.test.ts b/packages/cli/src/commands/governance/preparehotfix.test.ts index ea87c5222..48cb12580 100644 --- a/packages/cli/src/commands/governance/preparehotfix.test.ts +++ b/packages/cli/src/commands/governance/preparehotfix.test.ts @@ -6,7 +6,6 @@ import { testWithAnvilL2, withImpersonatedAccount, } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { getCurrentTimestamp } from '../../utils/cli' import Approve from './approve' @@ -14,15 +13,15 @@ import PrepareHotfix from './preparehotfix' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('governance:preparehotfix cmd', (web3: Web3) => { +testWithAnvilL2('governance:preparehotfix cmd', (client) => { const HOTFIX_HASH = '0x8ad3719bb2577b277bcafc1f00ac2f1c3fa5e565173303684d0a8d4f3661680c' const HOTFIX_BUFFER = hexToBuffer(HOTFIX_HASH) const EXECUTION_TIME_LIMIT = 86400 it('should prepare a hotfix successfuly', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const governanceWrapper = await kit.contracts.getGovernance() - const [approverAccount, securityCouncilAccount] = await web3.eth.getAccounts() + const [approverAccount, securityCouncilAccount] = await client.eth.getAccounts() // arbitrary 100 seconds to the future to avoid // Timestamp error: X is lower than or equal to previous block's timestamp const nextTimestamp = getCurrentTimestamp() + 100 @@ -32,11 +31,11 @@ testWithAnvilL2('governance:preparehotfix cmd', (web3: Web3) => { await kit.sendTransaction({ to: DEFAULT_OWNER_ADDRESS, from: approverAccount, - value: web3.utils.toWei('1', 'ether'), + value: client.utils.toWei('1', 'ether'), }) ).waitReceipt() - await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { + await withImpersonatedAccount(client, DEFAULT_OWNER_ADDRESS, async () => { // setHotfixExecutionTimeWindow to EXECUTION_TIME_LIMIT (86400) await ( await kit.sendTransaction({ @@ -72,21 +71,21 @@ testWithAnvilL2('governance:preparehotfix cmd', (web3: Web3) => { await testLocallyWithWeb3Node( Approve, ['--hotfix', HOTFIX_HASH, '--from', approverAccount], - web3 + client ) await testLocallyWithWeb3Node( Approve, ['--hotfix', HOTFIX_HASH, '--from', securityCouncilAccount, '--type', 'securityCouncil'], - web3 + client ) - await setNextBlockTimestamp(web3, nextTimestamp) + await setNextBlockTimestamp(client, nextTimestamp) await testLocallyWithWeb3Node( PrepareHotfix, ['--hash', HOTFIX_HASH, '--from', approverAccount], - web3 + client ) expect(await governanceWrapper.getHotfixRecord(HOTFIX_BUFFER)).toMatchInlineSnapshot(` diff --git a/packages/cli/src/commands/governance/propose.test.ts b/packages/cli/src/commands/governance/propose.test.ts index c013741b3..5ed8b3e40 100644 --- a/packages/cli/src/commands/governance/propose.test.ts +++ b/packages/cli/src/commands/governance/propose.test.ts @@ -7,7 +7,6 @@ import { setBalance, testWithAnvilL2, withImpersonatedAccount } from '@celo/dev- import { ux } from '@oclif/core' import Safe, { getSafeAddressFromDeploymentTx } from '@safe-global/protocol-kit' import * as fs from 'fs' -import Web3 from 'web3' import { EXTRA_LONG_TIMEOUT_MS, stripAnsiCodesFromNestedArray, @@ -149,7 +148,7 @@ const structAbiDefinition = { testWithAnvilL2( 'governance:propose cmd', - (web3: Web3) => { + (client) => { const TRANSACTION_FILE_PATH = 'governance-propose-l2.test.json' let governance: GovernanceWrapper @@ -157,16 +156,16 @@ testWithAnvilL2( let goldTokenContract: GoldTokenWrapper['contract'] let minDeposit: string - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) let accounts: StrongAddress[] = [] beforeEach(async () => { // need to set multical deployment on the address it was found on alfajores // since this test impersonates the old alfajores chain id - await deployMultiCall(web3, '0xcA11bde05977b3631167028862bE2a173976CA11') + await deployMultiCall(client, '0xcA11bde05977b3631167028862bE2a173976CA11') - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] governance = await kit.contracts.getGovernance() goldToken = await kit.contracts.getGoldToken() @@ -189,7 +188,7 @@ testWithAnvilL2( await kit.sendTransaction({ to: governance.address, from: accounts[0], - value: web3.utils.toWei('1', 'ether'), + value: client.utils.toWei('1', 'ether'), }) ).waitReceipt() @@ -208,7 +207,7 @@ testWithAnvilL2( '--descriptionURL', 'https://github.com/celo-org/governance/blob/main/CGPs/cgp-123.md', ], - web3 + client ) const proposal = await governance.getProposal(1) @@ -233,7 +232,7 @@ testWithAnvilL2( await kit.sendTransaction({ from: accounts[0], to: governance.address, - value: web3.utils.toWei('1', 'ether'), + value: client.utils.toWei('1', 'ether'), }) ).waitReceipt() @@ -249,7 +248,7 @@ testWithAnvilL2( await kit.sendTransaction({ from: accounts[2], to: multisigWithOneSigner, - value: web3.utils.toWei('20000', 'ether'), // 2x min deposit on Mainnet + value: client.utils.toWei('20000', 'ether'), // 2x min deposit on Mainnet }) ).waitReceipt() @@ -271,7 +270,7 @@ testWithAnvilL2( '--descriptionURL', 'https://github.com/celo-org/governance/blob/main/CGPs/cgp-123.md', ], - web3 + client ) const proposal = await governance.getProposal(1) @@ -296,7 +295,7 @@ testWithAnvilL2( await kit.sendTransaction({ to: governance.address, from: accounts[0], - value: web3.utils.toWei('1', 'ether'), + value: client.utils.toWei('1', 'ether'), }) ).waitReceipt() @@ -312,7 +311,7 @@ testWithAnvilL2( await kit.sendTransaction({ from: accounts[2], to: multisigWithTwoSigners, - value: web3.utils.toWei('20000', 'ether'), // 2x min deposit on Mainnet + value: client.utils.toWei('20000', 'ether'), // 2x min deposit on Mainnet }) ).waitReceipt() @@ -335,7 +334,7 @@ testWithAnvilL2( '--descriptionURL', 'https://github.com/celo-org/governance/blob/main/CGPs/cgp-123.md', ], - web3 + client ) const proposalBetween = await governance.getProposal(1) @@ -345,7 +344,7 @@ testWithAnvilL2( await testLocallyWithWeb3Node( Approve, ['--from', accounts[1], '--for', multisigWithTwoSigners, '--tx', '0'], - web3 + client ) const proposal = await governance.getProposal(1) @@ -362,13 +361,13 @@ testWithAnvilL2( describe('with safe', () => { beforeEach(async () => { - await setupSafeContracts(web3) + await setupSafeContracts(client) }) test( 'will successfully create proposal based on Core contract (1 owner)', async () => { - const [owner1] = (await web3.eth.getAccounts()) as StrongAddress[] + const [owner1] = (await client.eth.getAccounts()) as StrongAddress[] const safeAccountConfig = { owners: [owner1], threshold: 1, @@ -379,11 +378,11 @@ testWithAnvilL2( } const protocolKit = await Safe.init({ predictedSafe: predictSafe, - provider: (web3.currentProvider as any as CeloProvider).toEip1193Provider(), + provider: (client.currentProvider as unknown as CeloProvider).toEip1193Provider(), signer: owner1, }) const deploymentTransaction = await protocolKit.createSafeDeploymentTransaction() - const receipt = await web3.eth.sendTransaction({ + const receipt = await client.eth.sendTransaction({ from: owner1, ...deploymentTransaction, }) @@ -393,11 +392,11 @@ testWithAnvilL2( ) as StrongAddress await protocolKit.connect({ safeAddress }) - const balance = BigInt(web3.utils.toWei('100', 'ether')) - await setBalance(web3, goldToken.address, balance) - await setBalance(web3, governance.address, balance) - await setBalance(web3, owner1, balance) - await setBalance(web3, safeAddress, balance) + const balance = BigInt(client.utils.toWei('100', 'ether')) + await setBalance(client, goldToken.address, balance) + await setBalance(client, governance.address, balance) + await setBalance(client, owner1, balance) + await setBalance(client, safeAddress, balance) const transactionsToBeSaved = JSON.stringify(transactions) fs.writeFileSync(TRANSACTION_FILE_PATH, transactionsToBeSaved, { flag: 'w' }) @@ -421,7 +420,7 @@ testWithAnvilL2( '--descriptionURL', 'https://github.com/celo-org/governance/blob/main/CGPs/cgp-123.md', ], - web3 + client ) const proposal = await governance.getProposal(1) expect(proposal.length).toEqual(transactions.length) @@ -438,7 +437,7 @@ testWithAnvilL2( test( 'will successfully create proposal based on Core contract (2 owners)', async () => { - const [owner1] = (await web3.eth.getAccounts()) as StrongAddress[] + const [owner1] = (await client.eth.getAccounts()) as StrongAddress[] const owner2 = '0x6C666E57A5E8715cFE93f92790f98c4dFf7b69e2' const safeAccountConfig = { owners: [owner1, owner2], @@ -450,11 +449,11 @@ testWithAnvilL2( } const protocolKit = await Safe.init({ predictedSafe: predictSafe, - provider: (web3.currentProvider as any as CeloProvider).toEip1193Provider(), + provider: (client.currentProvider as unknown as CeloProvider).toEip1193Provider(), signer: owner1, }) const deploymentTransaction = await protocolKit.createSafeDeploymentTransaction() - const receipt = await web3.eth.sendTransaction({ + const receipt = await client.eth.sendTransaction({ from: owner1, ...deploymentTransaction, }) @@ -464,12 +463,12 @@ testWithAnvilL2( ) as StrongAddress await protocolKit.connect({ safeAddress }) - const balance = BigInt(web3.utils.toWei('100', 'ether')) - await setBalance(web3, goldToken.address, balance) - await setBalance(web3, governance.address, balance) - await setBalance(web3, owner1, balance) - await setBalance(web3, owner2, balance) - await setBalance(web3, safeAddress, balance) + const balance = BigInt(client.utils.toWei('100', 'ether')) + await setBalance(client, goldToken.address, balance) + await setBalance(client, governance.address, balance) + await setBalance(client, owner1, balance) + await setBalance(client, owner2, balance) + await setBalance(client, safeAddress, balance) const transactionsToBeSaved = JSON.stringify(transactions) fs.writeFileSync(TRANSACTION_FILE_PATH, transactionsToBeSaved, { flag: 'w' }) @@ -493,12 +492,12 @@ testWithAnvilL2( '--descriptionURL', 'https://github.com/celo-org/governance/blob/main/CGPs/cgp-123.md', ], - web3 + client ) const proposalBefore2ndOwner = await governance.getProposal(1) expect(proposalBefore2ndOwner).toEqual([]) - await withImpersonatedAccount(web3, owner2, async () => { + await withImpersonatedAccount(client, owner2, async () => { await testLocallyWithWeb3Node( Propose, [ @@ -514,7 +513,7 @@ testWithAnvilL2( '--descriptionURL', 'https://github.com/celo-org/governance/blob/main/CGPs/cgp-123.md', ], - web3 + client ) }) @@ -541,7 +540,7 @@ testWithAnvilL2( await kit.sendTransaction({ to: governance.address, from: accounts[0], - value: web3.utils.toWei('1', 'ether'), + value: client.utils.toWei('1', 'ether'), }) ).waitReceipt() @@ -562,7 +561,7 @@ testWithAnvilL2( '--force', '--noInfo', ], - web3 + client ) const proposal = await governance.getProposal(1) @@ -587,7 +586,7 @@ testWithAnvilL2( await kit.sendTransaction({ to: governance.address, from: accounts[0], - value: web3.utils.toWei('1', 'ether'), + value: client.utils.toWei('1', 'ether'), }) ).waitReceipt() @@ -608,7 +607,7 @@ testWithAnvilL2( '--force', '--noInfo', ], - web3 + client ) const proposal = await governance.getProposal(1) @@ -639,7 +638,7 @@ testWithAnvilL2( '--jsonTransactions', './exampleProposal.json', ], - web3 + client ) ).rejects.toThrow('Missing required flag descriptionURL') }, @@ -663,7 +662,7 @@ testWithAnvilL2( 'https://github.com/suspicious-org/governance/blob/main/CGPs/cgp-123.md', ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(` "Parsing --descriptionURL @@ -690,7 +689,7 @@ testWithAnvilL2( '--descriptionURL', 'https://github.com/celo-org/governance/blob/main/CGPs/cgp-123.md', ], - web3 + client ) ).resolves.toBe(undefined) }, @@ -714,7 +713,7 @@ testWithAnvilL2( '--descriptionURL', 'https://github.com/celo-org/governance/blob/main/CGPs/cgp-123.md', ], - web3 + client ) expect(spyStart).toHaveBeenCalledWith('Sending Transaction: proposeTx') expect(spyStop).toHaveBeenCalled() @@ -740,7 +739,7 @@ testWithAnvilL2( '--descriptionURL', 'https://github.com/celo-org/governance/blob/main/CGPs/cgp-123.md', ], - web3 + client ) expect(spyStart).toHaveBeenCalledWith('Sending Transaction: proposeTx') expect(spyStop).toHaveBeenCalled() @@ -772,7 +771,7 @@ testWithAnvilL2( 'https://github.com/celo-org/governance/blob/main/CGPs/cgp-404.md', ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(stripAnsiCodesFromNestedArray(mockLog.mock.calls)).toMatchInlineSnapshot(` @@ -817,7 +816,7 @@ testWithAnvilL2( 'https://github.com/celo-org/governance/blob/main/CGPs/cgp-error.md', ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) const mockLog = jest.spyOn(console, 'log').mockImplementation(() => {}) diff --git a/packages/cli/src/commands/governance/revokeupvote.test.ts b/packages/cli/src/commands/governance/revokeupvote.test.ts index 1d0d603b1..e937f2f4a 100644 --- a/packages/cli/src/commands/governance/revokeupvote.test.ts +++ b/packages/cli/src/commands/governance/revokeupvote.test.ts @@ -3,7 +3,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { GovernanceWrapper } from '@celo/contractkit/lib/wrappers/Governance' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' import Lock from '../lockedcelo/lock' @@ -11,16 +10,16 @@ import RevokeUpvote from './revokeupvote' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('governance:revokeupvote cmd', (web3: Web3) => { +testWithAnvilL2('governance:revokeupvote cmd', (client) => { let minDeposit: BigNumber - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const proposalId = '2' let accounts: StrongAddress[] = [] let governance: GovernanceWrapper beforeEach(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] governance = await kit.contracts.getGovernance() minDeposit = await governance.minDeposit() @@ -32,8 +31,8 @@ testWithAnvilL2('governance:revokeupvote cmd', (web3: Web3) => { } for (let i = 1; i <= 4; i++) { - await testLocallyWithWeb3Node(Register, ['--from', accounts[i]], web3) - await testLocallyWithWeb3Node(Lock, ['--from', accounts[i], '--value', i.toString()], web3) + await testLocallyWithWeb3Node(Register, ['--from', accounts[i]], client) + await testLocallyWithWeb3Node(Lock, ['--from', accounts[i], '--value', i.toString()], client) await (await governance.upvote(proposalId, accounts[i])).sendAndWaitForReceipt({ from: accounts[i], @@ -53,7 +52,7 @@ testWithAnvilL2('governance:revokeupvote cmd', (web3: Web3) => { `) // Revoke upvote from account 2 (2 upvotes) - await testLocallyWithWeb3Node(RevokeUpvote, ['--from', accounts[2]], web3) + await testLocallyWithWeb3Node(RevokeUpvote, ['--from', accounts[2]], client) // 1 + 3 + 4 = 8 upvotes expect(await governance.getQueue()).toMatchInlineSnapshot(` diff --git a/packages/cli/src/commands/governance/show.test.ts b/packages/cli/src/commands/governance/show.test.ts index bf6e9a7f3..cb7aafb4f 100644 --- a/packages/cli/src/commands/governance/show.test.ts +++ b/packages/cli/src/commands/governance/show.test.ts @@ -5,13 +5,12 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { timeTravel } from '@celo/dev-utils/ganache-test' import fs from 'fs' import path from 'node:path' -import Web3 from 'web3' import { stripAnsiCodesAndTxHashes, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Show from './show' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('governance:show cmd', (web3: Web3) => { +testWithAnvilL2('governance:show cmd', (client) => { const PROPOSAL_TRANSACTIONS = [ { to: '0x4200000000000000000000000000000000000018', @@ -34,9 +33,9 @@ testWithAnvilL2('governance:show cmd', (web3: Web3) => { }) it('shows a proposal in "Referendum" stage', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const governanceWrapper = await kit.contracts.getGovernance() - const [proposer, voter] = await web3.eth.getAccounts() + const [proposer, voter] = await client.eth.getAccounts() const minDeposit = (await governanceWrapper.minDeposit()).toFixed() const logMock = jest.spyOn(console, 'log') const dequeueFrequency = (await governanceWrapper.dequeueFrequency()).toNumber() @@ -52,7 +51,7 @@ testWithAnvilL2('governance:show cmd', (web3: Web3) => { await accountWrapper.createAccount().sendAndWaitForReceipt({ from: voter }) await lockedGoldWrapper.lock().sendAndWaitForReceipt({ from: voter, value: minDeposit }) - await timeTravel(dequeueFrequency + 1, web3) + await timeTravel(dequeueFrequency + 1, client) await governanceWrapper.dequeueProposalsIfReady().sendAndWaitForReceipt({ from: proposer, @@ -60,7 +59,7 @@ testWithAnvilL2('governance:show cmd', (web3: Web3) => { await (await governanceWrapper.vote(proposalId, 'Yes')).sendAndWaitForReceipt({ from: voter }) - await testLocallyWithWeb3Node(Show, ['--proposalID', proposalId.toString()], web3) + await testLocallyWithWeb3Node(Show, ['--proposalID', proposalId.toString()], client) const schedule = await governanceWrapper.proposalSchedule(proposalId) const timestamp = await (await governanceWrapper.getProposalMetadata(proposalId)).timestamp diff --git a/packages/cli/src/commands/governance/test-proposal.test.ts b/packages/cli/src/commands/governance/test-proposal.test.ts index 5fad962f1..c687d380f 100644 --- a/packages/cli/src/commands/governance/test-proposal.test.ts +++ b/packages/cli/src/commands/governance/test-proposal.test.ts @@ -3,7 +3,6 @@ import { setCode, testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import * as celoGovernance from '@celo/governance' import fs from 'fs' import path from 'node:path' -import Web3 from 'web3' import { stripAnsiCodesAndTxHashes, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import TestProposal from './test-proposal' @@ -17,7 +16,7 @@ jest.mock('@celo/governance', () => { } }) -testWithAnvilL2('governance:test-proposal cmd', (web3: Web3) => { +testWithAnvilL2('governance:test-proposal cmd', (client) => { const PROPOSAL_TRANSACTION_TEST_KEY = '3' const PROPOSAL_TRANSACTION_TEST_VALUE = '4' const PROPOSAL_TRANSACTIONS = [ @@ -50,15 +49,15 @@ testWithAnvilL2('governance:test-proposal cmd', (web3: Web3) => { return {} as any }) - await setCode(web3, PROXY_ADMIN_ADDRESS, TEST_TRANSACTIONS_BYTECODE) + await setCode(client, PROXY_ADMIN_ADDRESS, TEST_TRANSACTIONS_BYTECODE) - const [account] = await web3.eth.getAccounts() + const [account] = await client.eth.getAccounts() const logMock = jest.spyOn(console, 'log') await testLocallyWithWeb3Node( TestProposal, ['--jsonTransactions', PROPOSAL_TRANSACTIONS_FILE_PATH, '--from', account], - web3 + client ) // Verify we're passing correct arguments to 'proposalToJSON' diff --git a/packages/cli/src/commands/governance/upvote.test.ts b/packages/cli/src/commands/governance/upvote.test.ts index ce7677a44..a59714ce5 100644 --- a/packages/cli/src/commands/governance/upvote.test.ts +++ b/packages/cli/src/commands/governance/upvote.test.ts @@ -4,7 +4,6 @@ import { GovernanceWrapper } from '@celo/contractkit/lib/wrappers/Governance' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { timeTravel } from '@celo/dev-utils/ganache-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' import Lock from '../lockedcelo/lock' @@ -13,9 +12,9 @@ import Upvote from './upvote' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('governance:upvote cmd', (web3: Web3) => { +testWithAnvilL2('governance:upvote cmd', (client) => { let minDeposit: string - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const proposalID = new BigNumber(1) const proposalID2 = new BigNumber(2) const proposalID3 = new BigNumber(3) @@ -26,7 +25,7 @@ testWithAnvilL2('governance:upvote cmd', (web3: Web3) => { let governance: GovernanceWrapper beforeEach(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] governance = await kit.contracts.getGovernance() minDeposit = (await governance.minDeposit()).toFixed() @@ -35,14 +34,14 @@ testWithAnvilL2('governance:upvote cmd', (web3: Web3) => { // If the devchain is published less than dequeueFrequency ago, the tests // will fail, so we need to make sure that by calling timeTravel() we will // hit the next dequeue - await timeTravel(dequeueFrequency, web3) + await timeTravel(dequeueFrequency, client) await governance .propose([], 'URL') .sendAndWaitForReceipt({ from: accounts[0], value: minDeposit }) // this will reset lastDequeue to now // there is 3 concurrent proposals possible to be dequeued - await testLocallyWithWeb3Node(Dequeue, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(Dequeue, ['--from', accounts[0]], client) await governance .propose([], 'URL2') .sendAndWaitForReceipt({ from: accounts[0], value: minDeposit }) @@ -56,16 +55,16 @@ testWithAnvilL2('governance:upvote cmd', (web3: Web3) => { .propose([], 'URL5') .sendAndWaitForReceipt({ from: accounts[0], value: minDeposit }) - await timeTravel(dequeueFrequency, web3) - await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], web3) - await testLocallyWithWeb3Node(Lock, ['--from', accounts[0], '--value', '100'], web3) + await timeTravel(dequeueFrequency, client) + await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], client) + await testLocallyWithWeb3Node(Lock, ['--from', accounts[0], '--value', '100'], client) }) test('will dequeue proposal if ready', async () => { await testLocallyWithWeb3Node( Upvote, ['--proposalID', proposalID2.toString(10), '--from', accounts[0]], - web3 + client ) const queue = await governance.getQueue() @@ -79,7 +78,7 @@ testWithAnvilL2('governance:upvote cmd', (web3: Web3) => { await testLocallyWithWeb3Node( Upvote, ['--proposalID', proposalID5.toString(10), '--from', accounts[0]], - web3 + client ) const queue = await governance.getQueue() diff --git a/packages/cli/src/commands/governance/vote.test.ts b/packages/cli/src/commands/governance/vote.test.ts index e1c93cd4a..1802c36d7 100644 --- a/packages/cli/src/commands/governance/vote.test.ts +++ b/packages/cli/src/commands/governance/vote.test.ts @@ -4,7 +4,6 @@ import { GovernanceWrapper } from '@celo/contractkit/lib/wrappers/Governance' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { timeTravel } from '@celo/dev-utils/ganache-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { changeMultiSigOwner } from '../../test-utils/chain-setup' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' @@ -15,16 +14,16 @@ import Vote from './vote' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('governance:vote cmd', (web3: Web3) => { +testWithAnvilL2('governance:vote cmd', (client) => { let minDeposit: string - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const proposalID = new BigNumber(1) let accounts: StrongAddress[] = [] let governance: GovernanceWrapper beforeEach(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] governance = await kit.contracts.getGovernance() minDeposit = (await governance.minDeposit()).toFixed() @@ -32,23 +31,23 @@ testWithAnvilL2('governance:vote cmd', (web3: Web3) => { .propose([], 'URL') .sendAndWaitForReceipt({ from: accounts[0], value: minDeposit }) const dequeueFrequency = (await governance.dequeueFrequency()).toNumber() - await timeTravel(dequeueFrequency, web3) - await testLocallyWithWeb3Node(Dequeue, ['--from', accounts[0]], web3) + await timeTravel(dequeueFrequency, client) + await testLocallyWithWeb3Node(Dequeue, ['--from', accounts[0]], client) await changeMultiSigOwner(kit, accounts[0]) await testLocallyWithWeb3Node( Approve, ['--from', accounts[0], '--proposalID', proposalID.toString(10), '--useMultiSig'], - web3 + client ) - await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], web3) - await testLocallyWithWeb3Node(Lock, ['--from', accounts[0], '--value', '100'], web3) + await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], client) + await testLocallyWithWeb3Node(Lock, ['--from', accounts[0], '--value', '100'], client) }) test('can vote yes', async () => { await testLocallyWithWeb3Node( Vote, ['--from', accounts[0], '--proposalID', proposalID.toString(10), '--value', 'Yes'], - web3 + client ) const votes = await governance.getVotes(proposalID) expect(votes.Yes.toNumber()).toEqual(100) diff --git a/packages/cli/src/commands/governance/votePartially.test.ts b/packages/cli/src/commands/governance/votePartially.test.ts index ce8059303..0b0ea775b 100644 --- a/packages/cli/src/commands/governance/votePartially.test.ts +++ b/packages/cli/src/commands/governance/votePartially.test.ts @@ -4,7 +4,6 @@ import { GovernanceWrapper } from '@celo/contractkit/lib/wrappers/Governance' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { timeTravel } from '@celo/dev-utils/ganache-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { changeMultiSigOwner } from '../../test-utils/chain-setup' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' @@ -15,16 +14,16 @@ import VotePartially from './votePartially' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('governance:vote-partially cmd', (web3: Web3) => { +testWithAnvilL2('governance:vote-partially cmd', (client) => { let minDeposit: string - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const proposalID = new BigNumber(1) let accounts: StrongAddress[] = [] let governance: GovernanceWrapper beforeEach(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] governance = await kit.contracts.getGovernance() minDeposit = (await governance.minDeposit()).toFixed() @@ -32,16 +31,16 @@ testWithAnvilL2('governance:vote-partially cmd', (web3: Web3) => { .propose([], 'URL') .sendAndWaitForReceipt({ from: accounts[0], value: minDeposit }) const dequeueFrequency = (await governance.dequeueFrequency()).toNumber() - await timeTravel(dequeueFrequency + 1, web3) - await testLocallyWithWeb3Node(Dequeue, ['--from', accounts[0]], web3) + await timeTravel(dequeueFrequency + 1, client) + await testLocallyWithWeb3Node(Dequeue, ['--from', accounts[0]], client) await changeMultiSigOwner(kit, accounts[0]) await testLocallyWithWeb3Node( Approve, ['--from', accounts[0], '--proposalID', proposalID.toString(10), '--useMultiSig'], - web3 + client ) - await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], web3) - await testLocallyWithWeb3Node(Lock, ['--from', accounts[0], '--value', '100'], web3) + await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], client) + await testLocallyWithWeb3Node(Lock, ['--from', accounts[0], '--value', '100'], client) }) test('can vote partially yes and no', async () => { @@ -59,7 +58,7 @@ testWithAnvilL2('governance:vote-partially cmd', (web3: Web3) => { '--abstain', '0', ], - web3 + client ) const votes = await governance.getVotes(proposalID) expect(votes.Yes.toNumber()).toEqual(10) diff --git a/packages/cli/src/commands/governance/withdraw.test.ts b/packages/cli/src/commands/governance/withdraw.test.ts index 2d6be1f0f..e8af5811e 100644 --- a/packages/cli/src/commands/governance/withdraw.test.ts +++ b/packages/cli/src/commands/governance/withdraw.test.ts @@ -7,7 +7,6 @@ import { timeTravel } from '@celo/dev-utils/ganache-test' import { ProposalBuilder } from '@celo/governance' import Safe, { getSafeAddressFromDeploymentTx } from '@safe-global/protocol-kit' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { deployMultiCall } from '../../test-utils/multicall' import { createMultisig, setupSafeContracts } from '../../test-utils/multisigUtils' @@ -17,12 +16,12 @@ process.env.NO_SYNCCHECK = 'true' testWithAnvilL2( 'governance:withdraw', - (web3: Web3) => { + (client) => { const logMock = jest.spyOn(console, 'log') const errorMock = jest.spyOn(console, 'error') let minDeposit: string - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) let accounts: StrongAddress[] = [] let governance: GovernanceWrapper @@ -31,9 +30,9 @@ testWithAnvilL2( logMock.mockClear().mockImplementation() errorMock.mockClear().mockImplementation() - await deployMultiCall(web3, '0xcA11bde05977b3631167028862bE2a173976CA11') + await deployMultiCall(client, '0xcA11bde05977b3631167028862bE2a173976CA11') - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] governance = await kit.contracts.getGovernance() minDeposit = (await governance.minDeposit()).toFixed() @@ -42,26 +41,26 @@ testWithAnvilL2( .propose(proposal, 'URL') .sendAndWaitForReceipt({ from: accounts[0], value: minDeposit }) const dequeueFrequency = (await governance.dequeueFrequency()).toNumber() - await timeTravel(dequeueFrequency + 1, web3) + await timeTravel(dequeueFrequency + 1, client) await governance.dequeueProposalsIfReady().sendAndWaitForReceipt() }) test('can withdraw', async () => { const balanceBefore = await kit.connection.getBalance(accounts[0]) - await testLocallyWithWeb3Node(Withdraw, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(Withdraw, ['--from', accounts[0]], client) const balanceAfter = await kit.connection.getBalance(accounts[0]) - const latestTransactionReceipt = await web3.eth.getTransactionReceipt( - (await web3.eth.getBlock('latest')).transactions[0] + const latestTransactionReceipt = await client.eth.getTransactionReceipt( + (await client.eth.getBlock('latest')).transactions[0] as string ) // Safety check if the latest transaction was originated by expected account - expect(latestTransactionReceipt.from.toLowerCase()).toEqual(accounts[0].toLowerCase()) + expect(latestTransactionReceipt!.from.toLowerCase()).toEqual(accounts[0].toLowerCase()) const difference = new BigNumber(balanceAfter) .minus(balanceBefore) - .plus(latestTransactionReceipt.effectiveGasPrice * latestTransactionReceipt.gasUsed) + .plus(latestTransactionReceipt!.effectiveGasPrice! * latestTransactionReceipt!.gasUsed) expect(difference.toFixed()).toEqual(minDeposit) @@ -96,7 +95,7 @@ testWithAnvilL2( multisigAddress = await createMultisig(kit, [multisigOwner], 1, 1) await withImpersonatedAccount( - web3, + client, multisigAddress, async () => { await governance @@ -108,11 +107,11 @@ testWithAnvilL2( ) // Zero out the balance for easier testing - await setBalance(web3, multisigAddress, 0) + await setBalance(client, multisigAddress, 0) // Dequeue so the proposal can be refunded const dequeueFrequency = (await governance.dequeueFrequency()).toNumber() - await timeTravel(dequeueFrequency + 1, web3) + await timeTravel(dequeueFrequency + 1, client) await governance.dequeueProposalsIfReady().sendAndWaitForReceipt() }) @@ -123,7 +122,7 @@ testWithAnvilL2( await testLocallyWithWeb3Node( Withdraw, ['--useMultiSig', '--for', multisigAddress, '--from', multisigOwner], - web3 + client ) // After withdrawing the refunded deposit should be the minDeposit (as we zeroed out the balance before) @@ -171,7 +170,7 @@ testWithAnvilL2( testLocallyWithWeb3Node( Withdraw, ['--useMultiSig', '--for', multisigAddress, '--from', otherAccount], - web3 + client ) ).rejects.toMatchInlineSnapshot(`[Error: Some checks didn't pass!]`) @@ -200,10 +199,10 @@ testWithAnvilL2( let owners: StrongAddress[] beforeEach(async () => { - await setupSafeContracts(web3) + await setupSafeContracts(client) owners = [ - (await web3.eth.getAccounts())[0] as StrongAddress, + (await client.eth.getAccounts())[0] as StrongAddress, '0x6C666E57A5E8715cFE93f92790f98c4dFf7b69e2', ] const safeAccountConfig = { @@ -216,11 +215,11 @@ testWithAnvilL2( } const protocolKit = await Safe.init({ predictedSafe: predictSafe, - provider: (web3.currentProvider as any as CeloProvider).toEip1193Provider(), + provider: (client.currentProvider as unknown as CeloProvider).toEip1193Provider(), signer: owners[0], }) const deploymentTransaction = await protocolKit.createSafeDeploymentTransaction() - const receipt = await web3.eth.sendTransaction({ + const receipt = await client.eth.sendTransaction({ from: owners[0], ...deploymentTransaction, }) @@ -231,12 +230,12 @@ testWithAnvilL2( await protocolKit.connect({ safeAddress }) const balance = new BigNumber(minDeposit).multipliedBy(2) - await setBalance(web3, safeAddress, balance) + await setBalance(client, safeAddress, balance) for (const owner of owners) { - await setBalance(web3, owner, balance) + await setBalance(client, owner, balance) } - await withImpersonatedAccount(web3, safeAddress, async () => { + await withImpersonatedAccount(client, safeAddress, async () => { await governance .propose(await new ProposalBuilder(kit).build(), 'http://example.com/proposal.json') .sendAndWaitForReceipt({ from: safeAddress, value: minDeposit }) @@ -244,7 +243,7 @@ testWithAnvilL2( // Dequeue so the proposal can be refunded const dequeueFrequency = (await governance.dequeueFrequency()).toNumber() - await timeTravel(dequeueFrequency + 1, web3) + await timeTravel(dequeueFrequency + 1, client) await governance.dequeueProposalsIfReady().sendAndWaitForReceipt() }) @@ -253,11 +252,11 @@ testWithAnvilL2( const amountBeforeRefund = await kit.connection.getBalance(safeAddress) for (const owner of owners) { - await withImpersonatedAccount(web3, owner, async () => { + await withImpersonatedAccount(client, owner, async () => { await testLocallyWithWeb3Node( Withdraw, ['--from', owner, '--useSafe', '--safeAddress', safeAddress], - web3 + client ) }) if (owner !== owners.at(-1)) { diff --git a/packages/cli/src/commands/lockedcelo/delegate-info.test.ts b/packages/cli/src/commands/lockedcelo/delegate-info.test.ts index c2ecee29c..5d239b7ba 100644 --- a/packages/cli/src/commands/lockedcelo/delegate-info.test.ts +++ b/packages/cli/src/commands/lockedcelo/delegate-info.test.ts @@ -1,5 +1,4 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' import Delegate from './delegate' @@ -8,21 +7,21 @@ import Lock from './lock' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('lockedgold:delegate-info cmd', (web3: Web3) => { +testWithAnvilL2('lockedgold:delegate-info cmd', (client) => { test('gets the info', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const account = accounts[0] const account2 = accounts[1] - await testLocallyWithWeb3Node(Register, ['--from', account], web3) - await testLocallyWithWeb3Node(Register, ['--from', account2], web3) - await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '200'], web3) + await testLocallyWithWeb3Node(Register, ['--from', account], client) + await testLocallyWithWeb3Node(Register, ['--from', account2], client) + await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '200'], client) await testLocallyWithWeb3Node( Delegate, ['--from', account, '--to', account2, '--percent', '100'], - web3 + client ) - await testLocallyWithWeb3Node(DelegateInfo, ['--account', account], web3) + await testLocallyWithWeb3Node(DelegateInfo, ['--account', account], client) }) }) diff --git a/packages/cli/src/commands/lockedcelo/delegate.test.ts b/packages/cli/src/commands/lockedcelo/delegate.test.ts index ffbbfc352..81fb2ecd7 100644 --- a/packages/cli/src/commands/lockedcelo/delegate.test.ts +++ b/packages/cli/src/commands/lockedcelo/delegate.test.ts @@ -1,7 +1,6 @@ import { serializeSignature, StrongAddress } from '@celo/base' import { newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { deployReleaseGoldContract } from '../../test-utils/release-gold' import Register from '../account/register' @@ -12,13 +11,13 @@ import Lock from './lock' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('lockedgold:delegate cmd', (web3: Web3) => { +testWithAnvilL2('lockedgold:delegate cmd', (client) => { it('can not delegate when not an account or a vote signer', async () => { - const [delegator, delegatee] = await web3.eth.getAccounts() - const kit = newKitFromWeb3(web3) + const [delegator, delegatee] = await client.eth.getAccounts() + const kit = newKitFromWeb3(client) const lockedGold = await kit.contracts.getLockedGold() - await testLocallyWithWeb3Node(Register, ['--from', delegatee], web3) + await testLocallyWithWeb3Node(Register, ['--from', delegatee], client) const delegateeVotingPower = await lockedGold.getAccountTotalGovernanceVotingPower(delegatee) @@ -31,7 +30,7 @@ testWithAnvilL2('lockedgold:delegate cmd', (web3: Web3) => { testLocallyWithWeb3Node( Delegate, ['--from', delegator, '--to', delegatee, '--percent', '45'], - web3 + client ) ).rejects.toMatchInlineSnapshot(`[Error: Some checks didn't pass!]`) @@ -58,14 +57,14 @@ testWithAnvilL2('lockedgold:delegate cmd', (web3: Web3) => { }) test('can delegate', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const account = accounts[0] const account2 = accounts[1] - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const lockedGold = await kit.contracts.getLockedGold() - await testLocallyWithWeb3Node(Register, ['--from', account], web3) - await testLocallyWithWeb3Node(Register, ['--from', account2], web3) - await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '200'], web3) + await testLocallyWithWeb3Node(Register, ['--from', account], client) + await testLocallyWithWeb3Node(Register, ['--from', account2], client) + await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '200'], client) const account2OriginalVotingPower = await lockedGold.getAccountTotalGovernanceVotingPower(account2) @@ -74,7 +73,7 @@ testWithAnvilL2('lockedgold:delegate cmd', (web3: Web3) => { await testLocallyWithWeb3Node( Delegate, ['--from', account, '--to', account2, '--percent', '100'], - web3 + client ) const account2VotingPower = await lockedGold.getAccountTotalGovernanceVotingPower(account2) @@ -83,18 +82,18 @@ testWithAnvilL2('lockedgold:delegate cmd', (web3: Web3) => { it('can delegate as a vote signer for releasecelo contract', async () => { const [beneficiary, owner, voteSigner, refundAddress, delegateeAddress] = - (await web3.eth.getAccounts()) as StrongAddress[] - const kit = newKitFromWeb3(web3) + (await client.eth.getAccounts()) as StrongAddress[] + const kit = newKitFromWeb3(client) const accountsWrapper = await kit.contracts.getAccounts() const releaseGoldContractAddress = await deployReleaseGoldContract( - web3, + client, owner, beneficiary, owner, refundAddress ) - await testLocallyWithWeb3Node(CreateAccount, ['--contract', releaseGoldContractAddress], web3) + await testLocallyWithWeb3Node(CreateAccount, ['--contract', releaseGoldContractAddress], client) await testLocallyWithWeb3Node( Authorize, [ @@ -109,9 +108,9 @@ testWithAnvilL2('lockedgold:delegate cmd', (web3: Web3) => { await accountsWrapper.generateProofOfKeyPossession(releaseGoldContractAddress, voteSigner) ), ], - web3 + client ) - await testLocallyWithWeb3Node(Lock, ['--from', beneficiary, '--value', '100'], web3) + await testLocallyWithWeb3Node(Lock, ['--from', beneficiary, '--value', '100'], client) const createAccountTx = await accountsWrapper.createAccount().send({ from: delegateeAddress }) await createAccountTx.waitReceipt() @@ -119,7 +118,7 @@ testWithAnvilL2('lockedgold:delegate cmd', (web3: Web3) => { await testLocallyWithWeb3Node( Delegate, ['--from', voteSigner, '--to', delegateeAddress, '--percent', '100'], - web3 + client ) const lockedGold = await kit.contracts.getLockedGold() diff --git a/packages/cli/src/commands/lockedcelo/lock.test.ts b/packages/cli/src/commands/lockedcelo/lock.test.ts index 39e8c6f94..debc7c589 100644 --- a/packages/cli/src/commands/lockedcelo/lock.test.ts +++ b/packages/cli/src/commands/lockedcelo/lock.test.ts @@ -2,7 +2,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { LONG_TIMEOUT_MS, stripAnsiCodesFromNestedArray, @@ -14,20 +13,20 @@ import Unlock from './unlock' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('lockedgold:lock cmd', (web3: Web3) => { +testWithAnvilL2('lockedgold:lock cmd', (client) => { test( 'can lock with pending withdrawals', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const account = accounts[0] - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const lockedGold = await kit.contracts.getLockedGold() - await testLocallyWithWeb3Node(Register, ['--from', account], web3) - await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '100'], web3) - await testLocallyWithWeb3Node(Unlock, ['--from', account, '--value', '50'], web3) - await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '75'], web3) - await testLocallyWithWeb3Node(Unlock, ['--from', account, '--value', '50'], web3) - await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '50'], web3) + await testLocallyWithWeb3Node(Register, ['--from', account], client) + await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '100'], client) + await testLocallyWithWeb3Node(Unlock, ['--from', account, '--value', '50'], client) + await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '75'], client) + await testLocallyWithWeb3Node(Unlock, ['--from', account, '--value', '50'], client) + await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '50'], client) const pendingWithdrawalsTotalValue = await lockedGold.getPendingWithdrawalsTotalValue(account) expect(pendingWithdrawalsTotalValue.toFixed()).toBe('0') }, @@ -35,9 +34,9 @@ testWithAnvilL2('lockedgold:lock cmd', (web3: Web3) => { ) describe('when EOA is not yet an account', () => { it('performs the registration and locks the value', async () => { - const eoaAddresses = await web3.eth.getAccounts() + const eoaAddresses = await client.eth.getAccounts() const eoa = eoaAddresses[1] - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const accountsContract = await kit.contracts.getAccounts() const lockedGoldContract = await kit.contracts.getLockedGold() @@ -47,7 +46,7 @@ testWithAnvilL2('lockedgold:lock cmd', (web3: Web3) => { // pre check expect(await accountsContract.isAccount(eoa)).toBe(false) - await testLocallyWithWeb3Node(Lock, ['--from', eoa, '--value', '100'], web3) + await testLocallyWithWeb3Node(Lock, ['--from', eoa, '--value', '100'], client) expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls)).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/lockedcelo/revoke-delegate.test.ts b/packages/cli/src/commands/lockedcelo/revoke-delegate.test.ts index 961b07841..0eacdb707 100644 --- a/packages/cli/src/commands/lockedcelo/revoke-delegate.test.ts +++ b/packages/cli/src/commands/lockedcelo/revoke-delegate.test.ts @@ -1,6 +1,5 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' import Delegate from './delegate' @@ -9,21 +8,21 @@ import RevokeDelegate from './revoke-delegate' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('lockedgold:revoke-delegate cmd', (web3: Web3) => { +testWithAnvilL2('lockedgold:revoke-delegate cmd', (client) => { test('can revoke delegate', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const account = accounts[0] const account2 = accounts[1] - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const lockedGold = await kit.contracts.getLockedGold() - await testLocallyWithWeb3Node(Register, ['--from', account], web3) - await testLocallyWithWeb3Node(Register, ['--from', account2], web3) - await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '200'], web3) + await testLocallyWithWeb3Node(Register, ['--from', account], client) + await testLocallyWithWeb3Node(Register, ['--from', account2], client) + await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '200'], client) await testLocallyWithWeb3Node( Delegate, ['--from', account, '--to', account2, '--percent', '100'], - web3 + client ) const account2VotingPower = await lockedGold.getAccountTotalGovernanceVotingPower(account2) @@ -32,7 +31,7 @@ testWithAnvilL2('lockedgold:revoke-delegate cmd', (web3: Web3) => { await testLocallyWithWeb3Node( RevokeDelegate, ['--from', account, '--to', account2, '--percent', '100'], - web3 + client ) const account2VotingPowerAfterRevoke = diff --git a/packages/cli/src/commands/lockedcelo/unlock.test.ts b/packages/cli/src/commands/lockedcelo/unlock.test.ts index 093fca4fd..5827906c8 100644 --- a/packages/cli/src/commands/lockedcelo/unlock.test.ts +++ b/packages/cli/src/commands/lockedcelo/unlock.test.ts @@ -1,7 +1,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' -import Web3 from 'web3' import { LONG_TIMEOUT_MS, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' import Vote from '../election/vote' @@ -14,57 +13,57 @@ import Unlock from './unlock' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('lockedcelo:unlock cmd', (web3: Web3) => { +testWithAnvilL2('lockedcelo:unlock cmd', (client) => { test( 'can unlock correctly from registered validator group', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const account = accounts[0] const validator = accounts[1] - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const lockedGold = await kit.contracts.getLockedGold() - await testLocallyWithWeb3Node(Register, ['--from', account], web3) + await testLocallyWithWeb3Node(Register, ['--from', account], client) await testLocallyWithWeb3Node( Lock, ['--from', account, '--value', '20000000000000000000000'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorGroupRegister, ['--from', account, '--commission', '0', '--yes'], - web3 + client ) - await testLocallyWithWeb3Node(Register, ['--from', validator], web3) + await testLocallyWithWeb3Node(Register, ['--from', validator], client) await testLocallyWithWeb3Node( Lock, ['--from', validator, '--value', '20000000000000000000000'], - web3 + client ) - const ecdsaPublicKey = await addressToPublicKey(validator, web3.eth.sign) + const ecdsaPublicKey = await addressToPublicKey(validator, client.eth.sign) await testLocallyWithWeb3Node( ValidatorRegister, ['--from', validator, '--ecdsaKey', ecdsaPublicKey, '--yes'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorAffiliate, ['--yes', '--from', validator, account], - web3 + client ) await testLocallyWithWeb3Node( ValidatorGroupMember, ['--yes', '--from', account, '--accept', validator], - web3 + client ) await testLocallyWithWeb3Node( Vote, ['--from', account, '--for', account, '--value', '10000000000000000000000'], - web3 + client ) await testLocallyWithWeb3Node( Unlock, ['--from', account, '--value', '10000000000000000000000'], - web3 + client ) const pendingWithdrawalsTotalValue = await lockedGold.getPendingWithdrawalsTotalValue(account) expect(pendingWithdrawalsTotalValue.toFixed()).toBe('10000000000000000000000') diff --git a/packages/cli/src/commands/lockedcelo/update-delegated-amount.test.ts b/packages/cli/src/commands/lockedcelo/update-delegated-amount.test.ts index 8618e069f..dca3e5593 100644 --- a/packages/cli/src/commands/lockedcelo/update-delegated-amount.test.ts +++ b/packages/cli/src/commands/lockedcelo/update-delegated-amount.test.ts @@ -1,5 +1,4 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { LONG_TIMEOUT_MS, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' import Delegate from './delegate' @@ -8,26 +7,26 @@ import UpdateDelegatedAmount from './update-delegated-amount' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('lockedgold:update-delegated-amount cmd', (web3: Web3) => { +testWithAnvilL2('lockedgold:update-delegated-amount cmd', (client) => { test( 'can update delegated amount', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const account = accounts[0] const account2 = accounts[1] - await testLocallyWithWeb3Node(Register, ['--from', account], web3) - await testLocallyWithWeb3Node(Register, ['--from', account2], web3) - await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '200'], web3) + await testLocallyWithWeb3Node(Register, ['--from', account], client) + await testLocallyWithWeb3Node(Register, ['--from', account2], client) + await testLocallyWithWeb3Node(Lock, ['--from', account, '--value', '200'], client) await testLocallyWithWeb3Node( Delegate, ['--from', account, '--to', account2, '--percent', '100'], - web3 + client ) await testLocallyWithWeb3Node( UpdateDelegatedAmount, ['--from', account, '--to', account2], - web3 + client ) }, LONG_TIMEOUT_MS diff --git a/packages/cli/src/commands/multisig/approve.test.ts b/packages/cli/src/commands/multisig/approve.test.ts index 44169c325..30cef5c27 100644 --- a/packages/cli/src/commands/multisig/approve.test.ts +++ b/packages/cli/src/commands/multisig/approve.test.ts @@ -1,7 +1,6 @@ import { StrongAddress } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import ApproveMultiSig from './approve' @@ -9,7 +8,7 @@ import ProposeMultiSig from './propose' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('multisig:approve integration tests', (web3: Web3) => { +testWithAnvilL2('multisig:approve integration tests', (client) => { let kit: ContractKit let accounts: StrongAddress[] let multisigAddress: StrongAddress @@ -19,8 +18,8 @@ testWithAnvilL2('multisig:approve integration tests', (web3: Web3) => { let nonOwner: StrongAddress beforeAll(async () => { - kit = newKitFromWeb3(web3) - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) + accounts = (await client.eth.getAccounts()) as StrongAddress[] // Set up test accounts owner1 = accounts[0] @@ -55,7 +54,7 @@ testWithAnvilL2('multisig:approve integration tests', (web3: Web3) => { await testLocallyWithWeb3Node( ProposeMultiSig, [multisigAddress, '--from', owner1, '--to', recipient, '--value', value], - web3 + client ) // Now approve the transaction using owner2 @@ -69,7 +68,7 @@ testWithAnvilL2('multisig:approve integration tests', (web3: Web3) => { '--tx', '0', // First transaction ], - web3 + client ) expect(logMock).toHaveBeenCalledWith( expect.stringContaining(`The provided address is an owner of the multisig`) @@ -81,7 +80,7 @@ testWithAnvilL2('multisig:approve integration tests', (web3: Web3) => { testLocallyWithWeb3Node( ApproveMultiSig, ['--from', nonOwner, '--for', multisigAddress, '--tx', '0'], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) }) @@ -98,7 +97,7 @@ testWithAnvilL2('multisig:approve integration tests', (web3: Web3) => { '--tx', '999', // Non-existent transaction ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) }) @@ -108,7 +107,7 @@ testWithAnvilL2('multisig:approve integration tests', (web3: Web3) => { testLocallyWithWeb3Node( ApproveMultiSig, ['--from', owner1, '--for', '0x0000000000000000000000000000000000000000', '--tx', '0'], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(` "The contract function "getOwners" returned no data ("0x"). @@ -137,7 +136,7 @@ testWithAnvilL2('multisig:approve integration tests', (web3: Web3) => { await testLocallyWithWeb3Node( ProposeMultiSig, [multisigAddress, '--from', owner1, '--to', recipient, '--value', value], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ @@ -170,7 +169,7 @@ testWithAnvilL2('multisig:approve integration tests', (web3: Web3) => { testLocallyWithWeb3Node( ApproveMultiSig, ['--from', owner2, '--for', multisigAddress, '--tx', '0'], - web3 + client ) ).resolves.toBeUndefined() expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -222,7 +221,7 @@ testWithAnvilL2('multisig:approve integration tests', (web3: Web3) => { testLocallyWithWeb3Node( ApproveMultiSig, ['--from', owner3, '--for', multisigAddress, '--tx', '1'], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) }) diff --git a/packages/cli/src/commands/multisig/propose.test.ts b/packages/cli/src/commands/multisig/propose.test.ts index 9fc8c7c16..b76061abe 100644 --- a/packages/cli/src/commands/multisig/propose.test.ts +++ b/packages/cli/src/commands/multisig/propose.test.ts @@ -1,7 +1,6 @@ import { StrongAddress } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { stripAnsiCodesAndTxHashes, testLocally, @@ -50,7 +49,7 @@ describe('multisig:propose cmd', () => { }) }) -testWithAnvilL2('multisig:propose integration tests', (web3: Web3) => { +testWithAnvilL2('multisig:propose integration tests', (client) => { let kit: ContractKit let accounts: StrongAddress[] let multisigAddress: StrongAddress @@ -60,8 +59,8 @@ testWithAnvilL2('multisig:propose integration tests', (web3: Web3) => { let nonOwner: StrongAddress beforeAll(async () => { - kit = newKitFromWeb3(web3) - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) + accounts = (await client.eth.getAccounts()) as StrongAddress[] // Set up test accounts owner1 = accounts[0] @@ -103,7 +102,7 @@ testWithAnvilL2('multisig:propose integration tests', (web3: Web3) => { const result = await testLocallyWithWeb3Node( ProposeMultiSig, [multisigAddress, '--from', owner1, '--to', recipient, '--value', value], - web3 + client ) expectLogs(logMock).toMatchInlineSnapshot(` [ @@ -121,7 +120,7 @@ testWithAnvilL2('multisig:propose integration tests', (web3: Web3) => { const result = await testLocallyWithWeb3Node( ProposeMultiSig, [multisigAddress, '--from', owner2, '--to', recipient, '--data', data], - web3 + client ) expectLogs(logMock).toMatchInlineSnapshot(` [ @@ -140,7 +139,7 @@ testWithAnvilL2('multisig:propose integration tests', (web3: Web3) => { const result = await testLocallyWithWeb3Node( ProposeMultiSig, [multisigAddress, '--from', owner3, '--to', recipient, '--value', value, '--data', data], - web3 + client ) expectLogs(logMock).toMatchInlineSnapshot(` [ @@ -159,7 +158,7 @@ testWithAnvilL2('multisig:propose integration tests', (web3: Web3) => { testLocallyWithWeb3Node( ProposeMultiSig, [multisigAddress, '--from', nonOwner, '--to', recipient, '--value', value], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) }) @@ -181,7 +180,7 @@ testWithAnvilL2('multisig:propose integration tests', (web3: Web3) => { value, ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(` "The contract function "getOwners" returned no data ("0x"). @@ -216,7 +215,7 @@ testWithAnvilL2('multisig:propose integration tests', (web3: Web3) => { value, ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(` "Parsing --to diff --git a/packages/cli/src/commands/multisig/show.test.ts b/packages/cli/src/commands/multisig/show.test.ts index 0033c856d..994dcc233 100644 --- a/packages/cli/src/commands/multisig/show.test.ts +++ b/packages/cli/src/commands/multisig/show.test.ts @@ -1,7 +1,6 @@ import { StrongAddress } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import ProposeMultiSig from './propose' @@ -9,7 +8,7 @@ import ShowMultiSig from './show' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('multisig:show integration tests', (web3: Web3) => { +testWithAnvilL2('multisig:show integration tests', (client) => { let kit: ContractKit let accounts: StrongAddress[] let multisigAddress: StrongAddress @@ -18,8 +17,8 @@ testWithAnvilL2('multisig:show integration tests', (web3: Web3) => { let owner3: StrongAddress beforeAll(async () => { - kit = newKitFromWeb3(web3) - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) + accounts = (await client.eth.getAccounts()) as StrongAddress[] // Set up test accounts owner1 = accounts[0] @@ -45,7 +44,7 @@ testWithAnvilL2('multisig:show integration tests', (web3: Web3) => { describe('show multisig information', () => { it('shows basic multisig information', async () => { const logMock = jest.spyOn(console, 'log') - await testLocallyWithWeb3Node(ShowMultiSig, [multisigAddress], web3) + await testLocallyWithWeb3Node(ShowMultiSig, [multisigAddress], client) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ [ @@ -69,7 +68,7 @@ testWithAnvilL2('multisig:show integration tests', (web3: Web3) => { await testLocallyWithWeb3Node( ProposeMultiSig, [multisigAddress, '--from', owner1, '--to', recipient, '--value', value], - web3 + client ) const logMock = jest.spyOn(console, 'log') @@ -77,7 +76,7 @@ testWithAnvilL2('multisig:show integration tests', (web3: Web3) => { const result = await testLocallyWithWeb3Node( ShowMultiSig, [multisigAddress, '--tx', '0'], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ @@ -124,7 +123,7 @@ testWithAnvilL2('multisig:show integration tests', (web3: Web3) => { it('shows raw transaction data', async () => { const logMock = jest.spyOn(console, 'log') - await testLocallyWithWeb3Node(ShowMultiSig, [multisigAddress, '--all', '--raw'], web3) + await testLocallyWithWeb3Node(ShowMultiSig, [multisigAddress, '--all', '--raw'], client) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ @@ -144,7 +143,11 @@ testWithAnvilL2('multisig:show integration tests', (web3: Web3) => { it('fails with invalid multisig address', async () => { await expect( - testLocallyWithWeb3Node(ShowMultiSig, ['0x0000000000000000000000000000000000000000'], web3) + testLocallyWithWeb3Node( + ShowMultiSig, + ['0x0000000000000000000000000000000000000000'], + client + ) ).rejects.toThrowErrorMatchingInlineSnapshot(` "The contract function "getTransactionCount" returned no data ("0x"). @@ -167,7 +170,7 @@ testWithAnvilL2('multisig:show integration tests', (web3: Web3) => { const logMock = jest.spyOn(console, 'log') await expect( - testLocallyWithWeb3Node(ShowMultiSig, [multisigAddress, '--tx', '999271717'], web3) + testLocallyWithWeb3Node(ShowMultiSig, [multisigAddress, '--tx', '999271717'], client) ).resolves.toBeUndefined() expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ @@ -198,7 +201,7 @@ testWithAnvilL2('multisig:show integration tests', (web3: Web3) => { await testLocallyWithWeb3Node( ProposeMultiSig, [multisigAddress, '--from', owner3, '--to', recipient, '--data', data], - web3 + client ) const logMock = jest.spyOn(console, 'log') @@ -207,7 +210,7 @@ testWithAnvilL2('multisig:show integration tests', (web3: Web3) => { testLocallyWithWeb3Node( ShowMultiSig, [multisigAddress, '--tx', '2'], // Third transaction - web3 + client ) ).resolves.toBeUndefined() expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` diff --git a/packages/cli/src/commands/multisig/transfer.test.ts b/packages/cli/src/commands/multisig/transfer.test.ts index 4df27f28b..3a377e8da 100644 --- a/packages/cli/src/commands/multisig/transfer.test.ts +++ b/packages/cli/src/commands/multisig/transfer.test.ts @@ -1,14 +1,13 @@ import { StrongAddress } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import MultiSigTransfer from './transfer' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { +testWithAnvilL2('multisig:transfer integration tests', (client) => { let kit: ContractKit let accounts: StrongAddress[] let multisigAddress: StrongAddress @@ -18,8 +17,8 @@ testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { let nonOwner: StrongAddress beforeAll(async () => { - kit = newKitFromWeb3(web3) - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) + accounts = (await client.eth.getAccounts()) as StrongAddress[] console.warn('Accounts:', accounts) // Set up test accounts owner1 = accounts[0] @@ -51,7 +50,7 @@ testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { const result = await testLocallyWithWeb3Node( MultiSigTransfer, [multisigAddress, '--to', recipient, '--amount', amount, '--from', owner1], - web3 + client ) expect(result).toBeUndefined() @@ -65,14 +64,14 @@ testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { await testLocallyWithWeb3Node( MultiSigTransfer, [multisigAddress, '--to', recipient, '--amount', amount, '--from', owner1], - web3 + client ) // Second owner approves the same transfer (should find existing transaction) const result = await testLocallyWithWeb3Node( MultiSigTransfer, [multisigAddress, '--to', recipient, '--amount', amount, '--from', owner2], - web3 + client ) expect(result).toBeUndefined() @@ -98,7 +97,7 @@ testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { '--transferFrom', ], - web3 + client ) ).rejects.toThrow("Some checks didn't pass!") expect(stripAnsiCodesFromNestedArray(spy.mock.calls)).toMatchInlineSnapshot(` @@ -130,7 +129,7 @@ testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { owner1, ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(` "The contract function "getOwners" returned no data ("0x"). @@ -165,7 +164,7 @@ testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { owner1, ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(` "Parsing --to @@ -181,7 +180,7 @@ testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { testLocallyWithWeb3Node( MultiSigTransfer, [multisigAddress, '--to', recipient, '--amount', 'not-a-number', '--from', owner1], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(` "Parsing --amount @@ -207,7 +206,7 @@ testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { owner1, ], - web3 + client ) ).rejects.toThrow() }) @@ -231,7 +230,7 @@ testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { '--from', owner1, ], - web3 + client ) expect(result).toBeUndefined() @@ -259,7 +258,7 @@ testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { '--from', owner1, ], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ @@ -296,7 +295,7 @@ testWithAnvilL2('multisig:transfer integration tests', (web3: Web3) => { '--from', owner2, ], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/network/contracts.test.ts b/packages/cli/src/commands/network/contracts.test.ts index 92086ff04..cbbebaf3a 100644 --- a/packages/cli/src/commands/network/contracts.test.ts +++ b/packages/cli/src/commands/network/contracts.test.ts @@ -6,20 +6,19 @@ import Contracts from './contracts' process.env.NO_SYNCCHECK = 'true' jest.mock('@celo/abis/web3/ICeloVersionedContract') -testWithAnvilL2('network:contracts', (web3) => { +testWithAnvilL2('network:contracts', (client) => { describe('when version can be obtained', () => { beforeEach(() => { jest.unmock('@celo/abis/web3/ICeloVersionedContract') jest.resetModules() const actual = jest.requireActual('@celo/abis/web3/ICeloVersionedContract') - // @ts-expect-error - newICeloVersionedContract.mockImplementation(actual.newICeloVersionedContract) + ;(newICeloVersionedContract as jest.Mock).mockImplementation(actual.newICeloVersionedContract) }) test('runs', async () => { const spy = jest.spyOn(write, 'stdout') const warnSpy = jest.spyOn(console, 'warn') expect(warnSpy.mock.calls).toMatchInlineSnapshot(`[]`) - await testLocallyWithWeb3Node(Contracts, ['--output', 'json'], web3) + await testLocallyWithWeb3Node(Contracts, ['--output', 'json'], client) expect(spy.mock.calls).toMatchSnapshot() }) }) @@ -50,7 +49,7 @@ testWithAnvilL2('network:contracts', (web3) => { const spy = jest.spyOn(write, 'stdout') const warnSpy = jest.spyOn(console, 'warn') - await testLocallyWithWeb3Node(Contracts, ['--output', 'json'], web3) + await testLocallyWithWeb3Node(Contracts, ['--output', 'json'], client) expect(warnSpy.mock.calls).toMatchInlineSnapshot(`[]`) expect(spy.mock.calls).toMatchSnapshot() // see the file for the snapshot }) diff --git a/packages/cli/src/commands/network/info.test.ts b/packages/cli/src/commands/network/info.test.ts index 1562d57b6..3f47bb5f6 100644 --- a/packages/cli/src/commands/network/info.test.ts +++ b/packages/cli/src/commands/network/info.test.ts @@ -6,23 +6,23 @@ import EpochsSwitch from '../epochs/switch' import Info from './info' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('network:info', (web3) => { +testWithAnvilL2('network:info', (client) => { beforeAll(async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const epochManager = await kit.contracts.getEpochManager() const epochDuration = await epochManager.epochDuration() - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() // Switch epochs 3 times for (let i = 0; i < 3; i++) { - await timeTravel(epochDuration * 2, web3) - await testLocallyWithWeb3Node(EpochsSwitch, ['--from', accounts[0], '--delay', '1'], web3) + await timeTravel(epochDuration * 2, client) + await testLocallyWithWeb3Node(EpochsSwitch, ['--from', accounts[0], '--delay', '1'], client) } }) it('runs for latest epoch', async () => { const spy = jest.spyOn(console, 'log') - await testLocallyWithWeb3Node(Info, [], web3) + await testLocallyWithWeb3Node(Info, [], client) expect(stripAnsiCodesFromNestedArray(spy.mock.calls)).toMatchInlineSnapshot(` [ @@ -39,7 +39,7 @@ testWithAnvilL2('network:info', (web3) => { it('runs for last 3 epochs', async () => { const spy = jest.spyOn(console, 'log') - await testLocallyWithWeb3Node(Info, ['--lastN', '3'], web3) + await testLocallyWithWeb3Node(Info, ['--lastN', '3'], client) expect(stripAnsiCodesFromNestedArray(spy.mock.calls)).toMatchInlineSnapshot(` [ @@ -65,7 +65,7 @@ testWithAnvilL2('network:info', (web3) => { it('runs for last 100 epochs, but displays only epoch that exist', async () => { const spy = jest.spyOn(console, 'log') - await testLocallyWithWeb3Node(Info, ['--lastN', '100'], web3) + await testLocallyWithWeb3Node(Info, ['--lastN', '100'], client) expect(stripAnsiCodesFromNestedArray(spy.mock.calls)).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/network/parameters.test.ts b/packages/cli/src/commands/network/parameters.test.ts index 70f319e1f..694b566a8 100644 --- a/packages/cli/src/commands/network/parameters.test.ts +++ b/packages/cli/src/commands/network/parameters.test.ts @@ -4,10 +4,10 @@ import Parameters from './parameters' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('network:parameters', (web3) => { +testWithAnvilL2('network:parameters', (client) => { test('runs', async () => { const spy = jest.spyOn(console, 'log') - await testLocallyWithWeb3Node(Parameters, [], web3) + await testLocallyWithWeb3Node(Parameters, [], client) expect(stripAnsiCodesFromNestedArray(spy.mock.calls)).toMatchInlineSnapshot(` [ [ diff --git a/packages/cli/src/commands/network/whitelist.test.ts b/packages/cli/src/commands/network/whitelist.test.ts index 5796baf7d..f31a40c15 100644 --- a/packages/cli/src/commands/network/whitelist.test.ts +++ b/packages/cli/src/commands/network/whitelist.test.ts @@ -1,12 +1,11 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Whitelist from './whitelist' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('network:whitelist cmd', (web3: Web3) => { +testWithAnvilL2('network:whitelist cmd', (client) => { const writeMock = jest.spyOn(ux.write, 'stdout') afterAll(() => { @@ -14,7 +13,7 @@ testWithAnvilL2('network:whitelist cmd', (web3: Web3) => { }) it('can print the whitelist', async () => { - await testLocallyWithWeb3Node(Whitelist, [], web3) + await testLocallyWithWeb3Node(Whitelist, [], client) expect(stripAnsiCodesFromNestedArray(writeMock.mock.calls)).toMatchInlineSnapshot(` [ @@ -42,7 +41,7 @@ testWithAnvilL2('network:whitelist cmd', (web3: Web3) => { `) }) it('modifies output when formating flag is passed', async () => { - await testLocallyWithWeb3Node(Whitelist, ['--output=json'], web3) + await testLocallyWithWeb3Node(Whitelist, ['--output=json'], client) expect(writeMock.mock.calls).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/releasecelo/admin-revoke.test.ts b/packages/cli/src/commands/releasecelo/admin-revoke.test.ts index ed314e72d..f205ac16f 100644 --- a/packages/cli/src/commands/releasecelo/admin-revoke.test.ts +++ b/packages/cli/src/commands/releasecelo/admin-revoke.test.ts @@ -9,7 +9,6 @@ import { setBalance, testWithAnvilL2, withImpersonatedAccount } from '@celo/dev- import { getContractFromEvent, timeTravel } from '@celo/dev-utils/ganache-test' import BigNumber from 'bignumber.js' import { privateKeyToAddress } from 'viem/accounts' -import Web3 from 'web3' import { topUpWithToken } from '../../test-utils/chain-setup' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' @@ -24,17 +23,17 @@ import LockedCelo from './locked-gold' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:admin-revoke cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:admin-revoke cmd', (client) => { let kit: ContractKit let contractAddress: StrongAddress let releaseGoldWrapper: ReleaseGoldWrapper let accounts: StrongAddress[] beforeEach(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], @@ -42,16 +41,20 @@ testWithAnvilL2('releasegold:admin-revoke cmd', (web3: Web3) => { ) releaseGoldWrapper = new ReleaseGoldWrapper( kit.connection, - newReleaseGold(web3, contractAddress), + newReleaseGold(client, contractAddress), kit.contracts ) }) test('will revoke', async () => { - await testLocallyWithWeb3Node(AdminRevoke, ['--contract', contractAddress, '--yesreally'], web3) + await testLocallyWithWeb3Node( + AdminRevoke, + ['--contract', contractAddress, '--yesreally'], + client + ) const revokedContract = await getContractFromEvent( 'ReleaseScheduleRevoked(uint256,uint256)', - web3 + client ) expect(revokedContract).toBe(contractAddress) }) @@ -62,16 +65,24 @@ testWithAnvilL2('releasegold:admin-revoke cmd', (web3: Web3) => { await stableToken.transfer(contractAddress, 100).send({ from: accounts[0], }) - await testLocallyWithWeb3Node(AdminRevoke, ['--contract', contractAddress, '--yesreally'], web3) + await testLocallyWithWeb3Node( + AdminRevoke, + ['--contract', contractAddress, '--yesreally'], + client + ) const balance = await stableToken.balanceOf(contractAddress) expect(balance.isZero()).toBeTruthy() }) test('will refund and finalize', async () => { - await testLocallyWithWeb3Node(AdminRevoke, ['--contract', contractAddress, '--yesreally'], web3) + await testLocallyWithWeb3Node( + AdminRevoke, + ['--contract', contractAddress, '--yesreally'], + client + ) const destroyedContract = await getContractFromEvent( 'ReleaseGoldInstanceDestroyed(address,address)', - web3 + client ) expect(destroyedContract).toBe(contractAddress) }) @@ -81,12 +92,12 @@ testWithAnvilL2('releasegold:admin-revoke cmd', (web3: Web3) => { beforeEach(async () => { // Make sure the release gold contract has enough funds - await setBalance(web3, contractAddress, new BigNumber(web3.utils.toWei('10', 'ether'))) - await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], web3) + await setBalance(client, contractAddress, new BigNumber(client.utils.toWei('10', 'ether'))) + await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], client) await testLocallyWithWeb3Node( LockedCelo, ['--contract', contractAddress, '--action', 'lock', '--value', value, '--yes'], - web3 + client ) }) @@ -94,7 +105,7 @@ testWithAnvilL2('releasegold:admin-revoke cmd', (web3: Web3) => { await testLocallyWithWeb3Node( AdminRevoke, ['--contract', contractAddress, '--yesreally'], - web3 + client ) const lockedGold = await kit.contracts.getLockedGold() const lockedAmount = await lockedGold.getAccountTotalLockedGold(releaseGoldWrapper.address) @@ -127,7 +138,7 @@ testWithAnvilL2('releasegold:admin-revoke cmd', (web3: Web3) => { '--signature', serializeSignature(pop), ], - web3 + client ) }) @@ -135,7 +146,7 @@ testWithAnvilL2('releasegold:admin-revoke cmd', (web3: Web3) => { await testLocallyWithWeb3Node( AdminRevoke, ['--contract', contractAddress, '--yesreally'], - web3 + client ) const newVoteSigner = await accountsWrapper.getVoteSigner(contractAddress) expect(newVoteSigner).not.toEqual(voteSigner) @@ -153,18 +164,18 @@ testWithAnvilL2('releasegold:admin-revoke cmd', (web3: Web3) => { .sendAndWaitForReceipt({ from: accounts[0], value: minDeposit }) const dequeueFrequency = (await governance.dequeueFrequency()).toNumber() - await timeTravel(dequeueFrequency + 1, web3) + await timeTravel(dequeueFrequency + 1, client) const multiApprover = await governance.getApproverMultisig() await setBalance( - web3, + client, multiApprover.address, - new BigNumber(web3.utils.toWei('10', 'ether')) + new BigNumber(client.utils.toWei('10', 'ether')) ) - await withImpersonatedAccount(web3, multiApprover.address, async () => { + await withImpersonatedAccount(client, multiApprover.address, async () => { await testLocallyWithWeb3Node( Approve, ['--from', multiApprover.address, '--proposalID', '1'], - web3 + client ) }) await testLocallyWithWeb3Node( @@ -179,7 +190,7 @@ testWithAnvilL2('releasegold:admin-revoke cmd', (web3: Web3) => { '--privateKey', PRIVATE_KEY1, ], - web3 + client ) await governance .propose([], 'URL') @@ -190,7 +201,7 @@ testWithAnvilL2('releasegold:admin-revoke cmd', (web3: Web3) => { await testLocallyWithWeb3Node( GovernanceUpvote, ['--from', voteSigner, '--proposalID', '3', '--privateKey', PRIVATE_KEY1], - web3 + client ) }) @@ -200,7 +211,7 @@ testWithAnvilL2('releasegold:admin-revoke cmd', (web3: Web3) => { await testLocallyWithWeb3Node( AdminRevoke, ['--contract', contractAddress, '--yesreally'], - web3 + client ) const isVotingAfter = await governance.isVoting(contractAddress) expect(isVotingAfter).toBeFalsy() diff --git a/packages/cli/src/commands/releasecelo/authorize.test.ts b/packages/cli/src/commands/releasecelo/authorize.test.ts index 8e5321cb7..b8e23f87f 100644 --- a/packages/cli/src/commands/releasecelo/authorize.test.ts +++ b/packages/cli/src/commands/releasecelo/authorize.test.ts @@ -3,7 +3,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { setBalance, testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { addressToPublicKey, serializeSignature } from '@celo/utils/lib/signatureUtils' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import { deployReleaseGoldContract } from '../../test-utils/release-gold' @@ -14,16 +13,16 @@ import LockedCelo from './locked-gold' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:authorize cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:authorize cmd', (client) => { let contractAddress: string let kit: any let logSpy: jest.SpyInstance beforeEach(async () => { - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], @@ -32,11 +31,11 @@ testWithAnvilL2('releasegold:authorize cmd', (web3: Web3) => { ) // contract needs to have sufficient funds to lock CELO await setBalance( - web3, + client, contractAddress as StrongAddress, - new BigNumber(web3.utils.toWei('100000', 'ether')) + new BigNumber(client.utils.toWei('100000', 'ether')) ) - await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], web3) + await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], client) }) describe('can authorize account signers', () => { @@ -44,7 +43,7 @@ testWithAnvilL2('releasegold:authorize cmd', (web3: Web3) => { let accounts: any beforeEach(async () => { - accounts = await web3.eth.getAccounts() + accounts = await client.eth.getAccounts() const accountsWrapper = await kit.contracts.getAccounts() pop = await accountsWrapper.generateProofOfKeyPossession(contractAddress, accounts[1]) logSpy = jest.spyOn(console, 'log') @@ -64,7 +63,7 @@ testWithAnvilL2('releasegold:authorize cmd', (web3: Web3) => { '--signature', serializeSignature(pop), ], - web3 + client ) ).resolves.toBeUndefined() expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls)).toMatchInlineSnapshot(` @@ -102,7 +101,7 @@ testWithAnvilL2('releasegold:authorize cmd', (web3: Web3) => { '--signature', serializeSignature(pop), ], - web3 + client ) ).resolves.toBeUndefined() expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls)).toMatchInlineSnapshot(` @@ -161,7 +160,7 @@ testWithAnvilL2('releasegold:authorize cmd', (web3: Web3) => { '--signature', serializeSignature(pop), ], - web3 + client ) ).resolves.toBeUndefined() expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls)).toMatchInlineSnapshot(` @@ -205,11 +204,11 @@ testWithAnvilL2('releasegold:authorize cmd', (web3: Web3) => { }) test('can register as a validator from an authorized signer', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() const accountsWrapper = await kit.contracts.getAccounts() const signer = accounts[1] const pop = await accountsWrapper.generateProofOfKeyPossession(contractAddress, signer) - const ecdsaPublicKey = await addressToPublicKey(signer, web3.eth.sign) + const ecdsaPublicKey = await addressToPublicKey(signer, client.eth.sign) await expect( testLocallyWithWeb3Node( LockedCelo, @@ -222,7 +221,7 @@ testWithAnvilL2('releasegold:authorize cmd', (web3: Web3) => { '10000000000000000000000', '--yes', ], - web3 + client ) ).resolves.toBeUndefined() await expect( @@ -238,20 +237,20 @@ testWithAnvilL2('releasegold:authorize cmd', (web3: Web3) => { '--signature', serializeSignature(pop), ], - web3 + client ) ).resolves.toBeUndefined() await expect( testLocallyWithWeb3Node( ValidatorRegister, ['--from', signer, '--ecdsaKey', ecdsaPublicKey, '--yes'], - web3 + client ) ).resolves.toBeUndefined() }) test('fails if contract is not registered as an account', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() await expect( testLocallyWithWeb3Node( Authorize, @@ -266,7 +265,7 @@ testWithAnvilL2('releasegold:authorize cmd', (web3: Web3) => { '0x1b9fca4bbb5bfb1dbe69ef1cddbd9b4202dcb6b134c5170611e1e36ecfa468d7b46c85328d504934fce6c2a1571603a50ae224d2b32685e84d4d1a1eebad8452eb', ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot( `"Unable to parse signature (expected signer 0x6Ecbe1DB9EF729CBe972C83Fb886247691Fb6beb)"` diff --git a/packages/cli/src/commands/releasecelo/create-account.test.ts b/packages/cli/src/commands/releasecelo/create-account.test.ts index 0004c679f..27800c942 100644 --- a/packages/cli/src/commands/releasecelo/create-account.test.ts +++ b/packages/cli/src/commands/releasecelo/create-account.test.ts @@ -1,7 +1,6 @@ import { StrongAddress } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import { deployReleaseGoldContract } from '../../test-utils/release-gold' @@ -9,16 +8,16 @@ import CreateAccount from './create-account' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:create-account cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:create-account cmd', (client) => { let contractAddress: string let kit: ContractKit beforeEach(async () => { - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], @@ -31,7 +30,7 @@ testWithAnvilL2('releasegold:create-account cmd', (web3: Web3) => { expect(await accountWrapper.isAccount(contractAddress)).toBeFalsy() - await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], web3) + await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], client) expect(await accountWrapper.isAccount(contractAddress)).toBeTruthy() }) diff --git a/packages/cli/src/commands/releasecelo/locked-gold.test.ts b/packages/cli/src/commands/releasecelo/locked-gold.test.ts index 2a6ec6ac0..70e2a018d 100644 --- a/packages/cli/src/commands/releasecelo/locked-gold.test.ts +++ b/packages/cli/src/commands/releasecelo/locked-gold.test.ts @@ -1,7 +1,6 @@ import { StrongAddress } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { LONG_TIMEOUT_MS, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import { deployReleaseGoldContract } from '../../test-utils/release-gold' @@ -10,23 +9,23 @@ import LockedCelo from './locked-gold' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:locked-gold cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:locked-gold cmd', (client) => { let contractAddress: string let kit: ContractKit beforeEach(async () => { - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], accounts[2] ) - await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], web3) + await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], client) }) test( @@ -36,22 +35,22 @@ testWithAnvilL2('releasegold:locked-gold cmd', (web3: Web3) => { await testLocallyWithWeb3Node( LockedCelo, ['--contract', contractAddress, '--action', 'lock', '--value', '100'], - web3 + client ) await testLocallyWithWeb3Node( LockedCelo, ['--contract', contractAddress, '--action', 'unlock', '--value', '50'], - web3 + client ) await testLocallyWithWeb3Node( LockedCelo, ['--contract', contractAddress, '--action', 'lock', '--value', '75'], - web3 + client ) await testLocallyWithWeb3Node( LockedCelo, ['--contract', contractAddress, '--action', 'unlock', '--value', '50'], - web3 + client ) const pendingWithdrawalsTotalValue = await lockedGold.getPendingWithdrawalsTotalValue(contractAddress) diff --git a/packages/cli/src/commands/releasecelo/refund-and-finalize.test.ts b/packages/cli/src/commands/releasecelo/refund-and-finalize.test.ts index 14b3eb70a..3387865d2 100644 --- a/packages/cli/src/commands/releasecelo/refund-and-finalize.test.ts +++ b/packages/cli/src/commands/releasecelo/refund-and-finalize.test.ts @@ -4,7 +4,6 @@ import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { ReleaseGoldWrapper } from '@celo/contractkit/lib/wrappers/ReleaseGold' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { getContractFromEvent } from '@celo/dev-utils/ganache-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import { deployReleaseGoldContract } from '../../test-utils/release-gold' @@ -13,16 +12,16 @@ import Revoke from './revoke' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:refund-and-finalize cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:refund-and-finalize cmd', (client) => { let contractAddress: any let kit: ContractKit beforeEach(async () => { - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], @@ -31,15 +30,15 @@ testWithAnvilL2('releasegold:refund-and-finalize cmd', (web3: Web3) => { }) test('can refund celo', async () => { - await testLocallyWithWeb3Node(Revoke, ['--contract', contractAddress, '--yesreally'], web3) + await testLocallyWithWeb3Node(Revoke, ['--contract', contractAddress, '--yesreally'], client) const releaseGoldWrapper = new ReleaseGoldWrapper( kit.connection, - newReleaseGold(web3, contractAddress), + newReleaseGold(client, contractAddress), kit.contracts ) const refundAddress = await releaseGoldWrapper.getRefundAddress() const balanceBefore = await kit.getTotalBalance(refundAddress) - await testLocallyWithWeb3Node(RefundAndFinalize, ['--contract', contractAddress], web3) + await testLocallyWithWeb3Node(RefundAndFinalize, ['--contract', contractAddress], client) const balanceAfter = await kit.getTotalBalance(refundAddress) expect(balanceBefore.CELO!.toNumber()).toBeLessThan(balanceAfter.CELO!.toNumber()) }) @@ -47,22 +46,22 @@ testWithAnvilL2('releasegold:refund-and-finalize cmd', (web3: Web3) => { test('can finalize the contract', async () => { const releaseGoldWrapper = new ReleaseGoldWrapper( kit.connection, - newReleaseGold(web3, contractAddress), + newReleaseGold(client, contractAddress), kit.contracts ) expect(await releaseGoldWrapper.isRevoked()).toBe(false) - await testLocallyWithWeb3Node(Revoke, ['--contract', contractAddress, '--yesreally'], web3) + await testLocallyWithWeb3Node(Revoke, ['--contract', contractAddress, '--yesreally'], client) expect(await releaseGoldWrapper.isRevoked()).toBe(true) // Contract still should have some balance expect((await kit.getTotalBalance(contractAddress)).CELO).not.toEqBigNumber(0) - await testLocallyWithWeb3Node(RefundAndFinalize, ['--contract', contractAddress], web3) + await testLocallyWithWeb3Node(RefundAndFinalize, ['--contract', contractAddress], client) const destroyedContractAddress = await getContractFromEvent( 'ReleaseGoldInstanceDestroyed(address,address)', - web3 + client ) expect(destroyedContractAddress).toBe(contractAddress) diff --git a/packages/cli/src/commands/releasecelo/set-account.test.ts b/packages/cli/src/commands/releasecelo/set-account.test.ts index 4527d2b45..2ff3e435a 100644 --- a/packages/cli/src/commands/releasecelo/set-account.test.ts +++ b/packages/cli/src/commands/releasecelo/set-account.test.ts @@ -1,7 +1,6 @@ import { StrongAddress } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import { deployReleaseGoldContract } from '../../test-utils/release-gold' @@ -10,23 +9,23 @@ import SetAccount from './set-account' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:set-account cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:set-account cmd', (client) => { let contractAddress: string let kit: ContractKit beforeEach(async () => { - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], accounts[2] ) - await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], web3) + await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], client) }) it('sets all the properties', async () => { @@ -37,7 +36,7 @@ testWithAnvilL2('releasegold:set-account cmd', (web3: Web3) => { await testLocallyWithWeb3Node( SetAccount, ['--contract', contractAddress, '--property', 'name', '--value', 'test-name'], - web3 + client ) await testLocallyWithWeb3Node( @@ -50,13 +49,13 @@ testWithAnvilL2('releasegold:set-account cmd', (web3: Web3) => { '--value', TEST_ENCRYPTION_KEY, ], - web3 + client ) await testLocallyWithWeb3Node( SetAccount, ['--contract', contractAddress, '--property', 'metaURL', '--value', 'test-url'], - web3 + client ) expect(await accountWrapper.getName(contractAddress)).toEqual('test-name') @@ -69,7 +68,7 @@ testWithAnvilL2('releasegold:set-account cmd', (web3: Web3) => { testLocallyWithWeb3Node( SetAccount, ['--contract', contractAddress, '--property', 'unknown', '--value', 'test-value'], - web3 + client ) ).rejects.toMatchInlineSnapshot(` [Error: Expected --property=unknown to be one of: name, dataEncryptionKey, metaURL diff --git a/packages/cli/src/commands/releasecelo/set-beneficiary.test.ts b/packages/cli/src/commands/releasecelo/set-beneficiary.test.ts index 99968077e..1896d27e0 100644 --- a/packages/cli/src/commands/releasecelo/set-beneficiary.test.ts +++ b/packages/cli/src/commands/releasecelo/set-beneficiary.test.ts @@ -3,7 +3,6 @@ import { StrongAddress } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { ReleaseGoldWrapper } from '@celo/contractkit/lib/wrappers/ReleaseGold' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import { deployReleaseGoldContract } from '../../test-utils/release-gold' @@ -11,7 +10,7 @@ import SetBeneficiary from './set-beneficiary' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:set-beneficiary cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:set-beneficiary cmd', (client) => { let contractAddress: any let kit: ContractKit let releaseGoldWrapper: ReleaseGoldWrapper @@ -23,8 +22,8 @@ testWithAnvilL2('releasegold:set-beneficiary cmd', (web3: Web3) => { let refundAddress: StrongAddress beforeEach(async () => { - kit = newKitFromWeb3(web3) - const accounts = await web3.eth.getAccounts() + kit = newKitFromWeb3(client) + const accounts = await client.eth.getAccounts() releaseOwner = accounts[0] as StrongAddress beneficiary = accounts[1] as StrongAddress @@ -33,7 +32,7 @@ testWithAnvilL2('releasegold:set-beneficiary cmd', (web3: Web3) => { refundAddress = accounts[4] as StrongAddress contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), beneficiary, releaseOwner, @@ -42,7 +41,7 @@ testWithAnvilL2('releasegold:set-beneficiary cmd', (web3: Web3) => { releaseGoldWrapper = new ReleaseGoldWrapper( kit.connection, - newReleaseGold(web3, contractAddress), + newReleaseGold(client, contractAddress), kit.contracts ) beneficiary = await releaseGoldWrapper.getBeneficiary() @@ -63,7 +62,7 @@ testWithAnvilL2('releasegold:set-beneficiary cmd', (web3: Web3) => { newBeneficiary, '--yesreally', ], - web3 + client ) // The multisig tx should not confirm until both parties submit expect(await releaseGoldWrapper.getBeneficiary()).toEqual(beneficiary) @@ -78,7 +77,7 @@ testWithAnvilL2('releasegold:set-beneficiary cmd', (web3: Web3) => { newBeneficiary, '--yesreally', ], - web3 + client ) expect(await releaseGoldWrapper.getBeneficiary()).toEqual(newBeneficiary) // It should also update the multisig owners @@ -98,7 +97,7 @@ testWithAnvilL2('releasegold:set-beneficiary cmd', (web3: Web3) => { newBeneficiary, '--yesreally', ], - web3 + client ) ).rejects.toThrow() }) @@ -117,7 +116,7 @@ testWithAnvilL2('releasegold:set-beneficiary cmd', (web3: Web3) => { newBeneficiary, '--yesreally', ], - web3 + client ) await testLocallyWithWeb3Node( SetBeneficiary, @@ -130,7 +129,7 @@ testWithAnvilL2('releasegold:set-beneficiary cmd', (web3: Web3) => { otherAccount, '--yesreally', ], - web3 + client ) expect(await releaseGoldWrapper.getBeneficiary()).toEqual(beneficiary) expect(await releaseGoldMultiSig.getOwners()).toEqual([releaseOwner, beneficiary]) diff --git a/packages/cli/src/commands/releasecelo/set-can-expire.test.ts b/packages/cli/src/commands/releasecelo/set-can-expire.test.ts index fb6b68f51..b2446fc10 100644 --- a/packages/cli/src/commands/releasecelo/set-can-expire.test.ts +++ b/packages/cli/src/commands/releasecelo/set-can-expire.test.ts @@ -3,7 +3,6 @@ import { StrongAddress } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { ReleaseGoldWrapper } from '@celo/contractkit/lib/wrappers/ReleaseGold' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { stripAnsiCodesAndTxHashes, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import { deployReleaseGoldContract } from '../../test-utils/release-gold' @@ -11,16 +10,16 @@ import SetCanExpire from './set-can-expire' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:set-can-expire cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:set-can-expire cmd', (client) => { let contractAddress: string let kit: ContractKit beforeEach(async () => { - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], @@ -35,7 +34,7 @@ testWithAnvilL2('releasegold:set-can-expire cmd', (web3: Web3) => { testLocallyWithWeb3Node( SetCanExpire, ['--contract', contractAddress, '--value', 'true', '--yesreally'], - web3 + client ) ).rejects.toMatchInlineSnapshot(`[Error: Some checks didn't pass!]`) @@ -63,7 +62,7 @@ testWithAnvilL2('releasegold:set-can-expire cmd', (web3: Web3) => { await testLocallyWithWeb3Node( SetCanExpire, ['--contract', contractAddress, '--value', 'false', '--yesreally'], - web3 + client ) expect((await releaseGoldWrapper.getRevocationInfo()).canExpire).toBeFalsy() @@ -71,7 +70,7 @@ testWithAnvilL2('releasegold:set-can-expire cmd', (web3: Web3) => { await testLocallyWithWeb3Node( SetCanExpire, ['--contract', contractAddress, '--value', 'true', '--yesreally'], - web3 + client ) expect((await releaseGoldWrapper.getRevocationInfo()).canExpire).toBeTruthy() diff --git a/packages/cli/src/commands/releasecelo/set-liquidity-provision.test.ts b/packages/cli/src/commands/releasecelo/set-liquidity-provision.test.ts index 8fad6efde..69ef63fe4 100644 --- a/packages/cli/src/commands/releasecelo/set-liquidity-provision.test.ts +++ b/packages/cli/src/commands/releasecelo/set-liquidity-provision.test.ts @@ -3,7 +3,6 @@ import { StrongAddress } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { ReleaseGoldWrapper } from '@celo/contractkit/lib/wrappers/ReleaseGold' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import { deployReleaseGoldContract } from '../../test-utils/release-gold' @@ -11,16 +10,16 @@ import SetLiquidityProvision from './set-liquidity-provision' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:set-liquidity-provision cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:set-liquidity-provision cmd', (client) => { let contractAddress: string let kit: ContractKit beforeEach(async () => { - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], @@ -40,7 +39,7 @@ testWithAnvilL2('releasegold:set-liquidity-provision cmd', (web3: Web3) => { await testLocallyWithWeb3Node( SetLiquidityProvision, ['--contract', contractAddress, '--yesreally'], - web3 + client ) expect(await releaseGoldWrapper.getLiquidityProvisionMet()).toBeTruthy() diff --git a/packages/cli/src/commands/releasecelo/set-max-distribution.test.ts b/packages/cli/src/commands/releasecelo/set-max-distribution.test.ts index 5197f118f..b92d4c53c 100644 --- a/packages/cli/src/commands/releasecelo/set-max-distribution.test.ts +++ b/packages/cli/src/commands/releasecelo/set-max-distribution.test.ts @@ -3,7 +3,6 @@ import { StrongAddress } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { ReleaseGoldWrapper } from '@celo/contractkit/lib/wrappers/ReleaseGold' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { stripAnsiCodesAndTxHashes, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import { deployReleaseGoldContract } from '../../test-utils/release-gold' @@ -11,16 +10,16 @@ import SetMaxDistribution from './set-max-distribution' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:set-max-distribution cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:set-max-distribution cmd', (client) => { let contractAddress: string let kit: ContractKit beforeEach(async () => { - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], @@ -39,11 +38,11 @@ testWithAnvilL2('releasegold:set-max-distribution cmd', (web3: Web3) => { await testLocallyWithWeb3Node( SetMaxDistribution, ['--contract', contractAddress, '--distributionRatio', '500', '--yesreally'], - web3 + client ) expect((await releaseGoldWrapper.getMaxDistribution()).toFixed()).toEqual( - web3.utils.toWei('20', 'ether') + client.utils.toWei('20', 'ether') ) }) @@ -54,7 +53,7 @@ testWithAnvilL2('releasegold:set-max-distribution cmd', (web3: Web3) => { testLocallyWithWeb3Node( SetMaxDistribution, ['--contract', contractAddress, '--distributionRatio', '1500', '--yesreally'], - web3 + client ) ).rejects.toMatchInlineSnapshot(`[Error: Some checks didn't pass!]`) diff --git a/packages/cli/src/commands/releasecelo/show.test.ts b/packages/cli/src/commands/releasecelo/show.test.ts index 8eef8e35f..43660d91d 100644 --- a/packages/cli/src/commands/releasecelo/show.test.ts +++ b/packages/cli/src/commands/releasecelo/show.test.ts @@ -4,7 +4,6 @@ import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { unixSecondsTimestampToDateString } from '@celo/contractkit/lib/wrappers/BaseWrapper' import { ReleaseGoldWrapper } from '@celo/contractkit/lib/wrappers/ReleaseGold' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { stripAnsiCodesAndTxHashes, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' import { deployReleaseGoldContract } from '../../test-utils/release-gold' @@ -12,16 +11,16 @@ import Show from './show' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:show cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:show cmd', (client) => { let contractAddress: string let kit: ContractKit beforeEach(async () => { - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], @@ -37,7 +36,7 @@ testWithAnvilL2('releasegold:show cmd', (web3: Web3) => { kit.contracts ) - await testLocallyWithWeb3Node(Show, ['--contract', contractAddress], web3) + await testLocallyWithWeb3Node(Show, ['--contract', contractAddress], client) const schedule = await releaseGoldWrapper.getReleaseSchedule() diff --git a/packages/cli/src/commands/releasecelo/transfer-dollars.test.ts b/packages/cli/src/commands/releasecelo/transfer-dollars.test.ts index d0bf9c930..1c5b14ae6 100644 --- a/packages/cli/src/commands/releasecelo/transfer-dollars.test.ts +++ b/packages/cli/src/commands/releasecelo/transfer-dollars.test.ts @@ -7,7 +7,6 @@ import { ACCOUNT_PRIVATE_KEYS } from '@celo/dev-utils/test-accounts' import { TEST_BASE_FEE, TEST_GAS_PRICE } from '@celo/dev-utils/test-utils' import BigNumber from 'bignumber.js' import { formatEther, toHex } from 'viem' -import Web3 from 'web3' import { topUpWithToken } from '../../test-utils/chain-setup' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' @@ -22,14 +21,14 @@ process.env.NO_SYNCCHECK = 'true' // Lots of commands, sometimes times out jest.setTimeout(15000) -testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:transfer-dollars cmd', (client) => { let accounts: StrongAddress[] = [] let contractAddress: any let kit: ContractKit beforeEach(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) jest.spyOn(console, 'log').mockImplementation(() => { // noop }) @@ -38,7 +37,7 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { }) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], @@ -50,8 +49,8 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { jest.spyOn(kit.connection, 'getMaxPriorityFeePerGas').mockImplementation(async () => { return toHex(TEST_GAS_PRICE - TEST_BASE_FEE) }) - await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], web3) - await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], web3) + await testLocallyWithWeb3Node(Register, ['--from', accounts[0]], client) + await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], client) }) afterEach(() => { @@ -63,7 +62,7 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { kit, StableToken.USDm, accounts[0], - new BigNumber(web3.utils.toWei('1000', 'ether')) + new BigNumber(client.utils.toWei('1000', 'ether')) ) jest.clearAllMocks() const logSpy = jest.spyOn(console, 'log') @@ -73,7 +72,7 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { testLocallyWithWeb3Node( TransferDollars, ['--from', accounts[0], '--to', contractAddress, '--value', USDmToTransfer], - web3 + client ) ).resolves.toBeUndefined() expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls)).toMatchInlineSnapshot(` @@ -108,7 +107,7 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { ] `) jest.clearAllMocks() - await mineBlocks(2, web3) + await mineBlocks(2, client) // RG USDm balance should match the amount sent const contractBalance = await kit.getTotalBalance(contractAddress) expect(contractBalance.USDm!.toFixed()).toEqual(USDmToTransfer) @@ -126,7 +125,7 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { '--privateKey', ACCOUNT_PRIVATE_KEYS[1], ], - web3 + client ) ).resolves.toBeUndefined() @@ -145,7 +144,7 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { testLocallyWithWeb3Node( RGTransferDollars, ['--contract', contractAddress, '--to', accounts[0], '--value', value.toString()], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls).at(-1)).toMatchInlineSnapshot(` @@ -159,7 +158,7 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { kit, StableToken.USDm, accounts[0], - new BigNumber(web3.utils.toWei('1000', 'ether')) + new BigNumber(client.utils.toWei('1000', 'ether')) ) const spy = jest.spyOn(console, 'log') const USDmToTransfer = '500000000000000000000' @@ -167,14 +166,14 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { await testLocallyWithWeb3Node( TransferDollars, ['--from', accounts[0], '--to', contractAddress, '--value', USDmToTransfer], - web3 + client ) await expect( testLocallyWithWeb3Node( RGTransferDollars, ['--contract', contractAddress, '--to', SANCTIONED_ADDRESSES[0], '--value', '10'], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(spy).toHaveBeenCalledWith(expect.stringContaining(COMPLIANT_ERROR_RESPONSE)) @@ -185,7 +184,7 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { kit, StableToken.USDm, accounts[0], - new BigNumber(web3.utils.toWei('1000', 'ether')) + new BigNumber(client.utils.toWei('1000', 'ether')) ) const spy = jest.spyOn(console, 'log') const USDmToTransfer = '500000000000000000000' @@ -193,7 +192,7 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { await testLocallyWithWeb3Node( TransferDollars, ['--from', accounts[0], '--to', contractAddress, '--value', USDmToTransfer], - web3 + client ) // Try to transfer using account[2] which is neither beneficiary nor release owner @@ -210,7 +209,7 @@ testWithAnvilL2('releasegold:transfer-dollars cmd', (web3: Web3) => { '--privateKey', ACCOUNT_PRIVATE_KEYS[2], ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) diff --git a/packages/cli/src/commands/releasecelo/withdraw.test.ts b/packages/cli/src/commands/releasecelo/withdraw.test.ts index d40e56c60..ddb9197cf 100644 --- a/packages/cli/src/commands/releasecelo/withdraw.test.ts +++ b/packages/cli/src/commands/releasecelo/withdraw.test.ts @@ -6,7 +6,6 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { getContractFromEvent, timeTravel } from '@celo/dev-utils/ganache-test' import { DAY, MONTH } from '@celo/dev-utils/test-utils' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { topUpWithToken } from '../../test-utils/chain-setup' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { createMultisig } from '../../test-utils/multisigUtils' @@ -19,27 +18,27 @@ import Withdraw from './withdraw' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('releasegold:withdraw cmd', (web3: Web3) => { +testWithAnvilL2('releasegold:withdraw cmd', (client) => { let contractAddress: string let kit: ContractKit beforeEach(async () => { - const accounts = (await web3.eth.getAccounts()) as StrongAddress[] - kit = newKitFromWeb3(web3) + const accounts = (await client.eth.getAccounts()) as StrongAddress[] + kit = newKitFromWeb3(client) contractAddress = await deployReleaseGoldContract( - web3, + client, await createMultisig(kit, [accounts[0], accounts[1]] as StrongAddress[], 2, 2), accounts[1], accounts[0], accounts[2] ) - await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], web3) + await testLocallyWithWeb3Node(CreateAccount, ['--contract', contractAddress], client) // make the whole balance available for withdrawal await testLocallyWithWeb3Node( SetMaxDistribution, ['--contract', contractAddress, '--yesreally', '--distributionRatio', '1000'], - web3 + client ) }) @@ -47,14 +46,14 @@ testWithAnvilL2('releasegold:withdraw cmd', (web3: Web3) => { await testLocallyWithWeb3Node( SetLiquidityProvision, ['--contract', contractAddress, '--yesreally'], - web3 + client ) // Based on the release schedule, 3 months needs to pass - await timeTravel(MONTH * 3 + DAY, web3) + await timeTravel(MONTH * 3 + DAY, client) const withdrawalAmount = '10000000000000000000' const releaseGoldWrapper = new ReleaseGoldWrapper( kit.connection, - newReleaseGold(web3, contractAddress), + newReleaseGold(client, contractAddress), kit.contracts ) const beneficiary = await releaseGoldWrapper.getBeneficiary() @@ -65,21 +64,21 @@ testWithAnvilL2('releasegold:withdraw cmd', (web3: Web3) => { await testLocallyWithWeb3Node( Withdraw, ['--contract', contractAddress, '--value', withdrawalAmount], - web3 + client ) const balanceAfter = (await kit.getTotalBalance(beneficiary)).CELO! - const latestTransactionReceipt = await web3.eth.getTransactionReceipt( - (await web3.eth.getBlock('latest')).transactions[0] + const latestTransactionReceipt = await client.eth.getTransactionReceipt( + (await client.eth.getBlock('latest')).transactions[0] as string ) // Safety check if the latest transaction was originated by the beneficiary - expect(latestTransactionReceipt.from.toLowerCase()).toEqual(beneficiary.toLowerCase()) + expect(latestTransactionReceipt!.from.toLowerCase()).toEqual(beneficiary.toLowerCase()) const difference = new BigNumber(balanceAfter) .minus(balanceBefore) - .plus(latestTransactionReceipt.effectiveGasPrice * latestTransactionReceipt.gasUsed) + .plus(latestTransactionReceipt!.effectiveGasPrice! * latestTransactionReceipt!.gasUsed) expect(difference.toFixed()).toEqual(withdrawalAmount) expect((await releaseGoldWrapper.getTotalWithdrawn()).toFixed()).toEqual(withdrawalAmount) @@ -90,15 +89,15 @@ testWithAnvilL2('releasegold:withdraw cmd', (web3: Web3) => { await testLocallyWithWeb3Node( SetLiquidityProvision, ['--contract', contractAddress, '--yesreally'], - web3 + client ) expect(spy).toHaveBeenCalledWith( expect.stringContaining('The liquidity provision has not already been set') ) - await timeTravel(MONTH * 12 + DAY, web3) + await timeTravel(MONTH * 12 + DAY, client) const releaseGoldWrapper = new ReleaseGoldWrapper( kit.connection, - newReleaseGold(web3, contractAddress), + newReleaseGold(client, contractAddress), kit.contracts ) const beneficiary = await releaseGoldWrapper.getBeneficiary() @@ -119,7 +118,7 @@ testWithAnvilL2('releasegold:withdraw cmd', (web3: Web3) => { testLocallyWithWeb3Node( Withdraw, ['--contract', contractAddress, '--value', remainingBalance.toString()], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) @@ -151,19 +150,19 @@ testWithAnvilL2('releasegold:withdraw cmd', (web3: Web3) => { testLocallyWithWeb3Node( RGTransferDollars, ['--contract', contractAddress, '--to', beneficiary, '--value', '100'], - web3 + client ) ).resolves.toBeUndefined() spy.mockClear() const totalWithdrawn = await releaseGoldWrapper.getTotalWithdrawn() expect(totalWithdrawn.toFixed()).toMatchInlineSnapshot(`"0"`) - await timeTravel(DAY * 31, web3) + await timeTravel(DAY * 31, client) await expect( testLocallyWithWeb3Node( Withdraw, ['--contract', contractAddress, '--value', remainingBalance.toString()], - web3 + client ) ).resolves.toBeUndefined() expect(stripAnsiCodesFromNestedArray(spy.mock.calls)).toMatchInlineSnapshot(` @@ -203,7 +202,7 @@ testWithAnvilL2('releasegold:withdraw cmd', (web3: Web3) => { const destroyedContractAddress = await getContractFromEvent( 'ReleaseGoldInstanceDestroyed(address,address)', - web3 + client ) expect(destroyedContractAddress).toBe(contractAddress) diff --git a/packages/cli/src/commands/rewards/show.test.ts b/packages/cli/src/commands/rewards/show.test.ts index 76c5b6d9a..cc8b467ed 100644 --- a/packages/cli/src/commands/rewards/show.test.ts +++ b/packages/cli/src/commands/rewards/show.test.ts @@ -6,7 +6,6 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { timeTravel } from '@celo/dev-utils/ganache-test' import { ux } from '@oclif/core' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { registerAccount } from '../../test-utils/chain-setup' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Switch from '../epochs/switch' @@ -15,7 +14,7 @@ import Show from './show' process.env.NO_SYNCCHECK = 'true' const KNOWN_DEVCHAIN_VALIDATOR = '0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f' -testWithAnvilL2('rewards:show cmd', (web3: Web3) => { +testWithAnvilL2('rewards:show cmd', (client) => { let kit: ContractKit let accounts: string[] const writeMock = jest.spyOn(ux.write, 'stdout') @@ -23,17 +22,17 @@ testWithAnvilL2('rewards:show cmd', (web3: Web3) => { const infoMock = jest.spyOn(console, 'info') beforeEach(async () => { - kit = newKitFromWeb3(web3) - accounts = await web3.eth.getAccounts() + kit = newKitFromWeb3(client) + accounts = await client.eth.getAccounts() const epochManager = await kit.contracts.getEpochManager() - await timeTravel((await epochManager.epochDuration()) + 1, web3) - await testLocallyWithWeb3Node(Switch, ['--from', accounts[0]], web3) + await timeTravel((await epochManager.epochDuration()) + 1, client) + await testLocallyWithWeb3Node(Switch, ['--from', accounts[0]], client) jest.clearAllMocks() }) describe('no arguments', () => { test('default', async () => { - await expect(testLocallyWithWeb3Node(Show, [], web3)).resolves.toBeUndefined() + await expect(testLocallyWithWeb3Node(Show, [], client)).resolves.toBeUndefined() expect(stripAnsiCodesFromNestedArray(infoMock.mock.calls)).toMatchInlineSnapshot(` [ [ @@ -49,7 +48,7 @@ testWithAnvilL2('rewards:show cmd', (web3: Web3) => { .mockImplementationOnce(async () => { throw new Error('test missing trie node') }) - await expect(testLocallyWithWeb3Node(Show, [], web3)).rejects.toMatchInlineSnapshot(` + await expect(testLocallyWithWeb3Node(Show, [], client)).rejects.toMatchInlineSnapshot(` [Error: Exact voter information is available only for 1024 blocks after each epoch. Supply --estimate to estimate rewards based on current votes, or use an archive node.] `) @@ -62,7 +61,7 @@ testWithAnvilL2('rewards:show cmd', (web3: Web3) => { testLocallyWithWeb3Node( Show, ['--validator', '0x1234567890123456789012345678901234567890'], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -78,7 +77,7 @@ testWithAnvilL2('rewards:show cmd', (web3: Web3) => { }) test('valid', async () => { - await testLocallyWithWeb3Node(Show, ['--validator', KNOWN_DEVCHAIN_VALIDATOR], web3) + await testLocallyWithWeb3Node(Show, ['--validator', KNOWN_DEVCHAIN_VALIDATOR], client) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ [ @@ -148,7 +147,7 @@ testWithAnvilL2('rewards:show cmd', (web3: Web3) => { }, ]) - await testLocallyWithWeb3Node(Show, ['--validator', KNOWN_DEVCHAIN_VALIDATOR], web3) + await testLocallyWithWeb3Node(Show, ['--validator', KNOWN_DEVCHAIN_VALIDATOR], client) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ [ @@ -197,7 +196,7 @@ testWithAnvilL2('rewards:show cmd', (web3: Web3) => { testLocallyWithWeb3Node( Show, ['--voter', '0x1234567890123456789012345678901234567890'], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -214,7 +213,7 @@ testWithAnvilL2('rewards:show cmd', (web3: Web3) => { test('valid', async () => { await registerAccount(kit, accounts[0]) await expect( - testLocallyWithWeb3Node(Show, ['--voter', accounts[0], '--estimate'], web3) + testLocallyWithWeb3Node(Show, ['--voter', accounts[0], '--estimate'], client) ).resolves.toMatchInlineSnapshot(`undefined`) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/transfer/celo.test.ts b/packages/cli/src/commands/transfer/celo.test.ts index 92e55abf9..bdbfc65b1 100644 --- a/packages/cli/src/commands/transfer/celo.test.ts +++ b/packages/cli/src/commands/transfer/celo.test.ts @@ -6,7 +6,6 @@ import { TEST_GAS_PRICE } from '@celo/dev-utils/test-utils' import BigNumber from 'bignumber.js' import { Address, createPublicClient, formatEther, http, parseEther } from 'viem' import { celo } from 'viem/chains' -import Web3 from 'web3' import { topUpWithToken } from '../../test-utils/chain-setup' import { extractHostFromWeb3, @@ -22,15 +21,15 @@ process.env.NO_SYNCCHECK = 'true' // Lots of commands, sometimes times out jest.setTimeout(15000) -testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { +testWithAnvilL2('transfer:celo cmd', (client) => { let accounts: string[] = [] let kit: ContractKit let restoreMock: () => void beforeEach(async () => { restoreMock = mockRpcFetch({ method: 'eth_gasPrice', result: TEST_GAS_PRICE }) - kit = newKitFromWeb3(web3) - accounts = await web3.eth.getAccounts() + kit = newKitFromWeb3(client) + accounts = await client.eth.getAccounts() jest.spyOn(console, 'log').mockImplementation(() => { // noop @@ -75,18 +74,18 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { '--gasCurrency', (await kit.contracts.getStableToken(StableToken.USDm)).address, ], - web3 + client ) // RG USDm balance should match the amount sent const receiverBalance = await kit.getTotalBalance(accounts[1]) expect(receiverBalance.CELO!.toFixed()).toEqual( receiverBalanceBefore.CELO!.plus(amountToTransfer).toFixed() ) - let block = await web3.eth.getBlock('latest') - let transactionReceipt = await web3.eth.getTransactionReceipt(block.transactions[0]) + let block = await client.eth.getBlock('latest') + let transactionReceipt = await client.eth.getTransactionReceipt(block.transactions[0] as string) // Safety check if the latest transaction was originated by expected account - expect(transactionReceipt.from.toLowerCase()).toEqual(accounts[0].toLowerCase()) + expect(transactionReceipt!.from.toLowerCase()).toEqual(accounts[0].toLowerCase()) // Attempt to send USDm back await testLocallyWithWeb3Node( @@ -101,19 +100,19 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { '--gasCurrency', (await kit.contracts.getStableToken(StableToken.USDm)).address, ], - web3 + client ) - block = await web3.eth.getBlock('latest') - transactionReceipt = await web3.eth.getTransactionReceipt(block.transactions[0]) + block = await client.eth.getBlock('latest') + transactionReceipt = await client.eth.getTransactionReceipt(block.transactions[0] as string) // Safety check if the latest transaction was originated by expected account - expect(transactionReceipt.from.toLowerCase()).toEqual(accounts[1].toLowerCase()) + expect(transactionReceipt!.from.toLowerCase()).toEqual(accounts[1].toLowerCase()) const balanceAfter = (await kit.getTotalBalance(accounts[0])).CELO?.toFixed()! // the balance should be close to initial minus the fees for gas times 2 (one for each transfer) const estimatedBalance = BigInt( balanceBefore - .minus(transactionReceipt.effectiveGasPrice * transactionReceipt.gasUsed * 2) + .minus(transactionReceipt!.effectiveGasPrice! * transactionReceipt!.gasUsed * 2) .toFixed() ) expect(Number(formatEther(BigInt(balanceAfter)))).toBeCloseTo( @@ -129,7 +128,7 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { testLocallyWithWeb3Node( TransferCelo, ['--from', accounts[0], '--to', accounts[1], '--value', balance.toFixed()], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(stripAnsiCodesFromNestedArray(spy.mock.calls)).toMatchInlineSnapshot(` @@ -175,7 +174,7 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { '--comment', 'Goodbye balance', ], - web3 + client ) ).resolves.toBeUndefined() @@ -219,11 +218,11 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { }) test('can transfer very large amounts of CELO', async () => { - const balanceBefore = new BigNumber(await web3.eth.getBalance(accounts[0])) + const balanceBefore = new BigNumber(await client.eth.getBalance(accounts[0])) const amountToTransfer = parseEther('20000000') await setBalance( - web3, + client, accounts[0] as Address, balanceBefore.plus(amountToTransfer.toString(10)) ) @@ -240,27 +239,29 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { '--gasCurrency', (await kit.contracts.getStableToken(StableToken.USDm)).address, ], - web3 + client ) - const block = await web3.eth.getBlock('latest') - const transactionReceipt = await web3.eth.getTransactionReceipt(block.transactions[0]) + const block = await client.eth.getBlock('latest') + const transactionReceipt = await client.eth.getTransactionReceipt( + block.transactions[0] as string + ) // Safety check if the latest transaction was originated by expected account - expect(transactionReceipt.from.toLowerCase()).toEqual(accounts[0].toLowerCase()) - expect(transactionReceipt.cumulativeGasUsed).toBeGreaterThan(0) - expect(transactionReceipt.effectiveGasPrice).toBeGreaterThan(0) - expect(transactionReceipt.gasUsed).toBeGreaterThan(0) - expect(transactionReceipt.to).toEqual(accounts[1].toLowerCase()) - expect(transactionReceipt.status).toEqual(true) + expect(transactionReceipt!.from.toLowerCase()).toEqual(accounts[0].toLowerCase()) + expect(transactionReceipt!.cumulativeGasUsed).toBeGreaterThan(0) + expect(transactionReceipt!.effectiveGasPrice).toBeGreaterThan(0) + expect(transactionReceipt!.gasUsed).toBeGreaterThan(0) + expect(transactionReceipt!.to).toEqual(accounts[1].toLowerCase()) + expect(transactionReceipt!.status).toEqual(true) - const balanceAfter = new BigNumber(await web3.eth.getBalance(accounts[0])) + const balanceAfter = new BigNumber(await client.eth.getBalance(accounts[0])) expect(BigInt(balanceAfter.toFixed())).toBeLessThan(BigInt(balanceBefore.toFixed())) }) test('can transfer celo with comment', async () => { - const start = await web3.eth.getBlock('latest') + const start = await client.eth.getBlock('latest') const amountToTransfer = '500000000000000000000' await testLocallyWithWeb3Node( @@ -275,7 +276,7 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { '--comment', 'Hello World', ], - web3 + client ) // Attempt to send USDm back @@ -291,14 +292,16 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { '--comment', 'Hello World Back', ], - web3 + client ) - const client = createPublicClient({ - // @ts-expect-error - transport: http(kit.web3.currentProvider.existingProvider.host), + const eventClient = createPublicClient({ + transport: http( + (kit.web3.currentProvider as unknown as { existingProvider: { host: string } }) + .existingProvider.host + ), }) - const events = await client.getContractEvents({ + const events = await eventClient.getContractEvents({ abi: goldTokenABI, eventName: 'TransferComment', fromBlock: BigInt(start.number), @@ -312,7 +315,7 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { test('passes feeCurrency to estimateGas', async () => { const chainId = await kit.web3.eth.getChainId() - const nodeUrl = extractHostFromWeb3(web3) + const nodeUrl = extractHostFromWeb3(client) const publicClient = createPublicClient({ chain: { name: 'Custom Chain', @@ -346,7 +349,7 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { '--gasCurrency', USDmAddress, ], - web3 + client ) expect(estimateGasSpy).toHaveBeenCalledWith({ @@ -363,7 +366,7 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { testLocallyWithWeb3Node( TransferCelo, ['--from', accounts[1], '--to', TEST_SANCTIONED_ADDRESS, '--value', '1'], - web3 + client ) ).rejects.toThrow() expect(spy).toHaveBeenCalledWith(expect.stringContaining(COMPLIANT_ERROR_RESPONSE)) @@ -375,7 +378,7 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { testLocallyWithWeb3Node( TransferCelo, ['--from', TEST_SANCTIONED_ADDRESS, '--to', accounts[0], '--value', '1'], - web3 + client ) ).rejects.toThrow() expect(spy).toHaveBeenCalledWith(expect.stringContaining(COMPLIANT_ERROR_RESPONSE)) @@ -387,7 +390,7 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { testLocallyWithWeb3Node( TransferCelo, ['--from', accounts[0], '--to', accounts[1], '--value', '1', '--gasCurrency', wrongFee], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(` "Parsing --gasCurrency @@ -413,25 +416,25 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { '--gasCurrency', (await kit.contracts.getStableToken(StableToken.USDm)).address.toUpperCase(), ], - web3 + client ) ).resolves.toBeUndefined() const balanceAfter = await kit.getTotalBalance(accounts[0]) const receiverBalanceAfter = await kit.getTotalBalance(accounts[1]) - const transactionReceipt = await web3.eth.getTransactionReceipt( - (await web3.eth.getBlock('latest')).transactions[0] + const transactionReceipt = await client.eth.getTransactionReceipt( + (await client.eth.getBlock('latest')).transactions[0] as string ) // Safety check if the latest transaction was originated by expected account - expect(transactionReceipt.from.toLowerCase()).toEqual(accounts[0].toLowerCase()) + expect(transactionReceipt!.from.toLowerCase()).toEqual(accounts[0].toLowerCase()) expect(receiverBalanceAfter.CELO!.toFixed()).toEqual( receiverBalanceBefore.CELO!.plus(amountToTransfer).toFixed() ) expect( balanceAfter - .CELO!.plus(transactionReceipt.effectiveGasPrice * transactionReceipt.gasUsed) + .CELO!.plus(transactionReceipt!.effectiveGasPrice! * transactionReceipt!.gasUsed) .toFixed() ).toEqual(balanceBefore.CELO!.minus(amountToTransfer).toFixed()) }) @@ -443,7 +446,7 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { testLocallyWithWeb3Node( TransferCelo, ['--from', accounts[0], '--to', accounts[1], '--value', '1', '--gasCurrency', wrongFee], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(spy).toHaveBeenCalledWith( @@ -457,7 +460,7 @@ testWithAnvilL2('transfer:celo cmd', (web3: Web3) => { TransferCelo, ['--from', accounts[0], '--to', accounts[1], '--value', '1', '--useAKV'], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"--useAKV flag is no longer supported"`) }) diff --git a/packages/cli/src/commands/transfer/dollars.test.ts b/packages/cli/src/commands/transfer/dollars.test.ts index 8a40a08dc..81c5346d5 100644 --- a/packages/cli/src/commands/transfer/dollars.test.ts +++ b/packages/cli/src/commands/transfer/dollars.test.ts @@ -3,7 +3,6 @@ import { ContractKit, newKitFromWeb3, StableToken } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { TEST_GAS_PRICE } from '@celo/dev-utils/test-utils' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { topUpWithToken } from '../../test-utils/chain-setup' import { stripAnsiCodesFromNestedArray, @@ -18,13 +17,13 @@ process.env.NO_SYNCCHECK = 'true' // Lots of commands, sometimes times out jest.setTimeout(15000) -testWithAnvilL2('transfer:dollars cmd', (web3: Web3) => { +testWithAnvilL2('transfer:dollars cmd', (client) => { let accounts: string[] = [] let kit: ContractKit let logMock: jest.SpyInstance beforeEach(async () => { - kit = newKitFromWeb3(web3) - accounts = await web3.eth.getAccounts() + kit = newKitFromWeb3(client) + accounts = await client.eth.getAccounts() logMock = jest.spyOn(console, 'log').mockImplementation(() => { // noop }) @@ -57,7 +56,7 @@ testWithAnvilL2('transfer:dollars cmd', (web3: Web3) => { await testLocallyWithWeb3Node( TransferUSDM, ['--from', accounts[0], '--to', accounts[1], '--value', amountToTransfer], - web3 + client ) // RG USDm balance should match the amount sent const receiverBalance = await kit.getTotalBalance(accounts[1]) @@ -68,7 +67,7 @@ testWithAnvilL2('transfer:dollars cmd', (web3: Web3) => { await testLocallyWithWeb3Node( TransferUSDM, ['--from', accounts[1], '--to', accounts[0], '--value', amountToTransfer], - web3 + client ) const balanceAfter = await kit.getTotalBalance(accounts[0]) expect(balanceBefore.USDm).toEqual(balanceAfter.USDm) @@ -80,7 +79,7 @@ testWithAnvilL2('transfer:dollars cmd', (web3: Web3) => { await testLocallyWithWeb3Node( TransferUSDM, ['--from', accounts[0], '--to', accounts[1], '--value', balance.toFixed()], - web3 + client ) const balanceAfter = await cusdWrapper.balanceOf(accounts[0]) expect(balanceAfter.toFixed()).toEqBigNumber('0') @@ -115,7 +114,7 @@ testWithAnvilL2('transfer:dollars cmd', (web3: Web3) => { cusdAddress, ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) @@ -172,7 +171,7 @@ testWithAnvilL2('transfer:dollars cmd', (web3: Web3) => { '--gasCurrency', euroWrapper.address, ], - web3 + client ) const balanceAfter = await cusdWrapper.balanceOf(accounts[0]) expect(balanceAfter.toFixed()).toEqBigNumber('0') @@ -197,7 +196,7 @@ testWithAnvilL2('transfer:dollars cmd', (web3: Web3) => { '--comment', comment, ], - web3 + client ) ).resolves.toBeUndefined() expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -240,7 +239,7 @@ testWithAnvilL2('transfer:dollars cmd', (web3: Web3) => { testLocallyWithWeb3Node( TransferUSDM, ['--from', accounts[1], '--to', TEST_SANCTIONED_ADDRESS, '--value', '1'], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(spy).toHaveBeenCalledWith(expect.stringContaining(COMPLIANT_ERROR_RESPONSE)) diff --git a/packages/cli/src/commands/transfer/erc20.test.ts b/packages/cli/src/commands/transfer/erc20.test.ts index d41025d0a..b52d2f461 100644 --- a/packages/cli/src/commands/transfer/erc20.test.ts +++ b/packages/cli/src/commands/transfer/erc20.test.ts @@ -3,7 +3,6 @@ import { ContractKit, newKitFromWeb3, StableToken } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { TEST_GAS_PRICE } from '@celo/dev-utils/test-utils' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { topUpWithToken } from '../../test-utils/chain-setup' import { TEST_SANCTIONED_ADDRESS, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import { mockRpcFetch } from '../../test-utils/mockRpc' @@ -14,7 +13,7 @@ process.env.NO_SYNCCHECK = 'true' // Lots of commands, sometimes times out jest.setTimeout(15000) -testWithAnvilL2('transfer:erc20 cmd', (web3: Web3) => { +testWithAnvilL2('transfer:erc20 cmd', (client) => { let accounts: string[] = [] let kit: ContractKit @@ -28,8 +27,8 @@ testWithAnvilL2('transfer:erc20 cmd', (web3: Web3) => { }) beforeEach(async () => { - kit = newKitFromWeb3(web3) - accounts = await web3.eth.getAccounts() + kit = newKitFromWeb3(client) + accounts = await client.eth.getAccounts() await topUpWithToken( kit, @@ -79,7 +78,7 @@ testWithAnvilL2('transfer:erc20 cmd', (web3: Web3) => { '--erc20Address', cusdAddress, ], - web3 + client ) // Send cusd as erc20 const receiverBalance = await kit.getTotalBalance(reciever) @@ -99,7 +98,7 @@ testWithAnvilL2('transfer:erc20 cmd', (web3: Web3) => { '--erc20Address', cusdAddress, ], - web3 + client ) const balanceAfter = await kit.getTotalBalance(sender) expect(balanceBefore.USDm).toEqual(balanceAfter.USDm) @@ -124,7 +123,7 @@ testWithAnvilL2('transfer:erc20 cmd', (web3: Web3) => { '--erc20Address', cusdAddress, ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(spy).toHaveBeenCalledWith(expect.stringContaining(COMPLIANT_ERROR_RESPONSE)) @@ -135,7 +134,7 @@ testWithAnvilL2('transfer:erc20 cmd', (web3: Web3) => { testLocallyWithWeb3Node( TransferERC20, ['--from', accounts[0], '--to', accounts[1], '--value', '1', '--erc20Address', accounts[2]], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Invalid erc20 address"`) }) @@ -156,7 +155,7 @@ testWithAnvilL2('transfer:erc20 cmd', (web3: Web3) => { '--useAKV', ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"--useAKV flag is no longer supported"`) }) @@ -181,7 +180,7 @@ testWithAnvilL2('transfer:erc20 cmd', (web3: Web3) => { '--erc20Address', cusdAddress, ], - web3 + client ) // Verify the transfer was successful diff --git a/packages/cli/src/commands/transfer/euros.test.ts b/packages/cli/src/commands/transfer/euros.test.ts index 27f657f7d..dce65ee03 100644 --- a/packages/cli/src/commands/transfer/euros.test.ts +++ b/packages/cli/src/commands/transfer/euros.test.ts @@ -2,7 +2,6 @@ import { COMPLIANT_ERROR_RESPONSE } from '@celo/compliance' import { ContractKit, newKitFromWeb3, StableToken } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { topUpWithToken } from '../../test-utils/chain-setup' import { TEST_SANCTIONED_ADDRESS, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import TransferEURO from './euros' @@ -12,13 +11,13 @@ process.env.NO_SYNCCHECK = 'true' // Lots of commands, sometimes times out jest.setTimeout(15000) -testWithAnvilL2('transfer:euros cmd', (web3: Web3) => { +testWithAnvilL2('transfer:euros cmd', (client) => { let accounts: string[] = [] let kit: ContractKit beforeEach(async () => { - kit = newKitFromWeb3(web3) - accounts = await web3.eth.getAccounts() + kit = newKitFromWeb3(client) + accounts = await client.eth.getAccounts() jest.spyOn(console, 'log').mockImplementation(() => { // noop }) @@ -52,7 +51,7 @@ testWithAnvilL2('transfer:euros cmd', (web3: Web3) => { await testLocallyWithWeb3Node( TransferEURO, ['--from', accounts[0], '--to', accounts[1], '--value', amountToTransfer], - web3 + client ) // RG EURm balance should match the amount sent const receiverBalance = await kit.getTotalBalance(accounts[1]) @@ -63,7 +62,7 @@ testWithAnvilL2('transfer:euros cmd', (web3: Web3) => { await testLocallyWithWeb3Node( TransferEURO, ['--from', accounts[1], '--to', accounts[0], '--value', amountToTransfer], - web3 + client ) const balanceAfter = await kit.getTotalBalance(accounts[0]) expect(balanceBefore.EURm).toEqual(balanceAfter.EURm) @@ -75,7 +74,7 @@ testWithAnvilL2('transfer:euros cmd', (web3: Web3) => { testLocallyWithWeb3Node( TransferEURO, ['--from', accounts[1], '--to', TEST_SANCTIONED_ADDRESS, '--value', '1'], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(spy).toHaveBeenCalledWith(expect.stringContaining(COMPLIANT_ERROR_RESPONSE)) diff --git a/packages/cli/src/commands/transfer/reals.test.ts b/packages/cli/src/commands/transfer/reals.test.ts index aa8cf1832..e5f037b2a 100644 --- a/packages/cli/src/commands/transfer/reals.test.ts +++ b/packages/cli/src/commands/transfer/reals.test.ts @@ -2,7 +2,6 @@ import { COMPLIANT_ERROR_RESPONSE } from '@celo/compliance' import { ContractKit, StableToken, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { topUpWithToken } from '../../test-utils/chain-setup' import { TEST_SANCTIONED_ADDRESS, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import TransferReals from './reals' @@ -12,7 +11,7 @@ process.env.NO_SYNCCHECK = 'true' // Lots of commands, sometimes times out jest.setTimeout(15000) -testWithAnvilL2('transfer:reals cmd', (web3: Web3) => { +testWithAnvilL2('transfer:reals cmd', (client) => { let accounts: string[] = [] let kit: ContractKit @@ -26,8 +25,8 @@ testWithAnvilL2('transfer:reals cmd', (web3: Web3) => { }) beforeEach(async () => { - kit = newKitFromWeb3(web3) - accounts = await web3.eth.getAccounts() + kit = newKitFromWeb3(client) + accounts = await client.eth.getAccounts() await topUpWithToken( kit, @@ -55,7 +54,7 @@ testWithAnvilL2('transfer:reals cmd', (web3: Web3) => { await testLocallyWithWeb3Node( TransferReals, ['--from', accounts[0], '--to', accounts[1], '--value', amountToTransfer], - web3 + client ) // RG BRLm, balance should match the amount sent const receiverBalance = await kit.getTotalBalance(accounts[1]) @@ -66,7 +65,7 @@ testWithAnvilL2('transfer:reals cmd', (web3: Web3) => { await testLocallyWithWeb3Node( TransferReals, ['--from', accounts[1], '--to', accounts[0], '--value', amountToTransfer], - web3 + client ) const balanceAfter = await kit.getTotalBalance(accounts[0]) expect(balanceBefore.BRLm).toEqual(balanceAfter.BRLm) @@ -81,7 +80,7 @@ testWithAnvilL2('transfer:reals cmd', (web3: Web3) => { testLocallyWithWeb3Node( TransferReals, ['--from', accounts[1], '--to', TEST_SANCTIONED_ADDRESS, '--value', '1'], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(spy).toHaveBeenCalledWith(expect.stringContaining(COMPLIANT_ERROR_RESPONSE)) diff --git a/packages/cli/src/commands/transfer/stable.test.ts b/packages/cli/src/commands/transfer/stable.test.ts index 6b1e2a270..c5c263db7 100644 --- a/packages/cli/src/commands/transfer/stable.test.ts +++ b/packages/cli/src/commands/transfer/stable.test.ts @@ -2,7 +2,6 @@ import { COMPLIANT_ERROR_RESPONSE } from '@celo/compliance' import { ContractKit, StableToken, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { topUpWithToken } from '../../test-utils/chain-setup' import { TEST_SANCTIONED_ADDRESS, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import TransferStable from './stable' @@ -12,7 +11,7 @@ process.env.NO_SYNCCHECK = 'true' // Lots of commands, sometimes times out jest.setTimeout(15000) -testWithAnvilL2('transfer:stable cmd', (web3: Web3) => { +testWithAnvilL2('transfer:stable cmd', (client) => { let accounts: string[] = [] let kit: ContractKit @@ -26,8 +25,8 @@ testWithAnvilL2('transfer:stable cmd', (web3: Web3) => { }) beforeEach(async () => { - kit = newKitFromWeb3(web3) - accounts = await web3.eth.getAccounts() + kit = newKitFromWeb3(client) + accounts = await client.eth.getAccounts() await topUpWithToken( kit, @@ -60,7 +59,7 @@ testWithAnvilL2('transfer:stable cmd', (web3: Web3) => { '--stableToken', StableToken.USDm, ], - web3 + client ) // Send cusd as erc20 const receiverBalance = await kit.getTotalBalance(reciever) @@ -80,7 +79,7 @@ testWithAnvilL2('transfer:stable cmd', (web3: Web3) => { '--stableToken', StableToken.USDm, ], - web3 + client ) }) @@ -102,7 +101,7 @@ testWithAnvilL2('transfer:stable cmd', (web3: Web3) => { '--stableToken', StableToken.USDm, ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(spy).toHaveBeenCalledWith(expect.stringContaining(COMPLIANT_ERROR_RESPONSE)) @@ -124,7 +123,7 @@ testWithAnvilL2('transfer:stable cmd', (web3: Web3) => { '--useAKV', ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot(`"--useAKV flag is no longer supported"`) }) diff --git a/packages/cli/src/commands/validator/affilliate.test.ts b/packages/cli/src/commands/validator/affilliate.test.ts index d8c46823d..45a6d033f 100644 --- a/packages/cli/src/commands/validator/affilliate.test.ts +++ b/packages/cli/src/commands/validator/affilliate.test.ts @@ -3,7 +3,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { ValidatorsWrapper } from '@celo/contractkit/lib/wrappers/Validators' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' import Lock from '../lockedcelo/lock' @@ -11,27 +10,27 @@ import ValidatorAffiliate from './affiliate' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validator:affiliate', (web3: Web3) => { +testWithAnvilL2('validator:affiliate', (client) => { let account: string let validatorContract: ValidatorsWrapper let groupAddress: StrongAddress beforeEach(async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() account = accounts[0] - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) kit.defaultAccount = account as StrongAddress - const ecdsaPublicKey = await addressToPublicKey(account, web3.eth.sign) + const ecdsaPublicKey = await addressToPublicKey(account, client.eth.sign) validatorContract = await kit.contracts.getValidators() const groups = await validatorContract.getRegisteredValidatorGroupsAddresses() groupAddress = groups[0] as StrongAddress - await testLocallyWithWeb3Node(Register, ['--from', account], web3) + await testLocallyWithWeb3Node(Register, ['--from', account], client) await testLocallyWithWeb3Node( Lock, ['--from', account, '--value', '10000000000000000000000'], - web3 + client ) // Register a validator @@ -48,7 +47,7 @@ testWithAnvilL2('validator:affiliate', (web3: Web3) => { await testLocallyWithWeb3Node( ValidatorAffiliate, ['--from', account, groupAddress, '--yes'], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -85,7 +84,7 @@ testWithAnvilL2('validator:affiliate', (web3: Web3) => { it('fails when not a validator signer', async () => { const logMock = jest.spyOn(console, 'log') - const [_, nonSignerAccount] = await web3.eth.getAccounts() + const [_, nonSignerAccount] = await client.eth.getAccounts() logMock.mockClear() @@ -93,7 +92,7 @@ testWithAnvilL2('validator:affiliate', (web3: Web3) => { testLocallyWithWeb3Node( ValidatorAffiliate, ['--from', nonSignerAccount, groupAddress, '--yes'], - web3 + client ) ).rejects.toMatchInlineSnapshot(`[Error: Some checks didn't pass!]`) diff --git a/packages/cli/src/commands/validator/deaffilliate.test.ts b/packages/cli/src/commands/validator/deaffilliate.test.ts index e6aa96eb0..d2f3c47a6 100644 --- a/packages/cli/src/commands/validator/deaffilliate.test.ts +++ b/packages/cli/src/commands/validator/deaffilliate.test.ts @@ -3,7 +3,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { ValidatorsWrapper } from '@celo/contractkit/lib/wrappers/Validators' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' import Lock from '../lockedcelo/lock' @@ -12,27 +11,27 @@ import ValidatorDeAffiliate from './deaffiliate' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validator:deaffiliate', (web3: Web3) => { +testWithAnvilL2('validator:deaffiliate', (client) => { let account: string let validatorContract: ValidatorsWrapper let groupAddress: StrongAddress beforeEach(async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() account = accounts[0] - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) kit.defaultAccount = account as StrongAddress - const ecdsaPublicKey = await addressToPublicKey(account, web3.eth.sign) + const ecdsaPublicKey = await addressToPublicKey(account, client.eth.sign) validatorContract = await kit.contracts.getValidators() const groups = await validatorContract.getRegisteredValidatorGroupsAddresses() groupAddress = groups[0] as StrongAddress - await testLocallyWithWeb3Node(Register, ['--from', account], web3) + await testLocallyWithWeb3Node(Register, ['--from', account], client) await testLocallyWithWeb3Node( Lock, ['--from', account, '--value', '10000000000000000000000'], - web3 + client ) // Register a validator @@ -41,7 +40,7 @@ testWithAnvilL2('validator:deaffiliate', (web3: Web3) => { await testLocallyWithWeb3Node( ValidatorAffiliate, ['--from', account, groupAddress, '--yes'], - web3 + client ) }) @@ -54,7 +53,7 @@ testWithAnvilL2('validator:deaffiliate', (web3: Web3) => { const logMock = jest.spyOn(console, 'log') expect(validator.affiliation).toEqual(groupAddress) - await testLocallyWithWeb3Node(ValidatorDeAffiliate, ['--from', account], web3) + await testLocallyWithWeb3Node(ValidatorDeAffiliate, ['--from', account], client) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/validator/deregister.test.ts b/packages/cli/src/commands/validator/deregister.test.ts index 40be74618..8167f6b11 100644 --- a/packages/cli/src/commands/validator/deregister.test.ts +++ b/packages/cli/src/commands/validator/deregister.test.ts @@ -8,7 +8,6 @@ import { } from '@celo/dev-utils/anvil-test' import { timeTravel } from '@celo/dev-utils/ganache-test' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' -import Web3 from 'web3' import { EXTRA_LONG_TIMEOUT_MS, stripAnsiCodesFromNestedArray, @@ -23,7 +22,7 @@ import { default as ValidatorRegister } from './register' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validator:deregister', (web3: Web3) => { +testWithAnvilL2('validator:deregister', (client) => { let account: string let ecdsaPublicKey: string let groupAddress: StrongAddress @@ -36,30 +35,30 @@ testWithAnvilL2('validator:deregister', (web3: Web3) => { jest.spyOn(console, 'error').mockImplementation(() => { // noop }) - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() account = accounts[0] - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) validatorContract = await kit.contracts.getValidators() const groups = await validatorContract.getRegisteredValidatorGroupsAddresses() groupAddress = groups[0] as StrongAddress - ecdsaPublicKey = await addressToPublicKey(account, web3.eth.sign) - await testLocallyWithWeb3Node(Register, ['--from', account], web3) + ecdsaPublicKey = await addressToPublicKey(account, client.eth.sign) + await testLocallyWithWeb3Node(Register, ['--from', account], client) await testLocallyWithWeb3Node( Lock, ['--from', account, '--value', '10000000000000000000000'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorRegister, ['--from', account, '--ecdsaKey', ecdsaPublicKey, '--yes'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorAffiliate, ['--from', account, groupAddress, '--yes'], - web3 + client ) - await asCoreContractsOwner(web3, async (ownerAddress) => { + await asCoreContractsOwner(client, async (ownerAddress) => { // @ts-expect-error (.contract) await validatorContract.contract.methods.setMaxGroupSize(5).send({ from: ownerAddress }) // @ts-expect-error (.contract) @@ -71,11 +70,11 @@ testWithAnvilL2('validator:deregister', (web3: Web3) => { .setGroupLockedGoldRequirements(2, 10000) .send({ from: ownerAddress }) }) - await withImpersonatedAccount(web3, groupAddress, async () => { + await withImpersonatedAccount(client, groupAddress, async () => { await testLocallyWithWeb3Node( ValidatorGroupMembers, [account, '--from', groupAddress, '--accept', '--yes'], - web3 + client ) }) }) @@ -91,11 +90,11 @@ testWithAnvilL2('validator:deregister', (web3: Web3) => { // precondition const groupAtSettup = await validatorContract.getValidatorGroup(groupAddress, false) expect(groupAtSettup.members).toContain(account) - await withImpersonatedAccount(web3, groupAddress, async () => { + await withImpersonatedAccount(client, groupAddress, async () => { await testLocallyWithWeb3Node( ValidatorGroupMembers, [account, '--from', groupAddress, '--remove', '--yes'], - web3 + client ) }) @@ -103,7 +102,7 @@ testWithAnvilL2('validator:deregister', (web3: Web3) => { const { lastRemovedFromGroupTimestamp } = await validatorContract.getValidatorMembershipHistoryExtraData(account) // travel in the evm - await timeTravel(duration.multipliedBy(2).toNumber(), web3) + await timeTravel(duration.multipliedBy(2).toNumber(), client) // time travel in node land const jestTime = lastRemovedFromGroupTimestamp * 1000 const futureTime = jestTime + duration.multipliedBy(2000).toNumber() @@ -123,7 +122,7 @@ testWithAnvilL2('validator:deregister', (web3: Web3) => { duration.toNumber() ) await expect( - testLocallyWithWeb3Node(ValidatorDeRegister, ['--from', account], web3) + testLocallyWithWeb3Node(ValidatorDeRegister, ['--from', account], client) ).resolves.toMatchInlineSnapshot(`undefined`) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ @@ -175,7 +174,7 @@ testWithAnvilL2('validator:deregister', (web3: Web3) => { logMock.mockClear() await expect( - testLocallyWithWeb3Node(ValidatorDeRegister, ['--from', account], web3) + testLocallyWithWeb3Node(ValidatorDeRegister, ['--from', account], client) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -207,7 +206,7 @@ testWithAnvilL2('validator:deregister', (web3: Web3) => { it( 'succeeds if not a member of any group', async () => { - const [_, notAffiliatedValidator] = await web3.eth.getAccounts() + const [_, notAffiliatedValidator] = await client.eth.getAccounts() const groupAtSetup = await validatorContract.getValidatorGroup(groupAddress, false) // Sanity check @@ -217,7 +216,7 @@ testWithAnvilL2('validator:deregister', (web3: Web3) => { await testLocallyWithWeb3Node( Lock, ['--from', notAffiliatedValidator, '--value', '10000000000000000000000'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorRegister, @@ -225,17 +224,17 @@ testWithAnvilL2('validator:deregister', (web3: Web3) => { '--from', notAffiliatedValidator, '--ecdsaKey', - await addressToPublicKey(notAffiliatedValidator, web3.eth.sign), + await addressToPublicKey(notAffiliatedValidator, client.eth.sign), '--yes', ], - web3 + client ) const { duration } = await validatorContract.getValidatorLockedGoldRequirements() const { lastRemovedFromGroupTimestamp } = await validatorContract.getValidatorMembershipHistoryExtraData(account) // travel in the evm - await timeTravel(duration.multipliedBy(2).toNumber(), web3) + await timeTravel(duration.multipliedBy(2).toNumber(), client) // time travel in node land const jestTime = lastRemovedFromGroupTimestamp * 1000 const futureTime = jestTime + duration.multipliedBy(2000).toNumber() @@ -244,7 +243,7 @@ testWithAnvilL2('validator:deregister', (web3: Web3) => { const logMock = jest.spyOn(console, 'log') logMock.mockClear() - await testLocallyWithWeb3Node(ValidatorDeRegister, ['--from', notAffiliatedValidator], web3) + await testLocallyWithWeb3Node(ValidatorDeRegister, ['--from', notAffiliatedValidator], client) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/validator/list.test.ts b/packages/cli/src/commands/validator/list.test.ts index 355024df5..60d67576c 100644 --- a/packages/cli/src/commands/validator/list.test.ts +++ b/packages/cli/src/commands/validator/list.test.ts @@ -1,7 +1,6 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' import { ux } from '@oclif/core' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' import Lock from '../lockedcelo/lock' @@ -10,7 +9,7 @@ import ValidatorRegister from './register' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validator:list', (web3: Web3) => { +testWithAnvilL2('validator:list', (client) => { let account: string let ecdsaPublicKey: string const writeMock = jest.spyOn(ux.write, 'stdout').mockImplementation(() => { @@ -21,19 +20,19 @@ testWithAnvilL2('validator:list', (web3: Web3) => { jest.spyOn(console, 'log').mockImplementation(() => { // noop }) - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() account = accounts[0] - ecdsaPublicKey = await addressToPublicKey(account, web3.eth.sign) - await testLocallyWithWeb3Node(Register, ['--from', account], web3) + ecdsaPublicKey = await addressToPublicKey(account, client.eth.sign) + await testLocallyWithWeb3Node(Register, ['--from', account], client) await testLocallyWithWeb3Node( Lock, ['--from', account, '--value', '10000000000000000000000'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorRegister, ['--from', account, '--ecdsaKey', ecdsaPublicKey, '--yes'], - web3 + client ) }) @@ -43,7 +42,7 @@ testWithAnvilL2('validator:list', (web3: Web3) => { }) it('shows all registered validators', async () => { - await testLocallyWithWeb3Node(ListValidators, ['--csv'], web3) + await testLocallyWithWeb3Node(ListValidators, ['--csv'], client) expect(stripAnsiCodesFromNestedArray(writeMock.mock.calls)).toMatchInlineSnapshot(` [ [ diff --git a/packages/cli/src/commands/validator/register-L2.test.ts b/packages/cli/src/commands/validator/register-L2.test.ts index 88bc16156..e4c53588d 100644 --- a/packages/cli/src/commands/validator/register-L2.test.ts +++ b/packages/cli/src/commands/validator/register-L2.test.ts @@ -1,6 +1,5 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Register from '../account/register' import Lock from '../lockedcelo/lock' @@ -8,19 +7,19 @@ import ValidatorRegister from './register' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validator:register', (web3: Web3) => { +testWithAnvilL2('validator:register', (client) => { let account: string let ecdsaPublicKey: string beforeEach(async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() account = accounts[0] - ecdsaPublicKey = await addressToPublicKey(account, web3.eth.sign) - await testLocallyWithWeb3Node(Register, ['--from', account], web3) + ecdsaPublicKey = await addressToPublicKey(account, client.eth.sign) + await testLocallyWithWeb3Node(Register, ['--from', account], client) await testLocallyWithWeb3Node( Lock, ['--from', account, '--value', '10000000000000000000000'], - web3 + client ) }) @@ -29,7 +28,7 @@ testWithAnvilL2('validator:register', (web3: Web3) => { testLocallyWithWeb3Node( ValidatorRegister, ['--from', account, '--ecdsaKey', ecdsaPublicKey, '--yes'], - web3 + client ) ).resolves.toBe(undefined) }) @@ -39,7 +38,7 @@ testWithAnvilL2('validator:register', (web3: Web3) => { testLocallyWithWeb3Node( ValidatorRegister, ['--from', account, '--ecdsaKey', ecdsaPublicKey, '--yes'], - web3 + client ) ).resolves.toBe(undefined) }) @@ -49,7 +48,7 @@ testWithAnvilL2('validator:register', (web3: Web3) => { testLocallyWithWeb3Node( ValidatorRegister, ['--from', account, '--ecdsaKey', ecdsaPublicKey, '--yes'], - web3 + client ) ).resolves.toBe(undefined) @@ -57,7 +56,7 @@ testWithAnvilL2('validator:register', (web3: Web3) => { testLocallyWithWeb3Node( ValidatorRegister, ['--from', account, '--ecdsaKey', ecdsaPublicKey, '--yes'], - web3 + client ) ).rejects.toThrow("Some checks didn't pass!") }) diff --git a/packages/cli/src/commands/validator/requirements.test.ts b/packages/cli/src/commands/validator/requirements.test.ts index 87e340f0f..5bff543e1 100644 --- a/packages/cli/src/commands/validator/requirements.test.ts +++ b/packages/cli/src/commands/validator/requirements.test.ts @@ -1,11 +1,10 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Requirements from './requirements' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validator:requirements', (web3: Web3) => { +testWithAnvilL2('validator:requirements', (client) => { const logMock = jest.spyOn(console, 'log') afterEach(() => { @@ -13,7 +12,7 @@ testWithAnvilL2('validator:requirements', (web3: Web3) => { }) it('shows all registered validators', async () => { - await testLocallyWithWeb3Node(Requirements, [], web3) + await testLocallyWithWeb3Node(Requirements, [], client) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ [ diff --git a/packages/cli/src/commands/validator/show.test.ts b/packages/cli/src/commands/validator/show.test.ts index 49c49bbca..06ca1440b 100644 --- a/packages/cli/src/commands/validator/show.test.ts +++ b/packages/cli/src/commands/validator/show.test.ts @@ -1,6 +1,5 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Show from './show' @@ -8,7 +7,7 @@ process.env.NO_SYNCCHECK = 'true' const KNOWN_DEVCHAIN_VALIDATOR = '0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f' -testWithAnvilL2('validator:show', (web3: Web3) => { +testWithAnvilL2('validator:show', (client) => { const writeMock = jest.spyOn(ux.write, 'stdout') const logMock = jest.spyOn(console, 'log') @@ -17,7 +16,7 @@ testWithAnvilL2('validator:show', (web3: Web3) => { }) it('shows the validator', async () => { - await testLocallyWithWeb3Node(Show, [KNOWN_DEVCHAIN_VALIDATOR], web3) + await testLocallyWithWeb3Node(Show, [KNOWN_DEVCHAIN_VALIDATOR], client) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ [ diff --git a/packages/cli/src/commands/validator/status.test.ts b/packages/cli/src/commands/validator/status.test.ts index b4eafe9c0..764026684 100644 --- a/packages/cli/src/commands/validator/status.test.ts +++ b/packages/cli/src/commands/validator/status.test.ts @@ -1,7 +1,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Switch from '../epochs/switch' import Status from './status' @@ -10,7 +9,7 @@ process.env.NO_SYNCCHECK = 'true' const KNOWN_DEVCHAIN_VALIDATOR = '0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f' -testWithAnvilL2('validator:status', (web3: Web3) => { +testWithAnvilL2('validator:status', (client) => { const writeMock = jest.spyOn(ux.write, 'stdout') const logMock = jest.spyOn(console, 'log') @@ -22,7 +21,7 @@ testWithAnvilL2('validator:status', (web3: Web3) => { await testLocallyWithWeb3Node( Status, ['--validator', KNOWN_DEVCHAIN_VALIDATOR, '--csv', '--start', '349'], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` @@ -56,7 +55,7 @@ testWithAnvilL2('validator:status', (web3: Web3) => { }) it('displays status for all validators', async () => { - await testLocallyWithWeb3Node(Status, ['--all', '--csv', '--start', '349'], web3) + await testLocallyWithWeb3Node(Status, ['--all', '--csv', '--start', '349'], client) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(`[]`) expect(stripAnsiCodesFromNestedArray(writeMock.mock.calls)).toMatchInlineSnapshot(` @@ -94,13 +93,13 @@ testWithAnvilL2('validator:status', (web3: Web3) => { }) it('fails if start and end are in different epochs', async () => { - const [account] = await web3.eth.getAccounts() - const kit = newKitFromWeb3(web3) + const [account] = await client.eth.getAccounts() + const kit = newKitFromWeb3(client) const blockNumber = await kit.web3.eth.getBlockNumber() const epoch = await kit.getEpochNumberOfBlock(blockNumber) const firstBlockOfCurrentEpoch = await kit.getFirstBlockNumberForEpoch(epoch) - await testLocallyWithWeb3Node(Switch, ['--from', account], web3) + await testLocallyWithWeb3Node(Switch, ['--from', account], client) await expect( testLocallyWithWeb3Node( @@ -111,7 +110,7 @@ testWithAnvilL2('validator:status', (web3: Web3) => { '--start', (firstBlockOfCurrentEpoch - 2).toString(), ], - web3 + client ) ).rejects.toThrowErrorMatchingInlineSnapshot( `"Start and end blocks must be in the current epoch"` diff --git a/packages/cli/src/commands/validatorgroup/commission.test.ts b/packages/cli/src/commands/validatorgroup/commission.test.ts index bd097f762..19daebea9 100644 --- a/packages/cli/src/commands/validatorgroup/commission.test.ts +++ b/packages/cli/src/commands/validatorgroup/commission.test.ts @@ -2,7 +2,6 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { setCommissionUpdateDelay } from '@celo/dev-utils/chain-setup' import { mineBlocks } from '@celo/dev-utils/ganache-test' -import Web3 from 'web3' import { testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import AccountRegister from '../account/register' import Lock from '../lockedcelo/lock' @@ -11,49 +10,49 @@ import ValidatorGroupRegister from './register' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validatorgroup:comission cmd', (web3: Web3) => { +testWithAnvilL2('validatorgroup:comission cmd', (client) => { const registerValidatorGroup = async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() - await testLocallyWithWeb3Node(AccountRegister, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(AccountRegister, ['--from', accounts[0]], client) await testLocallyWithWeb3Node( Lock, ['--from', accounts[0], '--value', '10000000000000000000000'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorGroupRegister, ['--from', accounts[0], '--commission', '0.1', '--yes'], - web3 + client ) } test('can queue update', async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() await registerValidatorGroup() await testLocallyWithWeb3Node( Commission, ['--from', accounts[0], '--queue-update', '0.2'], - web3 + client ) }) test('can apply update', async () => { - const accounts = await web3.eth.getAccounts() - const kit = newKitFromWeb3(web3) + const accounts = await client.eth.getAccounts() + const kit = newKitFromWeb3(client) const validatorsWrapper = await kit.contracts.getValidators() // Set commission update delay to 3 blocks for backwards compatibility - await setCommissionUpdateDelay(web3, validatorsWrapper.address, 3) + await setCommissionUpdateDelay(client, validatorsWrapper.address, 3) await registerValidatorGroup() await testLocallyWithWeb3Node( Commission, ['--from', accounts[0], '--queue-update', '0.2'], - web3 + client ) - await mineBlocks(3, web3) + await mineBlocks(3, client) - await testLocallyWithWeb3Node(Commission, ['--from', accounts[0], '--apply'], web3) + await testLocallyWithWeb3Node(Commission, ['--from', accounts[0], '--apply'], client) }) }) diff --git a/packages/cli/src/commands/validatorgroup/deregister.test.ts b/packages/cli/src/commands/validatorgroup/deregister.test.ts index 44b541ad9..7f589aa68 100644 --- a/packages/cli/src/commands/validatorgroup/deregister.test.ts +++ b/packages/cli/src/commands/validatorgroup/deregister.test.ts @@ -2,7 +2,6 @@ import { Address } from '@celo/base' import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' -import Web3 from 'web3' import { mockTimeForwardBy, setupGroup, @@ -15,13 +14,13 @@ import ValidatorGroupMembers from './member' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validatorgroup:deregister cmd', (web3: Web3) => { +testWithAnvilL2('validatorgroup:deregister cmd', (client) => { let groupAddress: Address let validatorAddress: Address let kit: ContractKit beforeEach(async () => { - kit = newKitFromWeb3(web3) - const addresses = await web3.eth.getAccounts() + kit = newKitFromWeb3(client) + const addresses = await client.eth.getAccounts() groupAddress = addresses[0] validatorAddress = addresses[1] await setupGroup(kit, groupAddress) @@ -34,7 +33,7 @@ testWithAnvilL2('validatorgroup:deregister cmd', (web3: Web3) => { const logSpy = jest.spyOn(console, 'log').mockImplementation() const writeMock = jest.spyOn(ux.write, 'stdout').mockImplementation() - await testLocallyWithWeb3Node(DeRegisterValidatorGroup, ['--from', groupAddress], web3) + await testLocallyWithWeb3Node(DeRegisterValidatorGroup, ['--from', groupAddress], client) expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls)).toMatchInlineSnapshot(` [ @@ -74,7 +73,7 @@ testWithAnvilL2('validatorgroup:deregister cmd', (web3: Web3) => { await testLocallyWithWeb3Node( ValidatorGroupMembers, ['--yes', '--from', groupAddress, '--remove', validatorAddress], - web3 + client ) const validators = await kit.contracts.getValidators() await validators.deaffiliate().sendAndWaitForReceipt({ from: validatorAddress }) @@ -93,7 +92,7 @@ testWithAnvilL2('validatorgroup:deregister cmd', (web3: Web3) => { const logMock = jest.spyOn(console, 'log').mockImplementation() logMock.mockClear() await expect( - testLocallyWithWeb3Node(DeRegisterValidatorGroup, ['--from', groupAddress], web3) + testLocallyWithWeb3Node(DeRegisterValidatorGroup, ['--from', groupAddress], client) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ @@ -125,10 +124,10 @@ testWithAnvilL2('validatorgroup:deregister cmd', (web3: Web3) => { expect(group.members).toHaveLength(0) expect(group.affiliates).toHaveLength(0) const groupRequirements = await validators.getGroupLockedGoldRequirements() - const timeSpy = await mockTimeForwardBy(groupRequirements.duration.toNumber() * 2, web3) + const timeSpy = await mockTimeForwardBy(groupRequirements.duration.toNumber() * 2, client) const logMock = jest.spyOn(console, 'log').mockImplementation() await expect( - testLocallyWithWeb3Node(DeRegisterValidatorGroup, ['--from', groupAddress], web3) + testLocallyWithWeb3Node(DeRegisterValidatorGroup, ['--from', groupAddress], client) ).resolves.toBeUndefined() expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ @@ -190,15 +189,15 @@ testWithAnvilL2('validatorgroup:deregister cmd', (web3: Web3) => { describe('when is not a validator group', () => { beforeEach(async () => { - const accounts = await web3.eth.getAccounts() - await testLocallyWithWeb3Node(AccountRegister, ['--from', accounts[2]], web3) + const accounts = await client.eth.getAccounts() + await testLocallyWithWeb3Node(AccountRegister, ['--from', accounts[2]], client) }) it('shows error message', async () => { const logSpy = jest.spyOn(console, 'log').mockImplementation() - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() logSpy.mockClear() await expect( - testLocallyWithWeb3Node(DeRegisterValidatorGroup, ['--from', accounts[2]], web3) + testLocallyWithWeb3Node(DeRegisterValidatorGroup, ['--from', accounts[2]], client) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some checks didn't pass!"`) expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls)).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/validatorgroup/list.test.ts b/packages/cli/src/commands/validatorgroup/list.test.ts index d8409b8f9..6501e335b 100644 --- a/packages/cli/src/commands/validatorgroup/list.test.ts +++ b/packages/cli/src/commands/validatorgroup/list.test.ts @@ -1,6 +1,5 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import AccountRegister from '../account/register' import Lock from '../lockedcelo/lock' @@ -8,7 +7,7 @@ import List from './list' import ValidatorGroupRegister from './register' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validatorgroup:list cmd', (web3: Web3) => { +testWithAnvilL2('validatorgroup:list cmd', (client) => { const writeMock = jest.spyOn(ux.write, 'stdout') afterAll(() => { @@ -16,24 +15,24 @@ testWithAnvilL2('validatorgroup:list cmd', (web3: Web3) => { }) const registerValidatorGroup = async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() - await testLocallyWithWeb3Node(AccountRegister, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(AccountRegister, ['--from', accounts[0]], client) await testLocallyWithWeb3Node( Lock, ['--from', accounts[0], '--value', '10000000000000000000000'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorGroupRegister, ['--from', accounts[0], '--commission', '0.1', '--yes'], - web3 + client ) } it('outputs the current validator groups', async () => { await registerValidatorGroup() - await testLocallyWithWeb3Node(List, [], web3) + await testLocallyWithWeb3Node(List, [], client) expect(stripAnsiCodesFromNestedArray(writeMock.mock.calls)).toMatchInlineSnapshot(` [ [ diff --git a/packages/cli/src/commands/validatorgroup/member.test.ts b/packages/cli/src/commands/validatorgroup/member.test.ts index 672a8c3be..190c8c621 100644 --- a/packages/cli/src/commands/validatorgroup/member.test.ts +++ b/packages/cli/src/commands/validatorgroup/member.test.ts @@ -1,7 +1,6 @@ import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2, withImpersonatedAccount } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' -import Web3 from 'web3' import { setupGroup, setupValidator, @@ -13,7 +12,7 @@ import Member from './member' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validatorgroup:member cmd', (web3: Web3) => { +testWithAnvilL2('validatorgroup:member cmd', (client) => { afterEach(() => { jest.clearAllMocks() }) @@ -23,8 +22,8 @@ testWithAnvilL2('validatorgroup:member cmd', (web3: Web3) => { let kit: ContractKit const logSpy = jest.spyOn(console, 'log').mockImplementation() beforeEach(async () => { - kit = newKitFromWeb3(web3) - const addresses = await web3.eth.getAccounts() + kit = newKitFromWeb3(client) + const addresses = await client.eth.getAccounts() groupAddress = addresses[0] validatorAddress = addresses[1] await setupGroup(kit, groupAddress) @@ -35,7 +34,7 @@ testWithAnvilL2('validatorgroup:member cmd', (web3: Web3) => { await testLocallyWithWeb3Node( ValidatorAffiliate, [groupAddress, '--from', validatorAddress, '--yes'], - web3 + client ) }) it('accepts a new member to the group', async () => { @@ -44,7 +43,7 @@ testWithAnvilL2('validatorgroup:member cmd', (web3: Web3) => { await testLocallyWithWeb3Node( Member, ['--yes', '--from', groupAddress, '--accept', validatorAddress], - web3 + client ) expect(stripAnsiCodesFromNestedArray(writeMock.mock.calls)).toMatchInlineSnapshot(`[]`) expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls)).toMatchInlineSnapshot(` @@ -87,7 +86,7 @@ testWithAnvilL2('validatorgroup:member cmd', (web3: Web3) => { await testLocallyWithWeb3Node( Member, ['--yes', '--from', groupAddress, '--remove', validatorAddress], - web3 + client ) expect(stripAnsiCodesFromNestedArray(writeMock.mock.calls)).toMatchInlineSnapshot(`[]`) expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls)).toMatchInlineSnapshot(` @@ -124,7 +123,7 @@ testWithAnvilL2('validatorgroup:member cmd', (web3: Web3) => { describe('when --reorder called from the group signer', () => { it('orders member to new position in group rank', async () => { const logSpy = jest.spyOn(console, 'log').mockImplementation() - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const ValidatorsWrapper = await kit.contracts.getValidators() const vgroups = await ValidatorsWrapper.getRegisteredValidatorGroups() @@ -150,11 +149,11 @@ testWithAnvilL2('validatorgroup:member cmd', (web3: Web3) => { expect(validatorAddress).toBeDefined() const newPosition = '0' - await withImpersonatedAccount(web3, groupToMessWith.address, async () => { + await withImpersonatedAccount(client, groupToMessWith.address, async () => { await testLocallyWithWeb3Node( Member, [validatorAddress, '--from', groupToMessWith.address, '--reorder', newPosition], - web3 + client ) }) diff --git a/packages/cli/src/commands/validatorgroup/register.test.ts b/packages/cli/src/commands/validatorgroup/register.test.ts index 1366fad77..201ee2a54 100644 --- a/packages/cli/src/commands/validatorgroup/register.test.ts +++ b/packages/cli/src/commands/validatorgroup/register.test.ts @@ -1,6 +1,5 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import AccountRegister from '../account/register' import Lock from '../lockedcelo/lock' @@ -8,15 +7,15 @@ import ValidatorGroupRegister from './register' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validatorgroup:register cmd', (web3: Web3) => { +testWithAnvilL2('validatorgroup:register cmd', (client) => { beforeEach(async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() - await testLocallyWithWeb3Node(AccountRegister, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(AccountRegister, ['--from', accounts[0]], client) await testLocallyWithWeb3Node( Lock, ['--from', accounts[0], '--value', '10000000000000000000000'], - web3 + client ) }) afterAll(() => { @@ -27,12 +26,12 @@ testWithAnvilL2('validatorgroup:register cmd', (web3: Web3) => { const logSpy = jest.spyOn(console, 'log') const writeMock = jest.spyOn(ux.write, 'stdout') - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() await testLocallyWithWeb3Node( ValidatorGroupRegister, ['--from', accounts[0], '--commission', '0.2', '--yes'], - web3 + client ) expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls)).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/validatorgroup/reset-slashing-multiplier.test.ts b/packages/cli/src/commands/validatorgroup/reset-slashing-multiplier.test.ts index c61870852..72e66b468 100644 --- a/packages/cli/src/commands/validatorgroup/reset-slashing-multiplier.test.ts +++ b/packages/cli/src/commands/validatorgroup/reset-slashing-multiplier.test.ts @@ -1,6 +1,5 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import AccountRegister from '../account/register' import Lock from '../lockedcelo/lock' @@ -9,20 +8,20 @@ import ResetSlashingMultiplier from './reset-slashing-multiplier' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validatorgroup:reset-slashing-multiplier cmd', (web3: Web3) => { +testWithAnvilL2('validatorgroup:reset-slashing-multiplier cmd', (client) => { beforeEach(async () => { - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() - await testLocallyWithWeb3Node(AccountRegister, ['--from', accounts[0]], web3) + await testLocallyWithWeb3Node(AccountRegister, ['--from', accounts[0]], client) await testLocallyWithWeb3Node( Lock, ['--from', accounts[0], '--value', '10000000000000000000000'], - web3 + client ) await testLocallyWithWeb3Node( ValidatorGroupRegister, ['--from', accounts[0], '--commission', '0.2', '--yes'], - web3 + client ) }) afterAll(() => { @@ -33,9 +32,9 @@ testWithAnvilL2('validatorgroup:reset-slashing-multiplier cmd', (web3: Web3) => const logSpy = jest.spyOn(console, 'log') const writeMock = jest.spyOn(ux.write, 'stdout') - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() - await testLocallyWithWeb3Node(ResetSlashingMultiplier, [accounts[0]], web3) + await testLocallyWithWeb3Node(ResetSlashingMultiplier, [accounts[0]], client) expect(stripAnsiCodesFromNestedArray(logSpy.mock.calls)).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/commands/validatorgroup/rpc-urls.test.ts b/packages/cli/src/commands/validatorgroup/rpc-urls.test.ts index c928dd5f0..d02feb419 100644 --- a/packages/cli/src/commands/validatorgroup/rpc-urls.test.ts +++ b/packages/cli/src/commands/validatorgroup/rpc-urls.test.ts @@ -14,7 +14,7 @@ import RpcUrls from './rpc-urls' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validatorgroup:rpc-urls cmd', async (web3) => { +testWithAnvilL2('validatorgroup:rpc-urls cmd', async (client) => { jest.spyOn(IdentityMetadataWrapper, 'fetchFromURL').mockImplementation(async (_, url) => { const validatorAddress = url.split('/').pop() @@ -43,7 +43,7 @@ testWithAnvilL2('validatorgroup:rpc-urls cmd', async (web3) => { validator: string ) => { await withImpersonatedAccount( - web3, + client, validator, async () => { await accountsWrapper @@ -65,16 +65,20 @@ testWithAnvilL2('validatorgroup:rpc-urls cmd', async (web3) => { ] beforeEach(async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const accountsWrapper = await kit.contracts.getAccounts() const [nonElectedGroupAddress, validatorAddress, nonAffilatedValidatorAddress] = - await web3.eth.getAccounts() + await client.eth.getAccounts() - await setBalance(web3, nonAffilatedValidatorAddress as Address, MIN_PRACTICAL_LOCKED_CELO_VALUE) + await setBalance( + client, + nonAffilatedValidatorAddress as Address, + MIN_PRACTICAL_LOCKED_CELO_VALUE + ) await setupValidator(kit, nonAffilatedValidatorAddress) - await setBalance(web3, nonElectedGroupAddress as Address, MIN_PRACTICAL_LOCKED_CELO_VALUE) - await setBalance(web3, validatorAddress as Address, MIN_PRACTICAL_LOCKED_CELO_VALUE) + await setBalance(client, nonElectedGroupAddress as Address, MIN_PRACTICAL_LOCKED_CELO_VALUE) + await setBalance(client, validatorAddress as Address, MIN_PRACTICAL_LOCKED_CELO_VALUE) await setupGroupAndAffiliateValidator(kit, nonElectedGroupAddress, validatorAddress) await accountsWrapper @@ -85,7 +89,7 @@ testWithAnvilL2('validatorgroup:rpc-urls cmd', async (web3) => { validatorAddress, nonAffilatedValidatorAddress, ]) { - await setBalance(web3, validator as Address, MIN_PRACTICAL_LOCKED_CELO_VALUE) + await setBalance(client, validator as Address, MIN_PRACTICAL_LOCKED_CELO_VALUE) try { await setMetadataUrlForValidator(accountsWrapper, validator) } catch (error) { @@ -98,7 +102,7 @@ testWithAnvilL2('validatorgroup:rpc-urls cmd', async (web3) => { const logMock = jest.spyOn(console, 'log') const writeMock = jest.spyOn(ux.write, 'stdout') - await testLocallyWithWeb3Node(RpcUrls, ['--csv'], web3) + await testLocallyWithWeb3Node(RpcUrls, ['--csv'], client) expect( writeMock.mock.calls.map((args) => args.map(stripAnsiCodesAndTxHashes)) @@ -127,7 +131,7 @@ testWithAnvilL2('validatorgroup:rpc-urls cmd', async (web3) => { const logMock = jest.spyOn(console, 'log') const writeMock = jest.spyOn(ux.write, 'stdout') - await testLocallyWithWeb3Node(RpcUrls, ['--all', '--csv'], web3) + await testLocallyWithWeb3Node(RpcUrls, ['--all', '--csv'], client) expect( writeMock.mock.calls.map((args) => args.map(stripAnsiCodesAndTxHashes)) diff --git a/packages/cli/src/commands/validatorgroup/show.test.ts b/packages/cli/src/commands/validatorgroup/show.test.ts index 8fa6bdcbe..801fb42a7 100644 --- a/packages/cli/src/commands/validatorgroup/show.test.ts +++ b/packages/cli/src/commands/validatorgroup/show.test.ts @@ -1,11 +1,10 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { ux } from '@oclif/core' -import Web3 from 'web3' import { stripAnsiCodesFromNestedArray, testLocallyWithWeb3Node } from '../../test-utils/cliUtils' import Show from './show' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('validatorgroup:show cmd', (web3: Web3) => { +testWithAnvilL2('validatorgroup:show cmd', (client) => { const writeMock = jest.spyOn(ux.write, 'stdout') const logMock = jest.spyOn(console, 'log') @@ -15,7 +14,7 @@ testWithAnvilL2('validatorgroup:show cmd', (web3: Web3) => { it('outputs the current validator groups', async () => { const validatorGroupfromDevChainSetup = '0x70997970C51812dc3A010C7d01b50e0d17dc79C8' - await testLocallyWithWeb3Node(Show, [validatorGroupfromDevChainSetup], web3) + await testLocallyWithWeb3Node(Show, [validatorGroupfromDevChainSetup], client) expect(stripAnsiCodesFromNestedArray(writeMock.mock.calls)).toMatchInlineSnapshot(`[]`) expect(stripAnsiCodesFromNestedArray(logMock.mock.calls)).toMatchInlineSnapshot(` [ diff --git a/packages/cli/src/test-utils/chain-setup.ts b/packages/cli/src/test-utils/chain-setup.ts index 5f61aaf08..730359c27 100644 --- a/packages/cli/src/test-utils/chain-setup.ts +++ b/packages/cli/src/test-utils/chain-setup.ts @@ -1,4 +1,5 @@ import { StrongAddress } from '@celo/base' +import { Web3 } from '@celo/connect' import { ContractKit, StableToken } from '@celo/contractkit' import { DEFAULT_OWNER_ADDRESS, @@ -10,13 +11,13 @@ import { import { mineBlocks, timeTravel } from '@celo/dev-utils/ganache-test' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' import BigNumber from 'bignumber.js' -import Web3 from 'web3' +import { parseEther } from 'viem' import Switch from '../commands/epochs/switch' import { testLocallyWithWeb3Node } from './cliUtils' -export const MIN_LOCKED_CELO_VALUE = new BigNumber(Web3.utils.toWei('10000', 'ether')) // 10k CELO for the group +export const MIN_LOCKED_CELO_VALUE = new BigNumber(parseEther('10000').toString()) // 10k CELO for the group export const MIN_PRACTICAL_LOCKED_CELO_VALUE = MIN_LOCKED_CELO_VALUE.plus( - Web3.utils.toWei('1', 'ether') + parseEther('1').toString() ) // 10k CELO for the group and 1 for gas const GROUP_COMMISION = new BigNumber(0.1) @@ -164,9 +165,9 @@ export async function setupValidatorAndAddToGroup( }) } // you MUST call clearMock after using this function! -export async function mockTimeForwardBy(seconds: number, web3: Web3) { +export async function mockTimeForwardBy(seconds: number, client: Web3) { const now = Date.now() - await timeTravel(seconds, web3) + await timeTravel(seconds, client) const spy = jest.spyOn(global.Date, 'now').mockImplementation(() => now + seconds * 1000) console.warn('mockTimeForwardBy', seconds, 'seconds', 'call clearMock after using this function') diff --git a/packages/cli/src/test-utils/cliUtils.ts b/packages/cli/src/test-utils/cliUtils.ts index e503c8951..0d3d7d326 100644 --- a/packages/cli/src/test-utils/cliUtils.ts +++ b/packages/cli/src/test-utils/cliUtils.ts @@ -1,7 +1,7 @@ import { PublicCeloClient } from '@celo/actions' +import { Provider, Web3 } from '@celo/connect' import { TestClientExtended } from '@celo/dev-utils/viem/anvil-test' import { Interfaces } from '@oclif/core' -import Web3 from 'web3' import { BaseCommand } from '../base' type AbstractConstructor = new (...args: any[]) => T @@ -13,28 +13,37 @@ interface Runner extends AbstractConstructor { export async function testLocallyWithWeb3Node( command: Runner, argv: string[], - web3: Web3, + client: Web3, config?: Interfaces.LoadOptions ) { - return testLocally(command, [...argv, '--node', extractHostFromWeb3(web3)], config) + return testLocally(command, [...argv, '--node', extractHostFromWeb3(client)], config) } -export const extractHostFromWeb3 = (web3: Web3): string => { - // why would the constructor name be HttpProvider but it not be considered an instance of HttpProvider? idk but it happens - if ( - web3.currentProvider instanceof Web3.providers.HttpProvider || - web3.currentProvider?.constructor.name === 'HttpProvider' - ) { - // @ts-ignore - return web3.currentProvider.host +export const extractHostFromWeb3 = (client: Web3): string => { + const provider = client.currentProvider as Provider & { + host?: string + url?: string + existingProvider?: { host?: string; url?: string } + } + if (!provider) { + throw new Error('No currentProvider on client') + } + + // CeloProvider wraps the underlying provider + if (provider.constructor.name === 'CeloProvider') { + const inner = provider.existingProvider + return inner?.host || inner?.url || 'http://localhost:8545' } - // CeloProvider is not exported from @celo/connect, but it's injected into web3 - if (web3.currentProvider !== null && web3.currentProvider.constructor.name === 'CeloProvider') { - return (web3.currentProvider as any).existingProvider.host + // Direct provider (HttpProvider or SimpleHttpProvider) + if (provider.host) { + return provider.host + } + if (provider.url) { + return provider.url } - throw new Error(`Unsupported provider, ${web3.currentProvider?.constructor.name}`) + throw new Error(`Unsupported provider, ${provider.constructor.name}`) } export async function testLocallyWithViemNode( diff --git a/packages/cli/src/test-utils/multicall.ts b/packages/cli/src/test-utils/multicall.ts index 4935764ae..598f24ba6 100644 --- a/packages/cli/src/test-utils/multicall.ts +++ b/packages/cli/src/test-utils/multicall.ts @@ -1,6 +1,6 @@ import { StrongAddress } from '@celo/base' +import { Web3 } from '@celo/connect' import { setCode } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' export async function deployMultiCall(web3: Web3, address: StrongAddress) { return setCode(web3, address, bytecode) diff --git a/packages/cli/src/test-utils/multisigUtils.ts b/packages/cli/src/test-utils/multisigUtils.ts index cd58730b6..80e564ee1 100644 --- a/packages/cli/src/test-utils/multisigUtils.ts +++ b/packages/cli/src/test-utils/multisigUtils.ts @@ -1,9 +1,9 @@ import { multiSigABI, proxyABI } from '@celo/abis' import { StrongAddress } from '@celo/base' +import { AbiItem, Web3 } from '@celo/connect' import { ContractKit } from '@celo/contractkit' import { setCode } from '@celo/dev-utils/anvil-test' import { TEST_GAS_PRICE } from '@celo/dev-utils/test-utils' -import Web3 from 'web3' import { multiSigBytecode, proxyBytecode, @@ -45,14 +45,16 @@ export async function createMultisig( const initializerAbi = multiSigABI.find( (abi) => abi.type === 'function' && abi.name === 'initialize' ) - const proxy = new kit.web3.eth.Contract(proxyABI as any, proxyAddress) - const baseFee = await kit.web3.eth.getBlock('latest').then((block: any) => block.baseFeePerGas) + const proxy = new kit.web3.eth.Contract(proxyABI as unknown as AbiItem[], proxyAddress) + const baseFee = await kit.web3.eth + .getBlock('latest') + .then((block) => (block as unknown as { baseFeePerGas: string }).baseFeePerGas) const priorityFee = kit.web3.utils.toWei('25', 'gwei') const initMethod = proxy.methods._setAndInitializeImplementation - const callData = kit.web3.eth.abi.encodeFunctionCall(initializerAbi as any, [ - owners as any, - requiredSignatures as any, - requiredInternalSignatures as any, + const callData = kit.web3.eth.abi.encodeFunctionCall(initializerAbi as AbiItem, [ + owners as unknown, + requiredSignatures as unknown, + requiredInternalSignatures as unknown, ]) const initTx = initMethod(multiSigAddress, callData) await initTx.send({ diff --git a/packages/cli/src/test-utils/release-gold.ts b/packages/cli/src/test-utils/release-gold.ts index f8124bfef..d2874d742 100644 --- a/packages/cli/src/test-utils/release-gold.ts +++ b/packages/cli/src/test-utils/release-gold.ts @@ -1,10 +1,10 @@ import { newReleaseGold } from '@celo/abis/web3/ReleaseGold' import { StrongAddress } from '@celo/base' +import { Web3 } from '@celo/connect' import { REGISTRY_CONTRACT_ADDRESS } from '@celo/contractkit' import { setBalance, setCode, withImpersonatedAccount } from '@celo/dev-utils/anvil-test' import { HOUR, MINUTE, MONTH } from '@celo/dev-utils/test-utils' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { getCurrentTimestamp } from '../utils/cli' // ported from ganache tests diff --git a/packages/cli/src/utils/checks.ts b/packages/cli/src/utils/checks.ts index 30ae83309..eb2264bdf 100644 --- a/packages/cli/src/utils/checks.ts +++ b/packages/cli/src/utils/checks.ts @@ -608,13 +608,16 @@ class CheckBuilder { return validators.read.isValidatorGroup([account]) }), this.withValidators(async (validators, _signer, account) => { - const group = await getValidatorGroup(await this.getClient(), account) + const client = await this.getClient() + const group = await getValidatorGroup(client, account) const [_, duration] = await validators.read.getGroupLockedGoldRequirements() - const waitPeriodEnd = group.membersUpdated.plus(bigintToBigNumber(duration)) - const isDeregisterable = waitPeriodEnd.isLessThan(Date.now() / 1000) + const waitPeriodEnd = group.membersUpdated.plus(bigintToBigNumber(duration)).toNumber() + const latestBlock = await client.getBlock({ blockTag: 'latest' }) + const currentTimestamp = Number(latestBlock.timestamp) + const isDeregisterable = waitPeriodEnd < currentTimestamp if (!isDeregisterable) { console.warn( - `Group will be able to be deregistered: ${new Date(waitPeriodEnd.multipliedBy(1000).toNumber()).toUTCString()}` + `Group will be able to be deregistered: ${new Date(waitPeriodEnd * 1000).toUTCString()}` ) } return isDeregisterable diff --git a/packages/cli/src/utils/cli.ts b/packages/cli/src/utils/cli.ts index c9e2b3c73..0fdae152b 100644 --- a/packages/cli/src/utils/cli.ts +++ b/packages/cli/src/utils/cli.ts @@ -1,6 +1,7 @@ import { CeloTransactionObject, CeloTx, + DecodedParamsObject, EventLog, parseDecodedParams, TransactionResult, @@ -175,7 +176,7 @@ async function innerDisplaySendTx( displayEventName.includes(eventName) ) .forEach(([eventName, log]) => { - const { params } = parseDecodedParams((log as EventLog).returnValues) + const { params } = parseDecodedParams((log as EventLog).returnValues as DecodedParamsObject) console.log(chalk.magenta.bold(`${eventName}:`)) printValueMap(params, chalk.magenta) }) diff --git a/packages/cli/src/utils/fee-currency.test.ts b/packages/cli/src/utils/fee-currency.test.ts index 13cddecf7..4e2b216b3 100644 --- a/packages/cli/src/utils/fee-currency.test.ts +++ b/packages/cli/src/utils/fee-currency.test.ts @@ -1,12 +1,11 @@ import { newKitFromWeb3 } from '@celo/contractkit' import { FeeCurrencyDirectoryWrapper } from '@celo/contractkit/lib/wrappers/FeeCurrencyDirectoryWrapper' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { getFeeCurrencyContractWrapper } from './fee-currency' -testWithAnvilL2('getFeeCurrencyContractWrapper', async (web3: Web3) => { +testWithAnvilL2('getFeeCurrencyContractWrapper', async (client) => { it('returns FeeCurrencyDirectory for L2 context', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const wrapper = await getFeeCurrencyContractWrapper(kit) expect(wrapper).toBeInstanceOf(FeeCurrencyDirectoryWrapper) diff --git a/packages/cli/src/utils/safe.ts b/packages/cli/src/utils/safe.ts index 4782b960e..68bb7ede2 100644 --- a/packages/cli/src/utils/safe.ts +++ b/packages/cli/src/utils/safe.ts @@ -1,9 +1,8 @@ import { StrongAddress } from '@celo/base' -import { CeloTransactionObject } from '@celo/connect' +import { CeloTransactionObject, Web3 } from '@celo/connect' import { CeloProvider } from '@celo/connect/lib/celo-provider' import Safe from '@safe-global/protocol-kit' import { MetaTransactionData, TransactionResult } from '@safe-global/types-kit' -import Web3 from 'web3' import { displaySafeTx } from './cli' export const createSafeFromWeb3 = async ( @@ -23,7 +22,7 @@ export const createSafeFromWeb3 = async ( } export const safeTransactionMetadataFromCeloTransactionObject = async ( - tx: CeloTransactionObject, + tx: CeloTransactionObject, toAddress: StrongAddress, value = '0' ): Promise => { diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 0f9c376b5..0c2429b4a 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -40,10 +40,7 @@ "fs-extra": "^8.1.0", "targz": "^1.0.1", "tmp": "^0.2.0", - "viem": "^2.33.2", - "web3": "1.10.4", - "web3-core-helpers": "1.10.4", - "web3-utils": "1.10.4" + "viem": "^2.33.2" }, "devDependencies": { "@celo/base": "workspace:^", diff --git a/packages/dev-utils/src/anvil-test.ts b/packages/dev-utils/src/anvil-test.ts index d0183d026..c44f84371 100644 --- a/packages/dev-utils/src/anvil-test.ts +++ b/packages/dev-utils/src/anvil-test.ts @@ -1,7 +1,7 @@ import { StrongAddress } from '@celo/base' +import { Web3 } from '@celo/connect' import { Anvil, CreateAnvilOptions, createAnvil } from '@viem/anvil' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { TEST_BALANCE, TEST_BASE_FEE, @@ -44,6 +44,7 @@ function createInstance(stateFilePath: string, chainId?: number): Anvil { gasLimit: TEST_GAS_LIMIT, blockBaseFeePerGas: TEST_BASE_FEE, codeSizeLimit: 50000000, + startTimeout: 60_000, stopTimeout: 1000, chainId, } @@ -59,7 +60,7 @@ type TestWithAnvilOptions = { export function testWithAnvilL2( name: string, - fn: (web3: Web3) => void, + fn: (client: Web3) => void, options?: TestWithAnvilOptions ) { return testWithAnvil(require.resolve('@celo/devchain-anvil/l2-devchain.json'), name, fn, options) @@ -68,7 +69,7 @@ export function testWithAnvilL2( function testWithAnvil( stateFilePath: string, name: string, - fn: (web3: Web3) => void, + fn: (client: Web3) => void, options?: TestWithAnvilOptions ) { const anvil = createInstance(stateFilePath, options?.chainId) @@ -89,40 +90,40 @@ function testWithAnvil( } export function impersonateAccount( - web3: Web3, + client: Web3, address: string, withBalance?: number | bigint | BigNumber ) { return Promise.all([ - jsonRpcCall(web3, 'anvil_impersonateAccount', [address]), + jsonRpcCall(client, 'anvil_impersonateAccount', [address]), withBalance - ? jsonRpcCall(web3, 'anvil_setBalance', [address, `0x${withBalance.toString(16)}`]) + ? jsonRpcCall(client, 'anvil_setBalance', [address, `0x${withBalance.toString(16)}`]) : undefined, ]) } -export function stopImpersonatingAccount(web3: Web3, address: string) { - return jsonRpcCall(web3, 'anvil_stopImpersonatingAccount', [address]) +export function stopImpersonatingAccount(client: Web3, address: string) { + return jsonRpcCall(client, 'anvil_stopImpersonatingAccount', [address]) } export const withImpersonatedAccount = async ( - web3: Web3, + client: Web3, account: string, fn: () => Promise, withBalance?: number | bigint | BigNumber ) => { - await impersonateAccount(web3, account, withBalance) + await impersonateAccount(client, account, withBalance) await fn() - await stopImpersonatingAccount(web3, account) + await stopImpersonatingAccount(client, account) } export const asCoreContractsOwner = async ( - web3: Web3, + client: Web3, fn: (ownerAddress: StrongAddress) => Promise, withBalance?: number | bigint | BigNumber ) => { await withImpersonatedAccount( - web3, + client, DEFAULT_OWNER_ADDRESS, async () => { await fn(DEFAULT_OWNER_ADDRESS) @@ -131,18 +132,18 @@ export const asCoreContractsOwner = async ( ) } -export function setCode(web3: Web3, address: string, code: string) { - return jsonRpcCall(web3, 'anvil_setCode', [address, code]) +export function setCode(client: Web3, address: string, code: string) { + return jsonRpcCall(client, 'anvil_setCode', [address, code]) } -export function setNextBlockTimestamp(web3: Web3, timestamp: number) { - return jsonRpcCall(web3, 'evm_setNextBlockTimestamp', [timestamp.toString()]) +export function setNextBlockTimestamp(client: Web3, timestamp: number) { + return jsonRpcCall(client, 'evm_setNextBlockTimestamp', [timestamp.toString()]) } export function setBalance( - web3: Web3, + client: Web3, address: StrongAddress, balance: number | bigint | BigNumber ) { - return jsonRpcCall(web3, 'anvil_setBalance', [address, `0x${balance.toString(16)}`]) + return jsonRpcCall(client, 'anvil_setBalance', [address, `0x${balance.toString(16)}`]) } diff --git a/packages/dev-utils/src/chain-setup.ts b/packages/dev-utils/src/chain-setup.ts index 556ede855..a37640bd4 100644 --- a/packages/dev-utils/src/chain-setup.ts +++ b/packages/dev-utils/src/chain-setup.ts @@ -1,6 +1,6 @@ import { governanceABI, validatorsABI } from '@celo/abis' import { StrongAddress } from '@celo/base' -import Web3 from 'web3' +import { AbiItem, Web3 } from '@celo/connect' import { DEFAULT_OWNER_ADDRESS, withImpersonatedAccount } from './anvil-test' export async function setCommissionUpdateDelay( @@ -9,8 +9,10 @@ export async function setCommissionUpdateDelay( delayInBlocks: number ) { await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { - // @ts-expect-error - const validators = new web3.eth.Contract(validatorsABI, validatorsContractAddress) + const validators = new web3.eth.Contract( + validatorsABI as unknown as AbiItem[], + validatorsContractAddress + ) const { transactionHash } = await validators.methods .setCommissionUpdateDelay(delayInBlocks) @@ -27,8 +29,10 @@ export async function setDequeueFrequency( frequency: number ) { await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { - // @ts-expect-error - const governance = new web3.eth.Contract(governanceABI, governanceContractAddress) + const governance = new web3.eth.Contract( + governanceABI as unknown as AbiItem[], + governanceContractAddress + ) const { transactionHash } = await governance.methods.setDequeueFrequency(frequency).send({ from: DEFAULT_OWNER_ADDRESS, @@ -43,8 +47,10 @@ export async function setReferendumStageDuration( duration: number ) { await withImpersonatedAccount(web3, DEFAULT_OWNER_ADDRESS, async () => { - // @ts-expect-error - const governance = new web3.eth.Contract(governanceABI, governanceContractAddress) + const governance = new web3.eth.Contract( + governanceABI as unknown as AbiItem[], + governanceContractAddress + ) const { transactionHash } = await governance.methods.setReferendumStageDuration(duration).send({ from: DEFAULT_OWNER_ADDRESS, diff --git a/packages/dev-utils/src/contracts.ts b/packages/dev-utils/src/contracts.ts index c75187477..11bc78e75 100644 --- a/packages/dev-utils/src/contracts.ts +++ b/packages/dev-utils/src/contracts.ts @@ -1,14 +1,13 @@ import { StrongAddress } from '@celo/base' +import { AbiItem, Web3 } from '@celo/connect' import AttestationsArtifacts from '@celo/celo-devchain/contracts/contracts-0.5/Attestations.json' -import Web3 from 'web3' import { LinkedLibraryAddress } from './anvil-test' -import type { AbiItem } from 'web3-utils' export const deployAttestationsContract = async ( - web3: Web3, + client: Web3, owner: StrongAddress ): Promise => { - const contract = new web3.eth.Contract(AttestationsArtifacts.abi as AbiItem[]) + const contract = new client.eth.Contract(AttestationsArtifacts.abi as AbiItem[]) const deployTx = contract.deploy({ data: AttestationsArtifacts.bytecode.replace( @@ -22,5 +21,5 @@ export const deployAttestationsContract = async ( const txResult = await deployTx.send({ from: owner }) - return txResult.options.address as StrongAddress + return (txResult as unknown as { options: { address: StrongAddress } }).options.address } diff --git a/packages/dev-utils/src/ganache-test.ts b/packages/dev-utils/src/ganache-test.ts index 26d58c2c3..4f6fbde0f 100644 --- a/packages/dev-utils/src/ganache-test.ts +++ b/packages/dev-utils/src/ganache-test.ts @@ -1,17 +1,17 @@ -import Web3 from 'web3' +import { Web3 } from '@celo/connect' import migrationOverride from './migration-override.json' import { jsonRpcCall } from './test-utils' export const NetworkConfig = migrationOverride -export async function timeTravel(seconds: number, web3: Web3) { - await jsonRpcCall(web3, 'evm_increaseTime', [seconds]) - await jsonRpcCall(web3, 'evm_mine', []) +export async function timeTravel(seconds: number, client: Web3) { + await jsonRpcCall(client, 'evm_increaseTime', [seconds]) + await jsonRpcCall(client, 'evm_mine', []) } -export async function mineBlocks(blocks: number, web3: Web3) { +export async function mineBlocks(blocks: number, client: Web3) { for (let i = 0; i < blocks; i++) { - await jsonRpcCall(web3, 'evm_mine', []) + await jsonRpcCall(client, 'evm_mine', []) } } /** @@ -19,14 +19,14 @@ export async function mineBlocks(blocks: number, web3: Web3) { */ export async function getContractFromEvent( eventSignature: string, - web3: Web3, + client: Web3, filter?: { expectedData?: string index?: number } ): Promise { - const logs = await web3.eth.getPastLogs({ - topics: [web3.utils.sha3(eventSignature)], + const logs = await client.eth.getPastLogs({ + topics: [client.utils.sha3(eventSignature)], fromBlock: 'earliest', toBlock: 'latest', }) diff --git a/packages/dev-utils/src/test-utils.ts b/packages/dev-utils/src/test-utils.ts index 915b3bdc4..592a6d09e 100644 --- a/packages/dev-utils/src/test-utils.ts +++ b/packages/dev-utils/src/test-utils.ts @@ -1,7 +1,54 @@ -import Web3 from 'web3' -import { JsonRpcResponse } from 'web3-core-helpers' +import { Connection, Provider, JsonRpcPayload, JsonRpcResponse, Web3 } from '@celo/connect' +import * as http from 'http' import migrationOverride from './migration-override.json' +class SimpleHttpProvider implements Provider { + /** Compat with web3's HttpProvider which exposed .host */ + readonly host: string + + constructor(readonly url: string) { + this.host = url + } + + send(payload: JsonRpcPayload, callback: (error: Error | null, result?: JsonRpcResponse) => void) { + const body = JSON.stringify(payload) + const parsedUrl = new URL(this.url) + + const req = http.request( + { + hostname: parsedUrl.hostname, + port: parsedUrl.port, + path: parsedUrl.pathname + parsedUrl.search, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(body).toString(), + }, + }, + (res) => { + let data = '' + res.on('data', (chunk: string) => { + data += chunk + }) + res.on('end', () => { + try { + callback(null, JSON.parse(data)) + } catch (e) { + callback(new Error(`Invalid JSON response: ${data}`)) + } + }) + } + ) + + req.on('error', (err) => { + callback(err) + }) + + req.write(body) + req.end() + } +} + export const MINUTE = 60 export const HOUR = 60 * 60 export const DAY = 24 * HOUR @@ -17,18 +64,19 @@ export const TEST_GAS_LIMIT = 20000000 export const NetworkConfig = migrationOverride -export function jsonRpcCall(web3: Web3, method: string, params: any[]): Promise { +export function jsonRpcCall(client: Web3, method: string, params: unknown[]): Promise { return new Promise((resolve, reject) => { - if (web3.currentProvider && typeof web3.currentProvider !== 'string') { - // @ts-expect-error - web3.currentProvider.send( + const provider = client.currentProvider + + if (provider && typeof provider.send === 'function') { + provider.send( { id: new Date().getTime(), jsonrpc: '2.0', method, params, }, - (err: Error | null, res?: JsonRpcResponse) => { + (err, res) => { if (err) { reject(err) } else if (!res) { @@ -52,12 +100,12 @@ export function jsonRpcCall(web3: Web3, method: string, params: any[]): Promi }) } -export function evmRevert(web3: Web3, snapId: string): Promise { - return jsonRpcCall(web3, 'evm_revert', [snapId]) +export function evmRevert(client: Web3, snapId: string): Promise { + return jsonRpcCall(client, 'evm_revert', [snapId]) } -export function evmSnapshot(web3: Web3) { - return jsonRpcCall(web3, 'evm_snapshot', []) +export function evmSnapshot(client: Web3) { + return jsonRpcCall(client, 'evm_snapshot', []) } type TestWithWeb3Hooks = { @@ -66,9 +114,9 @@ type TestWithWeb3Hooks = { } /** - * Creates a test suite with a given name and provides function with a web3 instance connected to the given rpcUrl. + * Creates a test suite with a given name and provides function with a Web3 client connected to the given rpcUrl. * - * It is an equivalent of jest `describe` with the web3 additioon. It also provides hooks for beforeAll and afterAll. + * It is an equivalent of jest `describe` with a Web3 client. It also provides hooks for beforeAll and afterAll. * * Optionally if a runIf flag is set to false the test suite will be skipped (useful for conditional test suites). By * default all test suites are run normally, but if the runIf flag is set to false the test suite will be skipped by using @@ -77,18 +125,15 @@ type TestWithWeb3Hooks = { export function testWithWeb3( name: string, rpcUrl: string, - fn: (web3: Web3) => void, + fn: (client: Web3) => void, options: { hooks?: TestWithWeb3Hooks runIf?: boolean } = {} ) { - const web3 = new Web3(rpcUrl) - - // @ts-ignore with anvil setup the tx receipt is apparently not immedietaly - // available after the tx is send, so by default it was waiting for 1000 ms - // before polling again making the tests slow - web3.eth.transactionPollingInterval = 10 + const provider = new SimpleHttpProvider(rpcUrl) + const connection = new Connection(provider) + const client = connection.web3 // By default we run all the tests let describeFn = describe @@ -102,19 +147,19 @@ export function testWithWeb3( let snapId: string | null = null if (options.hooks?.beforeAll) { - beforeAll(options.hooks.beforeAll) + beforeAll(options.hooks.beforeAll, 60_000) } beforeEach(async () => { if (snapId != null) { - await evmRevert(web3, snapId) + await evmRevert(client, snapId) } - snapId = await evmSnapshot(web3) + snapId = await evmSnapshot(client) }) afterAll(async () => { if (snapId != null) { - await evmRevert(web3, snapId) + await evmRevert(client, snapId) } if (options.hooks?.afterAll) { // hook must be awaited here or jest doesnt actually wait for it and complains of open handles @@ -122,6 +167,6 @@ export function testWithWeb3( } }) - fn(web3) + fn(client) }) } diff --git a/packages/dev-utils/src/viem/anvil-test.ts b/packages/dev-utils/src/viem/anvil-test.ts index 3b6bd2612..02b825c4c 100644 --- a/packages/dev-utils/src/viem/anvil-test.ts +++ b/packages/dev-utils/src/viem/anvil-test.ts @@ -52,6 +52,7 @@ function createInstance(opts?: { chainId?: number; forkUrl?: string; forkBlockNu gasPrice: TEST_GAS_PRICE, gasLimit: TEST_GAS_LIMIT, blockBaseFeePerGas: TEST_BASE_FEE, + startTimeout: 60_000, stopTimeout: 3000, chainId: opts?.chainId, ...(forkUrl diff --git a/packages/sdk/connect/package.json b/packages/sdk/connect/package.json index 1b96bfda8..d6394e146 100644 --- a/packages/sdk/connect/package.json +++ b/packages/sdk/connect/package.json @@ -33,21 +33,11 @@ "bignumber.js": "^9.0.0", "debug": "^4.1.1", "utf8": "3.0.0", - "web3-core": "1.10.4", - "web3-eth": "1.10.4", - "web3-eth-contract": "1.10.4" + "viem": "^2.33.2" }, "devDependencies": { "@celo/typescript": "workspace:^", - "@types/debug": "^4.1.12", - "web3": "1.10.4", - "web3-core": "1.10.4", - "web3-eth": "1.10.4", - "web3-eth-abi": "1.10.4", - "web3-eth-contract": "1.10.4" - }, - "peerDependencies": { - "web3": "1.10.4" + "@types/debug": "^4.1.12" }, "engines": { "node": ">=20" diff --git a/packages/sdk/connect/src/abi-types.ts b/packages/sdk/connect/src/abi-types.ts index 632561875..7f9c82491 100644 --- a/packages/sdk/connect/src/abi-types.ts +++ b/packages/sdk/connect/src/abi-types.ts @@ -5,13 +5,13 @@ export type ABIType = 'uint256' | 'boolean' | 'string' | 'bytes' | string // TOD /** @internal */ export interface DecodedParamsArray { - [index: number]: any + [index: number]: unknown __length__: number } /** @internal */ export interface DecodedParamsObject extends DecodedParamsArray { - [key: string]: any + [key: string]: unknown } // Note the following types come from web3-utils: AbiInput, AbiOutput, AbiItem, AbiType StateMutabilityType, ABIDefinition @@ -54,14 +54,14 @@ export interface ABIDefinition extends AbiItem { export interface AbiCoder { decodeLog(inputs: AbiInput[], hexString: string, topics: string[]): EventLog - encodeParameter(type: ABIType, parameter: any): string - encodeParameters(types: ABIType[], paramaters: any[]): string + encodeParameter(type: ABIType, parameter: unknown): string + encodeParameters(types: ABIType[], paramaters: unknown[]): string encodeEventSignature(name: string | object): string - encodeFunctionCall(jsonInterface: object, parameters: any[]): string + encodeFunctionCall(jsonInterface: object, parameters: unknown[]): string encodeFunctionSignature(name: string | object): string - decodeParameter(type: ABIType, hex: string): any + decodeParameter(type: ABIType, hex: string): unknown decodeParameters(types: ABIType[], hex: string): DecodedParamsArray decodeParameters(types: AbiInput[], hex: string): DecodedParamsObject diff --git a/packages/sdk/connect/src/celo-provider.test.ts b/packages/sdk/connect/src/celo-provider.test.ts index 596b8166e..68427c26d 100644 --- a/packages/sdk/connect/src/celo-provider.test.ts +++ b/packages/sdk/connect/src/celo-provider.test.ts @@ -1,4 +1,3 @@ -import Web3 from 'web3' import { CeloProvider } from './celo-provider' import { Connection } from './connection' import { @@ -96,10 +95,8 @@ describe('CeloProvider', () => { send: mockCallback, } - const web3 = new Web3() - web3.setProvider(mockProvider as any) - const connection = new Connection(web3, new MockWallet()) - celoProvider = connection.web3.currentProvider as any as CeloProvider + const connection = new Connection(mockProvider, new MockWallet()) + celoProvider = connection.currentProvider as unknown as CeloProvider }) describe("when celo provider don't have any local account", () => { diff --git a/packages/sdk/connect/src/connection.test.ts b/packages/sdk/connect/src/connection.test.ts index 8556e6eba..e8fee25ce 100644 --- a/packages/sdk/connect/src/connection.test.ts +++ b/packages/sdk/connect/src/connection.test.ts @@ -1,12 +1,19 @@ import { ensureLeading0x } from '@celo/base' -import Web3 from 'web3' import { Connection } from './connection' +import { Callback, JsonRpcPayload, JsonRpcResponse, Provider } from './types' + +function createMockProvider(): Provider { + return { + send(_payload: JsonRpcPayload, _callback: Callback): void { + // noop mock + }, + } +} describe('Connection', () => { let connection: Connection beforeEach(() => { - const web3 = new Web3('http://localhost:8545') - connection = new Connection(web3) + connection = new Connection(createMockProvider()) }) describe('#setFeeMarketGas', () => { diff --git a/packages/sdk/connect/src/connection.ts b/packages/sdk/connect/src/connection.ts index d24297f96..f994e4405 100644 --- a/packages/sdk/connect/src/connection.ts +++ b/packages/sdk/connect/src/connection.ts @@ -5,8 +5,16 @@ import { EIP712TypedData, generateTypedDataHash } from '@celo/utils/lib/sign-typ import { Signature, parseSignatureWithoutPrefix } from '@celo/utils/lib/signatureUtils' import { bufferToHex } from '@ethereumjs/util' import debugFactory from 'debug' -import Web3 from 'web3' -import { AbiCoder } from './abi-types' +import { soliditySha3 as soliditySha3Fn } from '@celo/utils/lib/solidity' +import { isValidAddress } from '@celo/utils/lib/address' +import { + keccak256, + hexToString, + numberToHex as viemNumberToHex, + parseEther, + formatEther, +} from 'viem' +import { AbiCoder, AbiInput, AbiItem, DecodedParamsObject } from './abi-types' import { CeloProvider, assertIsCeloProvider } from './celo-provider' import { Address, @@ -17,6 +25,11 @@ import { CeloTxObject, CeloTxPending, CeloTxReceipt, + Contract, + EventLog, + Log, + PastEventOptions, + PromiEvent, Provider, Syncing, } from './types' @@ -41,44 +54,119 @@ import { ReadOnlyWallet } from './wallet' const debugGasEstimation = debugFactory('connection:gas-estimation') -type BN = ReturnType export interface ConnectionOptions { gasInflationFactor: number feeCurrency?: StrongAddress from?: StrongAddress } +/** The web3 compatibility shim returned by {@link Connection.web3} */ +export interface Web3 { + eth: { + Contract: new (abi: readonly AbiItem[] | AbiItem[], address?: string) => Contract + net: { isListening: () => Promise } + getBalance: (address: string) => Promise + getStorageAt: (address: string, position: number | string) => Promise + sign: (data: string, address: string) => Promise + getAccounts: () => Promise + getTransactionReceipt: (hash: string) => Promise + getBlockNumber: () => Promise + getBlock: (blockNumber: BlockNumber, fullTxObjects?: boolean) => Promise + getPastLogs: (options: { + topics?: (string | null)[] + fromBlock?: string | number + toBlock?: string | number + address?: string + }) => Promise + call: (tx: CeloTx) => Promise + sendTransaction: (tx: CeloTx) => PromiEvent + signTransaction: (tx: CeloTx) => Promise<{ raw: string; tx: CeloTxReceipt }> + abi: AbiCoder + getChainId: () => Promise + isSyncing: () => Promise + handleRevert: boolean + transactionPollingInterval: number + defaultAccount: string | null + accounts: { + create: () => { address: string; privateKey: string } + } + personal: { + lockAccount: (address: string) => Promise + unlockAccount: (address: string, password: string, duration: number) => Promise + } + } + utils: { + soliditySha3: (...args: SolidityValue[]) => string | null + sha3: (...args: SolidityValue[]) => string | null + keccak256: (value: string) => string + toBN: (value: string | number | bigint) => bigint + toWei: (value: string, unit?: string) => string + fromWei: (value: string, unit?: string) => string + isAddress: (address: string) => boolean + toChecksumAddress: (address: string) => string + numberToHex: (value: number | string | bigint) => string + hexToNumber: (hex: string) => number + toHex: (value: string | number | bigint) => string + hexToAscii: (hex: string) => string + randomHex: (size: number) => string + _jsonInterfaceMethodToString: (abiItem: AbiItem) => string + } + currentProvider: Provider + setProvider: (provider: Provider) => void +} + +/** Value types accepted by soliditySha3 */ +type SolidityValue = + | string + | number + | bigint + | boolean + | { type: string; value: unknown } + | { t: string; v: unknown } + /** * Connection is a Class for connecting to Celo, sending Transactions, etc - * @param web3 an instance of web3 + * @param provider a JSON-RPC provider * @param wallet a child class of {@link WalletBase} - * @param handleRevert sets handleRevert on the web3.eth instance passed in */ export class Connection { private config: ConnectionOptions private _chainID: number | undefined readonly paramsPopulator: TxParamsNormalizer rpcCaller!: RpcCaller + private _provider!: Provider + private _originalWeb3?: { currentProvider: Provider; setProvider?: (p: Provider) => void } + private _settingProvider = false constructor( - readonly web3: Web3, + providerOrWeb3: Provider | { currentProvider: Provider; setProvider?: (p: Provider) => void }, public wallet?: ReadOnlyWallet, handleRevert = true ) { - web3.eth.handleRevert = handleRevert + // handleRevert param kept for API compat but no longer used (was web3-specific) + void handleRevert this.config = { gasInflationFactor: 1.3, } - const existingProvider: Provider = web3.currentProvider as Provider - this.setProvider(existingProvider) - // TODO: Add this line with the wallets separation completed - // this.wallet = _wallet ?? new LocalWallet() - this.config.from = (web3.eth.defaultAccount as StrongAddress) ?? undefined + // Accept both a Provider and a Web3-like object (which has currentProvider) + let provider: Provider + if (providerOrWeb3 != null && 'currentProvider' in providerOrWeb3) { + this._originalWeb3 = providerOrWeb3 + provider = providerOrWeb3.currentProvider + } else { + provider = providerOrWeb3 as Provider + } + this.setProvider(provider) this.paramsPopulator = new TxParamsNormalizer(this) } + /** Get the current provider */ + get currentProvider(): Provider { + return this._provider + } + setProvider(provider: Provider) { if (!provider) { throw new Error('Must have a valid Provider') @@ -88,8 +176,25 @@ export class Connection { if (!(provider instanceof CeloProvider)) { this.rpcCaller = new HttpRpcCaller(provider) provider = new CeloProvider(provider, this) + } else { + // Use the underlying raw provider for rpcCaller to avoid recursion + // (CeloProvider.send -> handleAccounts -> Connection.getAccounts -> rpcCaller.call -> CeloProvider.send) + this.rpcCaller = new HttpRpcCaller(provider.existingProvider) + } + this._provider = provider + // Update original web3 object's provider so web3.currentProvider reflects CeloProvider + if ( + this._originalWeb3 && + typeof this._originalWeb3.setProvider === 'function' && + !this._settingProvider + ) { + this._settingProvider = true + try { + this._originalWeb3.setProvider(provider) + } finally { + this._settingProvider = false + } } - this.web3.setProvider(provider as any) return true } catch (error) { console.error(`could not attach provider`, error) @@ -97,12 +202,12 @@ export class Connection { } } - keccak256 = (value: string | BN): string => { - return this.web3.utils.keccak256(value) + keccak256 = (value: string): string => { + return keccak256(value as `0x${string}`) } hexToAscii = (hex: string) => { - return this.web3.utils.hexToAscii(hex) + return hexToString(hex as `0x${string}`) } /** @@ -110,7 +215,6 @@ export class Connection { */ set defaultAccount(address: StrongAddress | undefined) { this.config.from = address - this.web3.eth.defaultAccount = address ? address : null } /** @@ -191,18 +295,19 @@ export class Connection { return addresses.map((value) => toChecksumAddress(value)) } - isListening(): Promise { - return this.web3.eth.net.isListening() + async isListening(): Promise { + const response = await this.rpcCaller.call('net_listening', []) + return response.result as boolean } isSyncing(): Promise { return new Promise((resolve, reject) => { - this.web3.eth - .isSyncing() - .then((response: boolean | Syncing) => { - // isSyncing returns a syncProgress object when it's still syncing - if (typeof response === 'boolean') { - resolve(response) + this.rpcCaller + .call('eth_syncing', []) + .then((response) => { + const result = response.result as boolean | Syncing + if (typeof result === 'boolean') { + resolve(result) } else { resolve(true) } @@ -223,15 +328,41 @@ export class Connection { tx = this.fillTxDefaults(tx) let gas = tx.gas - if (gas == null) { - gas = await this.estimateGasWithInflationFactor(tx) + if (!gas) { + const { gas: _omit, ...txWithoutGas } = tx + gas = await this.estimateGasWithInflationFactor(txWithoutGas) } + return this.sendTransactionViaProvider({ + ...tx, + gas, + }) + } + + private sendTransactionViaProvider(tx: CeloTx): TransactionResult { return toTxResult( - this.web3.eth.sendTransaction({ - ...tx, - gas, - }) + new Promise((resolve, reject) => { + ;(this._provider as Provider).send( + { + id: getRandomId(), + jsonrpc: '2.0', + method: 'eth_sendTransaction', + params: [tx], + }, + (error, resp) => { + if (error) { + reject(error) + } else if (resp?.error) { + reject(new Error(resp.error.message)) + } else if (resp) { + resolve(resp.result as string) + } else { + reject(new Error('empty-response')) + } + } + ) + }), + (txHash) => this.getTransactionReceipt(txHash) ) } @@ -242,13 +373,17 @@ export class Connection { tx = this.fillTxDefaults(tx) let gas = tx.gas - if (gas == null) { + if (!gas) { + const { gas: _omit, ...txWithoutGas } = tx + tx = txWithoutGas const gasEstimator = (_tx: CeloTx) => txObj.estimateGas({ ..._tx }) const getCallTx = (_tx: CeloTx) => { - // @ts-ignore missing _parent property from TransactionObject type. return { ..._tx, data: txObj.encodeABI(), to: txObj._parent._address } } - const caller = (_tx: CeloTx) => this.web3.eth.call(getCallTx(_tx)) + const caller = async (_tx: CeloTx) => { + const response = await this.rpcCaller.call('eth_call', [getCallTx(_tx), 'latest']) + return response.result as string + } gas = await this.estimateGasWithInflationFactor(tx, gasEstimator, caller) } @@ -280,7 +415,7 @@ export class Connection { // would just forward it to the node const signature = await new Promise((resolve, reject) => { const method = version ? `eth_signTypedData_v${version}` : 'eth_signTypedData' - ;(this.web3.currentProvider as Provider).send( + ;(this._provider as Provider).send( { id: getRandomId(), jsonrpc: '2.0', @@ -311,7 +446,7 @@ export class Connection { // by the CeloProvider if there is a local wallet that could sign it. The RpcCaller // would just forward it to the node const signature = await new Promise((resolve, reject) => { - ;(this.web3.currentProvider as Provider).send( + ;(this._provider as Provider).send( { id: getRandomId(), jsonrpc: '2.0', @@ -334,7 +469,29 @@ export class Connection { } sendSignedTransaction = async (signedTransactionData: string): Promise => { - return toTxResult(this.web3.eth.sendSignedTransaction(signedTransactionData)) + return toTxResult( + new Promise((resolve, reject) => { + ;(this._provider as Provider).send( + { + id: getRandomId(), + jsonrpc: '2.0', + method: 'eth_sendRawTransaction', + params: [signedTransactionData], + }, + (error, resp) => { + if (error) { + reject(error) + } else if (resp?.error) { + reject(new Error(resp.error.message)) + } else if (resp) { + resolve(resp.result as string) + } else { + reject(new Error('empty-response')) + } + } + ) + }) + ) } // if neither gas price nor feeMarket fields are present set them. setFeeMarketGas = async (tx: CeloTx): Promise => { @@ -360,15 +517,29 @@ export class Connection { estimateGas = async ( tx: CeloTx, - gasEstimator: (tx: CeloTx) => Promise = this.web3.eth.estimateGas, - caller: (tx: CeloTx) => Promise = this.web3.eth.call + gasEstimator?: (tx: CeloTx) => Promise, + caller?: (tx: CeloTx) => Promise ): Promise => { + const defaultGasEstimator = async (txToEstimate: CeloTx) => { + const response = await this.rpcCaller.call('eth_estimateGas', [txToEstimate]) + return parseInt(response.result, 16) + } + const defaultCaller = async (txToCall: CeloTx) => { + const response = await this.rpcCaller.call('eth_call', [ + { data: txToCall.data, to: txToCall.to, from: txToCall.from }, + 'latest', + ]) + return response.result as string + } + const estimate = gasEstimator ?? defaultGasEstimator + const call = caller ?? defaultCaller + try { - const gas = await gasEstimator({ ...tx }) + const gas = await estimate({ ...tx }) debugGasEstimation('estimatedGas: %s', gas.toString()) return gas } catch (e) { - const called = await caller({ data: tx.data, to: tx.to, from: tx.from }) + const called = await call({ data: tx.data, to: tx.to, from: tx.from }) let revertReason = 'Could not decode transaction failure reason' if (called.startsWith('0x08c379a')) { revertReason = decodeStringParameter(this.getAbiCoder(), called.substring(10)) @@ -386,7 +557,7 @@ export class Connection { } getAbiCoder(): AbiCoder { - return this.web3.eth.abi as unknown as AbiCoder + return viemAbiCoder } estimateGasWithInflationFactor = async ( @@ -400,8 +571,8 @@ export class Connection { ) debugGasEstimation('estimatedGasWithInflationFactor: %s', gas) return gas - } catch (e: any) { - throw new Error(e) + } catch (e: unknown) { + throw new Error(String(e)) } } @@ -457,7 +628,7 @@ export class Connection { } private isBlockNumberHash = (blockNumber: BlockNumber) => - blockNumber instanceof String && blockNumber.indexOf('0x') === 0 + typeof blockNumber === 'string' && blockNumber.indexOf('0x') === 0 getBlock = async (blockHashOrBlockNumber: BlockNumber, fullTxObjects = true): Promise => { const endpoint = this.isBlockNumberHash(blockHashOrBlockNumber) @@ -526,28 +697,672 @@ export class Connection { } } + getStorageAt = async (address: Address, position: number | string): Promise => { + const pos = typeof position === 'number' ? '0x' + position.toString(16) : position + const response = await this.rpcCaller.call('eth_getStorageAt', [ + inputAddressFormatter(address), + pos, + 'latest', + ]) + return response.result as string + } + + private _web3Shim: Web3 | undefined + + /** + * Returns a web3-compatible shim object. + * Provides web3.eth.Contract, web3.eth.getBalance, web3.utils, etc. + */ + get web3(): Web3 { + if (!this._web3Shim) { + this._web3Shim = createWeb3Shim(this) + } + return this._web3Shim + } + stop() { - assertIsCeloProvider(this.web3.currentProvider) - this.web3.currentProvider.stop() + assertIsCeloProvider(this._provider) + this._provider.stop() } } const addBufferToBaseFee = (gasPrice: bigint) => (gasPrice * BigInt(120)) / BigInt(100) -function isEmpty(value: string | undefined | number | BN | bigint): value is undefined { +function isEmpty(value: string | undefined | number | bigint): value is undefined { return ( value === 0 || value === undefined || value === null || value === '0' || value === BigInt(0) || - (typeof value === 'string' && - (value.toLowerCase() === '0x' || value.toLowerCase() === '0x0')) || - Web3.utils.toBN(value.toString(10)).eq(Web3.utils.toBN(0)) + (typeof value === 'string' && (value.toLowerCase() === '0x' || value.toLowerCase() === '0x0')) ) } export function isPresent( - value: string | undefined | number | BN | bigint -): value is string | number | BN | bigint { + value: string | undefined | number | bigint +): value is string | number | bigint { return !isEmpty(value) } + +// Viem-based ABI coder implementation that matches the AbiCoder interface +import { + decodeAbiParameters, + encodeAbiParameters, + encodeFunctionData, + type AbiParameter, + toEventHash, + toFunctionHash, + decodeEventLog, + pad, +} from 'viem' + +/** + * Coerce a value to match the expected ABI type. + * Web3 was lenient about types; viem is strict. This bridges the gap. + */ +function coerceValueForType(type: string, value: unknown): unknown { + // bool: web3 accepted numbers/strings; viem requires actual booleans + if (type === 'bool') { + if (typeof value === 'boolean') return value + return Boolean(value) + } + // bytesN (fixed-size): web3 auto-padded short hex strings; viem requires exact size + const bytesMatch = type.match(/^bytes(\d+)$/) + if (bytesMatch) { + const expectedBytes = parseInt(bytesMatch[1], 10) + if (typeof value === 'string') { + const hex = value.startsWith('0x') ? value : `0x${value}` + // If the hex value is shorter than expected, right-pad with zeros + const actualBytes = (hex.length - 2) / 2 + if (actualBytes < expectedBytes) { + return pad(hex as `0x${string}`, { size: expectedBytes, dir: 'right' }) + } + return hex + } + // Buffer or Uint8Array + if (Buffer.isBuffer(value) || value instanceof Uint8Array) { + const hex = `0x${Buffer.from(value).toString('hex')}` as `0x${string}` + const actualBytes = Buffer.from(value).length + if (actualBytes < expectedBytes) { + return pad(hex, { size: expectedBytes, dir: 'right' }) + } + return hex + } + } + return value +} + +/** + * Coerce an array of values to match their expected ABI types. + */ +function coerceArgsForAbi(abiInputs: readonly AbiInput[], args: unknown[]): unknown[] { + return args.map((arg, i) => { + if (i < abiInputs.length && abiInputs[i].type) { + return coerceValueForType(abiInputs[i].type, arg) + } + return arg + }) +} + +// Web3's ABI coder returned bigint values as strings. Convert to match. +function bigintToString(value: unknown): unknown { + if (typeof value === 'bigint') { + return value.toString() + } + if (Array.isArray(value)) { + return value.map(bigintToString) + } + return value +} + +export const viemAbiCoder: AbiCoder = { + decodeLog(inputs: AbiInput[], hexString: string, topics: string[]): EventLog { + const eventInputs = inputs.map((input: AbiInput) => ({ + ...input, + indexed: input.indexed ?? false, + })) + const abi = [{ type: 'event' as const, name: 'Event', inputs: eventInputs }] + // Web3 convention: topics passed WITHOUT event signature hash (topics[0] stripped). + // Viem's decodeEventLog expects topics[0] to be the event signature. Prepend it. + const sig = `Event(${eventInputs.map((i: AbiInput) => i.type).join(',')})` + const eventSigHash = toEventHash(sig) + const fullTopics = [eventSigHash, ...topics] as [`0x${string}`, ...`0x${string}`[]] + try { + const decoded = decodeEventLog({ + abi, + data: hexString as `0x${string}`, + topics: fullTopics, + }) + // Convert bigint values to strings to match web3 behavior + const args = (decoded as { args?: Record }).args + if (args && typeof args === 'object') { + for (const key of Object.keys(args)) { + args[key] = bigintToString(args[key]) + } + } + return args as unknown as EventLog + } catch { + return {} as unknown as EventLog + } + }, + encodeParameter(type: string, parameter: unknown): string { + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- viem's encodeAbiParameters has deeply recursive types incompatible with unknown + return encodeAbiParameters([{ type } as AbiParameter], [ + coerceValueForType(type, parameter), + ] as any) + }, + encodeParameters(types: string[], parameters: unknown[]): string { + const abiParams = types.map((type) => ({ type }) as AbiParameter) + const coerced = parameters.map((param, i) => coerceValueForType(types[i], param)) + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- viem's encodeAbiParameters has deeply recursive types incompatible with unknown + return encodeAbiParameters(abiParams, coerced as any) + }, + encodeEventSignature(name: string | object): string { + if (typeof name === 'string') { + return toEventHash(name) + } + const abiItem = name as AbiItem + const sig = `${abiItem.name}(${(abiItem.inputs || []).map((i: AbiInput) => i.type).join(',')})` + return toEventHash(sig) + }, + encodeFunctionCall(jsonInterface: object, parameters: unknown[]): string { + return encodeFunctionData({ + abi: [jsonInterface as AbiItem], + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- viem's encodeFunctionData has deeply recursive types incompatible with unknown + args: parameters as any, + }) + }, + encodeFunctionSignature(name: string | object): string { + if (typeof name === 'string') { + return toFunctionHash(name).slice(0, 10) + } + const abiItem = name as AbiItem + const sig = `${abiItem.name}(${(abiItem.inputs || []).map((i: AbiInput) => i.type).join(',')})` + return toFunctionHash(sig).slice(0, 10) + }, + decodeParameter(type: string, hex: string): unknown { + const hexPrefixed = hex.startsWith('0x') ? hex : `0x${hex}` + const result = decodeAbiParameters([{ type } as AbiParameter], hexPrefixed as `0x${string}`) + return bigintToString(result[0]) + }, + decodeParameters(types: (string | AbiInput)[], hex: string): DecodedParamsObject { + const abiParams = types.map((type) => + typeof type === 'string' ? ({ type } as AbiParameter) : type + ) + // Ensure 0x prefix (web3 accepted both, viem requires it) + const hexPrefixed = hex.startsWith('0x') ? hex : `0x${hex}` + const result = decodeAbiParameters(abiParams, hexPrefixed as `0x${string}`) + const output: DecodedParamsObject = { __length__: result.length } + for (let i = 0; i < result.length; i++) { + const val = bigintToString(result[i]) + output[i] = val + if (abiParams[i].name) { + output[abiParams[i].name!] = val + } + } + return output + }, +} + +// Web3 compatibility shim + +function createWeb3ContractConstructor(connection: Connection) { + return class Web3CompatContract implements Contract { + options: { address: string; jsonInterface: AbiItem[] } + _address: string + events: { [key: string]: AbiItem } = {} + + constructor(abi: readonly AbiItem[] | AbiItem[], address?: string) { + this._address = address || '' + // Compute signature for function/event ABI items (web3 did this automatically) + const enrichedAbi = abi.map((item: AbiItem) => { + if (item.type === 'function' && !('signature' in item)) { + const sig = `${item.name}(${(item.inputs || []).map((i: AbiInput) => i.type).join(',')})` + return { ...item, signature: toFunctionHash(sig).slice(0, 10) } + } + if (item.type === 'event' && !('signature' in item)) { + const sig = `${item.name}(${(item.inputs || []).map((i: AbiInput) => i.type).join(',')})` + return { ...item, signature: toEventHash(sig) } + } + return item + }) + this.options = { address: this._address, jsonInterface: enrichedAbi } + // Build events map from ABI + for (const item of enrichedAbi) { + if (item.type === 'event' && item.name) { + this.events[item.name] = item + } + } + } + + get methods() { + const contract = this + const abi = this.options.jsonInterface + return new Proxy( + {}, + { + get(_target, prop: string) { + const methodAbi = abi.find( + (item: AbiItem) => item.type === 'function' && item.name === prop + ) + if (!methodAbi) { + return (..._args: unknown[]) => ({ + call: async () => { + throw new Error(`Method ${prop} not found in ABI`) + }, + send: () => { + throw new Error(`Method ${prop} not found in ABI`) + }, + estimateGas: async () => 0, + encodeABI: () => '0x', + _parent: contract, + }) + } + return (...rawArgs: unknown[]) => { + const args = methodAbi.inputs ? coerceArgsForAbi(methodAbi.inputs, rawArgs) : rawArgs + return { + call: async (txParams?: CeloTx) => { + const data = encodeFunctionData({ + abi: [methodAbi], + args, + }) + const callParams = { + to: contract._address, + data, + from: txParams?.from, + } + const response = await connection.rpcCaller.call('eth_call', [ + callParams, + 'latest', + ]) + const result = response.result as string + if ( + !result || + result === '0x' || + !methodAbi.outputs || + methodAbi.outputs.length === 0 + ) { + return result + } + const decoded = viemAbiCoder.decodeParameters(methodAbi.outputs, result) + if (methodAbi.outputs.length === 1) return decoded[0] + // Remove __length__ for contract call results (web3 didn't include it) + const { __length__, ...rest } = decoded + return rest + }, + send: (txParams?: CeloTx) => { + const data = encodeFunctionData({ + abi: [methodAbi], + args, + }) + const sendTx = { + ...txParams, + to: contract._address, + data, + } + return createPromiEvent(connection, sendTx, abi) + }, + estimateGas: async (txParams?: CeloTx) => { + const data = encodeFunctionData({ + abi: [methodAbi], + args, + }) + return connection.estimateGas({ + ...txParams, + to: contract._address, + data, + }) + }, + encodeABI: () => { + return encodeFunctionData({ + abi: [methodAbi], + args, + }) + }, + _parent: contract, + arguments: args, + } + } + }, + } + ) + } + + deploy(params: { data: string; arguments?: unknown[] }): CeloTxObject { + const constructorAbi = this.options.jsonInterface.find( + (item: AbiItem) => item.type === 'constructor' + ) + let data = params.data + if (constructorAbi && params.arguments && params.arguments.length > 0) { + const types = constructorAbi.inputs!.map((i: AbiInput) => i.type) + const encodedArgs = viemAbiCoder.encodeParameters(types, params.arguments).slice(2) + data = data + encodedArgs + } + const contract = this + return { + call: async () => data, + send: (txParams?: CeloTx) => { + const pe = createPromiEvent(connection, { ...txParams, data }, this.options.jsonInterface) + // web3's deploy().send() resolves to the deployed Contract instance, + // not the receipt. Wrap the result to match that behavior. + const jsonInterface = this.options.jsonInterface + const ContractClass = this.constructor as new ( + abi: AbiItem[], + address?: string + ) => Contract + const wrappedPromise = pe.then((receipt: CeloTxReceipt) => { + const deployed = new ContractClass(jsonInterface, receipt.contractAddress) + return deployed + }) + const result = wrappedPromise as unknown as PromiEvent + result.on = pe.on + result.once = pe.once + return result + }, + estimateGas: async (txParams?: CeloTx) => { + return connection.estimateGas({ ...txParams, data }) + }, + encodeABI: () => data, + _parent: contract, + arguments: params.arguments || [], + } as CeloTxObject + } + + async getPastEvents(event: string, options: PastEventOptions): Promise { + const eventAbi = this.options.jsonInterface.find( + (item: AbiItem) => item.type === 'event' && item.name === event + ) + if (!eventAbi) return [] + + const eventSig = viemAbiCoder.encodeEventSignature(eventAbi) + const topics: (string | null)[] = [eventSig] + + const params: { + address: string + topics: (string | null)[] + fromBlock?: BlockNumber + toBlock?: BlockNumber + } = { + address: this._address, + topics, + fromBlock: + options.fromBlock != null ? inputBlockNumberFormatter(options.fromBlock) : undefined, + toBlock: options.toBlock != null ? inputBlockNumberFormatter(options.toBlock) : undefined, + } + + const response = await connection.rpcCaller.call('eth_getLogs', [params]) + const logs = response.result as Log[] + return logs.map((log: Log) => { + let returnValues: Record = {} + try { + returnValues = viemAbiCoder.decodeLog( + eventAbi.inputs || [], + log.data, + log.topics.slice(1) + ) as unknown as Record + } catch {} + return { + event: eventAbi.name!, + address: log.address, + returnValues, + logIndex: log.logIndex, + transactionIndex: log.transactionIndex, + transactionHash: log.transactionHash, + blockHash: log.blockHash, + blockNumber: log.blockNumber, + raw: { data: log.data, topics: log.topics }, + } + }) + } + } +} + +function createPromiEvent( + connection: Connection, + sendTx: CeloTx, + abi?: AbiItem[] +): PromiEvent { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const listeners: Record void)[]> = {} + + const promise = new Promise(async (resolve, reject) => { + try { + const hash = await new Promise((res, rej) => { + ;(connection.currentProvider as Provider).send( + { + id: getRandomId(), + jsonrpc: '2.0', + method: 'eth_sendTransaction', + params: [sendTx], + }, + (error, resp) => { + if (error) rej(error) + else if (resp?.error) rej(new Error(resp.error.message)) + else if (resp) res(resp.result as string) + else rej(new Error('empty-response')) + } + ) + }) + ;(listeners.transactionHash || []).forEach((fn) => fn(hash)) + + let receipt = await pollForReceiptHelper(hash, (h) => connection.getTransactionReceipt(h)) + if (abi && abi.length > 0) { + receipt = decodeReceiptEvents(receipt, abi, viemAbiCoder) + } + ;(listeners.receipt || []).forEach((fn) => fn(receipt)) + + resolve(receipt) + } catch (err) { + ;(listeners.error || []).forEach((fn) => fn(err, false)) + reject(err) + } + }) + + const pe = promise as PromiEvent + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ;(pe as any).on = (event: string, fn: (...args: any[]) => void) => { + ;(listeners[event] = listeners[event] || []).push(fn) + return pe + } + ;(pe as any).once = (pe as any).on + + return pe +} + +async function pollForReceiptHelper( + txHash: string, + fetchReceipt: (hash: string) => Promise +): Promise { + const POLL_INTERVAL = 100 + const MAX_ATTEMPTS = 600 + for (let i = 0; i < MAX_ATTEMPTS; i++) { + const receipt = await fetchReceipt(txHash) + if (receipt) { + return receipt + } + await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL)) + } + throw new Error(`Transaction receipt not found after ${MAX_ATTEMPTS} attempts: ${txHash}`) +} + +function decodeReceiptEvents( + receipt: CeloTxReceipt, + abi: AbiItem[], + coder: AbiCoder +): CeloTxReceipt { + if (!receipt.logs || !Array.isArray(receipt.logs)) return receipt + const eventAbis = abi.filter((entry: AbiItem) => entry.type === 'event') + if (eventAbis.length === 0) return receipt + + const events: { [eventName: string]: EventLog } = {} + for (const log of receipt.logs) { + if (!log.topics || log.topics.length === 0) continue + const topicHash = log.topics[0] + for (const eventAbi of eventAbis) { + const signature = coder.encodeEventSignature(eventAbi) + if (signature === topicHash) { + let returnValues: Record = {} + try { + returnValues = coder.decodeLog( + eventAbi.inputs || [], + log.data, + log.topics.slice(1) + ) as unknown as Record + } catch {} + events[eventAbi.name!] = { + event: eventAbi.name!, + address: log.address, + returnValues, + logIndex: log.logIndex, + transactionIndex: log.transactionIndex, + transactionHash: log.transactionHash, + blockHash: log.blockHash, + blockNumber: log.blockNumber, + raw: { data: log.data, topics: log.topics }, + } + break + } + } + } + if (Object.keys(events).length > 0) { + receipt.events = events + } + return receipt +} + +function createWeb3Shim(connection: Connection): Web3 { + const ContractConstructor = createWeb3ContractConstructor(connection) + const shim = { + eth: { + Contract: ContractConstructor, + net: { + isListening: () => connection.isListening(), + }, + getBalance: (address: string) => connection.getBalance(address), + getStorageAt: (address: string, position: number | string) => + connection.getStorageAt(address, position), + sign: (data: string, address: string) => connection.sign(data, address), + getAccounts: () => connection.getAccounts(), + getTransactionReceipt: (hash: string) => connection.getTransactionReceipt(hash), + getBlockNumber: () => connection.getBlockNumber(), + getBlock: (blockNumber: BlockNumber, fullTxObjects?: boolean) => + connection.getBlock(blockNumber, fullTxObjects ?? false), + getPastLogs: async (options: { + topics?: (string | null)[] + fromBlock?: string | number + toBlock?: string | number + address?: string + }) => { + const params = { + ...options, + fromBlock: + options.fromBlock != null ? inputBlockNumberFormatter(options.fromBlock) : undefined, + toBlock: options.toBlock != null ? inputBlockNumberFormatter(options.toBlock) : undefined, + } + const response = await connection.rpcCaller.call('eth_getLogs', [params]) + const logs = response.result as Log[] + // web3 returned checksummed addresses; raw RPC returns lowercase + return logs.map((log: Log) => ({ + ...log, + address: log.address ? toChecksumAddress(log.address) : log.address, + })) + }, + call: async (tx: CeloTx) => { + const response = await connection.rpcCaller.call('eth_call', [tx, 'latest']) + return response.result as string + }, + sendTransaction: (tx: CeloTx) => { + return createPromiEvent(connection, tx) + }, + signTransaction: async (tx: CeloTx) => { + const response = await new Promise<{ raw: string; tx: CeloTxReceipt }>( + (resolve, reject) => { + ;(connection.currentProvider as Provider).send( + { + id: Date.now(), + jsonrpc: '2.0', + method: 'eth_signTransaction', + params: [tx], + }, + (err, res) => { + if (err) reject(err) + else resolve(res?.result) + } + ) + } + ) + return response + }, + abi: viemAbiCoder, + getChainId: () => connection.chainId(), + isSyncing: () => connection.isSyncing(), + handleRevert: false, + transactionPollingInterval: 100, + defaultAccount: null as string | null, + accounts: { + create: () => { + const crypto = require('crypto') + const privateKey = '0x' + crypto.randomBytes(32).toString('hex') + const { privateKeyToAddress } = require('@celo/utils/lib/address') + const address = privateKeyToAddress(privateKey) + return { address, privateKey } + }, + }, + personal: { + lockAccount: (address: string) => + connection.rpcCaller.call('personal_lockAccount', [address]).then((r) => !!r.result), + unlockAccount: (address: string, password: string, duration: number) => + connection.rpcCaller + .call('personal_unlockAccount', [address, password, duration]) + .then((r) => !!r.result), + }, + }, + utils: { + soliditySha3: soliditySha3Fn, + sha3: soliditySha3Fn, + keccak256: (value: string) => keccak256(value as `0x${string}`), + toBN: (value: string | number | bigint) => BigInt(value), + toWei: (value: string, unit?: string) => { + if (!unit || unit === 'ether') return parseEther(value).toString() + return value + }, + fromWei: (value: string, unit?: string) => { + if (!unit || unit === 'ether') return formatEther(BigInt(value)) + return value + }, + isAddress: (address: string) => isValidAddress(address), + toChecksumAddress: (address: string) => toChecksumAddress(address), + numberToHex: (value: number | string | bigint) => viemNumberToHex(BigInt(value)), + hexToNumber: (hex: string) => Number(BigInt(hex)), + toHex: (value: string | number | bigint) => { + if (typeof value === 'number' || typeof value === 'bigint') { + return viemNumberToHex(BigInt(value)) + } + return ensureLeading0x(value.toString()) + }, + hexToAscii: (hex: string) => hexToString(hex as `0x${string}`), + randomHex: (size: number) => { + const bytes = new Uint8Array(size) + for (let i = 0; i < size; i++) { + bytes[i] = Math.floor(Math.random() * 256) + } + return ensureLeading0x( + Array.from(bytes) + .map((b) => b.toString(16).padStart(2, '0')) + .join('') + ) + }, + _jsonInterfaceMethodToString: (abiItem: AbiItem) => { + if (abiItem.name) { + return `${abiItem.name}(${(abiItem.inputs || []).map((i: AbiInput) => i.type).join(',')})` + } + return '' + }, + }, + get currentProvider() { + return connection.currentProvider + }, + setProvider: (provider: Provider) => connection.setProvider(provider), + } + return shim +} diff --git a/packages/sdk/connect/src/types.ts b/packages/sdk/connect/src/types.ts index 519349a7b..fcbe67ec1 100644 --- a/packages/sdk/connect/src/types.ts +++ b/packages/sdk/connect/src/types.ts @@ -1,23 +1,24 @@ import { StrongAddress } from '@celo/base' -import Web3 from 'web3' -import { - AccessList, - PromiEvent, - Transaction, - TransactionConfig, - TransactionReceipt, -} from 'web3-core' -import { Contract } from 'web3-eth-contract' +import type { AbiItem } from './abi-types' export type Address = string export type Hex = `0x${string}` export interface CeloParams { feeCurrency: StrongAddress - maxFeeInFeeCurrency?: Hex | string | bigint | ReturnType + maxFeeInFeeCurrency?: Hex | string | bigint } export type AccessListRaw = [string, string[]][] +/** EIP-2930 access list entry */ +export interface AccessListEntry { + address: string + storageKeys: string[] +} + +/** EIP-2930 access list */ +export type AccessList = AccessListEntry[] + export type HexOrMissing = Hex | undefined export interface FormattedCeloTx { chainId: number @@ -36,11 +37,29 @@ export interface FormattedCeloTx { type: TransactionTypes } -export type CeloTx = TransactionConfig & - Partial & { accessList?: AccessList; type?: TransactionTypes } +/** Transaction configuration - replaces web3's TransactionConfig */ +export interface CeloTx extends Partial { + from?: string | number + to?: string + value?: number | string | bigint + gas?: number | string + gasPrice?: number | string | bigint + maxFeePerGas?: number | string | bigint + maxPriorityFeePerGas?: number | string | bigint + data?: string + nonce?: number + chainId?: number + chain?: string + hardfork?: string + common?: Record + accessList?: AccessList + type?: TransactionTypes +} + export type WithSig = T & { v: number; s: string; r: string; yParity: 0 | 1 } export type CeloTxWithSig = WithSig export interface CeloTxObject { + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- must remain any for backward compat with generated contract types arguments: any[] call(tx?: CeloTx): Promise send(tx?: CeloTx): PromiEvent @@ -49,9 +68,129 @@ export interface CeloTxObject { _parent: Contract } -export { BlockNumber, EventLog, Log, PromiEvent, Sign } from 'web3-core' -export { Block, BlockHeader, Syncing } from 'web3-eth' -export { Contract, ContractSendMethod, PastEventOptions } from 'web3-eth-contract' +/** Block number can be a number, hex string, or named tag */ +export type BlockNumber = string | number + +/** Event log entry */ +export interface EventLog { + event: string + address: string + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- decoded event values have dynamic types based on ABI + returnValues: Record + logIndex: number + transactionIndex: number + transactionHash: string + blockHash: string + blockNumber: number + raw?: { data: string; topics: string[] } +} + +/** Transaction log entry */ +export interface Log { + address: string + data: string + topics: string[] + logIndex: number + transactionIndex: number + transactionHash: string + blockHash: string + blockNumber: number + id?: string +} + +/** PromiEvent - a Promise that also emits events */ +export interface PromiEvent extends Promise { + once(type: 'transactionHash', handler: (receipt: string) => void): PromiEvent + once(type: 'receipt', handler: (receipt: T) => void): PromiEvent + once(type: 'confirmation', handler: (confNumber: number, receipt: T) => void): PromiEvent + once(type: 'error', handler: (error: Error) => void): PromiEvent + on(type: 'transactionHash', handler: (receipt: string) => void): PromiEvent + on(type: 'receipt', handler: (receipt: T) => void): PromiEvent + on(type: 'confirmation', handler: (confNumber: number, receipt: T) => void): PromiEvent + on(type: 'error', handler: (error: Error, receipt?: T) => void): PromiEvent +} + +export interface Sign { + message: string + messageHash?: string + r: string + s: string + v: string + signature: string +} + +/** Block header */ +export interface BlockHeader { + number: number + hash: string + parentHash: string + nonce: string + sha3Uncles: string + logsBloom: string + transactionsRoot: string + stateRoot: string + receiptsRoot: string + miner: string + extraData: string + gasLimit: number + gasUsed: number + timestamp: number | string + baseFeePerGas?: number | string + size?: number +} + +/** Block with transactions */ +export interface Block extends BlockHeader { + transactions: (string | CeloTxPending)[] + difficulty?: string + totalDifficulty?: string + uncles?: string[] +} + +/** Sync status */ +export type Syncing = + | false + | { + startingBlock: number + currentBlock: number + highestBlock: number + knownStates?: number + pulledStates?: number + } + +/** Contract interface - replaces web3-eth-contract Contract */ +export interface Contract { + options: { + address: string + jsonInterface: AbiItem[] + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- contravariant: specific method params must be assignable + methods: { [key: string]: (...args: any[]) => CeloTxObject } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + deploy(params: { data: string; arguments?: any[] }): CeloTxObject + getPastEvents(event: string, options: PastEventOptions): Promise + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- must accommodate ContractEvent types from generated contracts + events: { [key: string]: any } + _address: string +} + +/** ContractSendMethod - retained for backward compatibility */ +export interface ContractSendMethod { + send( + options: CeloTx, + callback?: (err: Error | null, transactionHash: string) => void + ): PromiEvent + estimateGas(options: CeloTx, callback?: (err: Error | null, gas: number) => void): Promise + encodeABI(): string +} + +/** PastEventOptions - retained for backward compatibility */ +export interface PastEventOptions { + filter?: Record + fromBlock?: BlockNumber + toBlock?: BlockNumber + topics?: string[] +} export type TransactionTypes = 'ethereum-legacy' | 'eip1559' | 'cip42' | 'cip64' | 'cip66' @@ -99,8 +238,43 @@ export interface EncodedTransaction { tx: EthereumLegacyTXProperties | EIP1559TXProperties | CIP64TXProperties | CIP66TXProperties } -export type CeloTxPending = Transaction & Partial -export type CeloTxReceipt = TransactionReceipt & Partial +/** Pending transaction */ +export interface CeloTxPending extends Partial { + hash: string + nonce: number + blockHash: string | null + blockNumber: number | null + transactionIndex: number | null + from: string + to: string | null + value: string + gasPrice?: string + maxFeePerGas?: string + maxPriorityFeePerGas?: string + gas: number + input: string + v?: string + r?: string + s?: string +} + +/** Transaction receipt */ +export interface CeloTxReceipt extends Partial { + status: boolean + transactionHash: string + transactionIndex: number + blockHash: string + blockNumber: number + from: string + to: string + contractAddress?: string + cumulativeGasUsed: number + gasUsed: number + effectiveGasPrice?: number + logs: Log[] + logsBloom: string + events?: { [eventName: string]: EventLog } +} export type Callback = (error: Error | null, result?: T) => void diff --git a/packages/sdk/connect/src/utils/abi-utils.ts b/packages/sdk/connect/src/utils/abi-utils.ts index e6bb60031..c7959588c 100644 --- a/packages/sdk/connect/src/utils/abi-utils.ts +++ b/packages/sdk/connect/src/utils/abi-utils.ts @@ -95,5 +95,5 @@ export const signatureToAbiDefinition = (fnSignature: string): ABIDefinition => } /** @internal */ -export const decodeStringParameter = (ethAbi: AbiCoder, str: string) => - ethAbi.decodeParameter('string', ensureLeading0x(str)) +export const decodeStringParameter = (ethAbi: AbiCoder, str: string): string => + ethAbi.decodeParameter('string', ensureLeading0x(str)) as string diff --git a/packages/sdk/connect/src/utils/formatter.ts b/packages/sdk/connect/src/utils/formatter.ts index 15f5ec64b..405e2f460 100644 --- a/packages/sdk/connect/src/utils/formatter.ts +++ b/packages/sdk/connect/src/utils/formatter.ts @@ -3,8 +3,8 @@ import { isValidAddress, toChecksumAddress } from '@celo/utils/lib/address' import { sha3 } from '@celo/utils/lib/solidity' import BigNumber from 'bignumber.js' import { encode } from 'utf8' -import { AccessList } from 'web3-core' import { + AccessList, AccessListRaw, Block, BlockHeader, @@ -130,6 +130,9 @@ export function outputCeloTxReceiptFormatter(receipt: any): CeloTxReceipt { } receipt.cumulativeGasUsed = hexToNumber(receipt.cumulativeGasUsed) receipt.gasUsed = hexToNumber(receipt.gasUsed) + if (receipt.effectiveGasPrice) { + receipt.effectiveGasPrice = hexToNumber(receipt.effectiveGasPrice) + } if (Array.isArray(receipt.logs)) { receipt.logs = receipt.logs.map(outputLogFormatter) diff --git a/packages/sdk/connect/src/utils/rpc-caller.ts b/packages/sdk/connect/src/utils/rpc-caller.ts index d8c439572..ee1ca5d1f 100644 --- a/packages/sdk/connect/src/utils/rpc-caller.ts +++ b/packages/sdk/connect/src/utils/rpc-caller.ts @@ -5,6 +5,60 @@ const debugRpcPayload = debugFactory('rpc:payload') const debugRpcResponse = debugFactory('rpc:response') const debugRpcCallback = debugFactory('rpc:callback:exception') +const SENSITIVE_METHODS = new Set([ + 'personal_unlockAccount', + 'personal_sign', + 'personal_importRawKey', +]) + +const SENSITIVE_KEYS = new Set(['password', 'privateKey', 'rawKey', 'secret', 'passphrase']) + +function deepSanitize(value: unknown): unknown { + if (value === null || value === undefined) { + return value + } + if (Array.isArray(value)) { + return value.map(deepSanitize) + } + if (typeof value === 'object') { + const sanitized: Record = {} + for (const [key, val] of Object.entries(value)) { + sanitized[key] = SENSITIVE_KEYS.has(key) ? '[REDACTED]' : deepSanitize(val) + } + return sanitized + } + return value +} + +function sanitizeRpcPayload(payload: JsonRpcPayload): Record { + if (SENSITIVE_METHODS.has(payload.method)) { + return { + id: payload.id, + jsonrpc: payload.jsonrpc, + method: payload.method, + params: '[REDACTED]', + } + } + return { + id: payload.id, + jsonrpc: payload.jsonrpc, + method: payload.method, + params: deepSanitize(payload.params), + } +} + +function sanitizeRpcResponse(response?: JsonRpcResponse): Record | undefined { + if (!response) { + return response + } + return { + id: response.id, + jsonrpc: response.jsonrpc, + result: deepSanitize(response.result), + error: response.error, + } +} + export function rpcCallHandler( payload: JsonRpcPayload, handler: (p: JsonRpcPayload) => Promise, @@ -96,7 +150,7 @@ export class HttpRpcCaller implements RpcCaller { payload: JsonRpcPayload, callback: (error: Error | null, result?: JsonRpcResponse) => void ): void { - debugRpcPayload('%O', payload) + debugRpcPayload('%O', sanitizeRpcPayload(payload)) const decoratedCallback: Callback = ( error: Error | null, @@ -107,7 +161,7 @@ export class HttpRpcCaller implements RpcCaller { if (error) { err = error } - debugRpcResponse('%O', result) + debugRpcResponse('%O', sanitizeRpcResponse(result)) // The provider send call will not provide an error to the callback if // the result itself specifies an error. Here, we extract the error in the // result. diff --git a/packages/sdk/connect/src/utils/tx-params-normalizer.test.ts b/packages/sdk/connect/src/utils/tx-params-normalizer.test.ts index c0f80bce0..e1ad384b5 100644 --- a/packages/sdk/connect/src/utils/tx-params-normalizer.test.ts +++ b/packages/sdk/connect/src/utils/tx-params-normalizer.test.ts @@ -1,6 +1,5 @@ -import Web3 from 'web3' import { Connection } from '../connection' -import { Callback, CeloTx, JsonRpcPayload, JsonRpcResponse } from '../types' +import { Callback, CeloTx, JsonRpcPayload, JsonRpcResponse, Provider } from '../types' import { RpcCaller } from './rpc-caller' import { TxParamsNormalizer } from './tx-params-normalizer' @@ -38,7 +37,12 @@ describe('TxParamsNormalizer class', () => { // noop }, } - const connection = new Connection(new Web3('http://localhost:8545')) + const mockProvider: Provider = { + send(_payload: JsonRpcPayload, _callback: Callback): void { + // noop + }, + } + const connection = new Connection(mockProvider) connection.rpcCaller = rpcMock mockGasEstimation = jest.fn( ( diff --git a/packages/sdk/connect/src/utils/tx-result.ts b/packages/sdk/connect/src/utils/tx-result.ts index be857011f..adce4736f 100644 --- a/packages/sdk/connect/src/utils/tx-result.ts +++ b/packages/sdk/connect/src/utils/tx-result.ts @@ -1,14 +1,19 @@ import { Future } from '@celo/base/lib/future' import debugFactory from 'debug' -import { CeloTxReceipt, PromiEvent } from '../types' +import { CeloTxReceipt, Error as ConnectError, PromiEvent } from '../types' const debug = debugFactory('connection:tx:result') +export type ReceiptFetcher = (txHash: string) => Promise + /** - * Transforms a `PromiEvent` to a `TransactionResult`. + * Transforms a `PromiEvent` or a `Promise` (tx hash) to a `TransactionResult`. */ -export function toTxResult(pe: PromiEvent) { - return new TransactionResult(pe) +export function toTxResult( + pe: PromiEvent | Promise, + fetchReceipt?: ReceiptFetcher +) { + return new TransactionResult(pe, fetchReceipt) } /** @@ -20,26 +25,51 @@ export class TransactionResult { private hashFuture = new Future() private receiptFuture = new Future() - constructor(pe: PromiEvent) { - void pe - .on('transactionHash', (hash: string) => { - debug('hash: %s', hash) - this.hashFuture.resolve(hash) - }) - .on('receipt', (receipt: CeloTxReceipt) => { - debug('receipt: %O', receipt) - this.receiptFuture.resolve(receipt) - }) + constructor(pe: PromiEvent | Promise, fetchReceipt?: ReceiptFetcher) { + if (isPromiEvent(pe)) { + void pe + .on('transactionHash', (hash: string) => { + debug('hash: %s', hash) + this.hashFuture.resolve(hash) + }) + .on('receipt', (receipt: CeloTxReceipt) => { + debug('receipt: %O', receipt) + this.receiptFuture.resolve(receipt) + }) - .on('error', ((error: any, receipt: CeloTxReceipt | false) => { - if (!receipt) { + .on('error', ((error: ConnectError, receipt: CeloTxReceipt | false) => { + if (!receipt) { + debug('send-error: %o', error) + this.hashFuture.reject(error) + } else { + debug('mining-error: %o, %O', error, receipt) + } + this.receiptFuture.reject(error) + }) as (error: ConnectError) => void) + } else { + // Promise - just a tx hash, poll for receipt + pe.then( + async (hash: string) => { + debug('hash: %s', hash) + this.hashFuture.resolve(hash) + if (fetchReceipt) { + try { + const receipt = await pollForReceipt(hash, fetchReceipt) + debug('receipt: %O', receipt) + this.receiptFuture.resolve(receipt) + } catch (error) { + debug('receipt-poll-error: %o', error) + this.receiptFuture.reject(error) + } + } + }, + (error: Error) => { debug('send-error: %o', error) this.hashFuture.reject(error) - } else { - debug('mining-error: %o, %O', error, receipt) + this.receiptFuture.reject(error) } - this.receiptFuture.reject(error) - }) as any) + ) + } } /** Get (& wait for) transaction hash */ @@ -62,3 +92,25 @@ export class TransactionResult { return this.receiptFuture.wait() } } + +function isPromiEvent( + pe: PromiEvent | Promise +): pe is PromiEvent { + return 'on' in pe && typeof pe.on === 'function' +} + +async function pollForReceipt( + txHash: string, + fetchReceipt: ReceiptFetcher +): Promise { + const POLL_INTERVAL = 100 + const MAX_ATTEMPTS = 600 + for (let i = 0; i < MAX_ATTEMPTS; i++) { + const receipt = await fetchReceipt(txHash) + if (receipt) { + return receipt + } + await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL)) + } + throw new Error(`Transaction receipt not found after ${MAX_ATTEMPTS} attempts: ${txHash}`) +} diff --git a/packages/sdk/contractkit/package.json b/packages/sdk/contractkit/package.json index aad66d5ca..82659a629 100644 --- a/packages/sdk/contractkit/package.json +++ b/packages/sdk/contractkit/package.json @@ -38,9 +38,7 @@ "bignumber.js": "^9.0.0", "debug": "^4.1.1", "fp-ts": "2.16.9", - "semver": "^7.7.2", - "web3": "1.10.4", - "web3-core-helpers": "1.10.4" + "semver": "^7.7.2" }, "devDependencies": { "@celo/celo-devchain": "^7.0.0", diff --git a/packages/sdk/contractkit/src/celo-tokens.test.ts b/packages/sdk/contractkit/src/celo-tokens.test.ts index d1f0bce47..29cab8bd5 100644 --- a/packages/sdk/contractkit/src/celo-tokens.test.ts +++ b/packages/sdk/contractkit/src/celo-tokens.test.ts @@ -1,14 +1,13 @@ -import Web3 from 'web3' import { CeloContract } from './base' import { CeloTokenInfo, CeloTokens, StableToken, Token } from './celo-tokens' -import { ContractKit, newKitFromWeb3 } from './kit' +import { ContractKit, newKit } from './kit' describe('CeloTokens', () => { let kit: ContractKit let celoTokens: CeloTokens beforeEach(() => { - kit = newKitFromWeb3(new Web3('http://localhost:8545')) + kit = newKit('http://localhost:8545') celoTokens = kit.celoTokens }) diff --git a/packages/sdk/contractkit/src/contract-cache.test.ts b/packages/sdk/contractkit/src/contract-cache.test.ts index d2a3e652e..2c9e48d4d 100644 --- a/packages/sdk/contractkit/src/contract-cache.test.ts +++ b/packages/sdk/contractkit/src/contract-cache.test.ts @@ -1,9 +1,10 @@ import { Connection } from '@celo/connect' -import Web3 from 'web3' +import { getProviderForKit } from './setupForKits' import { CeloContract } from '.' import { AddressRegistry } from './address-registry' import { ValidWrappers, WrapperCache } from './contract-cache' import { Web3ContractCache } from './web3-contract-cache' +import * as crypto from 'crypto' const TestedWrappers: ValidWrappers[] = [ CeloContract.GoldToken, @@ -14,8 +15,8 @@ const TestedWrappers: ValidWrappers[] = [ ] function newWrapperCache() { - const web3 = new Web3('http://localhost:8545') - const connection = new Connection(web3) + const provider = getProviderForKit('http://localhost:8545', undefined) + const connection = new Connection(provider) const registry = new AddressRegistry(connection) const web3ContractCache = new Web3ContractCache(registry) const AnyContractAddress = '0xe832065fb5117dbddcb566ff7dc4340999583e38' @@ -36,8 +37,8 @@ describe('getContract()', () => { } test('should create a new instance when an address is provided', async () => { - const address1 = Web3.utils.randomHex(20) - const address2 = Web3.utils.randomHex(20) + const address1 = '0x' + crypto.randomBytes(20).toString('hex') + const address2 = '0x' + crypto.randomBytes(20).toString('hex') const contract1 = await contractCache.getContract(CeloContract.MultiSig, address1) const contract2 = await contractCache.getContract(CeloContract.MultiSig, address2) expect(contract1?.address).not.toEqual(contract2?.address) diff --git a/packages/sdk/contractkit/src/kit.test.ts b/packages/sdk/contractkit/src/kit.test.ts index f7912f1ac..f5e0b33a2 100644 --- a/packages/sdk/contractkit/src/kit.test.ts +++ b/packages/sdk/contractkit/src/kit.test.ts @@ -1,7 +1,6 @@ import { CeloTx, CeloTxObject, CeloTxReceipt, PromiEvent } from '@celo/connect' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { timeTravel } from '@celo/dev-utils/ganache-test' -import Web3 from 'web3' import { ContractKit, newKitFromWeb3 as newFullKitFromWeb3, @@ -9,6 +8,7 @@ import { newKitWithApiKey, } from './kit' import { newKitFromWeb3 as newMiniKitFromWeb3 } from './mini-kit' +import { getWeb3ForKit } from './setupForKits' import { promiEventSpy } from './test-utils/PromiEventStub' import { startAndFinishEpochProcess } from './test-utils/utils' @@ -49,7 +49,7 @@ export function txoStub(): TransactionObjectStub { ;[newFullKitFromWeb3, newMiniKitFromWeb3].forEach((newKitFromWeb3) => { describe('kit.sendTransactionObject()', () => { - const kit = newKitFromWeb3(new Web3('http://')) + const kit = newKitFromWeb3(getWeb3ForKit('http://', undefined)) test('should send transaction on simple case', async () => { const txo = txoStub() @@ -129,21 +129,18 @@ export function txoStub(): TransactionObjectStub { }) describe('newKitWithApiKey()', () => { - test('should set apiKey in request header', async () => { - jest.spyOn(Web3.providers, 'HttpProvider') - - newKitWithApiKey('http://', 'key') - expect(Web3.providers.HttpProvider).toHaveBeenCalledWith('http://', { - headers: [{ name: 'apiKey', value: 'key' }], - }) + test('should create kit with apiKey', async () => { + const kit = newKitWithApiKey('http://', 'key') + expect(kit).toBeDefined() + expect(kit.connection).toBeDefined() }) }) -testWithAnvilL2('kit', (web3: Web3) => { +testWithAnvilL2('kit', (client) => { let kit: ContractKit beforeAll(async () => { - kit = newKitFromWeb3(web3) + kit = newKitFromWeb3(client) }) describe('epochs', () => { @@ -155,11 +152,11 @@ testWithAnvilL2('kit', (web3: Web3) => { // Go 3 epochs ahead for (let i = 0; i < 3; i++) { - await timeTravel(epochDuration * 2, web3) + await timeTravel(epochDuration * 2, client) await startAndFinishEpochProcess(kit) } - await timeTravel(epochDuration * 2, web3) + await timeTravel(epochDuration * 2, client) const accounts = await kit.web3.eth.getAccounts() diff --git a/packages/sdk/contractkit/src/kit.ts b/packages/sdk/contractkit/src/kit.ts index acd28e73b..7f8690e92 100644 --- a/packages/sdk/contractkit/src/kit.ts +++ b/packages/sdk/contractkit/src/kit.ts @@ -1,11 +1,18 @@ // tslint:disable: ordered-imports import { StrongAddress } from '@celo/base' -import { CeloTx, CeloTxObject, Connection, ReadOnlyWallet, TransactionResult } from '@celo/connect' +import { + CeloTx, + CeloTxObject, + Connection, + Provider, + ReadOnlyWallet, + TransactionResult, + Web3, +} from '@celo/connect' import { EIP712TypedData } from '@celo/utils/lib/sign-typed-data-utils' import { Signature } from '@celo/utils/lib/signatureUtils' import { LocalWallet } from '@celo/wallet-local' import { BigNumber } from 'bignumber.js' -import Web3 from 'web3' import { AddressRegistry } from './address-registry' import { CeloContract } from './base' import { CeloTokens, EachCeloToken } from './celo-tokens' @@ -35,7 +42,7 @@ export { API_KEY_HEADER_KEY, HttpProviderOptions } from './setupForKits' * @param options to pass to the Web3 HttpProvider constructor */ export function newKit(url: string, wallet?: ReadOnlyWallet, options?: HttpProviderOptions) { - const web3: Web3 = getWeb3ForKit(url, options) + const web3 = getWeb3ForKit(url, options) return newKitFromWeb3(web3, wallet) } @@ -52,9 +59,12 @@ export function newKitWithApiKey(url: string, apiKey: string, wallet?: ReadOnlyW /** * Creates a new instance of the `ContractKit` with a web3 instance - * @param web3 Web3 instance + * @param web3 – a {@link Web3} shim, a raw Provider, or an object with `currentProvider` */ -export function newKitFromWeb3(web3: Web3, wallet: ReadOnlyWallet = new LocalWallet()) { +export function newKitFromWeb3( + web3: Web3 | { currentProvider: Provider }, + wallet: ReadOnlyWallet = new LocalWallet() +) { ensureCurrentProvider(web3) return new ContractKit(new Connection(web3, wallet)) } diff --git a/packages/sdk/contractkit/src/mini-kit.ts b/packages/sdk/contractkit/src/mini-kit.ts index ede8856cd..a0d07bca4 100644 --- a/packages/sdk/contractkit/src/mini-kit.ts +++ b/packages/sdk/contractkit/src/mini-kit.ts @@ -1,7 +1,6 @@ -import { Connection, ReadOnlyWallet } from '@celo/connect' +import { Connection, Provider, ReadOnlyWallet, Web3 } from '@celo/connect' import { LocalWallet } from '@celo/wallet-local' import { BigNumber } from 'bignumber.js' -import Web3 from 'web3' import { AddressRegistry } from './address-registry' import { CeloTokens, EachCeloToken } from './celo-tokens' import { MiniContractCache } from './mini-contract-cache' @@ -19,7 +18,7 @@ import { * @param options to pass to the Web3 HttpProvider constructor */ export function newKit(url: string, wallet?: ReadOnlyWallet, options?: HttpProviderOptions) { - const web3: Web3 = getWeb3ForKit(url, options) + const web3 = getWeb3ForKit(url, options) return newKitFromWeb3(web3, wallet) } @@ -36,9 +35,12 @@ export function newKitWithApiKey(url: string, apiKey: string, wallet?: ReadOnlyW /** * Creates a new instance of the `MiniContractKit` with a web3 instance - * @param web3 Web3 instance + * @param web3 – a {@link Web3} shim, a raw Provider, or an object with `currentProvider` */ -export function newKitFromWeb3(web3: Web3, wallet: ReadOnlyWallet = new LocalWallet()) { +export function newKitFromWeb3( + web3: Web3 | { currentProvider: Provider }, + wallet: ReadOnlyWallet = new LocalWallet() +) { ensureCurrentProvider(web3) return new MiniContractKit(new Connection(web3, wallet)) } diff --git a/packages/sdk/contractkit/src/proxy.ts b/packages/sdk/contractkit/src/proxy.ts index 3dac861ba..4a15b4977 100644 --- a/packages/sdk/contractkit/src/proxy.ts +++ b/packages/sdk/contractkit/src/proxy.ts @@ -28,8 +28,7 @@ import { ABI as UniswapFeeHandlerSellerABI } from '@celo/abis/web3/UniswapFeeHan import { ABI as ValidatorsABI } from '@celo/abis/web3/Validators' import { ABI as ReserveABI } from '@celo/abis/web3/mento/Reserve' import { ABI as StableTokenABI } from '@celo/abis/web3/mento/StableToken' -import { ABIDefinition, AbiItem } from '@celo/connect' -import Web3 from 'web3' +import { ABIDefinition, AbiItem, Web3 } from '@celo/connect' export const GET_IMPLEMENTATION_ABI: ABIDefinition = { constant: true, diff --git a/packages/sdk/contractkit/src/setupForKits.ts b/packages/sdk/contractkit/src/setupForKits.ts index 4a27513da..f77983fb2 100644 --- a/packages/sdk/contractkit/src/setupForKits.ts +++ b/packages/sdk/contractkit/src/setupForKits.ts @@ -1,6 +1,11 @@ -import Web3 from 'web3' -import { HttpProviderOptions as Web3HttpProviderOptions } from 'web3-core-helpers' -export type HttpProviderOptions = Web3HttpProviderOptions +import { Provider, JsonRpcPayload, JsonRpcResponse } from '@celo/connect' +import * as http from 'http' +import * as https from 'https' +import * as net from 'net' + +export type HttpProviderOptions = { + headers?: { name: string; value: string }[] +} export const API_KEY_HEADER_KEY = 'apiKey' @@ -15,26 +20,129 @@ export function setupAPIKey(apiKey: string) { return options } /** @internal */ -export function ensureCurrentProvider(web3: Web3) { - if (!web3.currentProvider) { +export function ensureCurrentProvider(providerOrWeb3: Provider | { currentProvider?: Provider }) { + const provider = + providerOrWeb3 != null && + 'currentProvider' in providerOrWeb3 && + providerOrWeb3.currentProvider != null + ? providerOrWeb3.currentProvider + : providerOrWeb3 + if (!provider) { throw new Error('Must have a valid Provider') } } + +class SimpleHttpProvider implements Provider { + /** Compat with web3's HttpProvider which exposed .host */ + readonly host: string + + constructor( + readonly url: string, + private options?: HttpProviderOptions + ) { + this.host = url + } + + send(payload: JsonRpcPayload, callback: (error: Error | null, result?: JsonRpcResponse) => void) { + const body = JSON.stringify(payload) + const parsedUrl = new URL(this.url) + const isHttps = parsedUrl.protocol === 'https:' + const httpModule = isHttps ? https : http + + const headers: Record = { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(body).toString(), + } + + if (this.options?.headers) { + for (const h of this.options.headers) { + headers[h.name] = h.value + } + } + + const req = httpModule.request( + { + hostname: parsedUrl.hostname, + port: parsedUrl.port, + path: parsedUrl.pathname + parsedUrl.search, + method: 'POST', + headers, + }, + (res) => { + let data = '' + res.on('data', (chunk: string) => { + data += chunk + }) + res.on('end', () => { + try { + callback(null, JSON.parse(data)) + } catch (e) { + callback(new Error(`Invalid JSON response: ${data}`)) + } + }) + } + ) + + req.on('error', (err) => { + callback(err) + }) + + req.write(body) + req.end() + } +} + +class SimpleIpcProvider implements Provider { + constructor( + private path: string, + private netModule: typeof net + ) {} + + send(payload: JsonRpcPayload, callback: (error: Error | null, result?: JsonRpcResponse) => void) { + const body = JSON.stringify(payload) + const socket = this.netModule.connect({ path: this.path }) + let data = '' + + socket.on('connect', () => { + socket.write(body) + }) + + socket.on('data', (chunk: Buffer) => { + data += chunk.toString() + }) + + socket.on('end', () => { + try { + callback(null, JSON.parse(data)) + } catch (e) { + callback(new Error(`Invalid JSON response: ${data}`)) + } + }) + + socket.on('error', (err) => { + callback(err) + }) + } +} + /** @internal */ -export function getWeb3ForKit(url: string, options: Web3HttpProviderOptions | undefined) { - let web3: Web3 +export function getProviderForKit(url: string, options: HttpProviderOptions | undefined): Provider { if (url.endsWith('.ipc')) { - try { - const net = require('net') - web3 = new Web3(new Web3.providers.IpcProvider(url, net)) - } catch (e) { - console.error('.ipc only works in environments with native net module') - } - web3 = new Web3(url) - } else if (url.toLowerCase().startsWith('http')) { - web3 = new Web3(new Web3.providers.HttpProvider(url, options)) + return new SimpleIpcProvider(url, net) } else { - web3 = new Web3(url) + return new SimpleHttpProvider(url, options) } - return web3 +} + +/** + * @deprecated Use getProviderForKit instead + * @internal + */ +export function getWeb3ForKit( + url: string, + options: HttpProviderOptions | undefined +): { currentProvider: Provider } { + // Return an object that looks like Web3 for backward compat with Connection constructor + const provider = getProviderForKit(url, options) + return { currentProvider: provider } } diff --git a/packages/sdk/contractkit/src/utils/getParsedSignatureOfAddress.ts b/packages/sdk/contractkit/src/utils/getParsedSignatureOfAddress.ts index 53a7c5a74..cbe3d7dc7 100644 --- a/packages/sdk/contractkit/src/utils/getParsedSignatureOfAddress.ts +++ b/packages/sdk/contractkit/src/utils/getParsedSignatureOfAddress.ts @@ -1,9 +1,9 @@ import { Connection } from '@celo/connect' import { parseSignature } from '@celo/utils/lib/signatureUtils' -import Web3 from 'web3' +import type { SolidityValue } from '@celo/utils/lib/solidity' export const getParsedSignatureOfAddress = async ( - sha3: Web3['utils']['soliditySha3'], + sha3: (...args: SolidityValue[]) => string | null, sign: Connection['sign'], address: string, signer: string diff --git a/packages/sdk/contractkit/src/utils/signing.test.ts b/packages/sdk/contractkit/src/utils/signing.test.ts index e5c3a7643..4ede1917e 100644 --- a/packages/sdk/contractkit/src/utils/signing.test.ts +++ b/packages/sdk/contractkit/src/utils/signing.test.ts @@ -3,12 +3,12 @@ import { ACCOUNT_ADDRESSES, ACCOUNT_PRIVATE_KEYS } from '@celo/dev-utils/test-ac import { LocalSigner, NativeSigner, parseSignature } from '@celo/utils/lib/signatureUtils' // This only really tests signatureUtils in @celo/utils, but is tested here -// to avoid the web3/ganache setup in @celo/utils -testWithAnvilL2('Signing', (web3) => { +// to avoid the client/ganache setup in @celo/utils +testWithAnvilL2('Signing', (client) => { const account = ACCOUNT_ADDRESSES[0] const pKey = ACCOUNT_PRIVATE_KEYS[0] - const nativeSigner = NativeSigner(web3.eth.sign, account) + const nativeSigner = NativeSigner(client.eth.sign, account) const localSigner = LocalSigner(pKey) it('signs a message the same way via RPC and with an explicit private key', async () => { @@ -24,7 +24,7 @@ testWithAnvilL2('Signing', (web3) => { it('signs a message that was hashed the same way via RPC and with an explicit private key', async () => { // This test checks that the prefixing in `signMessage` appropriately considers hex strings // as bytes the same way the native RPC signing would - const message = web3.utils.soliditySha3('message')! + const message = client.utils.soliditySha3('message')! const nativeSignature = await nativeSigner.sign(message) const localSignature = await localSigner.sign(message) diff --git a/packages/sdk/contractkit/src/web3-contract-cache.test.ts b/packages/sdk/contractkit/src/web3-contract-cache.test.ts index 6fe044f9a..d194cfffb 100644 --- a/packages/sdk/contractkit/src/web3-contract-cache.test.ts +++ b/packages/sdk/contractkit/src/web3-contract-cache.test.ts @@ -1,13 +1,12 @@ import { Connection } from '@celo/connect' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' -import Web3 from 'web3' import { AddressRegistry } from './address-registry' import { AllContracts } from './index' import { Web3ContractCache } from './web3-contract-cache' -testWithAnvilL2('web3-contract-cache', (web3: Web3) => { +testWithAnvilL2('client-contract-cache', (client) => { function newWeb3ContractCache() { - const connection = new Connection(web3) + const connection = new Connection(client) const registry = new AddressRegistry(connection) const AnyContractAddress = '0xe832065fb5117dbddcb566ff7dc4340999583e38' jest.spyOn(registry, 'addressFor').mockResolvedValue(AnyContractAddress) diff --git a/packages/sdk/contractkit/src/wrappers/AbstractFeeCurrencyWrapper.ts b/packages/sdk/contractkit/src/wrappers/AbstractFeeCurrencyWrapper.ts index 446e601e8..4f639da3e 100644 --- a/packages/sdk/contractkit/src/wrappers/AbstractFeeCurrencyWrapper.ts +++ b/packages/sdk/contractkit/src/wrappers/AbstractFeeCurrencyWrapper.ts @@ -1,8 +1,8 @@ import { StrongAddress } from '@celo/base' -import { Contract } from '@celo/connect' +import { AbiItem, Contract } from '@celo/connect' import { BaseWrapper } from './BaseWrapper' -const MINIMAL_TOKEN_INFO_ABI = [ +const MINIMAL_TOKEN_INFO_ABI: AbiItem[] = [ { type: 'function' as const, stateMutability: 'view', @@ -51,7 +51,6 @@ export abstract class AbstractFeeCurrencyWrapper< return Promise.all( feeCurrencies.map(async (address) => { - // @ts-expect-error abi typing is not 100% correct but works let contract = new this.connection.web3.eth.Contract(MINIMAL_TOKEN_INFO_ABI, address) const adaptedToken = (await contract.methods @@ -66,7 +65,6 @@ export abstract class AbstractFeeCurrencyWrapper< // if standard didnt work try alt if (adaptedToken) { - // @ts-expect-error abi typing is not 100% correct but works contract = new this.connection.web3.eth.Contract(MINIMAL_TOKEN_INFO_ABI, adaptedToken) } diff --git a/packages/sdk/contractkit/src/wrappers/Accounts.test.ts b/packages/sdk/contractkit/src/wrappers/Accounts.test.ts index 8511912aa..cb035aac1 100644 --- a/packages/sdk/contractkit/src/wrappers/Accounts.test.ts +++ b/packages/sdk/contractkit/src/wrappers/Accounts.test.ts @@ -1,7 +1,6 @@ import { StrongAddress } from '@celo/base' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' -import Web3 from 'web3' import { ContractKit, newKitFromWeb3 } from '../kit' import { getParsedSignatureOfAddress } from '../utils/getParsedSignatureOfAddress' import { AccountsWrapper } from './Accounts' @@ -12,12 +11,12 @@ jest.setTimeout(10 * 1000) /* TEST NOTES: -- In migrations: The only account that has USDm is accounts[0] +- In migrations: The only account that has cUSD is accounts[0] */ -const minLockedGoldValue = Web3.utils.toWei('10000', 'ether') // 10k gold +const minLockedGoldValue = '10000000000000000000000' // 10k gold (10000 * 1e18) -testWithAnvilL2('Accounts Wrapper', (web3) => { +testWithAnvilL2('Accounts Wrapper', (client) => { let kit: ContractKit let accounts: StrongAddress[] = [] let accountsInstance: AccountsWrapper @@ -33,7 +32,7 @@ testWithAnvilL2('Accounts Wrapper', (web3) => { const getParsedSignatureOfAddressForTest = (address: string, signer: string) => { return getParsedSignatureOfAddress( - web3.utils.soliditySha3, + client.utils.soliditySha3, kit.connection.sign, address, signer @@ -41,7 +40,7 @@ testWithAnvilL2('Accounts Wrapper', (web3) => { } beforeAll(async () => { - kit = newKitFromWeb3(web3) + kit = newKitFromWeb3(client) accounts = await kit.connection.getAccounts() validators = await kit.contracts.getValidators() lockedGold = await kit.contracts.getLockedGold() diff --git a/packages/sdk/contractkit/src/wrappers/Accounts.ts b/packages/sdk/contractkit/src/wrappers/Accounts.ts index c3566c969..ddf02f572 100644 --- a/packages/sdk/contractkit/src/wrappers/Accounts.ts +++ b/packages/sdk/contractkit/src/wrappers/Accounts.ts @@ -503,7 +503,8 @@ export class AccountsWrapper extends BaseWrapper { } private keccak256(value: string | BN): string { - return this.connection.keccak256(value) + const strValue = typeof value === 'string' ? value : '0x' + value.toString(16) + return this.connection.keccak256(strValue) } } diff --git a/packages/sdk/contractkit/src/wrappers/Attestations.test.ts b/packages/sdk/contractkit/src/wrappers/Attestations.test.ts index c10d1b2ac..66f68828e 100644 --- a/packages/sdk/contractkit/src/wrappers/Attestations.test.ts +++ b/packages/sdk/contractkit/src/wrappers/Attestations.test.ts @@ -6,29 +6,29 @@ import { getIdentifierHash, IdentifierPrefix } from '@celo/odis-identifiers' import { newKitFromWeb3 } from '../kit' import { AttestationsWrapper } from './Attestations' -testWithAnvilL2('AttestationsWrapper', (web3) => { +testWithAnvilL2('AttestationsWrapper', (client) => { const PHONE_NUMBER = '+15555555555' const IDENTIFIER = getIdentifierHash( - web3.utils.sha3, + client.utils.sha3, PHONE_NUMBER, IdentifierPrefix.PHONE_NUMBER, 'pepper' ) - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) let accounts: StrongAddress[] = [] let attestations: AttestationsWrapper beforeAll(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] - const attestationsContractAddress = await deployAttestationsContract(web3, accounts[0]) + const attestationsContractAddress = await deployAttestationsContract(client, accounts[0]) attestations = new AttestationsWrapper( kit.connection, - newAttestations(web3, attestationsContractAddress), - newKitFromWeb3(web3).contracts + newAttestations(client, attestationsContractAddress), + newKitFromWeb3(client).contracts ) }) diff --git a/packages/sdk/contractkit/src/wrappers/BaseWrapper.test.ts b/packages/sdk/contractkit/src/wrappers/BaseWrapper.test.ts index fa52d0688..a7f0dc2da 100644 --- a/packages/sdk/contractkit/src/wrappers/BaseWrapper.test.ts +++ b/packages/sdk/contractkit/src/wrappers/BaseWrapper.test.ts @@ -1,25 +1,38 @@ import { NULL_ADDRESS } from '@celo/base' -import { CeloTxObject, Connection } from '@celo/connect' +import { Connection, Contract, Provider } from '@celo/connect' import BigNumber from 'bignumber.js' -import Web3 from 'web3' -import { - ICeloVersionedContract, - newICeloVersionedContract, -} from '@celo/abis/web3/ICeloVersionedContract' import { ContractVersion, newContractVersion } from '../versions' import { BaseWrapper, unixSecondsTimestampToDateString } from './BaseWrapper' -const web3 = new Web3('http://localhost:8545') -const mockContract = newICeloVersionedContract(web3, NULL_ADDRESS) const mockVersion = newContractVersion(1, 1, 1, 1) -// @ts-ignore -mockContract.methods.getVersionNumber = (): CeloTxObject => ({ - call: async () => mockVersion.toRaw(), -}) -class TestWrapper extends BaseWrapper { +const mockContract = { + options: { address: NULL_ADDRESS, jsonInterface: [] }, + methods: { + getVersionNumber: () => ({ + call: async () => mockVersion.toRaw(), + send: async () => ({}), + estimateGas: async () => 0, + encodeABI: () => '0x', + }), + }, + deploy: () => ({ + call: async () => ({}), + send: async () => ({}), + estimateGas: async () => 0, + encodeABI: () => '0x', + }), + getPastEvents: async () => [], + events: {}, + _address: NULL_ADDRESS, +} as unknown as Contract + +const mockProvider = { send: (_payload: unknown, _cb: unknown) => undefined } as unknown as Provider +const connection = new Connection(mockProvider) + +class TestWrapper extends BaseWrapper { constructor() { - super(new Connection(web3), mockContract) + super(connection, mockContract) } async protectedFunction(v: ContractVersion) { diff --git a/packages/sdk/contractkit/src/wrappers/BaseWrapper.ts b/packages/sdk/contractkit/src/wrappers/BaseWrapper.ts index cd129ec5b..231d9abba 100644 --- a/packages/sdk/contractkit/src/wrappers/BaseWrapper.ts +++ b/packages/sdk/contractkit/src/wrappers/BaseWrapper.ts @@ -1,4 +1,3 @@ -import { ICeloVersionedContract } from '@celo/abis/web3/ICeloVersionedContract' import { StrongAddress, bufferToHex, ensureLeading0x } from '@celo/base/lib/address' import { zip } from '@celo/base/lib/collections' import { @@ -14,6 +13,18 @@ import { fromFixed, toFixed } from '@celo/utils/lib/fixidity' import BigNumber from 'bignumber.js' import { ContractVersion } from '../versions' +/** Contract with getVersionNumber method */ +interface VersionedContract { + methods: { + getVersionNumber(): CeloTxObject<{ + 0: string + 1: string + 2: string + 3: string + }> + } +} + /** Represents web3 native contract Method */ type Method = (...args: I) => CeloTxObject @@ -27,9 +38,7 @@ type EventsEnum = { * @internal -- use its children */ export abstract class BaseWrapper { - protected _version?: T['methods'] extends ICeloVersionedContract['methods'] - ? ContractVersion - : never + protected _version?: T['methods'] extends VersionedContract['methods'] ? ContractVersion : never constructor( protected readonly connection: Connection, diff --git a/packages/sdk/contractkit/src/wrappers/Election.test.ts b/packages/sdk/contractkit/src/wrappers/Election.test.ts index f6d1606ac..2663bf23c 100644 --- a/packages/sdk/contractkit/src/wrappers/Election.test.ts +++ b/packages/sdk/contractkit/src/wrappers/Election.test.ts @@ -1,7 +1,6 @@ import { CeloTxReceipt } from '@celo/connect/lib/types' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { startAndFinishEpochProcess } from '../test-utils/utils' import { NULL_ADDRESS } from '@celo/base' @@ -13,19 +12,19 @@ import { ElectionWrapper } from './Election' import { LockedGoldWrapper } from './LockedGold' import { ValidatorsWrapper } from './Validators' -const minLockedGoldValue = Web3.utils.toWei('10000', 'ether') // 10k gold +const minLockedGoldValue = '10000000000000000000000' // 10k gold jest.setTimeout(20000) -testWithAnvilL2('Election Wrapper', (web3) => { - const ZERO_GOLD = new BigNumber(web3.utils.toWei('0', 'ether')) - const ONE_HUNDRED_GOLD = new BigNumber(web3.utils.toWei('100', 'ether')) - const ONE_HUNDRED_ONE_GOLD = new BigNumber(web3.utils.toWei('101', 'ether')) - const TWO_HUNDRED_GOLD = new BigNumber(web3.utils.toWei('200', 'ether')) - const TWO_HUNDRED_ONE_GOLD = new BigNumber(web3.utils.toWei('201', 'ether')) - const THREE_HUNDRED_GOLD = new BigNumber(web3.utils.toWei('300', 'ether')) +testWithAnvilL2('Election Wrapper', (client) => { + const ZERO_GOLD = new BigNumber(client.utils.toWei('0', 'ether')) + const ONE_HUNDRED_GOLD = new BigNumber(client.utils.toWei('100', 'ether')) + const ONE_HUNDRED_ONE_GOLD = new BigNumber(client.utils.toWei('101', 'ether')) + const TWO_HUNDRED_GOLD = new BigNumber(client.utils.toWei('200', 'ether')) + const TWO_HUNDRED_ONE_GOLD = new BigNumber(client.utils.toWei('201', 'ether')) + const THREE_HUNDRED_GOLD = new BigNumber(client.utils.toWei('300', 'ether')) const GROUP_COMMISSION = new BigNumber(0.1) - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) let accounts: string[] = [] let election: ElectionWrapper let accountsInstance: AccountsWrapper @@ -88,7 +87,7 @@ testWithAnvilL2('Election Wrapper', (web3) => { const activateAndVote = async (groupAccount: string, userAccount: string, amount: BigNumber) => { await (await election.vote(groupAccount, amount)).sendAndWaitForReceipt({ from: userAccount }) const epochDuraction = await kit.getEpochSize() - await timeTravel(epochDuraction + 1, web3) + await timeTravel(epochDuraction + 1, client) await startAndFinishEpochProcess(kit) const txList = await election.activate(userAccount) @@ -156,7 +155,7 @@ testWithAnvilL2('Election Wrapper', (web3) => { }) const epochDuraction = await kit.getEpochSize() - await timeTravel(epochDuraction + 1, web3) + await timeTravel(epochDuraction + 1, client) await startAndFinishEpochProcess(kit) diff --git a/packages/sdk/contractkit/src/wrappers/EpochManager.test.ts b/packages/sdk/contractkit/src/wrappers/EpochManager.test.ts index 896e7fa5b..1fce546a4 100644 --- a/packages/sdk/contractkit/src/wrappers/EpochManager.test.ts +++ b/packages/sdk/contractkit/src/wrappers/EpochManager.test.ts @@ -8,15 +8,14 @@ import { } from '@celo/dev-utils/anvil-test' import { timeTravel } from '@celo/dev-utils/ganache-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { REGISTRY_CONTRACT_ADDRESS } from '../address-registry' import { newKitFromWeb3 } from '../kit' import { startAndFinishEpochProcess } from '../test-utils/utils' process.env.NO_SYNCCHECK = 'true' -testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('EpochManagerWrapper', (client) => { + const kit = newKitFromWeb3(client) let epochDuration: number @@ -36,7 +35,7 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { it('indicates that it is time for next epoch', async () => { const epochManagerWrapper = await kit.contracts.getEpochManager() - await timeTravel(epochDuration + 1, web3) + await timeTravel(epochDuration + 1, client) expect(await epochManagerWrapper.isTimeForNextEpoch()).toBeTruthy() @@ -62,12 +61,12 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { it('gets current epoch processing status', async () => { const epochManagerWrapper = await kit.contracts.getEpochManager() - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() expect((await epochManagerWrapper.getEpochProcessingStatus()).status).toEqual(0) // Let the epoch pass and start another one - await timeTravel(epochDuration, web3) + await timeTravel(epochDuration, client) await epochManagerWrapper.startNextEpochProcess().sendAndWaitForReceipt({ from: accounts[0], }) @@ -84,7 +83,7 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { it('gets block numbers for an epoch', async () => { const epochManagerWrapper = await kit.contracts.getEpochManager() const currentEpochNumber = await epochManagerWrapper.getCurrentEpochNumber() - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() expect(await epochManagerWrapper.getFirstBlockAtEpoch(currentEpochNumber)).toEqual(300) await expect( @@ -92,7 +91,7 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { ).rejects.toMatchInlineSnapshot(`[Error: execution reverted: Epoch not finished yet]`) // Let the epoch pass and start another one - await timeTravel(epochDuration + 1, web3) + await timeTravel(epochDuration + 1, client) await epochManagerWrapper.startNextEpochProcess().sendAndWaitForReceipt({ from: accounts[0], }) @@ -108,7 +107,7 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { async () => { const epochManagerWrapper = await kit.contracts.getEpochManager() const currentEpochNumber = await epochManagerWrapper.getCurrentEpochNumber() - const accounts = await web3.eth.getAccounts() + const accounts = await client.eth.getAccounts() expect(await epochManagerWrapper.getFirstBlockAtEpoch(currentEpochNumber)).toEqual(300) await expect( @@ -116,7 +115,7 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { ).rejects.toMatchInlineSnapshot(`[Error: execution reverted: Epoch not finished yet]`) // Let the epoch pass and start another one - await timeTravel(epochDuration + 1, web3) + await timeTravel(epochDuration + 1, client) await epochManagerWrapper.startNextEpochProcess().sendAndWaitForReceipt({ from: accounts[0], }) @@ -126,9 +125,9 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { const validatorGroups = await validatorsContract.getRegisteredValidatorGroupsAddresses() await asCoreContractsOwner( - web3, + client, async (ownerAdress: StrongAddress) => { - const registryContract = newRegistry(web3, REGISTRY_CONTRACT_ADDRESS) + const registryContract = newRegistry(client, REGISTRY_CONTRACT_ADDRESS) await registryContract.methods.setAddressFor('Validators', accounts[0]).send({ from: ownerAdress, @@ -145,7 +144,7 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { from: ownerAdress, }) }, - new BigNumber(web3.utils.toWei('1', 'ether')) + new BigNumber(client.utils.toWei('1', 'ether')) ) await (await epochManagerWrapper.finishNextEpochProcessTx()).sendAndWaitForReceipt({ @@ -158,7 +157,7 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { async function activateValidators() { const validatorsContract = await kit.contracts.getValidators() const electionWrapper = await kit.contracts.getElection() - const electionContract = newElection(web3, electionWrapper.address) + const electionContract = newElection(client, electionWrapper.address) const validatorGroups = await validatorsContract.getRegisteredValidatorGroupsAddresses() for (const validatorGroup of validatorGroups) { @@ -167,12 +166,12 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { ) if (pendingVotesForGroup.gt(0)) { await withImpersonatedAccount( - web3, + client, validatorGroup, async () => { await electionContract.methods.activate(validatorGroup).send({ from: validatorGroup }) }, - new BigNumber(web3.utils.toWei('1', 'ether')) + new BigNumber(client.utils.toWei('1', 'ether')) ) } } @@ -183,7 +182,7 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { const epochManagerWrapper = await kit.contracts.getEpochManager() const EPOCH_COUNT = 5 - await timeTravel(epochDuration, web3) + await timeTravel(epochDuration, client) await startAndFinishEpochProcess(kit) @@ -192,7 +191,7 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { expect(await epochManagerWrapper.getCurrentEpochNumber()).toEqual(5) for (let i = 0; i < EPOCH_COUNT; i++) { - await timeTravel(epochDuration + 1, web3) + await timeTravel(epochDuration + 1, client) await startAndFinishEpochProcess(kit) } @@ -201,7 +200,7 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { expect((await epochManagerWrapper.getEpochProcessingStatus()).status).toEqual(0) // Start a new epoch process, but not finish it, so we can check the amounts - await timeTravel(epochDuration + 1, web3) + await timeTravel(epochDuration + 1, client) await epochManagerWrapper.startNextEpochProcess().sendAndWaitForReceipt({ from: accounts[0], }) @@ -239,14 +238,14 @@ testWithAnvilL2('EpochManagerWrapper', (web3: Web3) => { const accounts = await kit.web3.eth.getAccounts() const epochManagerWrapper = await kit.contracts.getEpochManager() - await timeTravel(epochDuration, web3) + await timeTravel(epochDuration, client) await startAndFinishEpochProcess(kit) await activateValidators() // Start a new epoch process, but don't process it, so we can compare the amounts - await timeTravel(epochDuration + 1, web3) + await timeTravel(epochDuration + 1, client) await epochManagerWrapper.startNextEpochProcess().sendAndWaitForReceipt({ from: accounts[0], diff --git a/packages/sdk/contractkit/src/wrappers/Escrow.test.ts b/packages/sdk/contractkit/src/wrappers/Escrow.test.ts index 37c895533..eedd58ab2 100644 --- a/packages/sdk/contractkit/src/wrappers/Escrow.test.ts +++ b/packages/sdk/contractkit/src/wrappers/Escrow.test.ts @@ -4,7 +4,6 @@ import { StableToken, StrongAddress } from '@celo/base' import { asCoreContractsOwner, setBalance, testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { deployAttestationsContract } from '@celo/dev-utils/contracts' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { REGISTRY_CONTRACT_ADDRESS } from '../address-registry' import { newKitFromWeb3 } from '../kit' import { topUpWithToken } from '../test-utils/utils' @@ -13,14 +12,14 @@ import { EscrowWrapper } from './Escrow' import { FederatedAttestationsWrapper } from './FederatedAttestations' import { StableTokenWrapper } from './StableTokenWrapper' -testWithAnvilL2('Escrow Wrapper', (web3: Web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('Escrow Wrapper', (client) => { + const kit = newKitFromWeb3(client) const TEN_USDM = kit.web3.utils.toWei('10', 'ether') const TIMESTAMP = 1665080820 const getParsedSignatureOfAddressForTest = (address: string, signer: string) => { return getParsedSignatureOfAddress( - web3.utils.soliditySha3, + client.utils.soliditySha3, kit.connection.sign, address, signer @@ -34,16 +33,16 @@ testWithAnvilL2('Escrow Wrapper', (web3: Web3) => { let identifier: string beforeEach(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] escrow = await kit.contracts.getEscrow() await asCoreContractsOwner( - web3, + client, async (ownerAdress: StrongAddress) => { - const registryContract = newRegistry(web3, REGISTRY_CONTRACT_ADDRESS) - const attestationsContractAddress = await deployAttestationsContract(web3, ownerAdress) + const registryContract = newRegistry(client, REGISTRY_CONTRACT_ADDRESS) + const attestationsContractAddress = await deployAttestationsContract(client, ownerAdress) - const attestationsContract = newAttestations(web3, attestationsContractAddress) + const attestationsContract = newAttestations(client, attestationsContractAddress) // otherwise reverts with "minAttestations larger than limit" await attestationsContract.methods.setMaxAttestations(1).send({ from: ownerAdress }) @@ -54,14 +53,14 @@ testWithAnvilL2('Escrow Wrapper', (web3: Web3) => { from: ownerAdress, }) }, - new BigNumber(web3.utils.toWei('1', 'ether')) + new BigNumber(client.utils.toWei('1', 'ether')) ) await topUpWithToken(kit, StableToken.USDm, escrow.address, new BigNumber(TEN_USDM)) await topUpWithToken(kit, StableToken.USDm, accounts[0], new BigNumber(TEN_USDM)) await topUpWithToken(kit, StableToken.USDm, accounts[1], new BigNumber(TEN_USDM)) await topUpWithToken(kit, StableToken.USDm, accounts[2], new BigNumber(TEN_USDM)) - await setBalance(web3, accounts[0], new BigNumber(TEN_USDM)) + await setBalance(client, accounts[0], new BigNumber(TEN_USDM)) stableTokenContract = await kit.contracts.getStableToken() federatedAttestations = await kit.contracts.getFederatedAttestations() diff --git a/packages/sdk/contractkit/src/wrappers/FeeCurrencyDirectoryWrapper.test.ts b/packages/sdk/contractkit/src/wrappers/FeeCurrencyDirectoryWrapper.test.ts index adb2c1f5a..1e2622f32 100644 --- a/packages/sdk/contractkit/src/wrappers/FeeCurrencyDirectoryWrapper.test.ts +++ b/packages/sdk/contractkit/src/wrappers/FeeCurrencyDirectoryWrapper.test.ts @@ -2,8 +2,8 @@ import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import BigNumber from 'bignumber.js' import { newKitFromWeb3 } from '../kit' -testWithAnvilL2('FeeCurrencyDirectory', (web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('FeeCurrencyDirectory', (client) => { + const kit = newKitFromWeb3(client) it('fetches fee currency information', async () => { const wrapper = await kit.contracts.getFeeCurrencyDirectory() diff --git a/packages/sdk/contractkit/src/wrappers/GoldToken.test.ts b/packages/sdk/contractkit/src/wrappers/GoldToken.test.ts index 4fb52e33e..7294d6629 100644 --- a/packages/sdk/contractkit/src/wrappers/GoldToken.test.ts +++ b/packages/sdk/contractkit/src/wrappers/GoldToken.test.ts @@ -7,19 +7,19 @@ import { GoldTokenWrapper } from './GoldTokenWrapper' // TODO checking for account balance directly won't work because of missing transfer precompile // instead we can check for the Transfer event instead and/or lowered allowance value (they both // happen after the call to transfer precompile) -testWithAnvilL2('GoldToken Wrapper', (web3) => { - const ONE_GOLD = web3.utils.toWei('1', 'ether') +testWithAnvilL2('GoldToken Wrapper', (client) => { + const ONE_GOLD = client.utils.toWei('1', 'ether') - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) let accounts: StrongAddress[] = [] let goldToken: GoldTokenWrapper let goldTokenContract: GoldToken beforeAll(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] goldToken = await kit.contracts.getGoldToken() - goldTokenContract = newGoldToken(web3, goldToken.address) + goldTokenContract = newGoldToken(client, goldToken.address) }) it('checks balance', () => expect(goldToken.balanceOf(accounts[0])).resolves.toBeBigNumber()) diff --git a/packages/sdk/contractkit/src/wrappers/Governance.test.ts b/packages/sdk/contractkit/src/wrappers/Governance.test.ts index 858626d92..e87ce7735 100644 --- a/packages/sdk/contractkit/src/wrappers/Governance.test.ts +++ b/packages/sdk/contractkit/src/wrappers/Governance.test.ts @@ -3,7 +3,6 @@ import { Address, StrongAddress } from '@celo/base/lib/address' import { asCoreContractsOwner, testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { timeTravel } from '@celo/dev-utils/ganache-test' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { CeloContract } from '..' import { newKitFromWeb3 } from '../kit' import { AccountsWrapper } from './Accounts' @@ -11,10 +10,10 @@ import { GovernanceWrapper, Proposal, ProposalTransaction, VoteValue } from './G import { LockedGoldWrapper } from './LockedGold' import { MultiSigWrapper } from './MultiSig' -testWithAnvilL2('Governance Wrapper', (web3: Web3) => { +testWithAnvilL2('Governance Wrapper', (client) => { const ONE_SEC = 1000 - const kit = newKitFromWeb3(web3) - const ONE_CGLD = web3.utils.toWei('1', 'ether') + const kit = newKitFromWeb3(client) + const ONE_CGLD = client.utils.toWei('1', 'ether') let accounts: StrongAddress[] = [] let governance: GovernanceWrapper @@ -27,7 +26,7 @@ testWithAnvilL2('Governance Wrapper', (web3: Web3) => { let referendumStageDuration: number beforeAll(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] governance = await kit.contracts.getGovernance() governanceApproverMultiSig = await kit.contracts.getMultiSig(await governance.getApprover()) @@ -104,14 +103,14 @@ testWithAnvilL2('Governance Wrapper', (web3: Web3) => { const tx = await governance.upvote(proposalId ?? proposalID, upvoter) await tx.sendAndWaitForReceipt({ from: upvoter }) if (shouldTimeTravel) { - await timeTravel(dequeueFrequency, web3) + await timeTravel(dequeueFrequency, client) await governance.dequeueProposalsIfReady().sendAndWaitForReceipt() } } // protocol/truffle-config defines approver address as accounts[0] const approveFn = async () => { - await asCoreContractsOwner(web3, async (ownerAddress) => { + await asCoreContractsOwner(client, async (ownerAddress) => { const tx = await governance.approve(proposalID) const multisigTx = await governanceApproverMultiSig.submitOrConfirmTransaction( governance.address, @@ -124,7 +123,7 @@ testWithAnvilL2('Governance Wrapper', (web3: Web3) => { const voteFn = async (voter: Address) => { const tx = await governance.vote(proposalID, 'Yes') await tx.sendAndWaitForReceipt({ from: voter }) - await timeTravel(referendumStageDuration, web3) + await timeTravel(referendumStageDuration, client) } it('#propose', async () => { @@ -139,7 +138,7 @@ testWithAnvilL2('Governance Wrapper', (web3: Web3) => { describe('#getHotfixRecord', () => { it('gets hotfix record', async () => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) const governance = await kit.contracts.getGovernance() const hotfixHash = Buffer.from('0x', 'hex') @@ -189,7 +188,7 @@ testWithAnvilL2('Governance Wrapper', (web3: Web3) => { it('#approve', async () => { await proposeFn(accounts[0]) - await timeTravel(dequeueFrequency, web3) + await timeTravel(dequeueFrequency, client) await governance.dequeueProposalsIfReady().sendAndWaitForReceipt() await approveFn() @@ -199,7 +198,7 @@ testWithAnvilL2('Governance Wrapper', (web3: Web3) => { it('#vote', async () => { await proposeFn(accounts[0]) - await timeTravel(dequeueFrequency, web3) + await timeTravel(dequeueFrequency, client) await governance.dequeueProposalsIfReady().sendAndWaitForReceipt() await approveFn() await voteFn(accounts[2]) @@ -212,7 +211,7 @@ testWithAnvilL2('Governance Wrapper', (web3: Web3) => { it('#getVoteRecord', async () => { const voter = accounts[2] await proposeFn(accounts[0]) - await timeTravel(dequeueFrequency, web3) + await timeTravel(dequeueFrequency, client) await governance.dequeueProposalsIfReady().sendAndWaitForReceipt() await approveFn() await voteFn(voter) @@ -229,7 +228,7 @@ testWithAnvilL2('Governance Wrapper', (web3: Web3) => { it('#votePartially', async () => { await proposeFn(accounts[0]) - await timeTravel(dequeueFrequency, web3) + await timeTravel(dequeueFrequency, client) await governance.dequeueProposalsIfReady().sendAndWaitForReceipt() await approveFn() @@ -239,7 +238,7 @@ testWithAnvilL2('Governance Wrapper', (web3: Web3) => { const tx = await governance.votePartially(proposalID, yes, no, abstain) await tx.sendAndWaitForReceipt({ from: accounts[2] }) - await timeTravel(referendumStageDuration, web3) + await timeTravel(referendumStageDuration, client) const votes = await governance.getVotes(proposalID) const yesVotes = votes[VoteValue.Yes] @@ -254,7 +253,7 @@ testWithAnvilL2('Governance Wrapper', (web3: Web3) => { '#execute', async () => { await proposeFn(accounts[0]) - await timeTravel(dequeueFrequency, web3) + await timeTravel(dequeueFrequency, client) await governance.dequeueProposalsIfReady().sendAndWaitForReceipt() await approveFn() await voteFn(accounts[2]) @@ -270,7 +269,7 @@ testWithAnvilL2('Governance Wrapper', (web3: Web3) => { it('#getVoter', async () => { await proposeFn(accounts[0]) - await timeTravel(dequeueFrequency, web3) + await timeTravel(dequeueFrequency, client) await governance.dequeueProposalsIfReady().sendAndWaitForReceipt() await approveFn() await voteFn(accounts[2]) diff --git a/packages/sdk/contractkit/src/wrappers/LockedGold.test.ts b/packages/sdk/contractkit/src/wrappers/LockedGold.test.ts index d10f07055..85823292f 100644 --- a/packages/sdk/contractkit/src/wrappers/LockedGold.test.ts +++ b/packages/sdk/contractkit/src/wrappers/LockedGold.test.ts @@ -6,8 +6,8 @@ import { startAndFinishEpochProcess } from '../test-utils/utils' import { AccountsWrapper } from './Accounts' import { LockedGoldWrapper } from './LockedGold' -testWithAnvilL2('LockedGold Wrapper', (web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('LockedGold Wrapper', (client) => { + const kit = newKitFromWeb3(client) let accounts: AccountsWrapper let lockedGold: LockedGoldWrapper @@ -15,7 +15,7 @@ testWithAnvilL2('LockedGold Wrapper', (web3) => { const value = 120938732980 let account: StrongAddress beforeAll(async () => { - account = (await web3.eth.getAccounts())[0] as StrongAddress + account = (await client.eth.getAccounts())[0] as StrongAddress kit.defaultAccount = account lockedGold = await kit.contracts.getLockedGold() accounts = await kit.contracts.getAccounts() diff --git a/packages/sdk/contractkit/src/wrappers/MultiSig.ts b/packages/sdk/contractkit/src/wrappers/MultiSig.ts index 3b83744d7..b6450e8bb 100644 --- a/packages/sdk/contractkit/src/wrappers/MultiSig.ts +++ b/packages/sdk/contractkit/src/wrappers/MultiSig.ts @@ -36,7 +36,11 @@ export class MultiSigWrapper extends BaseWrapper { * Otherwise, submits the `txObject` to the multisig and add confirmation. * @param index The index of the pending withdrawal to withdraw. */ - async submitOrConfirmTransaction(destination: string, txObject: CeloTxObject, value = '0') { + async submitOrConfirmTransaction( + destination: string, + txObject: CeloTxObject, + value = '0' + ) { const data = stringToSolidityBytes(txObject.encodeABI()) const transactionCount = await this.contract.methods.getTransactionCount(true, true).call() const transactionIds = await this.contract.methods @@ -69,7 +73,7 @@ export class MultiSigWrapper extends BaseWrapper { this.contract.methods.confirmTransaction(transactionId) ) } - async submitTransaction(destination: string, txObject: CeloTxObject, value = '0') { + async submitTransaction(destination: string, txObject: CeloTxObject, value = '0') { const data = stringToSolidityBytes(txObject.encodeABI()) return toTransactionObject( this.connection, @@ -95,7 +99,7 @@ export class MultiSigWrapper extends BaseWrapper { async getTransactionDataByContent( destination: string, - txo: CeloTxObject, + txo: CeloTxObject, value: BigNumber.Value = 0 ) { const data = stringToSolidityBytes(txo.encodeABI()) diff --git a/packages/sdk/contractkit/src/wrappers/OdisPayments.test.ts b/packages/sdk/contractkit/src/wrappers/OdisPayments.test.ts index 30ef4e24f..da1d73724 100644 --- a/packages/sdk/contractkit/src/wrappers/OdisPayments.test.ts +++ b/packages/sdk/contractkit/src/wrappers/OdisPayments.test.ts @@ -6,14 +6,14 @@ import { topUpWithToken } from '../test-utils/utils' import { OdisPaymentsWrapper } from './OdisPayments' import { StableTokenWrapper } from './StableTokenWrapper' -testWithAnvilL2('OdisPayments Wrapper', (web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('OdisPayments Wrapper', (client) => { + const kit = newKitFromWeb3(client) let accounts: StrongAddress[] = [] let odisPayments: OdisPaymentsWrapper let stableToken: StableTokenWrapper beforeAll(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] odisPayments = await kit.contracts.getOdisPayments() stableToken = await kit.contracts.getStableToken(StableToken.USDm) diff --git a/packages/sdk/contractkit/src/wrappers/Reserve.test.ts b/packages/sdk/contractkit/src/wrappers/Reserve.test.ts index 0dfe601a3..7dd008b4d 100644 --- a/packages/sdk/contractkit/src/wrappers/Reserve.test.ts +++ b/packages/sdk/contractkit/src/wrappers/Reserve.test.ts @@ -14,8 +14,8 @@ import { newKitFromWeb3 } from '../kit' import { MultiSigWrapper } from './MultiSig' import { ReserveWrapper } from './Reserve' -testWithAnvilL2('Reserve Wrapper', (web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('Reserve Wrapper', (client) => { + const kit = newKitFromWeb3(client) let accounts: StrongAddress[] = [] let reserve: ReserveWrapper let reserveSpenderMultiSig: MultiSigWrapper @@ -23,18 +23,18 @@ testWithAnvilL2('Reserve Wrapper', (web3) => { let otherSpender: StrongAddress beforeEach(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] otherReserveAddress = accounts[9] otherSpender = accounts[7] reserve = await kit.contracts.getReserve() const multiSigAddress = await kit.registry.addressFor('ReserveSpenderMultiSig' as CeloContract) reserveSpenderMultiSig = await kit.contracts.getMultiSig(multiSigAddress) - const reserveContract = newReserve(web3, reserve.address) - const reserveSpenderMultiSigContract = newMultiSig(web3, reserveSpenderMultiSig.address) + const reserveContract = newReserve(client, reserve.address) + const reserveSpenderMultiSigContract = newMultiSig(client, reserveSpenderMultiSig.address) await withImpersonatedAccount( - web3, + client, multiSigAddress, async () => { await reserveSpenderMultiSig @@ -47,17 +47,17 @@ testWithAnvilL2('Reserve Wrapper', (web3) => { .changeRequirement(2) .send({ from: multiSigAddress }) }, - new BigNumber(web3.utils.toWei('1', 'ether')) + new BigNumber(client.utils.toWei('1', 'ether')) ) - await asCoreContractsOwner(web3, async (ownerAdress: StrongAddress) => { + await asCoreContractsOwner(client, async (ownerAdress: StrongAddress) => { await reserveContract.methods.addSpender(otherSpender).send({ from: ownerAdress }) await reserveContract.methods .addOtherReserveAddress(otherReserveAddress) .send({ from: ownerAdress }) }) - await setBalance(web3, reserve.address, new BigNumber(web3.utils.toWei('1', 'ether'))) + await setBalance(client, reserve.address, new BigNumber(client.utils.toWei('1', 'ether'))) }) test('can get asset target weights which sum to 100%', async () => { diff --git a/packages/sdk/contractkit/src/wrappers/ScoreManager.test.ts b/packages/sdk/contractkit/src/wrappers/ScoreManager.test.ts index 5c02eb114..5383c79e4 100644 --- a/packages/sdk/contractkit/src/wrappers/ScoreManager.test.ts +++ b/packages/sdk/contractkit/src/wrappers/ScoreManager.test.ts @@ -3,8 +3,8 @@ import BigNumber from 'bignumber.js' import { newKitFromWeb3 } from '../kit' import { valueToFixidityString } from './BaseWrapper' -testWithAnvilL2('ScoreManager Wrapper', (web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('ScoreManager Wrapper', (client) => { + const kit = newKitFromWeb3(client) it('gets validator score', async () => { const epochManagerWrapper = await kit.contracts.getEpochManager() @@ -17,7 +17,7 @@ testWithAnvilL2('ScoreManager Wrapper', (web3) => { ).toMatchInlineSnapshot(`"1"`) await asCoreContractsOwner( - web3, + client, async (from) => { const scoreManagerContract = await kit._web3Contracts.getScoreManager() @@ -29,7 +29,7 @@ testWithAnvilL2('ScoreManager Wrapper', (web3) => { ) .send({ from }) }, - new BigNumber(web3.utils.toWei('1', 'ether')) + new BigNumber(client.utils.toWei('1', 'ether')) ) // should return the new score @@ -45,7 +45,7 @@ testWithAnvilL2('ScoreManager Wrapper', (web3) => { expect(await scoreManagerWrapper.getGroupScore(GROUP_ADDRESSES[0])).toMatchInlineSnapshot(`"1"`) await asCoreContractsOwner( - web3, + client, async (from) => { const scoreManagerContract = await kit._web3Contracts.getScoreManager() @@ -54,7 +54,7 @@ testWithAnvilL2('ScoreManager Wrapper', (web3) => { .setGroupScore(GROUP_ADDRESSES[0], valueToFixidityString(new BigNumber(0.99))) .send({ from }) }, - new BigNumber(web3.utils.toWei('1', 'ether')) + new BigNumber(client.utils.toWei('1', 'ether')) ) // should return the new score diff --git a/packages/sdk/contractkit/src/wrappers/SortedOracles.test.ts b/packages/sdk/contractkit/src/wrappers/SortedOracles.test.ts index a84dc98c5..2c8a2fa63 100644 --- a/packages/sdk/contractkit/src/wrappers/SortedOracles.test.ts +++ b/packages/sdk/contractkit/src/wrappers/SortedOracles.test.ts @@ -17,8 +17,8 @@ import { OracleRate, ReportTarget, SortedOraclesWrapper } from './SortedOracles' // set timeout to 10 seconds jest.setTimeout(10 * 1000) -testWithAnvilL2('SortedOracles Wrapper', (web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('SortedOracles Wrapper', (client) => { + const kit = newKitFromWeb3(client) const reportAsOracles = async ( sortedOracles: SortedOraclesWrapper, @@ -50,7 +50,7 @@ testWithAnvilL2('SortedOracles Wrapper', (web3) => { const expirySeconds = (await sortedOracles.reportExpirySeconds()).toNumber() await reportAsOracles(sortedOracles, target, expiredOracles) - await timeTravel(expirySeconds * 2, web3) + await timeTravel(expirySeconds * 2, client) const freshOracles = allOracles.filter((o) => !expiredOracles.includes(o)) await reportAsOracles(sortedOracles, target, freshOracles) @@ -64,7 +64,7 @@ testWithAnvilL2('SortedOracles Wrapper', (web3) => { * the tests */ const newSortedOracles = async (owner: Address): Promise => { - const contract = new web3.eth.Contract(SortedOraclesArtifacts.abi as AbiItem[]) + const contract = new client.eth.Contract(SortedOraclesArtifacts.abi as AbiItem[]) const deployTx = contract.deploy({ data: SortedOraclesArtifacts.bytecode.replace( @@ -75,7 +75,10 @@ testWithAnvilL2('SortedOracles Wrapper', (web3) => { }) const txResult = await deployTx.send({ from: owner, gasPrice: TEST_GAS_PRICE.toFixed() }) - const deployedContract = web3NewSortedOracles(web3, txResult.options.address) + const deployedContract = web3NewSortedOracles( + client, + (txResult as unknown as { options: { address: string } }).options.address + ) await deployedContract.methods .initialize(NetworkConfig.oracles.reportExpiry) .send({ from: owner }) @@ -101,7 +104,7 @@ testWithAnvilL2('SortedOracles Wrapper', (web3) => { // NOTE: These values are set in packages/dev-utils/src/migration-override.json, // and are derived from the MNEMONIC. // If the MNEMONIC has changed, these will need to be reset. - // To do that, look at the output of web3.eth.getAccounts(), and pick a few + // To do that, look at the output of client.eth.getAccounts(), and pick a few // addresses from that set to be oracles const stableTokenOracles: Address[] = NetworkConfig.stableToken.oracles const stableTokenEUROracles: Address[] = NetworkConfig.stableTokenEUR.oracles @@ -118,23 +121,23 @@ testWithAnvilL2('SortedOracles Wrapper', (web3) => { let nonOracleAddress: Address let btcOracleOwner: Address let stableTokenOracleOwner: Address - const CELOBTCIdentifier: Address = web3.utils.toChecksumAddress( - web3.utils.keccak256('CELOBTC').slice(26) + const CELOBTCIdentifier: Address = client.utils.toChecksumAddress( + '0x' + client.utils.keccak256('CELOBTC').slice(26) ) beforeAll(async () => { - allAccounts = await web3.eth.getAccounts() + allAccounts = await client.eth.getAccounts() btcOracleOwner = stableTokenOracleOwner = allAccounts[0] btcSortedOracles = await newSortedOracles(btcOracleOwner) stableTokenSortedOracles = await kit.contracts.getSortedOracles() const stableTokenSortedOraclesContract = web3NewSortedOracles( - web3, + client, stableTokenSortedOracles.address ) - await asCoreContractsOwner(web3, async (ownerAddress) => { + await asCoreContractsOwner(client, async (ownerAddress) => { const stableTokenUSDAddress = (await kit.contracts.getStableToken(StableToken.USDm)).address const stableTokenEURAddress = (await kit.contracts.getStableToken(StableToken.EURm)).address const stableTokenBRLAddress = (await kit.contracts.getStableToken(StableToken.BRLm)).address @@ -198,7 +201,7 @@ testWithAnvilL2('SortedOracles Wrapper', (web3) => { ).sendAndWaitForReceipt({ from: stableTokenOracleOwner }) const expirySeconds = (await stableTokenSortedOracles.reportExpirySeconds()).toNumber() - await timeTravel(expirySeconds * 2, web3) + await timeTravel(expirySeconds * 2, client) const removeExpiredReportsTx = await stableTokenSortedOracles.removeExpiredReports( CeloContract.StableToken, diff --git a/packages/sdk/contractkit/src/wrappers/StableToken.test.ts b/packages/sdk/contractkit/src/wrappers/StableToken.test.ts index 82e709c06..af1e27b35 100644 --- a/packages/sdk/contractkit/src/wrappers/StableToken.test.ts +++ b/packages/sdk/contractkit/src/wrappers/StableToken.test.ts @@ -8,8 +8,8 @@ import { StableTokenWrapper } from './StableTokenWrapper' // TEST NOTES: balances defined in test-utils/migration-override -testWithAnvilL2('StableToken Wrapper', async (web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('StableToken Wrapper', async (client) => { + const kit = newKitFromWeb3(client) const stableTokenInfos: { [key in StableToken]: { @@ -54,14 +54,14 @@ export function testStableToken( expectedName: string, expectedSymbol: string ) { - const web3 = kit.web3 - const ONE_STABLE = web3.utils.toWei('1', 'ether') + const client = kit.web3 + const ONE_STABLE = client.utils.toWei('1', 'ether') let accounts: string[] = [] let stableToken: StableTokenWrapper beforeEach(async () => { - accounts = (await web3.eth.getAccounts()) as StrongAddress[] + accounts = (await client.eth.getAccounts()) as StrongAddress[] kit.defaultAccount = accounts[0] as StrongAddress stableToken = await kit.contracts.getStableToken(stableTokenName) diff --git a/packages/sdk/contractkit/src/wrappers/Validators.test.ts b/packages/sdk/contractkit/src/wrappers/Validators.test.ts index 1918312b4..1548cf67f 100644 --- a/packages/sdk/contractkit/src/wrappers/Validators.test.ts +++ b/packages/sdk/contractkit/src/wrappers/Validators.test.ts @@ -3,7 +3,6 @@ import { setCommissionUpdateDelay } from '@celo/dev-utils/chain-setup' import { mineBlocks, timeTravel } from '@celo/dev-utils/ganache-test' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' import BigNumber from 'bignumber.js' -import Web3 from 'web3' import { newKitFromWeb3 } from '../kit' import { startAndFinishEpochProcess } from '../test-utils/utils' import { AccountsWrapper } from './Accounts' @@ -14,10 +13,10 @@ TEST NOTES: - In migrations: The only account that has USDm is accounts[0] */ -const minLockedGoldValue = Web3.utils.toWei('10000', 'ether') // 10k gold +const minLockedGoldValue = '10000000000000000000000' // 10k gold -testWithAnvilL2('Validators Wrapper', (web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('Validators Wrapper', (client) => { + const kit = newKitFromWeb3(client) let accounts: string[] = [] let accountsInstance: AccountsWrapper let validators: ValidatorsWrapper @@ -34,7 +33,7 @@ testWithAnvilL2('Validators Wrapper', (web3) => { } beforeAll(async () => { - accounts = await web3.eth.getAccounts() + accounts = await client.eth.getAccounts() validators = await kit.contracts.getValidators() lockedGold = await kit.contracts.getLockedGold() accountsInstance = await kit.contracts.getAccounts() @@ -103,11 +102,11 @@ testWithAnvilL2('Validators Wrapper', (web3) => { const txOpts = { from: groupAccount } // Set commission update delay to 3 blocks for backwards compatibility - await setCommissionUpdateDelay(web3, validators.address, 3) - await mineBlocks(1, web3) + await setCommissionUpdateDelay(client, validators.address, 3) + await mineBlocks(1, client) await validators.setNextCommissionUpdate('0.2').sendAndWaitForReceipt(txOpts) - await mineBlocks(3, web3) + await mineBlocks(3, client) await validators.updateCommission().sendAndWaitForReceipt(txOpts) const commission = (await validators.getValidatorGroup(groupAccount)).commission @@ -197,7 +196,7 @@ testWithAnvilL2('Validators Wrapper', (web3) => { beforeEach(async () => { const epochManagerWrapper = await kit.contracts.getEpochManager() const epochDuration = await epochManagerWrapper.epochDuration() - await timeTravel(epochDuration, web3) + await timeTravel(epochDuration, client) }) it("can fetch epoch's last block information", async () => { diff --git a/packages/sdk/explorer/package.json b/packages/sdk/explorer/package.json index 3b094508b..1c77c4aca 100644 --- a/packages/sdk/explorer/package.json +++ b/packages/sdk/explorer/package.json @@ -38,8 +38,7 @@ "@celo/dev-utils": "workspace:^", "@celo/typescript": "workspace:^", "@types/debug": "^4.1.12", - "fetch-mock": "^10.0.7", - "web3": "1.10.4" + "fetch-mock": "^10.0.7" }, "engines": { "node": ">=20" diff --git a/packages/sdk/explorer/scripts/driver.ts b/packages/sdk/explorer/scripts/driver.ts index 9187deb9e..a4855b3c2 100644 --- a/packages/sdk/explorer/scripts/driver.ts +++ b/packages/sdk/explorer/scripts/driver.ts @@ -1,8 +1,7 @@ -import { newKitFromWeb3 } from '@celo/contractkit' -import Web3 from 'web3' +import { newKit } from '@celo/contractkit' import { newBlockExplorer } from '../src/block-explorer' -const kit = newKitFromWeb3(new Web3('ws://localhost:8545')) +const kit = newKit('ws://localhost:8545') export function listenFor(subscription: any, seconds: number) { console.log(subscription) diff --git a/packages/sdk/explorer/src/block-explorer.ts b/packages/sdk/explorer/src/block-explorer.ts index 01731efc3..0c4f28f80 100644 --- a/packages/sdk/explorer/src/block-explorer.ts +++ b/packages/sdk/explorer/src/block-explorer.ts @@ -286,7 +286,7 @@ export class BlockExplorer { .filter((key) => key.includes('fraction')) // TODO: come up with better enumeration .forEach((fractionKey) => { debug('transforming fixed number param') - params[fractionKey] = fromFixed(params[fractionKey]) + params[fractionKey] = fromFixed(params[fractionKey] as BigNumber) }) return { diff --git a/packages/sdk/explorer/src/log-explorer.ts b/packages/sdk/explorer/src/log-explorer.ts index 594eec8a8..71dfd44aa 100644 --- a/packages/sdk/explorer/src/log-explorer.ts +++ b/packages/sdk/explorer/src/log-explorer.ts @@ -77,13 +77,16 @@ export class LogExplorer { return null } - const returnValues = this.kit.connection + const decoded = this.kit.connection .getAbiCoder() - .decodeLog(matchedAbi.inputs || [], log.data || '', log.topics.slice(1)) - delete (returnValues as any).__length__ - Object.keys(returnValues).forEach((key) => { + .decodeLog(matchedAbi.inputs || [], log.data || '', log.topics.slice(1)) as unknown as Record< + string, + unknown + > + delete decoded.__length__ + Object.keys(decoded).forEach((key) => { if (Number.parseInt(key, 10) >= 0) { - delete (returnValues as any)[key] + delete decoded[key] } }) @@ -94,7 +97,7 @@ export class LogExplorer { logIndex: log.logIndex, transactionIndex: log.transactionIndex, transactionHash: log.transactionHash, - returnValues, + returnValues: decoded, event: matchedAbi.name!, signature: logSignature, raw: { diff --git a/packages/sdk/explorer/src/sourcify.test.ts b/packages/sdk/explorer/src/sourcify.test.ts index 08d0cf481..3aba4dbf5 100644 --- a/packages/sdk/explorer/src/sourcify.test.ts +++ b/packages/sdk/explorer/src/sourcify.test.ts @@ -6,7 +6,6 @@ import { JsonRpcResponse, Provider, } from '@celo/connect' -import Web3 from 'web3' import { Metadata, fetchMetadata, tryGetProxyImplementation } from './sourcify' // This is taken from protocol/contracts/build/Account.json @@ -14,10 +13,9 @@ const CONTRACT_METADATA = require('../fixtures/contract.metadata.json') describe('sourcify helpers', () => { let connection: Connection - const web3: Web3 = new Web3() - const address: Address = web3.utils.randomHex(20) - const proxyAddress: Address = web3.utils.randomHex(20) - const implAddress: Address = web3.utils.randomHex(20) + const address: Address = '0x' + require('crypto').randomBytes(20).toString('hex') + const proxyAddress: Address = '0x' + require('crypto').randomBytes(20).toString('hex') + const implAddress: Address = '0x' + require('crypto').randomBytes(20).toString('hex') const chainId: number = 42220 const mockProvider: Provider = { @@ -26,7 +24,7 @@ describe('sourcify helpers', () => { callback(null, { jsonrpc: payload.jsonrpc, id: Number(payload.id), - result: `0x000000000000000000000000${implAddress}`, + result: `0x000000000000000000000000${implAddress.slice(2)}`, }) } else { callback(new Error('revert')) @@ -36,8 +34,7 @@ describe('sourcify helpers', () => { beforeEach(() => { fetchMock.reset() - web3.setProvider(mockProvider as any) - connection = new Connection(web3) + connection = new Connection(mockProvider) connection.chainId = jest.fn().mockImplementation(async () => { return chainId }) diff --git a/packages/sdk/explorer/src/sourcify.ts b/packages/sdk/explorer/src/sourcify.ts index ad572934f..78d78d5af 100644 --- a/packages/sdk/explorer/src/sourcify.ts +++ b/packages/sdk/explorer/src/sourcify.ts @@ -232,8 +232,11 @@ export async function tryGetProxyImplementation( const proxyContract = new connection.web3.eth.Contract(PROXY_ABI, contract) for (const fn of PROXY_IMPLEMENTATION_GETTERS) { try { - return await new Promise((resolve, reject) => { - proxyContract.methods[fn]().call().then(resolve).catch(reject) + return await new Promise
((resolve, reject) => { + proxyContract.methods[fn]() + .call() + .then((v) => resolve(v as Address)) + .catch(reject) }) } catch { continue diff --git a/packages/sdk/governance/src/interactive-proposal-builder.test.ts b/packages/sdk/governance/src/interactive-proposal-builder.test.ts index 2d1d2e412..085ee7cd3 100644 --- a/packages/sdk/governance/src/interactive-proposal-builder.test.ts +++ b/packages/sdk/governance/src/interactive-proposal-builder.test.ts @@ -17,13 +17,13 @@ describe('all registered contracts can be required', () => { }) }) -testWithAnvilL2('InteractiveProposalBuilder', (web3) => { +testWithAnvilL2('InteractiveProposalBuilder', (client) => { let builder: ProposalBuilder let interactiveBuilder: InteractiveProposalBuilder let fromJsonTxSpy: jest.SpyInstance beforeEach(() => { - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) builder = new ProposalBuilder(kit) fromJsonTxSpy = jest.spyOn(builder, 'fromJsonTx') interactiveBuilder = new InteractiveProposalBuilder(builder) diff --git a/packages/sdk/governance/src/proposal-builder.test.ts b/packages/sdk/governance/src/proposal-builder.test.ts index 99692dc53..c905283ab 100644 --- a/packages/sdk/governance/src/proposal-builder.test.ts +++ b/packages/sdk/governance/src/proposal-builder.test.ts @@ -3,12 +3,12 @@ import { CeloContract, ContractKit, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import BigNumber from 'bignumber.js' import { ProposalBuilder } from './proposal-builder' -testWithAnvilL2('ProposalBuilder', (web3) => { +testWithAnvilL2('ProposalBuilder', (client) => { let kit: ContractKit let proposalBuilder: ProposalBuilder beforeEach(() => { - kit = newKitFromWeb3(web3) + kit = newKitFromWeb3(client) proposalBuilder = new ProposalBuilder(kit) }) diff --git a/packages/sdk/governance/src/proposals.ts b/packages/sdk/governance/src/proposals.ts index a090f8a05..41af73264 100644 --- a/packages/sdk/governance/src/proposals.ts +++ b/packages/sdk/governance/src/proposals.ts @@ -95,7 +95,7 @@ const registryRepointRawArgs = (abiCoder: AbiCoder, tx: ProposalTransaction) => const params = abiCoder.decodeParameters(setAddressAbi.inputs!, trimLeading0x(tx.input).slice(8)) return { name: params.identifier as CeloContract, - address: params.addr, + address: params.addr as string, } } diff --git a/packages/sdk/metadata-claims/src/account.test.ts b/packages/sdk/metadata-claims/src/account.test.ts index 8ac18cb7e..9c078ff9e 100644 --- a/packages/sdk/metadata-claims/src/account.test.ts +++ b/packages/sdk/metadata-claims/src/account.test.ts @@ -9,8 +9,8 @@ import { IdentityMetadataWrapper } from './metadata' import { AccountMetadataSignerGetters } from './types' import { verifyClaim } from './verify' -testWithAnvilL2('Account claims', (web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('Account claims', (client) => { + const kit = newKitFromWeb3(client) const address = ACCOUNT_ADDRESSES[0] const otherAddress = ACCOUNT_ADDRESSES[1] diff --git a/packages/sdk/metadata-claims/src/domain.test.ts b/packages/sdk/metadata-claims/src/domain.test.ts index 02b28cdcf..a8e8756f1 100644 --- a/packages/sdk/metadata-claims/src/domain.test.ts +++ b/packages/sdk/metadata-claims/src/domain.test.ts @@ -8,8 +8,8 @@ import { IdentityMetadataWrapper } from './metadata' import type { AccountMetadataSignerGetters } from './types' import { verifyDomainRecord } from './verify' -testWithAnvilL2('Domain claims', (web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('Domain claims', (client) => { + const kit = newKitFromWeb3(client) const address = ACCOUNT_ADDRESSES[0] const secondAddress = ACCOUNT_ADDRESSES[1] diff --git a/packages/sdk/metadata-claims/src/metadata.test.ts b/packages/sdk/metadata-claims/src/metadata.test.ts index 6fb4a2cf6..d6fea6f51 100644 --- a/packages/sdk/metadata-claims/src/metadata.test.ts +++ b/packages/sdk/metadata-claims/src/metadata.test.ts @@ -7,8 +7,8 @@ import { Claim, createNameClaim, createRpcUrlClaim } from './claim' import { ClaimTypes, IdentityMetadataWrapper } from './metadata' import { now } from './types' -testWithAnvilL2('Metadata', (web3) => { - const kit = newKitFromWeb3(web3) +testWithAnvilL2('Metadata', (client) => { + const kit = newKitFromWeb3(client) const address = ACCOUNT_ADDRESSES[0] const otherAddress = ACCOUNT_ADDRESSES[1] diff --git a/packages/sdk/transactions-uri/package.json b/packages/sdk/transactions-uri/package.json index f74a6414e..f8f49f421 100644 --- a/packages/sdk/transactions-uri/package.json +++ b/packages/sdk/transactions-uri/package.json @@ -31,8 +31,7 @@ "@types/debug": "^4.1.5", "@types/qrcode": "^1.3.4", "bn.js": "^5.1.0", - "qrcode": "1.4.4", - "web3-eth-abi": "1.10.4" + "qrcode": "1.4.4" }, "devDependencies": { "@celo/contractkit": "^10.0.2-alpha.0", diff --git a/packages/sdk/transactions-uri/src/tx-uri.test.ts b/packages/sdk/transactions-uri/src/tx-uri.test.ts index 587c7daf2..de4a2ebfb 100644 --- a/packages/sdk/transactions-uri/src/tx-uri.test.ts +++ b/packages/sdk/transactions-uri/src/tx-uri.test.ts @@ -3,7 +3,7 @@ import { CeloContract, newKitFromWeb3 } from '@celo/contractkit' import { testWithAnvilL2 } from '@celo/dev-utils/anvil-test' import { buildUri, parseUri } from './tx-uri' -testWithAnvilL2('URI utils', (web3) => { +testWithAnvilL2('URI utils', (client) => { const recipient = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef' const value = '100' @@ -19,7 +19,7 @@ testWithAnvilL2('URI utils', (web3) => { let lockGoldUri: string let lockGoldTx: CeloTx - const kit = newKitFromWeb3(web3) + const kit = newKitFromWeb3(client) beforeAll(async () => { const stableTokenAddr = await kit.registry.addressFor(CeloContract.StableToken) diff --git a/packages/sdk/transactions-uri/src/tx-uri.ts b/packages/sdk/transactions-uri/src/tx-uri.ts index 1374f6cbd..5e4ed503e 100644 --- a/packages/sdk/transactions-uri/src/tx-uri.ts +++ b/packages/sdk/transactions-uri/src/tx-uri.ts @@ -1,12 +1,10 @@ import { trimLeading0x } from '@celo/base/lib/address' import { zeroRange } from '@celo/base/lib/collections' -import { AbiCoder, CeloTx } from '@celo/connect' -import BN from 'bn.js' +import { CeloTx, viemAbiCoder } from '@celo/connect' import qrcode from 'qrcode' import querystring from 'querystring' -import abiWeb3 from 'web3-eth-abi' -const abi = abiWeb3 as unknown as AbiCoder +const abi = viemAbiCoder // see https://solidity.readthedocs.io/en/v0.5.3/abi-spec.html#function-selector-and-argument-encoding const ABI_TYPE_REGEX = '(u?int(8|16|32|64|128|256)|address|bool|bytes(4|32)?|string)(\\[\\])?' @@ -92,7 +90,9 @@ export function buildUri(tx: CeloTx, functionName?: string, abiTypes: string[] = if (txData.length > 8) { const argsEncoded = txData.slice(8) const decoded = abi.decodeParameters(abiTypes, argsEncoded) - functionArgs = zeroRange(decoded.__length__).map((idx) => decoded[idx].toLowerCase()) + functionArgs = zeroRange(decoded.__length__).map((idx) => + (decoded[idx] as string).toLowerCase() + ) } } @@ -103,7 +103,7 @@ export function buildUri(tx: CeloTx, functionName?: string, abiTypes: string[] = uri += `args=[${functionArgs.join(',')}]` } const params = txQueryParams as { [key: string]: string } - if (txQueryParams.value instanceof BN) { + if (txQueryParams.value != null && typeof txQueryParams.value !== 'string') { params.value = txQueryParams.value.toString() } uri += querystring.stringify({ ...params }) diff --git a/packages/sdk/utils/package.json b/packages/sdk/utils/package.json index 31ef2cda2..8faa6d53f 100644 --- a/packages/sdk/utils/package.json +++ b/packages/sdk/utils/package.json @@ -36,8 +36,7 @@ "bignumber.js": "^9.0.0", "fp-ts": "2.16.9", "io-ts": "2.0.1", - "web3-eth-abi": "1.10.4", - "web3-utils": "1.10.4" + "viem": "^2.33.2" }, "devDependencies": { "@celo/typescript": "workspace:^" diff --git a/packages/sdk/utils/src/sign-typed-data-utils.ts b/packages/sdk/utils/src/sign-typed-data-utils.ts index 4b60c0762..54059c431 100644 --- a/packages/sdk/utils/src/sign-typed-data-utils.ts +++ b/packages/sdk/utils/src/sign-typed-data-utils.ts @@ -3,7 +3,7 @@ import { keccak_256 } from '@noble/hashes/sha3' import { hexToBytes, utf8ToBytes } from '@noble/hashes/utils' import { BigNumber } from 'bignumber.js' import * as t from 'io-ts' -import coder from 'web3-eth-abi' +import { type AbiParameter, encodeAbiParameters } from 'viem' export interface EIP712Parameter { name: string @@ -200,7 +200,10 @@ export function typeHash(primaryType: string, types: EIP712Types): Buffer { function encodeValue(valueType: string, value: EIP712ObjectValue, types: EIP712Types): Buffer { // Encode the atomic types as their corresponding soldity ABI type. if (EIP712_ATOMIC_TYPES.includes(valueType)) { - const hexEncoded = coder.encodeParameter(valueType, normalizeValue(valueType, value)) + const hexEncoded = encodeAbiParameters( + [{ type: valueType } as AbiParameter], + [normalizeValue(valueType, value)] + ) return Buffer.from(trimLeading0x(hexEncoded), 'hex') } diff --git a/packages/sdk/utils/src/signatureUtils.test.ts b/packages/sdk/utils/src/signatureUtils.test.ts index c2d6c62c0..88eae4a9d 100644 --- a/packages/sdk/utils/src/signatureUtils.test.ts +++ b/packages/sdk/utils/src/signatureUtils.test.ts @@ -1,5 +1,5 @@ -import * as Web3Utils from 'web3-utils' import { privateKeyToAddress } from './address' +import { soliditySha3 } from './solidity' import { parseSignature, parseSignatureWithoutPrefix, @@ -13,7 +13,7 @@ describe('signatures', () => { it('should sign appropriately with a hash of a message', () => { const pKey = '0x62633f7c9583780a7d3904a2f55d792707c345f21de1bacb2d389934d82796b2' const address = privateKeyToAddress(pKey) - const messageHash = Web3Utils.soliditySha3({ type: 'string', value: 'identifier' })! + const messageHash = soliditySha3({ type: 'string', value: 'identifier' })! const signature = signMessageWithoutPrefix(messageHash, pKey, address) const serializedSig = serializeSignature(signature) parseSignatureWithoutPrefix(messageHash, serializedSig, address) diff --git a/packages/sdk/utils/src/signatureUtils.ts b/packages/sdk/utils/src/signatureUtils.ts index ea86a7f77..cb60a4902 100644 --- a/packages/sdk/utils/src/signatureUtils.ts +++ b/packages/sdk/utils/src/signatureUtils.ts @@ -8,7 +8,7 @@ import { pubToAddress, toBuffer, } from '@ethereumjs/util' -import { isHexStrict, soliditySha3 } from 'web3-utils' +import { isHex, keccak256, stringToBytes, toBytes } from 'viem' import { ensureLeading0x, eqAddress, privateKeyToAddress, trimLeading0x } from './address' import { EIP712TypedData, generateTypedDataHash } from './sign-typed-data-utils' @@ -24,7 +24,7 @@ export { // If messages is a hex, the length of it should be the number of bytes function messageLength(message: string) { - if (isHexStrict(message)) { + if (isHex(message, { strict: true })) { return (message.length - 2) / 2 } return message.length @@ -33,11 +33,19 @@ function messageLength(message: string) { // https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign export function hashMessageWithPrefix(message: string): string { const prefix = '\x19Ethereum Signed Message:\n' + messageLength(message) - return soliditySha3(prefix, message)! + // prefix is always a plain string (UTF-8), message can be hex or plain string + // toBytes handles both: hex strings → decoded bytes, plain strings → UTF-8 bytes + const prefixBytes = toBytes(prefix) + const messageBytes = toBytes(message) + const combined = new Uint8Array(prefixBytes.length + messageBytes.length) + combined.set(prefixBytes) + combined.set(messageBytes, prefixBytes.length) + return keccak256(combined) } export function hashMessage(message: string): string { - return soliditySha3({ type: 'string', value: message })! + // Always treat message as UTF-8 string (matching web3's soliditySha3({type:'string', value})) + return keccak256(stringToBytes(message)) } export async function addressToPublicKey( diff --git a/packages/sdk/utils/src/solidity.ts b/packages/sdk/utils/src/solidity.ts index 548931d5d..d633aae20 100644 --- a/packages/sdk/utils/src/solidity.ts +++ b/packages/sdk/utils/src/solidity.ts @@ -1 +1,99 @@ -export { sha3, soliditySha3, soliditySha3Raw } from 'web3-utils' +import { encodePacked, type Hex, isHex, keccak256, pad, toBytes, toHex } from 'viem' + +export type SolidityValue = + | string + | number + | bigint + | boolean + | { type: string; value: unknown } + | { t: string; v: unknown } + +/** + * Computes keccak256 of Solidity-packed encoding of arguments. + * Replacement for web3-utils soliditySha3. + * + * Supports two calling conventions: + * 1. Typed objects: soliditySha3({ type: 'address', value: '0x...' }) + * 2. Auto-detected values: soliditySha3('hello', '0xdead') - strings auto-detected as + * 'bytes' if hex, 'string' otherwise; numbers as uint256; booleans as bool + */ +export function soliditySha3(...args: SolidityValue[]): string | null { + if (args.length === 0) return null + + const types: string[] = [] + const values: unknown[] = [] + + for (const arg of args) { + if (typeof arg === 'object' && arg !== null && 'type' in arg && 'value' in arg) { + types.push(arg.type as string) + values.push(arg.value) + } else if (typeof arg === 'object' && arg !== null && 't' in arg && 'v' in arg) { + // web3 shorthand: { t: 'uint256', v: 123 } + const shorthand = arg as { t: string; v: unknown } + types.push(shorthand.t) + values.push(shorthand.v) + } else if (typeof arg === 'string') { + if (isHex(arg, { strict: true })) { + types.push('bytes') + values.push(arg) + } else { + types.push('string') + values.push(arg) + } + } else if (typeof arg === 'number' || typeof arg === 'bigint') { + types.push('uint256') + values.push(BigInt(arg)) + } else if (typeof arg === 'boolean') { + types.push('bool') + values.push(arg) + } + } + + // Coerce values for bytesN types: web3 accepted plain strings and hex of wrong size + for (let i = 0; i < types.length; i++) { + const bytesMatch = types[i].match(/^bytes(\d+)$/) + if (bytesMatch && typeof values[i] === 'string') { + const size = parseInt(bytesMatch[1], 10) + let hex: Hex + if (isHex(values[i] as string, { strict: true })) { + hex = values[i] as Hex + } else { + hex = toHex(toBytes(values[i] as string)) + } + const byteLen = (hex.length - 2) / 2 + if (byteLen < size) { + values[i] = pad(hex, { size, dir: 'right' }) + } else if (byteLen > size) { + values[i] = ('0x' + hex.slice(2, 2 + size * 2)) as Hex + } + } + } + + const packed = encodePacked(types, values) + return keccak256(packed) +} + +/** + * Same as soliditySha3 but returns the zero hash instead of null for empty input. + * Replacement for web3-utils soliditySha3Raw. + */ +export function soliditySha3Raw(...args: SolidityValue[]): string { + return soliditySha3(...args) ?? keccak256(new Uint8Array()) +} + +/** + * Computes keccak256 hash. Alias for soliditySha3. + * Replacement for web3-utils sha3. + */ +export function sha3(...args: SolidityValue[]): string | null { + // When called with a single string (the common case for sha3), handle it directly + if (args.length === 1 && typeof args[0] === 'string') { + const input = args[0] + // web3's sha3 with a single string auto-detects: hex → decode as bytes, otherwise UTF-8 + if (isHex(input, { strict: true })) { + return keccak256(input as Hex) + } + return keccak256(toBytes(input)) + } + return soliditySha3(...args) +} diff --git a/packages/sdk/wallets/wallet-base/package.json b/packages/sdk/wallets/wallet-base/package.json index 6838a1896..69030465f 100644 --- a/packages/sdk/wallets/wallet-base/package.json +++ b/packages/sdk/wallets/wallet-base/package.json @@ -39,8 +39,7 @@ "@noble/hashes": "^1.3.3", "@types/debug": "^4.1.5", "bignumber.js": "^9.0.0", - "debug": "^4.1.1", - "web3": "1.10.4" + "debug": "^4.1.1" }, "engines": { "node": ">=20" diff --git a/packages/sdk/wallets/wallet-base/src/signing-utils.test.ts b/packages/sdk/wallets/wallet-base/src/signing-utils.test.ts index 74e22dc6c..f2b926ec6 100644 --- a/packages/sdk/wallets/wallet-base/src/signing-utils.test.ts +++ b/packages/sdk/wallets/wallet-base/src/signing-utils.test.ts @@ -1,10 +1,9 @@ import { CeloTx } from '@celo/connect' import { normalizeAddressWith0x, privateKeyToAddress } from '@celo/utils/lib/address' import { hexToBytes } from '@noble/hashes/utils' -import { parseTransaction, serializeTransaction } from 'viem' +import { parseEther, parseTransaction, serializeTransaction } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { celo } from 'viem/chains' -import Web3 from 'web3' import { extractSignature, getSignerFromTxEIP2718TX, @@ -32,7 +31,7 @@ describe('rlpEncodedTx', () => { from: '0x1daf825EB5C0D9d9FeC33C444e413452A08e04A6', to: '0x43d72ff17701b2da814620735c39c620ce0ea4a1', chainId: 42220, - value: Web3.utils.toWei('0', 'ether'), + value: parseEther('0').toString(), nonce: 619, gas: '504830', gasPrice: '5000000000', @@ -69,7 +68,7 @@ describe('rlpEncodedTx', () => { from: ACCOUNT_ADDRESS1, to: ACCOUNT_ADDRESS1, chainId: 2, - value: Web3.utils.toWei('1000', 'ether'), + value: parseEther('1000').toString(), nonce: 0, maxFeePerGas: '10', maxPriorityFeePerGas: '99', @@ -81,7 +80,7 @@ describe('rlpEncodedTx', () => { it('throws an error', () => { const transaction = { ...eip1559Transaction, - maxFeePerGas: Web3.utils.toBN('-5'), + maxFeePerGas: BigInt('-5'), } expect(() => rlpEncodedTx(transaction)).toThrowErrorMatchingInlineSnapshot( `"GasPrice or maxFeePerGas or maxPriorityFeePerGas is less than than 0"` @@ -92,7 +91,7 @@ describe('rlpEncodedTx', () => { it('throws an error', () => { const transaction = { ...eip1559Transaction, - maxPriorityFeePerGas: Web3.utils.toBN('-5'), + maxPriorityFeePerGas: BigInt('-5'), } expect(() => rlpEncodedTx(transaction)).toThrowErrorMatchingInlineSnapshot( `"GasPrice or maxFeePerGas or maxPriorityFeePerGas is less than than 0"` @@ -160,7 +159,7 @@ describe('rlpEncodedTx', () => { const CIP66Transaction = { ...eip1559Transaction, feeCurrency: '0x5409ED021D9299bf6814279A6A1411A7e866A631', - maxFeeInFeeCurrency: Web3.utils.toBN('100000000010181646104615494635153636353810897'), + maxFeeInFeeCurrency: BigInt('100000000010181646104615494635153636353810897'), } as const const result = rlpEncodedTx(CIP66Transaction) expect(result).toMatchInlineSnapshot(` @@ -242,7 +241,7 @@ describe('rlpEncodedTx', () => { from: ACCOUNT_ADDRESS1, to: ACCOUNT_ADDRESS1, chainId: 2, - value: Web3.utils.toWei('1000', 'ether'), + value: parseEther('1000').toString(), nonce: 0, maxFeePerGas: '1000', maxPriorityFeePerGas: '99', @@ -279,7 +278,7 @@ describe('rlpEncodedTx', () => { from: ACCOUNT_ADDRESS1, to: ACCOUNT_ADDRESS1, chainId: 2, - value: Web3.utils.toWei('1000', 'ether'), + value: parseEther('1000').toString(), nonce: 0, maxFeePerGas: '1000', maxPriorityFeePerGas: '99', @@ -521,7 +520,7 @@ describe('isPriceToLow', () => { expect( isPriceToLow({ maxFeePerGas: 1_000_000_000, - maxPriorityFeePerGas: Web3.utils.toBN('50000000000000'), + maxPriorityFeePerGas: BigInt('50000000000000'), gasPrice: undefined, }) ).toBe(false) @@ -529,7 +528,7 @@ describe('isPriceToLow', () => { test('gasPrice is positive', () => { expect( isPriceToLow({ - gasPrice: Web3.utils.toBN('50000000000000'), + gasPrice: BigInt('50000000000000'), }) ).toBe(false) }) @@ -663,7 +662,7 @@ describe('stringNumberOrBNToHex', () => { expect(stringNumberOrBNToHex(123)).toEqual('0x7b') }) test('BN', () => { - const biggie = Web3.utils.toBN('123') + const biggie = BigInt('123') expect(stringNumberOrBNToHex(biggie)).toEqual('0x7b') }) test('bigint', () => { diff --git a/packages/sdk/wallets/wallet-base/src/signing-utils.ts b/packages/sdk/wallets/wallet-base/src/signing-utils.ts index 5f65ebc17..0ae898e3d 100644 --- a/packages/sdk/wallets/wallet-base/src/signing-utils.ts +++ b/packages/sdk/wallets/wallet-base/src/signing-utils.ts @@ -29,7 +29,7 @@ import { secp256k1 } from '@noble/curves/secp256k1' import { keccak_256 } from '@noble/hashes/sha3' import { bytesToHex, hexToBytes } from '@noble/hashes/utils' import debugFactory from 'debug' -import Web3 from 'web3' // TODO try to do this without web3 direct +// Web3 removed - using native replacements type OldTransactionTypes = 'celo-legacy' | 'cip42' | TransactionTypes type LegacyCeloTx = Omit & { @@ -112,9 +112,7 @@ function signatureFormatter( } } -export function stringNumberOrBNToHex( - num?: number | string | ReturnType | bigint -): Hex { +export function stringNumberOrBNToHex(num?: number | string | bigint): Hex { if (typeof num === 'string' || typeof num === 'number' || num === undefined) { return stringNumberToHex(num) } else { @@ -129,7 +127,7 @@ function stringNumberToHex(num?: number | string | bigint): StrongAddress { if (typeof num === 'bigint') { return makeEven(`0x` + num.toString(16)) as StrongAddress } - return makeEven(Web3.utils.numberToHex(num)) as StrongAddress + return makeEven(ensureLeading0x(Number(num).toString(16))) as StrongAddress } export function rlpEncodedTx(tx: CeloTx): RLPEncodedTx { assertSerializableTX(tx) @@ -327,7 +325,7 @@ function isLessThanZero(value: CeloTx['gasPrice']) { case 'number': return Number(value) < 0 default: - return value?.lt(Web3.utils.toBN(0)) || false + return typeof value === 'bigint' ? value < BigInt(0) : false } } diff --git a/packages/sdk/wallets/wallet-hsm-aws/package.json b/packages/sdk/wallets/wallet-hsm-aws/package.json index 81b7865bb..a0814086e 100644 --- a/packages/sdk/wallets/wallet-hsm-aws/package.json +++ b/packages/sdk/wallets/wallet-hsm-aws/package.json @@ -43,8 +43,7 @@ "@noble/curves": "1.3.0", "@noble/hashes": "1.3.3", "@types/debug": "^4.1.12", - "dotenv": "^8.2.0", - "web3": "1.10.4" + "dotenv": "^8.2.0" }, "engines": { "node": ">=20" diff --git a/packages/sdk/wallets/wallet-hsm-aws/src/aws-hsm-wallet.test.ts b/packages/sdk/wallets/wallet-hsm-aws/src/aws-hsm-wallet.test.ts index 7cec28d84..34eab762d 100644 --- a/packages/sdk/wallets/wallet-hsm-aws/src/aws-hsm-wallet.test.ts +++ b/packages/sdk/wallets/wallet-hsm-aws/src/aws-hsm-wallet.test.ts @@ -11,7 +11,6 @@ import { asn1FromPublicKey } from '@celo/wallet-hsm' import * as ethUtil from '@ethereumjs/util' import { secp256k1 } from '@noble/curves/secp256k1' import { BigNumber } from 'bignumber.js' -import Web3 from 'web3' import { AwsHsmWallet } from './aws-hsm-wallet' require('dotenv').config() @@ -174,7 +173,7 @@ describe('AwsHsmWallet class', () => { from: unknownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: '10', gasPrice: '99', @@ -231,7 +230,7 @@ describe('AwsHsmWallet class', () => { from: knownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: '10', gasPrice: '99', @@ -257,7 +256,7 @@ describe('AwsHsmWallet class', () => { from: await wallet.getAddressFromKeyId(knownKey), to: ACCOUNT_ADDRESS2, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 65, gas: '10', gasPrice: '99', diff --git a/packages/sdk/wallets/wallet-hsm-azure/package.json b/packages/sdk/wallets/wallet-hsm-azure/package.json index b5c2ec165..b7de89e8c 100644 --- a/packages/sdk/wallets/wallet-hsm-azure/package.json +++ b/packages/sdk/wallets/wallet-hsm-azure/package.json @@ -45,8 +45,7 @@ "@noble/curves": "1.3.0", "@noble/hashes": "1.3.3", "@types/debug": "^4.1.12", - "dotenv": "^8.2.0", - "web3": "1.10.4" + "dotenv": "^8.2.0" }, "engines": { "node": ">=20" diff --git a/packages/sdk/wallets/wallet-hsm-azure/src/azure-hsm-wallet.test.ts b/packages/sdk/wallets/wallet-hsm-azure/src/azure-hsm-wallet.test.ts index 13b4717a1..ffcc935c3 100644 --- a/packages/sdk/wallets/wallet-hsm-azure/src/azure-hsm-wallet.test.ts +++ b/packages/sdk/wallets/wallet-hsm-azure/src/azure-hsm-wallet.test.ts @@ -11,7 +11,6 @@ import { recoverTransaction, verifyEIP712TypedDataSigner } from '@celo/wallet-ba import { Signature, publicKeyPrefix } from '@celo/wallet-hsm' import * as ethUtil from '@ethereumjs/util' import { BigNumber } from 'bignumber.js' -import Web3 from 'web3' import { AzureHSMWallet } from './azure-hsm-wallet' // Env var should hold service principal credentials @@ -166,7 +165,7 @@ describe('AzureHSMWallet class', () => { celoTransaction = { from: unknownAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: '10', maxFeePerGas: '99', @@ -228,7 +227,7 @@ describe('AzureHSMWallet class', () => { from: knownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: '10', gasPrice: '99', @@ -258,7 +257,7 @@ describe('AzureHSMWallet class', () => { from: await wallet.getAddressFromKeyName(knownKey), to: ACCOUNT_ADDRESS2, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 65, gas: '10', gasPrice: '99', diff --git a/packages/sdk/wallets/wallet-hsm-gcp/package.json b/packages/sdk/wallets/wallet-hsm-gcp/package.json index 7fee0756b..310749ab9 100644 --- a/packages/sdk/wallets/wallet-hsm-gcp/package.json +++ b/packages/sdk/wallets/wallet-hsm-gcp/package.json @@ -38,8 +38,7 @@ "@noble/curves": "1.3.0", "@noble/hashes": "1.3.3", "@types/debug": "^4.1.12", - "dotenv": "^8.2.0", - "web3": "1.10.4" + "dotenv": "^8.2.0" }, "engines": { "node": ">=20" diff --git a/packages/sdk/wallets/wallet-hsm-gcp/src/gcp-hsm-wallet.test.ts b/packages/sdk/wallets/wallet-hsm-gcp/src/gcp-hsm-wallet.test.ts index a3fc3eefb..c71da1fb7 100644 --- a/packages/sdk/wallets/wallet-hsm-gcp/src/gcp-hsm-wallet.test.ts +++ b/packages/sdk/wallets/wallet-hsm-gcp/src/gcp-hsm-wallet.test.ts @@ -11,7 +11,6 @@ import { asn1FromPublicKey } from '@celo/wallet-hsm' import * as ethUtil from '@ethereumjs/util' import { secp256k1 } from '@noble/curves/secp256k1' import { BigNumber } from 'bignumber.js' -import Web3 from 'web3' import { GcpHsmWallet } from './gcp-hsm-wallet' require('dotenv').config() @@ -159,7 +158,7 @@ describe('GcpHsmWallet class', () => { from: unknownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: '10', gasPrice: '99', @@ -218,7 +217,7 @@ describe('GcpHsmWallet class', () => { from: knownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: '10', gasPrice: '99', @@ -244,7 +243,7 @@ describe('GcpHsmWallet class', () => { from: await wallet.getAddressFromVersionName(knownKey), to: ACCOUNT_ADDRESS2, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 65, gas: '10', gasPrice: '99', diff --git a/packages/sdk/wallets/wallet-ledger/package.json b/packages/sdk/wallets/wallet-ledger/package.json index 7acf2efee..6cd0d594e 100644 --- a/packages/sdk/wallets/wallet-ledger/package.json +++ b/packages/sdk/wallets/wallet-ledger/package.json @@ -47,8 +47,7 @@ "@noble/curves": "^1.4.0", "@noble/hashes": "^1.3.3", "@types/debug": "^4.1.12", - "@types/node": "18.7.16", - "web3": "1.10.4" + "@types/node": "18.7.16" }, "engines": { "node": ">=20" diff --git a/packages/sdk/wallets/wallet-ledger/src/ledger-wallet.test.ts b/packages/sdk/wallets/wallet-ledger/src/ledger-wallet.test.ts index 3cf205c7a..0d40e7591 100644 --- a/packages/sdk/wallets/wallet-ledger/src/ledger-wallet.test.ts +++ b/packages/sdk/wallets/wallet-ledger/src/ledger-wallet.test.ts @@ -4,7 +4,6 @@ import { CeloTx, EncodedTransaction } from '@celo/connect' import { verifySignature } from '@celo/utils/lib/signatureUtils' import { recoverTransaction, verifyEIP712TypedDataSigner } from '@celo/wallet-base' import TransportNodeHid from '@ledgerhq/hw-transport-node-hid' -import Web3 from 'web3' import { AddressValidation, CELO_BASE_DERIVATION_PATH, LedgerWallet } from './ledger-wallet' import { ACCOUNT_ADDRESS1, @@ -115,7 +114,7 @@ describe('LedgerWallet class', () => { from: knownAddress, to: knownAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: 99, maxFeePerGas: 99, @@ -301,7 +300,7 @@ describe('LedgerWallet class', () => { from: unknownAddress, to: unknownAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: 99, maxFeePerGas: 99, @@ -361,7 +360,7 @@ describe('LedgerWallet class', () => { from: knownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: 99, maxFeePerGas: 99, @@ -449,7 +448,7 @@ describe('LedgerWallet class', () => { from: knownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 65, gas: '10', maxFeePerGas: 99, @@ -475,7 +474,7 @@ describe('LedgerWallet class', () => { from: knownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 1, gas: 99, gasPrice: 99, @@ -515,7 +514,7 @@ describe('LedgerWallet class', () => { from: knownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: 99, maxFeePerGas: 99, @@ -570,7 +569,7 @@ describe('LedgerWallet class', () => { from: knownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: 99, maxFeePerGas: 99, @@ -615,7 +614,7 @@ describe('LedgerWallet class', () => { from: knownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: 99, maxFeePerGas: 99, diff --git a/packages/sdk/wallets/wallet-local/package.json b/packages/sdk/wallets/wallet-local/package.json index d89248bbb..8371373f1 100644 --- a/packages/sdk/wallets/wallet-local/package.json +++ b/packages/sdk/wallets/wallet-local/package.json @@ -35,8 +35,7 @@ "@celo/typescript": "workspace:^", "@types/debug": "^4.1.12", "debug": "^4.3.5", - "viem": "~2.33.2", - "web3": "1.10.4" + "viem": "~2.33.2" }, "engines": { "node": ">=20" diff --git a/packages/sdk/wallets/wallet-local/src/local-wallet.test.ts b/packages/sdk/wallets/wallet-local/src/local-wallet.test.ts index 36f7becd3..14de66a53 100644 --- a/packages/sdk/wallets/wallet-local/src/local-wallet.test.ts +++ b/packages/sdk/wallets/wallet-local/src/local-wallet.test.ts @@ -9,9 +9,8 @@ import { import { Encrypt } from '@celo/utils/lib/ecies' import { verifySignature } from '@celo/utils/lib/signatureUtils' import { recoverTransaction, verifyEIP712TypedDataSigner } from '@celo/wallet-base' -import { parseTransaction, TransactionSerializableEIP1559 } from 'viem' +import { parseEther, parseTransaction, TransactionSerializableEIP1559 } from 'viem' import { privateKeyToAccount } from 'viem/accounts' -import Web3 from 'web3' import { LocalWallet } from './local-wallet' const CHAIN_ID = 44378 @@ -116,7 +115,7 @@ describe('Local wallet class', () => { from: unknownAddress, to: unknownAddress, chainId: 2, - value: Web3.utils.toWei('1', 'ether'), + value: parseEther('1').toString(), nonce: 0, gas: '10', maxFeePerGas: '99', @@ -161,7 +160,7 @@ describe('Local wallet class', () => { from: knownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: parseEther('1').toString(), nonce: 0, gas: '10', gasPrice: '99', @@ -390,7 +389,7 @@ describe('Local wallet class', () => { from: ACCOUNT_ADDRESS1, to: ACCOUNT_ADDRESS2, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: parseEther('1').toString(), nonce: 65, gas: '10', gasPrice: '99', @@ -419,7 +418,7 @@ describe('Local wallet class', () => { from: knownAddress, to: otherAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: parseEther('1').toString(), nonce: 0, data: '0xabcdef', } diff --git a/packages/sdk/wallets/wallet-local/src/signing.test.ts b/packages/sdk/wallets/wallet-local/src/signing.test.ts index 5fa2b70f7..851ea74db 100644 --- a/packages/sdk/wallets/wallet-local/src/signing.test.ts +++ b/packages/sdk/wallets/wallet-local/src/signing.test.ts @@ -6,11 +6,12 @@ import { JsonRpcPayload, JsonRpcResponse, Provider, + Web3, } from '@celo/connect' import { privateKeyToAddress } from '@celo/utils/lib/address' import { recoverTransaction } from '@celo/wallet-base' import debugFactory from 'debug' -import Web3 from 'web3' +import { parseEther } from 'viem' import { LocalWallet } from './local-wallet' const debug = debugFactory('kit:txtest:sign') @@ -30,7 +31,7 @@ debug(`Account Address 2: ${ACCOUNT_ADDRESS2}`) describe('Transaction Utils', () => { // only needed for the eth_coinbase rcp call let connection: Connection - let web3: Web3 + let client: Web3 const mockProvider: Provider = { send: (payload: JsonRpcPayload, callback: Callback): void => { if (payload.method === 'eth_coinbase') { @@ -54,9 +55,8 @@ describe('Transaction Utils', () => { } const setupConnection = async () => { - web3 = new Web3() - web3.setProvider(mockProvider as any) - connection = new Connection(web3) + connection = new Connection(mockProvider) + client = connection.web3 connection.wallet = new LocalWallet() } const verifyLocalSigning = async (celoTransaction: CeloTx): Promise => { @@ -64,8 +64,8 @@ describe('Transaction Utils', () => { let recoveredTransaction: CeloTx | undefined let signedTransaction: { raw: string; tx: any } | undefined beforeAll(async () => { - signedTransaction = await web3.eth.signTransaction(celoTransaction) - const recovery = recoverTransaction(signedTransaction.raw) + signedTransaction = await client.eth.signTransaction(celoTransaction) + const recovery = recoverTransaction(signedTransaction!.raw) recoveredTransaction = recovery[0] recoveredSigner = recovery[1] }) @@ -80,35 +80,37 @@ describe('Transaction Utils', () => { expect(recoveredSigner?.toLowerCase()).toEqual(celoTransaction.from!.toString().toLowerCase()) }) + // Helper: parse a value that may be a hex string (from web3 mutation) or a number + const toNumber = (val: unknown): number => { + if (typeof val === 'string' && val.startsWith('0x')) return parseInt(val, 16) + return Number(val) + } + test('Checking nonce', async () => { if (celoTransaction.nonce != null) { - expect(recoveredTransaction?.nonce).toEqual(parseInt(celoTransaction.nonce.toString(), 16)) + expect(recoveredTransaction?.nonce).toEqual(toNumber(celoTransaction.nonce)) } }) test('Checking gas', async () => { if (celoTransaction.gas != null) { - expect(recoveredTransaction?.gas).toEqual(parseInt(celoTransaction.gas.toString(), 16)) + expect(recoveredTransaction?.gas).toEqual(toNumber(celoTransaction.gas)) } }) test('Checking gas price', async () => { if (celoTransaction.gasPrice != null) { - expect(recoveredTransaction?.gasPrice).toEqual( - parseInt(celoTransaction.gasPrice.toString(), 16) - ) + expect(recoveredTransaction?.gasPrice).toEqual(toNumber(celoTransaction.gasPrice)) } }) test('Checking maxFeePerGas', async () => { if (celoTransaction.maxFeePerGas != null) { - expect(recoveredTransaction?.maxFeePerGas).toEqual( - parseInt(celoTransaction.maxFeePerGas.toString(), 16) - ) + expect(recoveredTransaction?.maxFeePerGas).toEqual(toNumber(celoTransaction.maxFeePerGas)) } }) test('Checking maxPriorityFeePerGas', async () => { if (celoTransaction.maxPriorityFeePerGas != null) { expect(recoveredTransaction?.maxPriorityFeePerGas).toEqual( - parseInt(celoTransaction.maxPriorityFeePerGas.toString(), 16) + toNumber(celoTransaction.maxPriorityFeePerGas) ) } }) @@ -136,7 +138,7 @@ describe('Transaction Utils', () => { } const verifyLocalSigningInAllPermutations = async (from: string, to: string): Promise => { - const amountInWei: string = Web3.utils.toWei('1', 'ether') + const amountInWei: string = parseEther('1').toString() const nonce = 0 const badNonce = 100 const gas = 10000 diff --git a/packages/sdk/wallets/wallet-remote/package.json b/packages/sdk/wallets/wallet-remote/package.json index ac24bccb2..c04d26512 100644 --- a/packages/sdk/wallets/wallet-remote/package.json +++ b/packages/sdk/wallets/wallet-remote/package.json @@ -32,8 +32,7 @@ "@types/debug": "^4.1.5" }, "devDependencies": { - "@celo/typescript": "workspace:^", - "web3": "1.10.4" + "@celo/typescript": "workspace:^" }, "engines": { "node": ">=20" diff --git a/packages/sdk/wallets/wallet-remote/src/remote-wallet.test.ts b/packages/sdk/wallets/wallet-remote/src/remote-wallet.test.ts index d31031832..d968c6ab1 100644 --- a/packages/sdk/wallets/wallet-remote/src/remote-wallet.test.ts +++ b/packages/sdk/wallets/wallet-remote/src/remote-wallet.test.ts @@ -1,6 +1,5 @@ import { Address, CeloTx, Signer } from '@celo/connect' import { normalizeAddressWith0x, privateKeyToAddress } from '@celo/utils/lib/address' -import Web3 from 'web3' import { RemoteWallet } from './remote-wallet' export const PRIVATE_KEY1 = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef' @@ -70,7 +69,7 @@ describe('RemoteWallet', () => { from: knownAddress, to: knownAddress, chainId: CHAIN_ID, - value: Web3.utils.toWei('1', 'ether'), + value: '1000000000000000000', nonce: 0, gas: '10', gasPrice: '99', diff --git a/packages/sdk/wallets/wallet-rpc/lib/rpc-wallet.test.d.ts b/packages/sdk/wallets/wallet-rpc/lib/rpc-wallet.test.d.ts deleted file mode 100644 index ff9ea3c17..000000000 --- a/packages/sdk/wallets/wallet-rpc/lib/rpc-wallet.test.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -export declare const CHAIN_ID = 44378; -export declare const TYPED_DATA: { - types: { - EIP712Domain: { - name: string; - type: string; - }[]; - Person: { - name: string; - type: string; - }[]; - Mail: { - name: string; - type: string; - }[]; - }; - primaryType: string; - domain: { - name: string; - version: string; - chainId: number; - verifyingContract: string; - }; - message: { - from: { - name: string; - wallet: string; - }; - to: { - name: string; - wallet: string; - }; - contents: string; - }; -}; -export declare const PRIVATE_KEY1 = "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abbdef"; -export declare const ACCOUNT_ADDRESS1: `0x${string}`; -export declare const PRIVATE_KEY2 = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890fdeccc"; -export declare const ACCOUNT_ADDRESS2: `0x${string}`; diff --git a/packages/sdk/wallets/wallet-rpc/lib/rpc-wallet.test.js b/packages/sdk/wallets/wallet-rpc/lib/rpc-wallet.test.js deleted file mode 100644 index 7aaa5858c..000000000 --- a/packages/sdk/wallets/wallet-rpc/lib/rpc-wallet.test.js +++ /dev/null @@ -1,227 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ACCOUNT_ADDRESS2 = exports.PRIVATE_KEY2 = exports.ACCOUNT_ADDRESS1 = exports.PRIVATE_KEY1 = exports.TYPED_DATA = exports.CHAIN_ID = void 0; -const connect_1 = require("@celo/connect"); -const ganache_test_1 = require("@celo/dev-utils/lib/ganache-test"); -const address_1 = require("@celo/utils/lib/address"); -const signatureUtils_1 = require("@celo/utils/lib/signatureUtils"); -const wallet_base_1 = require("@celo/wallet-base"); -const net_1 = __importDefault(require("net")); -const web3_1 = __importDefault(require("web3")); -const rpc_wallet_1 = require("./rpc-wallet"); -exports.CHAIN_ID = 44378; -// Sample data from the official EIP-712 example: -// https://github.com/ethereum/EIPs/blob/master/assets/eip-712/Example.js -exports.TYPED_DATA = { - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - { name: 'verifyingContract', type: 'address' }, - ], - Person: [ - { name: 'name', type: 'string' }, - { name: 'wallet', type: 'address' }, - ], - Mail: [ - { name: 'from', type: 'Person' }, - { name: 'to', type: 'Person' }, - { name: 'contents', type: 'string' }, - ], - }, - primaryType: 'Mail', - domain: { - name: 'Ether Mail', - version: '1', - chainId: 1, - verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', - }, - message: { - from: { - name: 'Cow', - wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', - }, - to: { - name: 'Bob', - wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', - }, - contents: 'Hello, Bob!', - }, -}; -exports.PRIVATE_KEY1 = '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abbdef'; -exports.ACCOUNT_ADDRESS1 = (0, address_1.normalizeAddressWith0x)((0, address_1.privateKeyToAddress)(exports.PRIVATE_KEY1)); -exports.PRIVATE_KEY2 = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890fdeccc'; -exports.ACCOUNT_ADDRESS2 = (0, address_1.normalizeAddressWith0x)((0, address_1.privateKeyToAddress)(exports.PRIVATE_KEY2)); -const PASSPHRASE = 'ce10'; -const DURATION = 10000; -// ./build/bin/geth --datadir=./envs/alfajoresstaging --syncmode=lightest --rpcapi=net,eth,web3,personal --networkid=1101 -describe.skip('rpc-wallet', () => { - it('should work against local geth ipc', () => __awaiter(void 0, void 0, void 0, function* () { - const ipcUrl = '/Users/yorhodes/celo/blockchain/envs/alfajoresstaging/geth.ipc'; - const ipcProvider = new web3_1.default.providers.IpcProvider(ipcUrl, net_1.default); - const wallet = new rpc_wallet_1.RpcWallet(ipcProvider); - yield wallet.init(); - const account = yield wallet.addAccount(exports.PRIVATE_KEY1, PASSPHRASE); - yield wallet.unlockAccount(account, PASSPHRASE, DURATION); - const tx = { - from: exports.ACCOUNT_ADDRESS1, - to: exports.ACCOUNT_ADDRESS2, - value: 1000, - }; - const result = yield wallet.signTransaction(tx); - console.log(result); - const connection = new connect_1.Connection(new web3_1.default(ipcUrl), wallet); - const txResult = yield connection.sendSignedTransaction(result.raw); - console.log(txResult); - })); -}); -// It uses personal_importKey RPC call which is not supported in anvil -(0, ganache_test_1.testWithGanache)('rpc-wallet', (web3) => { - const provider = web3.currentProvider; - const rpcWallet = new rpc_wallet_1.RpcWallet(provider); - describe('with ganache web3 provider', () => { - let ganacheAccounts; - beforeAll(() => __awaiter(void 0, void 0, void 0, function* () { - yield rpcWallet.init(); - ganacheAccounts = yield web3.eth.getAccounts(); - ganacheAccounts = ganacheAccounts.map(address_1.normalizeAddressWith0x); - })); - test('initalizes with provider accounts', () => __awaiter(void 0, void 0, void 0, function* () { - const accounts = rpcWallet.getAccounts(); - expect(accounts).toEqual(ganacheAccounts); - })); - test('fails if you add an invalid private key', () => __awaiter(void 0, void 0, void 0, function* () { - try { - yield rpcWallet.addAccount('this is not a valid private key', PASSPHRASE); - throw new Error('Expected exception to be thrown'); - } - catch (e) { - expect(e.message).toBe('Expected 32 bytes of private key'); - } - })); - test('succeeds if you add a private key without 0x', () => __awaiter(void 0, void 0, void 0, function* () { - yield rpcWallet.addAccount(exports.PRIVATE_KEY1, PASSPHRASE); - expect(rpcWallet.hasAccount(exports.ACCOUNT_ADDRESS1)).toBeTruthy(); - })); - test('fails if you add a private key twice', () => __awaiter(void 0, void 0, void 0, function* () { - try { - yield rpcWallet.addAccount(exports.PRIVATE_KEY1, PASSPHRASE); - throw new Error('Expected exception to be thrown'); - } - catch (e) { - expect(e.message).toBe(`RpcWallet: account already exists`); - } - })); - test('succeeds if you add a private key with 0x', () => __awaiter(void 0, void 0, void 0, function* () { - yield rpcWallet.addAccount(exports.PRIVATE_KEY2, PASSPHRASE); - expect(rpcWallet.hasAccount(exports.ACCOUNT_ADDRESS2)).toBeTruthy(); - })); - describe('with added accounts', () => { - test('all addresses can be retrieved', () => { - expect(rpcWallet.getAccounts()).toEqual(ganacheAccounts.concat([exports.ACCOUNT_ADDRESS1, exports.ACCOUNT_ADDRESS2])); - }); - describe('unlocking', () => { - test('fails if you use an invalid passphrase', () => __awaiter(void 0, void 0, void 0, function* () { - try { - yield rpcWallet.unlockAccount(exports.ACCOUNT_ADDRESS1, 'wrong_passphrase', DURATION); - } - catch (e) { - expect(e.message).toContain('could not decrypt key with given passphrase'); - } - })); - test('succeeds if you use the correct passphrase', () => __awaiter(void 0, void 0, void 0, function* () { - yield rpcWallet.unlockAccount(exports.ACCOUNT_ADDRESS1, PASSPHRASE, DURATION); - const unlocked = rpcWallet.isAccountUnlocked(exports.ACCOUNT_ADDRESS1); - expect(unlocked).toBeTruthy(); - })); - }); - describe('signing', () => { - describe('using an unlocked address', () => { - beforeAll(() => __awaiter(void 0, void 0, void 0, function* () { - yield rpcWallet.unlockAccount(exports.ACCOUNT_ADDRESS1, PASSPHRASE, DURATION); - })); - describe('when calling signTransaction', () => { - let celoTransaction; - beforeEach(() => { - celoTransaction = { - from: exports.ACCOUNT_ADDRESS1, - to: exports.ACCOUNT_ADDRESS2, - chainId: exports.CHAIN_ID, - value: web3.utils.toWei('1', 'ether'), - nonce: 0, - gas: '10', - gasPrice: '99', - feeCurrency: '0x', - data: '0xabcdef', - }; - }); - test('succeeds with old school pricing', () => __awaiter(void 0, void 0, void 0, function* () { - yield expect(rpcWallet.signTransaction(celoTransaction)).resolves.toMatchInlineSnapshot(`"0xf86b8081991094588e4b68193001e4d10928660ab4165b813717c08a0100000000000000000083abcdef25a073bb7eaa60c810af1fad0f68fa15d4714f9990d0202b62797f6134493ec9f6fba046c13e92017228c2c8f0fae74ddd735021817f2f9757cd66debed078daf4070e"`); - })); - test('succeeds with with FeeMarketFields', () => __awaiter(void 0, void 0, void 0, function* () { - const feeMarketTransaction = Object.assign(Object.assign({}, celoTransaction), { gasPrice: undefined, maxFeePerGas: '1500000000', maxPriorityFeePerGas: '1500000000' }); - yield expect(rpcWallet.signTransaction(feeMarketTransaction)).resolves.toMatchInlineSnapshot(`"0xf86a80801094588e4b68193001e4d10928660ab4165b813717c08a0100000000000000000083abcdef26a05e9c1e7690d05f3e1433c824fbd948643ff6c618e347ea8c23a6363f3b17cdffa072dc1c22d6147be7b4b7b3cf51eb73b8bedd7940d7b668dcd7ef688a2354a631"`); - })); - // TODO(yorke): enable once fixed: https://github.com/celo-org/celo-monorepo/issues/4077 - test.skip('with same signer', () => __awaiter(void 0, void 0, void 0, function* () { - const signedTx = yield rpcWallet.signTransaction(celoTransaction); - const [, recoveredSigner] = (0, wallet_base_1.recoverTransaction)(signedTx.raw); - expect((0, address_1.normalizeAddressWith0x)(recoveredSigner)).toBe((0, address_1.normalizeAddressWith0x)(exports.ACCOUNT_ADDRESS1)); - })); - // https://github.com/ethereum/go-ethereum/blob/38aab0aa831594f31d02c9f02bfacc0bef48405d/rlp/decode.go#L664 - test.skip('signature with 0x00 prefix is canonicalized', () => __awaiter(void 0, void 0, void 0, function* () { - // This tx is carefully constructed to produce an S value with the first byte as 0x00 - const celoTransactionZeroPrefix = { - from: exports.ACCOUNT_ADDRESS1, - to: exports.ACCOUNT_ADDRESS2, - chainId: exports.CHAIN_ID, - value: web3.utils.toWei('1', 'ether'), - nonce: 65, - gas: '10', - gasPrice: '99', - feeCurrency: '0x', - data: '0xabcdef', - }; - const signedTx = yield rpcWallet.signTransaction(celoTransactionZeroPrefix); - expect(signedTx.tx.s.startsWith('0x00')).toBeFalsy(); - const [, recoveredSigner] = (0, wallet_base_1.recoverTransaction)(signedTx.raw); - expect((0, address_1.normalizeAddressWith0x)(recoveredSigner)).toBe((0, address_1.normalizeAddressWith0x)(exports.ACCOUNT_ADDRESS1)); - })); - }); - // ganache - describe.skip('when calling signPersonalMessage', () => { - test('succeeds', () => __awaiter(void 0, void 0, void 0, function* () { - const hexStr = exports.ACCOUNT_ADDRESS2; - const signedMessage = yield rpcWallet.signPersonalMessage(exports.ACCOUNT_ADDRESS1, hexStr); - expect(signedMessage).not.toBeUndefined(); - const valid = (0, signatureUtils_1.verifySignature)(hexStr, signedMessage, exports.ACCOUNT_ADDRESS1); - expect(valid).toBeTruthy(); - })); - }); - describe.skip('when calling signTypedData', () => { - test('succeeds', () => __awaiter(void 0, void 0, void 0, function* () { - const signedMessage = yield rpcWallet.signTypedData(exports.ACCOUNT_ADDRESS1, exports.TYPED_DATA); - expect(signedMessage).not.toBeUndefined(); - const valid = (0, wallet_base_1.verifyEIP712TypedDataSigner)(exports.TYPED_DATA, signedMessage, exports.ACCOUNT_ADDRESS1); - expect(valid).toBeTruthy(); - })); - }); - }); - }); - }); - }); -}); -//# sourceMappingURL=rpc-wallet.test.js.map \ No newline at end of file diff --git a/packages/sdk/wallets/wallet-rpc/lib/rpc-wallet.test.js.map b/packages/sdk/wallets/wallet-rpc/lib/rpc-wallet.test.js.map deleted file mode 100644 index 3f47eaed9..000000000 --- a/packages/sdk/wallets/wallet-rpc/lib/rpc-wallet.test.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"rpc-wallet.test.js","sourceRoot":"","sources":["../src/rpc-wallet.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4D;AAC5D,mEAAkE;AAClE,qDAAqF;AACrF,mEAAgE;AAChE,mDAAmF;AACnF,8CAAqB;AACrB,gDAAuB;AACvB,6CAAwC;AAE3B,QAAA,QAAQ,GAAG,KAAK,CAAA;AAE7B,iDAAiD;AACjD,yEAAyE;AAC5D,QAAA,UAAU,GAAG;IACxB,KAAK,EAAE;QACL,YAAY,EAAE;YACZ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;YACnC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;SAC/C;QACD,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;SACpC;QACD,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;SACrC;KACF;IACD,WAAW,EAAE,MAAM;IACnB,MAAM,EAAE;QACN,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,CAAC;QACV,iBAAiB,EAAE,4CAA4C;KAChE;IACD,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,4CAA4C;SACrD;QACD,EAAE,EAAE;YACF,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,4CAA4C;SACrD;QACD,QAAQ,EAAE,aAAa;KACxB;CACF,CAAA;AAEY,QAAA,YAAY,GAAG,kEAAkE,CAAA;AACjF,QAAA,gBAAgB,GAAG,IAAA,gCAAsB,EAAC,IAAA,6BAAmB,EAAC,oBAAY,CAAC,CAAC,CAAA;AAC5E,QAAA,YAAY,GAAG,oEAAoE,CAAA;AACnF,QAAA,gBAAgB,GAAG,IAAA,gCAAsB,EAAC,IAAA,6BAAmB,EAAC,oBAAY,CAAC,CAAC,CAAA;AAEzF,MAAM,UAAU,GAAG,MAAM,CAAA;AACzB,MAAM,QAAQ,GAAG,KAAK,CAAA;AAEtB,yHAAyH;AACzH,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,oCAAoC,EAAE,GAAS,EAAE;QAClD,MAAM,MAAM,GAAG,gEAAgE,CAAA;QAC/E,MAAM,WAAW,GAAG,IAAI,cAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,aAAG,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,IAAI,sBAAS,CAAC,WAAW,CAAC,CAAA;QACzC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QAEnB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,oBAAY,EAAE,UAAU,CAAC,CAAA;QACjE,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;QAEzD,MAAM,EAAE,GAAG;YACT,IAAI,EAAE,wBAAgB;YACtB,EAAE,EAAE,wBAAgB;YACpB,KAAK,EAAE,IAAI;SACZ,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEnB,MAAM,UAAU,GAAG,IAAI,oBAAU,CAAC,IAAI,cAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;QAC3D,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACnE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACvB,CAAC,CAAA,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,sEAAsE;AACtE,IAAA,8BAAe,EAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAA;IACrC,MAAM,SAAS,GAAG,IAAI,sBAAS,CAAC,QAAoB,CAAC,CAAA;IAErD,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,IAAI,eAAyB,CAAA;QAC7B,SAAS,CAAC,GAAS,EAAE;YACnB,MAAM,SAAS,CAAC,IAAI,EAAE,CAAA;YACtB,eAAe,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAA;YAC9C,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,gCAAsB,CAAC,CAAA;QAC/D,CAAC,CAAA,CAAC,CAAA;QAEF,IAAI,CAAC,mCAAmC,EAAE,GAAS,EAAE;YACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAA;YACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;QAC3C,CAAC,CAAA,CAAC,CAAA;QAEF,IAAI,CAAC,yCAAyC,EAAE,GAAS,EAAE;YACzD,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,UAAU,CAAC,iCAAiC,EAAE,UAAU,CAAC,CAAA;gBACzE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;YACpD,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC,CAAA,CAAC,CAAA;QAEF,IAAI,CAAC,8CAA8C,EAAE,GAAS,EAAE;YAC9D,MAAM,SAAS,CAAC,UAAU,CAAC,oBAAY,EAAE,UAAU,CAAC,CAAA;YACpD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,wBAAgB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QAC7D,CAAC,CAAA,CAAC,CAAA;QAEF,IAAI,CAAC,sCAAsC,EAAE,GAAS,EAAE;YACtD,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,UAAU,CAAC,oBAAY,EAAE,UAAU,CAAC,CAAA;gBACpD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;YACpD,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;YAC7D,CAAC;QACH,CAAC,CAAA,CAAC,CAAA;QAEF,IAAI,CAAC,2CAA2C,EAAE,GAAS,EAAE;YAC3D,MAAM,SAAS,CAAC,UAAU,CAAC,oBAAY,EAAE,UAAU,CAAC,CAAA;YACpD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,wBAAgB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QAC7D,CAAC,CAAA,CAAC,CAAA;QAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;YACnC,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;gBAC1C,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CACrC,eAAe,CAAC,MAAM,CAAC,CAAC,wBAAgB,EAAE,wBAAgB,CAAC,CAAC,CAC7D,CAAA;YACH,CAAC,CAAC,CAAA;YAEF,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;gBACzB,IAAI,CAAC,wCAAwC,EAAE,GAAS,EAAE;oBACxD,IAAI,CAAC;wBACH,MAAM,SAAS,CAAC,aAAa,CAAC,wBAAgB,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAA;oBAC/E,CAAC;oBAAC,OAAO,CAAM,EAAE,CAAC;wBAChB,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,6CAA6C,CAAC,CAAA;oBAC5E,CAAC;gBACH,CAAC,CAAA,CAAC,CAAA;gBAEF,IAAI,CAAC,4CAA4C,EAAE,GAAS,EAAE;oBAC5D,MAAM,SAAS,CAAC,aAAa,CAAC,wBAAgB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;oBACrE,MAAM,QAAQ,GAAG,SAAS,CAAC,iBAAiB,CAAC,wBAAgB,CAAC,CAAA;oBAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAA;gBAC/B,CAAC,CAAA,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;YAEF,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;gBACvB,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;oBACzC,SAAS,CAAC,GAAS,EAAE;wBACnB,MAAM,SAAS,CAAC,aAAa,CAAC,wBAAgB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;oBACvE,CAAC,CAAA,CAAC,CAAA;oBAEF,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;wBAC5C,IAAI,eAAuB,CAAA;wBAE3B,UAAU,CAAC,GAAG,EAAE;4BACd,eAAe,GAAG;gCAChB,IAAI,EAAE,wBAAgB;gCACtB,EAAE,EAAE,wBAAgB;gCACpB,OAAO,EAAE,gBAAQ;gCACjB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;gCACrC,KAAK,EAAE,CAAC;gCACR,GAAG,EAAE,IAAI;gCACT,QAAQ,EAAE,IAAI;gCACd,WAAW,EAAE,IAAI;gCACjB,IAAI,EAAE,UAAU;6BACjB,CAAA;wBACH,CAAC,CAAC,CAAA;wBAEF,IAAI,CAAC,kCAAkC,EAAE,GAAS,EAAE;4BAClD,MAAM,MAAM,CACV,SAAS,CAAC,eAAe,CAAC,eAAe,CAAC,CAC3C,CAAC,QAAQ,CAAC,qBAAqB,CAC9B,gOAAgO,CACjO,CAAA;wBACH,CAAC,CAAA,CAAC,CAAA;wBAEF,IAAI,CAAC,oCAAoC,EAAE,GAAS,EAAE;4BACpD,MAAM,oBAAoB,mCACrB,eAAe,KAClB,QAAQ,EAAE,SAAS,EACnB,YAAY,EAAE,YAAY,EAC1B,oBAAoB,EAAE,YAAY,GACnC,CAAA;4BACD,MAAM,MAAM,CACV,SAAS,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAChD,CAAC,QAAQ,CAAC,qBAAqB,CAC9B,8NAA8N,CAC/N,CAAA;wBACH,CAAC,CAAA,CAAC,CAAA;wBAEF,wFAAwF;wBACxF,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAS,EAAE;4BACvC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,eAAe,CAAC,CAAA;4BACjE,MAAM,CAAC,EAAE,eAAe,CAAC,GAAG,IAAA,gCAAkB,EAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;4BAC5D,MAAM,CAAC,IAAA,gCAAsB,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAClD,IAAA,gCAAsB,EAAC,wBAAgB,CAAC,CACzC,CAAA;wBACH,CAAC,CAAA,CAAC,CAAA;wBAEF,2GAA2G;wBAC3G,IAAI,CAAC,IAAI,CAAC,6CAA6C,EAAE,GAAS,EAAE;4BAClE,qFAAqF;4BACrF,MAAM,yBAAyB,GAAG;gCAChC,IAAI,EAAE,wBAAgB;gCACtB,EAAE,EAAE,wBAAgB;gCACpB,OAAO,EAAE,gBAAQ;gCACjB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;gCACrC,KAAK,EAAE,EAAE;gCACT,GAAG,EAAE,IAAI;gCACT,QAAQ,EAAE,IAAI;gCACd,WAAW,EAAE,IAAa;gCAC1B,IAAI,EAAE,UAAU;6BACjB,CAAA;4BAED,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAA;4BAC3E,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;4BACpD,MAAM,CAAC,EAAE,eAAe,CAAC,GAAG,IAAA,gCAAkB,EAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;4BAC5D,MAAM,CAAC,IAAA,gCAAsB,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAClD,IAAA,gCAAsB,EAAC,wBAAgB,CAAC,CACzC,CAAA;wBACH,CAAC,CAAA,CAAC,CAAA;oBACJ,CAAC,CAAC,CAAA;oBAEF,UAAU;oBACV,QAAQ,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;wBACrD,IAAI,CAAC,UAAU,EAAE,GAAS,EAAE;4BAC1B,MAAM,MAAM,GAAW,wBAAgB,CAAA;4BACvC,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,wBAAgB,EAAE,MAAM,CAAC,CAAA;4BACnF,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAA;4BACzC,MAAM,KAAK,GAAG,IAAA,gCAAe,EAAC,MAAM,EAAE,aAAa,EAAE,wBAAgB,CAAC,CAAA;4BACtE,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAA;wBAC5B,CAAC,CAAA,CAAC,CAAA;oBACJ,CAAC,CAAC,CAAA;oBAEF,QAAQ,CAAC,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;wBAC/C,IAAI,CAAC,UAAU,EAAE,GAAS,EAAE;4BAC1B,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,wBAAgB,EAAE,kBAAU,CAAC,CAAA;4BACjF,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAA;4BACzC,MAAM,KAAK,GAAG,IAAA,yCAA2B,EAAC,kBAAU,EAAE,aAAa,EAAE,wBAAgB,CAAC,CAAA;4BACtF,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAA;wBAC5B,CAAC,CAAA,CAAC,CAAA;oBACJ,CAAC,CAAC,CAAA;gBACJ,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.setup.d.ts b/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.setup.d.ts deleted file mode 100644 index ce70fd2e4..000000000 --- a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.setup.d.ts +++ /dev/null @@ -1 +0,0 @@ -export default function setup(): Promise; diff --git a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.setup.js b/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.setup.js deleted file mode 100644 index 153676435..000000000 --- a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.setup.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const ganache_setup_1 = require("@celo/dev-utils/lib/ganache-setup"); -const network_1 = require("@celo/dev-utils/lib/network"); -function setup() { - return __awaiter(this, void 0, void 0, function* () { - console.log('\nstarting ganache...'); - yield (0, ganache_setup_1.emptySetup)({}); - yield (0, network_1.waitForPortOpen)('localhost', 8545, 60); - console.log('...ganache started'); - }); -} -exports.default = setup; -//# sourceMappingURL=ganache.setup.js.map \ No newline at end of file diff --git a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.setup.js.map b/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.setup.js.map deleted file mode 100644 index df79dd240..000000000 --- a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.setup.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ganache.setup.js","sourceRoot":"","sources":["../../src/test-utils/ganache.setup.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,qEAA8D;AAC9D,yDAA6D;AAE7D,SAA8B,KAAK;;QACjC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;QACpC,MAAM,IAAA,0BAAU,EAAC,EAAE,CAAC,CAAA;QACpB,MAAM,IAAA,yBAAe,EAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;QAC5C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IACnC,CAAC;CAAA;AALD,wBAKC"} \ No newline at end of file diff --git a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.teardown.d.ts b/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.teardown.d.ts deleted file mode 100644 index 1259f7786..000000000 --- a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.teardown.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import teardown from '@celo/dev-utils/lib/ganache-teardown'; -export default teardown; diff --git a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.teardown.js b/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.teardown.js deleted file mode 100644 index 164ca9ac0..000000000 --- a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.teardown.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const ganache_teardown_1 = __importDefault(require("@celo/dev-utils/lib/ganache-teardown")); -exports.default = ganache_teardown_1.default; -//# sourceMappingURL=ganache.teardown.js.map \ No newline at end of file diff --git a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.teardown.js.map b/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.teardown.js.map deleted file mode 100644 index 3894c24c4..000000000 --- a/packages/sdk/wallets/wallet-rpc/lib/test-utils/ganache.teardown.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ganache.teardown.js","sourceRoot":"","sources":["../../src/test-utils/ganache.teardown.ts"],"names":[],"mappings":";;;;;AAAA,4FAA2D;AAC3D,kBAAe,0BAAQ,CAAA"} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 35b034e68..3906515d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1806,7 +1806,6 @@ __metadata: semver: "npm:^7.7.2" ts-jest: "npm:^29.1.5" viem: "npm:^2.33.2" - web3: "npm:1.10.4" bin: celocli: ./bin/run.js dev: .bin/dev.js @@ -1833,13 +1832,7 @@ __metadata: bignumber.js: "npm:^9.0.0" debug: "npm:^4.1.1" utf8: "npm:3.0.0" - web3: "npm:1.10.4" - web3-core: "npm:1.10.4" - web3-eth: "npm:1.10.4" - web3-eth-abi: "npm:1.10.4" - web3-eth-contract: "npm:1.10.4" - peerDependencies: - web3: 1.10.4 + viem: "npm:^2.33.2" languageName: unknown linkType: soft @@ -1868,8 +1861,6 @@ __metadata: fp-ts: "npm:2.16.9" jest: "npm:^29.7.0" semver: "npm:^7.7.2" - web3: "npm:1.10.4" - web3-core-helpers: "npm:1.10.4" languageName: unknown linkType: soft @@ -1926,9 +1917,6 @@ __metadata: targz: "npm:^1.0.1" tmp: "npm:^0.2.0" viem: "npm:^2.33.2" - web3: "npm:1.10.4" - web3-core-helpers: "npm:1.10.4" - web3-utils: "npm:1.10.4" peerDependencies: jest: ^29.7.0 vitest: ^3.1.3 @@ -1962,7 +1950,6 @@ __metadata: cross-fetch: "npm:3.1.5" debug: "npm:^4.1.1" fetch-mock: "npm:^10.0.7" - web3: "npm:1.10.4" languageName: unknown linkType: soft @@ -2089,7 +2076,6 @@ __metadata: dotenv: "npm:^8.2.0" fetch-mock: "npm:^10.0.7" qrcode: "npm:1.4.4" - web3-eth-abi: "npm:1.10.4" languageName: unknown linkType: soft @@ -2115,8 +2101,7 @@ __metadata: bignumber.js: "npm:^9.0.0" fp-ts: "npm:2.16.9" io-ts: "npm:2.0.1" - web3-eth-abi: "npm:1.10.4" - web3-utils: "npm:1.10.4" + viem: "npm:^2.33.2" languageName: unknown linkType: soft @@ -2162,7 +2147,6 @@ __metadata: bignumber.js: "npm:^9.0.0" debug: "npm:^4.1.1" viem: "npm:~2.33.2" - web3: "npm:1.10.4" languageName: unknown linkType: soft @@ -2186,7 +2170,6 @@ __metadata: bignumber.js: "npm:^9.0.0" debug: "npm:^4.1.1" dotenv: "npm:^8.2.0" - web3: "npm:1.10.4" languageName: unknown linkType: soft @@ -2213,7 +2196,6 @@ __metadata: bignumber.js: "npm:^9.0.0" debug: "npm:^4.1.1" dotenv: "npm:^8.2.0" - web3: "npm:1.10.4" languageName: unknown linkType: soft @@ -2237,7 +2219,6 @@ __metadata: bignumber.js: "npm:^9.0.0" debug: "npm:^4.1.1" dotenv: "npm:^8.2.0" - web3: "npm:1.10.4" languageName: unknown linkType: soft @@ -2282,7 +2263,6 @@ __metadata: "@types/node": "npm:18.7.16" debug: "npm:^4.1.1" semver: "npm:^7.7.2" - web3: "npm:1.10.4" languageName: unknown linkType: soft @@ -2299,7 +2279,6 @@ __metadata: "@types/debug": "npm:^4.1.12" debug: "npm:^4.3.5" viem: "npm:~2.33.2" - web3: "npm:1.10.4" languageName: unknown linkType: soft @@ -2313,7 +2292,6 @@ __metadata: "@celo/wallet-base": "npm:^8.0.3" "@ethereumjs/util": "npm:8.0.5" "@types/debug": "npm:^4.1.5" - web3: "npm:1.10.4" languageName: unknown linkType: soft @@ -2783,16 +2761,6 @@ __metadata: languageName: node linkType: hard -"@ethereumjs/common@npm:2.6.5, @ethereumjs/common@npm:^2.6.4": - version: 2.6.5 - resolution: "@ethereumjs/common@npm:2.6.5" - dependencies: - crc-32: "npm:^1.2.0" - ethereumjs-util: "npm:^7.1.5" - checksum: e931e16cafc908b086492ca5fcbb1820fff3edfb83cfd4ae48002517b3be0d1f7622c750874b3b347c122d06372e133ddae44ac129b5ba141f68808a79430135 - languageName: node - linkType: hard - "@ethereumjs/rlp@npm:^4.0.1": version: 4.0.1 resolution: "@ethereumjs/rlp@npm:4.0.1" @@ -2811,16 +2779,6 @@ __metadata: languageName: node linkType: hard -"@ethereumjs/tx@npm:3.5.2": - version: 3.5.2 - resolution: "@ethereumjs/tx@npm:3.5.2" - dependencies: - "@ethereumjs/common": "npm:^2.6.4" - ethereumjs-util: "npm:^7.1.5" - checksum: 891e12738206229ac428685536844f7765e8547ae794462b1e406399445bf1f6f918af6ebc33ee5fa4a1340f14f48871a579f11c0e1d7c142ba0dd525bae5df5 - languageName: node - linkType: hard - "@ethereumjs/util@npm:8.0.5": version: 8.0.5 resolution: "@ethereumjs/util@npm:8.0.5" @@ -2832,18 +2790,7 @@ __metadata: languageName: node linkType: hard -"@ethereumjs/util@npm:^8.1.0": - version: 8.1.0 - resolution: "@ethereumjs/util@npm:8.1.0" - dependencies: - "@ethereumjs/rlp": "npm:^4.0.1" - ethereum-cryptography: "npm:^2.0.0" - micro-ftch: "npm:^0.3.1" - checksum: cc35338932e49b15e54ca6e548b32a1f48eed7d7e1d34ee743e4d3600dd616668bd50f70139e86c5c35f55aac35fba3b6cc4e6f679cf650aeba66bf93016200c - languageName: node - linkType: hard - -"@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.5.0, @ethersproject/abi@npm:^5.6.3, @ethersproject/abi@npm:^5.7.0": +"@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.5.0, @ethersproject/abi@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/abi@npm:5.7.0" dependencies: @@ -3168,7 +3115,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/transactions@npm:5.7.0, @ethersproject/transactions@npm:^5.6.2, @ethersproject/transactions@npm:^5.7.0": +"@ethersproject/transactions@npm:5.7.0, @ethersproject/transactions@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/transactions@npm:5.7.0" dependencies: @@ -4326,15 +4273,6 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:1.1.0, @noble/curves@npm:~1.1.0": - version: 1.1.0 - resolution: "@noble/curves@npm:1.1.0" - dependencies: - "@noble/hashes": "npm:1.3.1" - checksum: 7028e3f19a4a2a601f9159e5423f51ae86ab231bed79a6e40649b063e1ed7f55f5da0475f1377bd2c5a8e5fc485af9ce0549ad89da6b983d6af48e5d0a2041ca - languageName: node - linkType: hard - "@noble/curves@npm:1.3.0, @noble/curves@npm:^1.3.0, @noble/curves@npm:~1.3.0": version: 1.3.0 resolution: "@noble/curves@npm:1.3.0" @@ -4387,13 +4325,6 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.3.1": - version: 1.3.1 - resolution: "@noble/hashes@npm:1.3.1" - checksum: 39474bab7e7813dbbfd8750476f48046d3004984e161fcd4333e40ca823f07b069010b35a20246e5b4ac20858e29913172a4d69720fd1e93620f7bedb70f9b72 - languageName: node - linkType: hard - "@noble/hashes@npm:1.3.3, @noble/hashes@npm:^1.3.3, @noble/hashes@npm:~1.3.2": version: 1.3.3 resolution: "@noble/hashes@npm:1.3.3" @@ -4422,13 +4353,6 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.1": - version: 1.3.2 - resolution: "@noble/hashes@npm:1.3.2" - checksum: 685f59d2d44d88e738114b71011d343a9f7dce9dfb0a121f1489132f9247baa60bc985e5ec6f3213d114fbd1e1168e7294644e46cbd0ce2eba37994f28eeb51b - languageName: node - linkType: hard - "@noble/secp256k1@npm:1.7.1, @noble/secp256k1@npm:~1.7.0": version: 1.7.1 resolution: "@noble/secp256k1@npm:1.7.1" @@ -5250,17 +5174,6 @@ __metadata: languageName: node linkType: hard -"@scure/bip32@npm:1.3.1": - version: 1.3.1 - resolution: "@scure/bip32@npm:1.3.1" - dependencies: - "@noble/curves": "npm:~1.1.0" - "@noble/hashes": "npm:~1.3.1" - "@scure/base": "npm:~1.1.0" - checksum: 0595955374dfa54a60adfa33d4793fd8b27230e962aaceb5bb5fcf8ccbb935184aa2c45154ec9bdfb26a1877b2ae0a8e4808c9a5464d4ffd971120740b816def - languageName: node - linkType: hard - "@scure/bip32@npm:1.5.0": version: 1.5.0 resolution: "@scure/bip32@npm:1.5.0" @@ -5304,16 +5217,6 @@ __metadata: languageName: node linkType: hard -"@scure/bip39@npm:1.2.1": - version: 1.2.1 - resolution: "@scure/bip39@npm:1.2.1" - dependencies: - "@noble/hashes": "npm:~1.3.0" - "@scure/base": "npm:~1.1.0" - checksum: 2ea368bbed34d6b1701c20683bf465e147f231a9e37e639b8c82f585d6f978bb0f3855fca7ceff04954ae248b3e313f5d322d0210614fb7acb402739415aaf31 - languageName: node - linkType: hard - "@scure/bip39@npm:1.4.0": version: 1.4.0 resolution: "@scure/bip39@npm:1.4.0" @@ -5461,13 +5364,6 @@ __metadata: languageName: node linkType: hard -"@sindresorhus/is@npm:^4.0.0, @sindresorhus/is@npm:^4.6.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: e7f36ed72abfcd5e0355f7423a72918b9748bb1ef370a59f3e5ad8d40b728b85d63b272f65f63eec1faf417cda89dcb0aeebe94015647b6054659c1442fe5ce0 - languageName: node - linkType: hard - "@sindresorhus/is@npm:^5.2.0": version: 5.6.0 resolution: "@sindresorhus/is@npm:5.6.0" @@ -6185,15 +6081,6 @@ __metadata: languageName: node linkType: hard -"@szmarczak/http-timer@npm:^4.0.5": - version: 4.0.6 - resolution: "@szmarczak/http-timer@npm:4.0.6" - dependencies: - defer-to-connect: "npm:^2.0.0" - checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 - languageName: node - linkType: hard - "@szmarczak/http-timer@npm:^5.0.1": version: 5.0.1 resolution: "@szmarczak/http-timer@npm:5.0.1" @@ -6338,18 +6225,6 @@ __metadata: languageName: node linkType: hard -"@types/cacheable-request@npm:^6.0.1, @types/cacheable-request@npm:^6.0.2": - version: 6.0.3 - resolution: "@types/cacheable-request@npm:6.0.3" - dependencies: - "@types/http-cache-semantics": "npm:*" - "@types/keyv": "npm:^3.1.4" - "@types/node": "npm:*" - "@types/responselike": "npm:^1.0.0" - checksum: 159f9fdb2a1b7175eef453ae2ced5ea04c0d2b9610cc9ccd9f9abb066d36dacb1f37acd879ace10ad7cbb649490723feb396fb7307004c9670be29636304b988 - languageName: node - linkType: hard - "@types/cli-progress@npm:^3.11.5": version: 3.11.5 resolution: "@types/cli-progress@npm:3.11.5" @@ -6449,13 +6324,6 @@ __metadata: languageName: node linkType: hard -"@types/http-cache-semantics@npm:*": - version: 4.0.1 - resolution: "@types/http-cache-semantics@npm:4.0.1" - checksum: d059bf8a15d5163cc60da51ba00d17620507f968d0b792cd55f62043016344a5f0e1aa94fa411089d41114035fcd0ea656f968bda7eabb6663a97787e3445a1c - languageName: node - linkType: hard - "@types/http-cache-semantics@npm:^4.0.2": version: 4.0.4 resolution: "@types/http-cache-semantics@npm:4.0.4" @@ -6538,15 +6406,6 @@ __metadata: languageName: node linkType: hard -"@types/keyv@npm:^3.1.4": - version: 3.1.4 - resolution: "@types/keyv@npm:3.1.4" - dependencies: - "@types/node": "npm:*" - checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d - languageName: node - linkType: hard - "@types/ledgerhq__hw-transport-node-hid@npm:^4.22.5": version: 4.22.5 resolution: "@types/ledgerhq__hw-transport-node-hid@npm:4.22.5" @@ -6643,7 +6502,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^12.12.6, @types/node@npm:^12.7.1": +"@types/node@npm:^12.7.1": version: 12.20.55 resolution: "@types/node@npm:12.20.55" checksum: 1f916a06fff02faadb09a16ed6e31820ce170798b202ef0b14fc244bfbd721938c54a3a99836e185e4414ca461fe96c5bb5c67c3d248f153555b7e6347f061dd @@ -6719,15 +6578,6 @@ __metadata: languageName: node linkType: hard -"@types/responselike@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/responselike@npm:1.0.0" - dependencies: - "@types/node": "npm:*" - checksum: e4972389457e4edce3cbba5e8474fb33684d73879433a9eec989d0afb7e550fd6fa3ffb8fe68dbb429288d10707796a193bc0007c4e8429fd267bdc4d8404632 - languageName: node - linkType: hard - "@types/rimraf@npm:3.0.2": version: 3.0.2 resolution: "@types/rimraf@npm:3.0.2" @@ -7044,13 +6894,6 @@ __metadata: languageName: node linkType: hard -"abortcontroller-polyfill@npm:^1.7.5": - version: 1.7.5 - resolution: "abortcontroller-polyfill@npm:1.7.5" - checksum: aac398f7fc076235fe731adaffd2c319fe6c1527af8ca561890242d5396351350e0705726478778dc90326a69a4c044890c156fe867cba7f3ffeb670f8665a51 - languageName: node - linkType: hard - "abstract-level@npm:1.0.3": version: 1.0.3 resolution: "abstract-level@npm:1.0.3" @@ -7080,16 +6923,6 @@ __metadata: languageName: node linkType: hard -"accepts@npm:~1.3.8": - version: 1.3.8 - resolution: "accepts@npm:1.3.8" - dependencies: - mime-types: "npm:~2.1.34" - negotiator: "npm:0.6.3" - checksum: 67eaaa90e2917c58418e7a9b89392002d2b1ccd69bcca4799135d0c632f3b082f23f4ae4ddeedbced5aa59bcc7bdf4699c69ebed4593696c922462b7bc5744d6 - languageName: node - linkType: hard - "acorn-walk@npm:^8.1.1": version: 8.2.0 resolution: "acorn-walk@npm:8.2.0" @@ -7155,18 +6988,6 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.3": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 48d6ad21138d12eb4d16d878d630079a2bda25a04e745c07846a4ad768319533031e28872a9b3c5790fa1ec41aabdf2abed30a56e5a03ebc2cf92184b8ee306c - languageName: node - linkType: hard - "ansi-colors@npm:^4.1.1, ansi-colors@npm:^4.1.3": version: 4.1.3 resolution: "ansi-colors@npm:4.1.3" @@ -7320,13 +7141,6 @@ __metadata: languageName: node linkType: hard -"array-flatten@npm:1.1.1": - version: 1.1.1 - resolution: "array-flatten@npm:1.1.1" - checksum: e13c9d247241be82f8b4ec71d035ed7204baa82fae820d4db6948d30d3c4a9f2b3905eb2eec2b937d4aa3565200bd3a1c500480114cff649fa748747d2a50feb - languageName: node - linkType: hard - "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" @@ -7341,15 +7155,6 @@ __metadata: languageName: node linkType: hard -"asn1@npm:~0.2.3": - version: 0.2.6 - resolution: "asn1@npm:0.2.6" - dependencies: - safer-buffer: "npm:~2.1.0" - checksum: cf629291fee6c1a6f530549939433ebf32200d7849f38b810ff26ee74235e845c0c12b2ed0f1607ac17383d19b219b69cefa009b920dab57924c5c544e495078 - languageName: node - linkType: hard - "asn1js@npm:^2.4.0": version: 2.4.0 resolution: "asn1js@npm:2.4.0" @@ -7359,13 +7164,6 @@ __metadata: languageName: node linkType: hard -"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": - version: 1.0.0 - resolution: "assert-plus@npm:1.0.0" - checksum: f4f991ae2df849cc678b1afba52d512a7cbf0d09613ba111e72255409ff9158550c775162a47b12d015d1b82b3c273e8e25df0e4783d3ddb008a293486d00a07 - languageName: node - linkType: hard - "assertion-error@npm:^2.0.1": version: 2.0.1 resolution: "assertion-error@npm:2.0.1" @@ -7389,13 +7187,6 @@ __metadata: languageName: node linkType: hard -"async-limiter@npm:~1.0.0": - version: 1.0.1 - resolution: "async-limiter@npm:1.0.1" - checksum: 2b849695b465d93ad44c116220dee29a5aeb63adac16c1088983c339b0de57d76e82533e8e364a93a9f997f28bbfc6a92948cefc120652bd07f3b59f8d75cf2b - languageName: node - linkType: hard - "async-retry@npm:^1.3.3": version: 1.3.3 resolution: "async-retry@npm:1.3.3" @@ -7460,20 +7251,6 @@ __metadata: languageName: node linkType: hard -"aws-sign2@npm:~0.7.0": - version: 0.7.0 - resolution: "aws-sign2@npm:0.7.0" - checksum: 2ac497d739f71be3264cf096a33ab256a1fea7fe80b87dc51ec29374505bd5a661279ef1c22989d68528ea61ed634021ca63b31cf1d3c2a3682ffc106f7d0e96 - languageName: node - linkType: hard - -"aws4@npm:^1.8.0": - version: 1.12.0 - resolution: "aws4@npm:1.12.0" - checksum: 2b8455fe1eee87f0e7d5f32e81e7fec74dce060c72d03f528c8c631fa74209cef53aab6fede182ea17d0c9520cb1e5e3023c5fedb4f1139ae9f067fc720869a5 - languageName: node - linkType: hard - "axios@npm:1.7.7": version: 1.7.7 resolution: "axios@npm:1.7.7" @@ -7568,7 +7345,7 @@ __metadata: languageName: node linkType: hard -"base-x@npm:^3.0.2, base-x@npm:^3.0.8": +"base-x@npm:^3.0.2": version: 3.0.9 resolution: "base-x@npm:3.0.9" dependencies: @@ -7584,15 +7361,6 @@ __metadata: languageName: node linkType: hard -"bcrypt-pbkdf@npm:^1.0.0": - version: 1.0.2 - resolution: "bcrypt-pbkdf@npm:1.0.2" - dependencies: - tweetnacl: "npm:^0.14.3" - checksum: 13a4cde058250dbf1fa77a4f1b9a07d32ae2e3b9e28e88a0c7a1827835bc3482f3e478c4a0cfd4da6ff0c46dae07da1061123a995372b32cc563d9975f975404 - languageName: node - linkType: hard - "bech32@npm:1.1.4": version: 1.1.4 resolution: "bech32@npm:1.1.4" @@ -7680,21 +7448,7 @@ __metadata: languageName: node linkType: hard -"bluebird@npm:^3.5.0": - version: 3.7.2 - resolution: "bluebird@npm:3.7.2" - checksum: 007c7bad22c5d799c8dd49c85b47d012a1fe3045be57447721e6afbd1d5be43237af1db62e26cb9b0d9ba812d2e4ca3bac82f6d7e016b6b88de06ee25ceb96e7 - languageName: node - linkType: hard - -"bn.js@npm:4.11.6": - version: 4.11.6 - resolution: "bn.js@npm:4.11.6" - checksum: 22741b015c9fff60fce32fc9988331b298eb9b6db5bfb801babb23b846eaaf894e440e0d067b2b3ae4e46aab754e90972f8f333b31bf94a686bbcb054bfa7b14 - languageName: node - linkType: hard - -"bn.js@npm:^4.11.6, bn.js@npm:^4.11.9": +"bn.js@npm:^4.11.9": version: 4.12.0 resolution: "bn.js@npm:4.12.0" checksum: 10f8db196d3da5adfc3207d35d0a42aa29033eb33685f20ba2c36cadfe2de63dad05df0a20ab5aae01b418d1c4b3d4d205273085262fa020d17e93ff32b67527 @@ -7708,46 +7462,6 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.1": - version: 1.20.1 - resolution: "body-parser@npm:1.20.1" - dependencies: - bytes: "npm:3.1.2" - content-type: "npm:~1.0.4" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.11.0" - raw-body: "npm:2.5.1" - type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 5f8d128022a2fb8b6e7990d30878a0182f300b70e46b3f9d358a9433ad6275f0de46add6d63206da3637c01c3b38b6111a7480f7e7ac2e9f7b989f6133fe5510 - languageName: node - linkType: hard - -"body-parser@npm:^1.16.0": - version: 1.20.2 - resolution: "body-parser@npm:1.20.2" - dependencies: - bytes: "npm:3.1.2" - content-type: "npm:~1.0.5" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.11.0" - raw-body: "npm:2.5.2" - type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 3cf171b82190cf91495c262b073e425fc0d9e25cc2bf4540d43f7e7bbca27d6a9eae65ca367b6ef3993eea261159d9d2ab37ce444e8979323952e12eb3df319a - languageName: node - linkType: hard - "bowser@npm:^2.11.0": version: 2.11.0 resolution: "bowser@npm:2.11.0" @@ -7889,6 +7603,13 @@ __metadata: languageName: node linkType: hard +"buffer-equal-constant-time@patch:buffer-equal-constant-time@npm%3A1.0.1#~/.yarn/patches/buffer-equal-constant-time-npm-1.0.1-41826f3419.patch": + version: 1.0.1 + resolution: "buffer-equal-constant-time@patch:buffer-equal-constant-time@npm%3A1.0.1#~/.yarn/patches/buffer-equal-constant-time-npm-1.0.1-41826f3419.patch::version=1.0.1&hash=b43211" + checksum: b92a499e7e2773feae46a9245b8b151d128b0e4dfe9e62c7724de1f7ba7ae5ec6c7c96328f26556111b021ca61a9a273377ebe4239e015e6719c9e8c9cf0f15c + languageName: node + linkType: hard + "buffer-fill@npm:^1.0.0": version: 1.0.0 resolution: "buffer-fill@npm:1.0.0" @@ -7903,13 +7624,6 @@ __metadata: languageName: node linkType: hard -"buffer-to-arraybuffer@npm:^0.0.5": - version: 0.0.5 - resolution: "buffer-to-arraybuffer@npm:0.0.5" - checksum: df16190b3bf0ecdf70e761514ecc8dbb9b8310e7c2882c800dc6d2d06859b9c85baa67f4cad53aaf9f0cbdd936f4b1c09f549eed8ae33c1c1258d7b6b1648cde - languageName: node - linkType: hard - "buffer-xor@npm:^1.0.3": version: 1.0.3 resolution: "buffer-xor@npm:1.0.3" @@ -7928,7 +7642,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.0.5, buffer@npm:^5.4.3, buffer@npm:^5.5.0, buffer@npm:^5.6.0": +"buffer@npm:^5.4.3, buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -7958,16 +7672,6 @@ __metadata: languageName: node linkType: hard -"bufferutil@npm:^4.0.1": - version: 4.0.7 - resolution: "bufferutil@npm:4.0.7" - dependencies: - node-gyp: "npm:latest" - node-gyp-build: "npm:^4.3.0" - checksum: 01e2144e88a6cb1cd8e4e0bb1ec622c6e400646fb451a672d20e7d40cdc7d4a82a64dbcda6f5f92b36eeca0d1e5290baf7af707994f7b7c87e911d51a265bf07 - languageName: node - linkType: hard - "builtins@npm:^5.0.0": version: 5.0.1 resolution: "builtins@npm:5.0.1" @@ -7984,13 +7688,6 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: a10abf2ba70c784471d6b4f58778c0beeb2b5d405148e66affa91f23a9f13d07603d0a0354667310ae1d6dc141474ffd44e2a074be0f6e2254edb8fc21445388 - languageName: node - linkType: hard - "cac@npm:^6.7.14": version: 6.7.14 resolution: "cac@npm:6.7.14" @@ -8038,20 +7735,6 @@ __metadata: languageName: node linkType: hard -"cacheable-lookup@npm:^5.0.3": - version: 5.0.4 - resolution: "cacheable-lookup@npm:5.0.4" - checksum: 618a8b3eea314060e74cb3285a6154e8343c244a34235acf91cfe626ee0705c24e3cd11e4b1a7b3900bd749ee203ae65afe13adf610c8ab173e99d4a208faf75 - languageName: node - linkType: hard - -"cacheable-lookup@npm:^6.0.4": - version: 6.1.0 - resolution: "cacheable-lookup@npm:6.1.0" - checksum: 9b37d31fba27ff244254294814dfdad69e3d257cb283932f58823141de5043a46d35339fa81ec40fdbb5d76d1578324258995f41a4fd37ed05d4e9b54823802e - languageName: node - linkType: hard - "cacheable-lookup@npm:^7.0.0": version: 7.0.0 resolution: "cacheable-lookup@npm:7.0.0" @@ -8074,22 +7757,7 @@ __metadata: languageName: node linkType: hard -"cacheable-request@npm:^7.0.2": - version: 7.0.2 - resolution: "cacheable-request@npm:7.0.2" - dependencies: - clone-response: "npm:^1.0.2" - get-stream: "npm:^5.1.0" - http-cache-semantics: "npm:^4.0.0" - keyv: "npm:^4.0.0" - lowercase-keys: "npm:^2.0.0" - normalize-url: "npm:^6.0.1" - responselike: "npm:^2.0.0" - checksum: 51404dd0b669d34f68f191d88d84e0d223e274808f7ab668192bc65e2a9133b4f5948a509d8272766dd19e46decb25b53ca1e23d3ec3846937250f4eb1f9c7d9 - languageName: node - linkType: hard - -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": +"call-bind@npm:^1.0.2": version: 1.0.5 resolution: "call-bind@npm:1.0.5" dependencies: @@ -8168,13 +7836,6 @@ __metadata: languageName: node linkType: hard -"caseless@npm:~0.12.0": - version: 0.12.0 - resolution: "caseless@npm:0.12.0" - checksum: ea1efdf430975fdbac3505cdd21007f7ac5aa29b6d4d1c091f965853cd1bf87e4b08ea07b31a6d688b038872b7cdf0589d9262d59c699d199585daad052aeb20 - languageName: node - linkType: hard - "catering@npm:^2.0.0, catering@npm:^2.1.0": version: 2.1.1 resolution: "catering@npm:2.1.1" @@ -8302,7 +7963,7 @@ __metadata: languageName: node linkType: hard -"chownr@npm:^1.0.1, chownr@npm:^1.1.1, chownr@npm:^1.1.4": +"chownr@npm:^1.0.1, chownr@npm:^1.1.1": version: 1.1.4 resolution: "chownr@npm:1.1.4" checksum: 115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d @@ -8367,19 +8028,6 @@ __metadata: languageName: node linkType: hard -"cids@npm:^0.7.1": - version: 0.7.5 - resolution: "cids@npm:0.7.5" - dependencies: - buffer: "npm:^5.5.0" - class-is: "npm:^1.1.0" - multibase: "npm:~0.6.0" - multicodec: "npm:^1.0.0" - multihashes: "npm:~0.4.15" - checksum: b916b0787e238dd9f84fb5e155333cadf07fd7ad34ea8dbd47f98bb618eecc9c70760767c0966d0eae73050c4fa6080fdc387e515565b009d2126253c7775fac - languageName: node - linkType: hard - "cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": version: 1.0.4 resolution: "cipher-base@npm:1.0.4" @@ -8397,13 +8045,6 @@ __metadata: languageName: node linkType: hard -"class-is@npm:^1.1.0": - version: 1.1.0 - resolution: "class-is@npm:1.1.0" - checksum: 8147a3e4ce86eb103d78621d665b87e8e33fcb3f54932fdca894b8222820903b43b2f6b4335d8822104702a5dc904c8f187127fdea4e7d48d905488b35c9e6a7 - languageName: node - linkType: hard - "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -8528,15 +8169,6 @@ __metadata: languageName: node linkType: hard -"clone-response@npm:^1.0.2": - version: 1.0.3 - resolution: "clone-response@npm:1.0.3" - dependencies: - mimic-response: "npm:^1.0.0" - checksum: 4e671cac39b11c60aa8ba0a450657194a5d6504df51bca3fac5b3bd0145c4f8e8464898f87c8406b83232e3bc5cca555f51c1f9c8ac023969ebfbf7f6bdabb2e - languageName: node - linkType: hard - "cmd-shim@npm:^7.0.0": version: 7.0.0 resolution: "cmd-shim@npm:7.0.0" @@ -8633,7 +8265,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": +"combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -8691,27 +8323,7 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: "npm:5.2.1" - checksum: b7f4ce176e324f19324be69b05bf6f6e411160ac94bc523b782248129eb1ef3be006f6cff431aaea5e337fe5d176ce8830b8c2a1b721626ead8933f0cbe78720 - languageName: node - linkType: hard - -"content-hash@npm:^2.5.2": - version: 2.5.2 - resolution: "content-hash@npm:2.5.2" - dependencies: - cids: "npm:^0.7.1" - multicodec: "npm:^0.5.5" - multihashes: "npm:^0.4.15" - checksum: 7c5d05052aecead40a1bbdd251468a6cc9bf4c48b361b4f138d60e6d876dc3028da6142031578ddc42e44e0024f91cc01b7a539bdb0bf7187e36bec15052e02d - languageName: node - linkType: hard - -"content-type@npm:^1.0.4, content-type@npm:~1.0.4, content-type@npm:~1.0.5": +"content-type@npm:^1.0.4": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 585847d98dc7fb8035c02ae2cb76c7a9bd7b25f84c447e5ed55c45c2175e83617c8813871b4ee22f368126af6b2b167df655829007b21aa10302873ea9c62662 @@ -8739,27 +8351,6 @@ __metadata: languageName: node linkType: hard -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a - languageName: node - linkType: hard - -"cookie@npm:0.5.0": - version: 0.5.0 - resolution: "cookie@npm:0.5.0" - checksum: aae7911ddc5f444a9025fbd979ad1b5d60191011339bce48e555cb83343d0f98b865ff5c4d71fecdfb8555a5cafdc65632f6fce172f32aaf6936830a883a0380 - languageName: node - linkType: hard - -"core-util-is@npm:1.0.2": - version: 1.0.2 - resolution: "core-util-is@npm:1.0.2" - checksum: d0f7587346b44a1fe6c269267e037dd34b4787191e473c3e685f507229d88561c40eb18872fabfff02977301815d474300b7bfbd15396c13c5377393f7e87ec3 - languageName: node - linkType: hard - "core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -8767,16 +8358,6 @@ __metadata: languageName: node linkType: hard -"cors@npm:^2.8.1": - version: 2.8.5 - resolution: "cors@npm:2.8.5" - dependencies: - object-assign: "npm:^4" - vary: "npm:^1" - checksum: 66e88e08edee7cbce9d92b4d28a2028c88772a4c73e02f143ed8ca76789f9b59444eed6b1c167139e76fa662998c151322720093ba229f9941365ada5a6fc2c6 - languageName: node - linkType: hard - "country-data@npm:^0.0.31": version: 0.0.31 resolution: "country-data@npm:0.0.31" @@ -8787,15 +8368,6 @@ __metadata: languageName: node linkType: hard -"crc-32@npm:^1.2.0": - version: 1.2.2 - resolution: "crc-32@npm:1.2.2" - bin: - crc32: bin/crc32.njs - checksum: 824f696a5baaf617809aa9cd033313c8f94f12d15ebffa69f10202480396be44aef9831d900ab291638a8022ed91c360696dd5b1ba691eb3f34e60be8835b7c3 - languageName: node - linkType: hard - "create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": version: 1.2.0 resolution: "create-hash@npm:1.2.0" @@ -8856,15 +8428,6 @@ __metadata: languageName: node linkType: hard -"cross-fetch@npm:^4.0.0": - version: 4.0.0 - resolution: "cross-fetch@npm:4.0.0" - dependencies: - node-fetch: "npm:^2.6.12" - checksum: e231a71926644ef122d334a3a4e73d9ba3ba4b480a8a277fb9badc434c1ba905b3d60c8034e18b348361a09afbec40ba9371036801ba2b675a7b84588f9f55d8 - languageName: node - linkType: hard - "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -8917,25 +8480,6 @@ __metadata: languageName: node linkType: hard -"d@npm:1, d@npm:^1.0.1": - version: 1.0.1 - resolution: "d@npm:1.0.1" - dependencies: - es5-ext: "npm:^0.10.50" - type: "npm:^1.0.1" - checksum: 1296e3f92e646895681c1cb564abd0eb23c29db7d62c5120a279e84e98915499a477808e9580760f09e3744c0ed7ac8f7cff98d096ba9770754f6ef0f1c97983 - languageName: node - linkType: hard - -"dashdash@npm:^1.12.0": - version: 1.14.1 - resolution: "dashdash@npm:1.14.1" - dependencies: - assert-plus: "npm:^1.0.0" - checksum: 137b287fa021201ce100cef772c8eeeaaafdd2aa7282864022acf3b873021e54cb809e9c060fa164840bf54ff72d00d6e2d8da1ee5a86d7200eeefa1123a8f7f - languageName: node - linkType: hard - "data-uri-to-buffer@npm:^4.0.0": version: 4.0.1 resolution: "data-uri-to-buffer@npm:4.0.1" @@ -8950,15 +8494,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.2.0": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: "npm:2.0.0" - checksum: e07005f2b40e04f1bd14a3dd20520e9c4f25f60224cb006ce9d6781732c917964e9ec029fc7f1a151083cd929025ad5133814d4dc624a9aaf020effe4914ed14 - languageName: node - linkType: hard - "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" @@ -9014,22 +8549,6 @@ __metadata: languageName: node linkType: hard -"decode-uri-component@npm:^0.2.0": - version: 0.2.2 - resolution: "decode-uri-component@npm:0.2.2" - checksum: 17a0e5fa400bf9ea84432226e252aa7b5e72793e16bf80b907c99b46a799aeacc139ec20ea57121e50c7bd875a1a4365928f884e92abf02e21a5a13790a0f33e - languageName: node - linkType: hard - -"decompress-response@npm:^3.3.0": - version: 3.3.0 - resolution: "decompress-response@npm:3.3.0" - dependencies: - mimic-response: "npm:^1.0.0" - checksum: 952552ac3bd7de2fc18015086b09468645c9638d98a551305e485230ada278c039c91116e946d07894b39ee53c0f0d5b6473f25a224029344354513b412d7380 - languageName: node - linkType: hard - "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -9072,7 +8591,7 @@ __metadata: languageName: node linkType: hard -"defer-to-connect@npm:^2.0.0, defer-to-connect@npm:^2.0.1": +"defer-to-connect@npm:^2.0.1": version: 2.0.1 resolution: "defer-to-connect@npm:2.0.1" checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b @@ -9104,20 +8623,6 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: c0c8ff36079ce5ada64f46cc9d6fd47ebcf38241105b6e0c98f412e8ad91f084bcf906ff644cc3a4bd876ca27a62accb8b0fff72ea6ed1a414b89d8506f4a5ca - languageName: node - linkType: hard - -"destroy@npm:1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 - languageName: node - linkType: hard - "detect-indent@npm:^6.0.0": version: 6.1.0 resolution: "detect-indent@npm:6.1.0" @@ -9190,13 +8695,6 @@ __metadata: languageName: node linkType: hard -"dom-walk@npm:^0.1.0": - version: 0.1.2 - resolution: "dom-walk@npm:0.1.2" - checksum: 19eb0ce9c6de39d5e231530685248545d9cd2bd97b2cb3486e0bfc0f2a393a9addddfd5557463a932b52fdfcf68ad2a619020cd2c74a5fe46fbecaa8e80872f3 - languageName: node - linkType: hard - "dot-case@npm:^3.0.4": version: 3.0.4 resolution: "dot-case@npm:3.0.4" @@ -9233,16 +8731,6 @@ __metadata: languageName: node linkType: hard -"ecc-jsbn@npm:~0.1.1": - version: 0.1.2 - resolution: "ecc-jsbn@npm:0.1.2" - dependencies: - jsbn: "npm:~0.1.0" - safer-buffer: "npm:^2.1.0" - checksum: d43591f2396196266e186e6d6928038cc11c76c3699a912cb9c13757060f7bbc7f17f47c4cb16168cdeacffc7965aef021142577e646fb3cb88810c15173eb57 - languageName: node - linkType: hard - "ecdsa-sig-formatter@npm:1.0.11, ecdsa-sig-formatter@npm:^1.0.11": version: 1.0.11 resolution: "ecdsa-sig-formatter@npm:1.0.11" @@ -9252,13 +8740,6 @@ __metadata: languageName: node linkType: hard -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f - languageName: node - linkType: hard - "eip55@npm:^2.1.1": version: 2.1.1 resolution: "eip55@npm:2.1.1" @@ -9286,7 +8767,7 @@ __metadata: languageName: node linkType: hard -"elliptic@npm:6.5.4, elliptic@npm:^6.4.0, elliptic@npm:^6.5.4": +"elliptic@npm:6.5.4, elliptic@npm:^6.5.4": version: 6.5.4 resolution: "elliptic@npm:6.5.4" dependencies: @@ -9343,13 +8824,6 @@ __metadata: languageName: node linkType: hard -"encodeurl@npm:~1.0.2": - version: 1.0.2 - resolution: "encodeurl@npm:1.0.2" - checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c - languageName: node - linkType: hard - "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -9422,45 +8896,6 @@ __metadata: languageName: node linkType: hard -"es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.50": - version: 0.10.62 - resolution: "es5-ext@npm:0.10.62" - dependencies: - es6-iterator: "npm:^2.0.3" - es6-symbol: "npm:^3.1.3" - next-tick: "npm:^1.1.0" - checksum: 3f6a3bcdb7ff82aaf65265799729828023c687a2645da04005b8f1dc6676a0c41fd06571b2517f89dcf143e0268d3d9ef0fdfd536ab74580083204c688d6fb45 - languageName: node - linkType: hard - -"es6-iterator@npm:^2.0.3": - version: 2.0.3 - resolution: "es6-iterator@npm:2.0.3" - dependencies: - d: "npm:1" - es5-ext: "npm:^0.10.35" - es6-symbol: "npm:^3.1.1" - checksum: dbadecf3d0e467692815c2b438dfa99e5a97cbbecf4a58720adcb467a04220e0e36282399ba297911fd472c50ae4158fffba7ed0b7d4273fe322b69d03f9e3a5 - languageName: node - linkType: hard - -"es6-promise@npm:^4.2.8": - version: 4.2.8 - resolution: "es6-promise@npm:4.2.8" - checksum: b250c55523c496c43c9216c2646e58ec182b819e036fe5eb8d83fa16f044ecc6b8dcefc88ace2097be3d3c4d02b6aa8eeae1a66deeaf13e7bee905ebabb350a3 - languageName: node - linkType: hard - -"es6-symbol@npm:^3.1.1, es6-symbol@npm:^3.1.3": - version: 3.1.3 - resolution: "es6-symbol@npm:3.1.3" - dependencies: - d: "npm:^1.0.1" - ext: "npm:^1.1.2" - checksum: b404e5ecae1a076058aa2ba2568d87e2cb4490cb1130784b84e7b4c09c570b487d4f58ed685a08db8d350bd4916500dd3d623b26e6b3520841d30d2ebb152f8d - languageName: node - linkType: hard - "esbuild@npm:^0.25.0": version: 0.25.4 resolution: "esbuild@npm:0.25.4" @@ -9554,13 +8989,6 @@ __metadata: languageName: node linkType: hard -"escape-html@npm:~1.0.3": - version: 1.0.3 - resolution: "escape-html@npm:1.0.3" - checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 - languageName: node - linkType: hard - "escape-string-regexp@npm:4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -9601,57 +9029,6 @@ __metadata: languageName: node linkType: hard -"etag@npm:~1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff - languageName: node - linkType: hard - -"eth-ens-namehash@npm:2.0.8": - version: 2.0.8 - resolution: "eth-ens-namehash@npm:2.0.8" - dependencies: - idna-uts46-hx: "npm:^2.3.1" - js-sha3: "npm:^0.5.7" - checksum: 098c04378b0b998191b4bcd2f1a59be976946bbb80cea7bc2a6d1df3a035e061b2fd120b16bf41558c4beb2dd846433742058b091b20195e4b0e1fc64b67979f - languageName: node - linkType: hard - -"eth-lib@npm:0.2.8": - version: 0.2.8 - resolution: "eth-lib@npm:0.2.8" - dependencies: - bn.js: "npm:^4.11.6" - elliptic: "npm:^6.4.0" - xhr-request-promise: "npm:^0.1.2" - checksum: 85a6f1673c7106252864fdf6c86973d6bfdf454b238ee8d07d8f642599fa9f390129b6fbd060742a5be7c197be924951535a0c0ebb3e912cfd9f2130b64f74ce - languageName: node - linkType: hard - -"eth-lib@npm:^0.1.26": - version: 0.1.29 - resolution: "eth-lib@npm:0.1.29" - dependencies: - bn.js: "npm:^4.11.6" - elliptic: "npm:^6.4.0" - nano-json-stream-parser: "npm:^0.1.2" - servify: "npm:^0.1.12" - ws: "npm:^3.0.0" - xhr-request-promise: "npm:^0.1.2" - checksum: ee4fcd8400fad0b637c25bd0a4483a54c986b78ac6c4d7fd2a5df12b41468abfa50a66684e315e16894b870d2fcf5d2273a81f429f89c460b275bf4477365f60 - languageName: node - linkType: hard - -"ethereum-bloom-filters@npm:^1.0.6": - version: 1.0.10 - resolution: "ethereum-bloom-filters@npm:1.0.10" - dependencies: - js-sha3: "npm:^0.8.0" - checksum: dc4191c5d810db864ace106886f340b541bf03f1ad3249459ac630cab9c191f1e45c03e935887cca903cca884326e3ac97acfef0a083c7e1a004108f5991f9ba - languageName: node - linkType: hard - "ethereum-cryptography@npm:^0.1.3": version: 0.1.3 resolution: "ethereum-cryptography@npm:0.1.3" @@ -9687,19 +9064,7 @@ __metadata: languageName: node linkType: hard -"ethereum-cryptography@npm:^2.0.0, ethereum-cryptography@npm:^2.1.2": - version: 2.1.2 - resolution: "ethereum-cryptography@npm:2.1.2" - dependencies: - "@noble/curves": "npm:1.1.0" - "@noble/hashes": "npm:1.3.1" - "@scure/bip32": "npm:1.3.1" - "@scure/bip39": "npm:1.2.1" - checksum: 78983d01ac95047158ec03237ba318152b2c707ccc6a44225da11c72ed6ca575ca0c1630eaf9878fc82fe26272d6624939ef6f020cc89ddddfb941a7393ab909 - languageName: node - linkType: hard - -"ethereumjs-util@npm:^7.1.2, ethereumjs-util@npm:^7.1.5": +"ethereumjs-util@npm:^7.1.2": version: 7.1.5 resolution: "ethereumjs-util@npm:7.1.5" dependencies: @@ -9766,16 +9131,6 @@ __metadata: languageName: node linkType: hard -"ethjs-unit@npm:0.1.6": - version: 0.1.6 - resolution: "ethjs-unit@npm:0.1.6" - dependencies: - bn.js: "npm:4.11.6" - number-to-bn: "npm:1.7.0" - checksum: 35086cb671806992ec36d5dd43ab67e68ad7a9237e42c0e963f9081c88e40147cda86c1a258b0a3180bf2b7bc1960e607c5bcaefdb2196e0f3564acf73276189 - languageName: node - linkType: hard - "event-target-shim@npm:^5.0.0": version: 5.0.1 resolution: "event-target-shim@npm:5.0.1" @@ -9783,13 +9138,6 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:4.0.4": - version: 4.0.4 - resolution: "eventemitter3@npm:4.0.4" - checksum: 6a85beb36d7ff2363de71aa19a17c24ecde7a92f706347891befc5901793e41ac847ce9c04c96dc0f5095384890cc737e64f21ed334e75c523d2352056fc6a9e - languageName: node - linkType: hard - "eventemitter3@npm:5.0.1": version: 5.0.1 resolution: "eventemitter3@npm:5.0.1" @@ -9904,55 +9252,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.14.0": - version: 4.18.2 - resolution: "express@npm:4.18.2" - dependencies: - accepts: "npm:~1.3.8" - array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.1" - content-disposition: "npm:0.5.4" - content-type: "npm:~1.0.4" - cookie: "npm:0.5.0" - cookie-signature: "npm:1.0.6" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - finalhandler: "npm:1.2.0" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.1" - methods: "npm:~1.1.2" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.7" - proxy-addr: "npm:~2.0.7" - qs: "npm:6.11.0" - range-parser: "npm:~1.2.1" - safe-buffer: "npm:5.2.1" - send: "npm:0.18.0" - serve-static: "npm:1.15.0" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - type-is: "npm:~1.6.18" - utils-merge: "npm:1.0.1" - vary: "npm:~1.1.2" - checksum: 869ae89ed6ff4bed7b373079dc58e5dddcf2915a2669b36037ff78c99d675ae930e5fe052b35c24f56557d28a023bb1cbe3e2f2fb87eaab96a1cedd7e597809d - languageName: node - linkType: hard - -"ext@npm:^1.1.2": - version: 1.7.0 - resolution: "ext@npm:1.7.0" - dependencies: - type: "npm:^2.7.2" - checksum: 666a135980b002df0e75c8ac6c389140cdc59ac953db62770479ee2856d58ce69d2f845e5f2586716350b725400f6945e51e9159573158c39f369984c72dcd84 - languageName: node - linkType: hard - -"extend@npm:^3.0.2, extend@npm:~3.0.2": +"extend@npm:^3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" checksum: 59e89e2dc798ec0f54b36d82f32a27d5f6472c53974f61ca098db5d4648430b725387b53449a34df38fd0392045434426b012f302b3cc049a6500ccf82877e4e @@ -9977,27 +9277,6 @@ __metadata: languageName: node linkType: hard -"extsprintf@npm:1.3.0": - version: 1.3.0 - resolution: "extsprintf@npm:1.3.0" - checksum: 26967d6c7ecbfb5bc5b7a6c43503dc5fafd9454802037e9fa1665e41f615da4ff5918bd6cb871a3beabed01a31eca1ccd0bdfb41231f50ad50d405a430f78377 - languageName: node - linkType: hard - -"extsprintf@npm:^1.2.0": - version: 1.4.1 - resolution: "extsprintf@npm:1.4.1" - checksum: bfd6d55f3c0c04d826fe0213264b383c03f32825af6b1ff777f3f2dc49467e599361993568d75b7b19a8ea1bb08c8e7cd8c3d87d179ced91bb0dcf81ca6938e0 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - "fast-glob@npm:^3.2.9": version: 3.2.12 resolution: "fast-glob@npm:3.2.12" @@ -10011,7 +9290,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: 2c20055c1fa43c922428f16ca8bb29f2807de63e5c851f665f7ac9790176c01c3b40335257736b299764a8d383388dabc73c8083b8e1bc3d99f0a941444ec60e @@ -10164,21 +9443,6 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" - dependencies: - debug: "npm:2.6.9" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - statuses: "npm:2.0.1" - unpipe: "npm:~1.0.0" - checksum: 635718cb203c6d18e6b48dfbb6c54ccb08ea470e4f474ddcef38c47edcf3227feec316f886dd701235997d8af35240cae49856721ce18f539ad038665ebbf163 - languageName: node - linkType: hard - "find-up@npm:^3.0.0": version: 3.0.0 resolution: "find-up@npm:3.0.0" @@ -10236,20 +9500,6 @@ __metadata: languageName: node linkType: hard -"forever-agent@npm:~0.6.1": - version: 0.6.1 - resolution: "forever-agent@npm:0.6.1" - checksum: c1e1644d5e074ac063ecbc3fb8582013ef91fff0e3fa41e76db23d2f62bc6d9677aac86db950917deed4fe1fdd772df780cfaa352075f23deec9c015313afb97 - languageName: node - linkType: hard - -"form-data-encoder@npm:1.7.1": - version: 1.7.1 - resolution: "form-data-encoder@npm:1.7.1" - checksum: 1abc9059d991b105ba4122a36f9b5c17fd0af77ce8fa59a826a5b9ce56d616807e7780963616dd7e7906ec7aa1ba28cfb7c9defd9747ad10484e039a2b946cca - languageName: node - linkType: hard - "form-data-encoder@npm:^2.1.2": version: 2.1.4 resolution: "form-data-encoder@npm:2.1.4" @@ -10268,17 +9518,6 @@ __metadata: languageName: node linkType: hard -"form-data@npm:~2.3.2": - version: 2.3.3 - resolution: "form-data@npm:2.3.3" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.6" - mime-types: "npm:^2.1.12" - checksum: 1b6f3ccbf4540e535887b42218a2431a3f6cfdea320119c2affa2a7a374ad8fdd1e60166fc865181f45d49b1684c3e90e7b2190d3fe016692957afb9cf0d0d02 - languageName: node - linkType: hard - "formdata-polyfill@npm:^4.0.10": version: 4.0.10 resolution: "formdata-polyfill@npm:4.0.10" @@ -10288,13 +9527,6 @@ __metadata: languageName: node linkType: hard -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: 29ba9fd347117144e97cbb8852baae5e8b2acb7d1b591ef85695ed96f5b933b1804a7fac4a15dd09ca7ac7d0cdc104410e8102aae2dd3faa570a797ba07adb81 - languageName: node - linkType: hard - "fp-ts@npm:2.16.9": version: 2.16.9 resolution: "fp-ts@npm:2.16.9" @@ -10302,13 +9534,6 @@ __metadata: languageName: node linkType: hard -"fresh@npm:0.5.2": - version: 0.5.2 - resolution: "fresh@npm:0.5.2" - checksum: 64c88e489b5d08e2f29664eb3c79c705ff9a8eb15d3e597198ef76546d4ade295897a44abb0abd2700e7ef784b2e3cbf1161e4fbf16f59129193fd1030d16da1 - languageName: node - linkType: hard - "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -10316,17 +9541,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^4.0.2": - version: 4.0.3 - resolution: "fs-extra@npm:4.0.3" - dependencies: - graceful-fs: "npm:^4.1.2" - jsonfile: "npm:^4.0.0" - universalify: "npm:^0.1.0" - checksum: c1ab28ac6b19a1e37f9c0fb3a233b7333bd4d12ea2a514b5469ba956f022fa0e2aefa3b351d1117b80ed45495bb779427c8f64727c150bb1599c2ce9ab3b42ac - languageName: node - linkType: hard - "fs-extra@npm:^7.0.1": version: 7.0.1 resolution: "fs-extra@npm:7.0.1" @@ -10349,15 +9563,6 @@ __metadata: languageName: node linkType: hard -"fs-minipass@npm:^1.2.7": - version: 1.2.7 - resolution: "fs-minipass@npm:1.2.7" - dependencies: - minipass: "npm:^2.6.0" - checksum: 6a2d39963eaad748164530ffab49606d0f3462c7867748521af3b7039d13689be533636d50a04e8ba6bd327d4d2e899d0907f8830d1161fe2db467d59cc46dc3 - languageName: node - linkType: hard - "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -10509,7 +9714,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": version: 1.2.2 resolution: "get-intrinsic@npm:1.2.2" dependencies: @@ -10542,15 +9747,6 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: "npm:^3.0.0" - checksum: 13a73148dca795e41421013da6e3ebff8ccb7fba4d2f023fd0c6da2c166ec4e789bec9774a73a7b49c08daf2cae552f8a3e914042ac23b5f59dd278cc8f9cbfb - languageName: node - linkType: hard - "get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -10558,15 +9754,6 @@ __metadata: languageName: node linkType: hard -"getpass@npm:^0.1.1": - version: 0.1.7 - resolution: "getpass@npm:0.1.7" - dependencies: - assert-plus: "npm:^1.0.0" - checksum: ab18d55661db264e3eac6012c2d3daeafaab7a501c035ae0ccb193c3c23e9849c6e29b6ac762b9c2adae460266f925d55a3a2a3a3c8b94be2f222df94d70c046 - languageName: node - linkType: hard - "git-hooks-list@npm:^3.0.0": version: 3.1.0 resolution: "git-hooks-list@npm:3.1.0" @@ -10661,16 +9848,6 @@ __metadata: languageName: node linkType: hard -"global@npm:~4.4.0": - version: 4.4.0 - resolution: "global@npm:4.4.0" - dependencies: - min-document: "npm:^2.19.0" - process: "npm:^0.11.10" - checksum: 9c057557c8f5a5bcfbeb9378ba4fe2255d04679452be504608dd5f13b54edf79f7be1db1031ea06a4ec6edd3b9f5f17d2d172fb47e6c69dae57fd84b7e72b77f - languageName: node - linkType: hard - "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -10759,46 +9936,6 @@ __metadata: languageName: node linkType: hard -"got@npm:12.1.0": - version: 12.1.0 - resolution: "got@npm:12.1.0" - dependencies: - "@sindresorhus/is": "npm:^4.6.0" - "@szmarczak/http-timer": "npm:^5.0.1" - "@types/cacheable-request": "npm:^6.0.2" - "@types/responselike": "npm:^1.0.0" - cacheable-lookup: "npm:^6.0.4" - cacheable-request: "npm:^7.0.2" - decompress-response: "npm:^6.0.0" - form-data-encoder: "npm:1.7.1" - get-stream: "npm:^6.0.1" - http2-wrapper: "npm:^2.1.10" - lowercase-keys: "npm:^3.0.0" - p-cancelable: "npm:^3.0.0" - responselike: "npm:^2.0.0" - checksum: d1dab1884b14d1f59d10005ee3834faf6d9b43530c7faf603c176d35dceb2b8e0e2e01b9e0d4fc320409ac1b4d958196ff928dc6df0ddd0a3e7a254aa9edfd45 - languageName: node - linkType: hard - -"got@npm:^11.8.5": - version: 11.8.6 - resolution: "got@npm:11.8.6" - dependencies: - "@sindresorhus/is": "npm:^4.0.0" - "@szmarczak/http-timer": "npm:^4.0.5" - "@types/cacheable-request": "npm:^6.0.1" - "@types/responselike": "npm:^1.0.0" - cacheable-lookup: "npm:^5.0.3" - cacheable-request: "npm:^7.0.2" - decompress-response: "npm:^6.0.0" - http2-wrapper: "npm:^1.0.0-beta.5.2" - lowercase-keys: "npm:^2.0.0" - p-cancelable: "npm:^2.0.0" - responselike: "npm:^2.0.0" - checksum: a30c74029d81bd5fe50dea1a0c970595d792c568e188ff8be254b5bc11e6158d1b014570772d4a30d0a97723e7dd34e7c8cc1a2f23018f60aece3070a7a5c2a5 - languageName: node - linkType: hard - "got@npm:^13": version: 13.0.0 resolution: "got@npm:13.0.0" @@ -10843,23 +9980,6 @@ __metadata: languageName: node linkType: hard -"har-schema@npm:^2.0.0": - version: 2.0.0 - resolution: "har-schema@npm:2.0.0" - checksum: d8946348f333fb09e2bf24cc4c67eabb47c8e1d1aa1c14184c7ffec1140a49ec8aa78aa93677ae452d71d5fc0fdeec20f0c8c1237291fc2bcb3f502a5d204f9b - languageName: node - linkType: hard - -"har-validator@npm:~5.1.3": - version: 5.1.5 - resolution: "har-validator@npm:5.1.5" - dependencies: - ajv: "npm:^6.12.3" - har-schema: "npm:^2.0.0" - checksum: b998a7269ca560d7f219eedc53e2c664cd87d487e428ae854a6af4573fc94f182fe9d2e3b92ab968249baec7ebaf9ead69cf975c931dc2ab282ec182ee988280 - languageName: node - linkType: hard - "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -10982,7 +10102,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 362d5ed66b12ceb9c0a328fb31200b590ab1b02f4a254a697dc796850cc4385603e75f53ec59f768b2dad3bfa1464bd229f7de278d2899a0e3beffc634b6683f @@ -11003,26 +10123,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: "npm:2.0.0" - inherits: "npm:2.0.4" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - toidentifier: "npm:1.0.1" - checksum: 0e7f76ee8ff8a33e58a3281a469815b893c41357378f408be8f6d4aa7d1efafb0da064625518e7078381b6a92325949b119dc38fcb30bdbc4e3a35f78c44c439 - languageName: node - linkType: hard - -"http-https@npm:^1.0.0": - version: 1.0.0 - resolution: "http-https@npm:1.0.0" - checksum: fd3c0802982b1e951a03206690271dacb641b39b80d1820e95095db923d8f63cc7f0df1259969400c8487787a2a46f7b33383c0427ec780a78131b153741b144 - languageName: node - linkType: hard - "http-proxy-agent@npm:^5.0.0": version: 5.0.0 resolution: "http-proxy-agent@npm:5.0.0" @@ -11055,27 +10155,6 @@ __metadata: languageName: node linkType: hard -"http-signature@npm:~1.2.0": - version: 1.2.0 - resolution: "http-signature@npm:1.2.0" - dependencies: - assert-plus: "npm:^1.0.0" - jsprim: "npm:^1.2.2" - sshpk: "npm:^1.7.0" - checksum: 2ff7112e6b0d8f08b382dfe705078c655501f2ddd76cf589d108445a9dd388a0a9be928c37108261519a7f53e6bbd1651048d74057b804807cce1ec49e87a95b - languageName: node - linkType: hard - -"http2-wrapper@npm:^1.0.0-beta.5.2": - version: 1.0.3 - resolution: "http2-wrapper@npm:1.0.3" - dependencies: - quick-lru: "npm:^5.1.1" - resolve-alpn: "npm:^1.0.0" - checksum: 8097ee2699440c2e64bda52124990cc5b0fb347401c7797b1a0c1efd5a0f79a4ebaa68e8a6ac3e2dde5f09460c1602764da6da2412bad628ed0a3b0ae35e72d4 - languageName: node - linkType: hard - "http2-wrapper@npm:^2.1.10": version: 2.2.0 resolution: "http2-wrapper@npm:2.2.0" @@ -11152,7 +10231,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": +"iconv-lite@npm:^0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: @@ -11170,15 +10249,6 @@ __metadata: languageName: node linkType: hard -"idna-uts46-hx@npm:^2.3.1": - version: 2.3.1 - resolution: "idna-uts46-hx@npm:2.3.1" - dependencies: - punycode: "npm:2.1.0" - checksum: 5cb65dbc375d42ce9b38dab6e2a7f41b8c059f9a88d236bc9ca32084485f5f22fec11ea5b4e6b61239448148443c3f825fddaa5f298d22e12ecfe845de71a807 - languageName: node - linkType: hard - "ieee754@npm:1.1.13": version: 1.1.13 resolution: "ieee754@npm:1.1.13" @@ -11252,7 +10322,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 @@ -11383,13 +10453,6 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: 864d0cced0c0832700e9621913a6429ccdc67f37c1bd78fb8c6789fff35c9d167cb329134acad2290497a53336813ab4798d2794fd675d5eb33b5fdf0982b9ca - languageName: node - linkType: hard - "is-arguments@npm:^1.0.4": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" @@ -11492,13 +10555,6 @@ __metadata: languageName: node linkType: hard -"is-function@npm:^1.0.1": - version: 1.0.2 - resolution: "is-function@npm:1.0.2" - checksum: 7d564562e07b4b51359547d3ccc10fb93bb392fd1b8177ae2601ee4982a0ece86d952323fc172a9000743a3971f09689495ab78a1d49a9b14fc97a7e28521dc0 - languageName: node - linkType: hard - "is-generator-fn@npm:^2.0.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" @@ -11524,13 +10580,6 @@ __metadata: languageName: node linkType: hard -"is-hex-prefixed@npm:1.0.0": - version: 1.0.0 - resolution: "is-hex-prefixed@npm:1.0.0" - checksum: 5ac58e6e528fb029cc43140f6eeb380fad23d0041cc23154b87f7c9a1b728bcf05909974e47248fd0b7fcc11ba33cf7e58d64804883056fabd23e2b898be41de - languageName: node - linkType: hard - "is-in-ci@npm:^0.1.0": version: 0.1.0 resolution: "is-in-ci@npm:0.1.0" @@ -11618,13 +10667,6 @@ __metadata: languageName: node linkType: hard -"is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 4b433bfb0f9026f079f4eb3fbaa4ed2de17c9995c3a0b5c800bec40799b4b2a8b4e051b1ada77749deb9ded4ae52fe2096973f3a93ff83df1a5a7184a669478c - languageName: node - linkType: hard - "is-windows@npm:^1.0.0": version: 1.0.2 resolution: "is-windows@npm:1.0.2" @@ -11687,13 +10729,6 @@ __metadata: languageName: node linkType: hard -"isstream@npm:~0.1.2": - version: 0.1.2 - resolution: "isstream@npm:0.1.2" - checksum: 22d9c181015226d4534a227539256897bbbcb7edd1066ca4fc4d3a06dbd976325dfdd16b3983c7d236a89f256805c1a685a772e0364e98873d3819b064ad35a1 - languageName: node - linkType: hard - "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.0 resolution: "istanbul-lib-coverage@npm:3.2.0" @@ -12366,20 +11401,13 @@ __metadata: languageName: node linkType: hard -"js-sha3@npm:0.8.0, js-sha3@npm:^0.8.0": +"js-sha3@npm:0.8.0": version: 0.8.0 resolution: "js-sha3@npm:0.8.0" checksum: a49ac6d3a6bfd7091472a28ab82a94c7fb8544cc584ee1906486536ba1cb4073a166f8c7bb2b0565eade23c5b3a7b8f7816231e0309ab5c549b737632377a20c languageName: node linkType: hard -"js-sha3@npm:^0.5.7": - version: 0.5.7 - resolution: "js-sha3@npm:0.5.7" - checksum: 32885c7edb50fca04017bacada8e5315c072d21d3d35e071e9640fc5577e200076a4718e0b2f33d86ab704accb68d2ade44f1e2ca424cc73a5929b9129dab948 - languageName: node - linkType: hard - "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -12406,13 +11434,6 @@ __metadata: languageName: node linkType: hard -"jsbn@npm:~0.1.0": - version: 0.1.1 - resolution: "jsbn@npm:0.1.1" - checksum: 5450133242845100e694f0ef9175f44c012691a9b770b2571e677314e6f70600abb10777cdfc9a0c6a9f2ac6d134577403633de73e2fcd0f97875a67744e2d14 - languageName: node - linkType: hard - "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -12459,20 +11480,6 @@ __metadata: languageName: node linkType: hard -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"json-schema@npm:0.4.0": - version: 0.4.0 - resolution: "json-schema@npm:0.4.0" - checksum: 8b3b64eff4a807dc2a3045b104ed1b9335cd8d57aa74c58718f07f0f48b8baa3293b00af4dcfbdc9144c3aafea1e97982cc27cc8e150fc5d93c540649507a458 - languageName: node - linkType: hard - "json-stringify-nice@npm:^1.1.4": version: 1.1.4 resolution: "json-stringify-nice@npm:1.1.4" @@ -12480,13 +11487,6 @@ __metadata: languageName: node linkType: hard -"json-stringify-safe@npm:~5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 59169a081e4eeb6f9559ae1f938f656191c000e0512aa6df9f3c8b2437a4ab1823819c6b9fd1818a4e39593ccfd72e9a051fdd3e2d1e340ed913679e888ded8c - languageName: node - linkType: hard - "json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -12544,18 +11544,6 @@ __metadata: languageName: node linkType: hard -"jsprim@npm:^1.2.2": - version: 1.4.2 - resolution: "jsprim@npm:1.4.2" - dependencies: - assert-plus: "npm:1.0.0" - extsprintf: "npm:1.3.0" - json-schema: "npm:0.4.0" - verror: "npm:1.10.0" - checksum: df2bf234eab1b5078d01bcbff3553d50a243f7b5c10a169745efeda6344d62798bd1d85bcca6a8446f3b5d0495e989db45f9de8dae219f0f9796e70e0c776089 - languageName: node - linkType: hard - "just-diff-apply@npm:^5.2.0": version: 5.5.0 resolution: "just-diff-apply@npm:5.5.0" @@ -12636,7 +11624,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.0.0, keyv@npm:^4.5.3": +"keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -13020,13 +12008,6 @@ __metadata: languageName: node linkType: hard -"lowercase-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "lowercase-keys@npm:2.0.0" - checksum: 1c233d2da35056e8c49fae8097ee061b8c799b2f02e33c2bf32f9913c7de8fb481ab04dab7df35e94156c800f5f34e99acbf32b21781d87c3aa43ef7b748b79e - languageName: node - linkType: hard - "lowercase-keys@npm:^3.0.0": version: 3.0.0 resolution: "lowercase-keys@npm:3.0.0" @@ -13199,20 +12180,6 @@ __metadata: languageName: node linkType: hard -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: 38e0984db39139604756903a01397e29e17dcb04207bb3e081412ce725ab17338ecc47220c1b186b6bbe79a658aad1b0d41142884f5a481f36290cdefbe6aa46 - languageName: node - linkType: hard - -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 - languageName: node - linkType: hard - "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -13227,20 +12194,6 @@ __metadata: languageName: node linkType: hard -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: a385dd974faa34b5dd021b2bbf78c722881bf6f003bfe6d391d7da3ea1ed625d1ff10ddd13c57531f628b3e785be38d3eed10ad03cebd90b76932413df9a1820 - languageName: node - linkType: hard - -"micro-ftch@npm:^0.3.1": - version: 0.3.1 - resolution: "micro-ftch@npm:0.3.1" - checksum: a7ab07d25e28ec4ae492ce4542ea9b06eee85538742b3b1263b247366ee8872f2c5ce9c8651138b2f1d22c8212f691a7b8b5384fe86ead5aff1852e211f1c035 - languageName: node - linkType: hard - "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -13268,7 +12221,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.16, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -13277,15 +12230,6 @@ __metadata: languageName: node linkType: hard -"mime@npm:1.6.0": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: b7d98bb1e006c0e63e2c91b590fe1163b872abf8f7ef224d53dd31499c2197278a6d3d0864c45239b1a93d22feaf6f9477e9fc847eef945838150b8c02d03170 - languageName: node - linkType: hard - "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -13300,13 +12244,6 @@ __metadata: languageName: node linkType: hard -"mimic-response@npm:^1.0.0": - version: 1.0.1 - resolution: "mimic-response@npm:1.0.1" - checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823 - languageName: node - linkType: hard - "mimic-response@npm:^3.1.0": version: 3.1.0 resolution: "mimic-response@npm:3.1.0" @@ -13321,15 +12258,6 @@ __metadata: languageName: node linkType: hard -"min-document@npm:^2.19.0": - version: 2.19.0 - resolution: "min-document@npm:2.19.0" - dependencies: - dom-walk: "npm:^0.1.0" - checksum: 4e45a0686c81cc04509989235dc6107e2678a59bb48ce017d3c546d7d9a18d782e341103e66c78081dd04544704e2196e529905c41c2550bca069b69f95f07c8 - languageName: node - linkType: hard - "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" @@ -13462,16 +12390,6 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^2.6.0, minipass@npm:^2.9.0": - version: 2.9.0 - resolution: "minipass@npm:2.9.0" - dependencies: - safe-buffer: "npm:^5.1.2" - yallist: "npm:^3.0.0" - checksum: fdd1a77996c184991f8d2ce7c5b3979bec624e2a3225e2e1e140c4038fd65873d7eb90fb29779f8733735a8827b2686f283871a0c74c908f4f7694c56fa8dadf - languageName: node - linkType: hard - "minipass@npm:^3.0.0": version: 3.3.6 resolution: "minipass@npm:3.3.6" @@ -13509,15 +12427,6 @@ __metadata: languageName: node linkType: hard -"minizlib@npm:^1.3.3": - version: 1.3.3 - resolution: "minizlib@npm:1.3.3" - dependencies: - minipass: "npm:^2.9.0" - checksum: 9c2c47e5687d7f896431a9b5585988ef72f848b56c6a974c9489534e8f619388d500d986ef82e1c13aedd46f3a0e81b6a88110cb1b27de7524cc8dabe8885e17 - languageName: node - linkType: hard - "minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": version: 2.1.2 resolution: "minizlib@npm:2.1.2" @@ -13545,25 +12454,7 @@ __metadata: languageName: node linkType: hard -"mkdirp-promise@npm:^5.0.1": - version: 5.0.1 - resolution: "mkdirp-promise@npm:5.0.1" - dependencies: - mkdirp: "npm:*" - checksum: 31ddc9478216adf6d6bee9ea7ce9ccfe90356d9fcd1dfb18128eac075390b4161356d64c3a7b0a75f9de01a90aadd990a0ec8c7434036563985c4b853a053ee2 - languageName: node - linkType: hard - -"mkdirp@npm:*": - version: 3.0.0 - resolution: "mkdirp@npm:3.0.0" - bin: - mkdirp: dist/cjs/src/bin.js - checksum: ca1fb0cb3ebe3d068d74738c264888151e099b150e8a4dde1d20e593a61952227d2f1dfd9fb4dc885ab4cdf18275909360041d2f5f35c4121052df93edae88dd - languageName: node - linkType: hard - -"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.5": +"mkdirp@npm:^0.5.1": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -13592,13 +12483,6 @@ __metadata: languageName: node linkType: hard -"mock-fs@npm:^4.1.0": - version: 4.14.0 - resolution: "mock-fs@npm:4.14.0" - checksum: 20facbc85bb62df02dbfc946b354fcdd8b2b2aeafef4986adab18dc9a23efccb34ce49d4dac22aaed1a24420fc50c53d77e90984cc888bcce314e18e0e21872a - languageName: node - linkType: hard - "module-error@npm:^1.0.1": version: 1.0.2 resolution: "module-error@npm:1.0.2" @@ -13613,13 +12497,6 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 - languageName: node - linkType: hard - "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" @@ -13627,63 +12504,13 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.2, ms@npm:^2.1.3": +"ms@npm:^2.1.1, ms@npm:^2.1.2, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d languageName: node linkType: hard -"multibase@npm:^0.7.0": - version: 0.7.0 - resolution: "multibase@npm:0.7.0" - dependencies: - base-x: "npm:^3.0.8" - buffer: "npm:^5.5.0" - checksum: a5cbbf00b8aa61bcb92a706e210d8f258e8413cff2893584fedbc316c98bf2a44b8f648b57c124ddfaa29750c3b686ee5ba973cb8da84a896c19d63101b09445 - languageName: node - linkType: hard - -"multibase@npm:~0.6.0": - version: 0.6.1 - resolution: "multibase@npm:0.6.1" - dependencies: - base-x: "npm:^3.0.8" - buffer: "npm:^5.5.0" - checksum: c9e3bf20dc1b109019b94b14a76731ea0a6b0e654a4ef627ba154bfc2b8602ac43b160c44d8245d18cd6a9ed971826efb204230f22b929c8b3e72da13dbc1859 - languageName: node - linkType: hard - -"multicodec@npm:^0.5.5": - version: 0.5.7 - resolution: "multicodec@npm:0.5.7" - dependencies: - varint: "npm:^5.0.0" - checksum: b61bbf04e1bfff180f77693661b8111bf94f65580abc455e6d83d2240c227d8c2e8af99ca93b6c02500c5da43d16e2b028dbbec1b376a85145a774f542d9ca2c - languageName: node - linkType: hard - -"multicodec@npm:^1.0.0": - version: 1.0.4 - resolution: "multicodec@npm:1.0.4" - dependencies: - buffer: "npm:^5.6.0" - varint: "npm:^5.0.0" - checksum: 3a78ac54d3715e6b095a1805f63b4c4e7d5bb4642445691c0c4e6442cad9f97823469634e73ee362ba748596570db1050d69d5cc74a88928b1e9658916cdfbcd - languageName: node - linkType: hard - -"multihashes@npm:^0.4.15, multihashes@npm:~0.4.15": - version: 0.4.21 - resolution: "multihashes@npm:0.4.21" - dependencies: - buffer: "npm:^5.5.0" - multibase: "npm:^0.7.0" - varint: "npm:^5.0.0" - checksum: a482d9ba7ed0ad41db22ca589f228e4b7a30207a229a64dfc9888796752314fca00a8d03025fe40d6d73965bbb246f54b73626c5a235463e30c06c7bf7a8785f - languageName: node - linkType: hard - "mute-stream@npm:0.0.8": version: 0.0.8 resolution: "mute-stream@npm:0.0.8" @@ -13705,13 +12532,6 @@ __metadata: languageName: node linkType: hard -"nano-json-stream-parser@npm:^0.1.2": - version: 0.1.2 - resolution: "nano-json-stream-parser@npm:0.1.2" - checksum: 00a3ce63d3b66220def9fd6c26cd495100efd155e7bda54a11f1dfd185ba6750d5ce266076e0f229bad3f5ef892e2017f24da012669f146b404a8e47a44568ec - languageName: node - linkType: hard - "nanoid@npm:^3.3.8": version: 3.3.11 resolution: "nanoid@npm:3.3.11" @@ -13774,7 +12594,7 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": +"negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: 2723fb822a17ad55c93a588a4bc44d53b22855bf4be5499916ca0cab1e7165409d0b288ba2577d7b029f10ce18cf2ed8e703e5af31c984e1e2304277ef979837 @@ -13788,13 +12608,6 @@ __metadata: languageName: node linkType: hard -"next-tick@npm:^1.1.0": - version: 1.1.0 - resolution: "next-tick@npm:1.1.0" - checksum: 83b5cf36027a53ee6d8b7f9c0782f2ba87f4858d977342bfc3c20c21629290a2111f8374d13a81221179603ffc4364f38374b5655d17b6a8f8a8c77bdea4fe8b - languageName: node - linkType: hard - "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -13871,7 +12684,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.5.0, node-fetch@npm:^2.6.12": +"node-fetch@npm:^2.5.0": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -14058,13 +12871,6 @@ __metadata: languageName: node linkType: hard -"normalize-url@npm:^6.0.1": - version: 6.1.0 - resolution: "normalize-url@npm:6.1.0" - checksum: 5ae699402c9d5ffa330adc348fcd6fc6e6a155ab7c811b96e30b7ecab60ceef821d8f86443869671dda71bbc47f4b9625739c82ad247e883e9aefe875bfb8659 - languageName: node - linkType: hard - "normalize-url@npm:^8.0.0": version: 8.0.1 resolution: "normalize-url@npm:8.0.1" @@ -14279,30 +13085,6 @@ __metadata: languageName: node linkType: hard -"number-to-bn@npm:1.7.0": - version: 1.7.0 - resolution: "number-to-bn@npm:1.7.0" - dependencies: - bn.js: "npm:4.11.6" - strip-hex-prefix: "npm:1.0.0" - checksum: 702e8f00b6b90abd23f711056005179c3bd5ce3b063c47d468250f63ab3b9b4b82e27bff3b4642a9e71e06c717d5ed359873501746df0a64c3db1fa6d704e704 - languageName: node - linkType: hard - -"oauth-sign@npm:~0.9.0": - version: 0.9.0 - resolution: "oauth-sign@npm:0.9.0" - checksum: 1809a366d258f41fdf4ab5310cff3d1e15f96b187503bc7333cef4351de7bd0f52cb269bc95800f1fae5fb04dd886287df1471985fd67e8484729fdbcf857119 - languageName: node - linkType: hard - -"object-assign@npm:^4, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f - languageName: node - linkType: hard - "object-hash@npm:^3.0.0": version: 3.0.0 resolution: "object-hash@npm:3.0.0" @@ -14310,13 +13092,6 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.9.0": - version: 1.12.3 - resolution: "object-inspect@npm:1.12.3" - checksum: 532b0036f0472f561180fac0d04fe328ee01f57637624c83fb054f81b5bfe966cdf4200612a499ed391a7ca3c46b20a0bc3a55fc8241d944abe687c556a32b39 - languageName: node - linkType: hard - "object-treeify@npm:^1.1.33": version: 1.1.33 resolution: "object-treeify@npm:1.1.33" @@ -14331,15 +13106,6 @@ __metadata: languageName: node linkType: hard -"oboe@npm:2.1.5": - version: 2.1.5 - resolution: "oboe@npm:2.1.5" - dependencies: - http-https: "npm:^1.0.0" - checksum: 451d0c28b45f518fc86d4689075cf74c7fea92fb09e2f994dd1208e5c5516a6958f9dc476714b61c62c959a3e7e0db8a69999c59ff63777c7a8af24fbddd0848 - languageName: node - linkType: hard - "oclif@npm:^4.17.32": version: 4.17.46 resolution: "oclif@npm:4.17.46" @@ -14374,15 +13140,6 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" - dependencies: - ee-first: "npm:1.1.1" - checksum: 8e81472c5028125c8c39044ac4ab8ba51a7cdc19a9fbd4710f5d524a74c6d8c9ded4dd0eed83f28d3d33ac1d7a6a439ba948ccb765ac6ce87f30450a26bfe2ea - languageName: node - linkType: hard - "once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -14456,13 +13213,6 @@ __metadata: languageName: node linkType: hard -"p-cancelable@npm:^2.0.0": - version: 2.1.1 - resolution: "p-cancelable@npm:2.1.1" - checksum: 7f1b64db17fc54acf359167d62898115dcf2a64bf6b3b038e4faf36fc059e5ed762fb9624df8ed04b25bee8de3ab8d72dea9879a2a960cd12e23c420a4aca6ed - languageName: node - linkType: hard - "p-cancelable@npm:^3.0.0": version: 3.0.0 resolution: "p-cancelable@npm:3.0.0" @@ -14634,13 +13384,6 @@ __metadata: languageName: node linkType: hard -"parse-headers@npm:^2.0.0": - version: 2.0.5 - resolution: "parse-headers@npm:2.0.5" - checksum: 210b13bc0f99cf6f1183896f01de164797ac35b2720c9f1c82a3e2ceab256f87b9048e8e16a14cfd1b75448771f8379cd564bd1674a179ab0168c90005d4981b - languageName: node - linkType: hard - "parse-json@npm:^4.0.0": version: 4.0.0 resolution: "parse-json@npm:4.0.0" @@ -14663,13 +13406,6 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:~1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 - languageName: node - linkType: hard - "pascal-case@npm:^3.1.2": version: 3.1.2 resolution: "pascal-case@npm:3.1.2" @@ -14769,13 +13505,6 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 701c99e1f08e3400bea4d701cf6f03517474bb1b608da71c78b1eb261415b645c5670dfae49808c89e12cea2dccd113b069f040a80de012da0400191c6dbd1c8 - languageName: node - linkType: hard - "path-to-regexp@npm:^2.2.1": version: 2.4.0 resolution: "path-to-regexp@npm:2.4.0" @@ -14817,13 +13546,6 @@ __metadata: languageName: node linkType: hard -"performance-now@npm:^2.1.0": - version: 2.1.0 - resolution: "performance-now@npm:2.1.0" - checksum: 534e641aa8f7cba160f0afec0599b6cecefbb516a2e837b512be0adbe6c1da5550e89c78059c7fabc5c9ffdf6627edabe23eb7c518c4500067a898fa65c2b550 - languageName: node - linkType: hard - "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -14991,13 +13713,6 @@ __metadata: languageName: node linkType: hard -"process@npm:^0.11.10": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: dbaa7e8d1d5cf375c36963ff43116772a989ef2bb47c9bdee20f38fd8fc061119cf38140631cf90c781aca4d3f0f0d2c834711952b728953f04fd7d238f59f5b - languageName: node - linkType: hard - "proggy@npm:^3.0.0": version: 3.0.0 resolution: "proggy@npm:3.0.0" @@ -15132,16 +13847,6 @@ __metadata: languageName: node linkType: hard -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: "npm:0.2.0" - ipaddr.js: "npm:1.9.1" - checksum: f24a0c80af0e75d31e3451398670d73406ec642914da11a2965b80b1898ca6f66a0e3e091a11a4327079b2b268795f6fa06691923fef91887215c3d0e8ea3f68 - languageName: node - linkType: hard - "proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" @@ -15149,13 +13854,6 @@ __metadata: languageName: node linkType: hard -"psl@npm:^1.1.28": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: d07879d4bfd0ac74796306a8e5a36a93cfb9c4f4e8ee8e63fbb909066c192fe1008cd8f12abd8ba2f62ca28247949a20c8fb32e1d18831d9e71285a1569720f9 - languageName: node - linkType: hard - "pump@npm:^1.0.0": version: 1.0.3 resolution: "pump@npm:1.0.3" @@ -15190,20 +13888,6 @@ __metadata: languageName: node linkType: hard -"punycode@npm:2.1.0": - version: 2.1.0 - resolution: "punycode@npm:2.1.0" - checksum: 012f9443fe56baf485db702d0d07cef7d89c0670ce1ac4da8fb8b5bd3677e42a8f5d2b35f595ffa31ba843661c9c6766f2feb1e1e3393e1ff1033120d0f94d60 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: d4e7fbb96f570c57d64b09a35a1182c879ac32833de7c6926a2c10619632c1377865af3dab5479f59d51da18bcd5035a20a5ef6ceb74020082a3e78025d9a9ca - languageName: node - linkType: hard - "pure-rand@npm:^6.0.0": version: 6.0.1 resolution: "pure-rand@npm:6.0.1" @@ -15244,33 +13928,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: "npm:^1.0.4" - checksum: 5a3bfea3e2f359ede1bfa5d2f0dbe54001aa55e40e27dc3e60fab814362d83a9b30758db057c2011b6f53a2d4e4e5150194b5bac45372652aecb3e3c0d4b256e - languageName: node - linkType: hard - -"qs@npm:~6.5.2": - version: 6.5.3 - resolution: "qs@npm:6.5.3" - checksum: 485c990fba7ad17671e16c92715fb064c1600337738f5d140024eb33a49fbc1ed31890d3db850117c760caeb9c9cc9f4ba22a15c20dd119968e41e3d3fe60b28 - languageName: node - linkType: hard - -"query-string@npm:^5.0.1": - version: 5.1.1 - resolution: "query-string@npm:5.1.1" - dependencies: - decode-uri-component: "npm:^0.2.0" - object-assign: "npm:^4.1.0" - strict-uri-encode: "npm:^1.0.0" - checksum: 8834591ed02c324ac10397094c2ae84a3d3460477ef30acd5efe03b1afbf15102ccc0829ab78cc58ecb12f70afeb7a1f81e604487a9ad4859742bb14748e98cc - languageName: node - linkType: hard - "querystring@npm:0.2.0": version: 0.2.0 resolution: "querystring@npm:0.2.0" @@ -15308,37 +13965,6 @@ __metadata: languageName: node linkType: hard -"range-parser@npm:~1.2.1": - version: 1.2.1 - resolution: "range-parser@npm:1.2.1" - checksum: ce21ef2a2dd40506893157970dc76e835c78cf56437e26e19189c48d5291e7279314477b06ac38abd6a401b661a6840f7b03bd0b1249da9b691deeaa15872c26 - languageName: node - linkType: hard - -"raw-body@npm:2.5.1": - version: 2.5.1 - resolution: "raw-body@npm:2.5.1" - dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 280bedc12db3490ecd06f740bdcf66093a07535374b51331242382c0e130bb273ebb611b7bc4cba1b4b4e016cc7b1f4b05a6df885a6af39c2bc3b94c02291c84 - languageName: node - linkType: hard - -"raw-body@npm:2.5.2": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" - dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 863b5171e140546a4d99f349b720abac4410338e23df5e409cfcc3752538c9caf947ce382c89129ba976f71894bd38b5806c774edac35ebf168d02aa1ac11a95 - languageName: node - linkType: hard - "rc@npm:^1.2.7": version: 1.2.8 resolution: "rc@npm:1.2.8" @@ -15505,34 +14131,6 @@ __metadata: languageName: node linkType: hard -"request@npm:^2.79.0": - version: 2.88.2 - resolution: "request@npm:2.88.2" - dependencies: - aws-sign2: "npm:~0.7.0" - aws4: "npm:^1.8.0" - caseless: "npm:~0.12.0" - combined-stream: "npm:~1.0.6" - extend: "npm:~3.0.2" - forever-agent: "npm:~0.6.1" - form-data: "npm:~2.3.2" - har-validator: "npm:~5.1.3" - http-signature: "npm:~1.2.0" - is-typedarray: "npm:~1.0.0" - isstream: "npm:~0.1.2" - json-stringify-safe: "npm:~5.0.1" - mime-types: "npm:~2.1.19" - oauth-sign: "npm:~0.9.0" - performance-now: "npm:^2.1.0" - qs: "npm:~6.5.2" - safe-buffer: "npm:^5.1.2" - tough-cookie: "npm:~2.5.0" - tunnel-agent: "npm:^0.6.0" - uuid: "npm:^3.3.2" - checksum: 005b8b237b56f1571cfd4ecc09772adaa2e82dcb884fc14ea2bb25e23dbf7c2009f9929e0b6d3fd5802e33ed8ee705a3b594c8f9467c1458cd973872bf89db8e - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -15554,7 +14152,7 @@ __metadata: languageName: node linkType: hard -"resolve-alpn@npm:^1.0.0, resolve-alpn@npm:^1.2.0": +"resolve-alpn@npm:^1.2.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" checksum: 744e87888f0b6fa0b256ab454ca0b9c0b80808715e2ef1f3672773665c92a941f6181194e30ccae4a8cd0adbe0d955d3f133102636d2ee0cca0119fec0bc9aec @@ -15610,15 +14208,6 @@ __metadata: languageName: node linkType: hard -"responselike@npm:^2.0.0": - version: 2.0.1 - resolution: "responselike@npm:2.0.1" - dependencies: - lowercase-keys: "npm:^2.0.0" - checksum: b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a - languageName: node - linkType: hard - "responselike@npm:^3.0.0": version: 3.0.0 resolution: "responselike@npm:3.0.0" @@ -15842,7 +14431,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 @@ -15856,7 +14445,7 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 @@ -15984,27 +14573,6 @@ __metadata: languageName: node linkType: hard -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" - dependencies: - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - mime: "npm:1.6.0" - ms: "npm:2.1.3" - on-finished: "npm:2.4.1" - range-parser: "npm:~1.2.1" - statuses: "npm:2.0.1" - checksum: ec66c0ad109680ad8141d507677cfd8b4e40b9559de23191871803ed241718e99026faa46c398dcfb9250676076573bd6bfe5d0ec347f88f4b7b8533d1d391cb - languageName: node - linkType: hard - "sentence-case@npm:^3.0.4": version: 3.0.4 resolution: "sentence-case@npm:3.0.4" @@ -16016,31 +14584,6 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.15.0": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" - dependencies: - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - parseurl: "npm:~1.3.3" - send: "npm:0.18.0" - checksum: 699b2d4c29807a51d9b5e0f24955346911437aebb0178b3c4833ad30d3eca93385ff9927254f5c16da345903cad39d9cd4a532198c95a5129cc4ed43911b15a4 - languageName: node - linkType: hard - -"servify@npm:^0.1.12": - version: 0.1.12 - resolution: "servify@npm:0.1.12" - dependencies: - body-parser: "npm:^1.16.0" - cors: "npm:^2.8.1" - express: "npm:^4.14.0" - request: "npm:^2.79.0" - xhr: "npm:^2.3.3" - checksum: d61b145034aa26c143d7081a56c544aceff256eead27a5894b6785346254438d2b387ac7411bf664024d258779a00dc6c5d9da65f8d60382dac23a8cba0b0d9e - languageName: node - linkType: hard - "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -16067,13 +14610,6 @@ __metadata: languageName: node linkType: hard -"setprototypeof@npm:1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: fde1630422502fbbc19e6844346778f99d449986b2f9cdcceb8326730d2f3d9964dbcb03c02aaadaefffecd0f2c063315ebea8b3ad895914bf1afc1747fc172e - languageName: node - linkType: hard - "sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": version: 2.4.11 resolution: "sha.js@npm:2.4.11" @@ -16102,17 +14638,6 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" - dependencies: - call-bind: "npm:^1.0.0" - get-intrinsic: "npm:^1.0.2" - object-inspect: "npm:^1.9.0" - checksum: c4998d9fc530b0e75a7fd791ad868fdc42846f072734f9080ff55cc8dc7d3899abcda24fd896aa6648c3ab7021b4bb478073eb4f44dfd55bce9714bc1a7c5d45 - languageName: node - linkType: hard - "siginfo@npm:^2.0.0": version: 2.0.0 resolution: "siginfo@npm:2.0.0" @@ -16155,17 +14680,6 @@ __metadata: languageName: node linkType: hard -"simple-get@npm:^2.7.0": - version: 2.8.2 - resolution: "simple-get@npm:2.8.2" - dependencies: - decompress-response: "npm:^3.3.0" - once: "npm:^1.3.1" - simple-concat: "npm:^1.0.0" - checksum: b827672695bbe504217311c47c6a106358babcfbf3d69c8d67ad56da40c2ed05185eec12538dfe3637e1cf0441bcd5931b022a84dc7f8f2d84969d595f7f7fda - languageName: node - linkType: hard - "simple-get@npm:^4.0.0": version: 4.0.1 resolution: "simple-get@npm:4.0.1" @@ -16424,27 +14938,6 @@ __metadata: languageName: node linkType: hard -"sshpk@npm:^1.7.0": - version: 1.17.0 - resolution: "sshpk@npm:1.17.0" - dependencies: - asn1: "npm:~0.2.3" - assert-plus: "npm:^1.0.0" - bcrypt-pbkdf: "npm:^1.0.0" - dashdash: "npm:^1.12.0" - ecc-jsbn: "npm:~0.1.1" - getpass: "npm:^0.1.1" - jsbn: "npm:~0.1.0" - safer-buffer: "npm:^2.0.2" - tweetnacl: "npm:~0.14.0" - bin: - sshpk-conv: bin/sshpk-conv - sshpk-sign: bin/sshpk-sign - sshpk-verify: bin/sshpk-verify - checksum: 668c2a279a6ce66fd739ce5684e37927dd75427cc020c828a208f85890a4c400705d4ba09f32fa44efca894339dc6931941664f6f6ba36dfa543de6d006cbe9c - languageName: node - linkType: hard - "ssri@npm:^10.0.0": version: 10.0.5 resolution: "ssri@npm:10.0.5" @@ -16479,13 +14972,6 @@ __metadata: languageName: node linkType: hard -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb - languageName: node - linkType: hard - "std-env@npm:^3.9.0": version: 3.9.0 resolution: "std-env@npm:3.9.0" @@ -16507,13 +14993,6 @@ __metadata: languageName: node linkType: hard -"strict-uri-encode@npm:^1.0.0": - version: 1.1.0 - resolution: "strict-uri-encode@npm:1.1.0" - checksum: 9466d371f7b36768d43f7803f26137657559e4c8b0161fb9e320efb8edba3ae22f8e99d4b0d91da023b05a13f62ec5412c3f4f764b5788fac11d1fea93720bb3 - languageName: node - linkType: hard - "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -16641,15 +15120,6 @@ __metadata: languageName: node linkType: hard -"strip-hex-prefix@npm:1.0.0": - version: 1.0.0 - resolution: "strip-hex-prefix@npm:1.0.0" - dependencies: - is-hex-prefixed: "npm:1.0.0" - checksum: 4cafe7caee1d281d3694d14920fd5d3c11adf09371cef7e2ccedd5b83efd9e9bd2219b5d6ce6e809df6e0f437dc9d30db1192116580875698aad164a6d6b285b - languageName: node - linkType: hard - "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -16722,25 +15192,6 @@ __metadata: languageName: node linkType: hard -"swarm-js@npm:^0.1.40": - version: 0.1.42 - resolution: "swarm-js@npm:0.1.42" - dependencies: - bluebird: "npm:^3.5.0" - buffer: "npm:^5.0.5" - eth-lib: "npm:^0.1.26" - fs-extra: "npm:^4.0.2" - got: "npm:^11.8.5" - mime-types: "npm:^2.1.16" - mkdirp-promise: "npm:^5.0.1" - mock-fs: "npm:^4.1.0" - setimmediate: "npm:^1.0.5" - tar: "npm:^4.0.2" - xhr-request: "npm:^1.0.1" - checksum: 341bcfef6daadc1904ea87b1781f10dc99ec14e33c9a9041e43e9617dcc3b7d632230e1baf2fafecb8e10e63c2e4eeb7cce7c85592dc0cf0dde935f49c77050b - languageName: node - linkType: hard - "tar-fs@npm:^1.8.1": version: 1.16.3 resolution: "tar-fs@npm:1.16.3" @@ -16793,21 +15244,6 @@ __metadata: languageName: node linkType: hard -"tar@npm:^4.0.2": - version: 4.4.19 - resolution: "tar@npm:4.4.19" - dependencies: - chownr: "npm:^1.1.4" - fs-minipass: "npm:^1.2.7" - minipass: "npm:^2.9.0" - minizlib: "npm:^1.3.3" - mkdirp: "npm:^0.5.5" - safe-buffer: "npm:^5.2.1" - yallist: "npm:^3.1.1" - checksum: 2715b5964578424ba5164632905a85e5a98c8dffeba657860aafa3a771b2602e6fd2a350bca891d78b8bda8cab5c53134c683ed2269b9925533477a24722e73b - languageName: node - linkType: hard - "tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.1.13 resolution: "tar@npm:6.1.13" @@ -16902,13 +15338,6 @@ __metadata: languageName: node linkType: hard -"timed-out@npm:^4.0.1": - version: 4.0.1 - resolution: "timed-out@npm:4.0.1" - checksum: d52648e5fc0ebb0cae1633737a1db1b7cb464d5d43d754bd120ddebd8067a1b8f42146c250d8cfb9952183b7b0f341a99fc71b59c52d659218afae293165004f - languageName: node - linkType: hard - "tiny-jsonc@npm:^1.0.2": version: 1.0.2 resolution: "tiny-jsonc@npm:1.0.2" @@ -17033,23 +15462,6 @@ __metadata: languageName: node linkType: hard -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 - languageName: node - linkType: hard - -"tough-cookie@npm:~2.5.0": - version: 2.5.0 - resolution: "tough-cookie@npm:2.5.0" - dependencies: - psl: "npm:^1.1.28" - punycode: "npm:^2.1.1" - checksum: 024cb13a4d1fe9af57f4323dff765dd9b217cc2a69be77e3b8a1ca45600aa33a097b6ad949f225d885e904f4bd3ceccef104741ef202d8378e6ca78e850ff82f - languageName: node - linkType: hard - "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -17198,13 +15610,6 @@ __metadata: languageName: node linkType: hard -"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": - version: 0.14.5 - resolution: "tweetnacl@npm:0.14.5" - checksum: 04ee27901cde46c1c0a64b9584e04c96c5fe45b38c0d74930710751ea991408b405747d01dfae72f80fc158137018aea94f9c38c651cb9c318f0861a310c3679 - languageName: node - linkType: hard - "type-detect@npm:4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" @@ -17226,39 +15631,6 @@ __metadata: languageName: node linkType: hard -"type-is@npm:~1.6.18": - version: 1.6.18 - resolution: "type-is@npm:1.6.18" - dependencies: - media-typer: "npm:0.3.0" - mime-types: "npm:~2.1.24" - checksum: 0bd9eeae5efd27d98fd63519f999908c009e148039d8e7179a074f105362d4fcc214c38b24f6cda79c87e563cbd12083a4691381ed28559220d4a10c2047bed4 - languageName: node - linkType: hard - -"type@npm:^1.0.1": - version: 1.2.0 - resolution: "type@npm:1.2.0" - checksum: b4d4b27d1926028be45fc5baaca205896e2a1fe9e5d24dc892046256efbe88de6acd0149e7353cd24dad596e1483e48ec60b0912aa47ca078d68cdd198b09885 - languageName: node - linkType: hard - -"type@npm:^2.7.2": - version: 2.7.2 - resolution: "type@npm:2.7.2" - checksum: 602f1b369fba60687fa4d0af6fcfb814075bcaf9ed3a87637fb384d9ff849e2ad15bc244a431f341374562e51a76c159527ffdb1f1f24b0f1f988f35a301c41d - languageName: node - linkType: hard - -"typedarray-to-buffer@npm:^3.1.5": - version: 3.1.5 - resolution: "typedarray-to-buffer@npm:3.1.5" - dependencies: - is-typedarray: "npm:^1.0.0" - checksum: 7c850c3433fbdf4d04f04edfc751743b8f577828b8e1eb93b95a3bce782d156e267d83e20fb32b3b47813e69a69ab5e9b5342653332f7d21c7d1210661a7a72c - languageName: node - linkType: hard - "typedoc-plugin-markdown@npm:^4.6.3": version: 4.6.3 resolution: "typedoc-plugin-markdown@npm:4.6.3" @@ -17312,13 +15684,6 @@ __metadata: languageName: node linkType: hard -"ultron@npm:~1.1.0": - version: 1.1.1 - resolution: "ultron@npm:1.1.1" - checksum: 7cc6e8e98a2c62c87ab25a79a274f90492f13f5cf7c622dbda1ec85913e207aed392c26e76ed6250c4f05f842571b05dcce1f8ad0f5ecded64a99002b1fdf6e5 - languageName: node - linkType: hard - "underscore@npm:>1.4.4": version: 1.13.6 resolution: "underscore@npm:1.13.6" @@ -17397,13 +15762,6 @@ __metadata: languageName: node linkType: hard -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 - languageName: node - linkType: hard - "update-browserslist-db@npm:^1.0.10": version: 1.0.11 resolution: "update-browserslist-db@npm:1.0.11" @@ -17436,22 +15794,6 @@ __metadata: languageName: node linkType: hard -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: b271ca7e3d46b7160222e3afa3e531505161c9a4e097febae9664e4b59912f4cbe94861361a4175edac3a03fee99d91e44b6a58c17a634bc5a664b19fc76fbcb - languageName: node - linkType: hard - -"url-set-query@npm:^1.0.0": - version: 1.0.0 - resolution: "url-set-query@npm:1.0.0" - checksum: a6e4d1ac5c3e7db8644655a2774b9462d8d95ec7abae341ff53d4a3d03adc2dabc38650dc757659fcbce4859372bbea4a896ac842dd5b54cc22aae087ba35664 - languageName: node - linkType: hard - "url@npm:0.10.3": version: 0.10.3 resolution: "url@npm:0.10.3" @@ -17484,16 +15826,6 @@ __metadata: languageName: node linkType: hard -"utf-8-validate@npm:^5.0.2": - version: 5.0.10 - resolution: "utf-8-validate@npm:5.0.10" - dependencies: - node-gyp: "npm:latest" - node-gyp-build: "npm:^4.3.0" - checksum: b89cbc13b4badad04828349ebb7aa2ab1edcb02b46ab12ce0ba5b2d6886d684ad4e93347819e3c8d36224c8742422d2dca69f5cc16c72ae4d7eeecc0c5cb544b - languageName: node - linkType: hard - "utf8@npm:3.0.0, utf8@npm:^3.0.0": version: 3.0.0 resolution: "utf8@npm:3.0.0" @@ -17508,7 +15840,7 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.4, util@npm:^0.12.5": +"util@npm:^0.12.4": version: 0.12.5 resolution: "util@npm:0.12.5" dependencies: @@ -17528,13 +15860,6 @@ __metadata: languageName: node linkType: hard -"utils-merge@npm:1.0.1": - version: 1.0.1 - resolution: "utils-merge@npm:1.0.1" - checksum: 5d6949693d58cb2e636a84f3ee1c6e7b2f9c16cb1d42d0ecb386d8c025c69e327205aa1c69e2868cc06a01e5e20681fbba55a4e0ed0cce913d60334024eae798 - languageName: node - linkType: hard - "uuid@npm:8.0.0": version: 8.0.0 resolution: "uuid@npm:8.0.0" @@ -17544,15 +15869,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^3.3.2": - version: 3.4.0 - resolution: "uuid@npm:3.4.0" - bin: - uuid: ./bin/uuid - checksum: 4f2b86432b04cc7c73a0dd1bcf11f1fc18349d65d2e4e32dd0fc658909329a1e0cc9244aa93f34c0cccfdd5ae1af60a149251a5f420ec3ac4223a3dab198fb2e - languageName: node - linkType: hard - "uuid@npm:^8.3.0, uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" @@ -17562,15 +15878,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^9.0.0": - version: 9.0.0 - resolution: "uuid@npm:9.0.0" - bin: - uuid: dist/bin/uuid - checksum: 23857699a616d1b48224bc2b8440eae6e57d25463c3a0200e514ba8279dfa3bde7e92ea056122237839cfa32045e57d8f8f4a30e581d720fd72935572853ae2e - languageName: node - linkType: hard - "uuid@npm:^9.0.1": version: 9.0.1 resolution: "uuid@npm:9.0.1" @@ -17631,31 +15938,6 @@ __metadata: languageName: node linkType: hard -"varint@npm:^5.0.0": - version: 5.0.2 - resolution: "varint@npm:5.0.2" - checksum: e1a66bf9a6cea96d1f13259170d4d41b845833acf3a9df990ea1e760d279bd70d5b1f4c002a50197efd2168a2fd43eb0b808444600fd4d23651e8d42fe90eb05 - languageName: node - linkType: hard - -"vary@npm:^1, vary@npm:~1.1.2": - version: 1.1.2 - resolution: "vary@npm:1.1.2" - checksum: 31389debef15a480849b8331b220782230b9815a8e0dbb7b9a8369559aed2e9a7800cd904d4371ea74f4c3527db456dc8e7ac5befce5f0d289014dbdf47b2242 - languageName: node - linkType: hard - -"verror@npm:1.10.0": - version: 1.10.0 - resolution: "verror@npm:1.10.0" - dependencies: - assert-plus: "npm:^1.0.0" - core-util-is: "npm:1.0.2" - extsprintf: "npm:^1.2.0" - checksum: da548149dd9c130a8a2587c9ee71ea30128d1526925707e2d01ed9c5c45c9e9f86733c66a328247cdd5f7c1516fb25b0f959ba754bfbe15072aa99ff96468a29 - languageName: node - linkType: hard - "viem@npm:^2.21.8": version: 2.21.41 resolution: "viem@npm:2.21.41" @@ -17846,278 +16128,6 @@ __metadata: languageName: node linkType: hard -"web3-bzz@npm:1.10.4": - version: 1.10.4 - resolution: "web3-bzz@npm:1.10.4" - dependencies: - "@types/node": "npm:^12.12.6" - got: "npm:12.1.0" - swarm-js: "npm:^0.1.40" - checksum: 03b9e48e85d97c0a0d2fdec06fb42188adaf81e83c35ab73b3f6eafbdda2b43c0a9ed1a3b4ce86360544818eec34c056f0e4b67395685df97c1901f4a1c4a02e - languageName: node - linkType: hard - -"web3-core-helpers@npm:1.10.4": - version: 1.10.4 - resolution: "web3-core-helpers@npm:1.10.4" - dependencies: - web3-eth-iban: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 9c22942827bed0e46ae491a0bee3cd60cea636f9b0408b11bb341b0370e58a94358025657405142c2a24f3912a8f947e6e977d594d9ba66e11dedce3c5c4a7f4 - languageName: node - linkType: hard - -"web3-core-method@npm:1.10.4": - version: 1.10.4 - resolution: "web3-core-method@npm:1.10.4" - dependencies: - "@ethersproject/transactions": "npm:^5.6.2" - web3-core-helpers: "npm:1.10.4" - web3-core-promievent: "npm:1.10.4" - web3-core-subscriptions: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: d942beba3999c084333f5c808ada2a90930d55d148d5f8cc51a2135f8ab3f101fa5ce0d732a60830e8cad2af844bbed6cf0b6250863003adafb08c7ffa9fbd5f - languageName: node - linkType: hard - -"web3-core-promievent@npm:1.10.4": - version: 1.10.4 - resolution: "web3-core-promievent@npm:1.10.4" - dependencies: - eventemitter3: "npm:4.0.4" - checksum: a792c74aa5c91dc63fb493af04628ecfa08b9e6ceea402dfe53f718b019c41d63a0200bf3045dd23ec3c42b8d7474ac96eb4cb4456060becc551c2cacbd02bb1 - languageName: node - linkType: hard - -"web3-core-requestmanager@npm:1.10.4": - version: 1.10.4 - resolution: "web3-core-requestmanager@npm:1.10.4" - dependencies: - util: "npm:^0.12.5" - web3-core-helpers: "npm:1.10.4" - web3-providers-http: "npm:1.10.4" - web3-providers-ipc: "npm:1.10.4" - web3-providers-ws: "npm:1.10.4" - checksum: c26bf616cc156b2198bf634084978d66cf384cf2b174324b6ada071a8c9e9be7855d72c09453308d1a46b50874c18ff9b75193f8736c2b285cdc32209391880c - languageName: node - linkType: hard - -"web3-core-subscriptions@npm:1.10.4": - version: 1.10.4 - resolution: "web3-core-subscriptions@npm:1.10.4" - dependencies: - eventemitter3: "npm:4.0.4" - web3-core-helpers: "npm:1.10.4" - checksum: b1652988c0925ab1d5c27e67a816ec6bcb32f37f59c7314e1f02552233fbc486a0de579aeb660d77d82452b63e9feaa98317ec7897cd7aeb140595c8e176d0eb - languageName: node - linkType: hard - -"web3-core@npm:1.10.4": - version: 1.10.4 - resolution: "web3-core@npm:1.10.4" - dependencies: - "@types/bn.js": "npm:^5.1.1" - "@types/node": "npm:^12.12.6" - bignumber.js: "npm:^9.0.0" - web3-core-helpers: "npm:1.10.4" - web3-core-method: "npm:1.10.4" - web3-core-requestmanager: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 138c5abff27a48d16584fdbe56b940f9efe7cd2463d768f42c5fcdfc97d0dc4fc41e09ff1ffb8c8ff79b22a69e9efbf5af27c4b6a0d888c351202f03a8b01b8e - languageName: node - linkType: hard - -"web3-eth-abi@npm:1.10.4": - version: 1.10.4 - resolution: "web3-eth-abi@npm:1.10.4" - dependencies: - "@ethersproject/abi": "npm:^5.6.3" - web3-utils: "npm:1.10.4" - checksum: c601e45303c607a18f6f8e793aa9c5432fcaf83a34732dc9667b7e2eeb53a4cb8c2dec6fff9f33061fcc5130ec6c8f656f3c3ef962d7ff2af3247f828cffe559 - languageName: node - linkType: hard - -"web3-eth-accounts@npm:1.10.4": - version: 1.10.4 - resolution: "web3-eth-accounts@npm:1.10.4" - dependencies: - "@ethereumjs/common": "npm:2.6.5" - "@ethereumjs/tx": "npm:3.5.2" - "@ethereumjs/util": "npm:^8.1.0" - eth-lib: "npm:0.2.8" - scrypt-js: "npm:^3.0.1" - uuid: "npm:^9.0.0" - web3-core: "npm:1.10.4" - web3-core-helpers: "npm:1.10.4" - web3-core-method: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 994c9f8b3fd8c5fc72e1f2ca6770ad61a2618de2ddc38a898a7d956d22cbdedac7cc683319252a7c9a26c06f337942bf5af84a4ff4001e784e90d061c2733fc2 - languageName: node - linkType: hard - -"web3-eth-contract@npm:1.10.4": - version: 1.10.4 - resolution: "web3-eth-contract@npm:1.10.4" - dependencies: - "@types/bn.js": "npm:^5.1.1" - web3-core: "npm:1.10.4" - web3-core-helpers: "npm:1.10.4" - web3-core-method: "npm:1.10.4" - web3-core-promievent: "npm:1.10.4" - web3-core-subscriptions: "npm:1.10.4" - web3-eth-abi: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 8b0aa58c268b4be94a2ee14ff7fbdd9a2a20b912e580a69cbbbf57493331f60b96d88108ad4deabac3c3810d94483c449b1e5a06b414bc7b1ef326c682603836 - languageName: node - linkType: hard - -"web3-eth-ens@npm:1.10.4": - version: 1.10.4 - resolution: "web3-eth-ens@npm:1.10.4" - dependencies: - content-hash: "npm:^2.5.2" - eth-ens-namehash: "npm:2.0.8" - web3-core: "npm:1.10.4" - web3-core-helpers: "npm:1.10.4" - web3-core-promievent: "npm:1.10.4" - web3-eth-abi: "npm:1.10.4" - web3-eth-contract: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 1296b523a79bd46dc2485d21888454dbca7b7005af5156e58f2515e09f8b30973697a8032429fdaab01d2f8e3e605716789875dadc87cadd3ec9a2ce5d182742 - languageName: node - linkType: hard - -"web3-eth-iban@npm:1.10.4": - version: 1.10.4 - resolution: "web3-eth-iban@npm:1.10.4" - dependencies: - bn.js: "npm:^5.2.1" - web3-utils: "npm:1.10.4" - checksum: b5e33aaf3d41608ed59ea98c703271eefcd30aea15163cda4bc8713f9716eb40b816e8047022ebf71391250983acfe58e65551461109a53e266f4b824c4a0678 - languageName: node - linkType: hard - -"web3-eth-personal@npm:1.10.4": - version: 1.10.4 - resolution: "web3-eth-personal@npm:1.10.4" - dependencies: - "@types/node": "npm:^12.12.6" - web3-core: "npm:1.10.4" - web3-core-helpers: "npm:1.10.4" - web3-core-method: "npm:1.10.4" - web3-net: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 1b0818aa3dc9d58ece45af85ea57ddd3fbc3cd2d8b325e18f2071236ab9e9ba2e878d3f77fddfb9ab1a37ee441209f07302638b13c86bc372b2e22989dc1d903 - languageName: node - linkType: hard - -"web3-eth@npm:1.10.4": - version: 1.10.4 - resolution: "web3-eth@npm:1.10.4" - dependencies: - web3-core: "npm:1.10.4" - web3-core-helpers: "npm:1.10.4" - web3-core-method: "npm:1.10.4" - web3-core-subscriptions: "npm:1.10.4" - web3-eth-abi: "npm:1.10.4" - web3-eth-accounts: "npm:1.10.4" - web3-eth-contract: "npm:1.10.4" - web3-eth-ens: "npm:1.10.4" - web3-eth-iban: "npm:1.10.4" - web3-eth-personal: "npm:1.10.4" - web3-net: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 0da77f76715711cbae7ec0f13300cf5cf364eed2955077f55462f162de9e133305d6534203f50aa786f496b4064d6b46577f30b8f8d0a0cad4476f7e7f30980e - languageName: node - linkType: hard - -"web3-net@npm:1.10.4": - version: 1.10.4 - resolution: "web3-net@npm:1.10.4" - dependencies: - web3-core: "npm:1.10.4" - web3-core-method: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 7f28f58ed1521bd805d63340994be436812e771e8edaa00aea568fa7ae3374746fb5f5aa6ac67632862a739833dfea6ffa92f4df4bca7c394b2608c603e1eda6 - languageName: node - linkType: hard - -"web3-providers-http@npm:1.10.4": - version: 1.10.4 - resolution: "web3-providers-http@npm:1.10.4" - dependencies: - abortcontroller-polyfill: "npm:^1.7.5" - cross-fetch: "npm:^4.0.0" - es6-promise: "npm:^4.2.8" - web3-core-helpers: "npm:1.10.4" - checksum: 2ff27d45cc7c7b1e8f07a7917fe1502fef59e211b2ee97851369f9b6dab99ce81b0bef50f9ecf36286137fc41f1230f04b55b090d30f870fbc5ef1972d165b5f - languageName: node - linkType: hard - -"web3-providers-ipc@npm:1.10.4": - version: 1.10.4 - resolution: "web3-providers-ipc@npm:1.10.4" - dependencies: - oboe: "npm:2.1.5" - web3-core-helpers: "npm:1.10.4" - checksum: cd33a954f59ba3a9ca466dca0d6563f46c56879dc249d885b8edfee077f9f58ccf591ba06855e1d69baba52a8719c03684b0ba7b33d836bfdd4c6166e289c0d4 - languageName: node - linkType: hard - -"web3-providers-ws@npm:1.10.4": - version: 1.10.4 - resolution: "web3-providers-ws@npm:1.10.4" - dependencies: - eventemitter3: "npm:4.0.4" - web3-core-helpers: "npm:1.10.4" - websocket: "npm:^1.0.32" - checksum: 98cb76473ae1060e21ff474768a04c6dcd91724f24a1fac2d4a5f186a35bd2f119605fbb28423dfe5be33755b1e5808b10514ddaf326b57573b447efc84ef730 - languageName: node - linkType: hard - -"web3-shh@npm:1.10.4": - version: 1.10.4 - resolution: "web3-shh@npm:1.10.4" - dependencies: - web3-core: "npm:1.10.4" - web3-core-method: "npm:1.10.4" - web3-core-subscriptions: "npm:1.10.4" - web3-net: "npm:1.10.4" - checksum: 73e497ba841ad378481fa786790fc929808b67d5824a41f48943332033a239028afb360723bcd463254fb0298c767289d749796718c07a3718e944b9b5fb156d - languageName: node - linkType: hard - -"web3-utils@npm:1.10.4": - version: 1.10.4 - resolution: "web3-utils@npm:1.10.4" - dependencies: - "@ethereumjs/util": "npm:^8.1.0" - bn.js: "npm:^5.2.1" - ethereum-bloom-filters: "npm:^1.0.6" - ethereum-cryptography: "npm:^2.1.2" - ethjs-unit: "npm:0.1.6" - number-to-bn: "npm:1.7.0" - randombytes: "npm:^2.1.0" - utf8: "npm:3.0.0" - checksum: 3e586b638cdae9fa45b7698e8a511ae2cbf60e219a900351ae38d384beaaf67424ac6e1d9c5098c3fb8f2ff3cc65a70d977a20bdce3dad542cb50deb666ea2a3 - languageName: node - linkType: hard - -"web3@npm:1.10.4": - version: 1.10.4 - resolution: "web3@npm:1.10.4" - dependencies: - web3-bzz: "npm:1.10.4" - web3-core: "npm:1.10.4" - web3-eth: "npm:1.10.4" - web3-eth-personal: "npm:1.10.4" - web3-net: "npm:1.10.4" - web3-shh: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 3e6132a6fe7a76d071ab89cd4895f816d0af2fea5db04721483e9850e23f8c955a905ad3e583473aff3dcdab6e385eb6d7f727cc05738fb795aeadc0075e2179 - languageName: node - linkType: hard - "webauthn-p256@npm:0.0.10": version: 0.0.10 resolution: "webauthn-p256@npm:0.0.10" @@ -18135,20 +16145,6 @@ __metadata: languageName: node linkType: hard -"websocket@npm:^1.0.32": - version: 1.0.34 - resolution: "websocket@npm:1.0.34" - dependencies: - bufferutil: "npm:^4.0.1" - debug: "npm:^2.2.0" - es5-ext: "npm:^0.10.50" - typedarray-to-buffer: "npm:^3.1.5" - utf-8-validate: "npm:^5.0.2" - yaeti: "npm:^0.0.6" - checksum: b72e3dcc3fa92b4a4511f0df89b25feed6ab06979cb9e522d2736f09855f4bf7588d826773b9405fcf3f05698200eb55ba9da7ef333584653d4912a5d3b13c18 - languageName: node - linkType: hard - "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -18392,17 +16388,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:^3.0.0": - version: 3.3.3 - resolution: "ws@npm:3.3.3" - dependencies: - async-limiter: "npm:~1.0.0" - safe-buffer: "npm:~5.1.0" - ultron: "npm:~1.1.0" - checksum: 4b4a7e5d11025e399d82a7471bfb4818d563c892f5d953c2de937d262bd8e8acc8b340220001c01f8392574fccbc2df153d6031e285b8b38441187ea0c2cfd72 - languageName: node - linkType: hard - "ws@npm:^8.13.0": version: 8.16.0 resolution: "ws@npm:8.16.0" @@ -18433,42 +16418,6 @@ __metadata: languageName: node linkType: hard -"xhr-request-promise@npm:^0.1.2": - version: 0.1.3 - resolution: "xhr-request-promise@npm:0.1.3" - dependencies: - xhr-request: "npm:^1.1.0" - checksum: 49ec3474884858faa55349894b1879c872422a24485097c8b71ba9046027d27f1d54eb61dfdb9d72e78892c7371d22d9cc6a4e101b6767bb4df89a0b6d739f85 - languageName: node - linkType: hard - -"xhr-request@npm:^1.0.1, xhr-request@npm:^1.1.0": - version: 1.1.0 - resolution: "xhr-request@npm:1.1.0" - dependencies: - buffer-to-arraybuffer: "npm:^0.0.5" - object-assign: "npm:^4.1.1" - query-string: "npm:^5.0.1" - simple-get: "npm:^2.7.0" - timed-out: "npm:^4.0.1" - url-set-query: "npm:^1.0.0" - xhr: "npm:^2.0.4" - checksum: 531c5e1e47d2e680c1ae1296af7fa375d752cd83c3fa1f9bd9e82fc4fb305ce8e7aaf266256e82bbd34e2a4891ec535bcc4e9f8db2691ab64bb3b6ff40296b9a - languageName: node - linkType: hard - -"xhr@npm:^2.0.4, xhr@npm:^2.3.3": - version: 2.6.0 - resolution: "xhr@npm:2.6.0" - dependencies: - global: "npm:~4.4.0" - is-function: "npm:^1.0.1" - parse-headers: "npm:^2.0.0" - xtend: "npm:^4.0.0" - checksum: 31f34aba708955008c87bcd21482be6afc7ff8adc28090e633b1d3f8d3e8e93150bac47b262738b046d7729023a884b655d55cf34e9d14d5850a1275ab49fb37 - languageName: node - linkType: hard - "xml2js@npm:0.5.0": version: 0.5.0 resolution: "xml2js@npm:0.5.0" @@ -18507,14 +16456,7 @@ __metadata: languageName: node linkType: hard -"yaeti@npm:^0.0.6": - version: 0.0.6 - resolution: "yaeti@npm:0.0.6" - checksum: 6db12c152f7c363b80071086a3ebf5032e03332604eeda988872be50d6c8469e1f13316175544fa320f72edad696c2d83843ad0ff370659045c1a68bcecfcfea - languageName: node - linkType: hard - -"yallist@npm:^3.0.0, yallist@npm:^3.0.2, yallist@npm:^3.1.1": +"yallist@npm:^3.0.2": version: 3.1.1 resolution: "yallist@npm:3.1.1" checksum: 9af0a4329c3c6b779ac4736c69fae4190ac03029fa27c1aef4e6bcc92119b73dea6fe5db5fe881fb0ce2a0e9539a42cdf60c7c21eda04d1a0b8c082e38509efb