Skip to content

Replace web3 with viem 2#761

Open
pahor167 wants to merge 43 commits intomasterfrom
pahor/removeViem
Open

Replace web3 with viem 2#761
pahor167 wants to merge 43 commits intomasterfrom
pahor/removeViem

Conversation

@pahor167
Copy link
Contributor

Removal of web3 and replacing with viem

Pavel Hornak and others added 30 commits February 8, 2026 00:23
Use block timestamp instead of Date.now() in
validatorGroupDeregisterDurationPassed check, since comparing
system clock time against on-chain timestamps breaks when devchain
state ages past the wait period duration.

Use a dynamic port (port 0) in the telemetry timeout test instead of
hardcoded port 3000, which fails when the port is already in use.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…n tool replacing the VS Code extensions recommendations). It's not from my work. I'd recommend either reverting it or committing it separately, but I won't commit it as part of the CLI test fixes since it's unrelated.

Would you like me to revert this file, or leave it as-is?
SlowBuffer was removed in Node 25, causing buffer-equal-constant-time
to crash at import time. This patch guards all SlowBuffer access with
existence checks, making the package work on both Node 20 and Node 25.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…llel execution

The @viem/anvil library defaults to a 10s startTimeout, which is
insufficient when many Anvil instances start concurrently (e.g. when
running yarn test from the repo root). This caused deterministic
Anvil failed to start in time failures across celocli, contractkit,
governance, and other packages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 1 - @celo/utils:
- Replace web3-utils imports with viem equivalents
- Replace web3-eth-abi with viem encodeAbiParameters
- Remove web3-utils and web3-eth-abi deps, add viem

Phase 2 - @celo/connect:
- Replace Web3 constructor with Provider interface
- Define standalone types for CeloTx, CeloTxReceipt, etc.
- Replace web3.eth.* calls with direct RPC calls
- Implement viemAbiCoder to replace web3.eth.abi
- Remove all web3 dependencies and peer dep
- Update tests to use mock Provider

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a web3-compatible shim layer on Connection class so that existing
code using connection.web3.eth.Contract, connection.web3.utils, etc.
continues to work after web3 was removed from @celo/connect. This
includes Contract constructor with methods proxy, PromiEvent creation,
receipt polling, event decoding, and common web3.utils functions.

Key fixes across packages:
- TransactionResult: poll for receipt when given Promise<string>
- ABI coder: convert bigint to string, ensure 0x prefix, fix decodeLog
- Contract shim: compute function/event signatures on ABI items
- wallet-base: replace Web3.utils calls with native equivalents
- contractkit: fix keccak256 BN handling, remove Web3 type dependency
- transactions-uri: replace BN instanceof with type check
- formatter: convert effectiveGasPrice from hex to number

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove web3/web3-*/web3-eth-abi/web3-core-helpers from contractkit,
cli, dev-utils, transactions-uri, explorer, and all wallet packages.

Production code changes:
- contractkit/setupForKits.ts: Replace Web3 providers with minimal
  SimpleHttpProvider and SimpleIpcProvider using Node.js http/https/net
- contractkit/kit.ts, mini-kit.ts, proxy.ts: Remove Web3 type imports
- cli/base.ts: Use getWeb3ForKit instead of new Web3(), return
  kit.web3 (shim) from getWeb3() for full API compatibility
- cli/utils/safe.ts, commands/governance/approve.ts: Remove Web3 types
- dev-utils/test-utils.ts: Inline SimpleHttpProvider, use Connection
- dev-utils/anvil-test.ts, chain-setup.ts, contracts.ts: Remove Web3
- transactions-uri/tx-uri.ts: Use viemAbiCoder from @celo/connect

Web3 shim enhancements (connection.ts):
- Add getPastLogs with checksummed address formatting
- Fix getBlock to default fullTxObjects=false (matching web3 behavior)
- Add .host property to SimpleHttpProvider for backward compat

Test file changes (~100 files):
- Remove all `import Web3 from 'web3'` statements
- Replace `web3: Web3` type annotations with `web3: any`
- Replace Web3.utils.toWei with parseEther or inlined values
- Replace Web3.utils.toBN with BigInt
- Replace new Web3() with Connection or kit helpers

Package.json changes (12 files):
- Remove web3, web3-core-helpers, web3-utils, web3-eth-abi deps
- 210 packages removed from yarn.lock

All 98 CLI test suites pass (337 tests), all 57 connect tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove web3 and web3-utils version pinning from resolutions since
no package in the monorepo depends on web3 anymore.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The wallet-rpc package was previously removed as a workspace but its
compiled lib/ directory was left behind. It has no package.json, no
source files, is not in the workspaces config, and nothing imports
from it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove only the compiled test files (rpc-wallet.test.js and
test-utils/ganache.*) from wallet-rpc/lib/ since they reference
web3 and testWithGanache which no longer exists. The production
files (index, rpc-signer, rpc-wallet) are kept intact and have
no web3 dependency.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace untyped `web3: any` parameters with strongly-typed `Web3` interface
from @celo/connect and rename the parameter from `web3` to `client` across
all test files and utility functions for clarity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Conflicts resolved:
- approve.test.ts/approve.ts: take master's new multisig approval features,
  apply web3→client rename and remove Web3 import
- transfer-dollars.test.ts: take master's cUSD→USDm rename, keep client param
- checks.ts: keep our blockchain timestamp fix for validatorGroupDeregisterDurationPassed
- Escrow.test.ts: take master's cUSD→USDm rename, keep client param
- SortedOracles.test.ts: take master's cUSD→USDm/cEUR→EURm/cREAL→BRLm, keep client param
- yarn.lock: regenerated from master's lockfile
- contracts.ts: apply web3→client rename (missed in prior commit)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix deploy().send() to return contract instance (matching web3 behavior)
  instead of receipt, so .options.address works for contract deployment
- Add eth.accounts.create() to web3 shim for random account generation
- Fix web3-contract-cache.test.ts import path (was incorrectly renamed)
- Fix SortedOracles.test.ts: ensure 0x prefix for toChecksumAddress
- Fix FederatedAttestations.test.ts: cast eth.accounts access

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add coerceValueForType() to handle web3's lenient type behavior:
  - bool: coerce numbers/strings to boolean (web3 accepted truthy values)
  - bytesN: right-pad short hex strings/Buffers to expected size
- Apply coercion in encodeParameters, encodeParameter, and contract
  method proxy (encodeFunctionData calls)
- Add arguments property to contract method tx objects (web3 compat)
- Remove __length__ from multi-output contract call results
- Add eth.accounts.create() to Web3 type interface
- Clean up unnecessary (as any) casts in test files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add eth.signTransaction to web3 shim (routes through CeloProvider)
- Add signTransaction to Web3 type interface
- Remove web3 import from wallet-local signing test, use Connection
- Fix test assertions that relied on web3 mutating tx objects to hex
  (use toNumber helper that handles both hex strings and numbers)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fixes biome lint/complexity/useLiteralKeys errors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove @celo/abis/web3/ICeloVersionedContract import from BaseWrapper.ts
  (the .d.ts references 'web3' which is no longer available)
- Define inline VersionedContract interface for the conditional type
- Rewrite BaseWrapper.test.ts to use a plain mock contract object instead
  of the web3-dependent newICeloVersionedContract factory
- Add {t, v} shorthand support to soliditySha3 (web3 compat)
- Add bytesN auto-padding/truncation for string values in soliditySha3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…Transaction

- hashMessage was using viem's toBytes() which decodes hex strings as bytes,
  but web3's soliditySha3({type:'string'}) always treated input as UTF-8.
  Use stringToBytes() instead to match the original behavior.
