Core set
These contracts enforce custody, permissions, and strategy execution across every user Safe. Together, they make sure automation can only do what you’ve allowed.
RolesBroadcaster : sends role and config updates across chains via LayerZero
RolesReceiver : receives those updates and runs strategy operations on the target chain
RolesGuard : validates every transaction against permissions and can pause the system
MorphoVaultController : handles leverage and rebalance operations on Morpho Blue
SwapAdapter : swaps tokens through any supported router with slippage checks
MarketWrapper : wraps vaults in ERC-4626 with role-gated deposits
AcrossXChainAdapter : moves assets cross-chain via Across V3
Contract Addresses
See Contract Deployments for all deployed contract addresses across supported chains.
Supported Chains
Ethereum (1)
Base (8453)
Polygon (137)
Arbitrum (42161)
Scroll (534352)
HyperEVM (999)
Botanix (3637)
All contracts are deployed with version 1.5 and have passed independent security audits.
Interfaces and examples are summarized for orientation; defer to audited code for implementation specifics.
contract RolesBroadcaster is OApp , OAppOptionsType3 {
function send (
uint32 _dstEid,
bytes calldata _callData,
bytes calldata _options
) external payable onlyOwner ;
function quote (
uint32 _dstEid,
bytes calldata _callData,
bytes calldata _options,
bool _payInLzToken
) external view returns ( MessagingFee memory fee );
}
contract RolesReceiver is OApp , StrategyManager {
function executeRebalance (
address safe ,
address vault ,
RebalanceData [] calldata rebalanceData
) external onlyExecutor validVault ( vault );
function executeVaultAction (
address safe ,
address vault ,
IVaultActionController actionController ,
bytes calldata data
) external onlyExecutor ;
function getVaultConfig ( address vault ) external view returns ( VaultConfig memory );
}
contract RolesGuard is BaseModuleGuard , BaseTransactionGuard , Pausable , AccessControl {
function pause ( bool _shouldPause) external onlyRole ( PAUSER_ROLE );
function checkTransaction (
address to ,
uint256 value ,
bytes memory data ,
Enum . Operation operation ,
uint256 safeTxGas ,
uint256 baseGas ,
uint256 gasPrice ,
address gasToken ,
address payable refundReceiver ,
bytes memory signatures ,
address msgSender
) external view override ;
}
struct RebalanceData {
bytes32 marketId;
bool isIncrease;
uint256 amount;
bytes extraData;
}
contract MorphoVaultController is VaultController , CallBuilder {
function executeRebalance (
address vault ,
RebalanceData [] calldata rebalanceData
) external override ;
}
struct SwapParams {
uint256 slippageBps;
bytes callData;
address target;
}
contract SwapAdapter is IMarketAdapterController {
function swapToCollateral (
IERC20 loanToken ,
IERC20 collateralToken ,
address recipient ,
bytes memory strategyData ,
bytes calldata extraData
) external override ;
function swapToLoanToken (
IERC20 loanToken ,
IERC20 collateralToken ,
address recipient ,
bytes memory strategyData ,
bytes calldata extraData
) external override ;
}
contract MarketWrapper is ERC4626 {
function createBurnDeposit () public ;
function deposit ( uint256 assets , address receiver )
external override returns ( uint256 shares );
function decimalsOffset () external view returns ( uint8 );
}
Contract Relationships
Deployments Contract addresses on each chain.
Safe Accounts How Safes use these contracts.