Skip to content

Ekubo v3.2

Choose a tag to compare

@moodysalem moodysalem released this 03 Jul 18:37
· 18 commits to main since this release
de94c77

v3.2.0 introduces the Ve33 pool system, signed exclusive swaps, unified routing for forwarded swap extensions, pool-key discovery, and new staking, liquidity-position, emission, and data-fetching components.

This release contains all changes since v3.1.1. See the full comparison.

Deployments

Ekubo V3 is live on Ethereum, Optimism, BNB Smart Chain, Gnosis, Unichain, Polygon, Monad, Robinhood Chain, Base, Arbitrum, and Ink, and is deployed but not yet functional on World Chain and MegaETH, which have not enabled EIP-7939 (CLZ).

Deployment addresses now live in the documentation, not in this release body: see EVM Contracts (V3) for the shared deterministic addresses, the per-chain support table, and which Positions and Orders generation is canonical on each chain. Keeping one address list means it can be corrected as chains are added, rather than going stale inside a published release.

Anyone can deploy the shared contracts to another compatible network with the v3.2.0 DeployAll script. Chains must support both EIP-1153 (TSTORE) and EIP-7939 (CLZ) for the contracts to function; an existing deployment becomes functional as soon as its chain adds support, with no redeployment required.

Positions deployment note: BasePositions now overrides saltToId to truncate generated liquidity-position NFT IDs to uint192, so the whole token ID is used directly as the Core position salt. Enabling that override required marking BaseNonfungibleToken.saltToId as virtual, which changed the compiled Orders bytecode too — so both managers moved to new deterministic addresses, even though Orders.sol itself is unchanged. Both releases pin solc 0.8.33; this is a source change, not a recompilation. There is no manager migration: on chains that carry both generations, the original v3.1.1 deployment remains canonical. The documentation table records which generation applies per chain.

Contracts added or reworked in v3.2.0—including Ve33, VeToken, Ve33Positions, SignedExclusiveSwap, PoolKeyIndex, MintableERC20, and the configurable Router—are deployment- or configuration-specific and have no universal address.

Changelog

All entries below are relative to v3.1.1.

Added

  • Added Ve33, a forward-only ve(3,3)-style pool extension with vote-escrowed staking, linearly decaying voting power, pool voting, voter-selected swap fees, voter fee accounting and claims, scheduled stake-token emissions, and single-token LP rewards.
  • Added VeToken, a transferable ERC-721 wrapper for Ve33 stakes. It supports timestamp-, duration-, and maximum-duration staking; increasing and extending stakes; splitting and merging; voting and clearing votes; claiming voter fees; withdrawing expired stakes; and composed claim-before-extend or claim-before-merge flows.
  • Added VeTokenMetadata for fully on-chain VeToken JSON and SVG metadata.
  • Added Ve33Positions, an ERC-721 manager for Ve33 LP positions with pool initialization, deposits, withdrawals, reward views, reward claims, and bundled claim-before-withdraw flows. Ve33 positions do not charge position-level protocol fees or collect Core swap fees.
  • Added Ve33Periphery for funding permissionless emission schedules and Ve33EmissionRateScheduler for minting and scheduling forward-looking top-ups toward an owner-configured target emission rate.
  • Added Ve33DataFetcher for combined Core and Ve33 quote data, current voted swap fees, and global emission-schedule state.
  • Added IVe33, Ve33Lib, Ve33StorageLayout, and supporting stake, vote, pool-fee, reward, and emission types.
  • Added SignedExclusiveSwap, a forward-only extension for controller-signed EIP-712 swaps. It supports EOA and ERC-1271 controllers, optional locker authorization, deadlines, nonce replay protection, signed minimum balance-update constraints, per-swap fees, and deferred fee donation to LPs.
  • Added ISignedExclusiveSwap, SignedExclusiveSwapLib, SignedSwapMeta, ControllerAddress, and signed-swap pool-state helpers.
  • Added PoolKeyIndex, an optional registry for discovering initialized pool keys by pool ID, token, or extension.
  • Added MintableERC20 and IMintableERC20 for owner-controlled token minting with constructor-defined name, symbol, and decimals.

Changed

  • Extracted shared single-hop, multihop, quote, slippage-check, and settlement logic into BaseRouter. The RouteNode, TokenAmount, and Swap types now live in src/base/BaseRouter.sol.
  • Updated Router to execute ordinary Core swaps and forward swaps for its configured MEV Capture and Ve33 extensions. Its constructor is now Router(ICore core, address mevCapture, address ve33).
  • Constrained generated IDs for BasePositions-based liquidity-position NFTs to 192 bits so the complete NFT ID can be used as the Core position salt.
  • Updated RevenueBuybacks.roll(...) to approve only the exact ERC-20 amount required by each order and reset the approval to zero afterward.

Removed

  • Removed the standalone MEVCaptureRouter source contract; MEV Capture support now lives in the configurable Router. The existing v3.1.1 deployment is unaffected.
  • Removed IRevenueBuybacks.approveMax(...).

Documentation and security review material