[twocrypto] Update implementations for twocrypto pools (fx&yb)

Summary

This vote updates the twocrypto Factory implementation slots for donation-enabled pools following the merge of the latest implementation work in twocrypto-ng.

The main change is to register the updated fx50 implementation, while clearing the yb and fx25 implementation ids. This keeps the Factory state aligned with the implementation that is ready for new deployments, while avoiding stale or superseded implementation references.

The implementation continues the donation-enabled twocrypto work from the previous posts, with additional simplification, hardening, and audit-driven changes. The external interfaces remain compatible with the previous donation-enabled design.

Vote link: Curve.finance

Background

Previous related governance posts:

Relevant implementation work:

The reserve_profit_fraction work is grounded in the YB pool analysis and follow-up improvements described here:

Motivation

Donation-enabled twocrypto pools are intended to support FX-like and yield-basis-style markets where pool re-centering may need an explicit budget, instead of relying only on swap fees or external arbitrage.

The latest implementation improves this design in several ways:

  • Adds future-proof fee hooks, making it easier to support additional fee logic without changing the pool architecture.
  • Adds reserve_profit_fraction, following the YB pool analysis linked above, allowing the pool to reserve part of the profit budget for controlled re-centering instead of exposing all of it immediately to arbitrage.
  • Simplifies and hardens the donation / profit accounting.
  • Reworks the admin-fee structure so the implementation can support the intended fee policy more cleanly.
  • Unifies the implementation path for yb and FX-style pools, reducing fragmentation between closely related variants.

Security

The updated implementation has been audited. There are no open findings left.

The audit report is expected to be published soon.

The review covered the donation-enabled accounting, fee handling, and rebalancing-related changes. Several hardening changes were incorporated during the process, and the final merged implementation reflects the resolved audit feedback.

Specification

Factory:

0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F

Updated implementation:

TwoCrypto fx50

  • Implementation: 0x94D8e42c786C090bC5378D205C5C531D6247BC3D
  • id: keccak256("fx50")

Cleared implementation ids:

  • yb: set to 0x0000000000000000000000000000000000000000
  • fx25: set to 0x0000000000000000000000000000000000000000

Existing pools are unaffected. This only changes which implementation contracts the Factory serves for future deployments under these ids.

DAO actions

set_pool0_impl = (
    FACTORY,
    "set_pool_implementation",
    "0x0000000000000000000000000000000000000000",
    int(keccak(text="yb").hex(), 16),
)

set_pool25_impl = (
    FACTORY,
    "set_pool_implementation",
    "0x0000000000000000000000000000000000000000",
    int(keccak(text="fx25").hex(), 16),
)

set_pool50_impl = (
    FACTORY,
    "set_pool_implementation",
    "0x94D8e42c786C090bC5378D205C5C531D6247BC3D",
    int(keccak(text="fx50").hex(), 16),
)

If passed, the Factory will serve the updated fx50 implementation for new pools, while the yb and fx25 slots will be cleared.

4 Likes