Skip to main content

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
Depositors retain control through:
  • 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

IEscrowRegistry
Registry of whitelisted escrow contracts
uint256
Counter for generating unique rate manager IDs

Core Functions

Rate Manager Creation

createRateManager

Creates a new rate manager configuration.
RateManagerConfig
Rate manager configuration:
  • manager: Manager address that can set rates
  • feeRecipient: Address to receive manager fees
  • maxFee: 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-in
  • name: Display name for the manager
  • uri: Metadata URI for additional info
bytes32
Newly created manager ID
Events Emitted:
  • RateManagerCreated(rateManagerId, manager, feeRecipient, maxFee, fee, name, uri)
  • MinLiquidityUpdated(rateManagerId, minLiquidity) (if minLiquidity > 0)
Example:

Manager Configuration

setRateManagerConfig

Updates mutable manager config fields.
bytes32
Manager ID
address
New manager address
address
New fee recipient
string
New display name
string
New metadata URI

setFee

Updates manager fee. Must be less than or equal to maxFee.
Events Emitted:
  • RateManagerFeeUpdated(rateManagerId, fee)

setMinLiquidity

Updates minimum liquidity requirement for deposit opt-in.
Events Emitted:
  • MinLiquidityUpdated(rateManagerId, minLiquidity)

Rate Management

setRate

Sets manager-side rate for one payment/currency tuple.
bytes32
Manager ID
bytes32
Payment method key
bytes32
Currency key
uint256
New rate in precise units (1e18 = 1:1)
Events Emitted:
  • RateManagerRateUpdated(rateManagerId, paymentMethod, currencyCode, rate)
Example:

setRateBatch

Batch sets manager-side rates for multiple tuples.
bytes32
Manager ID
bytes32[]
Payment method keys
bytes32[][]
Currency keys grouped by payment method index
uint256[][]
Rates grouped by payment method index
Events Emitted:
  • RateManagerRateUpdated(...) for each rate
  • RateManagerRatesBatchUpdated(rateManagerId, totalUpdated)
Example:

Depositor Floor Configuration

setDepositorFloor

Sets depositor floor config for one delegated tuple. Only callable by deposit owner.
bytes32
Manager ID
address
Escrow address
uint256
Deposit ID
bytes32
Payment method key
bytes32
Currency key
DepositorFloorConfig
Floor configuration:
  • enabled: Whether this tuple is enabled
  • floorFixed: Fixed floor rate
  • floorSpreadBps: Oracle spread in basis points (0-10000)
  • oracleAdapter: Oracle adapter address (address(0) for no oracle)
  • adapterConfig: Oracle adapter configuration bytes
  • maxStaleness: Max oracle staleness in seconds
Events Emitted:
  • DepositorFloorSet(rateManagerId, escrow, depositId, paymentMethod, currencyCode, ...)
Example: Fixed Floor
Example: Oracle Floor with Spread

setDepositorFloorBatch

Batch sets depositor floors for one deposit.

setDepositorCurrencyEnabled

Sets depositor-side currency enabled state. Only callable by deposit owner.
Events Emitted:
  • 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.
uint256
Effective delegated rate (max of manager rate and depositor floor). Returns 0 if disabled or no manager rate set.
Rate Calculation Logic:
  1. Check if depositor has enabled this tuple (return 0 if disabled)
  2. Get manager rate (return 0 if not set)
  3. Compute depositor’s effective floor:
    • If oracle configured: max(floorFixed, oracleRate * (1 + floorSpreadBps/10000))
    • Otherwise: floorFixed
  4. Return max(managerRate, effectiveFloor)
  5. 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

uint256
5e16 - Global maximum manager fee (5%)
uint256
10_000 - Basis points for percentage calculations
uint256
256 - Maximum oracle adapter config size

Events

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

Example: Complete Integration