Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hiring task: Create a price-based interest rate model #24

Open
nourharidy opened this issue Mar 10, 2022 · 3 comments
Open

Hiring task: Create a price-based interest rate model #24

nourharidy opened this issue Mar 10, 2022 · 3 comments

Comments

@nourharidy
Copy link
Member

Background

Currently, BaseJumpRateModelV2 is used to calculate interest rates for all Anchor markets based on borrowing utilization rate of the market liquidity.

However, unlike other assets on Anchor, DOLA is a stablecoin that's originally minted on Anchor. Interest rates should be set not based on liqudity utilization, but rather based on the DOLA's $1 USD peg. If DOLA is <$1, then DOLA supply should be reduced in order to meet the decrease in demand. Therefore, DOLA interest rate should rise in order to incentivize borrower repayments, reducing the supply in circulation. If DOLA is >$1, then supply should be increased in order to meet increased demand. Therefore, interest rates should be decreased in order to incentivize more borrows, expanding supply in circulation.

Right now, we use a contract called the Fed in order to mint or redeem DOLA in the Anchor DOLA market in order to increase or reduce the interest rate. However, this requires manual intervention by an operator who doesn't always respond to DOLA price changes in time.

Requirements

  • Create a new interest rate model contract by forking BaseJumpRateModelV2 into your own private repo and invite me as a collaborator.
  • Any changes to the contract should respect the interface of InterestRateModel.
  • Instead of calculating borrow rate based on utilization, the borrow rate should be a fixed value baseRate provided by the owner in the constructor and can be changed using a setter function.
  • add an updateRate() function that is callable by anyone.
    • If DOLA price is under a negativeDepegThreshold price, increase the borrow rate by a fixed value rateStep up to a maximum maxRate.
    • If DOLA price is above a positiveDepegThreshold price, decrease the borrow rate by the same rateStep down to a minimum minRate.
    • If DOLA price is between the two thresholds AND borrow rate is not equal to baseRate, decrease or increase the borrow rate to the direction of baseRate by rateStep e.g. if the borrow rate is higher than baseRate, the borrow rate would decrease by rateStep on each function call until it reaches baseRate.
    • The function should execute all the above logic only if the last time it was called is more than updateRateInterval seconds ago. However, it should NOT revert otherwise. This is in order to allow other contracts to call it without causing them to fail.
    • Every time the borrow rate changes, call cToken.accrueInterest() in order to update the market contract.
    • DOLA price should be fetched from a constructor-provided Chainlink feed contract. See IFeed interface here as an example.
    • All values above should be provided in the constructor and have their own setter functions each.
@tirtha4
Copy link

tirtha4 commented Mar 11, 2022

@nourharidy according to the requirements, getSupplyRate & getBorrowRate has no role. So is it okay to remove the unwanted functions & state vars from the forked BaseJumpRateModelV2.sol ?

  • Also the address for cToken will also be passed via constructor right? Is cToken the base contract for DOLA ? From where should I get the source code for cToken in order to instantiate and use within this contract?

@nourharidy
Copy link
Member Author

@nourharidy according to the requirements, getSupplyRate & getBorrowRate has no role. So is it okay to remove the unwanted functions & state vars from the forked BaseJumpRateModelV2.sol ?

  • Also the address for cToken will also be passed via constructor right? Is cToken the base contract for DOLA ? From where should I get the source code for cToken in order to instantiate and use within this contract?

According to the requirement, you have to respect the InterestRateModel interface (used by cTokens). It's ok to remove anything that is not in the interface.

cToken address should be passed yup. cToken contract is in this repo. However, you do not need to import it in your own code.

@noqcks
Copy link

noqcks commented Aug 12, 2022

Added you as a collaborator to my private repo noqcks/inv-hiring-task

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants