Skip to main content

Clearinghouse

Git Source

Inherits: Policy, RolesConsumer, CoolerCallback

Olympus Clearinghouse (Policy) Contract.

The Olympus Clearinghouse is a lending facility built on top of Cooler Loans. The Clearinghouse ensures that OHM holders can take loans against their gOHM holdings according to the parameters approved by the community in OIP-144 and its subsequent RFCs. The Clearinghouse parameters are immutable, because of that, if backing was to increase substantially, a new governance process to fork this implementation with upgraded parameters should take place. Although the Cooler contracts allow lenders to transfer ownership of their repayment rights, the Clearinghouse doesn't implement any functions to use that feature.

State Variables

reserve

ERC20 public immutable reserve;

sReserve

ERC4626 public immutable sReserve;

gohm

ERC20 public immutable gohm;

ohm

ERC20 public immutable ohm;

staking

IStaking public immutable staking;

CHREG

CHREGv1 public CHREG;

MINTR

MINTRv1 public MINTR;

TRSRY

TRSRYv1 public TRSRY;

INTEREST_RATE

uint256 public constant INTEREST_RATE = 5e15;

LOAN_TO_COLLATERAL

uint256 public constant LOAN_TO_COLLATERAL = 289292e16;

DURATION

uint256 public constant DURATION = 121 days;

FUND_CADENCE

uint256 public constant FUND_CADENCE = 7 days;

FUND_AMOUNT

uint256 public constant FUND_AMOUNT = 18_000_000e18;

MAX_REWARD

uint256 public constant MAX_REWARD = 1e17;

active

determines whether the contract can be funded or not.

bool public active;

fundTime

timestamp at which the next rebalance can occur.

uint256 public fundTime;

interestReceivables

Outstanding receivables. Incremented when a loan is taken or rolled. Decremented when a loan is repaid or collateral is burned.

uint256 public interestReceivables;

principalReceivables

uint256 public principalReceivables;

Functions

constructor

constructor(address ohm_, address gohm_, address staking_, address sReserve_, address coolerFactory_, address kernel_)
Policy(Kernel(kernel_))
CoolerCallback(coolerFactory_);

configureDependencies

Default framework setup. Configure dependencies for olympus-v3 modules.

This function will be called when the executor installs the Clearinghouse policy in the olympus-v3 Kernel.

function configureDependencies() external override returns (Keycode[] memory dependencies);

requestPermissions

Default framework setup. Request permissions for interacting with olympus-v3 modules.

This function will be called when the executor installs the Clearinghouse policy in the olympus-v3 Kernel.

function requestPermissions() external view override returns (Permissions[] memory requests);

VERSION

Returns the version of the policy.

function VERSION() external pure returns (uint8 major, uint8 minor);

Returns

NameTypeDescription
majoruint8The major version of the policy.
minoruint8The minor version of the policy.

lendToCooler

Lend to a cooler.

To simplify the UX and easily ensure that all holders get the same terms, this function requests a new loan and clears it in the same transaction.

function lendToCooler(Cooler cooler_, uint256 amount_) external returns (uint256);

Parameters

NameTypeDescription
cooler_Coolerto lend to.
amount_uint256of reserve to lend.

Returns

NameTypeDescription
<none>uint256the id of the granted loan.

extendLoan

Extend the loan expiry by repaying the extension interest in advance. The extension cost is paid by the caller. If a third-party executes the extension, the loan period is extended, but the borrower debt does not increase.

function extendLoan(Cooler cooler_, uint256 loanID_, uint8 times_) external;

Parameters

NameTypeDescription
cooler_Coolerholding the loan to be extended.
loanID_uint256index of loan in loans[].
times_uint8Amount of times that the fixed-term loan duration is extended.

claimDefaulted

Batch several default claims to save gas. The elements on both arrays must be paired based on their index.

Implements an auction style reward system that linearly increases up to a max reward.

function claimDefaulted(address[] calldata coolers_, uint256[] calldata loans_) external;

Parameters

NameTypeDescription
coolers_address[]Array of contracts where the default must be claimed.
loans_uint256[]Array of defaulted loan ids.

_onRepay

Overridden callback to decrement loan receivables.

function _onRepay(uint256, uint256 principalPaid_, uint256 interestPaid_) internal override;

Parameters

NameTypeDescription
<none>uint256
principalPaid_uint256in reserve.
interestPaid_uint256in reserve.

_onDefault

Unused callback since defaults are handled by the clearinghouse.

Overriden and left empty to save gas.

function _onDefault(uint256, uint256, uint256, uint256) internal override;

rebalance

Fund loan liquidity from treasury.

Exposure is always capped at FUND_AMOUNT and rebalanced at up to FUND_CADANCE. If several rebalances are available (because some were missed), calling this function several times won't impact the funds controlled by the contract. If the emergency shutdown is triggered, a rebalance will send funds back to the treasury.

function rebalance() public returns (bool);

Returns

NameTypeDescription
<none>boolFalse if too early to rebalance. Otherwise, true.

sweepIntoSavingsVault

Sweep excess reserve into savings vault.

function sweepIntoSavingsVault() public;

_sweepIntoSavingsVault

Sweep excess reserve into vault.

function _sweepIntoSavingsVault(uint256 amount_) internal;

burn

Public function to burn gOHM.

Can be used to burn any gOHM defaulted using the Cooler instead of the Clearinghouse.

function burn() public;

activate

Activate the contract.

function activate() external onlyRole("cooler_overseer");

emergencyShutdown

Deactivate the contract and return funds to treasury.

function emergencyShutdown() external onlyRole("emergency_shutdown");

defund

Return funds to treasury.

function defund(ERC20 token_, uint256 amount_) external onlyRole("cooler_overseer");

Parameters

NameTypeDescription
token_ERC20to transfer.
amount_uint256to transfer.

_defund

Internal function to return funds to treasury.

function _defund(ERC20 token_, uint256 amount_) internal;

Parameters

NameTypeDescription
token_ERC20to transfer.
amount_uint256to transfer.

getCollateralForLoan

view function computing collateral for a loan amount.

function getCollateralForLoan(uint256 principal_) external pure returns (uint256);

getLoanForCollateral

view function computing loan for a collateral amount.

function getLoanForCollateral(uint256 collateral_) public pure returns (uint256, uint256);

Parameters

NameTypeDescription
collateral_uint256amount of gOHM.

Returns

NameTypeDescription
<none>uint256debt (amount to be lent + interest) for a given collateral amount.
<none>uint256

interestForLoan

view function to compute the interest for given principal amount.

function interestForLoan(uint256 principal_, uint256 duration_) public pure returns (uint256);

Parameters

NameTypeDescription
principal_uint256amount of reserve being lent.
duration_uint256elapsed time in seconds.

getTotalReceivables

Get total receivable reserve for the treasury. Includes both principal and interest.

function getTotalReceivables() external view returns (uint256);

Events

Activate

Logs whenever the Clearinghouse is initialized or reactivated.

event Activate();

Deactivate

Logs whenever the Clearinghouse is deactivated.

event Deactivate();

Defund

Logs whenever the treasury is defunded.

event Defund(address token, uint256 amount);

Rebalance

Logs the balance change (in reserve terms) whenever a rebalance occurs.

event Rebalance(bool defund, uint256 reserveAmount);

Errors

BadEscrow

error BadEscrow();

DurationMaximum

error DurationMaximum();

OnlyBurnable

error OnlyBurnable();

TooEarlyToFund

error TooEarlyToFund();

LengthDiscrepancy

error LengthDiscrepancy();

OnlyBorrower

error OnlyBorrower();

NotLender

error NotLender();