RateManagerV1 Contract
RateManagerV1 is a canonical delegated rate manager that allows rate managers to set conversion rates on behalf of depositors while giving depositors the ability to configure floor protections. This enables dynamic rate management with depositor safety controls.Overview
- Contract:
RateManagerV1.sol - Inherits:
Ownable,IRateManager - Purpose: Delegated rate management with manager-owned rates and depositor-owned per-deposit floors
Key Concepts
Delegation Model
Depositors can delegate rate management to a professional rate manager who:- Sets conversion rates for payment method/currency pairs
- Collects optional fees on fulfilled intents
- Manages rates across multiple deposits
- Fixed floor rates that manager rates cannot go below
- Oracle-based floor rates with spread protection
- Ability to enable/disable specific currency pairs
- Ability to opt-out at any time
State Variables
Registry of whitelisted escrow contracts
Counter for generating unique rate manager IDs
Core Functions
Rate Manager Creation
createRateManager
Creates a new rate manager configuration.Rate manager configuration:
manager: Manager address that can set ratesfeeRecipient: Address to receive manager feesmaxFee: Maximum fee this manager can charge (immutable)fee: Current fee (must be less than or equal to maxFee)minLiquidity: Minimum deposit liquidity required for opt-inname: Display name for the manageruri: Metadata URI for additional info
Newly created manager ID
RateManagerCreated(rateManagerId, manager, feeRecipient, maxFee, fee, name, uri)MinLiquidityUpdated(rateManagerId, minLiquidity)(if minLiquidity > 0)
Manager Configuration
setRateManagerConfig
Updates mutable manager config fields.Manager ID
New manager address
New fee recipient
New display name
New metadata URI
setFee
Updates manager fee. Must be less than or equal to maxFee.RateManagerFeeUpdated(rateManagerId, fee)
setMinLiquidity
Updates minimum liquidity requirement for deposit opt-in.MinLiquidityUpdated(rateManagerId, minLiquidity)
Rate Management
setRate
Sets manager-side rate for one payment/currency tuple.Manager ID
Payment method key
Currency key
New rate in precise units (1e18 = 1:1)
RateManagerRateUpdated(rateManagerId, paymentMethod, currencyCode, rate)
setRateBatch
Batch sets manager-side rates for multiple tuples.Manager ID
Payment method keys
Currency keys grouped by payment method index
Rates grouped by payment method index
RateManagerRateUpdated(...)for each rateRateManagerRatesBatchUpdated(rateManagerId, totalUpdated)
Depositor Floor Configuration
setDepositorFloor
Sets depositor floor config for one delegated tuple. Only callable by deposit owner.Manager ID
Escrow address
Deposit ID
Payment method key
Currency key
Floor configuration:
enabled: Whether this tuple is enabledfloorFixed: Fixed floor ratefloorSpreadBps: Oracle spread in basis points (0-10000)oracleAdapter: Oracle adapter address (address(0) for no oracle)adapterConfig: Oracle adapter configuration bytesmaxStaleness: Max oracle staleness in seconds
DepositorFloorSet(rateManagerId, escrow, depositId, paymentMethod, currencyCode, ...)
setDepositorFloorBatch
Batch sets depositor floors for one deposit.setDepositorCurrencyEnabled
Sets depositor-side currency enabled state. Only callable by deposit owner.DepositorCurrencyEnabledSet(rateManagerId, escrow, depositId, paymentMethod, currencyCode, enabled)
Callbacks
onDepositOptIn
Callback invoked by EscrowV2 when a deposit opts into this manager. Validates minimum liquidity requirement.View Functions
getRate
Returns manager-adjusted rate for a delegated deposit tuple.Effective delegated rate (max of manager rate and depositor floor). Returns 0 if disabled or no manager rate set.
- Check if depositor has enabled this tuple (return 0 if disabled)
- Get manager rate (return 0 if not set)
- Compute depositor’s effective floor:
- If oracle configured:
max(floorFixed, oracleRate * (1 + floorSpreadBps/10000)) - Otherwise:
floorFixed
- If oracle configured:
- Return
max(managerRate, effectiveFloor) - If oracle configured but returns 0 and no fixed floor, return 0 (safety protection)
getFee
Returns fee recipient and fee for a manager ID.isRateManager
Returns whether a manager ID exists.getRateManager
Returns full manager config for a manager ID.getManagerRate
Returns manager-set rate for one tuple (without floor logic).getDepositorFloor
Returns depositor floor config for a delegated tuple.isDepositorCurrencyEnabled
Returns whether a tuple is enabled for the deposit.Constants
5e16 - Global maximum manager fee (5%)10_000 - Basis points for percentage calculations256 - Maximum oracle adapter config sizeEvents
RateManagerCreated
RateManagerRateUpdated
DepositorFloorSet
Use Cases
Professional Rate Management
Rate managers can:- Manage conversion rates across multiple depositors
- Adjust rates based on market conditions
- Collect fees for their service
- Build reputation and attract more depositors
Depositor Protection
Depositors can:- Set minimum acceptable rates (floors)
- Use oracle-based dynamic floors with spread protection
- Enable/disable specific currency pairs
- Opt-out at any time by clearing the rate manager