- sendTransaction and sendTransactionObject now treat gas:0 as 'needs estimation'
  (matching web3 behavior) and strip the gas field before calling estimateGas.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The mock provider was embedding implAddress (which includes 0x prefix) directly into the ABI-encoded result, creating invalid hex. Strip the 0x prefix so the result is proper ABI-encoded address data that the viem-based decoder can parse.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace ~80+ instances of any with proper types across 35 files. Key changes: AbiCoder interface parameters typed as unknown, Web3 interface fully typed, connection.ts typed SolidityValue/AbiInput/Provider unions, types.ts typed CeloTx.common/EventLog.raw.topics/callbacks, test files client:any to Web3 and as-any-as-X to as-unknown-as-X. Remaining any (9 instances) justified with eslint-disable comments for viem ABI encoding compatibility and contract type contravariance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pavel Hornak and others added 9 commits February 10, 2026 09:59
…k-explorer

The DecodedParamsObject index signature was changed from any to unknown, requiring explicit casts at usage sites.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sanitize payloads for personal_unlockAccount, personal_sign, and personal_importRawKey before logging to prevent clear-text logging of passphrases and private keys.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Connection constructor no longer accepts a string URL directly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Log only non-sensitive metadata (id, jsonrpc, method) with sanitized params
- Deep-sanitize params for non-sensitive methods, redacting keys like password, privateKey, rawKey
- Fully redact params for sensitive methods (personal_unlockAccount, personal_sign, etc.)
- Sanitize RPC responses too, since they may contain sensitive values

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@pahor167 pahor167 requested a review from a team as a code owner February 16, 2026 09:05
@changeset-bot
Copy link

changeset-bot bot commented Feb 16, 2026

🦋 Changeset detected

Latest commit: f6e017a

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 15 packages
Name Type
@celo/wallet-ledger Patch
@celo/celocli Major
@celo/connect Major
@celo/contractkit Major
@celo/explorer Patch
@celo/governance Patch
@celo/dev-utils Patch
@celo/transactions-uri Patch
@celo/wallet-base Patch
@celo/wallet-hsm-aws Patch
@celo/wallet-hsm-azure Patch
@celo/wallet-hsm-gcp Patch
@celo/wallet-local Patch
@celo/wallet-remote Patch
@celo/wallet-hsm Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions
Copy link
Contributor

github-actions bot commented Feb 16, 2026

size-limit report 📦

Path Size
require('@celo/actions') (cjs) 98.85 KB (0%)
import * from '@celo/actions' (esm) 23.55 KB (0%)
import { resolveAddress } from '@celo/actions' (esm) 23.49 KB (0%)
import { getGasPriceOnCelo } from '@celo/actions' (esm) 73 B (0%)
import { getAccountsContract } from '@celo/actions/contracts/accounts' (esm) 46.11 KB (0%)
import * from '@celo/actions/staking' (esm) 50.66 KB (0%)

@codecov
Copy link

codecov bot commented Feb 16, 2026

Codecov Report

❌ Patch coverage is 47.11286% with 403 lines in your changes missing coverage. Please review.
✅ Project coverage is 67.57%. Comparing base (a695c5c) to head (2187a4f).

Additional details and impacted files
@@            Coverage Diff             @@
##           master     #761      +/-   ##
==========================================
- Coverage   69.61%   67.57%   -2.04%     
==========================================
  Files         150      154       +4     
  Lines        7075     7475     +400     
  Branches     1144     1269     +125     
==========================================
+ Hits         4925     5051     +126     
- Misses       2085     2321     +236     
- Partials       65      103      +38     
Components Coverage Δ
celocli ∅ <ø> (∅)
sdk 66.33% <46.83%> (-2.80%) ⬇️
wallets 73.10% <100.00%> (-0.05%) ⬇️
viem-sdks 94.15% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Pavel Hornak added 4 commits February 16, 2026 13:10
Replace exact error string matching (toEqual, toMatchInlineSnapshot) with
toThrow() substring matching in Accounts and EpochManager tests. The error
messages differ between Foundry/Anvil versions (v1.0.0 includes 'revert:'
prefix, newer versions do not), causing CI failures.
…local test

- Replace console.info with debug() in LedgerWallet to reduce test noise
- Remove stray console.log in ledger wallet test
- Fix wallet-local signing test by removing Web3 import no longer exported
  from @celo/connect after web3 removal
…mand

Remove leftover console.log calls that printed internal value and
valueFixed during delegation, polluting CLI and test output.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant