Skip to main content

Collateral

Description

Collateral is a concept introduced by Symbiotic that brings capital efficiency and scale by enabling assets used to secure Symbiotic networks to be held outside of the Symbiotic protocol itself - e.g. in DeFi positions on networks other than Ethereum itself.

Symbiotic achieves this by separating the ability to slash assets from the underlying asset itself, similar to how liquid staking tokens create tokenized representations of underlying staked positions. Technically, collateral positions in Symbiotic are ERC-20 tokens with extended functionality to handle slashing incidents if applicable. In other words, if the collateral token aims to support slashing, it should be possible to create a Burner responsible for proper burning of the asset.

For example, if asset is ETH LST it can be used as a collateral if it's possible to create Burner contract that withdraw ETH from beaconchain and burn it, if asset is native e.g. governance token it also can be used as collateral since burner might be implemented as "black-hole" contract or address.

collateral

Symbiotic allows collateral tokens to be deposited into vaults, which delegate collateral to operators across Symbiotic networks. Vaults define acceptable collateral and it's Burner (if vault supports slashing) and networks need to accept these and other vault terms such as slashing limits to receive rewards (these processes are described in detail in Vault section).

collateral-example

Technical Overview

We do not specify the exact implementation of the Collateral, however, it must satisfy all the following requirement:

  • Collateral token must support ERC-20 interface
  • [OPTIONAL] Collateral token should be slashable i.e. native token or derivative that support redeeming the underlying native token. (Only if collateral is used in slashable vaults).

Default Collateral

Default Collateral is a simple implementation of the collateral token. Technically it's a wrapper over any ERC-20 token with additional slashing history functionality. These functionality is optional and not required in general case.

API reference

interface ICollateral is IERC20 {
/**
* @notice Emitted when debt is issued.
* @param issuer address of the debt's issuer
* @param recipient address that should receive the underlying asset
* @param debtIssued amount of the debt issued
*/
event IssueDebt(address indexed issuer, address indexed recipient, uint256 debtIssued);

/**
* @notice Emitted when debt is repaid.
* @param issuer address of the debt's issuer
* @param recipient address that received the underlying asset
* @param debtRepaid amount of the debt repaid
*/
event RepayDebt(address indexed issuer, address indexed recipient, uint256 debtRepaid);

/**
* @notice Get the collateral's underlying asset.
* @return asset address of the underlying asset
*/
function asset() external view returns (address);

/**
* @notice Get a total amount of repaid debt.
* @return total repaid debt
*/
function totalRepaidDebt() external view returns (uint256);

/**
* @notice Get an amount of repaid debt created by a particular issuer.
* @param issuer address of the debt's issuer
* @return particular issuer's repaid debt
*/
function issuerRepaidDebt(address issuer) external view returns (uint256);

/**
* @notice Get an amount of repaid debt to a particular recipient.
* @param recipient address that received the underlying asset
* @return particular recipient's repaid debt
*/
function recipientRepaidDebt(address recipient) external view returns (uint256);

/**
* @notice Get an amount of repaid debt for a particular issuer-recipient pair.
* @param issuer address of the debt's issuer
* @param recipient address that received the underlying asset
* @return particular pair's repaid debt
*/
function repaidDebt(address issuer, address recipient) external view returns (uint256);

/**
* @notice Get a total amount of debt.
* @return total debt
*/
function totalDebt() external view returns (uint256);

/**
* @notice Get a current debt created by a particular issuer.
* @param issuer address of the debt's issuer
* @return particular issuer's debt
*/
function issuerDebt(address issuer) external view returns (uint256);

/**
* @notice Get a current debt to a particular recipient.
* @param recipient address that should receive the underlying asset
* @return particular recipient's debt
*/
function recipientDebt(address recipient) external view returns (uint256);

/**
* @notice Get a current debt for a particular issuer-recipient pair.
* @param issuer address of the debt's issuer
* @param recipient address that should receive the underlying asset
* @return particular pair's debt
*/
function debt(address issuer, address recipient) external view returns (uint256);

/**
* @notice Burn a given amount of the collateral, and increase a debt of the underlying asset for the caller.
* @param recipient address that should receive the underlying asset
* @param amount amount of the collateral
*/
function issueDebt(address recipient, uint256 amount) external;
}