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
BatchRequestManagerfor 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:
NAVManagermaintains per-network double-entry accounting (equity, liability, gain, loss accounts) and calculates NAVSimplePriceManagerderives share prices from NAV and issuance, updating automatically when holdings syncQueueManagertriggers 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.