Silo
ISilo
Silo is the main component of the protocol. It implements lending logic, manages and isolates risk, acts as a vault for assets, and performs liquidations. Each Silo is composed of the unique asset for which it was created (ie. UNI) and bridge assets (ie. ETH and SiloDollar). There may be multiple bridge assets at any given time.
Main Silo contact that inherits from Base contract. It implements all user/UI facing methods.

Methods

ASSET_DECIMAL_POINTS

function ASSET_DECIMAL_POINTS() external view returns (uint256)

Returns

Name
Type
Description
_0
uint256
undefined

VERSION

function VERSION() external view returns (uint256)
It tells us which SiloRepository.siloFactory(version) created this Silo

Returns

Name
Type
Description
_0
uint256
undefined

accrueInterest

function accrueInterest(address _asset) external nonpayable
Function to update interests for _asset token since the last saved state

Parameters

Name
Type
Description
_asset
address
The address of the token to be updated

allSiloAssets

function allSiloAssets(uint256) external view returns (address)

Parameters

Name
Type
Description
_0
uint256
undefined

Returns

Name
Type
Description
_0
address
undefined

assetInterestData

function assetInterestData(address) external view returns (uint256 harvestedProtocolFees, uint256 protocolFees, uint64 interestRateTimestamp, enum IBaseSilo.AssetStatus status)

Parameters

Name
Type
Description
_0
address
undefined

Returns

Name
Type
Description
harvestedProtocolFees
uint256
undefined
protocolFees
uint256
undefined
interestRateTimestamp
uint64
undefined
status
enum IBaseSilo.AssetStatus
undefined

assetStorage

function assetStorage(address _asset) external view returns (struct IBaseSilo.AssetStorage)
Get asset storage data

Parameters

Name
Type
Description
_asset
address
asset address

Returns

Name
Type
Description
_0
IBaseSilo.AssetStorage
AssetStorage struct

borrow

function borrow(address _asset, uint256 _amount) external nonpayable
Borrow _amount of _asset tokens from the Silo to msg.sender

Parameters

Name
Type
Description
_asset
address
The address of the token to borrow
_amount
uint256
The amount of the token to borrow

borrowFor

function borrowFor(address _asset, address _borrower, address _receiver, uint256 _amount) external nonpayable
Router function to borrow _amount of _asset tokens from the Silo for the _receiver

Parameters

Name
Type
Description
_asset
address
The address of the token to borrow
_borrower
address
The address of the debt tokens receiver
_receiver
address
The address of the asset receiver
_amount
uint256
The amount of the token to borrow

borrowPossible

function borrowPossible(address _asset, address _borrower) external view returns (bool)
Check if borrowing an asset for given account is possible
Borrowing an asset that has been already deposited (and vice versa) is disallowed

Parameters

Name
Type
Description
_asset
address
asset we want to deposit
_borrower
address
borrower address

Returns

Name
Type
Description
_0
bool
true if asset can be borrowed by borrower

deposit

function deposit(address _asset, uint256 _amount, bool _collateralOnly) external nonpayable
Deposit _amount of _asset tokens from msg.sender to the Silo

Parameters

Name
Type
Description
_asset
address
The address of the token to deposit
_amount
uint256
The amount of the token to deposit
_collateralOnly
bool
True if depositing collateral only

depositFor

function depositFor(address _asset, address _depositor, uint256 _amount, bool _collateralOnly) external nonpayable
Router function to deposit _amount of _asset tokens to the Silo for the _depositor

Parameters

Name
Type
Description
_asset
address
The address of the token to deposit
_depositor
address
The address of the recipient of collateral tokens
_amount
uint256
The amount of the token to deposit
_collateralOnly
bool
True if depositing collateral only

depositPossible

function depositPossible(address _asset, address _depositor) external view returns (bool)
Check if depositing an asset for given account is possible
Depositing an asset that has been already borrowed (and vice versa) is disallowed

Parameters

Name
Type
Description
_asset
address
asset we want to deposit
_depositor
address
depositor address

Returns

Name
Type
Description
_0
bool
true if asset can be deposited by depositor

flashLiquidate

function flashLiquidate(address[] _users, bytes _flashReceiverData) external nonpayable returns (address[] assets, uint256[][] receivedCollaterals, uint256[][] shareAmountsToRepay)
this methods does not requires to have tokens in order to liquidate user
during liquidation process, msg.sender will be notified once all collateral will be send to him msg.sender needs to be IFlashLiquidationReceiver

Parameters

Name
Type
Description
_users
address[]
array of users to liquidate
_flashReceiverData
bytes
this data will be forward to msg.sender on notification

Returns

Name
Type
Description
assets
address[]
array of all processed assets (collateral + debt, including removed)
receivedCollaterals
uint256[][]
seizedCollaterals[userId][assetId] => amount amounts of collaterals send to _flashReceiver
shareAmountsToRepay
uint256[][]
shareAmountsToRepaid[userId][assetId] => amount required amounts of debt to be repaid

getAssets

function getAssets() external view returns (address[] assets)
Returns all initialized (synced) assets of Silo including current and removed bridge assets

Returns

Name
Type
Description
assets
address[]
array of initialized assets of Silo

getAssetsWithState

function getAssetsWithState() external view returns (address[] assets, struct IBaseSilo.AssetStorage[] assetsStorage)
Returns all initialized (synced) assets of Silo including current and removed bridge assets with corresponding state

Returns

Name
Type
Description
assets
address[]
array of initialized assets of Silo
assetsStorage
IBaseSilo.AssetStorage[]
array of assets state corresponding to assets array

harvestProtocolFees

function harvestProtocolFees(address[] _assets) external nonpayable
harvest protocol fees from an array of assets

Parameters

