Skip to content

feat: #2392 add Renzo liquid restaking protocol integration - #2421

Open
zkasuran wants to merge 3 commits into
KeeperHub:stagingfrom
zkasuran:feat/renzo
Open

feat: #2392 add Renzo liquid restaking protocol integration#2421
zkasuran wants to merge 3 commits into
KeeperHub:stagingfrom
zkasuran:feat/renzo

Conversation

@zkasuran

Copy link
Copy Markdown

Issue

Closes #2392

What this changes

Adds Renzo as a new ABI-driven protocol plugin. Renzo is a liquid restaking protocol on Ethereum: users deposit native ETH into the Restake Manager and receive ezETH, a non-rebasing token that accrues staking plus EigenLayer restaking rewards.

Four actions exposed:

  • stake (write): deposit ETH via depositETH() on the Restake Manager
  • paused (read): check whether deposits are halted
  • ez-balance-of (read): ezETH balance of an address
  • ez-total-supply (read): total ezETH in circulation

Mainnet only. Renzo has no testnet deployment (verified against official docs and Sepolia/Holesky/Goerli explorers).

Files:

  • protocols/renzo.ts + ABIs under protocols/abis/renzo-*.json
  • tests/unit/protocol-renzo.test.ts (18 cases: shape, slug uniqueness, chain inclusion/exclusion, address verification, registry round-trip)
  • tests/integration/protocol-renzo-onchain.test.ts (4 on-chain cases via provider.call and estimateGas against deployed bytecode)
  • tests/unit/__goldens__/protocol-calldata/renzo.json (bound-encode calldata golden)
  • docs/plugins/renzo.md with a "Why no testnet entry" section, key in _meta.ts, row in overview.md
  • public/protocols/renzo.png (real logo from Trust Wallet assets, 256x256)

Contract addresses verified on-chain 2026-09-10: RestakeManager at 0x74a09653A083691711cF8215a6ab074BB4e99ef5 (paused() false, renzoOracle() live); ezETH at 0xbf5495Efe5DB9ce00f80364C8B423567e58d2110 (name "Renzo Restaked ETH", ~41k ETH supply).

Scope

One change. The protocol definition, its tests, its golden, its docs page and its logo are interdependent: the golden and on-chain tests import the definition, the docs page describes the actions it exposes.

How it was verified

  • pnpm vitest run tests/unit/protocol-renzo.test.ts: 18/18 passed
  • UPDATE_GOLDENS=1 pnpm vitest run tests/unit/protocol-calldata.test.ts: 515/515 passed (renzo golden generated and pinned)
  • pnpm vitest run tests/unit/protocol-calldata.test.ts: golden matches
  • tsgo --noEmit: clean (only pre-existing @workflow/builders miss)
  • biome check on all touched files: clean

On-chain integration test (protocol-renzo-onchain.test.ts) validates all four actions against deployed mainnet bytecode via eth_call. Runs on public RPC, no wallet needed.

Screenshots

No rendered UI changes.


  • Targets staging
  • Title carries the issue number, or an exemption applies
  • pnpm check and pnpm type-check pass
  • No secrets, .env files, or credentials committed

AI assistance (Claude, Anthropic) was used in developing this change. The design, review and verification were done by the author. Verified locally: unit tests (18/18), calldata goldens (515/515), tsgo and biome clean, on-chain integration tests against deployed mainnet bytecode.

Add Renzo as a new protocol plugin (mainnet only):
- protocols/renzo.ts with depositETH write, paused gate, ezETH balance
  and totalSupply reads
- On-chain integration test (protocol-renzo-onchain.test.ts)
- Unit test with 18 cases including chain exclusion assertions
- Calldata golden for bound-encode regression coverage
- docs/plugins/renzo.md with "Why no testnet entry" section
- _meta.ts key and overview.md row
- Logo from Trust Wallet assets (256x256 PNG)
@github-actions

Copy link
Copy Markdown
Contributor

About the build check on this pull request

This pull request comes from a fork, so GitHub does not pass it the credentials build normally uses for our image registry cache and staging build configuration. The build still runs and still compiles the image, so a red build here is real; it just takes longer than on team branches.

Every workflow run on a pull request from a fork also waits for a maintainer to approve it, so checks can sit at "awaiting approval" for a while after each push. Nothing is needed from you for either of these.

Resolve conflict in lib/types/integration.ts (generated file, regenerated
via discover-plugins after taking the upstream version).
The ezETH ABI had unnamed outputs (name: ""), which means
structureAbiOutputs returns the bare scalar rather than wrapping
it in { totalSupply: value }. The testData expectations reference
field: "totalSupply" and field: "balance", which resolve against
the named output keys. Name them in the ABI and key the overrides
to the ABI names instead of "result".
@zkasuran

zkasuran commented Sep 12, 2026

Copy link
Copy Markdown
Author

@suisuss, my PR for this is #2421. It covers every item from your acceptance comment:

  • protocols/renzo.ts + ABIs with named outputs (balance, totalSupply) so field: expectations resolve through structureAbiOutputs
  • testData declared, calldata golden committed at tests/unit/__goldens__/protocol-calldata/renzo.json
  • docs/plugins/renzo.md with the "Why no testnet entry in the plugin" section, key in _meta.ts, row in overview.md
  • tests/integration/protocol-renzo-onchain.test.ts (4 on-chain cases modeled on protocol-aave-v4-onchain.test.ts, vi.mock("server-only"), one test per action)
  • tests/unit/protocol-renzo.test.ts (18 cases: duplicate-slug check, chain-exclusion assertions for Sepolia/Holesky/Goerli/Base/Arbitrum, verified addresses, shape)
  • public/protocols/renzo.png (real logo from Trust Wallet assets, 256x256)
  • No coverage runner, no chain-test-data.ts extension

tsgo clean, biome clean, unit 18/18, calldata goldens 515/515. Rebased on current staging, merge conflict resolved. Ready for CI approve-run whenever you have a moment.

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.

feat(protocols): add Renzo liquid restaking (stake for ezETH, pause gate, reads)

1 participant