github centrifuge/protocol v3.1.0

latest releases: deploy-testnet-v3.2-2403256, deploy-testnet-v3.2-41e1997, v3.2.0...
3 months ago

v3.1.0 delivers two major capabilities for building on Centrifuge:

1. Pluggable Request Management

The request handling layer is now fully modular. You can:

  • Use the default BatchRequestManager for epoch-based deposit/redeem flows with built-in queuing and cancellation support
  • Build custom request managers by implementing IHubRequestManager , handle requests your way while the Hub manages accounting

2. On-Chain NAV & Pricing

Pools can now compute NAV and share prices entirely on-chain:

  • NAVManager maintains per-network double-entry accounting (equity, liability, gain, loss accounts) and calculates NAV
  • SimplePriceManager derives share prices from NAV and issuance, updating automatically when holdings sync
  • QueueManager triggers cross-chain sync of queued assets and shares with configurable delays

This enables fully on-chain NAV calculation and share price derivation.


Integration Points

Request Manager Interface

To build a custom request manager, implement:

interface IHubRequestManager {
    function request(PoolId poolId, ShareClassId scId, AssetId assetId, bytes calldata payload) external;
}

interface IHubRequestManagerNotifications {
    function notifyDeposit(PoolId, ShareClassId, AssetId, bytes32 investor, uint32 maxClaims, address refund) external payable;
    function notifyRedeem(PoolId, ShareClassId, AssetId, bytes32 investor, uint32 maxClaims, address refund) external payable;
}

Communicate results back to Hub via IHubRequestManagerCallback.requestCallback().

NAV Hook Interface

To receive NAV updates (e.g., for custom pricing logic):

interface INAVHook {
    function onUpdate(PoolId poolId, ShareClassId scId, uint16 centrifugeId, uint128 netAssetValue) external;
    function onTransfer(PoolId, ShareClassId, uint16 fromCentrifugeId, uint16 toCentrifugeId, uint128 sharesTransferred) external;
}

Register your hook via NAVManager.setNAVHook(poolId, yourHook).

Queue Sync (Spoke-side)

Trigger batched cross-chain updates:

IQueueManager.sync(poolId, scId, assetIds, refundAddress);

Configurable minDelay prevents spam; extraGasLimit handles complex cross-chain calls.

Delegated Permissions

Grant limited permissions without ward access:

Role Scope Configured Via
Hub Manager All Hub + BatchRequestManager operations per pool Hub.updateHubManager()
Hub Request Manager Request handling per pool/network (NEW) Hub.setRequestManager()
Spoke Request Manager Spoke request routing per pool (was per pool/scId/assetId) Hub.setRequestManager()
Hook Manager Memberlist + freeze per token Hub -> UpdateHookManager trusted call
Gateway Manager Gateway operations per pool Hub.updateGatewayManager()
NAV Manager NAV operations per pool NAVManager.updateManager()
BalanceSheet Manager Balance operations per pool Cross-chain updateManager message

Breaking Changes

Change Migration
Directory restructure: src/common/ -> src/core/ Update all import paths
Directory restructure: src/{hub, spoke}/ -> src/core/{hub, spoke}/ Update all import paths
GlobalEscrow removed Use PoolEscrow for pool assets, RefundEscrow for gas subsidies
VaultRouter.lockedRequests removed Locking logic no longer needed

New Contracts

Hub-side

Contract Purpose Key Interface
BatchRequestManager Default epoch-based request handling IHubRequestManager
NAVManager Multi-network NAV accounting INAVManager
SimplePriceManager Automatic share price from NAV INAVHook
HubHandler Cross-chain message processing

Spoke-side

Contract Purpose Key Interface
QueueManager Batched asset/share sync IQueueManager
VaultRegistry Vault details with reverse lookup IVaultRegistry
BaseTransferHook Transfer restrictions with manager roles ITransferHook

Cross-Chain

Contract Purpose
ChainlinkAdapter Chainlink CCIP messaging
LayerZeroAdapter LayerZero V2 messaging
RecoveryAdapter Message recovery fallback

Valuations

Contract Purpose
OracleValuation Price from trusted feeders
IdentityValuation 1:1 valuation (e.g., stablecoins)

Other New Features

  • ERC-6909 Support: Multi-token standard for improved composability
  • Share Class Lookup: Spoke.shareTokenDetails(token) returns (PoolId, ShareClassId) for reverse lookup
  • BatchedMulticall: Batch cross-chain messages with automatic payment

Fixes

  • Reentrancy vulnerabilities in multicall and Gateway batch processing
  • Holdings decrease underflow
  • ShareToken address collisions between pools
  • BatchRequestManager (previously in ShareClassManager) pending sum consistency as well as deposit/redeem notification edge cases
  • VaultRouter cross-chain share transfer refunding
  • Gateway and GasService gas handling
  • PoolEscrow reserve underflow
  • Non-standard ERC20 compatibility

Removed

Component Replacement
src/common/ src/core/, src/admin/
GlobalEscrow PoolEscrow + RefundEscrow
HubHelpers.sol Consolidated into Hub

Migration

All existing pool state (pools, share classes, vaults, user balances, pending requests) will be migrated atomically via a migration spell executed by the Centrifuge team. No action is required from integrators for state migration.

Don't miss a new protocol release

NewReleases is sending notifications on new releases.