Delegation
The Delegation module serves as a middleware between Shared Security Networks and the lending protocol, enabling:
Operator Management: Register SSN Operators to Cap, setting their LTV/liquidation ratio and restaker fees
Collateral Provision: Delegators can collateralize Operators for borrowing capacity
Slashing: Execute slashing of delegated collateral during liquidations
Reward Distribution: Distribute rewards to delegators proportionally to their coverage
Cap supports multiple SSNs. Currently integrated SSNs include:
EigenLayer
Overview of Cap SSN Requirements
Isolated Coverage
Delegation coverage is isolated both on a Network level and an Operator level. Each Operator is uniquely mapped to a SSN and a Delegator. Each Operator receives unique, isolated stake from a single Delegator such that slashing risk is not shared.
Network level isolation means that delegations cannot be "restaked" across multiple slashable restaking protocols - because delegations are used as collateral in Cap, a slashing event in a different Network other than Cap would result in bad debt for Cap.
Similarly, restaking across multiple Operators within Cap is not allowed. When multiple Delegators are delegating to the same operator, a withdrawal from one of the Delegators can result in a slashing event for other Delegators.
In other words, a Delegator's stake can only be used for a single Operator in Cap. Alternatively, an Operator cannot receive stake from multiple Delegators. If the Operator were to receive delegations from a new Delegator, then the Operator can simply create a new Ethereum address to do so.
Restaker Fees
Each Operator-Delegator agree upon a predetermined fee for restaking. As such, each Operator-Delegator have an unique fixed yearly rate that can be updated via Admin controls. The rates are set in the respective SSN upon deployment.
Restaker fees are distributed per each SSN's reward handler.
Slashing and Redistribution
Slashing conditions in Cap are objective: they are akin to liquidations and thus triggered when the health factor of the Operator drops below the liquidation threshold. Liquidations can be called permissionlessly, and verified onchain. Slashed funds are redistributed back to the liquidators, ensuring the cUSD is always backed 1:1.
To incentivize liquidations, slashing and redistribution happen instantly. There are no veto committees nor delay periods for slashing to occur, nor for the slashed funds to be redistributed.
Whitelisted Participants
While the protocol can function fully autonomously, to prevent malicious actors from attacking the protocol, Cap will initially whitelist Delegators and Operators. Delegators and Operators that seek to join the protocol should refer to the Onboarding Guides to do so.
Architecture
Delegation Contract - Main contract managing agents, networks, and delegation operations
SymbioticNetworkMiddleware - Adapter for Symbiotic network integration
SymbioticNetwork - Network management and operator deployment
Delegation Contract
Core Functions
slash
: Executes slashing of delegated collateral during liquidations
function slash(address _agent, address _liquidator, uint256 _amount) external checkAccess(this.slash.selector)
_agent
: Agent address to slash_liquidator
: Address to receive slashed collateral_amount
: USD value of delegation to slash
distributeRewards
: Distributes rewards to networks covering an agent
function distributeRewards(address _agent, address _asset) external
_agent
: Agent address for reward distribution_asset
: Reward token address
Admin Functions
addAgent
: Adds a new agent (operator) to the delegation system
function addAgent(address _agent, address _network, uint256 _ltv, uint256 _liquidationThreshold) external checkAccess(this.addAgent.selector)
_agent
: Agent address to add_network
: Network address for the agent_ltv
: Loan-to-value ratio for the agent_liquidationThreshold
: Liquidation threshold for the agent
modifyAgent
: Modifies an existing agent's configuration
function modifyAgent(address _agent, uint256 _ltv, uint256 _liquidationThreshold) external checkAccess(this.modifyAgent.selector)
_agent
: Agent address to modify_ltv
: New loan-to-value ratio_liquidationThreshold
: New liquidation threshold
registerNetwork
: Registers a new shared security network
function registerNetwork(address _network) external checkAccess(this.registerNetwork.selector)
_network
: Network address to register
setLtvBuffer
: Sets the LTV buffer between LTV and liquidation threshold
function setLtvBuffer(uint256 _ltvBuffer) external checkAccess(this.setLtvBuffer.selector)
setFeeRecipient
: Sets the fee recipient for cases with no coverage
function setFeeRecipient(address _feeRecipient) external checkAccess(this.setFeeRecipient.selector)
View Functions
coverage
: Gets the amount of delegation available to back an agent's borrowsslashableCollateral
: Gets the amount of slashable collateral for an agentslashTimestamp
: Gets the appropriate slash timestamp for an agentltv
: Gets the loan-to-value ratio for an agentliquidationThreshold
: Gets the liquidation threshold for an agentagents
: Gets all registered agent addressesnetworkExists
: Checks if a network is registeredepochDuration
: Gets the epoch duration in secondsepoch
: Gets the current epochltvBuffer
: Gets the LTV bufferfeeRecipient
: Gets the fee recipient address
Data Structures
Delegation Storage
struct DelegationStorage {
EnumerableSet.AddressSet agents; // Registered agent addresses
mapping(address => AgentData) agentData; // Per-agent configuration
EnumerableSet.AddressSet networks; // Registered network addresses
address oracle; // Oracle for price feeds
uint256 epochDuration; // Epoch duration in seconds
uint256 ltvBuffer; // LTV buffer from liquidation threshold
address feeRecipient; // Fee recipient address
}
Agent Data
struct AgentData {
address network; // Associated network address
uint256 ltv; // Loan-to-value ratio (ray)
uint256 liquidationThreshold; // Liquidation threshold (ray)
uint256 lastBorrow; // Last borrow timestamp
}
Last updated