# Welcome

<figure><img src="/files/An0GY76byrIq1KFNeaIX" alt=""><figcaption><p>Hero logo - Decentralizing the credit market, today</p></figcaption></figure>

Welcome! Here you will find our white and math papers, guides on using our Protocol to lend and borrow crypto assets, and all the material developers will need to start building on top of Exactly.

[Exactly Protocol](https://exact.ly/) was started in July 2021, launched to [Ethereum Mainnet](https://app.exact.ly/?n=mainnet) in November 2022, and to [Optimism](https://app.exact.ly/?n=optimism) in March 2023 by a team of stakeholders with software, economics, finance, and math expertise. You can find more info about us on [Linkedin](https://linkedin.com/company/exactly-protocol) and [GitHub](https://github.com/orgs/exactly/people).

Exactly was funded by long-term capital partners with a track record of alignment with Web2 and Web3 ecosystems. Some of our current investors are [Kazsek](https://www.kaszek.com/), [BairesDAO](https://twitter.com/bairesdao), [NXTP](https://www.nxtp.vc/), [Newtopia](https://newtopia.vc/), [Kain Warwick](https://twitter.com/kaiynne) (Co-Founder of [Synthetix](https://synthetix.io/)), [Esteban Ordano](https://twitter.com/eordano) (Co-Founder of [Decentraland](https://decentraland.org/)), [Matias Woloski](https://twitter.com/woloski) (Co-Founder of [Auth0](https://auth0.com/)), [Daedalus](https://www.daedalus.gg/) among others.

The Protocol was audited by Coinspect, Chainsafe, and ABDK, among others. Cryptecon audited the economic model. You can find all the audit reports [here](https://docs.exact.ly/security/audits).

Follow us on [Discord](https://discord.gg/nFKzxNvz), [Telegram](https://t.me/exactlyFinance), and [Twitter](https://twitter.com/exactly_finance) for our updates.


# Introduction

**TL;DR**

**Exactly protocol takes a new approach to interest rate discovery in DeFi. Rather than relying on the value of multiple maturity tokens, we look at the utilization rate of several maturity pools, enabling us to offer both variable and fixed rates within the same protocol.**

Exactly is a decentralized, non-custodial, and open-source protocol that provides an autonomous interest rate market to lenders and borrowers while setting interest rates based on credit supply and demand, enabling users to frictionlessly exchange the time value of their crypto assets at both variables and fixed interest rates for the first time in DeFi.

Aside from taking loans and making deposits at variable interest rates from a Variable Rate Pool, Exactly enables users to do so at fixed rates through interaction with several Fixed Rate Pools, each representing a specific maturity date. Interest rates are determined based on the credit utilization rate of each Fixed Rate Pool.

{% embed url="<https://docs.google.com/presentation/d/1hK2k8u23McHbRFXZorgprgD0AwkKZuAjh-CVOPptOTI/edit#slide=id.g13d9cdca389_0_123>" %}
Exactly Presentation
{% endembed %}

## Exactly Protocol Interest Rate Model v2

{% embed url="<https://www.youtube.com/watch?v=8g3kq9tEf3s>" %}


# FAQ

## General

### What is Exactly?

Exactly is a new decentralized, non-custodial, and open-source protocol that provides an autonomous interest rate market to lenders and borrowers while setting interest rates based on credit supply and demand, enabling users to frictionlessly exchange the time value of their crypto assets at both variables and fixed interest rates for the first time in DeFi.

Aside from taking loans and making deposits at variable interest rates from a Variable Rate Pool, this protocol enables users to do so at fixed rates through interaction with several Fixed Rate Pools, each representing a specific maturity date. Interest rates are determined based on the credit utilization rate of each Fixed Rate Pool.

### Why does Exactly matter?

With an innovative approach, the protocol allows users to lend and borrow assets at fixed and variable rates in a more efficient way through the implementation of the [ERC-4626](https://docs.exact.ly/guides/protocol/market/erc-4626) and a new [interest rate model](https://docs.exact.ly/guides/protocol/interestratemodel) with a continuous and differentiable (non-linear) function that will set the basis for the development of a fixed income derivative market.

**The Exactly value proposition:**

* **Simplicity**: Traders can arbitrage between fixed and variable rates for various periods and hedge the interest rate risk for their long or short positions, with or without leverage.
* **Frictionless**: Investors and DAOs can receive fixed and variable deposit rates. End-users can take fixed-interest rate loans for more extended periods with certainty.
* **Efficiency**: Fixed and variable interest rates live in the same protocol with a new approach towards multiple interest rate discovery through the Utilization Rate of each Fixed Rate Pool.

Being an open-source, non-custodial, and autonomous interest rate protocol, Exactly began decentralizing the credit market and completing the DeFi ecosystem.

### Who developed Exactly Protocol?

Exactly was started in July 2021 and launched on Ethereum Mainnet in November 2022 by a team of stakeholders with expertise in technology, economics, finance, and math. You can find more info about us on [Linkedin](https://linkedin.com/company/exactly-protocol) and on [GitHub](https://github.com/orgs/exactly/people).

## How it works

### What is the Variable Rate Pool?

The Variable Rate Pool contains a single type of asset without an expiration date.

This pool provides liquidity to all the different fixed-rate pools as needed to ensure they can still satisfy the demand for new loans when deposits are insufficient to cover the requested amounts. Once a new deposit is made in a Fixed Rate Pool, it will automatically replace the Variable Rate Pool’s original funding, which “leaves” retaining a small fraction of the interest fees as earnings for providing early liquidity in the first place.

The protocol has one Variable Rate Pool and many Fixed Rate Pools for each asset.

### What is an "exaVoucher"?

Users can supply their assets and increase the liquidity of the [Variable Rate Pool](#what-is-the-variable-rate-pool), which will, in turn, provide liquidity to all the different [Fixed Rate Pools](#what-is-a-fixed-rate-pool) as needed. Each deposit will mint an "Exactly Voucher" (exaVoucher) that uses the [ERC-4626](/guides/protocol/market/erc-4626) standard, which will be provided to the user as a voucher for the deposited amount. These exaVouchers will periodically accrue variable earnings by increasing their value when withdrawing and exchanging back for the underlying assets. Even though the main goal is to solve the problem of fragmented liquidity across different Fixed Rate Pools, it is also noteworthy that the exaVoucher extends on the ERC-20 standard, meaning that it can be exchangeable, adding composability across other protocols.

Therefore, exaVoucher holders have the capability of redeeming and receiving their original assets plus their interests at any time, subject to available liquidity in the Variable Rate Pool.

### Are exaVouchers transferable?

Yes, they can be transferred. Transferring the exaVouchers would mean transferring the variable deposit position, and this can be done with any amount, not necessarily the whole position. Nevertheless, if the transferred amount causes a shortfall in the original address ([Health Factor < 1](#what-is-the-health-factor)), the transaction will be reverted.

### What is a Fixed Rate Pool?

A Fixed Rate Pool is a pool that has a maturity date (term horizon) containing a single type of asset. Users can supply or borrow assets from these pools once they put their [collateral](#what-is-the-health-factor) on the [Variable Rate Pool](#what-is-the-variable-rate-pool). Each new deposit generates an increase in the liquidity for that specific Fixed Rate Pool, reducing its utilization rate and fixed interest rate for new loans as a consequence.

### How to borrow an asset?

To borrow an asset in the protocol, you should first deposit any asset in the [Variable Rate Pool](#what-is-the-variable-rate-pool), enable that asset as collateral in [your dashboard](https://app.exact.ly/dashboard), and then you can borrow any asset paying a variable or a fixed interest rate according to your preference.

### What is the Health Factor?

The Health Factor represents how “safe” your leverage portfolio is, defined as the risk-adjusted proportion of collateral deposited divided by the borrowed risk-adjusted amount. A health factor below 1x will be considered with a shortfall and open to liquidation.

### How is the Health Factor calculated?

The Health Factor is calculated from the user's collateral balance (in ETH) multiplied by each asset's [adjust factor](https://docs.exact.ly/getting-started/pages/AAZiGd76hBxtdgHYSvLa#d.-risk-factors), divided by the user's debt which is also divided by this adjust factor.

#### Example:

Given an ETH adjusted factor of 0.84, a deposit of 100 ETH, and borrow of 50 ETH, the Health Factor will be 1.41:

$$
\frac{100 \* 0.84}{50 \div 0.84}=\frac{84.00}{59.52}=1.41
$$

Below a Health Factor of 1.00, the user will be considered in a shortfall and open to [liquidation](/guides/liquidations).

### How can I determine the maximum borrowing capacity based on my collateral deposit?

This is also known as maximum Loan-to-Value.

To calculate the maximum Loan-to-Value (LTV) for a deposit, you need to consider the Risk-Adjust Factors of the assets involved in the transaction, both for the deposited asset (collateral) and the borrowed asset. The formula to calculate LTV is as follows:

LTV = Risk-Adjust Factor deposit \* Risk-Adjust Factor borrow.

Here's an example: let's say you want to deposit `ETH` as collateral and borrow `USDC`. In this case, the Risk-Adjust Factors are 0.84 for `ETH` and 0.91 for `USDC`. To calculate the LTV, you would multiply these factors:

LTV = 0.84 \* 0.91 = 0.7644

Next, you should divide the LTV by your desired [Health Factor](#what-is-the-health-factor), which represents the safety margin for your loan, with higher values indicating a lower liquidation risk. In our example, let's assume a Health Factor of 1.05:

Adjusted LTV = LTV / Health Factor = 0.7644 / 1.05 = 0.728

To determine the amount you can borrow, multiply the adjusted LTV by the value of your deposited collateral. If you deposit $10,000 worth of `ETH`, you can borrow:

Amount to borrow = Adjusted LTV \* Deposit Amount = 0.728 \* $10,000 = $7,280

In this example, depositing $10,000 worth of `ETH` allows you to borrow $7,280 worth of `USDC`, given the Risk-Adjust Factors and a Health Factor of 1.05.

You can find the Risk-Adjust Factors for each asset in the [Parameters](/guides/parameters) section.

This table shows the borrowing limit for only one asset deposited as collateral and one borrowed asset:

<figure><img src="/files/GtcDcOa26ktUsABOibx1" alt=""><figcaption></figcaption></figure>

### What happens if the price of my collateral changes?

When the price of your collateral changes, your [Health Factor](#what-is-the-health-factor) changes. The minimum collateralization ratio you need to maintain will vary depending on the asset you're borrowing and the collateral type you use.

### What is collateral liquidation?

During liquidation, a liquidator purchases a portion of a user's collateral at a discount to the on-chain oracle price and repays some of the liquidated user's debt.

The liquidator can purchase some part of the user's collateral depending on the Dynamic Close Factor, even if the user is only slightly undercollateralized.

### What is the Dynamic Close Factor?

To return the borrower's account to solvency as fast as possible and involving as few liquidations as possible, the protocol has a Dynamic Close Factor (based on the user’s degree of insolvency) that is the proportion of outstanding borrows that must be repaid to return a user to a solvency situation.

### Can I repay or withdraw my fixed position earlier?

You can exit your fixed deposit or repay your fixed loan at any time, subject to the liquidity of the protocol that will determine the correspondent market interest rate for discounting the present value of your deposit or your loan.

Read more [here](/guides/fixed-rate-operations).

### What happens if I don't repay my fixed borrow at maturity?

There is a [daily penalty fee rate](https://docs.exact.ly/guides/parameters#j.-penalty-rate) for not repaying your borrow before the maturity date.

Read more [here](/guides/fixed-rate-operations/borrows).

### What is the best collateral ratio to borrow at?

The collateral ratio you choose determines the likelihood that your collateral gets liquidated. The lower your collateral ratio, the greater your risk of liquidation. Choosing the right collateral ratio depends on how much risk you want to take and how actively you plan to manage your positions.

### Which are the revenue sources of the Variable Rate Pool?

Liquidity providers receive earnings from four different sources:

1. Variable interest rate fees paid by borrowers on the [Variable Rate Pool](#what-is-the-variable-rate-pool)
2. Commissions for providing [early liquidity](https://docs.exact.ly/getting-started/pages/ILA3HEUKlPY8oQUXcbvK#2.1-supplying-assets-to-the-variable-rate-pool) on [Fixed Rate](#what-is-a-fixed-rate-pool) loans (a.k.a.: "exit commissions")
3. Penalties paid by users who repay their debts after maturity on [Fixed Rate](#what-is-a-fixed-rate-pool) loans
4. A profit share of the [liquidation](#what-is-a-liquidation) fee

Incentives 2, 3, and 4 are extraordinary events that generate earnings gradually distributed to [Variable Rate Pool](#what-is-the-variable-rate-pool) depositors.

### How does the protocol generate revenue?

Exactly Protocol generates revenue since the [Treasury Fee](https://docs.exact.ly/guides/parameters#b.-treasury-fee) parameter was activated on OP Mainnet in June 2023. The Treasury Fee refers to the percentage of interest rate charges paid by borrowers that the protocol retains for its treasury.

All collected Treasury Fees can be tracked in the "Treasury Fee" section in our official Dune Analytics dashboard: <https://dune.com/exactly/exactly>

### What is the process for transferring assets from Ethereum Mainnet to OP Mainnet?

"Bridging" is transferring tokens from Ethereum (Mainnet) to OP Mainnet. This allows users to take advantage of faster and cheaper transactions on this network, a layer 2 scaling solution.

Here's an outline of how to bridge assets:

1. Choose a bridge service that supports OP Mainnet. Some popular bridges include the following:
   * Hop Exchange (<https://hop.exchange/>)
   * Optimism Bridge ([https://app.optimism.io/bridge](https://app.optimism.io/bridge/deposit))
2. Connect your Ethereum wallet (e.g., MetaMask) to the web3-enabled application. Ensure you have some ether (ETH) in your wallet for transaction fees.
3. Choose the token you want to bridge from Ethereum to OP Mainnet, such as ETH, or an ERC-20 token like DAI, and specify the amount you want to transfer.
4. Review the transaction details, including any fees associated with the bridge. Confirm the transaction in your wallet, and the bridge will initiate the transfer.
5. Depending on the bridge and network conditions, the transfer may take some time to complete. Your assets will be available once the transaction is confirmed on Ethereum and OP Mainnet.
6. To interact with your assets on OP Mainnet, you'll need to switch your wallet's network to Optimistic Ethereum. In MetaMask, you can add the OP Mainnet network by following these steps:
   * Click on the network dropdown at the top of MetaMask.
   * Select "Custom RPC."
   * Enter the following network details:
     * Network Name: Optimistic Ethereum
     * New RPC URL: [https://mainnet.optimism.io](https://mainnet.optimism.io/)
     * Chain ID: 10
     * Currency Symbol: ETH
     * Block Explorer URL: [https://optimistic.etherscan.io](https://optimistic.etherscan.io/)
   * Save the new network.

You can now interact with your bridged assets on OP Mainnet using web3-enabled applications that support OP Mainnet, including [our app](https://app.exact.ly/?n=optimism). Remember to switch back to Ethereum Mainnet when interacting with assets or applications on the main Ethereum network.

## Community Involvement

### Where is the developer documentation?

We're continuously updating our developer documentation in [Protocol](/guides/protocol).

### Where are your branding guidelines/materials?

You can check our branding guidelines and materials in [Brand Assets](/resources/brand-assets).

### Where can I propose new ideas?

We have a [forum on Discord](https://exact.ly/discord/) where you can share and discuss your thoughts with the Exactly community.

## Exactly Web App

### What oracles does Exactly use?

We use an aggregation of decentralized data feeds from [Chainlink](https://data.chain.link/).

### How are interest rates calculated?

#### Borrow Interest Rates

* **Variable Interest Rate**: It's a [rational function](https://docs.exact.ly/guides/interest-rates-curves) that depends on the Utilization Rate of the Variable Rate Pool in every block.
  * We display on [Markets](https://app.exact.ly/) (Simple or Advanced View) the interest rate from the current utilization rate of the Variable Rate Pool.
  * Then, when entering the amount (Simple View or Modal), we show the new variable interest rate based on how the pool's utilization has changed, given the input.
* **Fixed Interest Rates**: It's also a rational function but depends on the Utilization Rate of the specific Fixed Rate Pool after the amount borrowed.
  * We display by default on Markets (Advanced View) the best fixed rate for a marginal change in the fixed rate pool's utilization rate.
  * Then, when entering the specific amount (Simple View or modal window in the Advanced View), we calculate the average value of the integral of the rational function taking into account the change in the utilization after the amount borrowed, to get the specific fixed interest rate that the user will have to pay until the pool's maturity.

#### Deposit Interest Rates

* **Variable Interest Rate**: It's the change in the value of the shares of the Variable Rate Pool, based on its different revenue sources: variable rate interest fees + fixed-rate interest fees and commissions, + liquidation fee to compensate for bad debt.
  * We display on Markets by default (Simple View and Advanced View) the annual rate that arises from the change in the value of Variable Rate Pool shares during the last 15 minutes.
  * Then, when entering the specific amount (Simple View or modal window in the Advances View), we show the new interest rate based on how the utilization has changed, given the input.
* **Fixed Interest Rates**: The user will get an annual rate based on his deposit amount and the current fixed interest rate fees from borrows that the Fixed Rate Pool will collect until maturity.
  * We display on Markets the best-fixed rate (Advanced View) for a marginal change in utilization in the Fixed Rate Pools or just the current marginal utilization for each Fixed Rate Pool (Simple View)
  * Then, when entering the amount (Simple View or modal window in the Advance View), we calculate the specific fixed interest rate based on his deposit amount and the current fixed interest rate fees from borrows that the Fixed Rate Pool will collect until maturity.

### What does Total Available refer to?

The Total Available value displayed in the web app is the sum of the variable and fixed pools available for withdrawals.

### What does Total Utilization refer to?

Total Utilization is the total utilization of the variable and fixed pool. Up to 90% can be lent out given the current reserve factor of [5%](https://docs.exact.ly/guides/parameters#a.-reserve-factor).&#x20;

### Why is the web app not available for US Persons?

As US Persons are prohibited from accessing and using the Digital Asset Services in any way, the platform does not allow its use by, or operation in any way with, US Persons. If we have reasonable grounds to suspect that you are a US Person, we reserve the right to take whatever action we deem appropriate to prohibit your access to the Digital Asset Services.

### What risks are there associated with using the protocol?

There is always inherent risk associated with the smart contracts and systems deployed by the third-party protocols that interact with them. Exactly Protocol is not responsible for any funds lost due to exploits.

By accessing and using Exactly Protocol, you acknowledge and accept these risks, including the potential for loss of funds due to exploits or vulnerabilities. Please review our [Terms and Conditions](https://docs.exact.ly/legal/terms-and-conditions-of-use) carefully for full details on your rights, obligations, and the limitations of our liability.

## EXA Governance Token

### Is there a governance token?

Yes, the [EXA token](https://docs.exact.ly/guides/exa-token) is the Exactly Protocol's governance token. With the EXA token, community members can actively participate in the Protocol’s governance by voting on proposals for changes and upgrades.

More information about the EXA token can be found in the [EXA Token section](https://docs.exact.ly/guides/exa-token).

### What is the total circulating supply of the EXA token?

The total Circulating Supply and token holders can be found [here](https://optimistic.etherscan.io/token/tokenholderchart/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b).

### Do Testnet users receive rewards?

No, testnet previews upcoming features and allows users to learn about the protocol without any Mainnet gas fees.

### Someone messaged me promising free tokens/ICO/etc, is it real?

No, that is fake. No one related to Exactly Protocol will ever message anyone directly nor offer free tokens or investments.

## Technical

### Is it possible to read the Variable Supply and Borrowing Rates from Smart Contracts?

The Variable Supply Rate cannot be read on-chain as it is an average of the earnings that the pool has generated over the last 15 minutes. These earnings come from different sources of income, such as:

* Debt charged to variable borrowers.
* Earnings originating from Fixed Rate borrows are backed up by the [Variable Rate Pool](https://docs.exact.ly/resources/white-paper#3.-the-exactly-interest-rate-model).
* Accumulator -> [Earnings Accumulator](https://docs.exact.ly/guides/features/earnings-accumulator).

The **Variable Borrow Rate** can be queried on-chain through the following steps:

1. Head to the Market's `floatingAssets` and `floatingDebt` view functions and query both values (i.e. [MarketUSDC](https://optimistic.etherscan.io/address/0x81C9A7B55A4df39A9B7B5F781ec0e53539694873#readProxyContract)).
2. Head to the Market's Interest Rate Model (IRM) `floatingRate` read function (i.e. [MarketUSDC’s IRM](https://optimistic.etherscan.io/address/0x8C2F35c8076bCb5D4b696bAE11AcA0ac0Dd873e4#readContract)).
3. For the `utilization` argument, enter the division between `floatingAssets` and `floatingDebt` (the result of this division needs to be then multiplied by `1e18` -> `1000000000000000000`).
4. Query the `floatingRate` function with the just calculated value. The result will be the current rate, represented with `18` decimals.

## Partnerships

### Who can I contact about partnerships/integrations?

Feel free to reach out through [Discord](https://discord.gg/eNTyPvgA4P) or other platforms in the [Quick Links](/getting-started/quick-links) section.

## Exactly Protocol Multisig Addresses

### What are the Exactly multisigs addresses?

The Exactly protocol holds the following multi-sig addresses:

| Multisig                                   | Address                                    |
| ------------------------------------------ | ------------------------------------------ |
| Exactly Protocol Owner on Ethereum Mainnet | 0x7A65824d74B0C20730B6eE4929ABcc41Cbe843Aa |
| Exactly Protocol Owner on OP Mainnet       | 0xC0d6Bc5d052d1e74523AD79dD5A954276c9286D3 |
| Exactly Protocol Savings Account           | 0x8a1c05C4462b3554814a637E940b3342ffBE02f2 |
| Exactly Treasury on OP Mainnet             | 0x23fD464e0b0eE21cEdEb929B19CABF9bD5215019 |

* Protocol Owner Multisig: This Multisig controls the entire protocol, including functions such as contract upgrades, parameter adjustments, and protocol pauses.
* Savings Account: The protocol's treasury fees will be partly allocated to the Staking Program. A specified fraction (providerRatio) of these fees will be assigned to the staking pool, with an initial parameter of 0.5 (50% of the fees). The rest of the fees go to [Exactly DAO Savings Account Multisig.](https://optimistic.etherscan.io/address/0x8a1c05c4462b3554814a637e940b3342ffbe02f2)
* Treasury Multisig: This Multisig is responsible for managing the funds in the DAO treasury, which includes activities like distributing EXA rewards, among others.

## Exactly Protocol Risk Assessment

### What is the Exactly risk assessment framework used for current assets?

The collateral risk assessment framework for current assets uses Conditional Value at Risk (CVaR), commonly called the expected shortfall. CVaR is a risk assessment metric employed to quantify the amount of tail risk associated with an investment portfolio. It is derived by computing a weighted average of the "extreme" losses within the tail section of the distribution of potential returns beyond the value at risk (VaR) cutoff point.

For detailed information on the current risk adjustment factors utilized within this framework, please refer to the following link: [Risk Adjustment Factors.](https://docs.exact.ly/guides/parameters#d.-risk-factors)

Concerning new assets, they must possess a Chainlink oracle price feed and maintain sufficient liquidity within the OP Mainnet for potential liquidations. As an illustrative example, the top 10 assets on Velodrome/Uniswap are considered suitable. It is important to note that all assets can be utilized as collateral in the current protocol design.


# Quick Links

## Websites

* [Website](https://exact.ly/)
* [Docs](https://docs.exact.ly/)
* [DApp](https://app.exact.ly/)
* [Ethereum Mainnet DApp](https://ethereum.exact.ly)
* [Testnet](https://goerli.exact.ly)

## Social

* [Twitter](https://twitter.com/exactlyprotocol)
* [Discord](https://exact.ly/discord)
* [Instagram](https://www.instagram.com/exact.ly/)
* [Telegram](https://t.me/exactlyFinance)
* [Medium](https://medium.com/@exactly_protocol)
* [Mirror](https://mirror.xyz/0xFa9561A3bd8c9EB865b13Ff4a54A88967CD0A803)
* [YouTube](https://www.youtube.com/channel/UCA6rQtOZSvGFIB8ON5SDNNg)

## Code

* [GitHub](https://github.com/exactly)
* [Report A Bug](https://discordapp.com/channels/846682395553824808/985914797067472946)
* [Bug Bounty Program](https://immunefi.com/bounty/exactly/)

## Security

* [ChainPatrol Security Portal](https://app.chainpatrol.io/exactly)
* [Defi Safety Report](https://www.defisafety.com/app/pqrs/531)

## Analytics

* [Anthias](https://app.anthias.xyz/exactly-opt)
* [DeFiLlama](https://defillama.com/protocol/exactly)
* [Dune Analytics](https://dune.com/exactly/exactly)
* [Messari](https://messari.io/protocol/exactly)
* [Nansen](https://pro.nansen.ai/projects/exactly/optimism)


# Exactly Protocol Governance

This section represents the current process and guidelines for Exactly Improvement Proposals (EXAIPs).

The goal of the EXAIPs is to ensure seamless protocol upgrades and empower the community to contribute to the development of the Exactly protocol.


# Proposals and Voting

EXA is the governance token of Exactly Protocol that will be used as our voting metric and is decided as follows:

* EXAIPs are subject to a simple majority vote. To maintain the platform's integrity, submitting a proposal requires a minimum score of 100 EXA tokens, ensuring genuine contributions and preventing spam. You can get EXA [here](https://app.exact.ly/get-exa).
* The voting delay will be one day, the voting period will be five days, and a proposal must meet a threshold of 100,000 EXA tokens (1% of the total EXA supply) for approval. You can also check this information in our [Snapshot settings](https://gov.exact.ly/#/settings).
* All users with the right to receive EXA in the future who are vesting their tokens via Sablier carry the same voting power as regular EXA token holders. This parity in voting rights ensures fairness and equal participation in the governance process and includes the following types of users:
  * esEXA token holders ([EXAIP-01](https://gov.exact.ly/#/proposal/0x889d08cbe0ed7be4fd437ca374ef2845b4dbd641a6d2c57e76cd2c54d47fcadc))&#x20;
  * Team members, advisors, and investors that receive EXA tokens with vesting ([EXAIP-02](https://gov.exact.ly/#/proposal/0xe8582ed61b471cddedf865aad15138503f4bd71813ece8c66f0325507ac1c2f9))
  * Affected users that received compensation in EXA tokens with vesting ([EXAIP-03](https://gov.exact.ly/#/proposal/0xf025abbbd211bfb8ccd8d5a7aa5839673b1a1fa82e7cb9b45f89cf47aca8df32))
* [A new governance proposal](https://gov.exact.ly/#/create) can change these initial parameters.

You can check your voting power in the Exactly web app [Governance Section](https://app.exact.ly/governance) and in [Snapshots](https://gov.exact.ly/).&#x20;


# Snapshot

[Snapshot ](https://snapshot.org/#/)is a simple voting interface that allows users to signal sentiment off-chain. Votes on Snapshot are weighted by the number of EXA owned by an address.

Our Snapshot voting platform can be found [here](https://gov.exact.ly/#/), where all EXAIPs are housed.

Please be aware that to be an eligible voter for any proposal on our Snapshot you must have EXA from any or all of the above options at the time of the vote being started. This means that you cannot simply buy EXA tokens to vote on an already ongoing vote, and is meant to reduce the risk of influence by whales and flash-loaners.

<br>


# Exactly Improvement Proposal (EXAIP) Template

To submit a proposal, we encourage our community members to use the following [format](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax) and template:

1. Title: the title should reflect the content of the EXAIP.
2. Summary: a brief summary of what changes are being suggested.
3. Background: offers a detailed context, providing essential information about the issue or topic.
4. Proposal: explore the specifics of the idea, outlining its essential components and objectives.
5. Benefits: enumerates the advantages and positive outcomes expected from implementing the proposal, emphasizing its potential impact.
6. Implementation: outlines the practical steps and strategies for executing the proposal effectively, ensuring a smooth integration into the existing system.
7. Conclusion: summarizes the proposal, reaffirming its significance and benefits to the community.


# Exactly Protocol (EXA)

**`EXA` Smart Contract Address (OP Mainnet):**&#x20;

[**`0x1e925de1c68ef83bd98ee3e130ef14a50309c01b`**](https://optimistic.etherscan.io/token/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b)\
\
**`EXA` Smart Contract Address (Base):**&#x20;

[**`0x1e925de1c68ef83bd98ee3e130ef14a50309c01b`**](https://basescan.org/token/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b)

The EXA token grants holders the right to vote on system changes and upgrades. Holders of the EXA token will wield power over the Protocol’s [treasury](https://docs.exact.ly/guides/parameters#b.-treasury-fee) and [smart contract upgrades](https://docs.exact.ly/security/access-control).

As the Protocol develops, EXA token holders will play a crucial role in decision-making, including setting collateral requirements, introducing new collateral types, adjusting borrowing and lending terms, and managing token incentives. These decisions demand thoughtful evaluation of various factors, and the Exactly team will provide research, analysis, and open-source simulations to assist the community in making informed decisions.

### **Timelock**&#x20;

* For security reasons, most of the EXA tokens will be deposited in the [Timelock Contract](https://optimistic.etherscan.io/address/0x92024C4bDa9DA602b711B9AbB610d072018eb58b):\
  <https://optimistic.etherscan.io/token/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b?a=0x92024c4bda9da602b711b9abb610d072018eb58b>

### Circulating Supply & Token Holders

* **EXA token holders and Total Supply:** \
  **OP mainnet:** <https://optimistic.etherscan.io/token/tokenholderchart/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b>\
  **Base:**\
  <https://basescan.org/token/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b>
* **Exa token Circulating Supply**: <https://app.exact.ly/api/circulating-exa>
* **Circulating Supply Formula:**

  ```
  circulatingSupply = totalSupply - nonCirculatingSupply + totalWithdrawable
  ```

&#x20;       **nonCirculatingSupply** => sum of the EXA balance of:\
&#x20;       [`Sablier_V2_Lockup_Dynamic`](https://optimistic.etherscan.io/token/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b?a=0x6f68516c21e248cddfaf4898e66b2b0adee0e0d6)\
&#x20;       [`SablierV2LockupLinear`](https://optimistic.etherscan.io/token/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b?a=0xb923abdca17aed90eb5ec5e407bd37164f632bfd)\
&#x20;       [`TimelockController`](https://optimistic.etherscan.io/address/0x92024C4bDa9DA602b711B9AbB610d072018eb58b)\
&#x20;       [`RewardsController`](https://optimistic.etherscan.io/address/0xBd1ba78A3976cAB420A9203E6ef14D18C2B2E031)\
&#x20;       [`EscrowedEXA`](https://optimistic.etherscan.io/address/0xbea586A167853ADddEF12818f264f1F9823fBc18)\
&#x20;       [`Treasury`](https://optimistic.etherscan.io/address/0x23fd464e0b0ee21cedeb929b19cabf9bd5215019)\
&#x20;       [`Airdrop`](https://optimistic.etherscan.io/token/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b?a=0x3cecea7ef91b6f6d3760f6b5845c3332dc00a420)

&#x20;        **totalWithdrawable** => the sum of the amount withdrawable from each Sablier stream

### EXA Token Unlock Schedule

* **DefiLlama**: <https://defillama.com/unlocks/exactly>

### Dune Dashboards

* **The EXA Token**: <https://dune.com/exactly/exa>
* **The EXA Community Airdrop**: <https://dune.com/exactly/exactly-airdrop>

### Price Info

* **CoinGecko:** <https://www.coingecko.com/en/coins/exactly-token>
* **CoinMarketCap:** <https://coinmarketcap.com/currencies/exactly-protocol/>
* **DeFiLlama:** <https://defillama.com/protocol/exactly?tokenPrice=true>
* **GeckoTerminal:** <https://www.geckoterminal.com/optimism/pools/0xf3c45b45223df6071a478851b9c17e0630fdf535>

### Velodrome DEX

* **Velodrome EXA/WETH Liquidity Pool:** \
  <https://velodrome.finance/liquidity?query=EXA>

### EXA/WETH Vaults

* **EXA/WETH LP Vault on Beefy:** \
  <https://app.beefy.com/vault/velodrome-v2-exa-weth>
* **EXA/WETH Vault on Yearn Finance:** <https://yearn.finance/vaults/10/0xc3439Ba7db7566ed0deF55c179ED9b3bA273A67F>

### Get EXA

* **Short URL**: <https://app.exact.ly/get-exa>

### **EXA on Base**

Following the approval of [EXAIP-30](https://snapshot.box/#/s:gov.exa.eth/proposal/...), the EXA token is now natively deployed on Base at the same address as on OP Mainnet (0x1e925de1c68ef83bd98ee3e130ef14a50309c01b), ensuring a consistent cross-chain identity. This deployment builds on [EXAIP-26](https://snapshot.box/#/s:gov.exa.eth/proposal/0xfaabd2a7ebaaaaea1b86a65b63c5c7cae2e1a9fa05d548aad4e07583c0967d51), which established the foundation for EXA's cross-chain expansion, and enables broader distribution through partners within the Base ecosystem. EXA maintains a single global supply across all chains: there is no local minting, and all minting and burning is exclusively controlled by authorized bridges through a bridge-gated mint/burn mechanism compliant with the EIP-7802 cross-chain standard. Cross-chain transfers between OP Mainnet and Base are enabled via a [Hyperlane](https://hyperlane.xyz/) bridge, which preserves supply integrity at the contract level. \ <br>


# EXA Tokenomics

## Token Allocation <a href="#id-8de4" id="id-8de4"></a>

The total token supply will be 10,000,000 EXA and will be distributed as follows:

* **Community:** 4,500,000 EXA (45.00%) will be distributed to Exactly Protocol’s community to foster community engagement, awareness, and protocol adoption.
* **Team, Advisors, and Investors:** 4,500,000 EXA (45.00%) will be distributed to Exactly’s employees, advisors, and investors.
* **DAO Treasury:** The Exactly DAO Treasury received an immediate allocation of 1,000,000 EXA (10%) of the total supply. It grants the Treasury immediate access to necessary resources for its role within the ecosystem.

In March 2025, through [EXAIP-21,](https://gov.exact.ly/#/proposal/0xbfbb935e3c2319826a1d9ac16ad588353bb1e940edfe280adf3113bb61a12dde) the Exactly DAO Treasury transferred 1,000,000 EXA tokens to Uphold Inc. as part of a strategic partnership.

<figure><img src="/files/RZ3WFNximttyeW8EH4hQ" alt="" width="563"><figcaption></figcaption></figure>

## Token Distribution for the Community <a href="#id-2394" id="id-2394"></a>

The total Community token supply will be distributed as follows:

### **Airdrop for early users:** <a href="#id-71b6" id="id-71b6"></a>

Since we launched the OP token rewards program in April, the community members already using the Protocol in OP Mainnet will receive an airdrop of 1% (100,000 EXA) of the total token supply, fostering community engagement, awareness, and protocol adoption. The criteria will be based on the proportion of already distributed OP rewards through our [Rewards Controller](https://docs.exact.ly/guides/protocol/rewardscontroller), measured on July 18, 2023, at 19:00 UTC. Users assigned OP rewards but didn’t claim them will also be eligible for the airdrop.

Users can claim their tokens on July 25, 2023, at 14:00 UTC. We will implement a linear stream of 4 months for airdrop tokens, starting on the actual claiming date, ensuring a controlled and steady supply of EXA tokens. To facilitate token distribution, we have selected [Sablier](https://sablier.com/) as a platform that meets high security and robustness standards. All the processes will happen through the Exactly app in the new Governance section.

### **EXA Incentives and Community Grants:** <a href="#f9d8" id="f9d8"></a>

The protocol users will receive 5% (500,000 EXA) of the total token supply during 2023 through the current Rewards Controller Contract and other incentive mechanisms through strategic [partnerships](https://docs.exact.ly/resources/partnerships) with Beefy, Velodrome, etc. **The** [**EXA token rewards**](https://medium.com/@exactly_protocol/exactly-rewards-update-introducing-exa-rewards-extending-op-rewards-program-6dd4a3dffe7a) **will start on July 24, 2023**. The remaining EXA (and Escrowed EXA) tokens will be released until May 2028 ([EXAIP-02)](https://gov.exact.ly/#/proposal/0xe8582ed61b471cddedf865aad15138503f4bd71813ece8c66f0325507ac1c2f9).

The Exactly DAO will also be awarding **EXA token grants** to those builders who want to build on top of Exactly Protocol to foster the growth of the Exactly ecosystem.

To ensure the optimal use of our available token supply, we have already introduced our [Rewards Controller Contract](https://docs.exact.ly/guides/protocol/rewardscontroller) as a distribution rule that adjusts rewards based on the percentage of the target loan volume achieved within the Exactly Protocol, using tokens allocated for community rewards.

According to [\[EXAIP-03\]](https://medium.com/@exactly_protocol/exaip-03-addressing-the-exactly-protocol-hack-and-compensating-affected-users-6e2cd4a0a179), one million EXA tokens will be distributed to the [117 affected users](https://docs.google.com/spreadsheets/d/1kZCGUnwhN6rXHZjPZrzayzZPHUmm1L_hypvpRGcqdO0/edit#gid=1354393790) in the [security incident ](https://medium.com/@exactly_protocol/exactly-protocol-incident-post-mortem-b4293d97e3ed)that occurred on August 18th. This allocation represents 10% of the total EXA token supply and approximately 20% of the EXA token supply designated for the community.

## Token distribution for Team Members, Advisors, and Investors <a href="#id-6f74" id="id-6f74"></a>

We have implemented a linear lockup period of 48 months, starting on June 1, 2024. All these tokens have voting power and are vested with Sablier.&#x20;

You can see all the EXA token holders [here](https://optimistic.etherscan.io/token/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b#balances) and the lockup scheme in the following chart:

<figure><img src="/files/XjRjFIbsu9mb76CF8DfR" alt=""><figcaption></figcaption></figure>

Please read the following articles for more information:

* [**Exactly Protocol’s Path to Decentralization**](https://medium.com/@exactly_protocol/exactly-protocols-path-to-decentralization-7a6e2099cf7c)
* [**The EXA Token Is Here!**](https://medium.com/@exactly_protocol/the-exa-token-is-here-88a2449c4eb3)
* [**\[EXAIP-01\] Transitioning to EscrowedEXA rewards (esEXA)**](https://medium.com/@exactly_protocol/exaip-01-transitioning-to-escrowedexa-rewards-esexa-d387e1f63600)
* [**\[EXAIP-02\] Adjustments to the EXA Token distribution scheme**](https://medium.com/@exactly_protocol/exaip-02-adjustments-to-the-exa-token-distribution-scheme-c8e54f503128)
* [**\[EXAIP-03\] Addressing the Exactly Protocol Hack and Compensating Affected Users**](https://medium.com/@exactly_protocol/exaip-03-addressing-the-exactly-protocol-hack-and-compensating-affected-users-6e2cd4a0a179)
* [**\[EXAIP-21\] Empowering Exa with Uphold’s Strategic Investment & Liquidity Injection**](https://gov.exact.ly/#/proposal/0xbfbb935e3c2319826a1d9ac16ad588353bb1e940edfe280adf3113bb61a12dde)
* [**\[EXAIP-30\] Deploy EXA Token on Base**](https://snapshot.box/#/s:gov.exa.eth/proposal/0x008937e16b35cf09b680436720ddee4804d07e1fa69192474fd9a3d031c25e51)

\ <br>


# EscrowedEXA (esEXA)

**EscrowedEXA Smart Contract Address (OP Mainnet):** [`0xbea586A167853ADddEF12818f264f1F9823fBc18`](https://optimistic.etherscan.io/address/0xbea586A167853ADddEF12818f264f1F9823fBc18)

The [EscrowedEXA](https://www.youtube.com/watch?v=RGE4U6os4sw) contract is an ERC-20 token that allows anyone to mint esEXA tokens in exchange for EXA tokens. The esEXA tokens are only transferable for accounts with a TRANSFERER\_ROLE, reserved for the protocol contracts to integrate smoothly.

The idea behind esEXA is to provide rewards equivalent to EXA but with a linear vesting period, gradually releasing EXA tokens, ensuring that the Exactly protocol remains sustainable and rewarding for long-term community members.

## Vesting

EscrowedEXA (esEXA) tokens can be converted into EXA tokens through vesting in a 1:1 ratio.

Elements for the esEXA to EXA conversion process:

* Burning Mechanism: Holders will burn their esEXA tokens to initiate the vesting period and convert them into EXA tokens through [Sablier](https://sablier.com/).
* EXA Reserve: Holders must provide a “reserve” in EXA proportionally to the esEXA they want to vest. This proportion is represented in the EscrowedEXA contract as \`reserveRatio\`, the “reserve” EXA tokens to start the vesting process. The reserve percentage is 35% and can be changed through governance.

### Steps

* Step 1: Claim your esEXA Rewards&#x20;
* Step 2: Initiate the vesting of your esEXA. You must deposit 35% of the total esEXA you want to vest as an EXA reserve.&#x20;
* You can get EXA [here](https://app.exact.ly/get-exa) if you don’t have the required reserve amount.

Users can cancel the vesting at their discretion, triggering the withdrawal of all vested EXA tokens from Sablier and the associated reserve. Any unvested tokens are returned to the EscrowedEXA contract, where the corresponding esEXA tokens are minted and returned to the user.

This mechanism guarantees that the exclusive path for the users to retrieve reserved EXA tokens from the EscrowedEXA contract is by adhering to the stipulated vesting schedule.

### **Withdraw Reserved EXA**&#x20;

When you withdraw the reserved EXA, the associated vesting streams will be canceled automatically. You’ll get back the earned EXA and all remaining esEXA.

<figure><img src="/files/CV4jaTL6fEnn3LZ5C4Ph" alt=""><figcaption><p><a href="https://app.exact.ly/vesting">Active Vesting Streams</a></p></figcaption></figure>

**GitHub URL:**

<https://github.com/exactly/protocol/blob/main/contracts/periphery/EscrowedEXA.sol>

**EXAIP-01 Transitioning to EscrowedEXA rewards (esEXA):** <https://gov.exact.ly/#/proposal/0x889d08cbe0ed7be4fd437ca374ef2845b4dbd641a6d2c57e76cd2c54d47fcadc>

**EXAIP-06 Increasing the esEXA Reserve:** <https://gov.exact.ly/#/proposal/0xaa0fa1ea69371b6ba475962b488970778761be8b36427a08af5194264a573178>

&#x20;


# EXA Staking Program (stEXA)

The EXA Staking Program enables EXA token holders to get treasury fees and gain additional voting power by staking their EXA tokens.

{% embed url="<https://www.youtube.com/watch?v=lIyyR6FFn4k>" %}

### Distribution of protocol fees

The protocol's treasury fees will be partly allocated to the Staking Program. A specified fraction (providerRatio) of these fees will be assigned to the staking pool, with an initial parameter of 0.5 (50% of the fees). The rest of the fees go to [Exactly DAO Savings Account Multisig](https://optimistic.etherscan.io/address/0x8a1c05c4462b3554814a637e940b3342ffbe02f2).

[Staking Contract address](https://optimistic.etherscan.io/address/0xCEed2bFE740F02dB6094eBE89FF93b1031be752b)

### Dividend module

Users who stake their EXA tokens will receive dividends based on the staking duration. The dividend index updates regularly, ensuring that participants who stake for longer periods receive proportional rewards. This module supports multiple assets, although a single-asset approach for exaUSDC will be used to simplify the automatic dividend distribution.

### Staking Steps

* Go to  <https://app.exact.ly/staking> and select the amount of EXA you want to stake.&#x20;
* Click “Stake EXA” to confirm.
* Once the transaction is completed, you will see your staked EXA.

<figure><img src="/files/YqhNWVM13ri3CoM6iylr" alt=""><figcaption></figcaption></figure>

### Staking period

The staking period will be twelve months. During this time, the stakeholder can add more EXA to their stake to earn more rewards, claim them, or partially/fully unstake their position.

<figure><img src="/files/r82S3ip1fByWXRObUrws" alt=""><figcaption></figcaption></figure>

Once you claim the fees, the exaUSDC will be deposited into your account. You can view them in the Dashboard section.

Remember, the exaUSDC you earn from staking is automatically deposited into the USDC market, compounding its variable APR. It will continue to generate esEXA rewards as long as you hold it. Plus, you can swap exaUSDC for USDC anytime directly from your dashboard.

You can swap your exaUSDC for USDC by clicking “Withdraw”

<figure><img src="/files/RaCHjrr929QoejBAXZSe" alt=""><figcaption></figcaption></figure>

### Enhanced voting power

Stakers will gain additional voting power, directly influencing protocol decisions. The voting power increases with the staking duration, incentivizing users to stake for extended periods.

### Extra rewards

Besides dividends, participants in the Staking Program could receive rewards in other tokens, providing further incentives for long-term participation.

### EXA buybacks

Discretionary EXA buybacks buy the Treasury with the remaining fees not distributed in the staking program.

### Early withdrawals

The program is designed to encourage users to complete the full 12-month staking period. Withdrawals made before the end of this period will result in a reduction of the dividends received. The earlier the withdrawal, the smaller the share of dividends awarded, ensuring that users who complete the program are more effectively rewarded.

### Overstay

Users are encouraged to restart their staking positions after the 12-month program ends. For those who keep their tokens staked beyond this period, the dividends accrued after the end date will be reduced. This adjustment ensures that rewards remain aligned with the intended duration of the program and encourages regular commitment cycles.

### Initial parameters

* ProviderRatio: 0.5 (50% of treasury fees to the staking pool)&#x20;
* Minimum Time to Stake: 0 months&#x20;
* Reference Period to Stake: 12 months \
  \
  Initial parameters can be modified through governance.

### **Estimated Staking APR**

The Staking Program "Estimated APR" is equal to 50% of last week's treasury fees from the USDC market (annualized) divided by the total EXA Staked (in $). &#x20;

You can find the actual staking APR [here](https://app.exact.ly/staking) and the weekly treasury fees [here](https://dune.com/exactly/exactly#treasury-fees).

### Math Notes and Audits

* [**Staking Program Math Notes**](https://github.com/exactly/papers/blob/main/Staking%20Model%20Math%20Notes.pdf)
* [**Chainsafe Staking Program Audit**](https://github.com/exactly/audits/blob/main/Chainsafe%20Staking%20Contract%20\(Aug-24\).pdf)
* [**Sherlock Staking Program Audit**](https://github.com/exactly/audits/blob/main/Sherlock%20Staking%20Contract%20\(Aug-24\).pdf)


# The Exa App

At Exactly Protocol, our mission has always been clear: innovate and make DeFi more accessible to real-world users. With the success of our fixed-rate DeFi credit market, we set a new standard for stability and predictability in crypto lending and borrowing.<br>

Now, we're advancing with the launch of the Exa App and its first product, the Exa Card. Available from day one in 160+ countries, it offers seamless global access without requiring a bank account or credit score. <br>

To get started, download the Exa App and create an account with a streamlined onboarding experience.

* [App Store](https://apps.apple.com/ar/app/exa-app/id6572315454)
* [Google Play](https://play.google.com/store/apps/details?id=app.exactly\&hl=en)

Exa App account creation is powered by passkeys, which replace traditional passwords and recovery phrases with a secure, biometric-based method, such as fingerprint or facial recognition. During setup, the app generates a passkey linked to your device, secured by your biometric data, which remains stored locally. This ensures both privacy and security at all times.

The next step is to complete the KYC process, after which your Exa Card will be issued.&#x20;

To learn more about the Exa App, visit <https://exactly.app/>.&#x20;


# How the Exa App works

The Exa App is not just a fintech app but a gateway to decentralized finance through a clean UX. Designed for iOS and Android, the app enables users to manage their crypto assets, earn yield, and make real-world payments in installments — all while maintaining full custody of their funds through a secure account.

Upon downloading the app, users create an account using passkeys that replace outdated systems like passwords and seed phrases with biometric-based authentication (e.g., fingerprints or facial recognition) or device-level security.

After creating an account, users who want to get their Exa Card complete a quick Know Your Customer (KYC) verification process to comply with Visa regulations.

The Exa App, available in over 160 countries, ensures that anyone can access DeFi’s benefits anywhere.

## Exa Card <a href="#id-02e5" id="id-02e5"></a>

The Exa Card is the first product of the Exa App. It’s the world’s first onchain card that allows users to make purchases in the real world in up to seven installments without the need to sell their crypto.

The Exa Card is issued immediately after the KYC and can be used for online and in-store purchases. Users can add their Exa Card to their smartphone wallet and start spending in minutes. It works with Apple Wallet and Google Wallet.

When users deposit supported assets — such as USDC, ETH, wstETH, WBTC, and OP — into the app, the funds are automatically allocated to Exactly Protocol’s markets, where they begin generating a variable APR. This yield is derived directly from interest paid by borrowers in the protocol, ensuring sustainable returns that are not reliant on token incentives.

## Pay Mode <a href="#a46c" id="a46c"></a>

In the Pay Mode section, users can select to "Pay Now" or "Installment Plans".\
Pay Now mode allows users to purchase directly from their deposited balance. Each time a payment is made, the required amount is seamlessly deducted from the user’s funds stored in Exactly Protocol’s lending markets. Until the moment of payment, these funds continue to generate variable yield, maximizing the efficiency of the user’s assets.

Installment plans allow users to purchase in multiple installments without selling their assets.&#x20;

Here’s how it works:

* Collateral and credit limit: Deposited assets act as collateral, determining the user’s credit limit. Deposits made into the Exa App are allocated to Exactly Protocol’s variable lending markets, generating variable yield based on borrowers’ demand.
* Onchain borrowing: When a user makes a purchase, the Exa App borrows the required amount on their behalf from Exactly Protocol’s fixed-rate lending markets. The borrowed funds are converted to USD and sent directly to the merchant. This interest rate is fixed and determined at the time of the transaction.
* Installments and repayment: Users can repay the loan in up to six fixed installments, scheduled every 28 days. This structured repayment cycle ensures predictability and avoids discrepancies caused by variable calendar months.

Users benefit from an innovative financial structure that combines fixed-rate borrowing with variable-rate deposit yields. This unique approach can result in a positive, neutral, or negative net effective interest rate for each purchase, depending on the relationship between the deposit yield and the loan’s fixed interest rate.<br>


# The Exa Tech stack

There are three different layers that constitute the Exa Tech Stack that allows us to provide a Web2 UX while getting the cutting edge of the Web3 in our users hands.

<figure><img src="/files/JAwIdIaCNHLgfjMSSW5o" alt=""><figcaption></figcaption></figure>

Lets go layer by layer:

* **Exactly Protocol** is the core, it's a decentralized protocol that allows users to deposit assets to earn yield while acting as collateral and borrow at fixed interest rates that can be repaid in installments.
* **Alchemy Account Kit, The Webauthn Plugin and the Exa Plugin** are in the middle, and they the tools that make the app easy to use.&#x20;
  * Alchemy account kit: A modular smart account that permits abstraction of several processes and reduces the friction with the users. Besides, sets the basis for the plugins, which are modules of the modular accounts.
  * [Webauthn Plugin](https://docs.exact.ly/exa-app/the-exa-app-webauthn-owner-plugin): the main function is to create a more adaptable wallet system where the users can benefit from features traditionally associated with externally owned accounts (EOA) or smart contracts without needing to manage complex private keys. This allows the Exa App users to sign with passkeys or/and with other Ethereum wallets.&#x20;
  * [Exa Plugin](https://docs.exact.ly/exa-app/exa-plugin): enables users to borrow, lend, and manage credit and debit transactions through a self-custodial smart account, in other words, it ensures a smooth DeFi experience, automating key financial operations while maintaining security and efficiency.
* **Exa App:** This is the application the user sees and interacts with. It is designed with a familiar and intuitive interface, similar to today's popular fintech and banking apps. This provides a user-friendly experience, masking the powerful and complex technology that runs underneath. The required integrations to go through the KYC (Persona), issue the Exa Cards (Rain) and communicating with customer support (Intercom) are done in the Exa App's backend.

In summary, the Exa App architecture leverages advanced, secure technology on the back end to deliver a simple, safe, and powerful financial experience to its users.


# The Exa App Webauthn Owner Plugin

In collaboration with [Circle](https://www.circle.com/) and [Alchemy](https://www.alchemy.com/) and audited by [Quantstamp](https://quantstamp.com/), the Exactly Protocol team has developed the [Webauthn Owner Plugin](https://github.com/exactly/webauthn-owner-plugin) to integrate passkeys into the Exa App and create a seamless self-custodial experience for Exa App users.

* [Exa App Webauthn Owner Plugin audit](https://certificate.quantstamp.com/full/exactly-web-authn-owner-plugin/195741fd-c62b-4a88-87b8-020dd454bd59/index.html)

The plugin supports multiple verification methods, including:

* ECDSA signature verification: This is the standard used by most externally owned accounts (EOA) on Ethereum.
* ERC-1271 signature verification: This allows smart contracts to verify signatures, providing flexibility for different types of accounts.
* WebAuthn and P256 passkey signature verification: Thanks to the RIP-7212 standard, P256 passkey signatures are now fast, secure, and cheaper to verify.

Thanks to the recent Fjord network upgrade on Optimism, the RIP-7212 standard was introduced. This enables P256 signature verification to be 20 times cheaper than before, significantly reducing gas fees for passkey-based authentication. With RIP-7212, passkeys become not only more secure but also cost-effective for daily use in decentralized applications like the Exa App.

The Webauthn Owner Plugin uses the RIP-7212 precompiled contract to verify P256 passkey signatures at a significantly reduced gas cost.

This plugin also implements EIP-712, a standard for structured data signing in smart contracts, which makes transaction approval more user-friendly and secure. Together, these features ensure that users can interact with DeFi without needing to validate every single on-chain action manually—improving the overall user experience.

### ERC-6900: Modular Accounts for a better Web3 experience

The Webauthn Owner Plugin is built on the [ERC-6900](https://erc6900.io/modules/) standard, which introduces a modular approach to [smart contract accounts](https://www.alchemy.com/account-contracts). This standard allows for greater flexibility in handling authentication and account management. With ERC-6900, developers can create reusable plugins that integrate advanced features like passkey verification or multi-owner accounts.

For users, this means a more adaptable wallet system where they can benefit from features traditionally associated with externally owned accounts (EOA) or smart contracts without needing to manage complex private keys.&#x20;

This modular approach allows developers to implement account features, like biometric authentication or multi-owner access, without needing to manage or expose sensitive private keys, making DeFi more secure and user-friendly.

### What does this mean for the Exa App users?

The Exa App is designed to remove the complexities of DeFi and provide a smooth, user-friendly experience. Here’s how the app benefits users:

* Self-custodial wallet: Users maintain full ownership of their funds at all times. There is no reliance on third parties, and the private key is never exposed, providing the highest level of security.
* Simplicity: Instead of managing a 12-word recovery phrase, users can easily access their wallet through biometric authentication, removing the technical barriers typically associated with Web3.
* Cost-effective transactions: With RIP-7212, P256 passkey signature verification is 20 times cheaper, significantly reducing gas fees for authentication on supported Layer 2 networks like Optimism.


# Exa Plugin

Powering onchain credit, debit and lending in the Exa App

## Overview

The Exa Plugin is a modular smart contract designed exclusively for the Exa App, providing seamless interaction with the Exactly Protocol. This integration enables users to borrow, lend, and manage credit and debit transactions through a self-custodial smart account. By leveraging ERC-6900 modular accounts, the Exa Plugin ensures a smooth DeFi experience, automating key financial operations while maintaining security and efficiency.&#x20;

[Quantstamp](https://quantstamp.com/) audited the Exa Plugin to verify its adherence to high-security standards. By integrating this plugin, Exa App users can:<br>

* Deposit collateral and take loans within Exactly Protocol.
* Execute credit or debit transactions without constant manual approvals.
* Automate key lending and borrowing processes using a structured role system.

### Key Characteristics:<br>

* Automated lending and borrowing: The plugin facilitates collateral management and repayments through Exactly Protocol without requiring user intervention for each action.
* WebAuthn integration: Users authenticate transactions using biometrics, eliminating the need for seed phrases.
* Keeper role automation: The keeper bot assists in executing operations like enabling collateral, processing loans, managing repayments, and handling proposals.

### Roles and Responsibilities

The Exa Plugin defines specific roles to enforce structured execution logic, ensuring secure and automated transactions.

**Admin Role (DEFAULT\_ADMIN\_ROLE)**

The admin role is designed to manage critical plugin settings and role assignments.

Key functions:

`setIssuer()` – Assigns the issuer responsible for transaction approvals.

`setOperationExpiry()` – Configures the expiry time for transaction authorization.

`setPrevIssuerWindow()` – Defines the time window for recognizing previous issuers.

grantRole(role), setFlashLoaner, setCollector, setProposalManager,setSwapper, allowPlugin

**Keeper Role (KEEPER\_ROLE)**&#x20;

The KEEPER\_ROLE is assigned to an automated entity responsible for executing transactions that require protocol enforcement. This role interacts with Exactly Protocol’s lending pools and ensures credit-related actions comply with liquidity constraints and proposal validations.

Functions restricted to KEEPER\_ROLE:

`collectCredit()` – Executes on-chain borrowing for credit transactions.

`collectCollateral()` – Moves collateral from external markets into Exactly Protocol.

`collectInstallments()` – Processes installment-based credit repayments.

`collectDebit()` – Handles direct debit operations to repay borrowed amounts.

`poke() / pokeETH()` – Marks assets as collateral and updates liquidity status.

`repay() / crossRepay()` – Facilitates repayment and refinancing of loans.

`executeProposal()` – Executes time-locked proposals submitted by the user.

These functions enforce risk management mechanisms, prevent unauthorized withdrawals, and ensure the proper execution of credit-related workflows.

**Issuer Role (IssuerChecker)**

The issuer is responsible for validating and authorizing transactions within the Exa Plugin. This role ensures that credit transactions and refunds are approved before execution, enforcing additional security measures.

The issuer operates through the IssuerChecker contract, which verifies and signs operations related to credit payments and refunds.

The issuer is responsible for:

`checkIssuer()` – Verifies that a credit or refund transaction is properly signed and authorized.

### Core Smart Contracts

The Exa Plugin consists of multiple smart contracts, each playing a crucial role in enabling lending, credit payments, and refunds.

**1. Exa Account Factory (ExaAccountFactory.sol)**

This contract creates and initializes modular accounts for users, integrating both the WebAuthn owner plugin and the Exa Plugin.

Deploys accounts with pre-configured plugins for WebAuthn authentication and on-chain lending.

Uses `donateStake()` to add stake in the EntryPoint contract.

Handles the initialization of accounts, ensuring all required plugins are installed.

**2. Exa Account Interface (IExaAccount.sol)**

Defines the core lending, repayment, and proposal functions used by the Exa Plugin.

Supports borrowing, collateral management, token swaps, and repayments.

Implements liquidity and risk management constraints.

Introduces a proposal system to delay execution and validate intent.

**3. Installments Previewer (InstallmentsPreviewer.sol)**

A read-only contract that calculates expected loan installments based on market conditions.

Fetches floating and fixed-rate borrowing data from Exactly Protocol.

Evaluates utilization rates for risk assessment.

Helps users preview their installment plans before borrowing.

**4. Issuer Checker (IssuerChecker.sol)**

Handles issuer validation and transaction approval.\
Uses ECDSA signature verification to authenticate transactions.

Maintains an operation expiry window to prevent replay attacks.

Ensures only authorized issuers can approve transactions.

**5. Refunder (Refunder.sol)**

Processes approved refunds for users.

Interacts with Exactly Protocol to deposit refunded assets.

Uses IssuerChecker to validate refund requests.

Implements role-based access control to restrict refund execution.

## Security Considerations<br>

* Restricted function execution: Only approved functions can interact with the Exactly Protocol.<br>
* Proposal-based withdrawals: Ensures sufficient collateral remains locked before allowing withdrawals.<br>
* Execution hooks: Enforces execution logic through runtime validations and prevents unauthorized calls.<br>
* Plugin allowlist: Only approved plugins can be installed or swapped, reducing attack vectors.<br>
* Flash loan risk protection: Credit repayment with flash loans is validated atomically to avoid misuse.

[Ex**a Plugin GitHub repository**](https://github.com/exactly/mobile/blob/368df252a3db7b2e370f1ed0af8db0939b45138e/contracts/src/ExaPlugin.sol)

[**Exa Plugin Audit**](https://github.com/exactly/audits/blob/main/Quantstamp%20Exa%20App%20Plugin%20\(Mar-25\).pdf)


# Integrating the Exa App

Fintechs, banks and exchanges can integrate the Exa App products into their own platforms

There are two ways of integrating the suite of services provided in the Exa App into any platform.

<figure><img src="/files/ovUt58SFLIbDHNatztNg" alt=""><figcaption></figcaption></figure>

#### API integration

100% whitelabel solution, giving the partner complete control to build our services directly into their own platform. This path is ideal for partners who want a seamless, deeply integrated experience that matches their existing brand precisely.

* Total Control: The partner selects exactly which Exa services to implement.
* Complete Customization:  Full control over the user experience (UX) and user interface (UI).
* Whitelabel Branding: Design the entire flow to match partner's brand, including the option to create a custom design for the Exa Card.

Learn more: [View API Documentation](https://exactly.github.io/exa/api/)

#### Web-Based Integration

This is the fastest way to get started. In just a few days, the partner can embed the Exa "mini-app" directly into their platform.

This solution provides users with a complete set of financial services without requiring them to leave the partner's app or website.

* Fast to Market: Go live in just a few days with minimal development effort.
* Full Functionality:  Access to the complete, pre-built Exa experience.
* Seamless Access: Users can access all services from within the partner's platform.

Learn more: [See embed example code](https://github.com/exactly/exa-embed-example) and [test it](https://exactly.github.io/exa-embed-example/)


# Exa App FAQs

Access the knowledge base for the Exa App where you can deep dive in how it works.

<https://intercom.help/exa-app>


# Exa App and Exa Card assets

### Logos

For the full set of logos reach out to this [Figma page](https://www.figma.com/design/OpmH5cyVk1sosdAEecMDHM/00.-Brand-Assets?node-id=240-96\&t=FYG8Bir0R8kXYiSN-0)

\
![](/files/hQa3JolngQJYVv1cObeW)\
[Exa logo white large](https://drive.google.com/file/d/1ENM7PM_nGsWEy8VE7_ztPSJsUrKNHJQX/view?usp=drive_link) png  \
[Exa logo white small](https://drive.google.com/file/d/1w8knVczdveSCXN2cdIt5Khh2JgiYyK7X/view?usp=drive_link) png\
[Exa logo white ](https://drive.google.com/file/d/1iVVx_9mp-7w8oC2I63MxpnCIAkWjaXpD/view?usp=drive_link)svg\ <br>

<figure><img src="/files/cMNTzw1FBG5B6zHoIIpi" alt=""><figcaption></figcaption></figure>

[Exa logo black large](https://drive.google.com/file/d/1elJRPYtrvnqjcHyyysxRoppcNWKksFjs/view?usp=drive_link) png  \
[Exa logo black small](https://drive.google.com/file/d/1Pr1EDpePZhZd0gLlXF1qHiWzDAO_KxOv/view?usp=drive_link) png\
[Exa logo black ](https://drive.google.com/file/d/1wsBF0mRjzpIIzZ5FpFUMbyIJ017mvAVJ/view?usp=drive_link)svg

### Color palette and typography

[Exa's color palette](https://www.figma.com/design/OpmH5cyVk1sosdAEecMDHM/00.-Brand-Assets?node-id=242-12\&t=FYG8Bir0R8kXYiSN-0)

<figure><img src="/files/nCkoYEf2M5CguSUkfvmi" alt=""><figcaption></figcaption></figure>

\
The [typography](https://www.figma.com/design/OpmH5cyVk1sosdAEecMDHM/00.-Brand-Assets?node-id=242-105\&t=FYG8Bir0R8kXYiSN-0) is Spline Sans in regular or semibold (used for highlights)\
![](/files/NEMGQKME8NzkZqJ5IcLQ)

### Exa Card

<figure><img src="/files/WuMXO8a8ni2HsuNtHVue" alt=""><figcaption></figcaption></figure>

For more detail visit this [link](https://www.figma.com/design/OpmH5cyVk1sosdAEecMDHM/00.-Brand-Assets?node-id=244-39\&t=FYG8Bir0R8kXYiSN-0)


# Protocol

![Smart Contract Architecture](/files/8ARw3OPOcLDDuavdtYYw)*Smart Contract Architecture*

Github: <https://github.com/exactly/protocol>

Coverage: <https://app.codecov.io/gh/exactly/protocol>


# Auditor

The **Auditor** is the risk management layer of the protocol; it determines how much collateral a user is required to maintain, and whether (and by how much) a user can be liquidated. Each time a user borrows from a [Market](/guides/protocol/market), the **Auditor** validates his account’s liquidity to determine his health factor.

## Public State Variables

### ASSETS\_THRESHOLD

```solidity
function ASSETS_THRESHOLD() external view returns (uint256)
```

Maximum value the liquidator can send and still have granular control of max assets. Above this threshold, they should send `type(uint256).max`.

### BASE\_FEED

```solidity
function BASE_FEED() external view returns (address)
```

Address that a market should have as price feed to consider as base price and avoid external price call.

### TARGET\_HEALTH

```solidity
function TARGET_HEALTH() external view returns (uint256)
```

Target health factor that the account should have after it's liquidated to prevent cascade liquidations.

### accountMarkets

```solidity
function accountMarkets(address) external view returns (uint256)
```

Tracks the markets' indexes that an account has entered as collateral.

### liquidationIncentive

```solidity
function liquidationIncentive() external view returns (uint128 liquidator, uint128 lenders)
```

Liquidation incentive factors for the liquidator and the lenders of the market where the debt is repaid.

### marketList

```solidity
function marketList(uint256) external view returns (contract Market)
```

Array of all enabled markets.

### markets

```solidity
function markets(contract Market) external view returns (uint128 adjustFactor, uint8 decimals, uint8 index, bool isListed, contract IPriceFeed priceFeed)
```

Stores market parameters per each enabled market.

### priceDecimals

```solidity
function priceDecimals() external view returns (uint256)
```

Decimals that the answer of all price feeds should have.

## View Methods

### accountLiquidity

```solidity
function accountLiquidity(address account, contract Market marketToSimulate, uint256 withdrawAmount) external view returns (uint256 sumCollateral, uint256 sumDebtPlusEffects)
```

Returns account's liquidity calculation.

**Parameters**

| Name             | Type            | Description                                        |
| ---------------- | --------------- | -------------------------------------------------- |
| account          | address         | account in which the liquidity will be calculated. |
| marketToSimulate | contract Market | market in which to simulate withdraw operation.    |
| withdrawAmount   | uint256         | amount to simulate as withdraw.                    |

**Returns**

| Name               | Type    | Description                                                                            |
| ------------------ | ------- | -------------------------------------------------------------------------------------- |
| sumCollateral      | uint256 | sum of all collateral, already multiplied by each adjust factor (denominated in base). |
| sumDebtPlusEffects | uint256 | sum of all debt divided by adjust factor considering withdrawal (denominated in base). |

### allMarkets

```solidity
function allMarkets() external view returns (contract Market[])
```

Retrieves all markets.

**Returns**

| Type               | Description              |
| ------------------ | ------------------------ |
| contract Market\[] | List of enabled markets. |

### assetPrice

```solidity
function assetPrice(contract IPriceFeed priceFeed) external view returns (uint256)
```

Gets the asset price of a price feed.

*If Chainlink's asset price is <= 0 the call is reverted.*

**Parameters**

| Name      | Type                | Description                                                                 |
| --------- | ------------------- | --------------------------------------------------------------------------- |
| priceFeed | contract IPriceFeed | address of Chainlink's Price Feed aggregator used to query the asset price. |

**Returns**

| Type    | Description                                         |
| ------- | --------------------------------------------------- |
| uint256 | The price of the asset scaled to 18-digit decimals. |

### calculateSeize

```solidity
function calculateSeize(contract Market repayMarket, contract Market seizeMarket, address borrower, uint256 actualRepayAssets) external view returns (uint256 lendersAssets, uint256 seizeAssets)
```

Calculates the amount of collateral to be seized when a position is undercollateralized.

**Parameters**

| Name              | Type            | Description                                                    |
| ----------------- | --------------- | -------------------------------------------------------------- |
| repayMarket       | contract Market | market from where the debt will be repaid.                     |
| seizeMarket       | contract Market | market from where the assets will be seized by the liquidator. |
| borrower          | address         | account in which assets are being seized.                      |
| actualRepayAssets | uint256         | amount being repaid.                                           |

**Returns**

| Name          | Type    | Description                                                                  |
| ------------- | ------- | ---------------------------------------------------------------------------- |
| lendersAssets | uint256 | amount to be added for other lenders as a compensation of bad debt clearing. |
| seizeAssets   | uint256 | amount that can be seized by the liquidator.                                 |

### checkLiquidation

```solidity
function checkLiquidation(contract Market repayMarket, contract Market seizeMarket, address borrower, uint256 maxLiquidatorAssets) external view returns (uint256 maxRepayAssets)
```

Allows/rejects liquidation of assets.

*This function can be called externally, but only will have effect when called from a market.*

**Parameters**

| Name                | Type            | Description                                                 |
| ------------------- | --------------- | ----------------------------------------------------------- |
| repayMarket         | contract Market | market from where the debt is being repaid.                 |
| seizeMarket         | contract Market | market from where the liquidator will seize assets.         |
| borrower            | address         | address in which the assets are being liquidated.           |
| maxLiquidatorAssets | uint256         | maximum amount of debt the liquidator is willing to accept. |

**Returns**

| Name           | Type    | Description                                               |
| -------------- | ------- | --------------------------------------------------------- |
| maxRepayAssets | uint256 | capped amount of debt the liquidator is allowed to repay. |

### checkSeize

```solidity
function checkSeize(contract Market repayMarket, contract Market seizeMarket) external view
```

Allow/rejects seizing of assets.

*This function can be called externally, but only will have effect when called from a market.*

**Parameters**

| Name        | Type            | Description                                |
| ----------- | --------------- | ------------------------------------------ |
| repayMarket | contract Market | market from where the debt will be repaid. |
| seizeMarket | contract Market | market where the assets will be seized.    |

### checkShortfall

```solidity
function checkShortfall(contract Market market, address account, uint256 amount) external view
```

Checks if the account has liquidity shortfall.

**Parameters**

| Name    | Type            | Description                                             |
| ------- | --------------- | ------------------------------------------------------- |
| market  | contract Market | address of the market where the operation will happen.  |
| account | address         | address of the account to check for possible shortfall. |
| amount  | uint256         | amount that the account wants to withdraw or transfer.  |

## Write Methods

### checkBorrow

```solidity
function checkBorrow(contract Market market, address borrower) external nonpayable
```

Validates that the current state of the position and system are valid.

*To be called after adding the borrowed debt to the account position.*

**Parameters**

| Name     | Type            | Description                                      |
| -------- | --------------- | ------------------------------------------------ |
| market   | contract Market | address of the market where the borrow is made.  |
| borrower | address         | address of the account that will repay the debt. |

### enableMarket

```solidity
function enableMarket(contract Market market, contract IPriceFeed priceFeed, uint128 adjustFactor, uint8 decimals) external nonpayable
```

Enables a certain market.

*Enabling more than 256 markets will cause an overflow when casting market index to uint8.*

**Parameters**

| Name         | Type                | Description                                                                         |
| ------------ | ------------------- | ----------------------------------------------------------------------------------- |
| market       | contract Market     | market to add to the protocol.                                                      |
| priceFeed    | contract IPriceFeed | address of Chainlink's Price Feed aggregator used to query the asset price in base. |
| adjustFactor | uint128             | market's adjust factor for the underlying asset.                                    |
| decimals     | uint8               | decimals of the market's underlying asset.                                          |

### enterMarket

```solidity
function enterMarket(contract Market market) external nonpayable
```

Allows assets of a certain market to be used as collateral for borrowing other assets.

**Parameters**

| Name   | Type            | Description                      |
| ------ | --------------- | -------------------------------- |
| market | contract Market | market to enabled as collateral. |

### exitMarket

```solidity
function exitMarket(contract Market market) external nonpayable
```

Removes market from sender's account liquidity calculation.

*Sender must not have an outstanding borrow balance in the asset, or be providing necessary collateral for an outstanding borrow.*

**Parameters**

| Name   | Type            | Description                          |
| ------ | --------------- | ------------------------------------ |
| market | contract Market | market to be disabled as collateral. |

### handleBadDebt

```solidity
function handleBadDebt(address account) external nonpayable
```

Checks if account has debt with no collateral, if so then call `clearBadDebt` from each market.

*Collateral is multiplied by price and adjust factor to be accurately evaluated as positive collateral asset.*

**Parameters**

| Name    | Type    | Description                             |
| ------- | ------- | --------------------------------------- |
| account | address | account in which debt is being checked. |


# MarketETHRouter

To be used by Exactly’s web-app, so accounts can operate with `ETH` on **MarketWETH**.\
\
Wraps `ETH` or unwraps `WETH` before and after interacting with **MarketWETH**. It saves one step for the user.

## Public State Variables

### market

```solidity
function market() external view returns (contract Market)
```

### weth

```solidity
function weth() external view returns (contract WETH
```

## Write Methods

### borrow

```solidity
function borrow(uint256 assets) external nonpayable returns (uint256 borrowShares)
```

Unwraps WETH from the floating pool and borrows to caller.

**Parameters**

| Name   | Type    | Description                 |
| ------ | ------- | --------------------------- |
| assets | uint256 | amount of assets to borrow. |

**Returns**

| Name         | Type    | Description                |
| ------------ | ------- | -------------------------- |
| borrowShares | uint256 | number of borrowed shares. |

### borrowAtMaturity

```solidity
function borrowAtMaturity(uint256 maturity, uint256 assets, uint256 maxAssetsAllowed) external nonpayable returns (uint256 assetsOwed)
```

Unwraps WETH from a maturity and borrows to caller.

**Parameters**

| Name             | Type    | Description                                                  |
| ---------------- | ------- | ------------------------------------------------------------ |
| maturity         | uint256 | maturity date for repayment.                                 |
| assets           | uint256 | amount to be sent to caller.                                 |
| maxAssetsAllowed | uint256 | maximum amount of debt that the caller is willing to accept. |

**Returns**

| Name       | Type    | Description                                                        |
| ---------- | ------- | ------------------------------------------------------------------ |
| assetsOwed | uint256 | total amount of assets (principal + fee) to be repaid at maturity. |

### deposit

```solidity
function deposit() external payable returns (uint256 shares)
```

Wraps ETH and deposits WETH into the floating pool's market.

**Returns**

| Name   | Type    | Description              |
| ------ | ------- | ------------------------ |
| shares | uint256 | number of minted shares. |

### depositAtMaturity

```solidity
function depositAtMaturity(uint256 maturity, uint256 minAssetsRequired) external payable returns (uint256 maturityAssets)
```

Wraps ETH and deposits to a maturity.

**Parameters**

| Name              | Type    | Description                                                                         |
| ----------------- | ------- | ----------------------------------------------------------------------------------- |
| maturity          | uint256 | maturity date where the assets will be deposited.                                   |
| minAssetsRequired | uint256 | minimum amount of assets required by the caller for the transaction to be accepted. |

**Returns**

| Name           | Type    | Description                                                           |
| -------------- | ------- | --------------------------------------------------------------------- |
| maturityAssets | uint256 | total amount of assets (principal + fee) to be withdrawn at maturity. |

### redeem

```solidity
function redeem(uint256 shares) external nonpayable returns (uint256 assets)
```

Unwraps WETH from the floating pool and withdraws to caller.

**Parameters**

| Name   | Type    | Description                                          |
| ------ | ------- | ---------------------------------------------------- |
| shares | uint256 | amount of shares to be burned in exchange of assets. |

**Returns**

| Name   | Type    | Description                 |
| ------ | ------- | --------------------------- |
| assets | uint256 | amount of assets withdrawn. |

### refund

```solidity
function refund(uint256 borrowShares) external payable returns (uint256 repaidAssets, uint256 actualShares)
```

Wraps ETH and repays to the floating pool.

**Parameters**

| Name         | Type    | Description                                     |
| ------------ | ------- | ----------------------------------------------- |
| borrowShares | uint256 | shares to be subtracted from the caller's debt. |

**Returns**

| Name         | Type    | Description                                                                            |
| ------------ | ------- | -------------------------------------------------------------------------------------- |
| repaidAssets | uint256 | number of repaid assets.                                                               |
| actualShares | uint256 | number of borrowed shares subtracted from the debt (can be lower than `borrowShares`). |

### repay

```solidity
function repay(uint256 assets) external payable returns (uint256 repaidAssets, uint256 borrowShares)
```

Wraps ETH and repays to the floating pool.

**Parameters**

| Name   | Type    | Description                |
| ------ | ------- | -------------------------- |
| assets | uint256 | amount of assets to repay. |

**Returns**

| Name         | Type    | Description                                           |
| ------------ | ------- | ----------------------------------------------------- |
| repaidAssets | uint256 | number of repaid assets (can be lower than `assets`). |
| borrowShares | uint256 | number of borrowed shares subtracted from the debt.   |

### repayAtMaturity

```solidity
function repayAtMaturity(uint256 maturity, uint256 assets) external payable returns (uint256 repaidAssets)
```

Wraps ETH and repays to a maturity.

**Parameters**

| Name     | Type    | Description                                    |
| -------- | ------- | ---------------------------------------------- |
| maturity | uint256 | maturity date where the assets will be repaid. |
| assets   | uint256 | amount to be paid for the caller's debt.       |

**Returns**

| Name         | Type    | Description                                             |
| ------------ | ------- | ------------------------------------------------------- |
| repaidAssets | uint256 | the actual amount that was transferred into the Market. |

### withdraw

```solidity
function withdraw(uint256 assets) external nonpayable returns (uint256 shares)
```

Unwraps WETH from the floating pool and withdraws to caller.

**Parameters**

| Name   | Type    | Description                   |
| ------ | ------- | ----------------------------- |
| assets | uint256 | amount of assets to withdraw. |

**Returns**

| Name   | Type    | Description              |
| ------ | ------- | ------------------------ |
| shares | uint256 | number of burned shares. |

### withdrawAtMaturity

```solidity
function withdrawAtMaturity(uint256 maturity, uint256 assets, uint256 minAssetsRequired) external nonpayable returns (uint256 actualAssets)
```

Unwraps WETH from a maturity and withdraws to caller.

**Parameters**

| Name              | Type    | Description                                                                        |
| ----------------- | ------- | ---------------------------------------------------------------------------------- |
| maturity          | uint256 | maturity date where the assets will be withdrawn.                                  |
| assets            | uint256 | position size to be reduced.                                                       |
| minAssetsRequired | uint256 | minimum amount required by the caller (if discount included for early withdrawal). |

**Returns**

| Name         | Type    | Description                                                             |
| ------------ | ------- | ----------------------------------------------------------------------- |
| actualAssets | uint256 | amount of assets withdrawn (can include a discount for early withdraw). |


# Market

The **Market** is the main contract of the protocol. It exposes all user-oriented actions for fixed and variable borrows, deposits, repayments, and withdrawals.\
The contract is also an [ERC20](https://eips.ethereum.org/EIPS/eip-20) token itself. Following the [ERC4626](/guides/protocol/market/erc-4626) standard, `exaTokens` are minted to the user once he deposits underlying assets into the variable pool. These tokens are then burned once the underlying assets are withdrawn. If transferred, the variable deposit position is also transferred.

## Public State Variables

### accounts

```solidity
function accounts(address) external view returns (uint256 fixedDeposits, uint256 fixedBorrows, uint256 floatingBorrowShares)
```

Tracks fixed deposit and borrow map and floating borrow shares of an account.

### asset

```solidity
function asset() external view returns (contract ERC20)
```

Address of underlying ERC20 asset.

### auditor

```solidity
function auditor() external view returns (contract Auditor)
```

Auditor contract that validates health factor of accounts that operate with this Market.

### backupFeeRate

```solidity
function backupFeeRate() external view returns (uint256)
```

Rate charged to the fixed pool to be retained by the floating pool for initially providing liquidity.

### dampSpeedDown

```solidity
function dampSpeedDown() external view returns (uint256)
```

Damp speed factor to update `floatingAssetsAverage` when `floatingAssets` is lower.

### dampSpeedUp

```solidity
function dampSpeedUp() external view returns (uint256)
```

Damp speed factor to update `floatingAssetsAverage` when `floatingAssets` is higher.

### earningsAccumulator

```solidity
function earningsAccumulator() external view returns (uint256)
```

Accumulated earnings from extraordinary sources to be gradually distributed.

### earningsAccumulatorSmoothFactor

```solidity
function earningsAccumulatorSmoothFactor() external view returns (uint128)
```

Factor used for gradual accrual of earnings to the floating pool.

### fixedBorrowPositions

```solidity
function fixedBorrowPositions(uint256, address) external view returns (uint256 principal, uint256 fee)
```

Tracks account's fixed borrow positions by maturity, account and position.

### fixedDepositPositions

```solidity
function fixedDepositPositions(uint256, address) external view returns (uint256 principal, uint256 fee)
```

Tracks account's fixed deposit positions by maturity, account and position.

### fixedPools

```solidity
function fixedPools(uint256) external view returns (uint256 borrowed, uint256 supplied, uint256 unassignedEarnings, uint256 lastAccrual)
```

Tracks fixed pools state by maturity.

### floatingAssets

```solidity
function floatingAssets() external view returns (uint256)
```

Amount of floating assets deposited to the pool.

### floatingAssetsAverage

```solidity
function floatingAssetsAverage() external view returns (uint256)
```

Average of the floating assets to get fixed borrow rates and prevent rate manipulation.

### floatingBackupBorrowed

```solidity
function floatingBackupBorrowed() external view returns (uint256)
```

Amount of assets lent by the floating pool to the fixed pools.

### floatingDebt

```solidity
function floatingDebt() external view returns (uint256)
```

Amount of assets lent by the floating pool to accounts.

### floatingUtilization

```solidity
function floatingUtilization() external view returns (uint256)
```

Current floating utilization used to get the new floating borrow rate.

### interestRateModel

```solidity
function interestRateModel() external view returns (contract InterestRateModel)
```

Interest rate model contract used to get the borrow rates.

### lastAccumulatorAccrual

```solidity
function lastAccumulatorAccrual() external view returns (uint32)
```

Last time the accumulator distributed earnings.

### lastAverageUpdate

```solidity
function lastAverageUpdate() external view returns (uint32)
```

Last time the floating assets average was updated.

### lastFloatingDebtUpdate

```solidity
function lastFloatingDebtUpdate() external view returns (uint32)
```

Last time the floating debt was updated.

### maxFuturePools

```solidity
function maxFuturePools() external view returns (uint8)
```

Number of fixed pools to be active at the same time.

### penaltyRate

```solidity
function penaltyRate() external view returns (uint256)
```

Rate per second to be charged to delayed fixed pools borrowers after maturity.

### reserveFactor

```solidity
function reserveFactor() external view returns (uint128)
```

Percentage factor that represents the liquidity reserves that can't be borrowed.

### treasury

```solidity
function treasury() external view returns (address)
```

Address of the treasury that will receive the allocated earnings.

### treasuryFeeRate

```solidity
function treasuryFeeRate() external view returns (uint256)
```

Rate to be charged by the treasury to floating and fixed borrows.

## View Methods

### accountSnapshot

```solidity
function accountSnapshot(address account) external view returns (uint256, uint256)
```

Gets current snapshot for an account across all maturities.

**Parameters**

| Name    | Type    | Description                                                       |
| ------- | ------- | ----------------------------------------------------------------- |
| account | address | account to return status snapshot in the specified maturity date. |

**Returns**

| Type    | Description                                                         |
| ------- | ------------------------------------------------------------------- |
| uint256 | The amount of assets the account deposited to the floating pool     |
| uint256 | The amount of debt the account owes from fixed and floating borrows |

### convertToAssets

```solidity
function convertToAssets(uint256 shares) external view returns (uint256)
```

Returns the amount of assets that would be exchanged by the pool for the amount of shares provided.

**Parameters**

| Name   | Type    | Description       |
| ------ | ------- | ----------------- |
| shares | uint256 | amount of shares. |

**Returns**

| Type    | Description                 |
| ------- | --------------------------- |
| uint256 | amount of exchanged assets. |

### convertToShares

```solidity
function convertToShares(uint256 assets) external view returns (uint256)
```

Returns the amount of shares that would be exchanged by the vault for the amount of assets provided.

**Parameters**

| Name   | Type    | Description       |
| ------ | ------- | ----------------- |
| assets | uint256 | amount of assets. |

**Returns**

| Type    | Description                 |
| ------- | --------------------------- |
| uint256 | amount of exchanged shares. |

### maxRedeem

```solidity
function maxRedeem(address owner) external view returns (uint256)
```

Returns the maximum amount of shares that can be redeem from the owner balance through a redeem call.

**Parameters**

| Name  | Type    | Description          |
| ----- | ------- | -------------------- |
| owner | address | owner of the shares. |

**Returns**

| Type    | Description                      |
| ------- | -------------------------------- |
| uint256 | max amount of redeemable shares. |

### maxWithdraw

```solidity
function maxWithdraw(address owner) external view returns (uint256)
```

Returns the maximum amount of underlying assets that can be withdrawn from the owner balance with a single withdraw call.

**Parameters**

| Name  | Type    | Description          |
| ----- | ------- | -------------------- |
| owner | address | owner of the assets. |

**Returns**

| Type    | Description                        |
| ------- | ---------------------------------- |
| uint256 | max amount of withdrawable assets. |

### previewBorrow

```solidity
function previewBorrow(uint256 assets) external view returns (uint256)
```

Simulates the effects of a borrow at the current time, given current contract conditions.

**Parameters**

| Name   | Type    | Description                 |
| ------ | ------- | --------------------------- |
| assets | uint256 | amount of assets to borrow. |

**Returns**

| Type    | Description                                                             |
| ------- | ----------------------------------------------------------------------- |
| uint256 | amount of shares that will be assigned to the account after the borrow. |

### previewDebt

```solidity
function previewDebt(address borrower) external view returns (uint256 debt)
```

Gets all borrows and penalties for an account.

**Parameters**

| Name     | Type    | Description                                                       |
| -------- | ------- | ----------------------------------------------------------------- |
| borrower | address | account to return status snapshot for fixed and floating borrows. |

**Returns**

| Name | Type    | Description                                      |
| ---- | ------- | ------------------------------------------------ |
| debt | uint256 | the total debt, denominated in number of assets. |

### previewDeposit

```solidity
function previewDeposit(uint256 assets) external view returns (uint256)
```

Allows users to simulate the effects of their deposit at the current block.

**Parameters**

| Name   | Type    | Description             |
| ------ | ------- | ----------------------- |
| assets | uint256 | assets to be deposited. |

**Returns**

| Type    | Description                                        |
| ------- | -------------------------------------------------- |
| uint256 | shares to receive in exchange of deposited assets. |

### previewFloatingAssetsAverage

```solidity
function previewFloatingAssetsAverage() external view returns (uint256)
```

Gets the current `floatingAssetsAverage` without updating the storage variable.

**Returns**

| Type    | Description                        |
| ------- | ---------------------------------- |
| uint256 | projected `floatingAssetsAverage`. |

### previewMint

```solidity
function previewMint(uint256 shares) external view returns (uint256)
```

Allows users to simulate the effects of their mint at the current block.

**Parameters**

| Name   | Type    | Description          |
| ------ | ------- | -------------------- |
| shares | uint256 | shares to be minted. |

**Returns**

| Type    | Description                                     |
| ------- | ----------------------------------------------- |
| uint256 | assets to deposit in exchange of minted shares. |

### previewRedeem

```solidity
function previewRedeem(uint256 shares) external view returns (uint256)
```

Allows users to simulate the effects of their redemption at the current block.

**Parameters**

| Name   | Type    | Description          |
| ------ | ------- | -------------------- |
| shares | uint256 | shares to be redeem. |

**Returns**

| Type    | Description                                     |
| ------- | ----------------------------------------------- |
| uint256 | assets to receive in exchange of burned shares. |

### previewRefund

```solidity
function previewRefund(uint256 shares) external view returns (uint256)
```

Simulates the effects of a refund at the current time, given current contract conditions.

**Parameters**

| Name   | Type    | Description                                                |
| ------ | ------- | ---------------------------------------------------------- |
| shares | uint256 | amount of shares to subtract from caller's accountability. |

**Returns**

| Type    | Description                           |
| ------- | ------------------------------------- |
| uint256 | amount of assets that will be repaid. |

### previewRepay

```solidity
function previewRepay(uint256 assets) external view returns (uint256)
```

Simulates the effects of a repay at the current time, given current contract conditions.

**Parameters**

| Name   | Type    | Description                |
| ------ | ------- | -------------------------- |
| assets | uint256 | amount of assets to repay. |

**Returns**

| Type    | Description                                                                |
| ------- | -------------------------------------------------------------------------- |
| uint256 | amount of shares that will be subtracted from the account after the repay. |

### previewWithdraw

```solidity
function previewWithdraw(uint256 assets) external view returns (uint256)
```

Allows users to simulate the effects of their withdrawal at the current block.

**Parameters**

| Name   | Type    | Description             |
| ------ | ------- | ----------------------- |
| assets | uint256 | assets to be withdrawn. |

**Returns**

| Type    | Description                                    |
| ------- | ---------------------------------------------- |
| uint256 | burned shares in exchange of withdrawn assets. |

### totalAssets

```solidity
function totalAssets() external view returns (uint256)
```

Calculates the floating pool balance plus earnings to be accrued at current timestamp from maturities and accumulator.

**Returns**

| Type    | Description                                                             |
| ------- | ----------------------------------------------------------------------- |
| uint256 | actual floatingAssets plus earnings to be accrued at current timestamp. |

### totalFloatingBorrowAssets

```solidity
function totalFloatingBorrowAssets() external view returns (uint256)
```

Calculates the total floating debt, considering elapsed time since last update and current interest rate.

**Returns**

| Type    | Description                                   |
| ------- | --------------------------------------------- |
| uint256 | actual floating debt plus projected interest. |

### totalFloatingBorrowShares

```solidity
function totalFloatingBorrowShares() external view returns (uint256)
```

Total amount of floating borrow shares assigned to floating borrow accounts.

## Write Methods

### borrow

```solidity
function borrow(uint256 assets, address receiver, address borrower) external nonpayable returns (uint256 borrowShares)
```

Borrows a certain amount from the floating pool.

**Parameters**

| Name     | Type    | Description                                           |
| -------- | ------- | ----------------------------------------------------- |
| assets   | uint256 | amount to be sent to receiver and repaid by borrower. |
| receiver | address | address that will receive the borrowed assets.        |
| borrower | address | address that will repay the borrowed assets.          |

**Returns**

| Name         | Type    | Description                                  |
| ------------ | ------- | -------------------------------------------- |
| borrowShares | uint256 | shares corresponding to the borrowed assets. |

### borrowAtMaturity

```solidity
function borrowAtMaturity(uint256 maturity, uint256 assets, uint256 maxAssets, address receiver, address borrower) external nonpayable returns (uint256 assetsOwed)
```

Borrows a certain amount from a maturity.

**Parameters**

| Name      | Type    | Description                                                   |
| --------- | ------- | ------------------------------------------------------------- |
| maturity  | uint256 | maturity date for repayment.                                  |
| assets    | uint256 | amount to be sent to receiver and repaid by borrower.         |
| maxAssets | uint256 | maximum amount of debt that the account is willing to accept. |
| receiver  | address | address that will receive the borrowed assets.                |
| borrower  | address | address that will repay the borrowed assets.                  |

**Returns**

| Name       | Type    | Description                                                        |
| ---------- | ------- | ------------------------------------------------------------------ |
| assetsOwed | uint256 | total amount of assets (principal + fee) to be repaid at maturity. |

### clearBadDebt

```solidity
function clearBadDebt(address borrower) external nonpayable
```

Clears floating and fixed debt for an account spreading the losses to the `earningsAccumulator`.

*Can only be called from the auditor.*

**Parameters**

| Name     | Type    | Description                                                  |
| -------- | ------- | ------------------------------------------------------------ |
| borrower | address | account with insufficient collateral to be cleared the debt. |

### deposit

```solidity
function deposit(uint256 assets, address receiver) external nonpayable returns (uint256 shares)
```

**Parameters**

| Name     | Type    | Description                                                 |
| -------- | ------- | ----------------------------------------------------------- |
| assets   | uint256 | amount of assets to deposit.                                |
| receiver | address | address of the account that will receive the minted shares. |

**Returns**

| Name   | Type    | Description              |
| ------ | ------- | ------------------------ |
| shares | uint256 | amount of minted shares. |

### depositAtMaturity

```solidity
function depositAtMaturity(uint256 maturity, uint256 assets, uint256 minAssetsRequired, address receiver) external nonpayable returns (uint256 positionAssets)
```

Deposits a certain amount to a maturity.

**Parameters**

| Name              | Type    | Description                                                                            |
| ----------------- | ------- | -------------------------------------------------------------------------------------- |
| maturity          | uint256 | maturity date where the assets will be deposited.                                      |
| assets            | uint256 | amount to receive from the msg.sender.                                                 |
| minAssetsRequired | uint256 | minimum amount of assets required by the depositor for the transaction to be accepted. |
| receiver          | address | address that will be able to withdraw the deposited assets.                            |

**Returns**

| Name           | Type    | Description                                                           |
| -------------- | ------- | --------------------------------------------------------------------- |
| positionAssets | uint256 | total amount of assets (principal + fee) to be withdrawn at maturity. |

### liquidate

```solidity
function liquidate(address borrower, uint256 maxAssets, contract Market seizeMarket) external nonpayable returns (uint256 repaidAssets)
```

Liquidates undercollateralized position(s).

*Msg.sender liquidates borrower's position(s) and repays a certain amount of debt for multiple maturities, seizing a part of borrower's collateral.*

**Parameters**

| Name        | Type            | Description                                                                       |
| ----------- | --------------- | --------------------------------------------------------------------------------- |
| borrower    | address         | wallet that has an outstanding debt across all maturities.                        |
| maxAssets   | uint256         | maximum amount of debt that the liquidator is willing to accept. (it can be less) |
| seizeMarket | contract Market | market from which the collateral will be seized to give the liquidator.           |

**Returns**

| Name         | Type    | Description           |
| ------------ | ------- | --------------------- |
| repaidAssets | uint256 | actual amount repaid. |

### mint

```solidity
function mint(uint256 shares, address receiver) external nonpayable returns (uint256 assets)
```

**Parameters**

| Name     | Type    | Description                                             |
| -------- | ------- | ------------------------------------------------------- |
| shares   | uint256 | amount of shares to mint.                               |
| receiver | address | address of account that will receive the minted shares. |

**Returns**

| Name   | Type    | Description                 |
| ------ | ------- | --------------------------- |
| assets | uint256 | amount of deposited assets. |

### redeem

```solidity
function redeem(uint256 shares, address receiver, address owner) external nonpayable returns (uint256 assets)
```

Redeems the owner's floating pool assets to the receiver address.

*Makes sure that the owner doesn't have shortfall after withdrawing.*

**Parameters**

| Name     | Type    | Description                                           |
| -------- | ------- | ----------------------------------------------------- |
| shares   | uint256 | amount of shares to be redeemed for underlying asset. |
| receiver | address | address to which the assets will be transferred.      |
| owner    | address | address which owns the floating pool assets.          |

**Returns**

| Name   | Type    | Description                                    |
| ------ | ------- | ---------------------------------------------- |
| assets | uint256 | amount of underlying asset that was withdrawn. |

### refund

```solidity
function refund(uint256 borrowShares, address borrower) external nonpayable returns (uint256 assets, uint256 actualShares)
```

Repays a certain amount of shares to the floating pool.

**Parameters**

| Name         | Type    | Description                                                 |
| ------------ | ------- | ----------------------------------------------------------- |
| borrowShares | uint256 | shares to be subtracted from the borrower's accountability. |
| borrower     | address | address of the account that has the debt.                   |

**Returns**

| Name         | Type    | Description                                                  |
| ------------ | ------- | ------------------------------------------------------------ |
| assets       | uint256 | subtracted assets from the borrower's accountability.        |
| actualShares | uint256 | actual subtracted shares from the borrower's accountability. |

### repay

```solidity
function repay(uint256 assets, address borrower) external nonpayable returns (uint256 actualRepay, uint256 borrowShares)
```

Repays a certain amount of assets to the floating pool.

**Parameters**

| Name     | Type    | Description                                                 |
| -------- | ------- | ----------------------------------------------------------- |
| assets   | uint256 | assets to be subtracted from the borrower's accountability. |
| borrower | address | address of the account that has the debt.                   |

**Returns**

| Name         | Type    | Description                                                     |
| ------------ | ------- | --------------------------------------------------------------- |
| actualRepay  | uint256 | the actual amount that should be transferred into the protocol. |
| borrowShares | uint256 | subtracted shares from the borrower's accountability.           |

### repayAtMaturity

```solidity
function repayAtMaturity(uint256 maturity, uint256 positionAssets, uint256 maxAssets, address borrower) external nonpayable returns (uint256 actualRepayAssets)
```

Repays a certain amount to a maturity.

**Parameters**

| Name           | Type    | Description                                                                |
| -------------- | ------- | -------------------------------------------------------------------------- |
| maturity       | uint256 | maturity date where the assets will be repaid.                             |
| positionAssets | uint256 | amount to be paid for the borrower's debt.                                 |
| maxAssets      | uint256 | maximum amount of debt that the account is willing to accept to be repaid. |
| borrower       | address | address of the account that has the debt.                                  |

**Returns**

| Name              | Type    | Description                                               |
| ----------------- | ------- | --------------------------------------------------------- |
| actualRepayAssets | uint256 | the actual amount that was transferred into the protocol. |

### seize

```solidity
function seize(address liquidator, address borrower, uint256 assets) external nonpayable
```

Public function to seize a certain amount of assets.

*Public function for liquidator to seize borrowers assets in the floating pool. This function will only be called from another Market, on `liquidation` calls. That's why msg.sender needs to be passed to the private function (to be validated as a market)*

**Parameters**

| Name       | Type    | Description                                      |
| ---------- | ------- | ------------------------------------------------ |
| liquidator | address | address which will receive the seized assets.    |
| borrower   | address | address from which the assets will be seized.    |
| assets     | uint256 | amount to be removed from borrower's possession. |

### withdraw

```solidity
function withdraw(uint256 assets, address receiver, address owner) external nonpayable returns (uint256 shares)
```

Withdraws the owner's floating pool assets to the receiver address.

*Makes sure that the owner doesn't have shortfall after withdrawing.*

**Parameters**

| Name     | Type    | Description                                      |
| -------- | ------- | ------------------------------------------------ |
| assets   | uint256 | amount of underlying to be withdrawn.            |
| receiver | address | address to which the assets will be transferred. |
| owner    | address | address which owns the floating pool assets.     |

**Returns**

| Name   | Type    | Description                                     |
| ------ | ------- | ----------------------------------------------- |
| shares | uint256 | amount of shares redeemed for underlying asset. |

### withdrawAtMaturity

```solidity
function withdrawAtMaturity(uint256 maturity, uint256 positionAssets, uint256 minAssetsRequired, address receiver, address owner) external nonpayable returns (uint256 assetsDiscounted)
```

Withdraws a certain amount from a maturity.

*It's expected that this function can't be paused to prevent freezing account funds.*

**Parameters**

| Name              | Type    | Description                                                                         |
| ----------------- | ------- | ----------------------------------------------------------------------------------- |
| maturity          | uint256 | maturity date where the assets will be withdrawn.                                   |
| positionAssets    | uint256 | position size to be reduced.                                                        |
| minAssetsRequired | uint256 | minimum amount required by the account (if discount included for early withdrawal). |
| receiver          | address | address that will receive the withdrawn assets.                                     |
| owner             | address | address that previously deposited the assets.                                       |

**Returns**

| Name             | Type    | Description                                                             |
| ---------------- | ------- | ----------------------------------------------------------------------- |
| assetsDiscounted | uint256 | amount of assets withdrawn (can include a discount for early withdraw). |


# ERC-4626

## Tokenized Vault Standard

**ERC-4626** is an implementation of a standard API for tokenized vaults representing shares of a single underlying token. This standard is an extension of the [ERC-20](https://eips.ethereum.org/EIPS/eip-20) token standard that provides basic functionality for depositing and withdrawing tokens and reading balances.

### The problem

Tokenized vaults on Ethereum aren't actually a new thing. Protocols like [Yearn](https://yearn.finance/) allow you to deposit your tokens into vaults and earn a yield on those tokens while they are deposited.

Other protocols achieve this in a similar way with their borrowing and lending contracts. What all of these protocols have in common is that at deposit time the user receives a vault token in return for the underlying asset. This vault token acts as a kind of [IOU](https://en.wikipedia.org/wiki/IOU), and for some of these protocols, the user actually accrues more quantity of the vault token compared to the underlying asset staked over time. When the user wants to retrieve their original underlying asset it just exchanges the vault token and gets the original asset back.

The problem with these protocols is that there was no unifying standard. There's a lot of talk in the DeFi space about supporting composability [composable](https://medium.com/monolith/understanding-defi-composability-explained-70f93d9c0f01) with *money legos*, but it's very hard to build things from different protocols if these *money legos* don't actually fit together.

### The solution

**ERC-4626** is a game changer that attempts to solve this problem.

So again, what are vaults? Vaults are simply smart contracts and their purpose is to accrue yield as you lock your tokens inside. Each vault can have its own strategy for accruing yield but that's just an implementation detail.

An example would be depositing your DAI into a vault and receiving eDAI in return. Over time, as your DAI accrues value, the user is able to redeem more DAI in exchange for the same amount of eDAI it has. eDAI would be an example of the actual vault token or yield-bearing token. A yield-bearing token represents the shares of fractional ownership of the overall pool of DAI locked in the contract. If the amount of assets in the vault grows then the value of the user's yield-bearing token increases due to the user owning his stake in this pool.

### How it works

ERC-4626 lays out a standard interface that every tokenized vault should adhere to. Firstly, every tokenized vault should be an ERC-20 token by default. On top of that, ERC-4626 adds a series of functions that can be called on this contract.

For example, the `totalAssets()` function returns the total amount of the underlying assets managed by the vault. Other functions such as `convertToShares()` lets users know how many yield-bearing tokens they will get in exchange for a certain amount of assets. The `convertToAssets()` function does just the opposite.

The actual standard is pretty lengthy but you can see all the details in [its Ethereum Improvement Proposal (EIP)](https://eips.ethereum.org/EIPS/eip-4626).

In conclusion, this new standard is quickly being adopted by many new protocols like Exactly, and we can expect to see a number of huge benefits in the DeFi space:

* Huge increase in interoperability.
* Drastically reduce development time when integrating with other protocols.
* Helps with security as everybody is basically coding to the same standard, and auditors know what to look at.


# PriceFeedWrapper

Returns the price of an asset that doesn’t have a direct feed from [Chainlink](https://docs.chain.link/docs/data-feeds/price-feeds/addresses/).

Written as a generic implementation it can be used, for example, to retrieve the price of `wstETH`. Queries `stETH / ETH` feed and multiplies it by the exchange rate between `stETH / wstETH` before returning the price that it’s then used by the [Auditor](/guides/protocol/auditor).

## Public State Variables

### baseUnit

```solidity
function baseUnit() external view returns (uint256)
```

Base units that are sent to the conversion function to get the asset rate.

### conversionSelector

```solidity
function conversionSelector() external view returns (bytes4)
```

Function selector of the wrapper contract where the asset rate is fetched from.

### decimals

```solidity
function decimals() external view returns (uint8)
```

Number of decimals that the answer of this price feed has.

### mainPriceFeed

```solidity
function mainPriceFeed() external view returns (contract IPriceFeed)
```

Main price feed where the price is fetched from.

### wrapper

```solidity
function wrapper() external view returns (address)
```

Address of the wrapper contract where the asset rate is fetched from.

## View Methods

### latestAnswer

```solidity
function latestAnswer() external view returns (int256)
```

Returns the price feed's latest value considering the wrapped asset's rate.

**Returns**

| Type   | Description         |
| ------ | ------------------- |
| int256 | latest asset price. |


# PriceFeedDouble

Returns the price of an asset considering two different [Chainlink](https://docs.chain.link/docs/data-feeds/price-feeds/addresses/) price feeds.

Written as a generic implementation it can be used, for example, to retrieve the price of `WBTC`. Queries `BTC/ ETH` feed and multiplies it by the exchange rate between `WBTC / BTC` before returning the price that it’s then used by the [Auditor](/guides/protocol/auditor).

## Public State Variables

### baseUnit

```solidity
function baseUnit() external view returns (uint256)
```

The base units are used to normalize the answer when multiplied by the second price feed rate.

### decimals

```solidity
function decimals() external view returns (uint8)
```

Number of decimals that the answer of this price feed has.

### priceFeedOne

```solidity
function priceFeedOne() external view returns (contract IPriceFeed)
```

Main price feed where the price is fetched from.

### priceFeedTwo

```solidity
function priceFeedTwo() external view returns (contract IPriceFeed)
```

Second price feed where the asset's rate is fetched from.

## View Methods

### latestAnswer

```solidity
function latestAnswer() external view returns (int256)
```

Returns the price feed's latest value considering the other price feed's rate.


# InterestRateModel

Given supply and demand values, the **InterestRateModel** is queried to calculate and return both fixed and variable rates. Contains parameters as state variables that are used to get the different points in the utilization curve for an asset.\
There's one **InterestRateModel** contract per enabled asset.

## Public State Variables

### fixedCurveA

```solidity
function fixedCurveA() external view returns (uint256)
```

Scale factor of the fixed curve.

### fixedCurveB

```solidity
function fixedCurveB() external view returns (int256)
```

Origin intercept of the fixed curve.

### fixedMaxUtilization

```solidity
function fixedMaxUtilization() external view returns (uint256)
```

Asymptote of the fixed curve.

### floatingCurveA

```solidity
function floatingCurveA() external view returns (uint256)
```

Scale factor of the floating curve.

### floatingCurveB

```solidity
function floatingCurveB() external view returns (int256)
```

Origin intercept of the floating curve.

### floatingMaxUtilization

```solidity
function floatingMaxUtilization() external view returns (uint256)
```

Asymptote of the floating curve.

## View Methods

### fixedBorrowRate

```solidity
function fixedBorrowRate(uint256 maturity, uint256 amount, uint256 borrowed, uint256 supplied, uint256 backupAssets) external view returns (uint256)
```

Gets the rate to borrow a certain amount at a certain maturity with supply/demand values in the fixed rate pool and assets from the backup supplier.

**Parameters**

| Name         | Type    | Description                                          |
| ------------ | ------- | ---------------------------------------------------- |
| maturity     | uint256 | maturity date for calculating days left to maturity. |
| amount       | uint256 | the current borrow's amount.                         |
| borrowed     | uint256 | ex-ante amount borrowed from this fixed rate pool.   |
| supplied     | uint256 | deposits in the fixed rate pool.                     |
| backupAssets | uint256 | backup supplier assets.                              |

**Returns**

| Type    | Description                                                                        |
| ------- | ---------------------------------------------------------------------------------- |
| uint256 | rate of the fee that the borrower will have to pay (represented with 18 decimals). |

### floatingBorrowRate

```solidity
function floatingBorrowRate(uint256 utilizationBefore, uint256 utilizationAfter) external view returns (uint256)
```

Returns the interest rate integral from utilizationBefore to utilizationAfter.

*Minimum and maximum checks to avoid negative rate.*

**Parameters**

| Name              | Type    | Description                                           |
| ----------------- | ------- | ----------------------------------------------------- |
| utilizationBefore | uint256 | ex-ante utilization rate, with 18 decimals precision. |
| utilizationAfter  | uint256 | ex-post utilization rate, with 18 decimals precision. |

**Returns**

| Type    | Description                                    |
| ------- | ---------------------------------------------- |
| uint256 | the interest rate, with 18 decimals precision. |


# RewardsController

The **RewardsController** is designed to store and distribute rewards to accounts that interact with the [Markets](/guides/protocol/market)' different variable and fixed pools.

It calculates the total amount of rewards to distribute and determines the allocation between the pools based on a [dynamic distribution model](/guides/features/rewards-distribution-model). Accounts can claim their rewards through the contract, and their claimable rewards can be queried at any time using the `claimable` function.

### Public State Variables

#### UTILIZATION\_CAP

```solidity
function UTILIZATION_CAP() external view returns (uint256)
```

Max utilization supported by the sigmoid function not to cause a division by zero.

#### distribution

```solidity
function distribution(contract Market) external view returns (uint8 availableRewardsCount, uint256 baseUnit)
```

Tracks the reward distribution data for a given market.

#### marketList

```solidity
function marketList(uint256) external view returns (contract Market)
```

Retrieves Markets with distributions set.

#### rewardEnabled

```solidity
function rewardEnabled(contract ERC20) external view returns (bool)
```

Tracks enabled asset rewards.

#### rewardList

```solidity
function rewardList(uint256) external view returns (contract ERC20)
```

Stores registered asset rewards.

### View Methods

#### accountOperation

```solidity
function accountOperation(address account, contract Market market, bool operation, contract ERC20 reward) external view returns (uint256, uint256)
```

Gets the account data of a given account, Market, operation and reward asset.

**Parameters**

| Name      | Type            | Description                                                    |
| --------- | --------------- | -------------------------------------------------------------- |
| account   | address         | The account to get the operation data from.                    |
| market    | contract Market | The market in which the operation was made.                    |
| operation | bool            | True if the operation was a borrow, false if it was a deposit. |
| reward    | contract ERC20  | The reward asset.                                              |

**Returns**

| Name | Type    | Description                 |
| ---- | ------- | --------------------------- |
| \_0  | uint256 | accrued The accrued amount. |
| \_1  | uint256 | index The account index.    |

#### allClaimable

```solidity
function allClaimable(address account, contract ERC20 reward) external view returns (uint256 unclaimedRewards)
```

Gets the claimable amount of rewards for a given account and reward asset.

**Parameters**

| Name    | Type           | Description                                  |
| ------- | -------------- | -------------------------------------------- |
| account | address        | The account to get the claimable amount for. |
| reward  | contract ERC20 | The reward asset.                            |

**Returns**

| Name             | Type    | Description                                 |
| ---------------- | ------- | ------------------------------------------- |
| unclaimedRewards | uint256 | The claimable amount for the given account. |

#### allMarketsOperations

```solidity
function allMarketsOperations() external view returns (struct RewardsController.MarketOperation[] marketOps)
```

Gets all market and operations.

**Returns**

| Name      | Type                                 | Description                    |
| --------- | ------------------------------------ | ------------------------------ |
| marketOps | RewardsController.MarketOperation\[] | The list of market operations. |

#### allRewards

```solidity
function allRewards() external view returns (contract ERC20[])
```

Retrieves all rewards addresses.

**Returns**

| Name | Type              | Description                  |
| ---- | ----------------- | ---------------------------- |
| \_0  | contract ERC20\[] | All enabled reward addresses |

#### availableRewardsCount

```solidity
function availableRewardsCount(contract Market market) external view returns (uint256)
```

Gets the amount of reward assets that are being distributed for a Market.

**Parameters**

| Name   | Type            | Description                                                  |
| ------ | --------------- | ------------------------------------------------------------ |
| market | contract Market | Market to get the number of available rewards to distribute. |

**Returns**

| Name | Type    | Description                               |
| ---- | ------- | ----------------------------------------- |
| \_0  | uint256 | The amount reward assets set to a Market. |

#### claimable

```solidity
function claimable(RewardsController.MarketOperation[] marketOps, address account, contract ERC20 reward) external view returns (uint256 unclaimedRewards)
```

Gets the claimable amount of rewards for a given account, Market operations and reward asset.

**Parameters**

| Name      | Type                                 | Description                                                                |
| --------- | ------------------------------------ | -------------------------------------------------------------------------- |
| marketOps | RewardsController.MarketOperation\[] | The list of Market operations to get the accrued and pending rewards from. |
| account   | address                              | The account to get the claimable amount for.                               |
| reward    | contract ERC20                       | The reward asset.                                                          |

**Returns**

| Name             | Type    | Description                                 |
| ---------------- | ------- | ------------------------------------------- |
| unclaimedRewards | uint256 | The claimable amount for the given account. |

#### distributionTime

```solidity
function distributionTime(contract Market market, contract ERC20 reward) external view returns (uint32, uint32, uint32)
```

Gets the distribution `start`, `end` and `lastUpdate` value of a given market and reward.

**Parameters**

| Name   | Type            | Description                               |
| ------ | --------------- | ----------------------------------------- |
| market | contract Market | The market to get the distribution times. |
| reward | contract ERC20  | The reward asset.                         |

**Returns**

| Name | Type   | Description                                            |
| ---- | ------ | ------------------------------------------------------ |
| \_0  | uint32 | The distribution `start`, `end` and `lastUpdate` time. |

#### previewAllocation

```solidity
function previewAllocation(contract Market market, contract ERC20 reward, uint256 deltaTime) external view returns (uint256 borrowIndex, uint256 depositIndex, uint256 newUndistributed)
```

Retrieves projected distribution indexes and new undistributed amount for a given `deltaTime`.

**Parameters**

| Name      | Type            | Description                                    |
| --------- | --------------- | ---------------------------------------------- |
| market    | contract Market | The market to calculate the indexes for.       |
| reward    | contract ERC20  | The reward asset to calculate the indexes for. |
| deltaTime | uint256         | The elapsed time since the last update.        |

**Returns**

| Name             | Type    | Description                                        |
| ---------------- | ------- | -------------------------------------------------- |
| borrowIndex      | uint256 | The index for the borrow operation.                |
| depositIndex     | uint256 | The index for the deposit operation.               |
| newUndistributed | uint256 | The new undistributed rewards of the distribution. |

#### rewardConfig

```solidity
function rewardConfig(contract Market market, contract ERC20 reward) external view returns (struct RewardsController.Config)
```

Gets the configuration of a given distribution.

**Parameters**

| Name   | Type            | Description                                           |
| ------ | --------------- | ----------------------------------------------------- |
| market | contract Market | The market to get the distribution configuration for. |
| reward | contract ERC20  | The reward asset.                                     |

**Returns**

| Name | Type                     | Description                     |
| ---- | ------------------------ | ------------------------------- |
| \_0  | RewardsController.Config | The distribution configuration. |

#### rewardIndexes

```solidity
function rewardIndexes(contract Market market, contract ERC20 reward) external view returns (uint256, uint256, uint256)
```

Gets the reward indexes and last amount of undistributed rewards for a given market and reward asset.

**Parameters**

| Name   | Type            | Description                                     |
| ------ | --------------- | ----------------------------------------------- |
| market | contract Market | The market to get the reward indexes for.       |
| reward | contract ERC20  | The reward asset to get the reward indexes for. |

**Returns**

| Name | Type    | Description                                                        |
| ---- | ------- | ------------------------------------------------------------------ |
| \_0  | uint256 | borrowIndex The index for the floating and fixed borrow operation. |
| \_1  | uint256 | depositIndex The index for the floating deposit operation.         |
| \_2  | uint256 | lastUndistributed The last amount of undistributed rewards.        |

### Write Methods

#### claim

```solidity
function claim(RewardsController.MarketOperation[] marketOps, address to, contract ERC20[] rewardsList) external nonpayable returns (contract ERC20[], uint256[] claimedAmounts)
```

Claims `msg.sender` rewards for the given operations and reward assets to the given account.

**Parameters**

| Name        | Type                                 | Description                          |
| ----------- | ------------------------------------ | ------------------------------------ |
| marketOps   | RewardsController.MarketOperation\[] | The operations to claim rewards for. |
| to          | address                              | The address to send the rewards to.  |
| rewardsList | contract ERC20\[]                    | The list of rewards assets to claim. |

**Returns**

| Name           | Type              | Description                  |
| -------------- | ----------------- | ---------------------------- |
| \_0            | contract ERC20\[] | The list of rewards assets.  |
| claimedAmounts | uint256\[]        | The list of claimed amounts. |

#### claimAll

```solidity
function claimAll(address to) external nonpayable returns (contract ERC20[] rewardsList, uint256[] claimedAmounts)
```

Claims all `msg.sender` rewards to the given account.

**Parameters**

| Name | Type    | Description                         |
| ---- | ------- | ----------------------------------- |
| to   | address | The address to send the rewards to. |

**Returns**

| Name           | Type              | Description                  |
| -------------- | ----------------- | ---------------------------- |
| rewardsList    | contract ERC20\[] | The list of rewards assets.  |
| claimedAmounts | uint256\[]        | The list of claimed amounts. |

#### config

```solidity
function config(RewardsController.Config[] configs) external nonpayable
```

Enables or updates the reward distribution for the given markets and rewards.

**Parameters**

| Name    | Type                        | Description                                        |
| ------- | --------------------------- | -------------------------------------------------- |
| configs | RewardsController.Config\[] | The configurations to update each RewardData with. |

#### handleBorrow

```solidity
function handleBorrow(address account) external nonpayable
```

Hook to be called by the Market to update the index of the account that made a rewarded borrow.

**Parameters**

| Name    | Type    | Description                                |
| ------- | ------- | ------------------------------------------ |
| account | address | The account to which the index is updated. |

#### handleDeposit

```solidity
function handleDeposit(address account) external nonpayable
```

Hook to be called by the Market to update the index of the account that made a rewarded deposit.

**Parameters**

| Name    | Type    | Description                                |
| ------- | ------- | ------------------------------------------ |
| account | address | The account to which the index is updated. |

#### withdraw

```solidity
function withdraw(contract ERC20 asset, address to) external nonpayable
```

Withdraws the contract's balance of the given asset to the given address. Only to be called by ADMIN role accounts.

**Parameters**

| Name  | Type           | Description                           |
| ----- | -------------- | ------------------------------------- |
| asset | contract ERC20 | The asset to withdraw.                |
| to    | address        | The address to withdraw the asset to. |


# Peripheral Contracts

This section contains valuable resources that are not part of the protocol's core and could be helpful for developers seeking to integrate Exactly into other applications.

These smart contracts function as peripherals, seamlessly integrating with the Protocol contracts.

**Peripheral contracts can be found here:** <https://github.com/exactly/protocol/tree/main/contracts/periphery>

**The ABDK audit report can be found here:**\
<https://github.com/exactly/audits/blob/main/ABDK%20PeripheralContracts%201st%20audit%20(Sep-23).pdf>


# DebtManager

This contract allows users to handle their positions in a more flexible way. Making use of [Balancer's flash loans](https://docs.balancer.fi/reference/contracts/flash-loans.html) (currently, there are 0 fees for flash loans), it allows users to rollover their debts or leverage their positions. The DebtManager contract facilitates same-asset leverage-deleverage functions.&#x20;

This contract also uses ['permits'](https://help.1inch.io/en/articles/5435386-permit-712-signed-token-approvals-and-how-they-work-on-1inch) for approvals related to allowing you to transfer tokens on your behalf and perform withdrawals or borrows from a Market. Permits are signatures spent when the user completes the transaction, and the approved amount is always exact. After the leverage or deleverage operation is completed, the DebtManager no longer has any allowance over tokens, withdraws or borrows.

**GitHub URL:** <https://github.com/exactly/protocol/blob/main/contracts/periphery/DebtManager.sol>

**WebApp URL**: <https://app.exact.ly/strategies>


# EXA

The EXA smart contract encapsulates the functionality of the EXA ERC20 token. This smart contract uses OpenZeppelin's [`ERC20VotesUpgradeable`](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/master/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol) implementation.

**GitHub URL:** <https://github.com/exactly/protocol/blob/main/contracts/periphery/EXA.sol>


# esEXA

The esEXA smart contract encapsulates the functionality of the esEXA ERC20 token.&#x20;

**GitHub URL:**&#x20;

<https://github.com/exactly/protocol/blob/main/contracts/periphery/EscrowedEXA.sol>


# Airdrop

Using Solmate's Merkle tree library, this smart contract can validate the eligibility of an address for the airdrop and the appropriate amount based on a set of predetermined criteria.

It interfaces with the [Sablier protocol](https://sablier.com), a token streaming mechanism, to facilitate the creation of an NFT for each recipient and subsequently initiate the airdrop stream.

**GitHub URL:** <https://github.com/exactly/protocol/blob/main/contracts/periphery/Airdrop.sol>


# Previewer (read-only)

The Previewer is a read-only smart contract specifically engineered for Exactly's web application. Its role is to gather comprehensive on-chain data pertaining to Exactly's markets, and user accounts while minimizing the amount of necessary requests, thus enhancing performance. Moreover, it abstracts the complexities of the protocol from the front-end interface by directly returning oracle prices, counting the amount of deposits and borrows per market, and providing the current snapshot of any account being queried.

This contract can be found in the [periphery folder of Exactly's repo](https://github.com/exactly/protocol/blob/main/contracts/periphery/Previewer.sol).

Please be advised that the `Previewer` contract has not undergone a formal security audit. As such, we strongly discourage integrations involving this contract since it is exclusively intended for read-only purposes by the [Exactly Web App](https://app.exact.ly/). Using unaudited contracts for other purposes may expose users to potential security risks or unexpected behavior.

### Public State Variables

#### auditor

```solidity
function auditor() external view returns (contract Auditor)
```

**Returns**

| Name    | Type             | Description |
| ------- | ---------------- | ----------- |
| auditor | contract Auditor | Auditor     |

#### basePriceFeed

```solidity
function basePriceFeed() external view returns (contract IPriceFeed)
```

**Returns**

| Name          | Type                | Description   |
| ------------- | ------------------- | ------------- |
| basePriceFeed | contract IPriceFeed | BasePriceFeed |

### View Methods

#### exactly

```solidity
function exactly(address account) external view returns (struct Previewer.MarketAccount[] data)
```

Function to get a certain account extended data.

**Parameters**

| Name    | Type    | Description                                         |
| ------- | ------- | --------------------------------------------------- |
| account | address | address which the extended data will be calculated. |

**Returns**

| Name | Type                       | Description                                             |
| ---- | -------------------------- | ------------------------------------------------------- |
| data | Previewer.MarketAccount\[] | extended accountability of all markets for the account. |

#### previewBorrowAtAllMaturities

```solidity
function previewBorrowAtAllMaturities(contract Market market, uint256 assets) external view returns (struct Previewer.FixedPreview[] previews)
```

Gets the assets plus fees offered by all VALID maturities when borrowing a certain amount.

**Parameters**

| Name   | Type            | Description                             |
| ------ | --------------- | --------------------------------------- |
| market | contract Market | address of the market.                  |
| assets | uint256         | amount of assets that will be borrowed. |

**Returns**

| Name     | Type                      | Description                                                                       |
| -------- | ------------------------- | --------------------------------------------------------------------------------- |
| previews | Previewer.FixedPreview\[] | array containing amount plus yield that account will receive after each maturity. |

#### previewBorrowAtMaturity

```solidity
function previewBorrowAtMaturity(contract Market market, uint256 maturity, uint256 assets) external view returns (struct Previewer.FixedPreview)
```

Gets the amount plus fees to be repaid at maturity when borrowing certain amount of assets.

**Parameters**

| Name     | Type            | Description                                           |
| -------- | --------------- | ----------------------------------------------------- |
| market   | contract Market | address of the market.                                |
| maturity | uint256         | maturity date/pool where the assets will be borrowed. |
| assets   | uint256         | amount of assets that will be borrowed.               |

**Returns**

| Name           | Type                   | Description                                                                |
| -------------- | ---------------------- | -------------------------------------------------------------------------- |
| positionAssets | Previewer.FixedPreview | positionAssets amount plus fees that the depositor will repay at maturity. |

#### previewDepositAtAllMaturities

```solidity
function previewDepositAtAllMaturities(contract Market market, uint256 assets) external view returns (struct Previewer.FixedPreview[] previews)
```

Gets the assets plus yield offered by all VALID maturities when depositing a certain amount.

**Parameters**

| Name   | Type            | Description                              |
| ------ | --------------- | ---------------------------------------- |
| market | contract Market | address of the market.                   |
| assets | uint256         | amount of assets that will be deposited. |

**Returns**

| Name     | Type                      | Description                                                                       |
| -------- | ------------------------- | --------------------------------------------------------------------------------- |
| previews | Previewer.FixedPreview\[] | array containing amount plus yield that account will receive after each maturity. |

#### previewDepositAtMaturity

```solidity
function previewDepositAtMaturity(contract Market market, uint256 maturity, uint256 assets) external view returns (struct Previewer.FixedPreview)
```

Gets the assets plus yield offered by a maturity when depositing a certain amount.

**Parameters**

| Name     | Type            | Description                                            |
| -------- | --------------- | ------------------------------------------------------ |
| market   | contract Market | address of the market.                                 |
| maturity | uint256         | maturity date/pool where the assets will be deposited. |
| assets   | uint256         | amount of assets that will be deposited.               |

**Returns**

| Name   | Type                   | Description                                                       |
| ------ | ---------------------- | ----------------------------------------------------------------- |
| assets | Previewer.FixedPreview | amount plus yield that the depositor will receive after maturity. |

#### previewRepayAtMaturity

```solidity
function previewRepayAtMaturity(contract Market market, uint256 maturity, uint256 positionAssets, address borrower) external view returns (struct Previewer.FixedPreview)
```

Gets the assets that will be repaid when repaying a certain amount at the current maturity.

**Parameters**

| Name           | Type            | Description                                                 |
| -------------- | --------------- | ----------------------------------------------------------- |
| market         | contract Market | address of the market.                                      |
| maturity       | uint256         | maturity date/pool where the assets will be repaid.         |
| positionAssets | uint256         | amount of assets that will be subtracted from the position. |
| borrower       | address         | address of the borrower.                                    |

**Returns**

| Name        | Type                   | Description                                       |
| ----------- | ---------------------- | ------------------------------------------------- |
| repayAssets | Previewer.FixedPreview | repayAssets amount of assets that will be repaid. |

#### previewWithdrawAtMaturity

```solidity
function previewWithdrawAtMaturity(contract Market market, uint256 maturity, uint256 positionAssets, address owner) external view returns (struct Previewer.FixedPreview)
```

Gets the amount to be withdrawn for a certain positionAmount of assets at maturity.

**Parameters**

| Name           | Type            | Description                                            |
| -------------- | --------------- | ------------------------------------------------------ |
| market         | contract Market | address of the market.                                 |
| maturity       | uint256         | maturity date/pool where the assets will be withdrawn. |
| positionAssets | uint256         | amount of assets that will be tried to withdraw.       |
| owner          | address         | owner of the fixed deposit position                    |

**Returns**

| Name           | Type                   | Description                                   |
| -------------- | ---------------------- | --------------------------------------------- |
| withdrawAssets | Previewer.FixedPreview | withdrawAssets amount that will be withdrawn. |


# DebtPreviewer (read-only)

This is a smart contract designed to abstract the `DebtManager` logic, it provides read-only functions ready to be consumed by Exactly’s web app.

**This contract has mainly 2 purposes:**

* Retrieve information about any account collateral and debt for any pair of markets in exactly.
* Allow accounts to preview their positions, simulating a leverage or deleverage to a certain ratio with a desired health factor.

Please be advised that the  `DebtPreviewer` contract has not undergone a formal security audit. As such, we strongly discourage integrations involving this contract, since it is exclusively intended for read-only purposes by the [Exactly Web App](https://app.exact.ly/). Using unaudited contracts for any other purpose may expose users to potential security risks or other unexpected behavior.

**GitHub URL:** <https://github.com/exactly/protocol/blob/main/contracts/periphery/DebtPreviewer.sol>


# RatePreviewer (read-only)

The `RatePreviewer` contract is a helper tool within Exactly Protocol designed to calculate and retrieve key metrics from the protocol's lending markets. It consolidates data such as floating debt, floating assets, interest rates, and fixed pool details for all registered markets. By providing structured snapshots of market states, it simplifies analysis, optimizes blockchain queries, and supports external tools or dashboards with comprehensive and accessible data.

**GitHub URL:** [**https://github.com/exactly/protocol/blob/main/contracts/periphery/RatePreviewer.sol**](https://github.com/exactly/protocol/blob/main/contracts/periphery/RatePreviewer.sol)


# Features

After a deep analysis of other Defi's lending and borrowing protocols, at Exactly we've carefully designed and improved several already known risk and model strategies.

In this way, we are happy to announce and elaborate further on some of our unique and outstanding features that make Exactly a solvent, reliable and robust protocol.


# Bad Debt Clearing

## What is bad debt?

Traditional lending protocols are vulnerable to accumulating **bad debt** due to the way that liquidation mechanisms are structured. On Aave and similar platforms, a certain Loan-to-Value (**LTV**) threshold needs to be upheld, which is a ratio between the collateral a user puts up and the amount borrowed. Usually, when an account breaches a certain LTV ratio, they are liquidated by a third party (e.g., a bot) for an incentive, and the debt is made whole again so that the protocol and LPs do not bear the losses. However, situations arise when a position is not liquidated on time (due to sharp fall in prices, absence of DEX liquidity, blockchain congestion/downtime, etc.) — if this occurs and the liquidated collateral is ultimately not able to cover a position's debt, the protocol is left with **bad debt** (users' loans that are assumed that won't be repaid).

## Exactly's Solution

We implemented an improved liquidate function. This function first checks with the Auditor contract how many assets the liquidator can repay, considering the borrower's collateral and the dynamic close factor calculation. The close factor is calculated considering the shortfall of the borrower and the positive target health that the position should move to after it's liquidated to avoid cascade liquidations and not to harsh the borrower that much.

Then it proceeds to iterate over all fixed loans where the borrower borrowed, first repaying the oldest ones. If extra repayment is needed, it continues with the variable debt. After the liquidator seizes what corresponds, a call to the Auditor's **`handleBadDebt`** function is made. This function checks if the borrower doesn't have any more collateral and in case it doesn't, then it forwards the execution to the `clearBadDebt` function in each Market. This one finally deletes the debt and spreads the losses subtracting them from some general accumulated earnings.

The **`handleBadDebt`** function is external and **permissionless**. It can not only be called by a liquidation but can be triggered by anyone at any time. Even though there is no real incentive for a user to call it, it is a way to take care of the solvency of the protocol; that's why Exactly will also count on a community/team-driven bot in charge of this. As compensation for the earnings that are subtracted from the accumulator when the clearing happens, in every liquidation, the liquidator also transfers into the protocol an incentive (%) for them.


# Dynamic Close Factor

The fraction of a borrower's debt that liquidators can pay off in one go is referred to by Compound as the 'close factor.' Compound and Aave's close factor is currently fixed at `0.5`, meaning liquidators can pay off up to half a borrower's loan in one go, regardless of how underwater their position is. This approach has a couple of potential drawbacks.

First, allowing liquidators to liquidate half a loan could be considered excessive if a smaller liquidation would have been sufficient to bring the borrower back to health. Larger borrowers are likely to be put off by such a process. Second, a sizeable fixed discount can sometimes drive borrowers closer to insolvency and disincentivize them from repaying their loans.

Therefore, we use a dynamic close factor on Exactly to \`soft liquidate' borrowers. Specifically, we allow liquidators to repay up to the amount needed to bring a borrower with a shortfall back out of violation (plus an additional safety factor). This means that borrowers who are only slightly in violation will often have much less than half their debts repaid during a liquidation, whilst borrowers who are heavily in violation will often have much more than half their debts repaid during a liquidation (their whole position might be closed in some circumstances).


# Earnings Accumulator

The yield to be accrued over time by variable pool suppliers comes from different sources of income. We can identify them between two different origins: **ordinary** and **extraordinary**.

## Ordinary

Ordinary earnings are immediately distributed to variable pool suppliers as soon as they are charged to borrowers. Every time the **variable borrowers**' debt increases, this newly assigned debt is directly distributed between current variable pool suppliers.

The same approach is used when distributing earnings that originate from fixed borrows that are being backed up by the variable pool. As previously explained in the [white paper](https://docs.exact.ly/guides/features/pages/ILA3HEUKlPY8oQUXcbvK#2.4-borrowing-assets-from-the-fixed-rate-pools), while the variable pool is lending assets to **fixed borrowers**, the fee charged to these borrowers is periodically accrued by the variable pool until a fixed supplier decides to deposit into this fixed pool and match the demand.

## Extraordinary

Extraordinary earnings are considered earnings that are accounted for in several mechanisms that Exactly count on to maintain the solvency and attractiveness of the protocol. Together with the ordinary earnings, these should be distributed between variable pool suppliers, **but** they may arise in large quantities in single operations.

So, to avoid opening possible MEV profits for bots or external actors to sandwich these operations by depositing to the pool with a significant amount of assets to acquire a more considerable proportion and thus earning profits for then instantly withdrawing, we've come up with an **earnings accumulator**.

This accumulator will hold earnings that come from extraordinary sources and will gradually and smoothly distribute these earnings to the pool using a distribution factor. Then incentivizing users to keep lending their liquidity while disincentivizing atomic bots that might look to profit from Exactly unfairly.

The extraordinary sources include:

### 1. Variable Pool (Back Up) Fee

It's the fee charged to the fixed depositors once they supply assets to a fixed rate pool that the variable pool suppliers will retain for initially providing liquidity.

### 2. Late Fixed Repayment Penalties

All penalties charged to fixed borrowers that repay **after** the corresponding maturity date.

### 3. Free Lunch

In finance, a 'free lunch' refers to a situation where there is no cost incurred by the individual receiving the goods or services being provided.

The rate offered to a fixed supplier is directly obtained through the number of fees that were charged to previously fixed borrowers. In this way, it's known that these fixed earnings are **limited**.

That's why there's always a maximum efficient amount for fixed deposits, and over that amount, any excess will be unnecessarily locked from a supplier's perspective. Users will be warned through our web app, but there are no restrictions at a smart contract level. The protocol should have as few prohibitions and caps as possible to help with our idea of a free and permissionless market/protocol.

If this is the case, the following fixed borrower that borrows from the fixed pool where the inefficient deposit lies will borrow from this amount of assets instead of using the backup suppliers' (variable pool). Consequently, the fees charged to that borrow will be considered a 'free lunch' since they originated from a borrow that used inefficient and locked assets.

### 4. Variable Pool Bonus in Liquidations

The earnings accumulator will be used to spread the losses caused by any [bad debt clearing](/guides/features/automatic-bad-debt-clearing).

To counter these losses, a percentage of the seized collateral is added to the accumulator in **every** liquidation.


# Cross-Asset Leverager & Deleverager

The Leverage and Deleverage features allow users to increase or decrease positions in a single transaction. Using these strategies, users can perform several operations in the same transaction: same asset leverage, same asset deleverage, cross-asset leverage, and cross-asset deleverage, saving up to 20 transactions, depending on the market, asset, ratio, and amount they choose.

## Leverage Feature

The Leverage function allows users to increase their exposure to different assets in only one transaction without having to manually perform numerous deposits and borrows.

{% embed url="<https://youtu.be/ALrdOTN05M0>" %}

### Single-Asset Leverage <a href="#id-1871" id="id-1871"></a>

This feature can be used to boost the return of the user’s exposure to a specific asset in just one transaction. By selecting their desired leverage factor, the [DebtManager](https://docs.exact.ly/guides/periphery/debtmanager) smart contract will increase the user’s deposit by the chosen number (by borrowing the appropriate amount).

*For instance, if a user has 100 USDC and selects a 3.0x leverage, their deposit will increase to 300 USDC, while their borrowed amount becomes 200 USDC.*

### Cross-Asset Leverage <a href="#id-17f1" id="id-17f1"></a>

The cross-asset leverage enables users to leverage their positions across different assets. Typically, users deposit one asset, such as wstETH, and borrow another, such as ETH. By leveraging this feature, users can increase their exposure to the borrowed asset or even take long or short positions on specific assets.

*E.g., if a user deposits USDC and borrows ETH, which is then sold to deposit more USDC, they effectively short ETH. If the price of ETH subsequently decreases, the user can repay their borrowed ETH with less USDC, resulting in a profit.*

## Deleverage Feature <a href="#id-20fa" id="id-20fa"></a>

This feature complements the Leverage function by offering users an easy way to repay their debts using their deposited assets as collateral.

{% embed url="<https://youtu.be/3sM5q2BoFUg>" %}

### Single-Asset Deleverage <a href="#id-133d" id="id-133d"></a>

The same asset Deleverage feature enables users to reduce their leverage exposure on the same asset.

*For instance, if a user initially leverages a 100 USDC deposit at a 4x ratio, resulting in a deposit of 400 USDC and a borrow of 300 USDC, they can utilize the same asset deleverage to move the leverage ratio from 4x to 1x. As a result, after the deleveraging transaction, the user will end up with a 100 USDC deposit.*

### Cross-Asset Deleverage <a href="#id-2971" id="id-2971"></a>

Using Cross-asset deleverage, users can reduce their leverage exposure across different assets. In addition, to adjusting the leverage ratio, users can also choose to withdraw a specific amount of funds during the deleveraging process.

*For example, if a user wants to move from a 4x to a 1x leverage ratio and withdraws their entire 100 USDC deposit, the transaction would result in zero deposits, zero borrows, and 100 USDC directly available back in their wallet.*

## Permit Model

These features are possible through the [DebtManager](https://docs.exact.ly/guides/periphery/debtmanager) smart contract. For security reasons, this contract uses ['permits'](https://help.1inch.io/en/articles/5435386-permit-712-signed-token-approvals-and-how-they-work-on-1inch) for approvals related to allowing you to transfer tokens on your behalf and perform withdrawals or borrows from a Market. Permits are signatures spent when the user completes the transaction, and the approved amount is always exact. After the leverage or deleverage operation is completed, the DebtManager no longer has any allowance over tokens, withdraws or borrows.


# Liquidity Reserve

By design, the protocol sets aside a percentage of the variable rate pool deposits as liquidity reserves.

These reserves cannot be borrowed so the protocol always ensures that there's an available underlying amount for withdrawals. This can be adjusted over time given different market conditions through the [Reserve Factor](https://docs.exact.ly/guides/features/pages/AAZiGd76hBxtdgHYSvLa#a.-reserve-factor) (a parameter that can be found in each [Market](/guides/protocol/market) contract).


# Rewards Distribution Model

The [**RewardsController**](https://docs.exact.ly/guides/protocol/rewardscontroller) contract distributes rewards to accounts that interact with the protocol.

Reward programs typically rely on a fixed emission schedule overtime or a predetermined distribution function rule. However, these approaches could be more effective in attracting a diverse user base, often leading to a concentration of rewards among a few select wallets.

To optimize the use of our available token supply, we are introducing a new distribution rule that adjusts the distribution of rewards based on the current achieved percentage of the target loan volume of the protocol. Additionally, we are adding a feature that adjusts the rewards given to borrowers and liquidity providers based on the utilization rate of each pool. This will help ensure that our token distribution is aligned with the usage and demand for the protocol's utilization and helps optimize the system's overall performance.

We built a new adaptive model at Exactly to address this issue: a recursive token distribution in continuous time. The model implements an incentive function based on how closely or far the program's objectives are being met during the rewards period.

The proposed model has two distinct modules:

* The distribution module determines the number of tokens allocated during each time frame (determined by two consecutive protocol transactions).
* The allocation module determines the proportion of tokens allocated to each protocol user class in each specific period.

Since its conception, this contract supports a multiple array of different tokens.

### Audits

As a DeFi protocol, our top priority is to provide a reliable and secure system for our users. We are committed to continuously improving our platform to ensure the safety and integrity of all transactions. For that reason we have enlisted the expertise of Coinspect, a highly respected security audit firm, to perform an extensive review of our [Rewards Controller contract](/guides/protocol/rewardscontroller).

Coinspect has conducted three separate audits on the Rewards Controller, which have taken place in January, February, and March of 2023. Each audit was performed to identify any potential vulnerabilities, validate the overall design, and ensure that our Rewards Controller meets the highest security standards.

You can access the detailed reports of these three audits by clicking on the following links:

1. [Coinspect Rewards Controller 1st audit (Jan-23)](https://github.com/exactly/audits/blob/main/Coinspect%20RewardsController%201st%20audit%20\(Jan-23\).pdf)
2. [Coinspect Rewards Controller 2nd audit (Feb-23)](https://github.com/exactly/audits/blob/main/Coinspect%20RewardsController%202nd%20audit%20\(Feb-23\).pdf)
3. [Coinspect Rewards Controller 3rd audit (Mar-23)](https://github.com/exactly/audits/blob/main/Coinspect%20RewardsController%203rd%20audit%20\(Mar-23\).pdf)

Each audit report contains a comprehensive analysis of the Rewards Controller's security, addressing any potential issues and outlining the steps taken to resolve them.

### Math model

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fn6wwJ0pvrhjXGxxDpmNa%2Fuploads%2FjefVkjTKHNJSgk7ueIjH%2FExactly%20Rewards%20Controller%20Math%20Model.pdf?alt=media&token=7fe72436-b79a-4220-862b-340e71f069cb>" %}


# Rate Manipulation Prevention

As the [Math Paper](https://docs.exact.ly/guides/features/pages/ihmEtd2CI0FntwFieDrC#4.1.3-time-averaged-variable-rate-pool-supply) explains, when calculating the utilization rate for fixed borrows, an average of the variable pool deposits (`floatingAssetsAverage`) is passed to the [InterestRateModel](/guides/protocol/interestratemodel). The reason behind this is to prevent manipulation of a fixed borrow rate: a user could deposit a significant amount in the variable pool to lower the utilization, ask for a considerably cheap fixed borrow and then withdraw the initially deposited amount.

The `floatingAssetsAverage` is updated with the use of damp speeds to smoothly increase or decrease the value that the actual variable pool deposits (`floatingAssets`) have through a short period of time. With this approach, for example, if a user deposits to the variable pool and wants to ask for a fixed borrow in the same transaction, the average will still account for the outdated value.


# Rollover

The Rollover brings an enhanced level of flexibility and control to Exactly Protocol's users, allowing them to strategically decide when and where they want to rollover their loans.

{% embed url="<https://youtu.be/knGj2uTOyos>" %}

## **What Exactly can users do using rollover?** <a href="#id-1504" id="id-1504"></a>

* **Transition from uncertainty to certainty:** Users can convert any variable-rate loan into a fixed-rate loan with a specific maturity date.
* **Embrace flexibility:** Users can convert any fixed-rate loan into a variable pool, transforming their position into a variable-rate loan.
* **Opt for a Different Maturity Date:** Users can move any fixed-rate loan into another fixed-rate loan as long as the new fixed-rate pool has a different maturity date from the current one. \
  *For instance, if you hold a fixed-rate loan maturing on July 05, 2023, you can refinance this loan by shifting your debt to another fixed-rate pool maturing on September 27, 2023.*

## Partial Loan Refinancing <a href="#id-1230" id="id-1230"></a>

One point to be highlighted is that our users can also choose whether they want to refinance the total amount of their loan or just a portion of it.

For instance, if you hold a 100 USD fixed-rate loan due to mature on July 05, you can decide to refinance only a fraction of the total loan amount. Let’s say you choose to rollover just 40 USDC; you can smoothly transfer this selected part to another fixed-rate pool, perhaps one with a later maturity date.

## Permit Model

This feature is possible through the [DebtManager](https://docs.exact.ly/guides/periphery/debtmanager) smart contract. For security reasons, this contract uses ['permits'](https://help.1inch.io/en/articles/5435386-permit-712-signed-token-approvals-and-how-they-work-on-1inch) for approvals related to allowing you to transfer tokens on your behalf and perform withdrawals or borrows from a Market. Permits are signatures spent when the user completes the transaction, and the approved amount is always exact. After the leverage or deleverage operation is completed, the DebtManager no longer has any allowance over tokens, withdraws or borrows.


# Fixed Rate Operations

Users can supply and borrow assets to/from various Fixed Rate Pools depending on their time horizon preferences.

Each new deposit increases liquidity for that specific Fixed Rate Pool, reducing its utilization rate. Conversely, each new borrow takes out liquidity and increases the utilization rate. When there is a new operation (deposit/borrow) in a Fixed Rate Pool, interest rates are determined based on the state of the system at this moment. Nevertheless, credit demand (borrows) and supply (deposits) rates are calculated using different principles.

You can read more [here](https://docs.exact.ly/guides/pages/ihmEtd2CI0FntwFieDrC#4.1.1.-credit-demand-interest-rate-function).


# Deposits

Any depositor can supply assets to the pool at any time during the life of a Fixed Rate Pool. No deposits can be made once the fixed pool matures (after the maturity date).

When there is a new deposit to a Fixed Rate Pool, the system determines the total amount of outstanding borrows backed by the Variable Rate Pool and calculates the interest pending payment. The deposit returns an equivalent amount of funds to the Variable Rate Pool, and its corresponding interest pending payment is assigned to the new depositor.

Each fixed deposit is composed of two different amounts, **principal** and **earnings**. The principal is the initial amount deposited, whereas the earnings are the extra interest the depositor will acquire after maturity.

It's important to highlight that **fixed-rate deposits can't be used as collateral to borrow other assets.**

## Early Withdrawals

Depositors can withdraw anytime, even before maturity, provided enough liquidity is available in the protocol. So, early withdrawals are equivalent to requesting a fixed rate borrow for the total deposit (principal+earnings) in the same fixed rate pool.

*For example, Alice deposits $100 into a 1-year fixed-rate pool with an interest rate of 10% APR. Then her total deposit at maturity equals $110 ($100+$10).*

*Now let's say that a few hours later, the utilization of the pools goes down, and the 1-year fixed rate for borrowing $110 is also 10% APR; Alice could decide to make an early withdrawal of her fixed rate deposit, and she will get back now the present value of her total deposit at maturity ($110) discounted by the current fixed borrow rate (10% APR), in this case, equal to the original $100 that she deposited ($110/1.1).*

## Late Withdrawals

Depositors can also withdraw once the maturity date is reached.

There's no limit to the time they have to withdraw their funds but bear in mind that these deposited assets will not generate any extra interest rate fees.


# Borrows

Any borrower can ask for a loan at any time during the life of a Fixed Rate Pool, provided they have [enough collateral](https://docs.exact.ly/guides/fixed-rate-operations/pages/ihmEtd2CI0FntwFieDrC#4.1.-borrowing-assets-at-fixed-rates) in the Variable Rate Pool. No new borrows can be made after the maturity date of the Fixed Rate Pool.

The interest rate to be applied to each loan is determined by an interest rate demand function that depends on the utilization rate on that specific Fixed Rate Pool at that moment. This utilization comprises two types of funding: deposits in the same Fixed Rate Pool and deposits in the Variable Rate Pool that will initially back up the borrow.

Each fixed borrower comprises two different amounts, **principal** and **interest rate** **fees**. The principal is the initial amount borrowed, whereas the fee is the interest the borrower will need to repay on top of the borrowed amount when repaying at maturity time.

## Early Repayments

Borrowers are allowed to repay at any time, even before the maturity date. The advantage of repaying early is that they can get a discount considering the utilization of the pool at the current time since repaying early is equivalent to making a fixed deposit.

*For example: If Bob borrows $100 from a 1 year fixed pool with a fixed interest rate of 5% APR, then his debt equals $105 at maturity.*

*Now let's say that a few hours later, the fixed rate for depositing $100 (in the same fixed rate pool) increases to 5% APR; Bob could decide to repay his whole debt ($105) before maturity without any extra cost since in this example the present value of its total debt discounted at new fixed deposit rate ($105/1.05) is equal to his new deposit ($100).*

In this way, if the utilization of a pool gets higher, the new fixed deposit rate will be higher, and the fixed-rate borrowers are incentivized to bring back liquidity before the maturity date.

## Late Repayments

Borrowers can also repay after the maturity date, but in this case, a penalty is charged for every delayed second that went by since the maturity date.

The [penalty rate](https://docs.exact.ly/guides/fixed-rate-operations/pages/AAZiGd76hBxtdgHYSvLa#j.-penalty-rate) is charged to the whole debt (principal and fixed interest fees).

*For example, Bob makes a fixed borrow for 3 months and has a total debt at maturity of $100 ($97 of his initial loan + $3 in fixed interest rate fees). Then Bob delayed his payment by 10 days since the maturity date. If the daily penalty rate equals 0.45%, then $4.5 in penalties, so his new total debt will be $104.5 ($97 + $3 + $4.5)*

It's worth highlighting that any penalties increase will also account as debt for the health factor calculation of the user's positions.

## Preventing Manipulation

The protocol takes several measures to prevent manipulation of the fixed borrow rate. One of these measures is calculating the utilization rate for fixed borrows by taking an average of the variable pool deposits, known as `floatingAssetsAverage`, and passing it to the [InterestRateModel](/guides/protocol/interestratemodel). Without this method, a user could deposit a large sum into the variable pool, lower the utilization rate, and then request a low fixed borrow before withdrawing their initial deposit. This is a potential flash loan attack scenario, but the `floatingAssetsAverage` is updated with a damp speed algorithm to adjust the value of the actual variable pool deposits gradually (`floatingAssets`) over a short period of time. This ensures that even if a user deposits to the variable pool and requests a fixed borrow in the same transaction, the average will still account for the outdated value. More details about this can be found in the [Math Paper](https://docs.exact.ly/guides/fixed-rate-operations/pages/ihmEtd2CI0FntwFieDrC#4.1.3-time-averaged-variable-rate-pool-supply) section.

Another way the protocol prevents manipulation is through the `maxSlippage` mechanism. This feature allows users to specify the maximum deviation in the rate they are willing to accept when requesting a fixed borrow, limiting the opportunity for malicious actors to front run a fixed borrow operation.


# Parameters

There is an explanation of the following parameters in [Model Parameters](/resources/math-paper#model-parameters).

## A. Reserve Factor

$$
\begin{align\*} \eta = 5% \end{align\*}
$$

$$\eta$$ the fraction of the total Variable Rate Pool deposits established as Liquidity Reserves can't be borrowed and will only be available for withdrawals.

## B. Treasury Fee

The treasury fee refers to the percentage of interest rate charges paid by borrowers that the protocol retains for its treasury.

* **Treasury Fee on OP Mainnet**

$$
\begin{align\*} \lambda\_r = 20% \end{align\*}
$$

OP Mainnet Treasury multisig address: <https://optimistic.etherscan.io/address/0x23fd464e0b0ee21cedeb929b19cabf9bd5215019>

* **Treasury Fee on Ethereum Mainnet**

$$
\begin{align\*} \lambda\_r = 0% \end{align\*}
$$

## C. Optimism Mainnet Interest Rate Curves

* **USDC**

| Parameter         | Value       |
| ----------------- | ----------- |
| $$A$$=            | 4.7074e-03  |
| $$B$$=            | 3.8577e-02  |
| $$U\_{max}$$=     | 1.200000000 |
| $$U\_{liq}0$$=    | 0.880000000 |
| $$k\_{sigmoid}$$= | 2.500000000 |
| $$α$$=            | 1.250000000 |

* **USDC.e**

| Parameter         | Value       |
| ----------------- | ----------- |
| $$A$$=            | 4.7074e-03  |
| $$B$$=            | 3.8577e-02  |
| $$U\_{max}$$=     | 1.200000000 |
| $$U\_{liq}0$$=    | 0.880000000 |
| $$k\_{sigmoid}$$= | 2.500000000 |
| $$α$$=            | 1.250000000 |

* **WETH**

| Parameter         | Value       |
| ----------------- | ----------- |
| $$A$$=            | 1.0164e-03  |
| $$B$$=            | 1.8718e-02  |
| $$U\_{max}$$=     | 1.300000000 |
| $$U\_{liq}0$$=    | 0.880000000 |
| $$k\_{sigmoid}$$= | 2.500000000 |
| $$α$$=            | 1.100000000 |

* wstETH

| Parameter         | Value       |
| ----------------- | ----------- |
| $$A$$=            | 1.0164e-03  |
| $$B$$=            | 1.8718e-02  |
| $$U\_{max}$$=     | 1.300000000 |
| $$U\_{liq}0$$=    | 0.880000000 |
| $$k\_{sigmoid}$$= | 2.500000000 |
| $$α$$=            | 1.100000000 |

* **OP**

| Parameter         | Value       |
| ----------------- | ----------- |
| $$A$$=            | 3.3634e-02  |
| $$B$$=            | -1.5528e-02 |
| $$U\_{max}$$=     | 1.200000000 |
| $$U\_{liq}0$$=    | 0.600000000 |
| $$k\_{sigmoid}$$= | 2.500000000 |
| $$α$$=            | 1.100000000 |

* **WBTC**

| Parameter         | Value       |
| ----------------- | ----------- |
| $$A$$=            | 8.5903e-02  |
| $$B$$=            | 7.1813e-02  |
| $$U\_{max}$$=     | 1.050000000 |
| $$U\_{liq}0$$=    | 0.500000000 |
| $$k\_{sigmoid}$$= | 2.500000000 |
| $$α$$=            | 2.000000000 |

## D. Base Interest Rate Curves

* **USDC**

| Parameter         | Value       |
| ----------------- | ----------- |
| $$A$$=            | 5.0000e-02  |
| $$B$$=            | 1.1000e-01  |
| $$U\_{max}$$=     | 1.300000000 |
| $$U\_{liq}0$$=    | 0.880000000 |
| $$k\_{sigmoid}$$= | 2.500000000 |
| $$α$$=            | 1.300000000 |

* **WETH**

| Parameter         | Value       |
| ----------------- | ----------- |
| $$A$$=            | 1.9500e-02  |
| $$B$$=            | 4.0000e-02  |
| $$U\_{max}$$=     | 1.300000000 |
| $$U\_{liq}0$$=    | 0.880000000 |
| $$k\_{sigmoid}$$= | 2.500000000 |
| $$α$$=            | 1.100000000 |

* wstETH

| Parameter         | Value       |
| ----------------- | ----------- |
| $$A$$=            | 1.9500e-02  |
| $$B$$=            | 4.0000e-02  |
| $$U\_{max}$$=     | 1.300000000 |
| $$U\_{liq}0$$=    | 0.880000000 |
| $$k\_{sigmoid}$$= | 2.500000000 |
| $$α$$=            | 1.100000000 |

* **cbBTC**

| Parameter         | Value       |
| ----------------- | ----------- |
| $$A$$=            | 1.0000e-02  |
| $$B$$=            | 1.5000e-01  |
| $$U\_{max}$$=     | 1.050000000 |
| $$U\_{liq}0$$=    | 0.500000000 |
| $$k\_{sigmoid}$$= | 2.500000000 |
| $$α$$=            | 2.000000000 |

* **cbXRP**

| Parameter         | Value       |
| ----------------- | ----------- |
| $$A$$=            | 1.5000e-02  |
| $$B$$=            | 2.0000e-01  |
| $$U\_{max}$$=     | 1.400000000 |
| $$U\_{liq}0$$=    | 0.500000000 |
| $$k\_{sigmoid}$$= | 2.500000000 |
| $$α$$=            | 1.250000000 |

## E. Ethereum Mainnet Interest Rate Curves

* WETH

| Parameter     | VRP Value   | FRP Value   |
| ------------- | ----------- | ----------- |
| $$A$$ =       | 1.9362e-2   | 3.8126e-1   |
| $$B$$ =       | -1.787e-3   | -3.6375e-1  |
| $$U\_{max}$$= | 1.003870947 | 1.000010695 |

* DAI

| Parameter     | VRP Value   | FRP Value   |
| ------------- | ----------- | ----------- |
| $$A$$ =       | 1.7852e-2   | 3.9281e-1   |
| $$B$$ =       | -2.789e-3   | -3.7781e-1  |
| $$U\_{max}$$= | 1.003568501 | 1.000014451 |

* USDC

| Parameter     | VRP Value   | FRP Value   |
| ------------- | ----------- | ----------- |
| $$A$$ =       | 1.4844e-2   | 3.9281e-1   |
| $$B$$ =       | 1.9964e-4   | -3.7781e-1  |
| $$U\_{max}$$= | 1.002968978 | 1.000014451 |

* WBTC

| Parameter     | VRP Value   | FRP Value   |
| ------------- | ----------- | ----------- |
| $$A$$ =       | 2.7194e-2   | 4.6586e-1   |
| $$B$$ =       | 3.0160e-2   | -4.1345e-1  |
| $$U\_{max}$$= | 1.007776377 | 1.050553997 |

* wstETH

| Parameter     | VRP Value   | FRP Value   |
| ------------- | ----------- | ----------- |
| $$A$$ =       | 1.9362e-2   | 3.8126e-1   |
| $$B$$ =       | -1.787e-3   | -3.6375e-1  |
| $$U\_{max}$$= | 1.003870947 | 1.000010695 |

* OP

| Parameter     | VRP Value   | FRP Value   |
| ------------- | ----------- | ----------- |
| $$A$$ =       | 2.8487e-2   | 3.5815e-1   |
| $$B$$ =       | -5.8259e-3  | -3.3564e-1  |
| $$U\_{max}$$= | 1.005690787 | 1.000005527 |

These parameters are utilized to calculate [the effective borrow interest rate](https://docs.exact.ly/getting-started/math-paper#4.1.2-the-effective-interest-rate-for-a-particular-loan).

## F. Risk Factors

* OP Mainnet

| Asset  | Value |
| ------ | ----- |
| WETH   | 0.86  |
| USDC   | 0.91  |
| USDC.e | 0.91  |
| WBTC   | 0.78  |
| wstETH | 0.82  |
| OP     | 0.58  |

* Base

| Asset  | Value |
| ------ | ----- |
| WETH   | 0.86  |
| USDC   | 0.91  |
| cbBTC  | 0.85  |
| wstETH | 0.82  |
| cbXRP  | 0.60  |

* Ethereum Mainnet

| Asset  | Value |
| ------ | ----- |
| WETH   | 0.86  |
| DAI    | 0.90  |
| USDC   | 0.91  |
| WBTC   | 0.85  |
| wstETH | 0.82  |

We associate a [Risk-Adjust Factor](https://docs.exact.ly/getting-started/math-paper#6.-liquidations) to each asset to assess each collateral asset's borrow and lending power.

To assess the Risk-Adjust Factor for each asset in the protocol, you can query the `markets()` function of the [Auditor](/guides/protocol/auditor) contract. This can be done using [Etherscan](https://etherscan.io/), a blockchain explorer.

Follow the steps below to check the Risk-Adjust Factor for a specific asset:

1. Go to the Auditor contract on Etherscan by navigating to the following URL: <https://etherscan.io/address/0x310A2694521f75C7B2b64b5937C16CE65C3EFE01#readProxyContract#F17> (for other networks, go to [Smart Contract Addresses](/guides/smart-contract-addresses) and click on the address of the desired Auditor contract)
2. To query the `markets` In that contract, you will need the market contract address for the specific asset. For example, you can use the following address to check the Risk-Adjust Factor for USDC: `0x660e2fC185a9fFE722aF253329CEaAD4C9F6F928`. All addresses for each network (Mainnet, Optimism, et al.) are available in [Smart Contract Addresses](/guides/smart-contract-addresses).
3. Click the "Query" button to call the function. The result will display various information about the market, including the Risk-Adjust Factor.
4. The Risk-Adjust Factor will be returned as `adjustFactor`. In this case, `910000000000000000` equals 0.91.\
   ![](/files/I6AdlkyuqZcSIutdIBkO)

Following these steps, you can check the Risk-Adjust Factor for any asset in the protocol by simply replacing the market contract address with the one corresponding to the desired asset.

## F. Variable Rate Pool Fee

$$
\begin{align\*} \delta = 10% \end{align\*}
$$

$$\delta$$ is the fraction of the [fixed interest rate fees](https://docs.exact.ly/getting-started/math-paper#4.2.1-supply-interest-rate) retained by the Variable Rate Pool upon leaving the Fixed Rate Pool.

## G. Supply E.M.A. Parameters

$$
\begin{align\*} \beta\_{slow} = 0.000053 \end{align\*}
$$

The time decay parameter is used when the supply is above average.

$$
\begin{align\*} \beta\_{fast} = 0.4000 \end{align\*}
$$

The time decay parameter is used when the supply is below average.

## H. Target Solvency Ratio

$$
\begin{align\*} \Gamma = 1.25 \end{align\*}
$$

Target solvency ratio after [liquidation](https://docs.exact.ly/getting-started/math-paper#6.-liquidations).

## I. Liquidation Bonuses

$$
\begin{align\*} \nu\_{liquidator} = 5.00% \ \nu\_{bad-debt} = 0.25% \end{align\*}
$$

During the [liquidation process](https://docs.exact.ly/getting-started/math-paper#6.-liquidations), the liquidator gets a commission fee, and the Variable Rate Pool receives a percentage of extra liquidation fees to compensate for potential bad debt residuals.

## J. Extraordinary Earnings Distribution Factor

$$
\begin{align\*} \xi\_{extearn} = 2.00 \end{align\*}
$$

## K. Penalty Rate

$$
\begin{align\*} DailyPenaltyRate = 0.45% \end{align\*}
$$

The daily penalty rate fee is charged to fixed interest rate borrowers who didn't pay their loans on time. This fee is charged daily after the maturity day.&#x20;

For example, if your total debt after the maturity date is $100, and you pay 10 days later, the penalty fees will be $4.5 (0.45%\*10\*$100).


# Interest Rates Curves

The demand curve for interest rates is based on the Utilization Rate of each pool. Increasing and decreasing the interest rate incentivizes lenders to provide additional liquidity and borrowers to request more credit, ​​respectively. The curve can be easily [parametrized](/guides/parameters) to adjust it to changing market conditions.

You can read more about our Interest Rate Model in our [White Paper](https://docs.exact.ly/getting-started/white-paper#3.-the-exactly-interest-rate-model) and also in our [Math Paper](https://docs.exact.ly/getting-started/math-paper#4.1.2-the-effective-interest-rate-for-a-particular-loan).

## WETH - Ethereum Mainnet

<figure><img src="/files/zDN0cfWU3wAyrArQc7cH" alt=""><figcaption></figcaption></figure>

<div data-full-width="false"><figure><img src="/files/zyMoCEpZAT8lc5NJbrG5" alt="" width="563"><figcaption></figcaption></figure></div>

## DAI - Ethereum Mainnet

<figure><img src="/files/4By70BuyN8rKmH8SRHlG" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/aalF7uo7nGAz1urQMKNY" alt="" width="563"><figcaption></figcaption></figure>

## USDC - Ethereum Mainnet

<figure><img src="/files/yV1thktVNyJUi2QTdLNL" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/g49W0riPkaIVvvPV4o5z" alt="" width="563"><figcaption></figcaption></figure>

## WBTC - Ethereum Mainnet

<figure><img src="/files/qCdwMKc6qAXr8QmVNRgG" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/KNiNonMIcARuaAJykAuz" alt="" width="563"><figcaption></figcaption></figure>

## wstETH - Ethereum Mainnet

<figure><img src="/files/ucyTHcmfgY9IqJqfKft8" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Nru4xnxdEfltUmQ73wgF" alt="" width="563"><figcaption></figcaption></figure>

## OP - Ethereum Mainnet

<figure><img src="/files/kMvIqhZYebOaSshp9qpZ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ksmyFbF8xpB2cdiiZ6CM" alt="" width="563"><figcaption></figcaption></figure>


# Liquidations

The health of Exactly's Protocol depends on the 'health' of the loans within the system, also known as the 'health factor'. When the [health factor](/guides/price-feeds#health-factor) of an account's total loans is below `1`, anyone can make a `liquidate()` call to the [Market](/guides/protocol/market) contract, paying back part of the debt owed, and receiving discounted collateral in return (also known as the liquidation bonus as [previously seen here](https://docs.exact.ly/guides/pages/AAZiGd76hBxtdgHYSvLa#h.-liquidation-bonuses)).

This incentivizes third parties to participate in the solvency of the overall protocol by acting in their interest (to receive the discounted collateral) and, as a result, ensure loans are sufficiently collateralized.

## Instructions

In order to know whether an account can be liquidated or not, the `accountLiquidity` function in the [Auditor](/guides/protocol/auditor) contract can be called.

As for the `marketToSimulate` parameter, the [address zero](https://etherscan.io/address/0x0000000000000000000000000000000000000000) should be passed, and zero (`0`) should also be sent as `withdrawAmount`.

### accountLiquidity

```solidity
function accountLiquidity(address account, contract Market marketToSimulate, uint256 withdrawAmount) external view returns (uint256 sumCollateral, uint256 sumDebtPlusEffects)
```

**Parameters**

| Name             | Type            | Description                                        |
| ---------------- | --------------- | -------------------------------------------------- |
| account          | address         | account in which the liquidity will be calculated. |
| marketToSimulate | contract Market | market in which to simulate withdraw operation.    |
| withdrawAmount   | uint256         | amount to simulate as withdraw.                    |

**Returns**

| Name               | Type    | Description                                                                            |
| ------------------ | ------- | -------------------------------------------------------------------------------------- |
| sumCollateral      | uint256 | sum of all collateral, already multiplied by each adjust factor (denominated in base). |
| sumDebtPlusEffects | uint256 | sum of all debt divided by adjust factor considering withdrawal (denominated in base). |

This function will return the total adjusted collateral and debt of the account. Then the collateral can be divided by the debt to get the health factor.

If its value is lower than `1`, then the liquidate function will not revert when being called for that user.

Other more efficient ways of checking for account positions require monitoring block-to-block transactions. This is the approach followed by our [open-source and team-driven bot](/guides/liquidations/exactlys-bot).

Once there's an account opened to be liquidated, the `liquidate` function can be called to successfully repay the debt of that user and seize a portion of its collateral with a discount.

The function expects and returns the following arguments:

### liquidate

```solidity
function liquidate(address borrower, uint256 maxAssets, contract Market seizeMarket) external nonpayable returns (uint256 repaidAssets)
```

**Parameters**

| Name        | Type            | Description                                                                       |
| ----------- | --------------- | --------------------------------------------------------------------------------- |
| borrower    | address         | wallet that has an outstanding debt across fixed and variable pools.              |
| maxAssets   | uint256         | maximum amount of debt that the liquidator is willing to accept. (it can be less) |
| seizeMarket | contract Market | market from which the collateral will be seized to give the liquidator.           |

**Returns**

| Name         | Type    | Description           |
| ------------ | ------- | --------------------- |
| repaidAssets | uint256 | actual amount repaid. |

It's important to highlight that `maxAssets` should also include an [extra bonus](https://docs.exact.ly/guides/pages/AAZiGd76hBxtdgHYSvLa#h.-liquidation-bonuses) that the variable pool of the Market will keep that the debt is being repaid.

## Health Factor

The health factor is calculated from the user's collateral balance (in `ETH`) multiplied by each asset's adjust factor divided by the user's debt which is also divided by this adjust factor.

For example: given an `ETH` adjusted factor of `0.84`, a deposit of `100 ETH` and borrow of `50 ETH`:

The adjusted collateral will be equal to `100*0.84 = 84.00`

The adjusted debt will be equal to `50/0.84 = 59.52`&#x20;

So the health factor will be equal to `84.00/59.52 = 1.41`&#x20;

Below a health factor of `1`, the user will be considered with shortfall and open to [liquidation](https://docs.exact.ly/guides/pages/ihmEtd2CI0FntwFieDrC#6.-liquidations).


# Exactly's Bot

At Exactly, we developed our own open-source team-driven liquidation bot. You can check out the code here: <https://github.com/exactly/liquidation-bot>.

We strongly advise and invite anyone interested in participating in Exactly's liquidations to fork from it and build on top.

## How does it work?

The liquidation bot analyzes the users' positions using the events emitted by the protocol with the minimum number of calls to the contracts, thus making the bot more efficient in recreating such states.

After connecting to the RPC provider through a WebSocket, the bot subscribes to receive the events stream.

Each one of those events is parsed and transcribed into the user's data.

Whenever there's an idle moment on receiving new events, the bot does a check for liquidations.

If a position is in a state to be [liquidated](/getting-started/faq#what-is-a-liquidation) (with a [Health Factor](/getting-started/faq#what-is-the-health-factor) less than 1), the liquidation function in the [flash loan contract](#flash-loan-contract) is called.

**Important**: to avoid reentrancy issues on Uniswap's contract, the bot must pick a pair of assets that is **not** the same pair of debt/collateral.

After this call, the bot liquidates the user's debt seizing the collateral with the highest value.

After the liquidations, the bot waits for more events and recreates the user's positions.

### Flash loan contract

The flash loan contract calls the liquidation function in the [protocol](/guides/protocol).

It checks its amount on the specific debt asset available on the contract's balance to repay the user's debt. In case it has less than the amount needed to liquidate the user, it does as follow:

1. Borrow on Uniswap V3 the difference between what it has and the user's debt
2. Waits for a callback notifying it that the amount was received
3. Repays the debt
4. Receives the collateral
5. Swaps it to the same as the user's debt
6. Repays Uniswap V3

## Structure

The project is structured as follows:

* `main.rs`
  * Setups the bot to connect correctly to RPC Provider.
  * Starts the service and handles most of the errors.
* `service.rs`: It's where most of the tasks are executed.
  * A subscription to the event's stream is made on the main thread.
  * Each event received is parsed.
  * Positions are created
  * A debounce for idleness is made in another thread.
  * When the bot is idle, this thread checks for liquidations
* `borrower.rs`: This structure is used to store users' data.
* `exactly_oracle.rs`: Helper to access price protocol used by the .protocol.
* `fixed_lender.rs`: Stores updated information created by the protocol's emitted events about all the markets.
* `exactly_events.rs`: Redirect the events to suitable structures.
* `config.rs`: Handle environment variables such as RPC provider link access, wallet's private key, etc.


# Smart Contract Addresses

The Exactly protocol is currently deployed in the following networks:

## Base

<table><thead><tr><th width="274.3333333333333">Contract</th><th width="237" align="center">Address</th><th align="center">Implementation</th></tr></thead><tbody><tr><td>Auditor</td><td align="center"><a href="https://basescan.org/address/0x0Aeb0BCB919858C0a4dceC3EeD879985034A597c">0x0Aeb0BCB919858C0a4dceC3EeD879985034A597c</a></td><td align="center"><a href="https://basescan.org/address/0x79E30d4d61224dCE20f2d84f99edb2452565b107">0x79E30d4d61224dCE20f2d84f99edb2452565b107</a></td></tr><tr><td>InterestRateModelcbBTC</td><td align="center"><a href="https://basescan.org/address/0xf9b612fFe3FAB24e74026d2B5d13cbCEAd6380F2">0xf9b612fFe3FAB24e74026d2B5d13cbCEAd6380F2</a></td><td align="center">Doesn't apply. </td></tr><tr><td>InterestRateModelcbXRP</td><td align="center"><a href="https://basescan.org/address/0xE963cDF1eC0Bb86f009d764D6eE3FEB6697453B7">0xE963cDF1eC0Bb86f009d764D6eE3FEB6697453B7</a></td><td align="center">Doesn't apply.</td></tr><tr><td><p></p><p>InterestRateModelUSDC</p></td><td align="center"><a href="https://basescan.org/address/0x406E73C6eB2308e0557c031354c4A6f3374E35a4">0x406E73C6eB2308e0557c031354c4A6f3374E35a4</a></td><td align="center">Doesn't apply.</td></tr><tr><td>InterestRateModelWETH</td><td align="center"><a href="https://basescan.org/address/0x163538E22F4d38c1eb21B79939f3d2ee274198Ff">0x163538E22F4d38c1eb21B79939f3d2ee274198Ff</a></td><td align="center">Doesn't apply.</td></tr><tr><td>MarketETHRouter</td><td align="center"><a href="https://basescan.org/address/0x85c21fA8AeE39891E115E2b28c3dB2dE5B0AaF4f">0x85c21fA8AeE39891E115E2b28c3dB2dE5B0AaF4f</a></td><td align="center"><a href="https://basescan.org/address/0x81C9A7B55A4df39A9B7B5F781ec0e53539694873">0x81C9A7B55A4df39A9B7B5F781ec0e53539694873</a></td></tr><tr><td>MarketUSDC</td><td align="center"><a href="https://basescan.org/address/0x61EDAcB54aA8a689013682529df8914C87692E4b">0x61EDAcB54aA8a689013682529df8914C87692E4b</a></td><td align="center"><a href="https://basescan.org/address/0xB4B6d4E969001dccc6bF50c4f4bd394fb4Ed0b77">0xB4B6d4E969001dccc6bF50c4f4bd394fb4Ed0b77</a></td></tr><tr><td>MarketWETH</td><td align="center"><a href="https://basescan.org/address/0x52eE5238e5676598551c8d2bBcCB62c72FC3A0c4">0x52eE5238e5676598551c8d2bBcCB62c72FC3A0c4</a></td><td align="center"><a href="https://basescan.org/address/0x03859FA7549449a7DDe7663e5C06A38C5b0d4489">0x03859FA7549449a7DDe7663e5C06A38C5b0d4489</a></td></tr><tr><td>MarketcbBTC</td><td align="center"><a href="https://basescan.org/address/0x8C2F35c8076bCb5D4b696bAE11AcA0ac0Dd873e4">0x8C2F35c8076bCb5D4b696bAE11AcA0ac0Dd873e4</a></td><td align="center"><a href="https://basescan.org/address/0x50b8186FE470E125b3A7C3F3D6b0f7Fa7310873A">0x50b8186FE470E125b3A7C3F3D6b0f7Fa7310873A</a></td></tr><tr><td>MarketcbXRP</td><td align="center"><a href="https://basescan.org/address/0x1Dcf89Dfa88363ef33d49dD591b1eE5e84DD0F75">0x1Dcf89Dfa88363ef33d49dD591b1eE5e84DD0F75</a></td><td align="center"><a href="https://basescan.org/address/0xBd1ba78A3976cAB420A9203E6ef14D18C2B2E031">0xBd1ba78A3976cAB420A9203E6ef14D18C2B2E031</a></td></tr><tr><td>TimelockController</td><td align="center"><a href="https://basescan.org/address/0x92024C4bDa9DA602b711B9AbB610d072018eb58b">0x92024C4bDa9DA602b711B9AbB610d072018eb58b</a></td><td align="center">Doesn't apply.</td></tr></tbody></table>

## OP Mainnet

<table><thead><tr><th width="274.3333333333333">Contract</th><th width="237" align="center">Address</th><th align="center">Implementation</th></tr></thead><tbody><tr><td>Auditor</td><td align="center"><a href="https://optimistic.etherscan.io/address/0xaEb62e6F27BC103702E7BC879AE98bceA56f027E">0xaEb62e6F27BC103702E7BC879AE98bceA56f027E</a></td><td align="center"><a href="https://optimistic.etherscan.io/address/0x3f55a319d2fd003F87a96C1c3484121936243c46">0x3f55a319d2fd003F87a96C1c3484121936243c46</a></td></tr><tr><td>DebtManager</td><td align="center"><a href="https://optimistic.etherscan.io/address/0x057e3EfCA6f9E7094584B176f3E69a4f4B594D04">0x057e3EfCA6f9E7094584B176f3E69a4f4B594D04</a></td><td align="center"><a href="https://optimistic.etherscan.io/address/0xd759479b3a07fAB64Edb668d702293079E8c1bC1">0xd759479b3a07fAB64Edb668d702293079E8c1bC1</a></td></tr><tr><td>EscrowedEXA</td><td align="center"><a href="https://optimistic.etherscan.io/address/0xbea586A167853ADddEF12818f264f1F9823fBc18">0xbea586A167853ADddEF12818f264f1F9823fBc18</a></td><td align="center"><a href="https://optimistic.etherscan.io/address/0x2d550e003fde3e3114b1bbd03a25f2498c51e280">0x2d550E003fdE3E3114b1bbd03A25F2498C51E280</a></td></tr><tr><td>InterestRateModelOP</td><td align="center"><a href="https://optimistic.etherscan.io/address/0x1a4fc2a7a5f17dc0806d1f324b2bc76c9d142d4d">0x1a4FC2a7a5F17Dc0806d1F324B2bc76C9d142d4D</a></td><td align="center">Doesn't apply.</td></tr><tr><td>InterestRateModelUSDC</td><td align="center"><a href="https://optimistic.etherscan.io/address/0x3fdf2b9474c6C01cCFE7ab2c44855a6EE008BCDa">0x3fdf2b9474c6C01cCFE7ab2c44855a6EE008BCDa</a></td><td align="center">Doesn't apply.</td></tr><tr><td>InterestRateModelUSDC.e</td><td align="center"><a href="https://optimistic.etherscan.io/address/0x6ccec84e6e3879c6430745ea3d40c968c75e96b2">0x6CCeC84e6E3879C6430745Ea3d40c968C75E96b2</a></td><td align="center">Doesn't apply.</td></tr><tr><td>InterestRateModelWBTC</td><td align="center"><a href="https://optimistic.etherscan.io/address/0xe8cf7c80518cb3b6e4b5eb6d45cf13e7038aa018">0xe8cf7c80518cb3b6e4b5eb6d45cf13e7038aa018</a></td><td align="center">Doesn't apply.</td></tr><tr><td>InterestRateModelWETH</td><td align="center"><a href="https://optimistic.etherscan.io/address/0x8130c8b5625dd68b5c7eead3a4cae2921dff09ed">0x8130c8b5625dd68b5C7EEAD3A4cae2921dFf09ed</a></td><td align="center">Doesn't apply.</td></tr><tr><td>InterestRateModelWstETH</td><td align="center"><a href="https://optimistic.etherscan.io/address/0xCc54dE39c45000B01074E4970ca0af9d3EB2bA01">0xCc54dE39c45000B01074E4970ca0af9d3EB2bA01</a></td><td align="center">Doesn't apply.</td></tr><tr><td>MarketETHRouter</td><td align="center"><a href="https://optimistic.etherscan.io/address/0x29bAbFF3eBA7B517a75109EA8fd6D1eAb4A10258">0x29bAbFF3eBA7B517a75109EA8fd6D1eAb4A10258</a></td><td align="center"><a href="https://optimistic.etherscan.io/address/0x884988E0BFb0d6A18f664329aCD0402b2FB6056C">0x884988E0BFb0d6A18f664329aCD0402b2FB6056C</a></td></tr><tr><td>MarketOP</td><td align="center"><a href="https://optimistic.etherscan.io/address/0xa430A427bd00210506589906a71B54d6C256CEdb">0xa430A427bd00210506589906a71B54d6C256CEdb</a></td><td align="center"><a href="https://optimistic.etherscan.io/address/0x448DDdb964de96b5Ad183777f5E420384E4d120c">0x448DDdb964de96b5Ad183777f5E420384E4d120c</a></td></tr><tr><td>MarketUSDC</td><td align="center"><a href="https://optimistic.etherscan.io/address/0x6926B434CCe9b5b7966aE1BfEef6D0A7DCF3A8bb">0x6926B434CCe9b5b7966aE1BfEef6D0A7DCF3A8bb</a></td><td align="center"><a href="https://optimistic.etherscan.io/address/0x87581E1540aE45056C0ed59530c783a6e0A9C53e">0x87581E1540aE45056C0ed59530c783a6e0A9C53e</a></td></tr><tr><td>MarketUSDC.e</td><td align="center"><a href="https://optimistic.etherscan.io/address/0x81C9A7B55A4df39A9B7B5F781ec0e53539694873">0x81C9A7B55A4df39A9B7B5F781ec0e53539694873</a></td><td align="center"><a href="https://optimistic.etherscan.io/address/0x6fC143C9e6b9DCBc4023cc1f7D87eedb419f8024">0x6fC143C9e6b9DCBc4023cc1f7D87eedb419f8024</a></td></tr><tr><td>MarketWBTC</td><td align="center"><a href="https://optimistic.etherscan.io/address/0x6f748FD65d7c71949BA6641B3248C4C191F3b322">0x6f748FD65d7c71949BA6641B3248C4C191F3b322</a></td><td align="center"><a href="https://optimistic.etherscan.io/address/0x225561CFA7Ff5a44756Ca184C3554882667809D9">0x225561CFA7Ff5a44756Ca184C3554882667809D9</a></td></tr><tr><td>MarketWETH</td><td align="center"><a href="https://optimistic.etherscan.io/address/0xc4d4500326981eacD020e20A81b1c479c161c7EF">0xc4d4500326981eacD020e20A81b1c479c161c7EF</a></td><td align="center"><a href="https://optimistic.etherscan.io/address/0xb4610b34cA99fA8C48844faA667fAE1686a4A2aA">0xb4610b34cA99fA8C48844faA667fAE1686a4A2aA</a></td></tr><tr><td>MarketwstETH</td><td align="center"><a href="https://optimistic.etherscan.io/address/0x22ab31Cd55130435b5efBf9224b6a9d5EC36533F">0x22ab31Cd55130435b5efBf9224b6a9d5EC36533F</a></td><td align="center"><a href="https://optimistic.etherscan.io/address/0x8b60497274fF470786a0b5636379aAD8580C1b96">0x8b60497274fF470786a0b5636379aAD8580C1b96</a></td></tr><tr><td>RewardsController</td><td align="center"><a href="https://optimistic.etherscan.io/address/0xBd1ba78A3976cAB420A9203E6ef14D18C2B2E031">0xBd1ba78A3976cAB420A9203E6ef14D18C2B2E031</a></td><td align="center"><a href="https://optimistic.etherscan.io/address/0x0B9d4AB484F95090074008aE59db1fAb6606Bc7A">0x0B9d4AB484F95090074008aE59db1fAb6606Bc7A</a></td></tr><tr><td>TimelockController</td><td align="center"><a href="https://optimistic.etherscan.io/address/0x92024C4bDa9DA602b711B9AbB610d072018eb58b">0x92024C4bDa9DA602b711B9AbB610d072018eb58b</a></td><td align="center">Doesn't apply.</td></tr><tr><td>Staking Contract</td><td align="center"><a href="https://optimistic.etherscan.io/address/0xCEed2bFE740F02dB6094eBE89FF93b1031be752b">0xCEed2bFE740F02dB6094eBE89FF93b1031be752b</a></td><td align="center">Doesn't apply.y.</td></tr></tbody></table>

## Ethereum Mainnet

| Contract                |                                                              Address                                                             |                                                     Implementation                                                    |
| ----------------------- | :------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------: |
| Auditor                 |       [0x310A2694521f75C7B2b64b5937C16CE65C3EFE01](https://etherscan.io/address/0x310A2694521f75C7B2b64b5937C16CE65C3EFE01)      | [0xaEb62e6F27BC103702E7BC879AE98bceA56f027E](https://etherscan.io/address/0xaEb62e6F27BC103702E7BC879AE98bceA56f027E) |
| DebtManager             |       [0xF880bB912B652A594AbAC1a9D79c968754D09Ac0](https://etherscan.io/address/0xF880bB912B652A594AbAC1a9D79c968754D09Ac0)      | [0xe94E0068Ea2b8Ed9490d29Bb534D1BA996412567](https://etherscan.io/address/0xe94E0068Ea2b8Ed9490d29Bb534D1BA996412567) |
| InterestRateModelDAI    |       [0x1586C0aEa22B2A7A943d7af5A097BDab3f809409](https://etherscan.io/address/0x1586C0aEa22B2A7A943d7af5A097BDab3f809409)      |                                                     Doesn't apply.                                                    |
| InterestRateModelUSDC   |       [0xe296e3Ae5E1dB00F1b9710E6aD885215873CeE83](https://etherscan.io/address/0xe296e3Ae5E1dB00F1b9710E6aD885215873CeE83)      |                                                     Doesn't apply.                                                    |
| InterestRateModelWBTC   | [0xf05385BC0b38E941f65D3031e1695bfBF8d60c90](https://optimistic.etherscan.io/address/0xf05385BC0b38E941f65D3031e1695bfBF8d60c90) |                                                     Doesn't apply.                                                    |
| InterestRateModelWETH   |       [0x3fd0A9afAE344000c53e5862B350a17775b39aFC](https://etherscan.io/address/0x3fd0A9afAE344000c53e5862B350a17775b39aFC)      |                                                     Doesn't apply.                                                    |
| InterestRateModelWstETH |       [0x9C36Ff0412Ab4C03606eb1fefB8CaC177B1577c6](https://etherscan.io/address/0x9C36Ff0412Ab4C03606eb1fefB8CaC177B1577c6)      |                                                     Doesn't apply.                                                    |
| MarketDAI               |       [0x163538E22F4d38c1eb21B79939f3d2ee274198Ff](https://etherscan.io/address/0x163538E22F4d38c1eb21B79939f3d2ee274198Ff)      | [0x3c6bd2FFB9cb007E469CDD7b08D79102b5AE2B54](https://etherscan.io/address/0x3c6bd2FFB9cb007E469CDD7b08D79102b5AE2B54) |
| MarketETHRouter         |       [0x29bAbFF3eBA7B517a75109EA8fd6D1eAb4A10258](https://etherscan.io/address/0x29bAbFF3eBA7B517a75109EA8fd6D1eAb4A10258)      | [0x884988E0BFb0d6A18f664329aCD0402b2FB6056C](https://etherscan.io/address/0x884988E0BFb0d6A18f664329aCD0402b2FB6056C) |
| MarketUSDC              |       [0x660e2fC185a9fFE722aF253329CEaAD4C9F6F928](https://etherscan.io/address/0x660e2fC185a9fFE722aF253329CEaAD4C9F6F928)      | [0xA6b60fb117809b05263c126691c707FB19713825](https://etherscan.io/address/0xA6b60fb117809b05263c126691c707FB19713825) |
| MarketWBTC              |       [0x8644c0FDED361D1920e068bA4B09996e26729435](https://etherscan.io/address/0x8644c0FDED361D1920e068bA4B09996e26729435)      | [0xf972F71332af1B7967AD21921b8Ef4DE84C94E72](https://etherscan.io/address/0xf972F71332af1B7967AD21921b8Ef4DE84C94E72) |
| MarketWETH              |       [0xc4d4500326981eacD020e20A81b1c479c161c7EF](https://etherscan.io/address/0xc4d4500326981eacD020e20A81b1c479c161c7EF)      | [0x86f6D8b717D49527Db3126F31Bdd3B0047694bf9](https://etherscan.io/address/0x86f6D8b717D49527Db3126F31Bdd3B0047694bf9) |
| MarketWstETH            |       [0x3843c41DA1d7909C86faD51c47B9A97Cf62a29e1](https://etherscan.io/address/0x3843c41DA1d7909C86faD51c47B9A97Cf62a29e1)      | [0x810221FC9eC7d0EE775983aDe221D302e4ad9392](https://etherscan.io/address/0x810221FC9eC7d0EE775983aDe221D302e4ad9392) |
| TimelockController      |       [0x92024C4bDa9DA602b711B9AbB610d072018eb58b](https://etherscan.io/address/0x92024C4bDa9DA602b711B9AbB610d072018eb58b)      |                                                     Doesn't apply.                                                    |

## Goerli Testnet

| Contract                |                                                            Address                                                           |                                                        Implementation                                                        |
| ----------------------- | :--------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: |
| Auditor                 | [0xB957a4Aa46F859b14C745b8356c28B8361319fAB](https://goerli.etherscan.io/address/0xB957a4Aa46F859b14C745b8356c28B8361319fAB) | [0x734e2Abad752193b5CD9bC3894dda4e4A9dC6116](https://goerli.etherscan.io/address/0x734e2Abad752193b5CD9bC3894dda4e4A9dC6116) |
| DebtManager             | [0xA5DF45A240eebE3745062c616688a2AafA6a55DA](https://goerli.etherscan.io/address/0xA5DF45A240eebE3745062c616688a2AafA6a55DA) | [0x179c07E1bC481b221C1fe9Cb9E0aF5918e8e592e](https://goerli.etherscan.io/address/0x179c07E1bC481b221C1fe9Cb9E0aF5918e8e592e) |
| InterestRateModelDAI    | [0x3a2807D02a49b122927a34424A8abA5df0b7C7D6](https://goerli.etherscan.io/address/0x3a2807D02a49b122927a34424A8abA5df0b7C7D6) |                                                        Doesn't apply.                                                        |
| InterestRateModelUSDC   | [0x979f31Bd9c0e7E8178C7328672Fd5Dbc03E9886f](https://goerli.etherscan.io/address/0x979f31Bd9c0e7E8178C7328672Fd5Dbc03E9886f) |                                                        Doesn't apply.                                                        |
| InterestRateModelWBTC   | [0x54B3f1D30a79636aa77a656d30BFe441F2634c38](https://goerli.etherscan.io/address/0x54B3f1D30a79636aa77a656d30BFe441F2634c38) |                                                        Doesn't apply.                                                        |
| InterestRateModelWETH   | [0xcc3f41204a1324DD91F1Dbfc46208535293A371e](https://goerli.etherscan.io/address/0xcc3f41204a1324DD91F1Dbfc46208535293A371e) |                                                        Doesn't apply.                                                        |
| InterestRateModelWstETH | [0x2a8740e29ff6Ce3B4c0745382be5bEdBCe12e78b](https://goerli.etherscan.io/address/0x2a8740e29ff6Ce3B4c0745382be5bEdBCe12e78b) |                                                        Doesn't apply.                                                        |
| MarketDAI               | [0xCf830a26cb28e499d5e7346eB668821933ECB452](https://goerli.etherscan.io/address/0xCf830a26cb28e499d5e7346eB668821933ECB452) | [0x4A8C77802753d6715dFa8568E3498BC0BC3C3bB9](https://goerli.etherscan.io/address/0x4A8C77802753d6715dFa8568E3498BC0BC3C3bB9) |
| MarketETHRouter         | [0x4D897583eA1f121826569059681a04e490A9680D](https://goerli.etherscan.io/address/0x4D897583eA1f121826569059681a04e490A9680D) | [0xd588E11B7089300fBF08B4222B906eD53C199976](https://goerli.etherscan.io/address/0xd588E11B7089300fBF08B4222B906eD53C199976) |
| MarketUSDC              | [0x22BA6B356303aD14B3da2E1E268dAdCb07352C43](https://goerli.etherscan.io/address/0x22BA6B356303aD14B3da2E1E268dAdCb07352C43) | [0xb5fA37E4fdebCeBae31A68cD673201a2C1E32C6C](https://goerli.etherscan.io/address/0xb5fA37E4fdebCeBae31A68cD673201a2C1E32C6C) |
| MarketWBTC              | [0x2056256190ED2F7E72F54CAD73fdB37610974dE0](https://goerli.etherscan.io/address/0x2056256190ED2F7E72F54CAD73fdB37610974dE0) | [0xd6E103A328B78514c1c76ecE2cc922bf80794d4C](https://goerli.etherscan.io/address/0xd6E103A328B78514c1c76ecE2cc922bf80794d4C) |
| MarketWETH              | [0x72795c6f67783BB35c23164a0b54f9dE0f46C2dA](https://goerli.etherscan.io/address/0x72795c6f67783BB35c23164a0b54f9dE0f46C2dA) | [0x7A722eeE3c4e3D5156090D10017C7Ce9a77c160e](https://goerli.etherscan.io/address/0x7A722eeE3c4e3D5156090D10017C7Ce9a77c160e) |
| MarketWstETH            | [0x0D337f4D28AbD8f542eD1cF0d5d45e32db3E95C1](https://goerli.etherscan.io/address/0x0D337f4D28AbD8f542eD1cF0d5d45e32db3E95C1) | [0x04bA04737c435D9c2b8d93EeF579b42201a735d3](https://goerli.etherscan.io/address/0x04bA04737c435D9c2b8d93EeF579b42201a735d3) |
| RewardsController       | [0xAad51EaEa66CAD89d2D2A2e9389cb1BA919B347E](https://goerli.etherscan.io/address/0xAad51EaEa66CAD89d2D2A2e9389cb1BA919B347E) | [0x2dB2D7b015D97Ca600FC70b28D8Dc8D20Cc31CC0](https://goerli.etherscan.io/address/0x2dB2D7b015D97Ca600FC70b28D8Dc8D20Cc31CC0) |
| TimelockController      | [0xAefCdbd18eabe4d6BD769d6aD649A18A9b9Ec60e](https://goerli.etherscan.io/address/0xAefCdbd18eabe4d6BD769d6aD649A18A9b9Ec60e) |                                                        Doesn't apply.                                                        |


# The Graph

Exactly Protocol uses [The Graph Decentralized Network](https://thegraph.com/docs/en/network/overview/) on Mainnet and [The Graph Hosted Service](https://thegraph.com/docs/en/deploying/hosted-service/) on Optimism to index and query data on the blockchain more efficiently and accurately.

Our GitHub repo: <https://github.com/exactly/subgraph>

## The Graph Protocol

[The Graph](https://thegraph.com/en/) is an **indexing protocol** that makes it easier to query networks like Ethereum and Optimism. With The Graph, anyone can build and publish open-source APIs, known as **subgraphs**, which organize blockchain data to make it more easily accessible.

The Graph is powered by a decentralized, global network of thousands of participants. These participants worldwide take on the roles of [Indexers](https://thegraph.com/docs/en/network/indexing/), [Delegators](https://thegraph.com/docs/en/network/delegating/), [Curators](https://thegraph.com/docs/en/network/curating/), and [Developers](https://thegraph.com/docs/en/network/developing/).

## Subgraphs

When any decentralized application (dapp) adds data to the blockchain, the smart contract emits one or more events while processing the transaction. Indexers on The Graph Network index subgraphs that track the events emitted by the smart contract and organize them neatly, enabling dapps to access and rapidly display only the information relevant to their users.

Subgraphs identify smart contracts, the events in those contracts to pay attention to, and how to map event data to the data that will be indexed via The Graph’s decentralized network.

At Exactly Protocol, our subgraph allows us to perform advanced queries and operations like aggregation, search, relationships, and non-trivial filtering. It enables us to index and return every event emitted by our smart contract on the blockchain. This includes details of all the different operations, such as borrows and deposits, as well as the Interest Rate Model that determines the protocol’s earnings and debts.

### Exactly Protocol’s Subgraphs

| Network          | Subgraphs                                                                                                                                                                                                                                  |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Ethereum Mainnet | [https://thegraph.com/explorer/subgraphs/As6Xz6GCvbW8B9Xb7Rx2LqQeJcL3FcUyD8Tk95L8rG5d?view=Overview\&chain=mainnet ](<https://thegraph.com/explorer/subgraphs/As6Xz6GCvbW8B9Xb7Rx2LqQeJcL3FcUyD8Tk95L8rG5d?view=Overview\&chain=mainnet >) |
| Optimism         | <https://thegraph.com/explorer/subgraphs/9jpa2F3ZuirB11m3GL36wcNoNGETd3Z2zf7Cre5iwyeC?view=Query&chain=arbitrum-one>                                                                                                                       |
|                  |                                                                                                                                                                                                                                            |

<div align="right"><figure><img src="/files/r6O4pMLp7l8Y3Avjtts2" alt=""><figcaption></figcaption></figure></div>

\
\
\ <br>


# Chainlink Price Feeds

Exactly Protocol uses [Chainlink's data feeds](https://docs.chain.link/docs/using-chainlink-reference-contracts/) to get reliable, up-to-date, and secure asset prices to calculate users' lending power and [health factor](https://docs.exact.ly/guides/liquidations#health-factor).

## Base Mainnet

<table><thead><tr><th>Asset</th><th>Price Feed</th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td>cbBTC</td><td><a href="https://basescan.org/address/0x07da0e54543a844a80abe69c8a12f22b3aa59f9d">PriceFeedcbBTC</a></td><td></td><td></td></tr><tr><td>cbXRP</td><td><a href="https://basescan.org/address/0x9f0C1dD78C4CBdF5b9cf923a549A201EdC676D34">PriceFeedcbXRP</a></td><td></td><td></td></tr><tr><td>USDC</td><td><a href="https://basescan.org/address/0x7e860098F58bBFC8648a4311b374B1D669a2bc6B">PriceFeedUSDC</a></td><td></td><td></td></tr><tr><td>WETH</td><td><a href="https://basescan.org/address/0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70">PriceFeedWETH</a></td><td></td><td></td></tr></tbody></table>

## OP Mainnet

<table><thead><tr><th>Asset</th><th>Price Feed</th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td>esEXA</td><td><a href="https://optimistic.etherscan.io/address/0x5fE09baAa75fd107a8dF8565813f66b3603a13D3">PriceFeedesEXA</a></td><td></td><td></td></tr><tr><td>EXA</td><td><a href="https://optimistic.etherscan.io/address/0x5fe09baaa75fd107a8df8565813f66b3603a13d3">PriceFeedEXA</a></td><td></td><td></td></tr><tr><td>OP</td><td><a href="https://optimistic.etherscan.io/address/0x0D276FC14719f9292D5C1eA2198673d1f4269246">PriceFeedOP</a></td><td></td><td></td></tr><tr><td>USDC</td><td><a href="https://optimistic.etherscan.io/address/0x16a9fa2fda030272ce99b29cf780dfa30361e0f3">PriceFeedUSDC</a></td><td></td><td></td></tr><tr><td>WBTC</td><td><a href="https://optimistic.etherscan.io/address/0x718a5788b89454aae3a028ae9c111a29be6c2a6f">PriceFeedWBTC</a></td><td></td><td></td></tr><tr><td>WETH</td><td><a href="https://optimistic.etherscan.io/address/0x13e3Ee699D1909E989722E753853AE30b17e08c5">PriceFeedWETH</a></td><td></td><td></td></tr><tr><td>wstETH</td><td><a href="https://optimistic.etherscan.io/address/0x698b585cbc4407e2d54aa898b2600b53c68958f7">PriceFeedwstETH</a></td><td></td><td></td></tr></tbody></table>

## Ethereum Mainnet

<table><thead><tr><th>Asset</th><th>Price Feed</th><th data-hidden>Price Feed</th><th data-hidden></th></tr></thead><tbody><tr><td>DAI</td><td><a href="https://etherscan.io/address/0x773616E4d11A78F511299002da57A0a94577F1f4">PriceFeedDAI</a></td><td>PriceFeedesEXA</td><td></td></tr><tr><td>ETH</td><td><a href="https://etherscan.io/address/0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419">PriceFeedETH</a></td><td></td><td></td></tr><tr><td>USDC</td><td><a href="https://etherscan.io/address/0x986b5E1e1755e3C2440e960477f25201B0a8bbD4">PriceFeedUSDC</a></td><td></td><td></td></tr><tr><td>WBTC</td><td><a href="https://etherscan.io/address/0xB92E0A6E56d60aeD6B99c21350D9DE56cA8c648f">PriceFeedWBTC</a></td><td></td><td></td></tr><tr><td>wstETH</td><td><a href="https://etherscan.io/address/0x48304b3ab7f906ede1e9008c9b41a9528c26859f">PriceFeedwstETH</a></td><td></td><td></td></tr></tbody></table>

## Chainlink

Chainlink is the most used data provider in the industry. It provides secure pricing feeds and is the DeFi standard Oracle network with [over six trillion transactions value enabled](https://chain.link/). No liveness checks are performed while retrieving Oracle data. Chainlink offers robust and historically stable price feeds, even more on Mainnet for high-liquid assets such as WBTC, ETH, and DAI. Also, avoiding this check can lower the gas consumption of the involved transactions. The following contracts depend directly on Chainlink's price feed: [Auditor](/guides/protocol/auditor), [Price Feed Wrapper](/guides/protocol/pricefeedwrapper), and [Price Feed Double](/guides/protocol/pricefeeddouble).

## Uniswap TWAPs

Other sources, such as [Uniswap's TWAPs](https://docs.uniswap.org/protocol/concepts/V3-overview/oracle), have been considered but finally discarded.

After Ethereum's upgrade from proof of work to proof of stake, block proposers are chosen deterministically before they validate blocks. This feature creates new challenges for decentralized price oracles, like those provided by Uniswap V3, because they open up more significant potential for inter-block price manipulation, as detailed below.

Block proposers are alerted when they are selected to propose a block. This gives them a unique opportunity to carry out oracle manipulation attacks. If they are chosen to propose block *n*, they can attempt to manipulate the spot price on block *n-1*, knowing that they will be free to arbitrage their price manipulation on the next block (and censor any other attempts at arbitrage).

It is hard to estimate how many block proposers will view oracle manipulation attacks as a legitimate way to increase their income. It seems likely many will not take the risk of carrying out these kinds of attacks. However, as long as the number is non-zero, it is clear there is some reduced cost for carrying out these possible attacks.

## Price Denominations

All asset prices, including stablecoins, are accurately reflected by querying them from live, and regularly updated price feeds. This approach avoids hardcoded values, providing users with reliable and up-to-date pricing information.

On **Mainnet**, the [Auditor](/guides/protocol/auditor) obtains and uses prices to calculate accounts' collateral and debt values in **ETH** denomination. In this way, an extra call (*ETH-USD*) is saved, which translates to a reduction in gas consumption for liquidity checks.

On **Optimism**, prices are currently retrieved and used in **USD** denomination due to lower availability in price feeds offered by Chainlink.

It's important to notice that this difference is only spotted at a smart contract level and does not imply any variation in the result of the health factor calculation. The web app shows prices in **USD** denominations for a better understanding from a user's perspective.

## Deprecated Chainlink interface

Exactly's smart contracts are fetching asset prices through a [deprecated interface provided by Chainlink](https://github.com/smartcontractkit/chainlink/blob/e1e78865d4f3e609e7977777d7fb0604913b63ed/contracts/src/v0.6/EACAggregatorProxy.sol#L41-L58).

In a [previous audit by Coinspect (EXA-36)](https://github.com/exactly/audits/blob/main/Coinspect%204th%20audit%20\(Oct-22\).pdf), we already acknowledged this decision in the spirit of transparency. We assured our users that we have assessed and taken appropriate measures to mitigate the associated risks.

Our choice to continue using this deprecated interface is based on several factors. We have implemented a low minimum timelock delay (1 day) and an upgradable [Auditor](/guides/protocol/auditor), which enable us to respond swiftly if prices are not being updated accurately.

We have confidence in the robustness and historical stability of Chainlink's price feeds, particularly for highly liquid assets, the only ones enabled as [Markets](/guides/protocol/market).

It is worth noting that another difference with checking liveness is that transactions would revert in case of outdated `updateTimes` but as a downfall this may potentially hinder liquidations. We have carefully weighed the trade-offs and decided to assume the associated risks while focusing on **reducing gas costs** for our users.

We remain committed to the security and reliability of our protocol and will continue to monitor and evaluate any third-party integrations.


# Audits

## Code Audits

Exactly Protocol was audited by the following companies:

| Auditor      | Date         | Report                                                                                                                                                                                    |
| ------------ | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ABDK         | Oct 2022     | [ABDK 1st audit](https://github.com/exactly/audits/blob/main/ABDK%201st%20audit%20\(Oct-22\).pdf)                                                                                         |
| ABDK         | May 2023     | [ABDK 2nd audit](https://github.com/exactly/audits/blob/main/ABDK%202nd%20audit%20\(May-23\).pdf)                                                                                         |
| ABDK         | Sep 2023     | [ABDK PeripheralContracts 1st audit](https://github.com/exactly/audits/blob/main/ABDK%20PeripheralContracts%201st%20audit%20\(Sep-23\).pdf)                                               |
| ABDK         | Oct 2023     | [ABDK EscrowedEXA 1st audit](https://github.com/exactly/audits/blob/main/ABDK%20EscrowedEXA%20\(Sep-23\).pdf)                                                                             |
| ABDK         | Feb 2024     | [ABDK Interest Rate Model v2 1st audit](https://github.com/exactly/audits/blob/main/ABDK%20Interest%20Rate%20Model%20v2%20\(Feb-24\).pdf)                                                 |
| ABDK         | Mar 2024     | [ABDK Interest Rate Model v2 2nd audit](https://github.com/exactly/audits/blob/main/ABDK%20Interest%20Rate%20Model%20v2%20\(Mar-24\).pdf)                                                 |
| ABDK         | Apr 2024     | [ABDK Installments Router and New Market Roles 1st audit](https://github.com/exactly/audits/blob/main/ABDK%20Installments%20Router%20and%20New%20Market%20Roles%20\(Apr-24\).pdf)         |
| ABDK         | March 2025   | [ABDK Rewards Controller Update ](https://github.com/exactly/audits/blob/main/ABDK%20Rewards%20Controller%20Update%20\(Mar-25\)pdf.pdf)                                                   |
| ABDK         | October 2025 | [ABDK Exactly Protocol Update](https://github.com/exactly/audits/blob/main/ABDK%20Protocol%20Update%20\(Oct-25\).pdf)                                                                     |
| Chainsafe    | May 2022     | [Chainsafe 1st audit](https://github.com/exactly/audits/blob/main/Chainsafe%201st%20audit%20\(May-22\).pdf)                                                                               |
| Chainsafe    | Oct 2022     | [Chainsafe 2nd audit](https://github.com/exactly/audits/blob/main/Chainsafe%202nd%20audit%20\(Oct-22\).pdf)                                                                               |
| Chainsafe    | Mar 2024     | [Chainsafe Interest Rate Model v2 1st audit](https://github.com/exactly/audits/blob/main/Chainsafe%20Interest%20Rate%20Model%20v2%20\(Mar-24\).pdf)                                       |
| Chainsafe    | Aug 2024     | [Chainsafe Staking Program 1st audit](https://github.com/exactly/audits/blob/main/Chainsafe%20Staking%20Contract%20\(Aug-24\).pdf)                                                        |
| Coinspect    | Nov 2021     | [Coinspect 1st audit](https://github.com/exactly/audits/blob/main/Coinspect%201st%20audit%20\(Nov-21\).pdf)                                                                               |
| Coinspect    | May 2022     | [Coinspect 2nd audit](https://github.com/exactly/audits/blob/main/Coinspect%202nd%20audit%20\(May-22\).pdf)                                                                               |
| Coinspect    | Oct 2022     | [Coinspect 3rd audit](https://github.com/exactly/audits/blob/main/Coinspect%203rd%20audit%20\(Oct-22\).pdf)                                                                               |
| Coinspect    | Oct 2022     | [Coinspect 4th audit](https://github.com/exactly/audits/blob/main/Coinspect%204th%20audit%20\(Oct-22\).pdf)                                                                               |
| Coinspect    | Mar 2023     | [Coinspect 5th audit](https://github.com/exactly/audits/blob/main/Coinspect%205th%20audit%20\(Mar-23\).pdf)                                                                               |
| Coinspect    | Jan 2023     | [Coinspect RewardsController 1st audit](https://github.com/exactly/audits/blob/main/Coinspect%20RewardsController%201st%20audit%20\(Jan-23\).pdf)                                         |
| Coinspect    | Feb 2023     | [Coinspect RewardsController 2nd audit](https://github.com/exactly/audits/blob/main/Coinspect%20RewardsController%202nd%20audit%20\(Feb-23\).pdf)                                         |
| Coinspect    | Mar 2023     | [Coinspect RewardsController 3rd audit](https://github.com/exactly/audits/blob/main/Coinspect%20RewardsController%203rd%20audit%20\(Mar-23\).pdf)                                         |
| Cryptecon    | Sep 2022     | [Cryptecon Economics of the Exactly Protocol](https://github.com/exactly/audits/blob/main/Cryptecon_Economics_of_the_Exactly_Protocol\(Sep-22\).pdf)                                      |
| Hashlock     | March 2024   | [Hashlock Interest Rate Model v2 1st audit](https://github.com/exactly/audits/blob/main/Hashlock%20Interest%20Rate%20Model%20v2%20\(Mar-24\).pdf)                                         |
| Hashlock     | Apr 2024     | [Hashlock Installments Router and New Market Roles 1st audit](https://github.com/exactly/audits/blob/main/Hashlock%20Installments%20Router%20and%20New%20Market%20Roles%20\(Apr-24\).pdf) |
| OpenZeppelin | Oct 2023     | [EscrowedEXA 1st audit](https://github.com/exactly/audits/blob/main/OpenZeppelin%20EscrowedEXA%20\(Oct-23\).pdf)                                                                          |
| Quantstamp   | July 2024    | [Exa App WebAuthn Plugin 1st audit](https://github.com/exactly/audits/blob/main/Quantstamp%20Exa%20App%20WebAuthn%20Plugin%20\(Jul-24\).pdf)                                              |
| Quantstamp   | July 2024    | [Quantstamp Exa App WebAuthn Plugin](https://github.com/exactly/audits/blob/main/Quantstamp%20Exa%20App%20WebAuthn%20Plugin%20\(Jul-24\).pdf)                                             |
| Quantstamp   | March 2025   | [Quantstamp Exa App Plugin](https://github.com/exactly/audits/blob/main/Quantstamp%20Exa%20App%20Plugin%20\(Mar-25\).pdf)                                                                 |
| Quantstamp   | October 2025 | [Quantstamp Exa App Plugin Update](https://github.com/exactly/audits/blob/main/Quantstamp%20Exa%20App%20Plugin%20Update%20\(Oct-25\).pdf)                                                 |
| Sherlock     | Aug 2024     | [Sherlock Staking Program 1st audit](https://github.com/exactly/audits/blob/main/Sherlock%20Staking%20Contract%20\(Aug-24\).pdf)                                                          |

## Other

* [Code Coverage on Codecov](https://app.codecov.io/gh/exactly/protocol)
* [Audit Coverage on Zellic](https://app.zellic.io/coverage/exactly-protocol)
* [Defi Safety Process Quality Report](https://defisafety.com/app/pqrs/531)

## Mathematical Audit

."On September 8th, 2022 the [Center for Cryptoeconomics](https://cryptecon.org/home.html) released its audit report on Exactly Protocol titled "[Economics of the Exactly Protocol](https://github.com/exactly/audits/blob/main/Cryptecon_Economics_of_the_Exactly_Protocol\(Sep-22\).pdf)", concluding that Exactly's model is "economically plausible, mathematically correct, and theoretically feasible".

### Highlights from the auditors

* Exactly is a unique lending protocol design focusing on fixed instead of variable terms. At the cost of less flexibility, it can offer fixed rates and conceptually a lower spread than comparable projects. Thus, if lenders and borrowers demand fixed terms, Exactly's unique design is likely to become successful.
* From the audit of the technical paper, we find that the mathematical specification of the model correctly reflects the conceptual idea of Exactly's decentralized credit market protocol.
* Numerical calculations revealed that results from the model presented in the technical paper are plausible. Based on an initial calibration we find that the protocol is in principle able to produce competitive interest rates and spreads.

You can read the complete report [here](https://github.com/exactly/audits/blob/main/Cryptecon_Economics_of_the_Exactly_Protocol\(Sep-22\).pdf).


# Access Control

## Roles & Privileges

There are a few roles to be aware of in the system. Each role has a set of privileges that are associated with it.

### Admin - Timelock Controller

The `TimelockController` smart contract acts as the `administrator` role in the protocol. It implements a governance mechanism called a timelock, which delays the execution of transactions to allow for evaluation of their potential impact before proceeding. The contract has two distinct roles: the `proposer`, one who submits transactions and the `executor`, who executes them after the timelock period expires. The `executor` is a [multisig contract](https://app.safe.global/home?safe=oeth:0xC0d6Bc5d052d1e74523AD79dD5A954276c9286D3), which means it requires multiple signatures from different signers. The number of signatures required for a transaction to be executed is defined in the multisig contract, and it's currently 3 out of 6 (2 signers are team members, and 4 are respected members of the DeFi community and EXA holders), providing a secure and transparent method of controlling execution. The timelock period is 24 hours, enabling quick and flexible decision-making by the protocol's administrators.&#x20;

* Exactly Protocol Owner (Ethereum Mainnet): \
  <https://app.safe.global/home?safe=eth:0x7A65824d74B0C20730B6eE4929ABcc41Cbe843Aa>
* Exactly Protocol Owner (OP Mainnet): \
  <https://app.safe.global/home?safe=oeth:0xC0d6Bc5d052d1e74523AD79dD5A954276c9286D3>

The Protocol Owner multisig will sign new transactions on Tuesdays. \
More information here: <https://app.exact.ly/activity>

### Pauser

The pauser role is responsible for temporarily suspending certain operations in emergencies. The pausable operations are `deposit`, `borrow`, `repay` and `liquidate`. The same multisig may pause these operations to protect the system and its users in an emergency. However, the `withdraw` function will remain active, allowing users to access and withdraw their funds anytime.

### [Hypernative'a Pauser Contract](https://docs.exact.ly/security/hypernative)

## Upgradeable Contracts

The following contracts are upgradeable and can be changed by the `TimelockController`:

* [Auditor](/guides/protocol/auditor)
* [Market](/guides/protocol/market)
* [EXA](https://docs.exact.ly/guides/exactly-token-exa)<br>


# Hypernative

## Real-Time Monitoring and Automated Threat Response by Hypernative

Exactly Protocol has officially partnered with [Hypernative](https://www.hypernative.io/) to integrate real-time monitoring and automated response systems to strengthen security infrastructure. This collaboration ensures the proactive detection of threats and allows swift action to protect user assets. The integration was executed based on the directives outlined in the proposals [EXAIP-7](https://gov.exact.ly/#/proposal/0x1d9916b71607aa8ff50394318ee6892665ffb96dc7ad3e7e4df7c36e04123001) and [EXAIP-12](https://gov.exact.ly/#/proposal/0xa0dade37527b9f37340b89a2ebe5929cceba22fbff1d627301322315a22e5a7f).

#### About Hypernative

Hypernative is a real-time monitoring, risk detection, and automated response solution that accurately identifies threats and gives customers precious minutes to respond before exploits can do damage. Over 130 Web3 projects rely on Hypernative’s enterprise-grade platform that monitors over $37 billion of digital assets across more than 40 chains. The list includes Balancer, Blockdaemon, Chainalysis, Chainlink, Circle, Consensys, Ethena, Etherfi, Galaxy, Linea, Quantstamp, Solana, Starknet, and Uniswap.

### **Active Monitoring and Automated Response System**

Hypernative continuously monitors Exactly Protocol’s smart contracts and all incoming transactions. In the event of suspicious activity—such as a malicious contract interacting with Exactly Protocol—Hypernative is equipped to trigger an immediate response automatically. This response involves pausing the protocol’s critical contracts, preventing further damage, and securing user funds before the threat escalates.

We implemented a custom Pauser Contract, which enables the protocol to be paused automatically in response to any threat detected by Hypernative. This contract is a core component of the security framework and is managed by the protocol’s governance and multisig structure. Hypernative, through the Emergency Admin Role, is authorized to activate the pausing function, but it cannot resume operations, which the protocol owner strictly handles via multisig.

**The Pauser Contract:**

The Pauser Contract halts operations across Exactly Protocol’s ecosystem during an emergency. Key technical details:

* Contract Address: 0x8cC05394eD714073758E9bEf8073a83d79F6F2A3
* Functionality: The contract can pause specific protocol contracts or the entire protocol if needed. This includes halting all market activities, such as withdrawals, deposits, and transfers, ensuring total containment of the incident.

Role Structure:

* Emergency Admin Role:\
  This role, assigned to Hypernative, allows them to trigger the pausing of contracts in the event of a security threat. Hypernative has no authority to unpause, ensuring that only the multisig can restore normal operations.
* Multisig Control:\
  The multisig retains full control over the unpausing mechanism, ensuring that a deliberate review is conducted before restoring the system to normal operations.

**Granular Control via the "IsFrozen" State**

In addition to the Paused State, which stops all protocol operations, Exactly Protocol introduced a more nuanced feature called the IsFrozen State. This state allows the protocol to limit new borrows and deposits while still permitting existing users to withdraw and transfer funds. This feature provides more flexibility during periods of heightened security while maintaining a degree of user engagement and liquidity access.

The IsFrozen State ensures that the protocol can remain functional for users while limiting new exposure to risk during an ongoing incident.

For detailed technical documentation and the source code of the Pauser Contract, please visit our[ GitHub Repository](https://github.com/exactly/protocol/blob/main/contracts/periphery/Pauser.sol).


# Testing

The smart contract tests can be accessed at [Exactly's Github repository](https://github.com/exactly/protocol/tree/main/test). These tests are categorized into two types: Typescript tests utilizing [Hardhat's development environment](https://github.com/NomicFoundation/hardhat), and Solidity tests leveraging [Foundry's testing framework, Forge](https://github.com/foundry-rs/foundry/tree/master/forge).

Our team continuously updates, adds, and reviews these tests. Anyone is welcome to try them independently. To do so, clone the project, install the necessary dependencies, and execute the command `yarn test`.

In addition, Exactly employs [Forge's Fuzzer](https://book.getfoundry.sh/forge/fuzz-testing) as another tool for smart contract testing. Fuzzing is an essential testing method, as it can reveal edge cases that are difficult to identify through manual unit testing. The fuzz tests for Exactly Protocol can be found in the [Protocol.t.sol](https://github.com/exactly/protocol/blob/main/test/solidity/Protocol.t.sol) file, which also serves as the protocol's specifications.

### Coverage

Exactly's project is integrated with the [Codecov app](https://about.codecov.io/), allowing users to view real-time code coverage by visiting [Exactly's page](https://app.codecov.io/gh/exactly/protocol).


# Emergency Procedure

## TLDR: [Emergency Checklist](#emergency-checklist)

## Introduction

This document details the procedures and guidelines that should take place in the event of an emergency situation. Its purpose is to minimize the risk for loss of funds for Exactly users, Treasury, and Smart Contracts.

### Definitions and Examples of Emergencies

For the purposes of this document, an emergency situation is defined to be:

**Any situation that may lead to a considerable amount of loss of funds for Exactly users, Exactly's Treasury, or Smart Contracts deployed by Exactly.**

This is a non-exhaustive list of possible emergency scenarios:

1. Bug or exploit in Exactly code that can cause a loss of funds for users.
2. Loss of private keys for a key role.
3. Potential exploit discovered by team or bounty program researcher.
4. Active exploit or hack in progress discovered by an unknown party.

### Roles

In the event of an emergency situation, the following roles should be assigned to Exactly contributors working to resolve the situation:

* Facilitator
* Multisig Herder
* Smart Contract Lead
* Web Lead
* Ops

A contributor may be assigned up to two of these roles concurrently.

#### Facilitator

Facilitates emergency handling and ensures the process described in this document is followed, engaging with the correct stakeholders and teams in order for the necessary decisions to be made quickly. A suitable Facilitator is any person familiar with the process and is confident that they can drive the team to follow through. It's expected that the person assigned to this role has relevant experience either from having worked in real scenarios or through drill training.

#### Multisig Herder

Responsible for ensuring that different Exactly teams' multisig wallets (if existing) are able to execute transactions in a timely manner during the emergency.

Main responsibilities:

* Help clear the queue of any pending operations once the War Room starts.
* Coordinate required signers so they can respond quickly to queued transactions.
* Prepare or help with transactions in different multisigs.

#### Smart Contract Lead

Coordinates quick changes to smart contracts during the emergency, including but not limited to:

* Prepare and execute multisig transactions and operations.
* Execute Emergency Plans.

#### Web Lead

Coordinates quick changes to UI and websites as required, including but not limited to:

* Disable deposits/withdrawals through the UI.
* Display alerts and banners.
* Other UI-related work.

#### Ops

In charge of coordinating comms and operations assistance as required:

* Clear with War Room what information and communication can be published during and after the incident.
* Coordinate Communications.
* Take note of timelines and events for disclosure.

### Emergency Steps

*Also, see* [*Emergency Checklist*](#emergency-checklist) *and* [*Tools*](#tools)*.*

This acts as a guideline to follow when an incident is reported requiring immediate attention.

The primary objective is to minimize the loss of funds, in particular for Exactly's users. All decisions made should be driven by this goal.

1. Open a private chat room (War Room) with a voice channel and invite only the team members that are online that can cover the roles described above. The War Room is limited to members that act in the capacities of the designated roles, as well as additional persons that can provide critical insight into the circumstances of the issue and how it can best be resolved.
2. All the information that is gathered during the War Room should be considered private to the chat and not to be shared with third parties. Relevant data should be pinned and updated by the Facilitator for the team to have handy. The Facilitator must log all relevant data and actions in a timeline to aid in preparing press releases and post-mortems.
3. The team's first milestone is to assess the situation as quickly as possible: Confirming the reported information and determining how critical the incident is. A few questions to guide this process:
   * Is there confirmation from several team members/sources that the issue is valid? Are there example transactions that show the incident occurring? (Pin these in the War Room)
   * Is the Smart Contract Developer that knows the most about the code in the War Room? Can the Smart Contract Developer in question be reached? If not, can we reach the backup Smart Contract Developer?
   * Are funds presently at risk? Is immediate action required?
   * Is the issue isolated or does it affect several assets/series? Can the affected contracts be identified? (Pin these in the War Room)
   * Which multisig will require signing to address the issue? The Multisig Herder should begin to notify signers and clear the queue in preparation for emergency transactions.
   * If there is no immediate risk of loss of funds, does the team still need to take preventive action or some other mitigation?
   * Is there agreement in the team that the situation is under control and that the War Room can be closed?
4. Once the issue has been confirmed as valid, the next stop is to take immediate corrective action to prevent further loss of funds. If the root cause requires further research, the team must err on the side of caution and take emergency preventive actions while the situation continues to be assessed. A few questions to guide the decisions of the team:
   * Disable deposits? Should features be removed from the UI?
   * Activate Emergency Plans on the affected smart contracts?
   * Are multiple Team members able to confirm the corrective actions will stop the immediate risk through local Ganache fork testing? Smart Contract Dev main role in particular to confirm this step.
5. The immediate corrective actions should be scripted and executed ASAP. Multisig Herder and Smart Contract Lead should coordinate this execution within the corresponding roles. **NOTE: This step is meant to give the War Room time to assess and research a more long-term solution**.
6. Once corrective measures are in place and there is confirmation by multiple sources that funds are no longer at risk, the next objective is to identify the root cause. A few questions/actions during this step that can help the team make decisions:
   * What communications should be made public at this point in time?
   * Can research among members of the War Room be divided? This step can be open for team members to do live debug sessions sharing screens to help identify the problem using the sample transactions.
7. Once the cause is identified, the team can brainstorm to come up with the most suitable remediation plan and its code implementation (if required). A few questions that can help during this time:
   * In case there are many possible solutions can the team prioritize by weighing each option by time to implement and minimization of losses?
   * Can the possible solutions be tested and compared to confirm the end state fixes the issue?
   * Is there agreement in the War Room about the best solution? If not, can the objections be identified, and a path for how to reach a consensus on the approach be worked out, prioritizing the minimization of losses?
   * If a solution will take longer than a few hours, are there any further communications and preventive actions needed while the fix is developed?
   * Does the solution require a longer-term plan? Are there identified owners for the tasks/steps for the plan's execution?
8. Once a solution has been implemented, the team will confirm the solution resolves the issue and minimizes the loss of funds. Possible actions needed during this step:
   * Run simulations of the end state to confirm the proposed solution(s)
   * Coordinate signatures from multisig signers and execution.
   * Enable UI changes to normalize operations as needed.
9. Assign a lead to prepare a disclosure (should it be required), preparing a timeline of the events that took place.
10. The team agrees when the War Room can be dismantled. The Facilitator breaks down the War Room and sets reminders if it takes longer than a few hours for members to reconvene.

#### Emergency Checklist

This checklist should be complemented with the steps

* [ ] Create War Room with audio in [Discord](https://discord.com/invite/eNTyPvgA4P).
* [ ] Assign Key Roles to War Room members.
* [ ] Add Smart Contract Dev and other Experts (or their backup) to the War Room.
* [ ] Clear related multisig queues.
* [ ] Disable features as needed in the web UI.
* [ ] Confirm and identify the Issue.
* [ ] Take immediate corrective/preventive actions in order to prevent (further) loss of funds.
* [ ] Communicate the current situation internally and externally (as appropriate)
* [ ] Determine the root cause.
* [ ] Propose workable solutions.
* [ ] Implement and validate solutions.
* [ ] Prioritize solutions.
* [ ] Reach agreement in Team on the best solution.
* [ ] Execute solution.
* [ ] Confirm incident has been resolved.
* [ ] Assign ownership of the security disclosure report.
* [ ] Disband War Room.
* [ ] Conduct immediate debrief.
* [ ] Schedule a Post Mortem.

#### Tools

List of tools and alternatives in case primary tools are not available during an incident.

| Description         | Primary                                 |                                Secondary                               |
| ------------------- | --------------------------------------- | :--------------------------------------------------------------------: |
| Code Sharing        | [Github](https://github.com/exactly/)   | [HackMd](https://hackmd.io/), [CodeShare](https://codeshare.io/5Og7mj) |
| Communications\*    | [Telegram](https://t.me/exactlyFinance) |            [Discord](https://discord.com/invite/eNTyPvgA4P)            |
| Transaction Details | [Etherscan](https://etherscan.io/)      |                    [EthTxInfo](https://ethtx.info/)                    |
| Debugging           | [Tenderly](https://tenderly.co/)        |                                                                        |
| Transaction Builder |                                         |                                                                        |
| Screen Sharing\*    | [Jitsi](https://jitsi.org/)             |                 [Google Meet](https://meet.google.com/)                |

**The facilitator is responsible to ensure no unauthorized persons enter the War Room or join these tools via invite links that leak.**

### Incident Post Mortem

A Post Mortem should be conducted after an incident to gather data and feedback from War Room participants in order to produce actionable improvements for Exactly processes such as this one.

Following the dissolution of a War Room, the Facilitator should ideally conduct an immediate informal debrief to gather initial notes before they are forgotten by participants.

This can then be complemented by a more extensive Post Mortem as outlined below.

The Post Mortem should be conducted at the most a week following the incident to ensure a fresh recollection by the participants.

It is key that most of the participants of the War Room are involved during this session in order for an accurate assessment of the events that took place. Discussion is encouraged. The objective is to collect constructive feedback on how the process can be improved, **and not** to assign blame on any War Room participants.

Participants are encouraged to provide input on each of the steps. If a participant is not giving input, the Facilitator is expected to try to obtain more feedback by asking questions.

#### Post Mortem Outputs

* List of what went well.
* List of what is improved.
* List of questions that came up in the Post Mortem.
* List of insights from the process.
* Root Cause Analysis along with concrete measures required to prevent the incident from ever happening again.
* List of action items assigned to owners with estimates for completion.

#### Post Mortem Steps

1. The facilitator runs the session in a voice channel and shares a screen for participants to follow notes.
2. The facilitator runs through an agenda to obtain the necessary outputs.
3. For the Root Cause Analysis part, the Facilitator conducts an exercise to write the problem statement first and then confirm with the participants that the statement is correct and understood.
4. Root Cause Analysis can be identified with the following tools:
   * [Brainstorming](https://en.wikipedia.org/wiki/Brainstorming) session with participants
   * [5 Whys Technique](https://en.wikipedia.org/wiki/Five_whys)
5. Once Root Causes have been identified, action items can be written and assigned to willing participants that can own the tasks. It is recommended that an estimated time for completion is given. A later process can track the completion of given assignments. **Note: The action items need to be clear, actionable, and measurable for completion**
6. The Facilitator tracks the completion of action items. The end result of the process should be an actionable improvement in process. Some possible improvements:
   * Changes in the process and documentation
   * Changes in code and tests to validate
   * Changes in tools implemented and incorporated into the process

## Acknowledgments

Thanks to [Yearn Protocol](https://yearn.finance/) for providing [the base for this document](https://github.com/yieldprotocol/docs-v2/blob/main/operations/emergency_procedure.md#emergency-checklist).

[Edit this page](https://github.com/yieldprotocol/docs-v2/edit/main/operations/emergency_procedure.md)


# Bug Bounty Program

Exactly Protocol partnered with Immunefi to offer a Bug Bounty Program to incentivize security researchers to find vulnerabilities in our protocol, rewarding individuals who can identify and report security flaws.

Rewards are distributed according to the impact of the vulnerability based on the [Immunefi Vulnerability Severity Classification System V2.2](https://immunefi.com/immunefi-vulnerability-severity-classification-system-v2-2/). This is a simplified 5-level scale, with separate scales for websites/apps, smart contracts, and blockchains/DLTs, focusing on the impact of the vulnerability reported.

You can access the program at the following link: [**https://immunefi.com/bounty/exactly/**](https://immunefi.com/bounty/exactly/).


# White Paper

## Exactly Protocol

### Decentralizing the credit market, today

Authors: [Gabriel Gruber](https://github.com/GabrielGruber) and [Francisco Lepone](https://github.com/FranciscoLepone)

Version 1.4 (March 2023)

<whitepaper@exact.ly>

## 0. Abstract

In this white paper, we introduce a new decentralized, non-custodial, and open-source protocol that will provide an autonomous interest rate market to lenders and borrowers while setting interest rates based on credit supply and demand, enabling users to deposit and borrow crypto assets with both fixed and variable interest rates.

Aside from taking loans and making deposits at variable interest rates from a Variable Rate Pool, this protocol enables users to do so at fixed rates as well through the interaction with several Fixed Rate Pools, each one representing a specific maturity date. Interest rates are determined based on the credit utilization rate of each Fixed Rate Pool.

## 1. Introduction

Decentralized Finance (DeFi) is a new initiative based on blockchain technologies that aim to create a new financial system by building a network of interconnected distributed apps (or dApps) that use open-source and non-custodial protocols. Combining some of these dApps, not only can we create traditional financial instruments but also new ones that were not possible before.

Exactly’s mission is **decentralizing the credit market**, making DeFi and its numerous benefits accessible to a broader audience. At Exactly, users can make a deposit or a loan at a fixed rate for a certain period of time, which is known in the traditional financial world as "fixed income". That way, users will have an efficient means to hedge the interest rate volatility.

Some protocols approach this problem using a peer-to-peer (P2P) strategy, where lenders and borrowers are individually matched. This approach, while conceptually simple, entails several inefficiencies related to matching both amount and time in each transaction. Protocols such as AAVE take a different direction, offering a stable (not fixed) rate if the market conditions remain within a certain threshold. While this property provides greater predictability, it does not eliminate the risk and it only works for borrowers below a certain market utilization rate.

Alternatively, a series of fixed-rate protocols were launched in the year 2021. Some of them, like Yield and Notional, use a token to create a component resembling a "Zero Coupon Bond", while others like Element and Pendle use two tokens to distinguish the principal and the interest rate, much like a "Coupon Stripping" approach, to try to discover the fixed interest rate based on the price of one or more assets with a certain expiration date represented by one or more ERC-20 tokens. These types of protocols have not managed to capture enough liquidity yet, probably due to their complexity when it comes to implementing them in the Ethereum blockchain.

Furthermore, when there is a slippage in the price of these types of tokens, the interest rate to be discovered is indirectly affected, resulting in the protocols requiring their own Automated Market Makers (AMMs) implementation. This poses additional challenges since these special tokens can’t be traded on AMMs such as Uniswap. The constant product invariant formula $$x\*y=k$$ is not ideal for yield tokens, where time is an additional factor.

Liquidity is like water coming down a hill, and our goal is to remove the obstacles to make it flow fast and easily through the river. Our approach is based on finding a solution to the problem of discovering fixed interest rates, considering all the challenges that appear when bringing traditional finance to blockchain technologies while offering variable interest rate alternatives as well, thus covering the entire DeFi credit market. That is why Exactly protocol discovers the fixed interest rate directly from the supply and demand of credit that exists in each of our Fixed Rate Pools for each asset, for each maturity term.

## 2. The Exactly Protocol Architecture

The protocol completes the DeFi credit market with both variable and fixed interest rates using two types of pools per asset: the **Variable Rate Pool** and the **Fixed Rate Pool**.

### 2.1 Supplying Assets to the Variable Rate Pool

Users can supply their assets and increase the liquidity of the "Variable Rate Pool" (pools containing a single type of asset without an expiration date) that will in turn provide liquidity to all the different Fixed Rate Pools as needed. Each deposit will mint an "Exactly Voucher" (exaVoucher) that uses the [ERC-4626](/guides/protocol/market/erc-4626) standard, which will be provided to the user as a voucher for the deposited amount. These exaVouchers will periodically accrue variable earnings by increasing their value at the time of withdrawing and exchanging back for the underlying assets. Even though the main goal is to solve the problem of fragmented liquidity across different Fixed Rate Pools, it is also noteworthy that the exaVoucher extends on the ERC-20 standard, meaning that it can be exchangeable, adding composability across other protocols.

Therefore, exaVoucher holders have the capability of redeeming and receiving their original assets plus their interests at any time, subject to available liquidity in the Variable Rate Pool.

The main purpose of a Variable Rate Pool is to provide immediate liquidity to any Fixed Rate Pool, to ensure it can still satisfy the demand for new loans when deposits are not enough to cover the requested amounts. Once a new deposit is made in a Fixed Rate Pool it will automatically replace Variable Rate Pool’s original funding, which in turn "leaves" retaining a small fraction of the interest fees as earnings for providing early liquidity in the first place. There is one Variable Rate Pool and many Fixed Rate Pools for each of the assets allowed in the protocol.

The liquidity of the Variable Rate Pool is being continuously used to match the demand for new loans in exchange for a small fee, so they can be reused in future loans. Naturally, rotation speed in fee collection is a key factor that serves as the foundation for the interest rate liquidity providers in the Variable Rate Pool will receive in the future: the faster the rotation, the higher their pick up rate. The Variable Rate Pool will also receive interest rate fees from users that borrowed assets at a variable rate.

Exactly protocol does not guarantee liquidity for withdrawals in any pool, but relies on its interest rate model to incentivize it. The protocol will also have a **Liquidity Reserve Requirement** as a fraction of the Variable Rate Pool deposits that cannot be borrowed and will only be available for withdrawals in the Variable Rate Pool.

### 2.2 Supplying Assets to the Fixed Rate Pools

Users can supply their assets to different "Fixed Rate Pools" (pools with a maturity date containing a single type of asset) depending on their term horizon preference. Each new deposit generates an increase in the liquidity for that specific Fixed Rate Pool, reducing its utilization rate and its fixed interest rate for new loans as a consequence.

The protocol also offers Flexible Fixed Rate Deposits: users are able to make a partial or total withdrawal of their deposit before maturity if there is enough available liquidity in that specific Fixed Rate Pool or in the Variable Rate Pool. Withdrawing a deposit before maturity will be comparable to making a loan request on the same Fixed Rate Pool (same asset and maturity) according to the interest rates prevailing at the time of withdrawal. This may result in getting back the original deposit with a discounted penalty depending on the market conditions at the time of the transaction.

### 2.3 Borrowing Assets from the Variable Rate Pool

exaVouchers can be used as collateral for a variable interest rate loan taken from the Variable Rate Pool. Each asset supported in our protocol has its own **Risk-Adjust Factor**, which represents the proportion of the asset value to be used as collateral. For example, if a user supplies 100 ETH as collateral, and the Risk-Adjust Factor for ETH is 50%, then that user can borrow a maximum of 50 ETH worth of any other asset in any Variable Rate Pool.

### 2.4 Borrowing Assets from the Fixed Rate Pools

exaVouchers can be used as the collateral for a fixed rate loan in any of the Fixed Rate Pools. Once the user defines the amount, asset, and maturity date, they will get the specific fixed interest rate to be paid for that loan at maturity.

The protocol also offers Flexible Fixed Rate Loans the user will be able to repay earlier or after the maturity date (with an extra penalty fee in the latest case). If an early repayment is made, the user might be able to repay less of the expected amount depending on the market conditions at the time of the transaction.

![Variable and Fixed Rate Pools](https://lh6.googleusercontent.com/ZyJV5sTjoxZA0TX53EbaR4bgvenFsUdfR7EKu9zoB4iBQeDjhE8ix_1JC3NaG1HWMlJc6eQzfx0QhjPKtqduVGf44I7GBoZOR-EkhcpfJPQ1SeoikSPV6OKwal-_w_sh_9Ua-8LMeP637yd50EZ3xmg)

### 2.5 Liquidations

If the user’s Health Factor is below 1, meaning that his outstanding borrowing exceeds the sum of all his exaVouchers multiplied by each Risk-Adjust Factor, a portion of the outstanding borrowing may be repaid by any third party in exchange for the user’s proportional exaVouchers collateral at a discount price. Additionally, a small fee will be received by the Variable Rate Pool as compensation for absorbing "bad debt" residuals after all the proportional collateral is liquidated.

Any user may invoke the liquidation function in a permissionless way. In order to return the borrower’s account to solvency as fast as possible, and involving as few liquidations as possible, the protocol has a **Dynamic Close Factor** (based on the user’s degree of insolvency) that is the proportion of outstanding borrows that must be repaid in order to return a user to a solvency situation.

## 3. The Exactly Interest Rate Model

Besides an interest rate function for the Variable Rate Pool, the Exactly protocol has a demand curve for interest rates that is based on the Utilization Rate of each Fixed Rate Pool. Increasing and decreasing the interest rate incentivizes lenders to provide additional liquidity and borrowers to request more credit, ​​respectively. Thus, this mechanism favors the convergence towards an equilibrium between supply and demand. Since each of the assets are a certain number of maturities, by observing the interest rate term structure users can determine which pools are most interesting to participate in.

Exactly adopts for lending rates a continuous and differentiable function of the Utilization Rate. The function was designed to diverge asymptotically for a certain boundary value of utilization so that it acts as a natural barrier for credit demand as the level of utilization depletes the protocol liquidity capabilities. The curve can be easily parametrized to adjust it to changing market conditions. In principle, there will be a demand function for each asset and each maturity.

Conceptually, the function was designed in such a way that it naturally divides the utilization domain into three well-differentiated regions. The first region (I) of normal rates is called the "normal regime" where the utilization levels are well below the available liquidity; a second region (II) is called the "leveraged regime" where interest rates increase as utilization levels start to exhaust the available resources; and a third region (III) called "unreachable-regime" where rate levels are even higher, eventually diverging, and where it is not possible to take credits.

![Interest rate function curve](https://lh6.googleusercontent.com/EFCQHnok7Cv0hc3GwCV5GHEUDlBu_fehGEKDJpchqxCqAZWomWOwLfHc1uPcjiZ6jdrYyjoh4RSaeNQkLM1YUNp1CmIruAFwHjxYiX2Pcfen8Fd-v7znIL9iZu_unTC8ifllr2Dilk5NMbtc8ZaJBkg)

### 3.1 Borrow Interest Rate in Fixed Rate Pools

The borrow interest rate for each Fixed Rate Pool is a rational function that aims to incentivize liquidity on each of the Fixed Rate Pools but doesn’t guarantee it. The function takes the following form:

$$
\begin{align\*} R(U) = \frac{A}{(U\_{max} - U)} + B \end{align\*}
$$

Where $$U$$ is the Utilization Rate and $$A$$, $$B$$ and $$U\_{max}$$ are parameters whose values are obtained either from calibration against relevant market data or defined by the Risk Management Committee multisig (see section 4, "Governance").

The Utilization Rate in each of the Fixed Rate Pools at any time $$t$$ is defined as:

$$
\begin{align\*} U\_{FR,i}^{t} = \frac{TB\_{FR,i}^t}{TD\_{FR,i}^t + \frac{⟨SS^t⟩}{\tau\_{FR}}} \end{align\*}
$$

Where $$TB\_{FR,i}^{t}$$ is the total amount of outstanding borrows at time $$t$$ in the Fixed Rate Pool, $$TD\_{FR,i}^{t}$$ is the total outstanding deposits, $$⟨SS^t⟩$$ is a moving average of the total supply in the Variable Rate Pool for this particular asset and $$\tau\_{FR}$$ is a customizable parameter that regulates the fraction of liquidity from the Variable Rate Pool that is a priori assigned to each Fixed Rate Pool.

One of the main differences between present money market protocols and Exactly’s approach to fixed interest rates is that each user receives or pays a fixed rate on maturity when they transact on our platform. Therefore, the choice of the appropriate Utilization Rate becomes so important.

In existing variable rate frameworks, fixing the initial rate based on the state of liquidity before the transaction is made is not a concern because rates will be adjusted in the next transaction. Under a fixed rate environment, this approach might promote users to take advantage and capture all the liquidity available at a current low rate. Using an ex-post Utilization Rate to fix the interest rate does not solve the problem since we would be overcharging costs to users. The most appropriate approach to solve this problem is making investors indifferent to the decision of getting a loan for the total desired amount or splitting it into successive smaller loans. To do that, the protocol will need to determine the effective interest rate that satisfies the condition, i.e.:

$$
\begin{align\*} ⟨R⟩*{FR,i}^{t*{k+1}} = \frac{\int\_{U\_{FR,i}^{t\_k}}^{U\_{FR,i}^{t\_{k+1}}} R(u) du}{({U\_{FR,i}^{t\_{k+1}}} - {U\_{FR,i}^{t\_k}})} \end{align\*}
$$

![Effective interest borrow rate](https://lh6.googleusercontent.com/M8KyNtB5_2A7U8selT0CM2JWi5wnIiaXfaPlqN0NS6VgqFh471LrD2useUVhgPNzkP1efjwV8L7Zvbwb4SsIAGnqlrrldBPac0S-y-CZ4vjd1ksOxmHC-aMVH7Ms7JVt76RlXWoLtfFP4gRdjfIYG4k)

### 3.2 Borrow Interest Rate in the Variable Rate Pool

Users can also take loans at variable rates in a similar way to existing money market protocols. Under the Exactly architecture, variable rate borrows take place in a special pool exclusively designed to use the Variable Rate Pool liquidity. In this pool, the only allowed operations are borrows and repayments.

In order to assure the optimal behavior of the protocol, a different definition of Utilization Rate is needed in this case. Between any two operations in the Variable Rate Pool, we define the Utilization Rate as follows:

$$
\begin{align\*} U\_{VR}^{t} = \frac{TB\_{VR}^t}{⟨SS^t⟩ / \tau\_{VR}} \end{align\*}
$$

Where $$TB\_{VR}^t$$ is the total amount of variable rate borrowed outstanding at time $$t$$, and $$\tau\_{VR}$$ is a customizable parameter that regulates the fraction of liquidity from the Variable Rate Pool that is assigned to variable rate loans.

### 3.3 Supply Interest Rate in a Fixed Rate Pool

In economics, market clearing is the process by which the supply of whatever is traded is equated to the demand so that there is no leftover supply or demand. Under the Exactly Protocol, users supplying and demanding credit have access to the same information on the blockchain, so there is no friction preventing interest rate changes thus they will always adjust up or down to ensure market clearing.

To accomplish the market clearing condition, supply interest rates are determined by the number of pending interest payments available to be distributed between the Fixed Rate Pool depositors and the Variable Rate Pool. This condition is dynamic and must hold true at any time. The exact distribution among each pool will depend on their proportional contribution to the backing of loans.

#### Example

Assume a Fixed Rate Pool with maturity at $$t=1$$. At $$t=0$$ there is a 10M lending request at a 10% interest rate (Request A). Because there is no external supply in this Fixed Rate Pool, the operation is funded by the Variable Rate Pool. At $$t=0.4$$ there is a 10M deposit made by a user in this Fixed Rate Pool.

The Variable Rate Pool will leave the Fixed Rate Pool recovering its original deposit and having earned 400k of accrued interest plus 10% of the pending interests as earnings for providing liquidity in the first place. Thus, the net interest rate to be paid to the user’s deposit in the Fixed Rate Pool at maturity is effectively 9%. At $$t=0.5$$ a new loan request of 3M (Request B) is backed again by the Variable Rate Pool at a 6% interest rate.

After that, there is a new deposit at $$t=0.7$$ that replaces the Variable Rate Pool like in the previous case, for a remaining net interest rate of 5.4% (that’s the original 6% minus 0.6% retained by the Variable Rate Pool). Finally, at $$t=0.8$$ there is a last lending request for 5M (Request C) satisfied by the Variable Rate Pool at a rate of 8%.

At $$t=1$$ all lending requests are repaid as follows:

1. 10M + 10% = 11M.Variable Rate Pool earnings: 460K, Depositor earnings: 540k
2. 3M + 6%/2 = 3.09M. Variable Rate Pool earnings: 41.4K, Depositor earnings: 48.6k
3. 5M + 8%/5 = 5.080M. Variable Rate Pool earnings: 80.0K

![Interest payments distribution until maturity in a Fixed Rate Pool](https://lh6.googleusercontent.com/7gAv-LxzScdXFHImxtg8ce5CakXNWJ9871vFOqo7tYL6ToM0B3GjyuCXVMYbiF9t211jWJTyr103-YcEr1L3Q39uj74i_r34WnEL6pJYPsTVIqNRACpNPDbktUkeqYkMe3ay6L6AaBE-AMyKepPBIA)

## 4. Governance

The protocol parameters could be updated by the Risk Management Committee multisig. The main customizable parameters are the following:

* List a new asset
* Update the interest rate model per market
* Update the Risk-Adjust Factor per asset
* Update the liquidator incentive
* Update the liquidity reserve

The multisig has a timelock in order to communicate and give time to the users using the protocol to react to any change made by the Risk Management Committee.

Exactly began with centralized governance of the protocol’s parameters in order to get product market fit and will transition to a complete decentralization over time where the Risk Management Committee multisig will be replaced by a Decentralized Autonomous Organization (DAO) and EXA tokens will be minted to the community.

## 5. Summary

With an innovative approach, the protocol allows users to lend and borrow assets at fixed and variable rates in a more efficient way through the implementation of the ERC-4626 and a new interest rate model with a continuous and differentiable (not linear) function that will set the basis for the development of a fixed income derivative market.

The Exactly value proposition:

* Simplicity: Traders can arbitrage between fixed and variable rates for various time periods and hedge the interest rate risk for their long or short positions, with or without leverage.
* Frictionless: Investors and DAOs can receive fixed and variable rates on their deposits. End-users can take fixed-interest rate loans for longer time periods with certainty.
* Efficiency: Fixed and variable interest rates live in the same protocol with a new approach towards multiple interest rate discovery through the Utilization Rate of each Fixed Rate Pool.

Being an open-source, non-custodial, and autonomous interest rate protocol, Exactly came into existence to decentralize the credit market and complete the DeFi ecosystem.

## 6. References

1. Uniswap (2018), <https://docs.uniswap.org>
2. Compound (2019), <https://compound.finance/docs>
3. AAVE (2020), <https://docs.aave.com>
4. Yield (2020), <https://docs.yieldprotocol.com>
5. Notional (2020), <https://docs.notional.finance>
6. Liquity (2020) <https://docs.liquity.org/>
7. Element (2021), <https://paper.element.fi>
8. Pendle (2021), <https://docs.pendle.finance>

## 7. Disclaimer

This white paper is for general information purposes only. It does not constitute investment advice or a recommendation or a solicitation to buy or sell any investment and should not be used in the evaluation of the merits of making any investment decision. It should not be relied upon for accounting, legal or tax advice, or investment recommendations. This white paper reflects the current personal opinions of the authors and is subject to change without being updated.

## Download the White Paper

<https://github.com/exactly/papers/blob/main/ExactlyWhitePaperV1.1.pdf>


# Math Paper v1

This paper describes the initial version (v1) of the model, which is currently deployed exclusively on the Ethereum Mainnet.

## Exactly Protocol: A Model to Complete the Credit Market on the Ethereum Blockchain (Version 1.0)

Authors: [Francisco Lepone](https://github.com/FranciscoLepone) and [Gabriel Gruber](https://github.com/GabrielGruber)

<math@exact.ly>

July 2022

## Abstract

A model is proposed to complete the credit market on the Ethereum blockchain. It enables users to take loans and make deposits at fixed rates for various terms through the creation of Fixed Rate Pools.

Each Fixed Rate Pool represents a specific term. Interest rates are determined based on the utilization rate of each Fixed Rate Pool.

Additionally, the protocol offers the possibility of borrowing or parking liquidity at a floating rate through the implementation of a money market instrument in a Variable Rate Pool. The funding of the protocol is materialized through time deposits and the existence of a remunerated Smart Pool in charge of providing liquidity where required.

## 1. Introduction

Decentralized Finance (DeFi) based on blockchain technologies aims to create a new financial system by building a network of interconnected distributed apps (dApps) that use open-source and non-custodial protocols. By combining some of these dApps, we can recreate traditional financial instruments and even new ones.

Currently, there is a number of efficient protocols for borrowing and lending, such as Compound$$^1$$, AAVE$$^2$$, and Euler$$^3$$ among others. All of them have in common that they work with a short rate as a reference for lending costs. Thus, they involve binding deposits and credits to a cost of variable nature.

This work is an attempt to decentralize the credit market, bringing a missing important piece into the DeFi ecosystem, the "time value of money": That is, to be able to make deposits or take loans at fixed rates for a certain period of time, allowing users to hedge interest rate volatility and to lock costs and revenues.

Some protocols approach this problem using a peer-to-peer (P2P) strategy, where lenders and borrowers are individually matched. This strategy, while being conceptually sound and simple, entails several inefficiencies related to matching both amount and time in each transaction. Protocols like AAVE take a different direction, offering a stable (not fixed) rate if the market conditions remain within a certain threshold. While this property provides greater predictability, it does not eliminate the risk and it only works for borrowers below a certain market utilization rate.

Alternatively, a series of fixed-rate protocols were launched during the year 2021. Some of them, like Yield$$^4$$ and Notional$$^5$$, use a token to create a component resembling a "Zero Coupon Bond", while others like Element$$^6$$ and Pendle$$^7$$ use two tokens to distinguish the principal and the interest rate, much like a "Coupon Stripping" approach, to try to discover the fixed interest rate based on the price of one or more assets with a certain expiration date represented by one or more ERC-20 tokens. Unfortunately, these types of protocols have not managed to capture enough liquidity yet. This might be due to their complexity when implementing them in the Ethereum blockchain.

Furthermore, when there is a slippage in the price of these types of tokens, the interest rate to be discovered is indirectly affected. Consequently, the protocols require their own AMM implementation. This poses additional challenges since these special tokens can't be traded on AMMs such as Uniswap$$^8$$. The constant product invariant formula $$x\*y=k$$ is not ideal for yield tokens, where time is an additional factor. Our goal is to devise a scheme that removes the mentioned obstacles and contributes to the growth of a complete fixed-income market in the blockchain. The protocol admits borrowing and lending at fixed interest rates for different maturities while still offering variable interest rate alternatives, thus covering the entire DeFi credit market.

## 2. Protocol Architecture

The protocol is aimed to satisfy the credit market with both variable and fixed interest rates by using two types of pools per asset: Variable Rate Pools and Fixed Rate Pools. Probably one of the biggest challenges of being able to establish an efficient (of considerable volume) fixed-term credit market on the blockchain is being able to match supply and demand simultaneously. In fact, if credit supply for a certain maturity arrives before credit demand, it is impossible to guarantee the supplier any given interest rate without putting at risk the protocol solvency. On the contrary, if credit demand arrives before credit supply, loans cannot materialize. To this respect, the role of the Variable Rate Pool is to immediately satisfy the credit demand for any maturity and stay there until there are enough deposits to match the borrowing. This is possible because any given interest rate is not promised to Variable Rate Pool liquidity contributors in advance.

## 3. Variable Rate Pool

Users can supply their assets to increase the liquidity of the Variable Rate Pool. There will be a Variable Rate Pool for each of the assets supported by the protocol. The role of the Variable Rate Pool is to provide immediate liquidity to any Fixed Rate Pool as required, ensuring that demand for new loans is satisfied. This is the mechanism Exactly protocol has to match credit supply and demand. When a new deposit is made in a certain Fixed Rate Pool, it replaces the prior contribution of the Variable Rate Pool to such pool. In turn, the Variable Rate Pool retains a small fraction of the interest fees as earnings for having provided liquidity in the first place. That way, the Variable Rate Pool liquidity is continuously reused to match the demand for new loans and afterward released in exchange for a fee, ready to be used again for future loans. The rotation speed of these dynamics plays a key role in the profitability of the Variable Rate Pool. The faster the rotation, the higher the rate at it builds up.

Furthermore, Variable Rate Pool liquidity is also available for variable rate loan funding. All the interest generated by this type of transaction is also to be collected by the Variable Rate Pool.

While the protocol does not guarantee liquidity in the pool, it relies on its interest rate model to incentivize it.

By design, the protocol sets aside a percentage of the Variable Rate Pool deposits as Liquidity Reserves. Liquidity Reserves cannot be borrowed and are only made available to meet withdrawal requests in the Variable Rate Pool.

Let $$TSS^t$$ be the total holdings in the Variable Rate Pool at any time $$t$$ and $$\eta$$ be the fraction of total holdings used as Liquidity Reserves or non-loanable holdings ($$RSS^t=\eta TSS^t$$). We define the loanable portion of the Variable Rate Pool ($$SS^t$$) as:

![math formula (1 & 2)](/files/cKaGiIwB5B5hU1F16iKm)

## 4. Fixed Rate Pool

Users can supply and/or borrow assets to/from various Fixed Rate Pools depending on their time horizon preferences. Each new deposit generates an increase in the liquidity for that specific Fixed Rate Pool, reducing its utilization rate. Conversely, each new borrow takes out liquidity and increases the utilization rate. When there is a new transaction (deposit/borrow) in a Fixed Rate Pool, interest rates are determined based on the state of the system at this moment. Nevertheless, credit demand (borrows) and supply (deposits) rates are calculated using different principles.

Any depositor in a Fixed Rate Pool, can withdraw their assets before maturity, provided there is enough liquidity available in the protocol. Similarly, any debtor can repay their debt in advance and release their collateral.

### 4.1. Borrowing Assets at Fixed Rates

At any time during the life of a Fixed Rate Pool, any investor can ask for a loan provided they have enough collateral to back up the borrow. The collateral is calculated based on the aggregated amount of assets deposited in the various Variable Rate Pools (marked as collateral) that are not already in use to guarantee previous debts.

Let us consider the $$ith$$ Fixed Rate Pool ($$FRP\_{i}$$) whose maturity operates in $$T\_{i}$$. Loans inside a pool are financed by two types of funding: deposits in the same Fixed Rate Pool (loans, $$BF\_{FR,i}$$) and contributions from the Variable Rate Pool (loans, $$BV\_{FR,i}$$). The interest rate to be applied to each loan is determined by an interest rate demand function that depends on the utilization rate on that specific Fixed Rate Pool.

#### 4.1.1. Credit Demand Interest Rate Function

Exactly protocol has a specific interest rate demand curve for each Fixed Rate Pool and each asset. Increasing or decreasing the rate incentivizes lenders to provide additional liquidity or borrowers to request more credit, respectively. Thus, this mechanism favors the convergence towards an equilibrium between the supply and demand of credit. Since for each of the assets, there is a certain number of maturities, by observing the interest rate term structure users can also determine what pools are the most interesting to participate in.

We model interest rates as a function of the utilization rate ($$U$$) of each Fixed Rate Pool for every transaction by using a single, continuous and differentiable rational function

![math formula - (3)](/files/0n2Yr9BoUjWsjjCdAGfY)

This function diverges asymptotically when $$U \rightarrow U\_{max}$$ and it acts as a natural barrier to the credit demand as the level of utilization depletes the protocol liquidity capabilities.

The curve can be easily parametrized and adjusted to changing market conditions. In principle, there will be a demand function for each asset and each maturity. Curve parameters $$A$$, $$B$$, and $$U\_{max}$$ are determined through calibration against relevant market data.

![math formula - (4 & 5)](/files/qIG7D0xmLbX86rXTJus3)

where $$U\_{b}$$ conceptually represents the utilization level at the boundary between a region of normal interest rates ($$U \leq U\_b$$) and a region of leveraged interest rates ($$U > U\_b$$).

![math formula - ( 6 & 7)](/files/io3IvYK0j2KswhbEgQuC)

The utilization rate in each Fixed Rate Pool at any time $$t$$ is defined as

![math formula - (8)](/files/cubowrmyaHom2HvOgpaH)

where $$TB\_{FR,i}^t$$ is the total amount of outstanding borrows at time $$t$$ in the Fixed Rate Pool, $$TD\_{FR,i}^t$$ is the total amount of deposits, $$⟨SS⟩^t$$ is a moving average of the total supply in the Variable Rate Pool for this asset (see 4.1.3), andFR is a configurable parameter that regulates the fraction of Variable Rate Pool total liquidity that is "naturally assigned" to each pool. In this way, and assuming no deposits are made to the Fixed Rate Pool, once all the "natural liquidity" is already borrowed ($$TB\_{FR,i}^t=⟨SS⟩^t/\tau\_{FR}$$) the utilization rate equals one ($$U\_{FR,i}^t=1$$). For practical reasons, we will also choose $$U\_b=1$$.

The utilization rate in any Fixed Rate Pool can be higher than unity, but interest rates will then rise at a faster pace beyond this value. The maximum value of allowed utilization in a given Fixed Rate Pool will be $$U\_{full}=\tau\_{FR}$$. That point is reached when all the Variable Rate Pool liquidity is being borrowed by a single Fixed Rate Pool (under the assumption that $$TD\_{FR,i}^t=0$$).

In practice, we set

![math formula - (9)](/files/5vOP9H0GWdm21St2opIq)

This choice enables a more flexible calibration of the curve (the lowest the value of $$\Lambda$$, the steepest the interest rates in the leveraged region).

The function was thought in such a way that it naturally divides the utilization domain into three well-differentiated areas (Fig. 1). The first region of normal rates (name it normal-regime) in which the utilization levels are well below total available liquidity. A second region in which interest rates increase at a faster pace (leveraged regime) as utilization levels start to exhaust available resources. And a third region (unreachable regime) where rate levels are even higher, eventually diverging and where it is not possible to take credit.

#### 4.1.2 The Effective Interest Rate for a Particular Loan

One of the differences between money market protocols and Exactly's approach to term borrowing/lending is that each user can receive/pay a fixed rate when they transact on our platform. Because of that, the choice of an appropriate utilization rate value becomes so crucial.

![Effective Interest Rate for a Particular Loan - figure 1](/files/Cbj29YRRK7KL8YCkVQXR)

When at time $$t^{k+1}$$ there is a new request for a loan of size $$B\_{FR,i}^{t\_{k+1}}$$, if confirmed, the system would evolve from a utilization state $$U\_{FR,i}^{t\_{k}}$$ to a state $$U\_{FR,i}^{t\_{k+1}}$$ according to the following rule:

![math formula - (10)](/files/93uiuSJt9OAnyyEcAe1B)

In variable rate frameworks, fixing the initial rate based on the state of utilization prior to the transaction is not a big issue because rates will rapidly accommodate the following transaction. Under a fixed rate environment, this approach might promote users to take advantage and capture all the liquidity available at current low rates. On the other hand, using an ex-post utilization to fix interest rates does not solve the problem either, as we would be overcharging costs to users. The appropriate approach to solve the problem is to make investors become indifferent to the decision of getting a loan for the total desired amount or splitting it into successive smaller loans.

To achieve that, the protocol needs to calculate the effective interest rate (2) satisfying this condition, i.e.:

![math formula - (11 & 12)](/files/jgMz5lyxXGouosYIdKBw)

![Effective interest rate in a borrow transaction](/files/7JXem6uWYqlvlgaSE1Wz)

#### 4.1.3 Time-Averaged Variable Rate Pool Supply

The direct use of the Variable Rate Pool supply quantity ($$SS^{t}$$) in the definition of utilization rate could expose the protocol to a type of manipulation attack. In fact, attackers can deposit to a market's Variable Rate Pool to lower the pool utilization rate to decrease the interest rate and then borrow at a cheaper rate. After that, the attackers can immediately withdraw from the Variable Rate Pool if there are enough assets available there. Although this potential manipulation does not hurt the protocol's solvency, it constitutes an unfair practice affecting users. To discourage this misbehavior, we introduce an exponential weighted moving average (EMA) of the supply in the utilization rate formula.

![math formula - (13)](/files/sVB91gkLT1zxX7tk6aC1)

The idea underlying the choice of $$\alpha$$ is the following: We want the system to adapt slowly when there is an increase in the supply that carries its value above its moving average (lowering interest rates) but we want the system to adapt faster when there are withdrawals that take the supply below its average value (increasing interest rates). So we set $$\alpha$$ as:

![math formula - (14)](/files/DJ45QsKe36c4GnIW9vCE)

$$\beta *{slow}$$ and $$\beta*{fast}$$ can be easily calibrated to fit a desired time decay window for each case.

### 4.2 Depositing Assets

Users can supply their assets to different Fixed Rate Pools depending on their time horizon preferences. Each new deposit generates an increase in the liquidity for that specific Fixed Rate Pool, reducing its utilization rate and the corresponding fixed interest rate for a new loan.

In economics, market clearing is the process by which the supply of whatever is traded is equated to the demand so that there is no leftover supply or demand. In the Exactly Protocol, users who are providing demand and supply of credit have access to the same information in the blockchain so there is no "friction" impending interest rate changes, thus rates will always adjust up or down to ensure market clearing.

To accomplish the market clearing condition supply interest rates are defined by the amount of interest pending payment available for distribution among Fixed Rate Pool depositors and Variable Rate Pool liquidity providers. This condition is dynamic and must hold true at all instants of time. The exact distribution among players will depend on their proportional contribution to the backing of loans.

#### 4.2.1 Supply Interest Rate

When there is a new deposit ($$D\_{FR,i}^{t\_{k}}$$) to a Fixed Rate Pool, the system determines the total amount of outstanding borrows backed by the Variable Rate Pool and calculates the interest pending payment. The deposit is used to return an equivalent amount of funds to the Variable Rate Pool and its corresponding interest pending payment is assigned to the new depositor. In fact, a fraction $$\delta$$ of those interests is retained by the Variable Rate Pool as a fee for its matching services. The new depositor thus gets a fraction $$(1-\delta )$$ of the original interests.

Assuming that at time $$t\_{k}$$ there is a set $${{BV\_{FR,i}^{t\_{n}},n=1,\ldots N,t\_{n}\<t\_{k}}}$$of borrows funded by the Variable Rate Pool ($$t\_{n}$$ is the time when the loan $$n$$ started). The total pending accruing interest on such borrows ($$PIBVP\_{FR,i}^{t\_{k}}$$) is:

![math formula - (15)](/files/hVAcJMLlLHR775vBX4Aa)

Remember that $$T\_{i}$$ denotes the maturity of the pool. The number of funds to be returned to the Variable Rate Pool will be

![math formula - (16)](/files/rWhyFq7TKrhjYYmdGHDR)

and the total interest assigned to the new depositor will be

![math formula - (17)](/files/Ak8v0RDZZYdB0wKbPGGE)

Thus, the annualized fixed interest rate on the deposit ($$RD\_{FR,i}^{k,t}$$) can be calculated as follows

![math formula - (18)](/files/zpymTv1dkTWC88OjSSN3)

### 4.3 Early Withdraw

Any depositor can withdraw their assets before maturity, provided there is enough liquidity available in the protocol. Withdrawing assets implies selling the position to the Variable Rate Pool at a price equal to the deposited principal amount plus interests earned at maturity discounted at the borrowing rate prevailing at the time of withdrawal. This is equivalent to asking for a borrow in the Fixed Rate Pool for the resulting amount.

### 4.4 Early Repay

Borrowers can repay their debt before maturity and release their collateral. This implies repurchasing the debt at a price equal to de principal borrowed plus the interest owed at maturity discounted at the prevailing deposit rate at repayment time. This is equivalent to making a deposit in the Fixed Rate Pool for the resulting amount.

### 4.5 Aggregate Equations for Earned Interest on Loans in Fixed Rate Pools

Consider the time elapsed between any two operations in the protocol $$( t\_{k},t\_{k+1})$$. Assume there are $$l=1,2,\ldots ,L$$ coexisting Fixed Rate Pools in the period whose starting and maturing dates are $$t\_{start}^{l}$$ and $$t\_{mat}^{l}$$, respectively. Furthermore, assume there are $$N\_{l}$$ active loans and $$M\_{l}$$ deposits ($$M\_{l}\leq N\_{l}$$) in pool $$lth$$.

The total interest amount accumulated by the mass of loans from all the Fixed Rate Pools between $$t\_{k}$$ and $$t\_{k+1}$$ is given by:

![math formula - (19)](/files/Un45GdanYcThPD1FfYyu)

The total amount of accrued interest earned by depositors is;

![math formula - (20)](/files/fs9gDDfqcmDHzxfBUjRf)

and the total amount of accrued interest earned by the Variable Rate Pool;

![math formula - (21)](/files/nTjPOLQ2rzSX0SkOeFIJ)

## 5. Borrowing Assets at Variable Rates

Users can also take loans at variable rates similar to what they are accustomed to doing in protocols like Compound or AAVE. Under Exactly's architecture, it can be assumed that variable rate borrows take place in a special pool exclusively fed with Variable Rate Pool resources. In this pool, the only allowed operations are borrows and repayments. We use the same type of interest rate supply function as for Fixed Rate Pools.

In this case, to assure the proper behavior of the protocol, a new definition of utilization rate is needed. First, between any two transactions in the Variable Rate Pool, we define the current utilization rate as

![math formula - (22)](/files/gub8imx8r4DYoMyiVLuv)

where $$TB\_{VR}^{t}$$ is the total amount of variable rate borrows outstanding at time $$t$$, and $$\tau\_{VR}$$ is a numerical parameter.

Second, each time there is a new transaction in the Variable Rate Pool, a new utilization rate is calculated according to the following rule:

![math formula - (23)](/files/xvYhpApo825WvcSia4Pz)

Here $$B\_{VR}^{t+1}>0$$ means a new borrow is being made and $$B\_{VR}^{t+1}<0$$ means a repay (partial or total) of an existing borrow is being made.

Defining $$U\_{0}=min(U\_{VR}^{t} , U\_{VR}^{t+1})$$ and $$U\_{1}=max(U\_{VR}^{t} , U\_{VR}^{t+1})$$ we can update the prevailing variable interest rate at $$t+1$$ as:

![math formula - (24 & 25)](/files/hJzyOC2LZDzp4CPoFE2C)

### 5.1 Repayment of a variable rate loan

To keep track of the amount that each given single borrow must repay on exit, we record the number of shares that, upon entrance, this borrow represents to the total mass of variable rate loans.

Consider a new borrow $$B\_{VR}^{k,t\_{k}}$$ and the total amount of outstanding debt $$TB\_{VR}^{t\_{k}^{-}}$$. The amount of debt-shares associated to $$B\_{VR}^{k,t\_{k}}$$ is given by

![math formula - (26)](/files/taxYjnQfdNF45TqvjOdp)

where $$ShTB\_{VR}^{t\_{k}^{-}}$$ is the number of debt-shares corresponding to $$TB\_{VR}^{t\_{k}^{-}}$$

When the loan is canceled at a later time $$t\_{k+n}$$, the amount to be repaid will be calculated as:

![math formula - (27)](/files/Nme6fugn95obqiZzr8fR)

### 5.2 Calculating the total outstanding debt

The growth of variable rate debt is updated by calculating the interests between two consecutive transactions in the Variable Rate Pool:

![math formula - (28)](/files/iXREYIXfM7X7HZcdp3YL)

So the updated debt is

![math formula - (29)](/files/GzeteWihSKcZvY4n6sn7)

### 5.3 Aggregate Equations for Interest Earned on Variable Rate Loans by the Variable Rate Pool

The total accrued interest earned by the Variable Rate Pool between $$t\_{k}$$ and $$t\_{k+1}$$ due to variable rate loans is given by:

![math formula - (30)](/files/E0YuMTEj2Z00L03aAlGI)

## 6. Liquidations

In terms of liquidations, we adopted an approach similar to that of the Euler protocol. Consider a given user $$j$$. Let's call $$C^{j}$$ the total amount of collateral measured in USD they hold as a guarantee for their debts. Assume $$C^{j}$$ is composed of different assets.

![math formula - (31)](/files/FsIVvVz44qSk7fmzff5H)

We associate a Risk-Adjust Factor $$ho \_{i}$$ to each asset in order to assess the lending power of each collateral asset. Thus the risk-adjusted collateral is given by

![math formula - (32)](/files/qUPkWeMhZYJYL8k3ZYQb)

So, given a user collateral portfolio, the average Risk-Adjust Factor can be defined as follows

![math formula - (33)](/files/Rz9gmhnO3G9xiflE1dgS)

Similarly, the total amount of debt ($$D^{j}$$) and the risk-adjusted debt ($$\widetilde{D}^{j}$$) can be defined as follows

![math formula - (34)](/files/d0KcZMn8uddgbaMO0GaO)

So, given asset $$k$$, the maximum amount user $$j$$ can borrow from the asset $$k$$ is:

![Max borrow](/files/2D4wOrySjUrifytNzjv6)

The solvency condition for any given user is that their risk-adjusted collateral be greater or equal to their risk-adjusted liabilities, i.e.:

![math formula - (35)](/files/FDWizmhXiYA7q8QKs4WJ)

When an account becomes insolvent ($$\widetilde{C}^{j}/\widetilde{D}^{j}\leq 1$$) a liquidation process must be triggered.

In order to return the account to solvency as fast as possible and involve the least liquidation possible, we define the close factor ($$\kappa *{F}^{j}$$) as the fraction of outstanding borrows that must be repaid to return the portfolio to solvency. By design, $$\kappa*{F}^{j}$$ will be dynamic (i.e. dependent on the degree of insolvency).

Be $$\Gamma >1$$ the safe collateralization ratio that must be applied in a liquidation.

Before liquidation we have $$(\widetilde{C}^{j}/\widetilde{D}^{j} ) ^{before}\leq 1$$. Immediately after liquidation, the condition should be $$(\widetilde{C}^{j}/\widetilde{D}^{j} ) ^{after}=\Gamma$$.

In order to achieve that, liquidators repay an amount $$\kappa *{F}^{j}D^{j}$$ of debt and also pay an extra amount equal to $$\kappa*{F}^{j}\nu *{BD}D^{j}$$ to the Variable Rate Pool in concept of bad debt compensation. At the same time, they take for themselves a fraction $$\kappa*{F}^{j}(1+\nu\_{BD})(1+\nu\_{liq})D^{j}$$ of the collateral. The reduction in debt and collateral after liquidation is as follows

![math formula - (36 & 37)](/files/5cFNrfg0D3tfR6ULEoVt)

Where $$u *{liq}$$ is the liquidator commission and $$u*{BD}$$ accounts for the percentage of extra liquidation that is retained to the Variable Rate Pool as compensation for absorbing bad debt residuals after all the collateral is liquidated. Using the solvency condition

![math formula - (38)](/files/wBfM1NzXJOh6eJKl1wRm)

which provides the close factor as a function of the under collateralization ratio

![math formula - (39)](/files/mEDzKnEGgQ5BpWQbbcRY)

## Acknowledgments

A very special thanks to Danilo Neves Cruz and Santiago Sánchez Ávalos for the many hours of fruitful exchange of ideas we have spent during the exciting development of this task.

## References

1. Compound (2019), <https://compound.finance/docs>
2. AAVE (2020), <https://docs.aave.com>
3. Euler (2021), <https://www.euler.finance>
4. Yield (2020), <https://docs.yieldprotocol.com>
5. Notional (2020), <https://docs.notional.finance>
6. Element (2021), <https://paper.element.fi>
7. Pendle (2021), <https://docs.pendle.finance>
8. Uniswap (2018), <https://docs.uniswap.org>
9. Liquity (2020), <https://docs.liquity.org>

## Model parameters

Below is the list of parameters in the model.

$$\eta$$: Fraction of total Variable Rate Pool supply selected as Liquidity Reserve.

$$R\_{0}$$: Interest Rate value associated with a utilization rate equal to zero.

$$R\_{b}$$: Interest Rate value associated with a utilization rate equal to $$U\_{b}$$ (generally $$U\_{b}=1$$).

$$\tau \_{FR}$$: Fraction of Variable Rate Pool total liquidity a priori assigned to each Fixed Rate Pool.

$$\tau \_{VR}$$: Fraction of Variable Rate Pool total liquidity a priori assigned to Variable Rate Pool.

$$\Lambda$$: Scale factor used to define $$U\_{max}$$.

$$\alpha$$: Weighted factor in the Variable Rate Pool supply EMA.

$$\beta \_{slow}$$: Time decay parameter used when supply is above average.

$$\beta \_{fast}$$: Time decay parameter used when supply is below average.

$$\delta$$: Fraction of term-loan interests retained by the Variable Rate Pool upon leaving the Fixed Rate Pool.

$$\kappa \_{F}$$: Close factor, a fraction of debt to be repaid by liquidators.

$$\Gamma$$: Target solvency ratio after liquidation.

$$u \_{liq}$$: Liquidator incentive.

$$u \_{SM}$$: Variable Rate Pool compensation for bearing bad debt.

## Disclaimer

This paper is only for general information purposes. It does not constitute investment advice or a recommendation or solicitation to buy or sell any investment instrument and should not be used in the evaluation of the merits of making any investment decision. It should not be relied upon for accounting, legal or tax advice, or investment recommendations. This paper reflects the current personal opinions of the authors and is subject to change without being updated.

## Download the Math Paper

{% embed url="<https://github.com/exactly/papers/blob/main/ExactlyMathPaperV1.pdf>" %}

## Exactly Protocol Interest Rate Model v2

The Exactly Protocol Interest Rate Model v2 was successfully approved by governance through [EXAIP-08](https://gov.exact.ly/#/proposal/0x1c6a4e074fa9ce8e9469c60de8c32bd7cb26b3e61984966d638d518d9fc2206f) and has been executed.\
\
[\[EXAIP-08\] Interest Rate Model Upgrade (IRM v2)](https://medium.com/@exactly_protocol/exaip-08-interest-rate-model-upgrade-irm-v2-16759de270e6)\ <br>


# Math Paper v2

This paper describes the v2 version of the model, which is currently deployed on the OP Mainnet.

## Exactly Interest Rate Model Upgrade, IRM-V2

Authors: [Francisco Lepone](https://github.com/FranciscoLepone)&#x20;

<math@exact.ly>

December 2024

## Abstract

One year after launching theExactly protocol on the Optimism Mainnet, we introduce an enhanced version of its interest rate model. This iteration, IRM-V2, is designed to increase capital efficiency, produce a smoother term structure of interest rates, stimulate demand for credit across extended maturities, and lay the groundwork for the rise of more end-user-oriented credit products currently unavailable in the DeFi ecosystem.

Consistent with its predecessor, IRM-V2 allows users to borrow and deposit at either floating or fixed interest rates. The determination of floating rates has been refined and now depends on the utilization level of the Variable Rate Pool in conjunction with the overall utilization of the Protocol. Meanwhile, fixed rates are determined through a spread term, which depends on the relative utilization across various maturities, and it is also linked to the áoating rate value at any given moment.

The protocol maintains all underlying logic related to calculating supply rates, whether floating or fixed, ensuring a cohesive and robust framework for interest rate management.

## 1. Introduction

The emergence of decentralized Finance (DeFi) has the potential to radically transform traditional financial systems, introducing unprecedented levels of accessibility, transparency, and efficiency. Within this innovative landscape, theExactly Protocol has made a significant contribution, especially in the domain of fixed interest rates. Currently, Exactly is the only platform in the Optimism ecosystem that enables users to deposit and borrow crypto assets at both variable and fixed interest rates. Unlike previous fixed-rate models that relied on creating and pricing numerous maturity tokens that required a special type of Automated Market Makers (AMMs) and faced challenges such as liquidity shortages,Exactly Protocol introduced a novel fixed interest rate discovery process. It resembles the methodology used by successful and well-proven variable-rate protocols \[refs] but extends it to the much more complex fixed-rate field. It never hurts to highlight that developing a robust fixed-rate market is essential for DeFi to satisfy real-world financial needs and achieve massiveness.

The original Interest Rate Model (IRM-V1)\[1] adopts a continuous and differentiable rational function of the utilization for setting lending rates instead of the linear model Compound Protocol introduced in February 2019\[2]. The function was designed to diverge asymptotically for a certain boundary value of utilization to act as a natural barrier for credit demand as the utilization level depletes the protocol liquidity capability. The model implemented one of such functions calibrated explicitly for each pool maturity offered to borrowers/depositors. The borrowing rate for a given maturity is thus determined by the degree of utilization in this specific pool.<br>

This paper introduces IRM-V2, an evolution of the Exactly Protocol's approach to interest rate determination. Building upon the experience gained from over 100,000 transactions on the Protocol since launching, IRM-V2 incorporates a refined methodology that better aligns with market dynamics and user behaviors.

Specifically, it introduces a global utilization metric into the rate function to optimize liquidity usage and improve capital efficiency across the platform. It also establishes a term structure for fixed rates. This adjustment is not just a technical update but a thoughtful response to the practical challenges and opportunities observed within the DeFi ecosystem over the past year.

On the Short-Rate side, improvements are intended to increase capital efficiency. The variable rate will depend on the variable pool utilization level (as in the previous model) as well as on the protocol global utilization (variable pool plus all fixed-rate pools combined). The new interest rate function now becomes a bivariate function, and its behavior allows a reduction in the reserve requirement.

On the Fixed Term Side, the model introduces a guideline for the term structure of interest rates. Fixed rates will now be linked to the short rate status and incorporate a spread term dependent on the relative utilization for each specific maturity.

It is worth noting that changes were designed so that users donít notice the transition from IRM-V1 to IRM-V2, at least for low to medium global utilization values. Only when global utilization levels are high do the new features gain all their e§ectiveness, preventing liquidity issues.

## 2. Revisiting Pool Utilization Definitions

We introduce some changes in the definitions of utilization with respect to the ones applied in IRM-V1. In this new version, the common numeraire for any utilization is the total amount of deposits at variable rates. Since we have not modified the Protocol logic, we still have a single utilization for the variable rate pool (which measures the demand for instant-rate loans) and specific utilizations for each maturity pool, which measures the individual demand for each fixed-rate loan term. In addition, we will define a global utilization that characterizes total Protocol credit demand.

Consider the following time-dependent quantities: $$TD\_{VR}$$ is the total amount of deposits at variable rate (i.e., the protocol liquidity source), $$TB\_{VR}$$ is the total amount of loans at variable rate, $$TD\_{FR}^T$$  and $$TB\_{FR}^T$$ are the total amount of deposits and loans at maturity $$T$$, respectively.

We define the variable pool utilization as,

<figure><img src="/files/IVbSaaNm8sqWLQZl2naw" alt=""><figcaption></figcaption></figure>

and the utilization of a fixed pool with maturity $$T$$ as

<figure><img src="/files/PsBTPwbH6uoa2ZG6t5GY" alt=""><figcaption></figcaption></figure>

Note that with this definition, only loans backed by deposits in the floating pool add to the utilization.

Finally, the Protocol global utilization ($$U\_{Liq}$$) is simply the summation of all the other ones and denotes the degree of liquidity usage.

<figure><img src="/files/wDpapJFSpKo8oqxRHBaO" alt=""><figcaption></figcaption></figure>

## 3. Modelling the Short Rate (Variable Rate)

It is well known that liquidity preservation and capital efficiency are key points to consider when designing an autonomous interest rate system. Liquidity is a big concern, but only when global utilization (variable plus fixed pools together) is high. Otherwise, it should have little influence on interest rate determination. Concentrating liquidity resources helps to improve capital efficiency by avoiding segmentation but imposes new management challenges when there are multiple objectives to be satisfied (as is the case of multiple maturities in a term structure of interest rates). Therefore, Pools should care about global liquidity as well as their individual utilization level. By introducing a double dependency on variable-pool and global utilization levels, together with a liquidity triggering mechanism (as in the previous model), it is possible to have better control of rate adjustments. The immediate consequence is the chance to reduce liquidity reserve requirements, freeing up additional capital to be lent.

As already mentioned, the goal of an improved short-rate model is to make it also dependent on the protocolís global utilization. This dependency on global utilization should be ideally relevant only when available liquidity is scarce. For low to medium utilization levels, this e§ect should be almost negligible, and the old model would work perfectly fine.

A way to incorporate these features is to add a modulation factor to the old specification of IRM-V1. This factor takes the form of a rational function of $$U\_{Liq}$$ with a switching mechanism that turns this dependency on/off according to the value of $$U\_{Liq}$$ . It is essential for this transition to be continuous and as smooth as possible. This is achieved by incorporating a sigmoid function as a switching mechanism.

The functional form for the short rate is thus given by:

<figure><img src="/files/0F0VTDKlyDijiocDXor9" alt=""><figcaption></figcaption></figure>

where

<figure><img src="/files/uKlcnwbkEfQaHUK2R0hq" alt=""><figcaption></figcaption></figure>

and

<figure><img src="/files/0qkvU4yihVgE0IQMM3hp" alt=""><figcaption></figcaption></figure>

In the above expressions $$A$$, $$B$$, $$U\_{max}$$, $$\alpha$$, $$U\_{Liq0}$$ and $$k\_{sig}$$ are constant parameters serving different purposes. {$$A$$.$$B$$.$$U\_{max}$$} are intended for calibrating the behavior of the surface rate in the low to medium global utilization range; {$$\alpha$$} controls the steepness for rate increase in the high global utilization range; {$$U\_{Liq0}$$.$$k\_{sig}$$ } determine the utilization level where the transition occurs and its shift speed, respectively.

## 4. Modelling Fixed-Term Rates

Concerning fixed-rate determination as a function of loan maturity, IRM-V2 replaces the scheme of multiple curve functions (each one ruled by the individual pool utilization) with a spread term regulated by the relative usage of each maturity with respect to a predefined natural allocation level, see Fig.4. This approach makes also possible to incorporate other market characteristics such as intertemporal preferences.

One advantage of this novel approach is that rates will show more parsimonious behavior across terms while still reflecting user preferences. In some sense, it is a way to incorporate the benefits that monetary-policy guidelines bring to traditional finance, but in an autonomous way.

At every moment, Protocol users can freely choose between taking loans with an unspecific time horizon (floating rate) or with specific repayment dates (fixed rates).

To formalize these ideas, we introduce a parameter $$\nu$$ that conceptually affects the natural ratio between floating and fixed loans outstanding volume expected (conversely, 1 - $$\nu$$  is the natural proportion for fixed loans). As an example, a value .$$\nu$$ = 0:4 would mean that 40% are expected to be ideally allocated to variable-rate loans and 60% to fixed-rate loans. Having a proportion of floating debt above/below $$\nu$$ indicates that the former are over/under-demanded, respectively.

We define the indifference utilization point for any maturity pool as the average utilization value of a single fixed-rate pool:

<figure><img src="/files/mY3Mcl3mmueMRLfSrMLF" alt=""><figcaption></figcaption></figure>

Where $$n\_{T}$$  is the number of existing maturities. From eq.(2.2) we know that:

<figure><img src="/files/v7qaLk4gW5Sczfqaf1iW" alt=""><figcaption></figcaption></figure>

Call $$\phi$$ the fraction of natural utilization being used in a specific maturity.

<figure><img src="/files/JLlhFVJxtDxRDaPCrmm9" alt=""><figcaption></figcaption></figure>

We model the spread term as:

<figure><img src="/files/WBPpUYWemCpCL9k6XpRU" alt=""><figcaption></figcaption></figure>

where $$T$$  is time to maturity, $$T\_{max}$$  is the time to the longest maturity pool, $$\eta$$ ,$$a\_1$$ and $$a\_0$$, are constant, and $$Z$$ ($$\phi$$ ) is a monotonic function (-1 ≤ $$Z$$ ($$\phi$$ ) ≤ 1) given by

<figure><img src="/files/btiOR8JbjMrqZFhBNroj" alt=""><figcaption></figcaption></figure>

The expression for the interest rate term structure is then given by:

<figure><img src="/files/UZ9uQlFtKt8uyfjUP0MY" alt=""><figcaption></figcaption></figure>

In the current version, factor $$a\_0$$ commands the spread wideness. In addition, parameter $$a\_1$$ allows the introduction of a time liquidity-preference premium. In the future, these features may evolve to be endogenous or dynamically calibrated based on actual user behavior.

Under this approach and assuming $$a\_1$$ = 0, when $$U\_{FR}^T$$ $$U\_{FR}^T<⟨U\_{FT}^T⟩$$ at a given maturity, the pool is under-demanded -  $$Z (U\_{FR}^T<⟨U\_{FT}^T⟩)<0$$ $$a\_1$$ - so the spread is negative and the rate trades at discount over the floating rate. Conversely, $$U\_{FR}^T<⟨U\_{FT}^T⟩$$ the pool is over-demanded - $$Z (U\_{FR}^T<⟨U\_{FT}^T⟩)>0$$ - the and the spread is positive and the rate trades at a premium over the floating reference.

## 5. Results

This section presents the performance and behavior of IRM-V2 under different utilization levels and parameter calibrations. Key results include the smooth transition of short rates, the impact of parameters on rate growth beyond utilization thresholds, and the efficiency of the sigmoid switching mechanism in regulating liquidity constraints.

Figure(5.1), illustrates the short rateís sensitivity to global utilization beyond $$U\_{Liq0}$$  as governed by the $$\alpha$$  parameter. The results demonstrate that higher values steepen the rate growth curve, limiting borrowing at high utilization levels without impacting low-to-moderate utilization scenarios.

For illustrative purposes, we took on particular case $$U\_{Liq0}$$ = 0:75; $$K\_{sig}$$ = 2:5. By adjusting, it is very easy to make loans so costly to repay that no practical transactions will occur beyond the desired utilization limit. This can happen without affecting the normal use of the protocol at lower utilization levels.<br>

<figure><img src="/files/PiDfR4GCPXw0hrKgkkla" alt=""><figcaption></figcaption></figure>

Figure(5.2) shows the switching mechanism behavior for chosen combinations of { $${U\_{Liq0},k\_{sig}}$$ } These range from a low utilization-low speed transition case { $${U\_{Liq0}=0.5,k\_{sig}}=2$$ }  to a high utilization-fast speed transition case { $${U\_{Liq0}=0.8,k\_{sig}}=20$$ }.&#x20;

Figure(5.3) shows the general aspect of the short rate surface. This surface smoothly increases as the variable pool utilization gets higher; and shows a bigger steepness in the direction of global utilization. In fact, the calibration is set so that for most of the utilization space, rates are well contained and only increase sharply beyond the transition point.

<figure><img src="/files/PJBhbmsyWclmeJJ84uf2" alt=""><figcaption></figcaption></figure>

Figure(5.4) exhibits the variable rate behavior as a function of global utilization for different variable rate pool utilization levels.

Figure(5.5) exhibits the variable rate behavior as a function of the variable rate pool utilization for different levels of global utilization. It is evident that curves are notoriously smoother along this dimension.

The fixed-rate determination depends on the combination of floating rate levels and spread terms. Fig(5.6) shows the range they can adopt as a function of time to maturity depending on the relative utilization of each fixed rate pool. The black line shows the indifference point where fixed pool utilizations align according to the expected natural distribution. Below this line, pools are under-demanded, so interest rates are lower, encouraging new loans. Above the line, pools are over-demanded, rates are higher, and users will tend to get cheaper debt from other maturities.

As Fig(5.7) shows, the model is very flexible and can adopt different config durations depending on the parameterization. In its initial version (as previously mentioned), parameters will be exogenous but could be adapted to change dynamically, reflecting agents' preferences.

## 6. Applications

The ultimate goal of the Exactly Protocol is to bridge the gap between the current status of DeFi and the development of practical solutions that directly benefit real-world end users. This new interest rate framework allows for the exploration of innovative applications in personal and commercial finance, such as structuring installment loans with longer terms and predetermined fixed financial costs, enabling users to plan their finances with greater certainty. Another potential application the model facilitates is the creation of a credit card instrument that empowers users to defer payments into a self-determined number of installments at competitive financial costs, enhancing áexibility and control over personal spending. Furthermore, it supports the design of loans with payment schedules tailored to the user's cash flow patterns. For instance, in activities characterized by strong seasonality, repayment structures can concentrate payments during periods of higher income, thereby aligning financial obligations with revenue generation cycles. These practical implementations are just a few examples of the model's adaptability and potential to address diverse needs effectively.

<figure><img src="/files/NYDsovq4ArJ8yidb26Z2" alt=""><figcaption></figcaption></figure>

From a conceptual point of view, any application would be the result of solving some version of the problem:

<figure><img src="/files/gI1lcyDMoSVKLayFwp2l" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/VEXcWYOJKEeuzJpKyCxu" alt=""><figcaption></figcaption></figure>

where $$ps$$ and $$ls$$ are the payment and loan stream at every maturity, IRM is the protocol interest rate model, $$x$$ is a vector describing the status of the protocol. and $$H(),g().l()$$ are functions that shape the particular application of interest. In general, a recursive algorithm is needed in order to solve problem (6.1).

## 6.1 Case 1. Periodic Installment Fixed Rate Loans - Bul- let Bonds

This example demonstrates how a multiple-installment fixed-rate loan can be structured. To simplify, suppose there is a total supply of 10 million USDC in the market, with an initial global utilization rate of 0:5. The floating rate utilization stands at 0:2, while the utilizations of the first six available pools are {0:070; 0:078; 0:01; 0:078; 0:054; 0:01}, respectively. In this scenario, a loan of 2 million USDC is requested, which will be repaid in six equal installments.

The structure involves distributing the total loan amount into partial loans across the available maturities, ensuring the sum reaches the desired 2 million USDC.

<figure><img src="/files/wZpwL8RZnKyykATIZvpJ" alt=""><figcaption></figcaption></figure>

Figure (6.1) illustrates the size of partial loans and the equal repayment stream. Given the system status, this amounts to 338;200 USDC per installment, providing a transparent and predictable financial plan for the borrower.

Figure (6.2) shows the rates at which each partial loan was issued, offering insights into the cost dynamics over time. Additionally, the implied yield for the total loan is displayed, reáecting the global funding cost.

Finally, Figure (6.3) highlights the evolution of utilization levels across maturities, showing both the individual pool utilizations and the aggregated global utilization before and after the loan issuance.&#x20;

This structured approach ensures transparency and alignment between borrower needs and market conditions, showcasing the practical applicability of the Exactly Protocol's interest rate model in real-world lending scenarios. By customizing loans to existing pool conditions, borrowers and lenders can achieve an optimal balance between cost efficiency and resource allocation.&#x20;

Furthermore, these ideas could be expanded to include the issuance of debt instruments such as bullet bonds, which could have significant potential for funding projects initiated by DAOs within the ecosystem. Such debt instruments could be actively traded in secondary markets or decentralized exchanges, with the Exactly Protocol serving as a consistent market maker to ensure liquidity. While substantial development is still required, one can envision a future phase where these debts are securitized, benefiting from risk diversification and offering additional value to investors and the ecosystem as a whole.

<figure><img src="/files/NDLccfZdVlgBAJ6W2B3f" alt=""><figcaption></figcaption></figure>

### 6.2 Case 2. Credit Card Issuance with a Flexible Payment Schedule

As the first concrete end-user application of the Exactly Protocol borrow and lending framework, we have created the first self-custodian credit card system that allows users to manage their purchases with unmatched flexibility and control\[3]. By integrating the protocol with a smart wallet, users can defer payments for any purchase into a self-determined number of installments at competitive fixed rates and predefined terms. This setup eliminates the uncertainty associated with áuctuating financial costs, enabling users to plan their expenses confidently and efficiently. In this framework, each purchase is converted into a loan structured directly through theExactly Protocol. Users can select the number of installments that best fit their financial situation, benefiting from a transparent and predictable repayment schedule. The smart wallet acts as a seamless interface, automating the interaction with the protocol and managing repayments without requiring intermediaries, ensuring complete control remains with the user. This approach not only enhances user autonomy but also unlocks broader accessibility to decentralized financial services. It provides a scalable solution for integrating DeFi principles into everyday financial tools, helping to bridge the gap between traditional credit systems and blockchain technology. By leveraging the Exactly Protocolís robust fixed-rate lending infrastructure, this application represents a significant step forward in reimagining consumer finance in the digital age.

<figure><img src="/files/o6BdklJQw22WP70hQ6Ns" alt=""><figcaption></figcaption></figure>

### 6.3 Case 3. Tailor-Made Loans, Deferred and Seasonal Payments

Another example of the Protocolís potential is its application in providing tailored financial solutions for producers or entrepreneurs needing funding for their productive activities. Such users often face the challenge of financing projects that involve a significant time lag before generating returns. In these cases, the ability to design a loan with áexible terms that align with the user's cash flow becomes a critical enabler for business growth and operational efficiency.

The Protocol's unique borrowing and lending logic facilitates the structuring of loans with payment schedules that are not only delayed to accommodate the gestation period of the investment but also aligned with seasonal income patterns. For instance, an agricultural producer investing in crop cultivation might need funding at the start of the planting season but would only begin to realize income after the harvest. Similarly, a tourism-focused entrepreneur might generate the bulk of their revenues during peak seasons, necessitating a repayment structure concentrated in those periods.

By leveraging the Exactly Protocol, borrowers can obtain fixed-rate loans that defer initial payments to match their projected cash ináows and subsequently adjust repayment schedules according to their income cycles. This approach not only reduces financial strain during low-income periods but also minimizes the risk of default, ensuring the sustainability of both the borrowerís business and the lending ecosystem.

As a numerical example, let's reproduce the figures of Case 1, now with a time horizon of 24 monthly maturities. This time, the user wants to start repaying the loan one year after receiving the funds, matching payments with high-income periods (months 12 to 15 and 18 to 21), totaling eight installments. Figure(6.4) illustrates the proportion of partial loans and the equal repayment stream.

<figure><img src="/files/5x1bwhblgH6P3tAgr8Qd" alt=""><figcaption></figcaption></figure>

Figure(6.5) shows the rates at which each partial loan was issued and the implied yield for the total loan. Finally, Figure(6.6) highlights the evolution of utilization levels across maturities, showing both the individual pool utilizations and the aggregated global utilization before and after the loan issuance.

The integration of smart contracts within the protocol enables the automation of such tailored repayment structures, eliminating the need for manual renegotiations or interventions. Furthermore, the transparency and predictability of fixed-rate lending provide entrepreneurs with a clear understanding of their financial obligations, enhancing their ability to effectively plan and execute their investment strategies.

This application demonstrates the versatility of the Exactly Protocol in addressing the diverse needs of users across different industries. By aligning financial products with the realities of income variability and investment timelines, the protocol empowers users to unlock new opportunities, fostering innovation and economic growth within decentralized ecosystems.

## 7. Final Remarks

This paper introduced IRM-V2, an upgraded version of the Exactly Protocolís interest rate model, designed to enhance capital efficiency, liquidity management, and the usability of fixed-term borrowing with the objective of bringing the end user to decentralized finance. By incorporating a global utilization metric alongside individual pool utilization, the model offers a more comprehensive approach to rate determination, ensuring that liquidity constraints are effectively managed only at high utilization levels. By reducing reserve requirements, the protocol frees additional liquidity for lending, improving overall capital productivity. The model introduces a smooth and continuous transition

<figure><img src="/files/gUeTxkfaSHEvo5QK24If" alt=""><figcaption></figcaption></figure>

mechanism, ensuring predictable rate increases as global utilization approaches critical levels. The novel spread term, dependent on relative utilization and intertemporal preferences, creates a more parsimonious and responsive term structure for fixed rates.

The results demonstrate that IRM-V2 can optimize liquidity allocation while maintaining stability across both variable and fixed-rate products. These enhancements pave the way for innovative financial applications, including tailored credit instruments such as installment loans, áexible credit card systems, and deferred payment solutions for seasonal businesses. We believe this represents a significant step toward addressing real-world financial needs within the DeFi ecosystem.

Looking forward, the agenda includes exploring the implementation of a dynamic calibration of parameters based on user behavior and market conditions, improving the protocolís adaptability. Additionally, it sets the basis for the introduction of new derivative debt-based instruments and securitization mechanisms, fostering broader adoption and integration of decentralized finance solutions.

## References

\[1] Francisco Lepone, Gabriel Gruber, Exactly Protocol: A Model to Complete the Credit Market on the Ethereum Blockchain, <https://docs.exact.ly/resources/math-paper>

\[2] Compound (2019), [https://compound.Önance/docs](https://docs.compound.finance/)

<figure><img src="/files/u2UI7NgotvNNXCPuK8lN" alt=""><figcaption></figcaption></figure>

## Disclaimer

This paper is only for general information purposes. It does not constitute investment advice or a recommendation or solicitation to buy or sell any investment instrument and should not be used in the evaluation of the merits of making any investment decision. It should not be relied upon for accounting, legal or tax advice, or investment recommendations. This paper reflects the current personal opinions of the authors and is subject to change without being updated.

<figure><img src="/files/BcOOd00nET9PAxcrgX1D" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/SLX7sJMtazvTDRvYtvFk" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Kmq23G6oPlQbakHGWGHH" alt=""><figcaption></figcaption></figure>

## Download the Math Paper v2

{% embed url="<https://github.com/exactly/papers/blob/main/ExactlyMathPaperV2.pdf>" %}

* [\[EXAIP-08\] Interest Rate Model Upgrade (IRM v2)](https://medium.com/@exactly_protocol/exaip-08-interest-rate-model-upgrade-irm-v2-16759de270e6)


# Partnerships

On this page, you'll discover the exciting array of partners who have joined forces with Exactly, each contributing their unique expertise and resources to help us achieve our mission.

## Anthias

[Anthias](https://anthias.xyz/) is a tool that allows users to track how close big wallets are to liquidation on different blockchains and protocols.

URLs:&#x20;

* <https://app.anthias.xyz/exactly-opt>
* <https://medium.com/@exactly_protocol/exactly-protocol-anthias-join-forces-to-mitigate-liquidation-risks-6316b866a587>

## Beefy Finance

[Beefy Finance](https://beefy.finance/) is a DeFi platform that allows users to earn yield on their cryptocurrency holdings through automated investment strategies.

The platform offers a range of vaults, which are automated strategies that allow users to deposit their tokens and earn yield through various investment methods, such as liquidity provision, yield farming, and arbitrage. Users can deposit their tokens into these vaults and receive a share of the profits generated by the strategy.

URLs:

* <https://app.beefy.com/vault/exactly-supply-usdc>
* <https://app.beefy.com/vault/exactly-supply-eth>

## Beethoven X (Balancer powered)

[Beethoven X](https://op.beets.fi) is a decentralized investment platform that provides innovative, capital-efficient, and sustainable solutions for DeFi users. Built around the core concept of [programmable liquidity](https://docs.beets.fi), the platform offers a suite of unique financial primitives, such as [Weighted Pools](https://docs.beets.fi/boundless-opportunity/weighted), [Boosted Pools](https://docs.beets.fi/boundless-opportunity/boosted), and [Liquidity Bootstrapping Pools (LBPs)](https://docs.beets.fi/boundless-opportunity/lbp).

URL: <https://op.beets.fi/pool/0x3c74c4ed512050eb843d89fb9dcd5ebb4668eb6d0002000000000000000000cc>

## DeFiLlama

[DeFiLlama](https://defillama.com) is an analytics platform that provides comprehensive data and insights on the DeFi ecosystem. The platform tracks and aggregates information about various DeFi protocols and blockchains, offering users an overview of key metrics.

URLs:

* <https://defillama.com/protocol/exactly>
* <https://defillama.com/yields?chain=Ethereum&chain=Optimism&project=exactly>

## DeFiSafety

[DeFiSafety](https://www.defisafety.com) is an organization that provides assessments and ratings of DeFi products. They offer Protocol and Chain Reviews, providing security scores based on a quality standard.

URL: <https://www.defisafety.com/app?title=exactly>

## Dune Analytics

[Dune Analytics](https://dune.com/home) is a platform that allows users to query public blockchain data and aggregate it into dashboards to make crypto data accessible.

URL: <https://dune.com/exactly/exactly>

## Extra Finance

[Extra Finance](https://extrafi.io) is a lending leveraged yield farming (LYF) protocol built on OP Mainnet. LYF strategies allow users to amplify their returns on investments by borrowing additional funds to invest in a liquidity pool.&#x20;

URL: <https://app.extrafi.io/farm/vAMMV2-EXA%2FWETH>

## InsurAce Protocol

[InsurAce](https://www.insurace.io) is a decentralized multi-chain protocol that provides risk protection services to DeFi users, allowing them to protect their investment funds against various risks.

URL: <https://app.insurace.io/coverage/buycovers>

## Lido

[Lido](https://lido.fi/ethereum) is a liquid-staking solution for ETH. The protocol is intended to allow users to stake their ETH while simultaneously participating in on-chain lending with stETH and wstETH, thus providing them access to additional yield from other protocols.

## Mean Finance

[Mean Finance](https://mean.finance/) is the state-of-the-art DCA open protocol that enables users (or dapps) to Dollar Cost Average (DCA) any ERC20 into any ERC20 with their preferred period frequency, without sacrificing decentralization or giving up personal information to any centralized parties.

URL: <https://mean.finance/>

## Messari

[Messari](https://messari.io) is a platform that features the ability to track DeFi protocols and crypto assets, discover research, follow crypto events, and find DAOs and Web3 tools.

URL: <https://messari.io/protocol/exactly>

## Nansen

[Nansen](https://www.nansen.ai) is a blockchain analytics platform that enriches on-chain data with millions of wallet labels. The platform enables users to discover opportunities, perform due diligence, and monitor their portfolios with real-time dashboards and alerts.

URL: <https://pro.nansen.ai/projects/exactly>

## Nexus Mutual

[Nexus Mutual](https://nexusmutual.io/) is a decentralized insurance platform built on the Ethereum blockchain. It aims to provide a way for individuals and organizations to share risk without relying on traditional insurance providers.

The platform allows users to purchase coverage against smart contract failure, hacks, and other events that may result in financial losses in the DeFi space. Users can also provide liquidity to the platform's insurance pool and earn rewards for doing so.

URL: <https://app.nexusmutual.io/cover/buy/get-quote?productId=81>

## Optimism

[OP Mainnet](https://www.optimism.io) is a low-cost and lightning-fast Ethereum L2 (Layer 2) blockchain, designed to be fast, cheap, and simple while maintaining the security and decentralization of L1 (Layer 1).

In partnership with the Optimism Foundation, we have launched a rewards initiative that allows our users to earn [$OP tokens](https://help.optimism.io/hc/en-us/articles/5497354656283-What-is-the-Optimism-Token-).

URLs:

* [OP Rewards at Exactly Protocol](https://medium.com/@exactly_protocol/op-rewards-are-now-live-at-exactly-protocol-1f119d483e6)
* <https://www.optimism.io/apps/defi>

## Sablier

[Sablier](https://sablier.com) is a token streaming protocol that facilitates the streaming of ERC-20 assets on Ethereum and other EVM blockchains, enabling users to make continuous, real-time payments on a per-second basis.

## Velodrome

[Velodrome](https://velodrome.finance) is a next-generation AMM (Automatic Market Maker) designed to serve as Optimism's central liquidity hub.

URL: <https://velodrome.finance/swap?from=0x4200000000000000000000000000000000000006&to=0x1e925de1c68ef83bd98ee3e130ef14a50309c01b>

## Yearn Finance

[Yearn Finance](https://yearn.finance) is a yield aggregator. Giving individuals, DAOs, and other protocols a way to deposit digital assets and receive yield. Yearn Vaults are capital pools that automatically generate yield based on opportunities present in the market.

URL: <https://yearn.finance/vaults/10/0xc3439Ba7db7566ed0deF55c179ED9b3bA273A67F>

## Zapper

[Zapper](https://zapper.xyz) is a Web3 explorer that allows users to track the blockchain journey of others in DeFi protocols, NFTs, and DAOs. With Zapper, users can track and follow multiple wallets and explore new opportunities in DeFi by browsing various protocols.

URL: <https://zapper.xyz/apps/exactly>

## Who can I contact about partnerships/integrations?

Feel free to reach out through [Discord](https://discord.gg/exactly) or other platforms in the [Quick Links](/getting-started/quick-links) section.


# Presentations

## 1. ETH Barcelona (July 8, 2022)

### 1.1 Slides

{% embed url="<https://docs.google.com/presentation/d/194VVqhmvFNoEIihtpqmJMVqU9k0s757fZ9oCAoYMUjI/edit#slide=id.g13a1ceaabd7_0_18>" %}
Decentralizing the time-value of money
{% endembed %}

### 1.2 Video

{% embed url="<https://www.youtube.com/watch?t=982s&v=mMl3lbhQDQA>" %}
Exactly Presentation at ETH Barcelona
{% endembed %}

### 1.3 Demo

{% embed url="<https://www.youtube.com/watch?t=2s&v=8LrJ95Lk3dc>" %}
Testnet demo
{% endembed %}

## 2. EthCC Side Event at Paris (July 20, 2022)

### 2.1 Slides

{% embed url="<https://docs.google.com/presentation/d/1i9JrCbkZzxxb7Zn_gPwO7jqR7bnupq_LV4E_SlshAA0/edit#slide=id.g13d9cdca389_0_123>" %}
Slides of the presentation
{% endembed %}

### 2.2 Video

{% embed url="<https://youtu.be/oYJDG_jgE0c>" %}
Video of the Presentation
{% endembed %}

## 3. ETH Latam at Buenos Aires (August 11, 2022)

### 3.1 Slides of the Main Stage Presentation

{% embed url="<https://docs.google.com/presentation/d/1sgR6qLQaZIZh37_8BQ4eWCY17WxUtnsR-1Q8qKB7lgw/edit?usp=sharing>" %}
Slides of the Presentation
{% endembed %}

### 3.2 Video of the Main Stage Presentation

{% embed url="<https://youtu.be/txMmfjTNipk>" %}
Video of the Presentation
{% endembed %}

### 3.3 Slides of the Workshop Presentations

{% embed url="<https://docs.google.com/presentation/d/1imNQGwVgR3yl8Shz6mljW4D7lR1iSwmB/edit#slide=id.p1>" %}

{% embed url="<https://docs.google.com/presentation/d/18-zU9WtZ3pEpb3jEYbeHjmOq8mwQWJMYf0DLD4Vr16Y/edit?usp=sharing>" %}

## 4. LABITCONF Buenos Aires (November 11, 2022)

### 4.1 Slides

{% embed url="<https://docs.google.com/presentation/d/1h7_RjdAZEgF4OLIg0z34cfRq3JTOuw1-1wE8PQLQT3o/edit?usp=sharing>" %}

## 5. EthDenver 2023 (February 2023)

### 5.1 Slides

{% embed url="<https://docs.google.com/presentation/d/1EIP9-fy5oJ93MApcTDGGmIHR6GWVxg7ykllg0i5EsfY/edit?slide=id.g13d9cdca389_0_123#slide=id.g13d9cdca389_0_123>" %}

## 6. Exa App launch in Buenos Aires (March 13, 2025)

### 6.1 Slides

{% embed url="<https://docs.google.com/presentation/d/1rViWEa6ZTZ7NEAa1kt0g-aQDXFJk5bbCQErPlxLwpGU/edit?usp=sharing>" %}

### 6.2 Video

{% embed url="<https://www.youtube.com/watch?v=F4iF3o2Z1xg>" %}


# Brand Assets

Our brand assets can be found here: [SVG](https://drive.google.com/drive/folders/1u6KQVrghW8qGpU1cDZBz1ZkBYn5-mIwz?usp=sharing), [PNG](https://drive.google.com/drive/folders/1UairaFzVVL3ffS9AfDN0dkoBksh0CC4N?usp=sharing).

<figure><img src="/files/DkY9vF7A3jzJseZo8G70" alt=""><figcaption><p>Exactly Protocol logo black<br><a href="https://drive.google.com/file/d/1e0fsq7ZoUBOb3pTwsG5x3cY4yJ5RDrWx/view?usp=drive_link">Download SVG</a><br><a href="https://drive.google.com/file/d/1HXc3gGrvzhEiSrSluxEN6BZeGNXpanKJ/view?usp=drive_link">Download PNG</a></p></figcaption></figure>

<figure><img src="/files/9qAmVcn9G1JeHtUOPoDw" alt=""><figcaption><p>Exactly Protocol logo white<br><a href="https://drive.google.com/file/d/1j40Q0Sxc7arFY3n9EAsdxH18Fb4RqE9P/view?usp=drive_link">Download SVG</a><br><a href="https://drive.google.com/file/d/1IZj11ngiH_PsgSWv_d_YVSnjFudxdfep/view?usp=drive_link">Download PNG</a></p></figcaption></figure>

<img src="/files/4xvqkLrDTFQkJvxiiWRt" alt="Exactly Protocol Isologo black
Download SGV
Download PNG" width="188">

<figure><img src="/files/hL1sYWajLfcCWjblJdK3" alt=""><figcaption><p>Exactly Protocol Isologo White<br><a href="https://drive.google.com/file/d/1lLqsnWKDhHSUW9AowTgHSDF19IZrUIGh/view?usp=drive_link">Download SVG</a><br><a href="https://drive.google.com/file/d/17ya_6rp5LWqlfe0M8JW9fcn5LYUzxzxU/view?usp=drive_link">Download PNG</a></p></figcaption></figure>

<figure><img src="/files/RyxoZx1pPzMK2Ik5Rpuf" alt="" width="300"><figcaption><p>EXA token isologo<br><a href="https://drive.google.com/file/d/1KRm8Ehbtj1BfmM8ICkwRbBA3k8tEl-Vq/view?usp=drive_link">Download SVG</a><br><a href="https://drive.google.com/file/d/1Z6DNqlUCTXIAVfpXJgG2q-7B7sDrbMUt/view?usp=drive_link">Download PNG</a></p></figcaption></figure>

<figure><img src="/files/jzfozOYXm0A7iCb2ZykG" alt="" width="300"><figcaption><p>esEXA token isologo<br><a href="https://drive.google.com/file/d/1CC0OpfrV2wPHkUNpItDsnhO9F8UNlk3Z/view?usp=drive_link">Download SVG</a><br><a href="https://drive.google.com/file/d/1yjNsnV1mtymH1lHOAbt6ynFG2s9R3YQ0/view?usp=drive_link">Download PNG</a></p></figcaption></figure>

<figure><img src="/files/8grr2ZgOvrt24EfhS0Rg" alt=""><figcaption><p>Social Media Header<br><a href="https://drive.google.com/file/d/1ukXCNW6rL706pEpWUKTv-K--yNuHy1JO/view?usp=drive_link">Download PNG</a></p></figcaption></figure>

<figure><img src="/files/h11Y2tKLXNvSOoOi3L9h" alt="" width="375"><figcaption><p>Exa App logo black<br><a href="https://drive.google.com/drive/folders/1kFtAx9oi-lmPhfpTDuXFajgZkQ1S3sEU">Download SVG</a><br><a href="https://drive.google.com/drive/folders/1kFtAx9oi-lmPhfpTDuXFajgZkQ1S3sEU">Download PNG</a></p></figcaption></figure>

<figure><img src="/files/wvkAkvUxyC23vpNG8K6x" alt="" width="375"><figcaption><p>Exa App logo white<br><a href="https://drive.google.com/drive/folders/1kFtAx9oi-lmPhfpTDuXFajgZkQ1S3sEU">Download SVG</a><br><a href="https://drive.google.com/drive/folders/1kFtAx9oi-lmPhfpTDuXFajgZkQ1S3sEU">Download PNG</a></p></figcaption></figure>


# Terms and Conditions of Use

These terms and conditions of use, together with any other documents and additional terms incorporated herein by reference **(“Terms”)**, set out the terms and conditions under which **Exactly (“us”, “we”, “Exactly”** or the **“Company”**), offers you or the company or other legal entity you represent (“you” or “your”) access to and use of the Platform and the Digital Assets Services (as such terms are defined below).

**Exactly is an open source, non-custodial protocol on OP Mainnet blockchain, that brings fixed-income solutions for lenders and borrowers (the "Platform"). The Platform will permit its users, among other things, enter into certain transaction involving digital assets (including but not limited to digital loans and credit products) (the "Digital Assets Services"). Any reference herein to the Platform shall include any kind of technology develop by Exactly to provide the Digital Assets Services (including but not limited to our website at** [**https://exact.ly**](https://exact.ly/)**).**

**Please read these Terms carefully, as these Terms shall govern your use of our Platform and the Digital Assets Services, and expressly cover your rights and obligations, and our disclaimers and limitations of legal liability, relating to such use. Each time either you access to the Platform, click any “I agree” (or similar) button or checkbox presented with these Terms, or use any of the Digital Assets Services , you are deemed to have read, understood and accepted all of these Terms and, therefore, you agree to be bound by these Terms. If you do not agree to these Terms, you will not be allowed to access or use the Platform or the Digital Assets Services.**

**You acknowledge and agree that, as provided in greater detail in these Terms: (i) the Platform and the Digital Assets Services are licensed, not sold to you, and you may use the Platform and the Digital Asset Services only as set forth in these Terms; and (ii) the Platform and the Digital Assets Services are provided “as is” and “as available” without warranties of any kind and our liability to you is limited.**

**Please carefully review the assumptions of risk set forth in Section 8 and the disclosures and disclaimers set forth in Section 9 in their entirety before using the Platform and the Digital Asset Services. The information in these Terms provides important details about the legal obligations associated with your use of the Platform and the Digital Assets Services. By accessing or using the Platform or the Digital Asset Services, you agree that Exactly is a provider of (among other services described in these Terms) open-source software that splits yield generating positions of digital assets to third-party decentralized protocols. Exactly is not affiliated with and has no control over these third-party protocols and is not responsible for any losses that occur as a result of interconnection with these third-party protocols. The Platform consists of an open-source software deployed on the OP Mainnet blockchain, which software operates in an autonomous fashion on a decentralized network and, as a result, Exactly has no control over user transactions. You acknowledge that you use the Platform and the Digital Asset Services at your own risk and agree that Exactly will not be responsible for any losses that occur as a result of your use of the Platform or the Digital Asset Services.**

**Please note that Section 18 contains an arbitration clause and class action waiver. By agreeing to these Terms, you agree (a) to resolve all disputes with us through binding individual arbitration, which means that you waive any right to have those disputes decided by a judge or jury, and (b) that you waive your right to participate in class actions, class arbitrations, or representative actions. You have the right to opt-out of arbitration as explained in Section 18.**

These Terms are to be read in conjunction with the [Privacy Policy](https://docs.exact.ly/legal/privacy-policy) (including where applicable, any privacy policy statement in a country or product annex).

**1. ACCESS TO THE DIGITAL ASSETS SERVICES.**

1.1 In order to access the Platform, and to further access Digital Assets Services, you must connect your wallet (the **“Wallet”**) to the Platform. Exactly is not responsible for, does not endorse, shall not be held liable in connection with and does not make any warranties, whether express or implied, as to the Wallets connected to, used by you in relation to, the Platform or the Digital Assets Services. When using third-party Wallets, you are responsible for reviewing applicable terms and policies that govern your use of such software. Exactly will never receive access or control over your Wallet. Therefore, you are solely responsible for securing your Wallet and credentials thereto. You may disconnect your Wallet from the Platform and the Digital Assets Services at any time directly through the Platform.

1.2 It is your sole and entire responsibility to provide the Platform with correct details of your Wallet and such other wallets involved in any transaction within the Digital Assets Services. We accept no liability resulting in you not receiving the digital assets loan or withdrawn due to the fact of you providing incorrect or out-of-date details. It is also your responsibility to ensure transactions sent to Exactly are well-formatted and denominated in the correct currency or crypto currency. Exactly excludes all liability for any incorrect transactions, including but not limited to digital assets sent to wrong addresses.

1.3 Any digital asset that you transfer using the Wallet or interacting in any way with the smart contract for the purpose of any transaction within the Digital Assets Services or any digital asset loan requested to Exactly in the Platform will be transferred into the smart contract behind the Platform on a title transfer, free from any encumbrance and will not be held by us or any third party in a custodial or sub-custodial basis. By entering into any transaction using the Digital Assets Services you accept that all commercial actions that you execute within the Platform (loans, deposits, among others) are final and irreversible and that Exactly reserves the right to liquidate any operation at any time regardless of the profit or loss position.

1.4 Use of the Platform and the Digital Assets Services is provided at no cost. Nevertheless, use of the Digital Assets Services or otherwise conducting transactions through the Platform may be subject to third parties’ fees, including handling fees, network transaction fees, costs and charges (such as the fees for the use of the OP Mainnet blockchain). You agree to pay any such fees, costs and charges.

1.5 Each time you access and use the Digital Assets Services, you represent and warrant:

1.5.1 that you have read, understood and accepted these Terms;

1.5.2 that you are of legal age in your jurisdiction as required to access and use the Platform and the Digital Assets Services and enter into arrangements as provided by such Digital Assets Service, and that you are fully able and competent to enter into the terms, conditions, obligations, affirmations, representations and warranties set forth in these Terms and to abide by and comply with these Terms;

1.5.3 if you are an authorized representative of a legal entity, that you have full power and authority to represent such legal entity and agree to these Terms, and enter into any agreements, transactions or use any service, on behalf of such legal entity, including without limitation the Platform, the Digital Assets Services, or any other service offered by the Company through the Platform;

1.5.4 you have not previously been suspended or removed from accessing to the Platform or the Digital Assets Services, whether on your behalf or otherwise;

1.5.5 that you are the legal owner of the funds or assets you use within the Digital Assets Services and that the same funds or assets derive from a legitimate source;

1.5.6 that using the Digital Assets Services does not constitute a breach of your home jurisdiction’s laws;

1.5.7 that you are aware of the risks of using the Digital Assets Services provided by Exactly and you are aware of the high volatility risk of the digital assets itself;

1.5.8 that you will not be involved or initiate any form of market manipulation, including spoofing orders or otherwise;

1.5.9 that all information submitted by you through the Platform or the Digital Assets Services is true, accurate and not incomplete or misleading and that the use of such information within the Digital Assets Services does not violate any third-party right nor any law or regulation;

1.5.10 that any digital address you provide is your own and that you have full control over this address;

1.5.11 you are acquiring the right to access and use the Platform and agreeing to these Terms for the purposes of a business and that, to the maximum extent permitted by law, any statutory consumer guarantees or legislation intended to protect non-business consumers in any jurisdiction does not apply to the supply of the Platform, the Digital Assets Services or these Terms;

1.5.12 that you have the amount of money or digital assets to return any kind of loan or credit to be taken within the Platform (including its applicable interests) and that you will use those funds for legitimate purposes;

1.5.13 you understand the operation, functionality, usage, storage, transmission mechanisms and other material characteristics of cryptocurrencies, blockchain-based software systems, cryptocurrency wallets or other related digital assets storage mechanisms and blockchain technology;

1.5.14 that you understand and acknowledge that the Platform consists of an open-source software deployed on the OP Mainnet blockchain, which software operates in an autonomous fashion on a decentralized network and, as a result, Exactly has no control over user transactions. You acknowledge that you use the Platform and the Digital Asset Services at your own risk and agree that Exactly will not be responsible for any losses that occur as a result of your use of the Platform or the Digital Asset Services; and

1.5.15 the Platform and the Digital Assets Services are global and by accessing and using them, you further represent that you are legally permitted to use the Digital Assets Services in your jurisdiction including owning cryptographic tokens of value, and interacting with the Platform or the Digital Assets Services in any way. Persons or entities which are considered as citizen, resident or taxpayer in any jurisdiction that deems the cryptographic tokens and/or digital assets offered through the Digital Assets Services as securities and/or requires registration with any securities agencies and/or in which the access or use of the Digital Assets Services is forbidden or restricted by law, are prohibited from accessing and using the Digital Asset Services. You acknowledge and agree that you are responsible for ensuring compliance with the laws of your jurisdiction and acknowledge that the Company or any of the Affiliates (as defined below) are not liable for your compliance with such laws and, by accepting these Terms, you hereby undertake not to use the Digital Assets Services for any illegal activity.

1.6 When accessing and using the Digital Assets Services, you must:

1.6.1 not attempt to undermine the security or integrity of Exactly’s computing systems or networks or, where the Digital Assets Services are hosted by a third party, that third party’s computing systems and networks;

1.6.2 not use, or misuse, the Digital Assets Services in any way which may impair the functionality of such Digital Assets Services or Platform, or other systems used to deliver the Digital Assets Services or impair the ability of any other user to use the Digital Assets Services or the Platform;

1.6.3 not attempt to gain unauthorized access to the computer system on which the Platform is hosted or to any materials other than those to which you have been given express permission to access;

1.6.4 not transmit or input into the Platform any files that may damage any other person’s computing devices or software; content that may be offensive; or material or data in violation of any law (including data or other material protected by copyright or trade secrets which you do not have the right to use);

1.6.5 not attempt to modify, copy, adapt, reproduce, disassemble, decompile or reverse engineer any computer programs used to deliver the Digital Asset Services or to operate the Platform except in accordance with any license under which the Platform or the Digital Assets Services may be subject (including any open-source license or otherwise).

**2. INTELLECTUAL PROPERTY.**

2.1 The Platform and the Digital Assets Services contain information that is protected by applicable intellectual property and other laws or licenses (including open source license, as applicable). Except as expressly authorized by the terms of such license and/or by the Company, you agree not to copy, modify, rent, lease, loan, sell, distribute, perform, display or create derivative works based on the service, in whole or in part.

2.2 By accessing the Platform and downloading material (including contained in any temporary cache), you acknowledge that you do not acquire any intellectual property rights or ownership rights and may not resell any of the products or Digital Assets Services appearing on the online Platform, nor to hotlink, frame or otherwise present any version of the Platform to any other person or entity, without Company’s prior consent.

2.3 Company’s reserves all proprietary rights regarding the Company’s name and trademark and you may not use such name or trademark without Company’s prior consent. You may display on a computer screen or print extracts from the Platform only for personal purpose and provided that you retain any copyright and other proprietary notices or any Exactly trademarks or logos, as shown on the initial printout or download without alteration, addition or deletion. Except as expressly stated herein, you may not without Exactly’s prior written permission alter, modify, reproduce, distribute or use in any other commercial context any materials from the Platform.

2.4 We reserve the right to remove or disable access to any content or other materials from the Platform that violates or may infringe any person’s intellectual property rights.

**3. THIRD-PARTY LINKS AND WEBSITES.**

3.1 The Platform may contain links to third party websites (including all links related with the use of the Wallet within the Platform) that are not affiliated or associated with Exactly (although Exactly branding, advertisements or links may appear on these websites) and Exactly may send e-mail messages to you containing advertisements or promotions including links to third parties. Exactly makes no representation as to the quality, suitability, functionality or legality of the material on third party websites that are linked to, or to any goods and services available from such websites. The material is only provided for your interest and convenience. Exactly does not monitor or investigate such third party websites and you acknowledge and agree that Exactly or any related entity shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with the use of or reliance on any content, goods or services available on or through any such third-party site or resource.

3.2 Under no circumstances you shall create a hyperlink to any of the pages on the Platform, unless Exactly provides you with its prior consent to do so. If you do create a link to any of the pages on the Platform, you acknowledge that you are responsible for all direct or indirect consequences of the link, and you indemnify Exactly for all loss, liability, costs or expense arising from or in connection with the link.

**4. SECURITY.**

4.1 You may not violate or attempt to violate the security of this Platform, the Digital Assets Services or any of the products or services described or contained herein. We may investigate occurrences which may involve such violations and may involve, and co-operate with, governmental, regulatory or law enforcement authorities in investigation and prosecuting persons who have participated in such violations.

4.2 You agree that it is your responsibility to install anti-virus software and related protections against viruses or other computer programming routines or engines that are intended to damage, destroy, disrupt or otherwise impair a computers functionality or operation which may be transferred to your computer via this Platform.

4.3 The Company may, at its sole discretion, offer additional security features as part of the Platform, such as two-factor authentication (**“2FA”**). It is your responsibility to ensure and maintain continuous security and control over any device or account that gives access to the Platform and the Digital Assets Services. Failure of any such security device or account may delay or restrict your access to the Platform or the Digital Assets Services.

**5. INFORMATION AVAILABLE IN THE PLATFORM.**

5.1 The information, opinions and data on or provided through the Platform or the Digital Assets Services may, in whole or in part, have been obtained from third party sources. Accordingly, we do not guarantee the accuracy, validity, timeliness or completeness of such information, opinions or data for any purpose.

5.2 You must seek the advice of professional advisors regarding the evaluation of any specific information, opinion, advice or other content, and acknowledge that you have had the opportunity to take such advice before using the Platform or the Digital Assets Services.

**6. COMPLIANCE WITH LAWS AND REGULATION.**

6.1 You agree and acknowledge that it is your responsibility to comply with all applicable laws and regulations relating to the use of the Platform or any Digital Assets Services or any transactions you made through the Platform, including without limitation the reporting of any transactions, and the calculation and payment of all applicable taxes within any jurisdiction applicable to you. You assume full liability for seeking independent legal, accounting and/or taxation advice to learn which laws and regulations are applicable to you, and for ensuring that you comply with them.

6.2 The Company is not responsible for collecting, reporting, withholding or remitting any taxes arising from any transaction you conduct with the Company or through the Platform, but will comply with any reporting or withholding obligations that apply to it. For that purpose, each time you access the Platform or conduct a transaction with us, any information or representation you have made as to your tax residency is deemed to have been repeated at that time, and we will rely upon it for such reporting purposes, if required.

**7. PROHIBITED USE.**

You may not use the Digital Assets Services to engage in the following categories of activity (**"Prohibited Uses"**). The specific types of use listed below are representative, but not exhaustive. By using the Digital Assets Services provided here, you confirm that you will not use this Digital Assets Services to do any of the following:

a) **Unlawful Activity:** Activity which would violate, or assist in violation of, any law, statute, ordinance, or regulation, sanctions programs administered in any relevant country, including but not limited to the U.S. Department of Treasury's Office of Foreign Assets Control ("OFAC"), or which would involve proceeds of any unlawful activity; publish, distribute or disseminate any unlawful material or information.

b) **Abuse of Other Users:** Interfere with another individual's or entity's access to or use of any Digital Assets Services; defame, abuse, extort, harass, stalk, threaten or otherwise violate or infringe the legal rights (such as, but not limited to, rights of privacy, publicity and intellectual property) of others; incite, threaten, facilitate, promote, or encourage hate, racial intolerance, or violent acts against others; harvest or otherwise collect information from the Platform about others, including without limitation email addresses, without proper consent

c) **Fraud:** Activity which operates to defraud the Company, the Digital Assets Services, other Users, or any other person; provide any false, inaccurate, or misleading information.

d) **Intellectual Property Infringement:** Engage in transactions involving items that infringe or violate any copyright, trademark, right of publicity or privacy or any other proprietary right under the law; use of Company’s intellectual property, name, or logo, including use of Company trade or service marks, without express consent from Company or in a manner that otherwise harms the Company; any action that implies an untrue endorsement by or affiliation with Company.

**8. NOTICE TO USERS. ASSUMPTION OF RISKS.**

The following notices are duly given to Users and each person or entity accessing or using the Digital Assets Services shall be deemed to have been notified of the following:

8.1 **Risk warning:** trading, lending, borrowing or depositing digital assets carries a high level of risk, and is not suitable for everyone. Before deciding to operate in the Platform or buy or sell digital assets you should carefully consider your investment objectives, level of experience, and risk appetite. The possibility exists that you could sustain a loss of some or all of your investment and therefore you should not invest money that you cannot afford to lose. You should be aware of all the risks associated with digital assets, and seek advice from an independent financial adviser should you have any doubts. Furthermore, there may be risks that are not disclosed in this disclaimer and any other terms or conditions that apply to our Platform or the Digital Assets Services. You must carefully consider your financial situation and tolerance to risk before engaging in any activity involving digital assets. Independent, professional financial and legal advice must be sought where necessary.

8.2 **Sophistication and Risk of Cryptographic Systems.** By utilizing the Digital Assets Service or interacting with the Platform in any way, you represent that you understand the inherent risks associated with cryptographic systems; and warrant that you have an understanding of the usage and intricacies of native cryptographic tokens, smart contract based tokens, and blockchain-based software systems. None of the Company or its affiliates own or control any of the underlying software through which blockchain networks are formed. In general, the underlying software for blockchain networks tends to be open source such that anyone can use, copy, modify, and distribute it. By using the Digital Assets Services, you acknowledge and agree (i) that the Company or related entities are not responsible for the operation of the underlying software and networks that there exists no guarantee of functionality, security, or availability of such software and networks; and (ii) that the underlying protocols are subject to sudden changes in operating rules (known as "Forks"), and that such Forks may materially affect the Digital Assets Services. It might be discretionarily decided not to support (or cease supporting) the Forked network entirely. You acknowledge and agree that the Company and its affiliates assume absolutely no responsibility whatsoever in respect of any underlying software protocols, whether Forked or not.

8.3 **Risk of Regulatory Actions in One or More Jurisdictions.** The Digital Assets Services could be impacted by one or more regulatory inquiries or regulatory action, which could impede or limit the ability of the Company to continue to develop, or which could impede or limit your ability to access or use the Digital Assets Services or the blockchain network, including access to your funds. You agree that the Company or the Affiliates are not responsible for determining whether or which laws may apply to your use of the Digital Assets Services, including tax laws. You are solely responsible for reporting and paying any taxes arising from your use of the Digital Assets Services and you should seek professional advice regarding applicable laws or regulations.

8.4 **Risk of Weaknesses or Exploits in the Field of Cryptography.** You acknowledge and understand that cryptography is a progressing field. Advances in code cracking or technical advances such as the development of quantum computers may present risks to cryptocurrencies and the Digital Assets Services, which could result in the theft or loss of your cryptographic tokens or property. To the extent possible, it is intended to update the protocol underlying the Digital Assets Services to account for any advances in cryptography and to incorporate additional security measures, but does not guarantee or otherwise represent full security of the system. By using the Digital Assets Services or accessing the Platform, you acknowledge these inherent risks.

8.5 **Volatility of Cryptocurrency.** You understand that cryptocurrencies and other blockchain technologies and associated tokens are highly volatile due to many factors including but not limited to adoption, speculation, technology and security risks. You also acknowledge that the cost of transacting on such technologies is variable and may increase at any time causing impact to any activities taking place on the blockchain network. You acknowledge these risks and represent that the Company or any related entity or person cannot be held liable for such fluctuations or increased costs.

8.6 **Application Security.** You acknowledge that the Digital Assets Services is subject to flaws and acknowledge that you are solely responsible for evaluating any code provided by the Digital Assets Services. This warning and others later provided by the Company in no way evidence or represent an on-going duty to alert you to all of the potential risks of utilizing the Digital Assets Services.

8.7 **Platform Accuracy.** Although it is intended to provide accurate and timely information on the Platform and other tools making up the Digital Assets Services, the Platform or relevant tools may not always be entirely accurate, complete or current and may also include technical inaccuracies or typographical errors. In an effort to continue to provide you with as complete and accurate information as possible, information may be changed or updated from time to time without notice, including without limitation information regarding our policies. Accordingly, you should verify all information before relying on it, and all decisions based on information contained on the Platform or relevant tools are your sole responsibility and the Company shall have no liability for such decisions. Links to third-party materials (including without limitation websites) may be provided as a convenience but are not controlled by any entity. You acknowledge and agree that we are not responsible for any aspect of the information, content, or services contained in any third-party materials or on any third party sites accessible or linked to the Platform or available via other relevant tools.

8.8 **Technical Knowledge.** Any use or interaction with the Digital Assets Services requires a comprehensive understanding of applied cryptography and computer science in order to appreciate inherent risks, including those listed above. You represent and warrant that you possess relevant knowledge and skills.

8.9 **No advice:** Any opinions, news, research, analyses, prices or other information contained on or through thePlatform is provided as general market commentary, and does not constitute investment or financial advice, nor should it be relied on for any investment decision. We will not accept liability for any loss or damage, including without limitation to, any loss of profit, which may arise directly or indirectly from use of or reliance on such information. The contents of any communications from us may have been prepared by personnel of the Company and/or by other divisions or entities. The material does not purport to be, and is not intended to be a “research report”, “investment research” or “independent research” as may be defined in applicable laws or regulations worldwide. It is intended for your general information about market conditions and recent events only, and neither we nor any individual sender is soliciting any particular action or transaction based upon it. Such communications do not represent investment advice, and do not take into account any specific circumstances of any recipient. Any information provided by us or the individual sender should not form the primary basis for any decision that you may take in relation to the matters referred to therein. We have not taken any steps to verify the adequacy, accuracy, completeness or suitability of any information or written material provided to you. You are solely responsible for any investment or purchase decisions and should carefully review any information or written material that you receive. You should conduct any due diligence that is necessary and appropriate on your own personal circumstances, including consultation with independent legal, tax, accountancy and/or other professional advisors.

8.10 **No representations:** No representation or warranty is given as to the achievement or reasonableness of any plans, future projections or prospects and nothing on the Platform should be relied upon as a promise or representation as to the future.

8.11 **Risks associated with internet-trading and distributed ledger networks:** There are risks associated with utilizing an internet-based system, such as the Digital Assets Services, including, but not limited to, the failure of hardware, software, internet connections and distributed ledger networks. Communications over the Internet may be subject to interruption, transmission blackout, delayed transmission due to Internet traffic, or incorrect data transmission due to the public nature of the Internet. Please exercise caution, and confirm any relevant details/communications by other means if you have any doubt about the accuracy of this communication. As we do not control the reliability or availability of the internet or of any distributed ledger network, we cannot be responsible for communication failures, distortions or delays when operating via the Internet.

8.12 **No third-party affiliation or endorsements:** References in the Platform or through the Digital Assets Services to specific companies and platforms are for illustrative purposes only. Except as expressly described on the Platform or otherwise notified in writing, the use of any company and/or platform names and trademarks does not imply an affiliation with, or endorsement by, any of those parties.

8.13 **Third Party Protocols:** You acknowledge and understand that, in connection with the Digital Asset Services, the Platform deploys your digital assets to third-party decentralized protocols to facilitate your allocation of assets to third-party protocols and that Exactly is not responsible or liable for these transactions or the operation of third-party protocols.

8.14 **Restrict access.** You agree that we have the right to restrict your access to the Platform and the Digital Assets Services via any technically available methods if we suspect, in our sole discretion, that (a) you are using the Platform or the Digital Assets Services for money laundering or any illegal activity; (b) you have engaged in fraudulent activity; (c) you have acquired cryptoassets using inappropriate methods, including the use of stolen funds to purchase such assets; (d) you are the target of any sanctions administered or enforced by the U.S. Department of the Treasury’s Office of Foreign Assets Control (“OFAC”), the United Nations Security Council, the European Union, Her Majesty’s Treasury, or any other legal or regulatory authority in any applicable jurisdiction; (e) either you, as an individual or an entity, or your wallet address is listed on the Specially Designated Nationals and Blocked Persons List (“SDN List”), Consolidated Sanctions List (“Non-SDN Lists), or any other sanctions lists administered by OFAC; (f) you are located, organized, or resident in a country or territory that is, or whose government is, the subject of sanctions, including but not limited to Côte d’Ivoire, Cuba, Belarus, Iran, Iraq, Liberia, North Korea, Sudan, and Syria; or (g) you have otherwise acted in violation of these Terms. If we have a reasonable suspicion that you are utilizing the Site for illegal purposes, we reserve the right to take whatever action we deem appropriate.

**9. DISCLOSURE AND DISCLAIMER.**

THE COMPANY IS A DEVELOPER OF OPEN-SOURCE SOFTWARE AND HAS NO OVERSIGHT, INVOLVEMENT, OR CONTROL WITH RESPECT TO YOUR TRANSACTIONS, WHICH ARE EXECUTED THROUGH THIRD-PARTY PROTOCOLS AND THE OP MAINNET BLOCKCHAIN. THE PROTOCOL OF THE PLATFORM IS AN AUTONOMOUS DECENTRALIZED WEB PROTOCOL DEPLOYED TO THE OP MAINNET BLOCKCHAIN THAT OPERATES IN A DISINTERMEDIATED FASHION, AND, AS SUCH, EXACTLY DOES NOT PARTICIPATE IN ANY OF THESE TRANSACTIONS. IN EACH INSTANCE, WHEN YOU INTERACT WITH THE PLATFORM, YOU ARE INTERACTING WITH A SMART CONTRACT THAT DEPLOYS YOUR DIGITAL ASSETS TO A THIRD-PARTY PROTOCOL.

YOU ARE RESPONSIBLE FOR COMPLYING WITH ALL LAWS AND REGULATIONS APPLICABLE TO YOUR TRANSACTIONS, INCLUDING, BUT NOT LIMITED TO, THE COMMODITY EXCHANGE ACT AND THE REGULATIONS PROMULGATED THEREUNDER BY THE U.S. COMMODITY FUTURES TRADING COMMISSION (CFTC), AND THE FEDERAL SECURITIES LAWS AND THE REGULATIONS PROMULGATED THEREUNDER BY THE U.S. SECURITIES AND EXCHANGE COMMISSION (SEC), OR OTHER REGULATORY AGENCIES IN THE U.S. OR OTHER JURISDICTIONS.

YOU UNDERSTAND THAT THE COMPANY IS NOT REGISTERED OR LICENSED BY THE CFTC, SEC, THE FINANCIAL CRIMES ENFORCEMENT NETWORK OR ANY FINANCIAL REGULATORY AUTHORITY. NO FINANCIAL REGULATORY AUTHORITY HAS REVIEWED OR APPROVED THE USE OF THE PLATFORM OR THE DIGITAL ASSETS SERVICES. THE PLATFORM AND THE DIGITAL ASSETS SERVICES COULD BE IMPACTED BY ONE OR MORE REGULATORY INQUIRIES OR REGULATORY ACTION, WHICH COULD IMPEDE OR LIMIT THE ABILITY TO CONTINUE TO DEVELOP, OR WHICH COULD IMPEDE OR LIMIT YOUR ABILITY TO ACCESS OR USE THE PLATFORM OR THE DIGITAL ASSETS SERVICES, INCLUDING ACCESS TO YOUR FUNDS. NEITHER THE PLATFORM NOR THE DIGITAL ASSETS SERVICES CONSTITUTE ADVICE OR A RECOMMENDATION CONCERNING ANY ASSET. EXACTLY IS NOT ACTING AS AN INVESTMENT ADVISER, FINANCIAL SERVICES ADVISOR, COMMODITY TRADING ADVISER TO ANY PERSON.

THE COMPANY DOES NOT OWN OR CONTROL THE UNDERLYING SOFTWARE PROTOCOLS THAT ENABLE THE PLATFORM TO FUNCTION. THE UNDERLYING PROTOCOLS OF THE PLATFORM ARE OPEN-SOURCE SOFTWARE, AND ANYONE CAN USE, COPY, MODIFY, AND DISTRIBUTE THEM. ADDITIONALLY, THE UNDERLYING PROTOCOLS ARE SUBJECT TO SUDDEN CHANGES IN OPERATING RULES (KNOWN AS “FORKS”) AND SUCH FORKS MAY MATERIALLY AFFECT THE PLATFORM. EXACTLY IS NOT RESPONSIBLE FOR OPERATION OF THE UNDERLYING PROTOCOLS, AND EXACTLY MAKES NO GUARANTEE OF THEIR FUNCTIONALITY, SECURITY, OR AVAILABILITY.

YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE DIGITAL ASSET SERVICES IS AT YOUR SOLE RISK. THE COMPANY AND ALL PERSONS, ENTITIES, AGENTS, AND VOLUNTEERS INVOLVED WITH THE CREATION OF THE PLATFORM AND THE DIGITAL ASSETS SERVICES ("AFFILIATES") MAKE NO AND EXPRESSLY DISCLAIM ALL REPRESENTATIONS AND WARRANTIES, EXPRESS, IMPLIED OR STATUTORY; AND WITH RESPECT TO THE DIGITAL ASSETS SERVICES, THE COMPANY, THE AFFILIATES AND ALL RELATED ENTITIES AND AGENTS SPECIFICALLY DO NOT REPRESENT AND WARRANT AND EXPRESSLY DISCLAIM ANY REPRESENTATION OR WARRANTY, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION, ANY REPRESENTATIONS OR WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, USAGE, SECURITY, SUITABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE, OR AS TO THE WORKMANSHIP OR TECHNICAL CODING THEREOF, OR THE ABSENCE OF ANY DEFECTS THEREIN, WHETHER LATENT OR PATENT. THE COMPANY, THE AFFILIATES OR ANY RELATED ENTITIES OR AGENTS DO NOT REPRESENT OR WARRANT THAT THE DIGITAL ASSETS SERVICES AND ANY RELATED INFORMATION ARE ACCURATE, COMPLETE, RELIABLE, CURRENT OR ERROR-FREE.

TO THE FULLEST EXTENT PERMITTED BY LAW AND NOTWITHSTANDING ANY OTHER PROVISION OF THIS AGREEMENT OR ANY OTHER AGREEMENT CONTEMPLATED HEREIN OR APPLICABLE PROVISIONS OF LAW OR EQUITY OR OTHERWISE, THE PARTIES HEREBY AGREE TO ELIMINATE ANY AND ALL FIDUCIARY DUTIES THAT THE COMPANY, THE AFFILIATES OR ANY RELATED ENTITIES AND AGENTS MAY HAVE TO THE USER, ITS AFFILIATES, OR THE END USERS OF THE DIGITAL ASSETS SERVICES, THE PLATFORM, THE UNDERLYING PROTOCOLS OR ITS CONTENT.

YOU ACKNOWLEDGE THAT YOUR DATA ON THE PLATFORM MAY BECOME IRRETRIEVABLY LOST OR CORRUPTED OR TEMPORARILY UNAVAILABLE DUE TO A VARIETY OF CAUSES, AND AGREE THAT, TO THE MAXIMUM EXTENT PERMITTED UNDER APPLICABLE LAW, WE WILL NOT BE LIABLE FOR ANY LOSS OR DAMAGE CAUSED BY DENIAL-OF-SERVICE ATTACKS, SOFTWARE FAILURES, VIRUSES OR OTHER TECHNOLOGICALLY HARMFUL MATERIALS (INCLUDING THOSE WHICH MAY INFECT YOUR COMPUTER EQUIPMENT), OPEN SOURCE PROTOCOL CHANGES BY THIRD PARTY PROVIDERS, INTERNET OUTAGES, OR SCHEDULED OR UNSCHEDULED MAINTENANCE.

**10. LIMITATION OF LIABILITY.**

YOU ACKNOWLEDGE AND AGREE THAT YOU ASSUME FULL RESPONSIBILITY FOR YOUR USE OF THE PLATFORM AND DIGITAL ASSET SERVICES. YOU ACKNOWLEDGE AND AGREE THAT ANY INFORMATION YOU SEND OR RECEIVE DURING YOUR USE OF THE PLATFORM AND DIGITAL ASSET SERVICES MAY NOT BE SECURE AND MAY BE INTERCEPTED OR LATER ACQUIRED BY UNAUTHORIZED PARTIES. YOU ACKNOWLEDGE AND AGREE THAT YOUR USE OF THE PLATFORM AND DIGITAL ASSET SERVICES IS AT YOUR OWN RISK. RECOGNIZING SUCH, YOU UNDERSTAND AND AGREE THAT, TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, NEITHER THE COMPANY NOR ANY RELATED ENTITIES, SUPPLIERS OR LICENSORS WILL BE LIABLE TO YOU FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY OR OTHER DAMAGES OF ANY KIND, INCLUDING WITHOUT LIMITATION DAMAGES FOR LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER TANGIBLE OR INTANGIBLE LOSSES OR ANY OTHER DAMAGES BASED ON CONTRACT, TORT, STRICT LIABILITY OR ANY OTHER THEORY (EVEN IF ANY OF THE COMPANY OR RELATED ENTITIES HAD BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES), RESULTING FROM THE PLATFORM OR THE DIGITAL ASSETS SERVICES; THE USE OR THE INABILITY TO USE THE PLATFORM OR THE DIGITAL ASSETS SERVICES; UNAUTHORIZED ACCESS TO OR ALTERATION OF YOUR TRANSMISSIONS OR DATA; STATEMENTS OR CONDUCT OF ANY THIRD PARTY ON THE PLATFORM OR THE DIGITAL ASSETS SERVICES; ANY ACTIONS WE TAKE OR FAIL TO TAKE AS A RESULT OF COMMUNICATIONS YOU SEND TO US; HUMAN ERRORS; TECHNICAL MALFUNCTIONS; FAILURES, INCLUDING PUBLIC UTILITY OR TELEPHONE OUTAGES; OMISSIONS, INTERRUPTIONS, LATENCY, DELETIONS OR DEFECTS OF ANY DEVICE OR NETWORK, PROVIDERS, OR SOFTWARE (INCLUDING, BUT NOT LIMITED TO, THOSE THAT DO NOT PERMIT PARTICIPATION IN THE DIGITAL ASSETS SERVICES); ANY INJURY OR DAMAGE TO COMPUTER EQUIPMENT; INABILITY TO FULLY ACCESS THE PLATFORM OR THE DIGITAL ASSETS SERVICES OR ANY OTHER PLATFORM; THEFT, TAMPERING, DESTRUCTION, OR UNAUTHORIZED ACCESS TO, IMAGES OR OTHER CONTENT OF ANY KIND; DATA THAT IS PROCESSED LATE OR INCORRECTLY OR IS INCOMPLETE OR LOST; TYPOGRAPHICAL, PRINTING OR OTHER ERRORS, OR ANY COMBINATION THEREOF; OR ANY OTHER MATTER RELATING TO THE PLATFORM OR THE DIGITAL ASSETS SERVICES.

NOTWITHSTANDING THE ABOVE, IN NO EVENT SHALL OUR AGGREGATE LIABILITY (TOGETHER WITH OUR AFFILIATES, INCLUDING OUR AND OUR AFFILIATES’ RESPECTIVE SHAREHOLDERS, MEMBERS, DIRECTORS, OFFICERS, EMPLOYEES, ATTORNEYS, AGENTS, REPRESENTATIVES, SUPPLIERS OR CONTRACTORS) ARISING OUT OF OR IN CONNECTION WITH THE PLATFORM OR THE DIGITAL ASSETS SERVICES (AND ANY OF THEIR CONTENT AND FUNCTIONALITY), ANY PERFORMANCE OR NON-PERFORMANCE OF THE PLATFORM OR THE DIGITAL ASSETS SERVICES OR ANY OTHER PRODUCT, SERVICE OR OTHER ITEM PROVIDED BY OR ON BEHALF OF US, WHETHER UNDER CONTRACT, TORT (INCLUDING NEGLIGENCE), CIVIL LIABILITY, STATUTE, STRICT LIABILITY OR OTHER THEORY OF LIABILITY EXCEED THE GREATER OF (A) AMOUNT OF FEES PAID BY YOU TO US UNDER THESE TERMS, IF ANY, IN THE TWELVE (12) MONTH PERIOD IMMEDIATELY PRECEDING THE EVENT GIVING RISE TO THE CLAIM FOR LIABILITY AND (B) $1,000.

**11. INDEMNITY.**

YOU AGREE TO RELEASE AND TO INDEMNIFY, DEFEND AND HOLD HARMLESS THE COMPANY, THE AFFILIATES AND ANY RELATED ENTITIES, AS WELL AS THE OFFICERS, DIRECTORS, EMPLOYEES, SHAREHOLDERS AND REPRESENTATIVES OF ANY OF THE FOREGOING ENTITIES, FROM AND AGAINST ANY AND ALL LOSSES, LIABILITIES, EXPENSES, DAMAGES, COSTS (INCLUDING ATTORNEYS' FEES, FEES OR PENALTIES IMPOSED BY ANY REGULATORY AUTHORITY AND COURT COSTS) CLAIMS OR ACTIONS OF ANY KIND WHATSOEVER ARISING OR RESULTING FROM YOUR USE OF THE DIGITAL ASSETS SERVICES, YOUR VIOLATION OF THESE TERMS, YOUR VIOLATION OF ANY LAW, RULE, OR REGULATION, OR THE RIGHTS OF ANY THIRD PARTY, AND/OR ANY OF YOUR ACTS OR OMISSIONS. EACH OF THE COMPANY AND THE AFFILIATES RESERVE THE RIGHT, AT ITS OWN EXPENSE, TO ASSUME EXCLUSIVE DEFENSE AND CONTROL OF ANY MATTER OTHERWISE SUBJECT TO INDEMNIFICATION BY YOU AND, IN SUCH CASE, YOU AGREE TO COOPERATE WITH THE COMPANY AND/OR THE AFFILIATES IN THE DEFENSE OF SUCH MATTER.

**12. TERMINATION AND SUSPENSION.**

12.1 We reserve the right at our own discretion to suspend the Digital Assets Services (either totally or in a part) and/or to prevent you from accessing and using the Platform and/or such Digital Assets Services. You acknowledge and agree that we may or may not be in a position to provide information to you about the reasons for such closure or suspension, and that such closure or suspension may limit your access to your cryptocurrency assets.

12.2 If you violate any provision of these Terms, your permission from us to use the Platform and the Digital Assets Services will terminate automatically. In addition, we may in our sole discretion suspend or terminate your access to the Platform or the Digital Assets Services at any time for any reason or no reason, with or without notice.

12.3 We will not be liable for any losses suffered by you resulting from any modification to the Platform or any of the Digital Assets Services or from any suspension or termination, for any reason, of your access to all or any portion of the Platform or the Digital Assets Services.

12.4 The following Sections of the Terms survive any termination of these Terms: 2, 3, 10, 11, 12, 13, 14, 15, 16, 17, and 18.

**13. MODIFICATION OF TERMS OF USE.**

These Terms may be discretionarily modified or replaced at any time, unless stated otherwise herein. The most current version of these Terms will be posted on the Platform with the "Last Revised" date at the top of the Terms changed. Any changes or modifications will be effective immediately upon posting the revisions to the Platform. You shall be responsible for reviewing and becoming familiar with any such modifications. You waive any right you may have to receive specific notice of such changes or modifications. Use of the Digital Assets Services by you after any modification to the Terms constitutes your acceptance of the Terms as modified. If you do not agree to the Terms in effect when you access or use the Digital Asset Services, you must stop using the Digital Assets Services.

**14. NO WAIVER AND SEVERABILITY.**

14.1 Any right or remedy of Exactly set forth in these Terms is in addition to, and not in lieu of, any other right or remedy whether described in these Terms, under applicable law, at law or in equity. If any of these Terms is determined to be illegal, invalid or otherwise unenforceable, then to the extent and within the jurisdiction in which that term is illegal, invalid or unenforceable, it will be severed and deleted from these Terms and the remaining Terms will survive, remain in full force and effect and continue to be binding and enforceable.

14.2 Where applicable, the Company’s failure, delay or neglect in exercising any right, power, privilege, election or discretion under these Terms shall not operate as a waiver thereof.

**15. FORCE MAJEURE.**

Exactly shall not be liable or responsible for any failure, delay in performance of the Platform or the Digital Assets Services, or any loss caused you may incur, due to force majeure, riot, war or natural events or due to other occurrences for which Exactly is not responsible (e.g. strike, lock-out, traffic hold-ups, epidemics, access by third parties (external cyberattacks, unauthorized or fraudulent use of the Platform or the Digital Assets Services), administrative acts of domestic or foreign high authorities).

**16. STATUTE OF LIMITATIONS.**

You agree that regardless of any statute or law to the contrary, any claim or cause of action arising out of or related to the use of the Digital Assets Services or the Terms must be filed within one (1) year after such claim or cause of action arose; otherwise, these shall be deemed as forever barred.

**17. GOVERNING LAW.**

These Terms are governed by the laws in force in British Virgin Island, without regard to the provisions of conflict of law.

**18. DISPUTE RESOLUTION AND ARBITRATION.**

18.1 PLEASE READ THE FOLLOWING SECTION CAREFULLY BECAUSE IT REQUIRES YOU TO SUBMIT TO BINDING ARBITRATION (JURY TRIAL WAIVER) OF ANY AND ALL DISPUTES WITH EXACTLY AND LIMITS THE MANNER IN WHICH YOU CAN SEEK RELIEF FROM EXACTLY (NO CLASS ARBITRATIONS, CLASS ACTIONS OR REPRESENTATIVE ACTIONS OR ARBITRATIONS).

18.2 You and Exactly agree to waive any right to a jury trial, or the right to have any dispute resolved in any court, and instead accept the use of binding arbitration.

18.3 You and Exactly agree that any dispute is personal to you and Exactly, and that any dispute shall only be resolved by an individual arbitration and shall not be brought as a class arbitration, a class action, or any other representative proceeding. Neither party agrees to class arbitration, or an arbitration where a person brings a dispute as a representative of any other person or persons.

18.4 Any dispute, controversy, difference or claim arising out of or relating to these Terms, including the existence, validity, interpretation, performance, breach or termination thereof or any dispute regarding non-contractual obligations arising out of or relating to these Terms will be referred to and finally resolved by arbitration under the Rules of Arbitration of the International Chamber of Commerce by three arbitrators appointed in accordance with said Rules. The arbitration proceedings shall be conducted in the English language and the seat of the arbitration shall be the British Virgin Islands. The arbitrators appointed in connection herewith shall be knowledgeable in the laws of the British Virgin Islands and crypto-economy matters. Such arbitrators must also be fluent in the English language. All submissions and awards in relation to arbitration under these Terms shall be made in English, and all arbitration proceedings and all pleadings shall be in English. Any award shall be final and not subject to appeal and the parties waive all rights to challenge any award of the arbitrators under this Section. Any award may be entered or presented by any of the parties for enforcement in any court of competent jurisdiction sitting in the British Virgin Islands, and the parties hereby consent to the jurisdiction of such court solely for purposes of enforcement of any award.

**19 ASSIGNABILITY AND THIRD-PARTY BENEFICIARIES.**

19.1 You shall not assign or transfer any rights or obligations under these Terms or the Platform or the Digital Assets Services, without our written consent, including by operation of law. We may assign of transfer any of our rights and obligations under these terms, in whole or in part, without prior notice or approval of any party.

19.2 Unless expressly provided in these Terms, there shall be no third-party beneficiaries.

**20. ENTIRE AGREEMENT.**

20.1 Upon your acceptance, these Terms, together with the Privacy Policy, will constitute the entire agreement between you and the Company and supersede any prior agreement or document regarding the Platform and the Digital Assets Services. All other information provided on the Platform or oral/written statements made are provided for guidance only and does not constitute a legal agreement between you and the Company.

20.2 Notwithstanding the foregoing, these Terms are to be read in conjunction with (and subject to) any other policies, country or service annexes, where applicable, that may be published by Exactly in the Platform from time to time.

20.3 In case of conflict between the English version of these Terms and any version in other language, the English version shall prevail.

20.4 Any headings are for convenience and shall not limit or construe any of the rights and obligations set forth herein.

**21. QUESTIONS?**

If you have any questions in relation to these Terms, please contact us at [legal@exact.ly](https://exact.ly/tos/legal@exact.ly) before accessing or using the Platform or the Digital Assets Services.


# Privacy Policy

This privacy policy (the "**Privacy Policy**") sets out the different areas where user's privacy is concerned and outlines how **EXACTLY.**, a company incorporated under the laws of British Virgin Islands (the “**Company**” or “**Exactly**”) recollects and uses personal data of users (“**Users**”) for the use of its Platform (as defined in our terms and conditions). Furthermore, this Privacy Policy explains the way the Company processes, stores and protects user data and information.

The purpose of our Platform is primarily to enable registered users to carry out certain transactions involving digital assets, including but not limited to digital loans and credit products (“**Digital Assets Services**”).

Exactly approach to Users’ privacy is to ensure that all the necessary steps are taken to protect the privacy of its Users.

Please read this carefully as this Privacy Policy is legally binding when you use the Platform.

As used in this Privacy Policy, "we", "us" or "our" refers to the Company. You can contact us with any request relating to this Privacy Policy via the contact details provided below.

**1. DATA PROCESSING IN CONNECTION WITH THE PLATFORM**

**1.1 Collect of Information**

We collect information about you when you: (i) operate and/or upload information while using our Platform; and/or (ii ) Contact us either through our Platform or through other direct means of electronic communication (including but not limited to our Discord and/or Telegram channel and our Twitter).

**1.2 Information that we collect**

We get information about you in a range of ways:

* **Information You Give Us**. Information we collect directly from you from your interaction with our Platform and the Digital Assets Services, includes:
  * Some information of the transactions you made within the Platform (including but not limited to financial information);
  * Your Wallet address that will be published in the blockchain and the smart contract.
  * Your geographical region (if applicable);
  * Feedback and correspondence, such as information you provide in your responses to surveys, when you participate in market research activities, report a problem with Digital Asset Services, receive customer support or otherwise correspond with us;
  * Usage information, such as information about how you use our Platform and you interact with us;
  * Marketing information, such as your preferences for receiving marketing communications and details about how you engage with them.
* **Information Automatically Collected**. We may automatically record certain information about how you use our Platform and the Digital Assets Services (we refer to this information as “**Log Data**”). Log Data may include information such as a user’s Internet Protocol (IP) address, device and browser type, operating system, your location; time, date and duration of your visit to our Platform, previous visits to our Platform, the features of our Platform you browsed and the time spent on those features, the frequency with which you use the Platform, search terms, the links on our Platform that you clicked on or used, and other statistics. We use this information to administer our Platform and the Digital Asset Services and we analyze (and may engage third parties to analyze) this information to improve and enhance our Platform and Digital Asset Services by expanding its features and functionality and tailoring it to our Users’ needs and preferences.

**1.3 Use of your personal data**

We use Personal Data about you in connection with the following purposes:

* **To provide the Digital Asset Services:**
  * To provide and deliver the Digital Asset Services you may request, this includes administering your account with us, verifying and carrying out transactions and notifying you about changes to our Platform and services.
  * To send you information, including confirmations, technical notices, updates, security alerts, and support and administrative messages.
* **Sites and Services improvements:**
  * To ensure that content from our Platform and other online presences are presented in the most effective manner to you;
  * To administer our Platform, and other online presences, for internal business administration and operations, including troubleshooting, data analysis, testing, research, statistical and survey purposes; and
  * As part of our efforts to keep our Platform safe and secure.
  * To optimize your user experience, this includes, operate, maintain, and improve our Platform and services.
  * To create reports, analysis, or similar services for the purposes of research or business intelligence to improve our Platform and services.

**1.4 Use of Cookies and Similar Technologies**

The Platform may use cookies in accordance with our [Cookies Policy](/legal/cookies-policy). The Cookies Policy is part of this Privacy Policy and will be considered accepted with any use of our Platform.

If you would like information about how we may use cookies and similar devices, we recommend you consult the [Cookies Policy](/legal/cookies-policy).

**1.5 Your inquiries**

For any queries you may contact us by e-mail to the following e-mail address: <legal@exact.ly>. We use the data that you provide in an email to us, which you may give voluntarily, only in order to answer your contact question or to reply to your email in the best possible manner.

**2. YOUR RIGHTS**

You have the following rights regarding your personal data:

1. **Access**: to obtain free information about your personal data processed at any time and a copy of this information.
2. **Correct**: to obtain from us, without undue delay, the rectification of inaccurate personal data concerning you.
3. **Delete**: to obtain from us the erasure of personal data concerning you as soon as possible.
4. **Restrict**: in certain circumstances, to obtain from the Company restriction of processing your personal data.
5. **Object**: to object, on grounds relating to your particular situation, at any time, to the processing of personal data concerning you.
6. **Withdraw**: to withdraw your consent to processing your personal data at any time.
7. **Opt-out**: stop sending you direct marketing communications which you have previously consented to receive. We may continue to send you Service-related and other non-marketing communications.

For purposes of exercising such rights please contact by email to <legal@exact.ly>. We may request specific information from you to help us confirm your identity and process your request. Applicable law may require or permit us to decline your request. If we decline your request, we will tell you why, subject to legal restrictions.

If you would like to submit a complaint about our use of your personal data or response to your requests regarding your personal data, you may contact us at <legal@exact.ly> or submit a complaint to the data protection regulator in your jurisdiction.

**3. INTERNATIONAL TRANSFERS**

We are entitled to transfer your personal data to third parties abroad for the purposes of the data processing. The data that we collect from you may be transferred to, and stored at, a destination outside the British Virgin Islands, including without limitation the United States of America or any other country that may not offer an adequate level of data protection. The transfer shall be made on the basis of a previous agreement with the third-party processor. Users hereby consent to the international transfer of data as provided above.

**4. DATA SECURITY**

We use appropriate technical and organizational security measures to protect your personal data. Our security measures are continuously being improved in line with technical developments.

Please note that any data transmission on the Internet (e.g. communication by e-mail) is generally not secure and we accept no liability for data transmitted to us via the Internet.

Unfortunately, absolute protection is not technically possible. This information does not apply to the websites of third parties and the corresponding links given on the Platform. We assume no responsibility and liability for these.

**5. DURATION OF DATA PROCESSING**

We retain your personal data only for as long as is necessary for the purposes for which we process the information as set out in this Privacy Policy. Records can be held on a variety of media (physical or electronic) and formats.

Retention periods are determined based on the type of record, the nature of the record and activity and the legal or regulatory requirements that apply to those records. However, we may retain your personal data for a longer period of time where such retention is necessary for compliance with a legal obligation to which we are subject, or in order to protect your vital interests or the vital interests of another natural person or where we have a legitimate interest to do so.

**6. SHARING YOUR PERSONAL DATA**

We may pass your information to our related entities, affiliates, administration centers, third party service providers, agents, subcontractors and other associated organizations for the purposes of completing tasks and providing our services to you.

When we use any other third party service providers, we will disclose only the personal data that is necessary to deliver the service required and we will ensure that they keep your information secure and not to use it for their own purposes.

In addition, we may transfer your personal data to a third party as part of a sale of some, or all, of our business and assets or as part of any business restructuring or reorganization, or if we are under a duty to disclose or share your personal data in order to comply with any legal obligation. However, we will take steps to ensure that your privacy rights continue to be protected.

**7. AMENDMENTS TO THIS POLICY**

We may amend this Privacy Policy at any time by posting the amended version on the Platform including the effective date of the amended version. The current version of the Privacy Policy, as published on the Platform, is applicable.

**8. CONTACT**

Please contact us with questions, comments, or concerns regarding our Privacy Policy as well as with any requests at <legal@exact.ly>.


# Cookies Policy

**1. What About Cookies and Other Identifiers?**

When you use our Platform, our website <https://exact.ly/> (“**Website**”) or the Digital Asset Services (as defined in our [terms and conditions](/legal/terms-and-conditions-of-use)), we may make use of the standard practice of placing tiny data files called cookies and similar tools as flash cookies, pixel tags, or other tracking tools (hereinafter “**Cookies**”) on your computer or other electronic devices used when engaging with us so we can make improvements to the Platform and the Digital Asset Services. For avoidance of any doubts, capitalized terms not otherwise defined herein shall have the meaning set forth on our terms and conditions and/or our privacy policy.

**2. Operator**

Exactly, is the operator of the Platform and acts as a central point of contact for all issues concerning Cookies on the Platform and our Website.

If you have any questions in connection with Cookies on our Platform and/or our Website or the processing of your personal data, you can contact our privacy team: <legal@exact.ly>.

Please note that for certain requests we may require further identification data from you in order to ensure that your personal data is only shared with you.

**3. What are Cookies?**

Cookies are small text files that are placed on your computer or electronic devices by websites or platforms that you visit. They are widely used in order to make websites or platforms work, or work more efficiently, as well as to provide information to the owners of a site or platforms. Cookies are typically stored on your computer's hard drive or electronic device.

Cookies do not transfer viruses or malware to your computer, because the data in a Cookie does not change when it travels back and forth, it has no way to affect how your computer or electronic device runs. Instead they act more like logs (i.e. they record user activity and remember stateful information), and get updated every time you visit a website or platform.

We may obtain information about you by accessing Cookies sent by our Platform.

**4. What Cookies do we use**

We use Cookies set by ourselves via our web developers (first-party Cookies). We only have those set by others (third-party Cookies). Cookies are also sometimes classified by reference to their purpose. We use the following Cookies for the following purposes:

Analytical/performance Cookies

They allow us to recognize and count the number of visitors and to see how visitors move around our Website or our Platform when they are using those, as well as dates and times they visit. This helps us to improve the way our Website and Platform work, for example, by ensuring that users are finding what they are looking for easily.

Targeting Cookies

These Cookies record your visit to our Website and our Platform, the pages you have visited and the links you have followed, as well as time spent on our Website or our Platform, and the websites visited just before and just after our website. We will use this information to make the advertising displayed on our Platform and Website more relevant to your interests. We may also share this information with third parties for this purpose.

Other technologies

In general, we use Cookies and other technologies (such as web server logs) on our Website and Platform to enhance your experience and to collect information about how our services are used. This information is put together (‘aggregated’) and provides general and not individually specific information. None of this information is therefore associated with you as an individual and the Cookie-related information is not used to identify you personally. It is therefore anonymised and ‘de-identified’. The pattern data is fully under our control and these Cookies are not used for any purpose other than those described here.

Pixels tags

Pixel tags (which are also called clear GIFs, web beacons, or pixels) are small pieces of code that can be embedded on websites and emails. Pixels tags may be used to learn how you interact with our website pages and emails, and this information helps us, and our partners provide you with a more tailored experience.

Device Identifiers

A device identifier is a unique label can be used to identify a mobile device. Device identifiers may be used to track, analyse and improve the performance of the Website, our Platform and ads delivered.

Third party services

We may allow others to provide analytics services on our behalf. In addition to the uses of Cookies described above, these entities may use other methods, such as the technologies described below, to collect information about your use of our Website, the Platform and other websites and online services.

We may also use other services, such as Google Analytics (described below) or other third-party Cookies, to assist with analysing performance on our Website and our Platform.

**5. What data is collected and why?**

We, as well as third parties (as part of providing their services to us) may use Cookies and the technologies described in this Cookie Policy to collect and store information about your device, such as:

* the date and time you access our Website and Platform
* the internet address linking to our Website and Platform
* pages visited
* time spent on each page of our website
* links clicked and conversion information
* browser
* mobile network information
* type of operating system used
* the IP and logical address of the server you are using (but the last digits are anonymised so we cannot identify you)
* the top-level domain name from which you access the internet (for example .ie, .com, etc.)

We will retain and evaluate information on your recent visits to our Website and Platform and how you move around different sections of our Website and Platform for analytics purposes, to improve our services and the way we market our business.

This information may also be used to help us to improve, administer and diagnose problems with our server, our Website or the Platform.

**6. Hyperlinks**

Our Platform, our Website and this Cookies Policy contain links to other websites and by clicking on the links you will be redirected to a website of a third-party over which we have no control. Therefore, we do not assume any liability for the content of such websites. The respective provider of the linked website is solely responsible for the content and correctness of the information provided there, as well as for the tracking and setting of Cookies by such websites.

**7. Manage Cookies**

You can delete Cookies any time you want by using the settings in our Website and Platform. You can also choose to disable Cookies from your electronic device, but this would mean that our Platform or our Website may not function properly for you.

Most browsers are initially set to accept Cookies. If you prefer, you can set your browser to refuse Cookies and control and/or delete Cookies as you wish – for details, see aboutcookies.org. You can delete all Cookies that are already on your device and you can set most browsers to prevent them from being placed. You should be aware that if you do this, you may have to manually adjust some preferences every time you visit an Internet site and some services and functionalities may not work if you do not accept the cookies they send.

**8. Third-party tools**

The following tools from third parties are implemented on our Platform and our Website, and therefore they might store Cookies on your devices or track your behavior when you visit us. Because of how Cookies and similar technologies work, we cannot access data collected by third-party Cookies, nor can other companies or persons access the data generated by such tools. Furthermore, not all tracking functions of third-party tools can be controlled by us. Therefore, we do not assume any liability for any negative impact that you may incur through the use of your data by such third-party tools. All these providers are obliged to comply with the applicable data protection regulations.

We provide you in the following table with opt-out possibilities for such tools and you can therefore disable the setting of cookies and sharing your data.

| Tool             | Provider | Type of Cookies        | Policies - Opt-out Information             | Purpose                                                                                                                                                                                                                                                                                                                                                                                                                                                 | Duration   |
| ---------------- | -------- | ---------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| Google Analytics | Google   | “\_gat. \_anonymizeIp” | <https://tools.google.com/dlpage/gaoptout> | We use Google Analytics to analyze the use of our Platform. Google Analytics gathers information about platforms use by means of cookies. The information gathered relating to our Platform is used to create reports about the use of our Platform and marketing purposes. More information on how Google collects and processes data can be found here [www.google.com/policies/privacy/partners/](http://www.google.com/policies/privacy/partners/). | Persistent |

**9. Amendments to this Policy**

We may amend this Policy at any time by posting the amended version on the Platform including the effective date of the amended version. The current version of the Privacy Policy, as published on the Platform, is applicable