Name
Type
Description
_assets
address[]
array of assets we want to harvest fees from

initAssetsTokens

function initAssetsTokens() external nonpayable
this is exposed only for test purposes, but it is safe to leave it like that

interestData

function interestData(address _asset) external view returns (struct IBaseSilo.AssetInterestData)
Get asset interest data

Parameters

Name
Type
Description
_asset
address
asset address

Returns

Name
Type
Description
_0
IBaseSilo.AssetInterestData
AssetInterestData struct

isSolvent

function isSolvent(address _user) external view returns (bool)
Calculates solvency of an account

Parameters

Name
Type
Description
_user
address
wallet address for which solvency is calculated

Returns

Name
Type
Description
_0
bool
true if solvent, false otherwise

repay

function repay(address _asset, uint256 _amount) external nonpayable
Repay _amount of _asset tokens from msg.sender to the Silo

Parameters

Name
Type
Description
_asset
address
The address of the token to repay
_amount
uint256
amount of asset to repay, includes interests

repayFor

function repayFor(address _asset, address _borrower, uint256 _amount) external nonpayable
Allows to repay in behalf of borrower to execute liquidation

Parameters

Name
Type
Description
_asset
address
The address of the token to repay
_borrower
address
The address of the user to have debt tokens burned
_amount
uint256
amount of asset to repay, includes interests

siloAsset

function siloAsset() external view returns (address)

Returns

Name
Type
Description
_0
address
undefined

siloRepository

function siloRepository() external view returns (contract ISiloRepository)
Get Silo Repository contract address

Returns

Name
Type
Description
_0
contract ISiloRepository
undefined

state

function state(address) external view returns (contract IShareToken collateralToken, contract IShareToken collateralOnlyToken, contract IShareToken debtToken, uint256 totalDeposits, uint256 collateralOnlyDeposits, uint256 totalBorrowAmount)

Parameters

Name
Type
Description
_0
address
undefined

Returns

Name
Type
Description
collateralToken
contract IShareToken
undefined
collateralOnlyToken
contract IShareToken
undefined
debtToken
contract IShareToken
undefined
totalDeposits
uint256
undefined
collateralOnlyDeposits
uint256
undefined
totalBorrowAmount
uint256
undefined

syncBridgeAssets

function syncBridgeAssets() external nonpayable
Synchronize current bridge assets with Silo
This function needs to be called on Silo deployment to setup all assets for Silo. It needs to be called every time a bridged asset is added or removed. When bridge asset is removed, depositing and borrowing should be disabled during asset sync.

utilizationData

function utilizationData(address _asset) external view returns (struct IBaseSilo.UtilizationData data)
helper method for InterestRateModel calculations

Parameters

Name
Type
Description
_asset
address
undefined

Returns

Name
Type
Description
data
IBaseSilo.UtilizationData
undefined

withdraw

function withdraw(address _asset, uint256 _amount, bool _collateralOnly) external nonpayable
Withdraw _amount of _asset tokens from the Silo to msg.sender

Parameters

Name
Type
Description
_asset
address
The address of the token to withdraw
_amount
uint256
The amount of the token to withdraw
_collateralOnly
bool
True if withdrawing collateral only deposit

withdrawFor

function withdrawFor(address _asset, address _depositor, address _receiver, uint256 _amount, bool _collateralOnly) external nonpayable
Router function to withdraw _amount of _asset tokens from the Silo for the _depositor

Parameters

Name
Type
Description
_asset
address
The address of the token to withdraw
_depositor
address
The address of the collateral tokens source account
_receiver
address
The address of the asset receiver
_amount
uint256
The amount of the token to withdraw
_collateralOnly
bool
True if withdrawing collateral only deposit

Events

Borrow

event Borrow(address indexed asset, address indexed user, uint256 amount)
Emitted on asset borrow

Parameters

Name
Type
Description
asset indexed
address
undefined
user indexed
address
undefined
amount
uint256
undefined

Deposit

event Deposit(address indexed asset, address indexed depositor, uint256 amount, bool collateralOnly)
Emitted when deposit is made

Parameters

Name
Type
Description
asset indexed
address
undefined
depositor indexed
address
undefined
amount
uint256
undefined
collateralOnly
bool
undefined

Liquidate

event Liquidate(address indexed asset, address indexed user, uint256 shareAmountRepaid, uint256 seizedCollateral)
Emitted on user liquidation

Parameters

Name
Type
Description
asset indexed
address
undefined
user indexed
address
undefined
shareAmountRepaid
uint256
undefined
seizedCollateral
uint256
undefined

Repay

event Repay(address indexed asset, address indexed user, uint256 amount)
Emitted on asset repay

Parameters

Name
Type
Description
asset indexed
address
undefined
user indexed
address
undefined
amount
uint256
undefined

Withdraw

event Withdraw(address indexed asset, address indexed depositor, address indexed receiver, uint256 amount, bool collateralOnly)
Emitted when withdraw is made

Parameters

Name
Type
Description
asset indexed
address
undefined
depositor indexed
address
undefined
receiver indexed
address
undefined
amount
uint256
undefined
collateralOnly
bool
undefined

Errors

IncorrectDataLength

error IncorrectDataLength()
Copy link
On this page
Methods
ASSET_DECIMAL_POINTS
VERSION
accrueInterest
allSiloAssets
assetInterestData
assetStorage
borrow
borrowFor
borrowPossible
deposit
depositFor
depositPossible
flashLiquidate
getAssets
getAssetsWithState
harvestProtocolFees
initAssetsTokens
interestData
isSolvent
repay
repayFor
siloAsset
siloRepository
state
syncBridgeAssets
utilizationData
withdraw
withdrawFor
Events
Borrow
Deposit
Liquidate
Repay
Withdraw
Errors
IncorrectDataLength