Integrate the Broker
Last updated
Last updated
This guide walks through integrating with Mento's Broker contract to execute swaps between stable assets and their collateral. The Broker serves as the main entry point for all Mento exchanges, handling trading limits, mint/burn operations, and routing to appropriate exchange providers.
Route trades through Mento for optimal stable asset pricing, accessing deep on-chain liquidity with minimal slippage.
Offer direct stable asset swaps to users through your UI, leveraging Mento's oracle-anchored rates.
Access Mento liquidity for market making between Mento pools and external venues.
Enable in-app swaps between stable assets and collateral directly within your wallet interface.
The Broker is the main interface for executing swaps:
// Mainnet Broker address
address constant BROKER = 0x777B8E2F5F356c5c284342aFbF009D6552450d69;
// Interface
interface IBroker {
function getAmountOut(
address exchangeProvider,
bytes32 exchangeId,
address tokenIn,
address tokenOut,
uint256 amountIn
) external view returns (uint256 amountOut);
function swapIn(
address exchangeProvider,
bytes32 exchangeId,
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 amountOutMin
) external returns (uint256 amountOut);
function getExchangeProviders() external view returns (address[] memory)
}
See Smart Contracts > Deployments for testnet addresses.
Query the Broker for registered exchange providers and their supported pairs:
interface IExchangeProvider {
struct Exchange {
bytes32 exchangeId;
address[] assets;
}
function getExchanges() external view returns (Exchange[] memory exchanges);
}
// Get all exchange providers
address[] memory providers = broker.getExchangeProviders();
// For each provider, query available exchanges
for (uint i = 0; i < providers.length; i++) {
IExchangeProvider provider = IExchangeProvider(providers[i]);
IExchangeProvider.Exchange[] memory exchanges = provider.getExchanges();
// Each exchange contains the trading pair info
for (uint j = 0; j < exchanges.length; j++) {
bytes32 exchangeId = exchanges[j].exchangeId;
address asset0 = exchanges[j].assets[0];
address asset1 = exchanges[j].assets[1];
}
}
Before executing a swap, query the expected output amount:
// Example: Quote cUSD to cEUR swap
uint256 amountIn = 100 * 1e18; // 100 cUSD
uint256 expectedOut = broker.getAmountOut(
exchangeProvider, // Address of the exchange provider
exchangeId, // ID of the specific exchange pool
cUSD_ADDRESS, // Token in
cEUR_ADDRESS, // Token out
amountIn // Amount in
);
Perform the actual swap with slippage protection:
// Approve Broker to spend your tokens
IERC20(tokenIn).approve(address(broker), amountIn);
// Execute swap with minimum output protection
uint256 minAmountOut = expectedOut * 99 / 100; // 1% slippage tolerance
uint256 actualOut = broker.swapIn(
exchangeProvider,
exchangeId,
tokenIn,
tokenOut,
amountIn,
minAmountOut // Reverts if output is less than this
);
For complete integration examples including quote aggregation and multi-hop swaps, see the Mento SDK Examples repository.
Exchange Provider: A contract managing one or more trading pools (e.g., BiPoolManager)
Exchange ID: Unique identifier for a specific trading pair within a provider
Multiple providers can offer the same pair with different parameters
Stable Assets: Minted/burned on demand (cUSD, cEUR, etc.)
Collateral Assets: Held in reserve (CELO, USDC, etc.)
The Broker automatically handles minting/burning for stable assets
The Broker enforces per-token trading limits to protect against large flows:
Limits are configured per exchange and token
Both time-based and absolute limits may apply
Transactions revert if limits are exceeded
Always use amountOutMin
parameter to protect against unfavorable price movements between quote and execution.
Query multiple exchanges in a single call using multicall patterns
Cache exchange IDs and provider addresses instead of querying repeatedly
Common revert reasons:
"ExchangeProvider does not exist"
- Invalid provider address
"amountOutMin not met"
- Slippage tolerance exceeded
"Insufficient balance in reserve"
- Not enough collateral available
Trading limit errors - Flow restrictions triggered