refactor(explorer,governance,wallets,dev-utils): migrate to viem [3/8]#768
refactor(explorer,governance,wallets,dev-utils): migrate to viem [3/8]#768pahor167 wants to merge 1 commit into
Conversation
- explorer: replace web3 Contract with viem getContract(), remove deprecated ABI helpers - governance: replace createViemTxObject with encodeFunctionData in ProposalBuilder - wallets: replace web3 signing utils with viem equivalents across all HSM/ledger/local wallets - dev-utils: chain-setup and test utils use viem client - transactions-uri: remove web3 dependency
|
There was a problem hiding this comment.
π‘ Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7a57a73ca2
βΉοΈ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with π.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| 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 |
There was a problem hiding this comment.
Preserve integer precision in string-to-hex conversion
stringNumberToHex now converts string inputs via Number(num).toString(16), which loses precision for many on-chain values above 2^53 (for example 1000000000000000001). Since this helper is used for value, gasPrice, maxFeePerGas, etc., transactions can be encoded with silently wrong amounts and then signed/broadcast incorrectly. Convert decimal strings with bigint/string arithmetic instead of Number.
Useful? React with πΒ / π.
| async fetchBlockByHash(blockHash: string): Promise<Block> { | ||
| return this.kit.connection.getBlock(blockHash) | ||
| return this.kit.connection.viemClient.getBlock({ blockHash: blockHash as `0x${string}` }) | ||
| } | ||
| async fetchBlock(blockNumber: number): Promise<Block> { | ||
| return this.kit.connection.getBlock(blockNumber) | ||
| return this.kit.connection.viemClient.getBlock({ blockNumber: BigInt(blockNumber) }) |
There was a problem hiding this comment.
Fetch blocks with full transactions for parser compatibility
These getBlock calls omit includeTransactions: true, so viem returns transaction hashes by default; parseBlock then skips all string entries (typeof tx !== 'string'), leaving parsedTx empty even when blocks contain known calls. This is a functional regression from the previous Connection.getBlock(..., fullTxObjects=true) behavior and breaks block parsing results.
Useful? React with πΒ / π.
β¦es (#780) ## Summary Combined branch containing the full web3 β viem migration (the union of the stacked PRs #766β#773) plus 24 commits of review fixes from a deep multi-agent audit of the cumulative diff (~350 files). ### Migration (from the original stack) - `@celo/connect`, `@celo/utils`: web3 replaced with viem-native primitives (#766) - `@celo/contractkit`: viem-native contract interaction across all wrappers (#767) - `@celo/explorer`, `@celo/governance`, wallets, dev-utils (#768) - `@celo/celocli`: all command groups migrated (#769β#773) ### Review fixes on top (highlights, 38 findings fixed) Funds/correctness critical: - wallet-base: tx quantities above 2^53 were silently truncated when hex-encoding (`1 CELO + 1 wei` signed as exactly 1 CELO); now BigInt-backed with a regression test - connect: `defaultFeeCurrency` was silently ignored for every `contract.write`; dynamic chain now carries the Celo serializers/formatters so CIP-64 serializes correctly - contractkit: IPC provider hung forever (parsed only on socket `end`); ws:// / wss:// node URLs fell through to the HTTP provider; HTTP error statuses resolved `undefined` - contractkit: `setAccount` without proof-of-possession always threw (`'0x0'` as bytes32); `Attestations.getPendingWithdrawals` parameter order restored to match the contract - cli: `releasecelo:admin-revoke` lost the `{from: voteSigner}` override β revokes reverted with an authorized vote signer - connect: fee-math radix bug inflated `maxFeePerGas` for string inputs High: - tuple-blind ABI signatures produced wrong selectors/topic hashes (ABI enrichment, `methodIds`, log-explorer event matching) - `BaseWrapper.getPastEvents` swallowed RPC errors as "no events"; unknown event names now throw (web3 parity) - Election historical `blockNumber` queries were silently ignored (voter rewards at past epochs) - governance CLI commands no longer displayed on-chain event confirmations (ProposalExecuted / HotfixExecuted / HotfixApproved / Deposit) β restored, including the silently-dropped test snapshots - `isValidChecksumAddress` accepted all-lowercase addresses; sourcify proxy implementation address checksummed again - BigInt-safe JSON-RPC serialization in production providers Plus test-semantics restorations (weakened assertions, mocked-method-under-test), test-infra robustness (receipt waits, strict `evm_revert`), changeset corrections (contractkit correctly marked major with full breaking-change list), and documentation of behavior changes. Full audit trail (62 findings: 38 fixed, 12 refuted with evidence, the rest classified pre-existing/wontfix) lives in `.omc/ralph/pr-review-progress.md` on the working machine; findings are also traceable through the individual commit messages. ## Test plan - [x] Full workspace build green (all 23 packages) - [x] Full test suite: all packages green locally except known env-flaky timeouts under full parallel load (actions/keystores) and a pre-existing `election:activate --wait` snapshot-order flake that reproduces on the unmodified stack HEAD - [x] Anvil-backed suites green: contractkit 258/258, celocli 337 passed - [x] Live smoke tests: IPC provider against `anvil --ipc`, WebSocket provider against `wss://forno.celo.org/ws` - [ ] CI green on this PR --------- Co-authored-by: Pavel Hornak <pavel.hornak@clabs.co> Co-authored-by: Paul Lange <palango@gmx.de>
Stack
Changes
getContract(), remove deprecated ABI helperscreateViemTxObjectwithencodeFunctionDatainProposalBuilderchain-setupand test utils use viem clientPart of the web3 β viem migration. No CI requirement on this PR.
PR-Codex overview
This PR focuses on updating dependencies, improving code consistency, and enhancing the handling of transactions and contracts within the SDK. It transitions from using
Web3toviemfor transaction handling and modifies various files to accommodate this change.Detailed summary
package.jsonfiles to includeviemand remove or replaceWeb3.Web3methods toviemmethods.bigintReplacerfunction for JSON serialization ofBigInt.kit._contractsinstead ofkit._web3Contracts.newKitFromProviderinstead ofnewKitFromWeb3.Web3.utils.toWeito direct numeric values usingparseEther.