Documentation Index Fetch the complete documentation index at: https://docs.multiliquid.xyz/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Stablecoin delegate contracts manage the integration between the Multiliquid Protocol and the counterparty to the swap, either stablecoin issuers (mint/burn) or organizations providing already existing liquidity (balance sheet).
A stablecoin delegate contract focuses on one specific stablecoin and routes its operations through that lens.
This means the delegate will handle any minting/burning or transfers, contain a custody address that holds RWAs and other stablecoin liquidity, as well as provide administrative functions for whitelisting, fee configuration, and pausability.
Base Contract : src/v2/StablecoinDelegateBase.sol
Delegate Types
MintBurnStablecoinDelegate
For stablecoins with native mint/burn capability.
Location : src/v2/MintBurnStablecoinDelegate.sol
Characteristics :
Directly mints stablecoins during RWA → Stablecoin swaps
Directly burns stablecoins during Stablecoin → RWA swaps
Requires MINTER_ROLE on the stablecoin contract
No custody management needed
BalanceSheetStablecoinDelegate
For existing stablecoin liquidity balances without mint/burn integration
Location : src/v2/BalanceSheetStablecoinDelegate.sol
Characteristics :
Transfers stablecoins from custody during RWA → Stablecoin swaps
Receives stablecoins to custody during Stablecoin → RWA swaps
Manages custody addresses for RWA tokens
Requires pre-funded stablecoin reserves
Core Interface
All stablecoin delegates implement IStablecoinDelegateV2:
interface IStablecoinDelegateV2 {
struct DeployStablecoinParams {
address vault;
uint256 protocolFeeAmt;
address user;
uint256 userAmount;
address rwaAddress;
uint256 rwaAmount;
bytes metadata;
}
struct ReceiveStablecoinParams {
address user;
uint256 totalAmount;
address vault;
uint256 protocolFeeAmt;
uint256 redemptionFeeAmt;
address rwaAddress;
uint256 rwaAmount;
bytes metadata;
}
struct ExchangeRWAsParams {
address user;
address vault;
uint256 protocolFeeAmt;
uint256 redemptionFeeAmt;
address rwaInAddress;
uint256 rwaInAmount;
address rwaOutAddress;
uint256 rwaOutAmount;
bytes rwaInMetadata;
bytes rwaOutMetadata;
}
struct ExchangeStablecoinsParams {
address user;
address vault;
uint256 protocolFeeAmt;
uint256 acceptanceFeeAmt;
uint256 redemptionFeeAmt;
address stablecoinInAddress;
uint256 stablecoinInAmount;
address stablecoinOutAddress;
uint256 stablecoinOutAmount;
bytes stablecoinInMetadata;
bytes stablecoinOutMetadata;
}
// Swap operations (called by MultiliquidSwap)
function deployStablecoin ( DeployStablecoinParams calldata params ) external returns ( bool success );
function receiveStablecoin ( ReceiveStablecoinParams calldata params ) external returns ( bool success );
function exchangeRWAs ( ExchangeRWAsParams calldata params ) external returns ( bool success );
function exchangeStablecoins ( ExchangeStablecoinsParams calldata params ) external returns ( bool success );
// Whitelist management
function whitelistStablecoin ( address stablecoin , bool accepted ) external ;
function whitelistRWA ( address rwa , bool accepted ) external ;
// Configuration
function setRWACustodyAddress ( address _balanceSheetCustodyAddress ) external ;
function setStablecoinCustodyAddress ( address _stablecoinCustodyAddress ) external ;
function setRWADiscountRate ( bytes32 rwaID , uint256 rate ) external ;
function setRWARedemptionFee ( bytes32 rwaID , uint256 rate ) external ;
function setStablecoinAcceptanceFee ( address stablecoin , uint256 rate ) external ;
function setStablecoinRedemptionFee ( address stablecoin , uint256 rate ) external ;
// Pause controls
function pause () external ;
function unpause () external ;
}
Key Functions
deployStablecoin
Called by MultiliquidSwap during RWA → Stablecoin swaps.
function deployStablecoin ( DeployStablecoinParams calldata params )
external
onlyRole ( MULTILIQUID_SWAP_CONTRACT )
returns ( bool success );
Parameters (DeployStablecoinParams):
vault: Address to receive protocol fee
protocolFeeAmt: Protocol fee amount
user: Address receiving stablecoins
userAmount: Stablecoin amount to user
rwaAddress: RWA token address
rwaAmount: RWA amount being deposited
metadata: Optional metadata for the swap
Process :
Validates RWA is whitelisted
Receives RWA tokens from user to custody/issuer
Mints or transfers stablecoins to user
Transfers protocol fee to vault
Returns success status
Access : Only MultiliquidSwap contract
receiveStablecoin
Called by MultiliquidSwap during Stablecoin → RWA swaps.
function receiveStablecoin ( ReceiveStablecoinParams calldata params )
external
onlyRole ( MULTILIQUID_SWAP_CONTRACT )
returns ( bool success );
Parameters (ReceiveStablecoinParams):
user: Address receiving RWA tokens
totalAmount: Total stablecoin amount (includes fees)
vault: Address to receive protocol fee
protocolFeeAmt: Protocol fee amount
redemptionFeeAmt: Redemption fee charged by issuer
rwaAddress: RWA token address
rwaAmount: RWA amount to transfer to user
metadata: Optional metadata for the swap
Process :
Validates RWA is whitelisted
Burns or receives stablecoins from user
Transfers RWA tokens from custody to user
Handles protocol and redemption fees
Returns success status
Access : Only MultiliquidSwap contract
exchangeRWAs
Called by MultiliquidSwap for RWA-to-RWA swaps (using this stablecoin for pricing).
function exchangeRWAs ( ExchangeRWAsParams calldata params )
external
onlyRole ( MULTILIQUID_SWAP_CONTRACT )
returns ( bool success );
Process :
Receives rwaInAmount of rwaInAddress from user
Transfers rwaOutAmount of rwaOutAddress to user
Collects protocol and redemption fees
Returns success status
Access : Only MultiliquidSwap contract
exchangeStablecoins
Called by MultiliquidSwap for stablecoin-to-stablecoin swaps.
function exchangeStablecoins ( ExchangeStablecoinsParams calldata params )
external
onlyRole ( MULTILIQUID_SWAP_CONTRACT )
returns ( bool success );
Process :
Receives stablecoinInAmount from user
Transfers or mints stablecoinOutAmount to user
Collects acceptance and redemption fees
Returns success status
Access : Only MultiliquidSwap contract
Whitelist Management
whitelistRWA
Add or remove an RWA from this stablecoin’s whitelist.
function whitelistRWA ( address rwa , bool accepted ) external onlyIssuerAdmin ;
Parameters :
rwa: Address of the RWA token
accepted: true to whitelist, false to remove
Effect : Enables/disables swaps between this stablecoin and the RWA
Event :
event RWAWhitelist ( address indexed rwa , bool accepted );
whitelistStablecoin
Add or remove another stablecoin for cross-stablecoin swaps.
function whitelistStablecoin ( address stablecoin , bool accepted ) external onlyIssuerAdmin ;
Parameters :
stablecoin: Address of the other stablecoin
accepted: true to whitelist, false to remove
Effect : Enables/disables swaps between this stablecoin and another stablecoin
Event :
event StablecoinWhitelist ( address indexed stablecoin , bool accepted );
Fee Configuration
setRWADiscountRate
Set discount rate for a specific RWA.
function setRWADiscountRate ( bytes32 rwaID , uint256 rate ) external onlyIssuerAdmin ;
Parameters :
rate: Discount in WAD format (1e18 = 100%)
Example: 5% discount = 5e16
Effect : Reduces swap cost when swapping into the RWA
setRWARedemptionFee
Set redemption fee for a specific RWA.
function setRWARedemptionFee ( bytes32 rwaID , uint256 rate ) external onlyIssuerAdmin ;
Parameters :
rate: Fee in WAD format (1e18 = 100%)
Example: 0.5% fee = 5e15
Effect : Additional fee charged when swapping stablecoin → RWA
Custody Management
Both custody addresses must be set before swap operations can execute (enforced by custodyAddressesSet modifier).
setRWACustodyAddress
Set the custody address for RWA tokens.
function setRWACustodyAddress ( address _balanceSheetCustodyAddress ) external onlyIssuerAdmin ;
Purpose : Defines where RWA tokens are held during swaps
Event :
event RWACustodyAddressSet ( address indexed balanceSheetCustodyAddress );
setStablecoinCustodyAddress
Set the custody address for stablecoin reserves and fees.
function setStablecoinCustodyAddress ( address _stablecoinCustodyAddress ) external onlyIssuerAdmin ;
Purpose : Defines where stablecoin reserves are held and where redemption/acceptance fees are collected
Event :
event StablecoinCustodyAddressSet ( address indexed stablecoinCustodyAddress );
Access Control
DEFAULT_ADMIN_ROLE : Can upgrade delegate, manage all roles
ISSUER_ADMIN_ROLE : Stablecoin issuer’s administrative role
Manage RWA and stablecoin whitelists
Set discount rates and redemption fees
Configure custody addresses
Pause/unpause delegate
MULTILIQUID_SWAP_CONTRACT : Granted to MultiliquidSwap contract
Execute swaps
Trigger minting/burning
PAUSE_ROLE : Emergency pause capability for Multiliquid protocol
Can call pauseMultiliquid() / unpauseMultiliquid() (separate from issuer admin pause)
Events
event RWAWhitelist ( address indexed rwa , bool accepted );
event StablecoinWhitelist ( address indexed stablecoin , bool accepted );
event RWADiscountRateSet ( bytes32 indexed rwaID , uint256 indexed rate );
event RedemptionFeeSet ( bytes32 indexed rwaID , uint256 indexed rate );
event StablecoinAcceptanceFeeSet ( address indexed stablecoin , uint256 indexed rate );
event StablecoinRedemptionFeeSet ( address indexed stablecoin , uint256 indexed rate );
event RWACustodyAddressSet ( address indexed balanceSheetCustodyAddress );
event StablecoinCustodyAddressSet ( address indexed stablecoinCustodyAddress );
event Paused ();
event Unpaused ();
Next: RWA Delegate Contracts Explore optional risk management contracts for Real World Asset tokens