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

Block addqt above auction price #997

Merged
merged 17 commits into from
Dec 4, 2023

Conversation

mattcushman
Copy link
Contributor

@mattcushman mattcushman commented Dec 1, 2023

Description

Block adding/move quote token to buckets with price above any existing auction price.

Purpose

  • addQuoteToken() and moveQuoteToken() will now revert if the price of the target bucket exceeds the
    price of the liquidation at the head of the queue. Also, when auctions are added the queue, the
    threshold price is max-ed with the tail (if any), forcing that the threshold prices (and hence auction prices)
    are increasing.
    This prevents users from adding liquidity to a bucket and immediately arbTaking-ing an auction, eliminating
    attack and greifing vectors involving the bond payoffs and take penalties.

  • Solves what we internally have called Dmitrii - 9, an issue discovered by @dmitriia (although not eligible for the Sherlock report) ->

**Summary of the Vulnerability:**
The code outlines a scenario where a borrower can exploit the auction mechanism post-default to incur minimal penalties and unfairly benefit at the expense of the lender (kicker). This is achieved by the borrower exiting the auction early at an artificially high price, avoiding significant taker penalties, and causing collateral damage to the lender. The penalty paid by the borrower is negligible compared to the advantage gained, rendering the penalty almost irrelevant.

** Link an example of the issue: **
https://github.com/ajna-finance/contracts/pull/981/files#diff-e59157bfa5bad910c2f5c2a00cfba7d222f0ad6f1969eb5ab4b2fbd22903b951R212

**Sudo Code Representation of the Attack:**

1. Lender adds liquidity to the pool.

2. Borrower draws a large debt from the pool.

3. Time skip of 100 days.

4. Lender initiates a kick due to default.

5. Borrower exploits the situation by depositing into a high price bucket.

6. Borrower takes from the bucket, reducing their penalty significantly.

7. Borrower removes a large portion of the collateral at an inflated price.

8. Post-removal, the lender's position is significantly weakened, with minimal gains.

9. Borrower ends up with a minor loss in USDC and almost no loss in WETH.

10. Lender gains are marginal compared to the potential loss incurred.

**Analysis:**
- The borrower controls the collateral price, impacting the distribution between borrower and taker. However, when the borrower and taker are the same, the price becomes irrelevant.
- The taker penalty, which should be a deterrent, is reduced to an insignificant amount due to the borrower's control over the collateral price.
- The kicker (lender) faces a substantial loss of bond, while the borrower benefits by virtually eliminating the penalty at a negligible cost.
- The potential for this exploit increases if issue #16 mentioned is fixed, allowing borrowers to execute this strategy more easily and atomically.

This vulnerability creates an imbalance in the protocol, favoring borrowers who default and strategically manipulate the auction process, while significantly disadvantaging lenders who face the brunt of the collateral damage. The protocol needs to address this imbalance to ensure fair and secure interactions between all parties involved.

Impact

Tasks

  • Changes to protocol contracts are covered by unit tests executed by CI.
  • Protocol contract size limits have not been exceeded.
  • Gas consumption for impacted transactions have been compared with the target branch, and nontrivial changes cited in the Impact section above.
  • Scope labels have been assigned as appropriate.
  • Invariant tests have been manually executed as appropriate for the nature of the change.

@EdNoepel EdNoepel changed the base branch from develop to merge-rc9 December 1, 2023 18:03
@@ -621,101 +622,66 @@ contract ERC721PoolLiquidationsSettleAuctionTest is ERC721HelperContract {
})
);

_assertCollateralInvariants();
// _assertCollateralInvariants();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this commented?

@MikeHathaway MikeHathaway marked this pull request as ready for review December 4, 2023 14:51
t0Debt,
Maths.wmul(
inflator,
PRBMathUD60x18.exp((interestState_.interestRate * (block.timestamp - inflatorState_.inflatorUpdate)) / 365 days)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would a _pendingInflator internal function usage here be worthwhile?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is one on line 452. We cannot call it from the same library.

Copy link
Collaborator

@MikeHathaway MikeHathaway left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed a few small things, but otherwise LGTM

/**
* @notice Adding liquidity above current auction price.
*/
error AddAboveAuctionPrice();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: missing trailing blankline

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved -> d5d0ca7

t0Debt,
Maths.wmul(
inflator,
PRBMathUD60x18.exp((interestState_.interestRate * (block.timestamp - inflatorState_.inflatorUpdate)) / 365 days)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is one on line 452. We cannot call it from the same library.

Copy link
Contributor

@EdNoepel EdNoepel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would like the typographic issues resolved before merging.

@ith-harvey
Copy link
Contributor

Would like the typographic issues resolved before merging.

Think I got them all here -> d5d0ca7

Copy link
Contributor

@ith-harvey ith-harvey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ith-harvey ith-harvey merged commit 5a270be into merge-rc9 Dec 4, 2023
3 checks passed
@EdNoepel EdNoepel deleted the block-addqt-above-auction-price branch December 5, 2023 12:26
ith-harvey added a commit that referenced this pull request Dec 8, 2023
* Universal deposit fee (#983)

* charge fee on all deposit

* unit tests compile

* test harness updates

* working on ERC20PoolQuoteTokenTest

* removed deposit fee cap

* more work on ERC20PoolQuoteTokenTest

* do not charge deposit fee if moving liquidity to higher price

* Eliminate reserves bad debt allocation and add margin to TP  (#962)

* this underflows instead of giving expected revert

* move isCollateralized check after updating borrower collateral

* remove local calculation of encumbered collateral

* trying to properly fix testBorrowRepayPrecision

* resolve rounding issue in fuzz test

* testCollateralization improvements

* updated unit tests for new _collateralization implementation

* more collateralization tests

* Add 1.04 factor in borrower collateralization

* Update nptp ratio to '1 + sqrt(r)/2'

* Remove Settle debt with pool reserves

* Remove 0.995 factor from claimable reserves calculation

* Update bond factor calculation to minimum 0.005

* added testcase where debt exceeds deposit

* updated test so debt exceeds deposit

* allow  up to half of current orig fee to be used to settle bad debt

* updated testTakeAndSettle

* more test fixes

* Enabled settling with all reserves if
 Deposits.treeSum==0 or 72 hrs pass

* cleanup

* Half orig fee res | Matt example (#966)

* added Matts test as proof that attack no longer works on his branch

* Revert "Remove multicall from position manager (#948)" (#961)

This reverts commit f540c8a.

* added test testSpendOrigFeePushBadDebtToBorrowers test

* cleaned up testStealReservesWithMarginm to match minted balances

* responded to Matts comments

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Revert "Remove Settle debt with pool reserves"

This reverts commit 290d6cf.

* Update half origination fees reserves settlement time to 144 hours from kickTime

* Fix alignment and extra spaces

* Fix some unit tests

* PR feedback

* Update encumberance and collateralization method in poolInfoUtils

* Fix some unit tests

---------

Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Fix invariant setup

* Fix some unit tests

* ERC20PoolQuoteTokenTest updated

* updated ERC20PoolPurchaseQuoteTokenTest

* Fixed tests in ERC20PoolReserveAuction.t.sol

* updated ERC20PoolBorrowTest and ERC20PoolBorrowFuzzyTest

* Fix ERC20PoolCollateral and ERC20PoolInfoUtils tests

* Fixed ERC20 arbtake and depositTake tests

* Fix ERC20PoolLiquidationsKickTest, ERC20PoolLiquidationKickFuzzyTest and ERC20PoolLiquidationsLenderKickAuctionTest

* updated ERC20PoolMulticallTest

* cleaned up ERC20PoolDebtExceedsDepositTest

* fixed testTakeLoanColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosResidual

* fixed testTakeCallerColConstraintBpfNegResidual

* fixed testTakeLoanDebtConstraintBpfPosResidual

* fixed testTakeAndSettle

* cleaned up ERC20PoolDebtExceedsDepositTest

* updated ERC20PoolPrecisionTest

* Update ERC20PoolLiquidationsSettleTest

* Update ERC20PoolLiquidationsMisc

* Update ERC20PoolLiquidationSettleFuzzyTest

* Update ERC20PoolLiquidationTakeFuzzyTest

* fixeed revert tests

* ERC20PoolLiquidationsTake -- fixed rest

* Mh update tests (#985)

* fix most position manager tests

* fix additional pm tests

* fix rewards requiredCollateralRewards setup

* fix ClaimRewards tests

* update additional rewards manager tests

* fix additional tests

* more test fixes

* commit wip bankruptcy tests

* fixed testMoveLiquidityToOverwriteBankruptBucket

* fix additional tests

* fix testMoveLiquidityWithDebtInPool

* fix remaining rewards manager tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mwc <matt@ajna.finance>

* Add 1.04 factor in HTP calculations (#987)

* Add 1.04 factor in HTP calculations

* Add COLLATERALIZATION_FACTOR constant in PoolHelpers

* Add collateralization factor in dwatp

* Fix poolPricesInfo

* Update ERC20PoolBorrowFuzzyTest

* Fix some unit tests

* Fix some unit tests

* Fix some unit tests

* Update ERC20PoolTransferLPs

* fix most rewards manager tests

* update remaining rewards manager tests

* update ERC721SubsetPoolBorrowTest and commit wip changes to testMergeOrRemoveERC721Collateral

* updated testSettlePartialDebtSubsetPool (#988)

* updated testSettlePartialDebtSubsetPool

* re-added teardown

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fix ERC721PoolCollateral tests

* fix borrowRepayDebtFuzzy and additional PM tests

* cleaned up testBorrowAndRepayWith4DecimalQuote

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Fix some unit tests

* Deployment updates for RC8+ releases (#986)

* cherry-picked from master

* updated README

* Fix ERC721PoolLiquidationsTakeTest

* updated ERC721PoolReserveAuctionTest

* updated testMergeOrRemoveERC721Collateral (#989)

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* updated ERC721PoolPurchaseQuoteTest and fixed bug in ERC721 tearDown

* cleaned up testLiquidationLenderKickAuction, testLiquidationSingleBorrower, testSettleAuctionWithoutTakes

* updated testMoveLiquidityToOverwriteBankruptBucket

* updated PoolHelperTest

* cleaned up asserts in addLiquidity

* update testMoveLiquidityInBankruptBucket_LP_report_179_494

* updated ERC721PoolEMAsTest

* fixed testKickHighThresholdPriceBorrower

* updated testBorrowerInterestCalculationAfterRepayingAllDebtOnce and testBorrowerInterestCalculation

* updated testMultipleBorrowerInterestAccumulation

* Fix regression tests

* updated RE3, fixed _addQuoteToken

* addQuoteToken - return amount added (#993)

* addQuoteToken now returns amount added

* update unit tests to validate return values

* Fix up add liquidity (#992)

* cleaned up addLiquidity() method in ERC20PoolLiquidationsScaled.t.sol

* remove console

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fixed issue with test_regression_fenwick_index_2 in non-18-decimal env

* added regression tests for two failing reserves scenarios

* rename tests such that automake runs them with other regression tests

* UnboundedLiquidationPoolHandler bucketTake fix (#994)

* updated UnboundedLiquidationPoolHandler to handle compensated collateral in bucketTake

* cleanup, trap unhandled use case

* settle event now emits actual debt settled rather than t0 amount (#999)

* settle event now emits actual debt settled rather than t0 amount

* updated test_regression_settle_with_reserves

* Updated auctionInfo (#996)

* add thresholdPrice to auctionInfo; update test iterface usages

* temp fix tests

* remove unneeded comment

* Update auction status (#998)

* wip auction status update w/ stack too deep

* update auctionStatus; add auctionInfo method to poolInfoUtils

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* updated brownie tests, removed obsolete invariant tests (#1001)

* Block addqt above auction price (#997)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* added unit test showing adding qt above auction price reverts

* updated nit spellings

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Invariant testing fixes (#1006)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* documented a sample of invariant failures in regression tests

* added unit test showing adding qt above auction price reverts

* fixed _isCollateralized bug not returning true in all 0-debt use cases

* updated nit spellings

* fixed underflow calculating kicker reward

* _repayDebtByThirdParty should check for expected pool errors

* Round down when reward kicker, round up when kicker is penalized
Fix roundings in tests

* update test comments

* fix and enable A9 invariant

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* RC9 suggested improvements (#1005)

* Revert AuctionNotTakeable in same place, load auction kickTime only once from storage

* Calculate ERC721 collateralTaken only once
cosmetize code (read from result struct in local var and reuse)
Results in shrinking a little bit contract sizes

* Read borrower Np Tp ratio from storage only once when kick

* If block style, proper indentation

* Proposed changes to PR #972:
- avoid calculating current LUP twice in lender kick
- change _kick function to accept proposed LUP (for regular kick proposed LUP is current LUP, for lender kick proposed LUP is calculated based on additional debt)
- in both kick cases return current LUP in kick result
- reduce gas costs by saving a Fenwick traversal
- reduce contract size by removing LUP calculation within Pool

* Cosmetic flashloan code changes, PoolCommons.flashLoan doesn't return false but always reverts if flashloan fails

* PR#983 style, remove redundant line

* PR#999 suggested improvement - calculate current settled debt only once and include in settle result for state update

* PR #962 proposed changes:
- get Fenwick deposits only once when settle with reserves
- define constants for min bond factor and max npTp ratio values

* PR #987 proposed improvement:
- add and reuse _htp helper function (instead duplicated maths)

* Continuation of PR #962: (#1008)

- Record settle amount limmit in Liquidtion struct, at the time of kick (that is instead incrementing accumulator in Borrower struct, each time debt is drawn)
- This way accumulator will be reseted when auction is settled
- fix tests

TODO:
- assert Liquidation.t0ReserveSettleAmount in unit tests (_assertAuction), make sure is set to 0 after auction settled and decreased when partial settles done
- update invariant test to check new introduced accumulator

* Misc test fixes (#1009)

* handle another reward rounding error use case

* fix intermittant fuzz test failure - cannot draw debt from liquidity in bucket 7388

* PositionManager should expect AddAboveAuctionPrice, which can happen in moveLiquidity

* Invariant fix: round up quote tokens calculated from rewarded LP (because LP rewarded are calculated in bucketTake as rewarded quote tokens -> LP rounded down)

* Pr feedback

* Fix failing unit tests

---------

Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Prateek Gupta <prateek105@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: prateek105 <prateek@ajna.finance>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mattcushman <36414299+mattcushman@users.noreply.github.com>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
Copy link

@dmitriia dmitriia left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks ok. As discussed (per @mattcushman idea), it may be worth to remove some margin from auction price for the _revertIfAuctionPriceBelow() check, e.g. time can be used as a more universal metric (asset volatilities vary, but attacker's risk is basically proportional to the time of exposure):

https://github.com/ajna-finance/contracts/blob/83072b109a45e887f544458df80ef458ea907394/src/libraries/helpers/RevertsHelper.sol#L86-L94

    function _revertIfAuctionPriceBelow(
        ...
    ) view {
        address head = auctions_.head;
        if (head != address(0)) {
-           uint256 auctionPrice = _auctionPrice(auctions_.liquidations[head].referencePrice, auctions_.liquidations[head].kickTime);
+           uint256 auctionPrice = _auctionPrice(auctions_.liquidations[head].referencePrice, auctions_.liquidations[head].kickTime + 10 minutes);
            if (_priceAt(index_) >= auctionPrice) revert AddAboveAuctionPrice();
        }

MikeHathaway added a commit that referenced this pull request Dec 13, 2023
* Universal deposit fee (#983)

* charge fee on all deposit

* unit tests compile

* test harness updates

* working on ERC20PoolQuoteTokenTest

* removed deposit fee cap

* more work on ERC20PoolQuoteTokenTest

* do not charge deposit fee if moving liquidity to higher price

* Eliminate reserves bad debt allocation and add margin to TP  (#962)

* this underflows instead of giving expected revert

* move isCollateralized check after updating borrower collateral

* remove local calculation of encumbered collateral

* trying to properly fix testBorrowRepayPrecision

* resolve rounding issue in fuzz test

* testCollateralization improvements

* updated unit tests for new _collateralization implementation

* more collateralization tests

* Add 1.04 factor in borrower collateralization

* Update nptp ratio to '1 + sqrt(r)/2'

* Remove Settle debt with pool reserves

* Remove 0.995 factor from claimable reserves calculation

* Update bond factor calculation to minimum 0.005

* added testcase where debt exceeds deposit

* updated test so debt exceeds deposit

* allow  up to half of current orig fee to be used to settle bad debt

* updated testTakeAndSettle

* more test fixes

* Enabled settling with all reserves if
 Deposits.treeSum==0 or 72 hrs pass

* cleanup

* Half orig fee res | Matt example (#966)

* added Matts test as proof that attack no longer works on his branch

* Revert "Remove multicall from position manager (#948)" (#961)

This reverts commit f540c8a.

* added test testSpendOrigFeePushBadDebtToBorrowers test

* cleaned up testStealReservesWithMarginm to match minted balances

* responded to Matts comments

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Revert "Remove Settle debt with pool reserves"

This reverts commit 290d6cf.

* Update half origination fees reserves settlement time to 144 hours from kickTime

* Fix alignment and extra spaces

* Fix some unit tests

* PR feedback

* Update encumberance and collateralization method in poolInfoUtils

* Fix some unit tests

---------

Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Fix invariant setup

* Fix some unit tests

* ERC20PoolQuoteTokenTest updated

* updated ERC20PoolPurchaseQuoteTokenTest

* Fixed tests in ERC20PoolReserveAuction.t.sol

* updated ERC20PoolBorrowTest and ERC20PoolBorrowFuzzyTest

* Fix ERC20PoolCollateral and ERC20PoolInfoUtils tests

* Fixed ERC20 arbtake and depositTake tests

* Fix ERC20PoolLiquidationsKickTest, ERC20PoolLiquidationKickFuzzyTest and ERC20PoolLiquidationsLenderKickAuctionTest

* updated ERC20PoolMulticallTest

* cleaned up ERC20PoolDebtExceedsDepositTest

* fixed testTakeLoanColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosResidual

* fixed testTakeCallerColConstraintBpfNegResidual

* fixed testTakeLoanDebtConstraintBpfPosResidual

* fixed testTakeAndSettle

* cleaned up ERC20PoolDebtExceedsDepositTest

* updated ERC20PoolPrecisionTest

* Update ERC20PoolLiquidationsSettleTest

* Update ERC20PoolLiquidationsMisc

* Update ERC20PoolLiquidationSettleFuzzyTest

* Update ERC20PoolLiquidationTakeFuzzyTest

* fixeed revert tests

* ERC20PoolLiquidationsTake -- fixed rest

* Mh update tests (#985)

* fix most position manager tests

* fix additional pm tests

* fix rewards requiredCollateralRewards setup

* fix ClaimRewards tests

* update additional rewards manager tests

* fix additional tests

* more test fixes

* commit wip bankruptcy tests

* fixed testMoveLiquidityToOverwriteBankruptBucket

* fix additional tests

* fix testMoveLiquidityWithDebtInPool

* fix remaining rewards manager tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mwc <matt@ajna.finance>

* Add 1.04 factor in HTP calculations (#987)

* Add 1.04 factor in HTP calculations

* Add COLLATERALIZATION_FACTOR constant in PoolHelpers

* Add collateralization factor in dwatp

* Fix poolPricesInfo

* Update ERC20PoolBorrowFuzzyTest

* Fix some unit tests

* Fix some unit tests

* Fix some unit tests

* Update ERC20PoolTransferLPs

* fix most rewards manager tests

* update remaining rewards manager tests

* update ERC721SubsetPoolBorrowTest and commit wip changes to testMergeOrRemoveERC721Collateral

* updated testSettlePartialDebtSubsetPool (#988)

* updated testSettlePartialDebtSubsetPool

* re-added teardown

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fix ERC721PoolCollateral tests

* fix borrowRepayDebtFuzzy and additional PM tests

* cleaned up testBorrowAndRepayWith4DecimalQuote

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Fix some unit tests

* Deployment updates for RC8+ releases (#986)

* cherry-picked from master

* updated README

* Fix ERC721PoolLiquidationsTakeTest

* updated ERC721PoolReserveAuctionTest

* updated testMergeOrRemoveERC721Collateral (#989)

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* updated ERC721PoolPurchaseQuoteTest and fixed bug in ERC721 tearDown

* cleaned up testLiquidationLenderKickAuction, testLiquidationSingleBorrower, testSettleAuctionWithoutTakes

* updated testMoveLiquidityToOverwriteBankruptBucket

* updated PoolHelperTest

* cleaned up asserts in addLiquidity

* update testMoveLiquidityInBankruptBucket_LP_report_179_494

* updated ERC721PoolEMAsTest

* fixed testKickHighThresholdPriceBorrower

* updated testBorrowerInterestCalculationAfterRepayingAllDebtOnce and testBorrowerInterestCalculation

* updated testMultipleBorrowerInterestAccumulation

* Fix regression tests

* updated RE3, fixed _addQuoteToken

* addQuoteToken - return amount added (#993)

* addQuoteToken now returns amount added

* update unit tests to validate return values

* Fix up add liquidity (#992)

* cleaned up addLiquidity() method in ERC20PoolLiquidationsScaled.t.sol

* remove console

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fixed issue with test_regression_fenwick_index_2 in non-18-decimal env

* added regression tests for two failing reserves scenarios

* rename tests such that automake runs them with other regression tests

* UnboundedLiquidationPoolHandler bucketTake fix (#994)

* updated UnboundedLiquidationPoolHandler to handle compensated collateral in bucketTake

* cleanup, trap unhandled use case

* settle event now emits actual debt settled rather than t0 amount (#999)

* settle event now emits actual debt settled rather than t0 amount

* updated test_regression_settle_with_reserves

* Updated auctionInfo (#996)

* add thresholdPrice to auctionInfo; update test iterface usages

* temp fix tests

* remove unneeded comment

* Update auction status (#998)

* wip auction status update w/ stack too deep

* update auctionStatus; add auctionInfo method to poolInfoUtils

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* updated brownie tests, removed obsolete invariant tests (#1001)

* Block addqt above auction price (#997)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* added unit test showing adding qt above auction price reverts

* updated nit spellings

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Invariant testing fixes (#1006)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* documented a sample of invariant failures in regression tests

* added unit test showing adding qt above auction price reverts

* fixed _isCollateralized bug not returning true in all 0-debt use cases

* updated nit spellings

* fixed underflow calculating kicker reward

* _repayDebtByThirdParty should check for expected pool errors

* Round down when reward kicker, round up when kicker is penalized
Fix roundings in tests

* update test comments

* fix and enable A9 invariant

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* RC9 suggested improvements (#1005)

* Revert AuctionNotTakeable in same place, load auction kickTime only once from storage

* Calculate ERC721 collateralTaken only once
cosmetize code (read from result struct in local var and reuse)
Results in shrinking a little bit contract sizes

* Read borrower Np Tp ratio from storage only once when kick

* If block style, proper indentation

* Proposed changes to PR #972:
- avoid calculating current LUP twice in lender kick
- change _kick function to accept proposed LUP (for regular kick proposed LUP is current LUP, for lender kick proposed LUP is calculated based on additional debt)
- in both kick cases return current LUP in kick result
- reduce gas costs by saving a Fenwick traversal
- reduce contract size by removing LUP calculation within Pool

* Cosmetic flashloan code changes, PoolCommons.flashLoan doesn't return false but always reverts if flashloan fails

* PR#983 style, remove redundant line

* PR#999 suggested improvement - calculate current settled debt only once and include in settle result for state update

* PR #962 proposed changes:
- get Fenwick deposits only once when settle with reserves
- define constants for min bond factor and max npTp ratio values

* PR #987 proposed improvement:
- add and reuse _htp helper function (instead duplicated maths)

* Continuation of PR #962: (#1008)

- Record settle amount limmit in Liquidtion struct, at the time of kick (that is instead incrementing accumulator in Borrower struct, each time debt is drawn)
- This way accumulator will be reseted when auction is settled
- fix tests

TODO:
- assert Liquidation.t0ReserveSettleAmount in unit tests (_assertAuction), make sure is set to 0 after auction settled and decreased when partial settles done
- update invariant test to check new introduced accumulator

* Misc test fixes (#1009)

* handle another reward rounding error use case

* fix intermittant fuzz test failure - cannot draw debt from liquidity in bucket 7388

* PositionManager should expect AddAboveAuctionPrice, which can happen in moveLiquidity

* Invariant fix: round up quote tokens calculated from rewarded LP (because LP rewarded are calculated in bucketTake as rewarded quote tokens -> LP rounded down)

* full coverage of PermitERC20 and poolInfoUtils

* create liquidation in PoolInfoUtils test (#1015)

---------

Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Prateek Gupta <prateek105@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: prateek105 <prateek@ajna.finance>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mattcushman <36414299+mattcushman@users.noreply.github.com>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
ith-harvey added a commit that referenced this pull request Dec 13, 2023
* Universal deposit fee (#983)

* charge fee on all deposit

* unit tests compile

* test harness updates

* working on ERC20PoolQuoteTokenTest

* removed deposit fee cap

* more work on ERC20PoolQuoteTokenTest

* do not charge deposit fee if moving liquidity to higher price

* Eliminate reserves bad debt allocation and add margin to TP  (#962)

* this underflows instead of giving expected revert

* move isCollateralized check after updating borrower collateral

* remove local calculation of encumbered collateral

* trying to properly fix testBorrowRepayPrecision

* resolve rounding issue in fuzz test

* testCollateralization improvements

* updated unit tests for new _collateralization implementation

* more collateralization tests

* Add 1.04 factor in borrower collateralization

* Update nptp ratio to '1 + sqrt(r)/2'

* Remove Settle debt with pool reserves

* Remove 0.995 factor from claimable reserves calculation

* Update bond factor calculation to minimum 0.005

* added testcase where debt exceeds deposit

* updated test so debt exceeds deposit

* allow  up to half of current orig fee to be used to settle bad debt

* updated testTakeAndSettle

* more test fixes

* Enabled settling with all reserves if
 Deposits.treeSum==0 or 72 hrs pass

* cleanup

* Half orig fee res | Matt example (#966)

* added Matts test as proof that attack no longer works on his branch

* Revert "Remove multicall from position manager (#948)" (#961)

This reverts commit f540c8a.

* added test testSpendOrigFeePushBadDebtToBorrowers test

* cleaned up testStealReservesWithMarginm to match minted balances

* responded to Matts comments

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Revert "Remove Settle debt with pool reserves"

This reverts commit 290d6cf.

* Update half origination fees reserves settlement time to 144 hours from kickTime

* Fix alignment and extra spaces

* Fix some unit tests

* PR feedback

* Update encumberance and collateralization method in poolInfoUtils

* Fix some unit tests

---------

Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Fix invariant setup

* Fix some unit tests

* ERC20PoolQuoteTokenTest updated

* updated ERC20PoolPurchaseQuoteTokenTest

* Fixed tests in ERC20PoolReserveAuction.t.sol

* updated ERC20PoolBorrowTest and ERC20PoolBorrowFuzzyTest

* Fix ERC20PoolCollateral and ERC20PoolInfoUtils tests

* Fixed ERC20 arbtake and depositTake tests

* Fix ERC20PoolLiquidationsKickTest, ERC20PoolLiquidationKickFuzzyTest and ERC20PoolLiquidationsLenderKickAuctionTest

* updated ERC20PoolMulticallTest

* cleaned up ERC20PoolDebtExceedsDepositTest

* fixed testTakeLoanColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosResidual

* fixed testTakeCallerColConstraintBpfNegResidual

* fixed testTakeLoanDebtConstraintBpfPosResidual

* fixed testTakeAndSettle

* cleaned up ERC20PoolDebtExceedsDepositTest

* updated ERC20PoolPrecisionTest

* Update ERC20PoolLiquidationsSettleTest

* Update ERC20PoolLiquidationsMisc

* Update ERC20PoolLiquidationSettleFuzzyTest

* Update ERC20PoolLiquidationTakeFuzzyTest

* fixeed revert tests

* ERC20PoolLiquidationsTake -- fixed rest

* Mh update tests (#985)

* fix most position manager tests

* fix additional pm tests

* fix rewards requiredCollateralRewards setup

* fix ClaimRewards tests

* update additional rewards manager tests

* fix additional tests

* more test fixes

* commit wip bankruptcy tests

* fixed testMoveLiquidityToOverwriteBankruptBucket

* fix additional tests

* fix testMoveLiquidityWithDebtInPool

* fix remaining rewards manager tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mwc <matt@ajna.finance>

* Add 1.04 factor in HTP calculations (#987)

* Add 1.04 factor in HTP calculations

* Add COLLATERALIZATION_FACTOR constant in PoolHelpers

* Add collateralization factor in dwatp

* Fix poolPricesInfo

* Update ERC20PoolBorrowFuzzyTest

* Fix some unit tests

* Fix some unit tests

* Fix some unit tests

* Update ERC20PoolTransferLPs

* fix most rewards manager tests

* update remaining rewards manager tests

* update ERC721SubsetPoolBorrowTest and commit wip changes to testMergeOrRemoveERC721Collateral

* updated testSettlePartialDebtSubsetPool (#988)

* updated testSettlePartialDebtSubsetPool

* re-added teardown

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fix ERC721PoolCollateral tests

* fix borrowRepayDebtFuzzy and additional PM tests

* cleaned up testBorrowAndRepayWith4DecimalQuote

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Fix some unit tests

* Deployment updates for RC8+ releases (#986)

* cherry-picked from master

* updated README

* Fix ERC721PoolLiquidationsTakeTest

* updated ERC721PoolReserveAuctionTest

* updated testMergeOrRemoveERC721Collateral (#989)

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* updated ERC721PoolPurchaseQuoteTest and fixed bug in ERC721 tearDown

* cleaned up testLiquidationLenderKickAuction, testLiquidationSingleBorrower, testSettleAuctionWithoutTakes

* updated testMoveLiquidityToOverwriteBankruptBucket

* updated PoolHelperTest

* cleaned up asserts in addLiquidity

* update testMoveLiquidityInBankruptBucket_LP_report_179_494

* updated ERC721PoolEMAsTest

* fixed testKickHighThresholdPriceBorrower

* updated testBorrowerInterestCalculationAfterRepayingAllDebtOnce and testBorrowerInterestCalculation

* updated testMultipleBorrowerInterestAccumulation

* Fix regression tests

* updated RE3, fixed _addQuoteToken

* addQuoteToken - return amount added (#993)

* addQuoteToken now returns amount added

* update unit tests to validate return values

* Fix up add liquidity (#992)

* cleaned up addLiquidity() method in ERC20PoolLiquidationsScaled.t.sol

* remove console

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fixed issue with test_regression_fenwick_index_2 in non-18-decimal env

* added regression tests for two failing reserves scenarios

* rename tests such that automake runs them with other regression tests

* UnboundedLiquidationPoolHandler bucketTake fix (#994)

* updated UnboundedLiquidationPoolHandler to handle compensated collateral in bucketTake

* cleanup, trap unhandled use case

* settle event now emits actual debt settled rather than t0 amount (#999)

* settle event now emits actual debt settled rather than t0 amount

* updated test_regression_settle_with_reserves

* Updated auctionInfo (#996)

* add thresholdPrice to auctionInfo; update test iterface usages

* temp fix tests

* remove unneeded comment

* Update auction status (#998)

* wip auction status update w/ stack too deep

* update auctionStatus; add auctionInfo method to poolInfoUtils

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* updated brownie tests, removed obsolete invariant tests (#1001)

* Block addqt above auction price (#997)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* added unit test showing adding qt above auction price reverts

* updated nit spellings

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Invariant testing fixes (#1006)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* documented a sample of invariant failures in regression tests

* added unit test showing adding qt above auction price reverts

* fixed _isCollateralized bug not returning true in all 0-debt use cases

* updated nit spellings

* fixed underflow calculating kicker reward

* _repayDebtByThirdParty should check for expected pool errors

* Round down when reward kicker, round up when kicker is penalized
Fix roundings in tests

* update test comments

* fix and enable A9 invariant

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* RC9 suggested improvements (#1005)

* Revert AuctionNotTakeable in same place, load auction kickTime only once from storage

* Calculate ERC721 collateralTaken only once
cosmetize code (read from result struct in local var and reuse)
Results in shrinking a little bit contract sizes

* Read borrower Np Tp ratio from storage only once when kick

* If block style, proper indentation

* Proposed changes to PR #972:
- avoid calculating current LUP twice in lender kick
- change _kick function to accept proposed LUP (for regular kick proposed LUP is current LUP, for lender kick proposed LUP is calculated based on additional debt)
- in both kick cases return current LUP in kick result
- reduce gas costs by saving a Fenwick traversal
- reduce contract size by removing LUP calculation within Pool

* Cosmetic flashloan code changes, PoolCommons.flashLoan doesn't return false but always reverts if flashloan fails

* PR#983 style, remove redundant line

* PR#999 suggested improvement - calculate current settled debt only once and include in settle result for state update

* PR #962 proposed changes:
- get Fenwick deposits only once when settle with reserves
- define constants for min bond factor and max npTp ratio values

* PR #987 proposed improvement:
- add and reuse _htp helper function (instead duplicated maths)

* Continuation of PR #962: (#1008)

- Record settle amount limmit in Liquidtion struct, at the time of kick (that is instead incrementing accumulator in Borrower struct, each time debt is drawn)
- This way accumulator will be reseted when auction is settled
- fix tests

TODO:
- assert Liquidation.t0ReserveSettleAmount in unit tests (_assertAuction), make sure is set to 0 after auction settled and decreased when partial settles done
- update invariant test to check new introduced accumulator

* Misc test fixes (#1009)

* handle another reward rounding error use case

* fix intermittant fuzz test failure - cannot draw debt from liquidity in bucket 7388

* PositionManager should expect AddAboveAuctionPrice, which can happen in moveLiquidity

* Invariant fix: round up quote tokens calculated from rewarded LP (because LP rewarded are calculated in bucketTake as rewarded quote tokens -> LP rounded down)

* initial commit

* cleaned up, its executing

* updated

* rough draft of tests written

* cleaned up examples added collateral asserts

* borrower change not needed in PR

* added new class inside ERC721PoolLiquidationsTake.t.sol

* updated tests to adjust for take event

---------

Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Prateek Gupta <prateek105@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: prateek105 <prateek@ajna.finance>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mattcushman <36414299+mattcushman@users.noreply.github.com>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
ith-harvey added a commit that referenced this pull request Dec 18, 2023
* Fix test_regression_failure_A8_5

* Remove repayDebtByThirdParty handler in SettleERC20PoolHandler, as repayment for borrower in auction is restricted

* Add failing regression test_regression_bucket_take_arithmetic_over_underflow

* Fix test_regression_bucket_take_arithmetic_over_underflow

* Invariant RE9 improvement

* Add failing regression test_regression_bucket_take_reserves_failure

* Fix test_regression_bucket_take_reserves_failure

* Add failing regression test_regression_bucket_take_re9_failure

* Move failing regression tests to RegressionTestReservesWith8QuotePrecision12CollateralPrecisionERC20Pool

* Fix test_regression_bucket_take_re9_failure

* Fix regression tests failing due to reserve error margin calculation when auction price is 0

* Universal deposit fee (#983)

* charge fee on all deposit

* unit tests compile

* test harness updates

* working on ERC20PoolQuoteTokenTest

* removed deposit fee cap

* more work on ERC20PoolQuoteTokenTest

* do not charge deposit fee if moving liquidity to higher price

* Eliminate reserves bad debt allocation and add margin to TP  (#962)

* this underflows instead of giving expected revert

* move isCollateralized check after updating borrower collateral

* remove local calculation of encumbered collateral

* trying to properly fix testBorrowRepayPrecision

* resolve rounding issue in fuzz test

* testCollateralization improvements

* updated unit tests for new _collateralization implementation

* more collateralization tests

* Add 1.04 factor in borrower collateralization

* Update nptp ratio to '1 + sqrt(r)/2'

* Remove Settle debt with pool reserves

* Remove 0.995 factor from claimable reserves calculation

* Update bond factor calculation to minimum 0.005

* added testcase where debt exceeds deposit

* updated test so debt exceeds deposit

* allow  up to half of current orig fee to be used to settle bad debt

* updated testTakeAndSettle

* more test fixes

* Enabled settling with all reserves if
 Deposits.treeSum==0 or 72 hrs pass

* cleanup

* Half orig fee res | Matt example (#966)

* added Matts test as proof that attack no longer works on his branch

* Revert "Remove multicall from position manager (#948)" (#961)

This reverts commit f540c8a.

* added test testSpendOrigFeePushBadDebtToBorrowers test

* cleaned up testStealReservesWithMarginm to match minted balances

* responded to Matts comments

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Revert "Remove Settle debt with pool reserves"

This reverts commit 290d6cf.

* Update half origination fees reserves settlement time to 144 hours from kickTime

* Fix alignment and extra spaces

* Fix some unit tests

* PR feedback

* Update encumberance and collateralization method in poolInfoUtils

* Fix some unit tests

---------

Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Fix invariant setup

* Fix some unit tests

* ERC20PoolQuoteTokenTest updated

* updated ERC20PoolPurchaseQuoteTokenTest

* Fixed tests in ERC20PoolReserveAuction.t.sol

* updated ERC20PoolBorrowTest and ERC20PoolBorrowFuzzyTest

* Fix ERC20PoolCollateral and ERC20PoolInfoUtils tests

* Fixed ERC20 arbtake and depositTake tests

* Fix ERC20PoolLiquidationsKickTest, ERC20PoolLiquidationKickFuzzyTest and ERC20PoolLiquidationsLenderKickAuctionTest

* updated ERC20PoolMulticallTest

* cleaned up ERC20PoolDebtExceedsDepositTest

* fixed testTakeLoanColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosResidual

* fixed testTakeCallerColConstraintBpfNegResidual

* fixed testTakeLoanDebtConstraintBpfPosResidual

* fixed testTakeAndSettle

* cleaned up ERC20PoolDebtExceedsDepositTest

* updated ERC20PoolPrecisionTest

* Update ERC20PoolLiquidationsSettleTest

* Update ERC20PoolLiquidationsMisc

* Update ERC20PoolLiquidationSettleFuzzyTest

* Update ERC20PoolLiquidationTakeFuzzyTest

* fixeed revert tests

* ERC20PoolLiquidationsTake -- fixed rest

* Mh update tests (#985)

* fix most position manager tests

* fix additional pm tests

* fix rewards requiredCollateralRewards setup

* fix ClaimRewards tests

* update additional rewards manager tests

* fix additional tests

* more test fixes

* commit wip bankruptcy tests

* fixed testMoveLiquidityToOverwriteBankruptBucket

* fix additional tests

* fix testMoveLiquidityWithDebtInPool

* fix remaining rewards manager tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mwc <matt@ajna.finance>

* Add 1.04 factor in HTP calculations (#987)

* Add 1.04 factor in HTP calculations

* Add COLLATERALIZATION_FACTOR constant in PoolHelpers

* Add collateralization factor in dwatp

* Fix poolPricesInfo

* Update ERC20PoolBorrowFuzzyTest

* Fix some unit tests

* Fix some unit tests

* Fix some unit tests

* Update ERC20PoolTransferLPs

* fix most rewards manager tests

* update remaining rewards manager tests

* update ERC721SubsetPoolBorrowTest and commit wip changes to testMergeOrRemoveERC721Collateral

* updated testSettlePartialDebtSubsetPool (#988)

* updated testSettlePartialDebtSubsetPool

* re-added teardown

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fix ERC721PoolCollateral tests

* fix borrowRepayDebtFuzzy and additional PM tests

* cleaned up testBorrowAndRepayWith4DecimalQuote

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Fix some unit tests

* Deployment updates for RC8+ releases (#986)

* cherry-picked from master

* updated README

* Fix ERC721PoolLiquidationsTakeTest

* updated ERC721PoolReserveAuctionTest

* updated testMergeOrRemoveERC721Collateral (#989)

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* updated ERC721PoolPurchaseQuoteTest and fixed bug in ERC721 tearDown

* cleaned up testLiquidationLenderKickAuction, testLiquidationSingleBorrower, testSettleAuctionWithoutTakes

* updated testMoveLiquidityToOverwriteBankruptBucket

* updated PoolHelperTest

* cleaned up asserts in addLiquidity

* update testMoveLiquidityInBankruptBucket_LP_report_179_494

* updated ERC721PoolEMAsTest

* fixed testKickHighThresholdPriceBorrower

* updated testBorrowerInterestCalculationAfterRepayingAllDebtOnce and testBorrowerInterestCalculation

* updated testMultipleBorrowerInterestAccumulation

* Fix regression tests

* updated RE3, fixed _addQuoteToken

* addQuoteToken - return amount added (#993)

* addQuoteToken now returns amount added

* update unit tests to validate return values

* Fix up add liquidity (#992)

* cleaned up addLiquidity() method in ERC20PoolLiquidationsScaled.t.sol

* remove console

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fixed issue with test_regression_fenwick_index_2 in non-18-decimal env

* added regression tests for two failing reserves scenarios

* rename tests such that automake runs them with other regression tests

* UnboundedLiquidationPoolHandler bucketTake fix (#994)

* updated UnboundedLiquidationPoolHandler to handle compensated collateral in bucketTake

* cleanup, trap unhandled use case

* settle event now emits actual debt settled rather than t0 amount (#999)

* settle event now emits actual debt settled rather than t0 amount

* updated test_regression_settle_with_reserves

* Updated auctionInfo (#996)

* add thresholdPrice to auctionInfo; update test iterface usages

* temp fix tests

* remove unneeded comment

* Update auction status (#998)

* wip auction status update w/ stack too deep

* update auctionStatus; add auctionInfo method to poolInfoUtils

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* updated brownie tests, removed obsolete invariant tests (#1001)

* Block addqt above auction price (#997)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* added unit test showing adding qt above auction price reverts

* updated nit spellings

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Invariant testing fixes (#1006)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* documented a sample of invariant failures in regression tests

* added unit test showing adding qt above auction price reverts

* fixed _isCollateralized bug not returning true in all 0-debt use cases

* updated nit spellings

* fixed underflow calculating kicker reward

* _repayDebtByThirdParty should check for expected pool errors

* Round down when reward kicker, round up when kicker is penalized
Fix roundings in tests

* update test comments

* fix and enable A9 invariant

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* RC9 suggested improvements (#1005)

* Revert AuctionNotTakeable in same place, load auction kickTime only once from storage

* Calculate ERC721 collateralTaken only once
cosmetize code (read from result struct in local var and reuse)
Results in shrinking a little bit contract sizes

* Read borrower Np Tp ratio from storage only once when kick

* If block style, proper indentation

* Proposed changes to PR #972:
- avoid calculating current LUP twice in lender kick
- change _kick function to accept proposed LUP (for regular kick proposed LUP is current LUP, for lender kick proposed LUP is calculated based on additional debt)
- in both kick cases return current LUP in kick result
- reduce gas costs by saving a Fenwick traversal
- reduce contract size by removing LUP calculation within Pool

* Cosmetic flashloan code changes, PoolCommons.flashLoan doesn't return false but always reverts if flashloan fails

* PR#983 style, remove redundant line

* PR#999 suggested improvement - calculate current settled debt only once and include in settle result for state update

* PR #962 proposed changes:
- get Fenwick deposits only once when settle with reserves
- define constants for min bond factor and max npTp ratio values

* PR #987 proposed improvement:
- add and reuse _htp helper function (instead duplicated maths)

* Continuation of PR #962: (#1008)

- Record settle amount limmit in Liquidtion struct, at the time of kick (that is instead incrementing accumulator in Borrower struct, each time debt is drawn)
- This way accumulator will be reseted when auction is settled
- fix tests

TODO:
- assert Liquidation.t0ReserveSettleAmount in unit tests (_assertAuction), make sure is set to 0 after auction settled and decreased when partial settles done
- update invariant test to check new introduced accumulator

* Misc test fixes (#1009)

* handle another reward rounding error use case

* fix intermittant fuzz test failure - cannot draw debt from liquidity in bucket 7388

* PositionManager should expect AddAboveAuctionPrice, which can happen in moveLiquidity

* Invariant fix: round up quote tokens calculated from rewarded LP (because LP rewarded are calculated in bucketTake as rewarded quote tokens -> LP rounded down)

* Take 1 - invariant code cleanup

* Take 2: reserves and other helpers

* Merge branch 'merge-rc9' into failing-regressions

* Fix pool address in tests

* Take 3 - more changes

* Pr feedback

* Fix failing unit tests

* Fix failing unit tests

* Take 4

* Fix test_regression_rw_reserves_failure_4

* buckettake reserves failure

* Fix test_regression_failure_reserves_on_bucketTake, update Invariant RE9

* Fix _takeAuction

* Fix unit tests

* PR feedback

* Fix bucketIndex in _bucketTake handler

* Add getLoansInfo helper, remove duplicated settle code, more style

* Additional code style and helper use

* Add back Positions tests

* Update TP naming in invariants

---------

Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mattcushman <36414299+mattcushman@users.noreply.github.com>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
ith-harvey added a commit that referenced this pull request Dec 19, 2023
* Universal deposit fee (#983)

* charge fee on all deposit

* unit tests compile

* test harness updates

* working on ERC20PoolQuoteTokenTest

* removed deposit fee cap

* more work on ERC20PoolQuoteTokenTest

* do not charge deposit fee if moving liquidity to higher price

* Eliminate reserves bad debt allocation and add margin to TP  (#962)

* this underflows instead of giving expected revert

* move isCollateralized check after updating borrower collateral

* remove local calculation of encumbered collateral

* trying to properly fix testBorrowRepayPrecision

* resolve rounding issue in fuzz test

* testCollateralization improvements

* updated unit tests for new _collateralization implementation

* more collateralization tests

* Add 1.04 factor in borrower collateralization

* Update nptp ratio to '1 + sqrt(r)/2'

* Remove Settle debt with pool reserves

* Remove 0.995 factor from claimable reserves calculation

* Update bond factor calculation to minimum 0.005

* added testcase where debt exceeds deposit

* updated test so debt exceeds deposit

* allow  up to half of current orig fee to be used to settle bad debt

* updated testTakeAndSettle

* more test fixes

* Enabled settling with all reserves if
 Deposits.treeSum==0 or 72 hrs pass

* cleanup

* Half orig fee res | Matt example (#966)

* added Matts test as proof that attack no longer works on his branch

* Revert "Remove multicall from position manager (#948)" (#961)

This reverts commit f540c8a.

* added test testSpendOrigFeePushBadDebtToBorrowers test

* cleaned up testStealReservesWithMarginm to match minted balances

* responded to Matts comments

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Revert "Remove Settle debt with pool reserves"

This reverts commit 290d6cf.

* Update half origination fees reserves settlement time to 144 hours from kickTime

* Fix alignment and extra spaces

* Fix some unit tests

* PR feedback

* Update encumberance and collateralization method in poolInfoUtils

* Fix some unit tests

---------

Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Fix invariant setup

* Fix some unit tests

* ERC20PoolQuoteTokenTest updated

* updated ERC20PoolPurchaseQuoteTokenTest

* Fixed tests in ERC20PoolReserveAuction.t.sol

* updated ERC20PoolBorrowTest and ERC20PoolBorrowFuzzyTest

* Fix ERC20PoolCollateral and ERC20PoolInfoUtils tests

* Fixed ERC20 arbtake and depositTake tests

* Fix ERC20PoolLiquidationsKickTest, ERC20PoolLiquidationKickFuzzyTest and ERC20PoolLiquidationsLenderKickAuctionTest

* updated ERC20PoolMulticallTest

* cleaned up ERC20PoolDebtExceedsDepositTest

* fixed testTakeLoanColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosResidual

* fixed testTakeCallerColConstraintBpfNegResidual

* fixed testTakeLoanDebtConstraintBpfPosResidual

* fixed testTakeAndSettle

* cleaned up ERC20PoolDebtExceedsDepositTest

* updated ERC20PoolPrecisionTest

* Update ERC20PoolLiquidationsSettleTest

* Update ERC20PoolLiquidationsMisc

* Update ERC20PoolLiquidationSettleFuzzyTest

* Update ERC20PoolLiquidationTakeFuzzyTest

* fixeed revert tests

* ERC20PoolLiquidationsTake -- fixed rest

* Mh update tests (#985)

* fix most position manager tests

* fix additional pm tests

* fix rewards requiredCollateralRewards setup

* fix ClaimRewards tests

* update additional rewards manager tests

* fix additional tests

* more test fixes

* commit wip bankruptcy tests

* fixed testMoveLiquidityToOverwriteBankruptBucket

* fix additional tests

* fix testMoveLiquidityWithDebtInPool

* fix remaining rewards manager tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mwc <matt@ajna.finance>

* Add 1.04 factor in HTP calculations (#987)

* Add 1.04 factor in HTP calculations

* Add COLLATERALIZATION_FACTOR constant in PoolHelpers

* Add collateralization factor in dwatp

* Fix poolPricesInfo

* Update ERC20PoolBorrowFuzzyTest

* Fix some unit tests

* Fix some unit tests

* Fix some unit tests

* Update ERC20PoolTransferLPs

* fix most rewards manager tests

* update remaining rewards manager tests

* update ERC721SubsetPoolBorrowTest and commit wip changes to testMergeOrRemoveERC721Collateral

* updated testSettlePartialDebtSubsetPool (#988)

* updated testSettlePartialDebtSubsetPool

* re-added teardown

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fix ERC721PoolCollateral tests

* fix borrowRepayDebtFuzzy and additional PM tests

* cleaned up testBorrowAndRepayWith4DecimalQuote

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Fix some unit tests

* Deployment updates for RC8+ releases (#986)

* cherry-picked from master

* updated README

* Fix ERC721PoolLiquidationsTakeTest

* updated ERC721PoolReserveAuctionTest

* updated testMergeOrRemoveERC721Collateral (#989)

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* updated ERC721PoolPurchaseQuoteTest and fixed bug in ERC721 tearDown

* cleaned up testLiquidationLenderKickAuction, testLiquidationSingleBorrower, testSettleAuctionWithoutTakes

* updated testMoveLiquidityToOverwriteBankruptBucket

* updated PoolHelperTest

* cleaned up asserts in addLiquidity

* update testMoveLiquidityInBankruptBucket_LP_report_179_494

* updated ERC721PoolEMAsTest

* fixed testKickHighThresholdPriceBorrower

* updated testBorrowerInterestCalculationAfterRepayingAllDebtOnce and testBorrowerInterestCalculation

* updated testMultipleBorrowerInterestAccumulation

* Fix regression tests

* updated RE3, fixed _addQuoteToken

* addQuoteToken - return amount added (#993)

* addQuoteToken now returns amount added

* update unit tests to validate return values

* Fix up add liquidity (#992)

* cleaned up addLiquidity() method in ERC20PoolLiquidationsScaled.t.sol

* remove console

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fixed issue with test_regression_fenwick_index_2 in non-18-decimal env

* added regression tests for two failing reserves scenarios

* rename tests such that automake runs them with other regression tests

* UnboundedLiquidationPoolHandler bucketTake fix (#994)

* updated UnboundedLiquidationPoolHandler to handle compensated collateral in bucketTake

* cleanup, trap unhandled use case

* settle event now emits actual debt settled rather than t0 amount (#999)

* settle event now emits actual debt settled rather than t0 amount

* updated test_regression_settle_with_reserves

* Updated auctionInfo (#996)

* add thresholdPrice to auctionInfo; update test iterface usages

* temp fix tests

* remove unneeded comment

* Update auction status (#998)

* wip auction status update w/ stack too deep

* update auctionStatus; add auctionInfo method to poolInfoUtils

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* updated brownie tests, removed obsolete invariant tests (#1001)

* Block addqt above auction price (#997)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* added unit test showing adding qt above auction price reverts

* updated nit spellings

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Invariant testing fixes (#1006)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* documented a sample of invariant failures in regression tests

* added unit test showing adding qt above auction price reverts

* fixed _isCollateralized bug not returning true in all 0-debt use cases

* updated nit spellings

* fixed underflow calculating kicker reward

* _repayDebtByThirdParty should check for expected pool errors

* Round down when reward kicker, round up when kicker is penalized
Fix roundings in tests

* update test comments

* fix and enable A9 invariant

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* RC9 suggested improvements (#1005)

* Revert AuctionNotTakeable in same place, load auction kickTime only once from storage

* Calculate ERC721 collateralTaken only once
cosmetize code (read from result struct in local var and reuse)
Results in shrinking a little bit contract sizes

* Read borrower Np Tp ratio from storage only once when kick

* If block style, proper indentation

* Proposed changes to PR #972:
- avoid calculating current LUP twice in lender kick
- change _kick function to accept proposed LUP (for regular kick proposed LUP is current LUP, for lender kick proposed LUP is calculated based on additional debt)
- in both kick cases return current LUP in kick result
- reduce gas costs by saving a Fenwick traversal
- reduce contract size by removing LUP calculation within Pool

* Cosmetic flashloan code changes, PoolCommons.flashLoan doesn't return false but always reverts if flashloan fails

* PR#983 style, remove redundant line

* PR#999 suggested improvement - calculate current settled debt only once and include in settle result for state update

* PR #962 proposed changes:
- get Fenwick deposits only once when settle with reserves
- define constants for min bond factor and max npTp ratio values

* PR #987 proposed improvement:
- add and reuse _htp helper function (instead duplicated maths)

* Continuation of PR #962: (#1008)

- Record settle amount limmit in Liquidtion struct, at the time of kick (that is instead incrementing accumulator in Borrower struct, each time debt is drawn)
- This way accumulator will be reseted when auction is settled
- fix tests

TODO:
- assert Liquidation.t0ReserveSettleAmount in unit tests (_assertAuction), make sure is set to 0 after auction settled and decreased when partial settles done
- update invariant test to check new introduced accumulator

* Misc test fixes (#1009)

* handle another reward rounding error use case

* fix intermittant fuzz test failure - cannot draw debt from liquidity in bucket 7388

* PositionManager should expect AddAboveAuctionPrice, which can happen in moveLiquidity

* Invariant fix: round up quote tokens calculated from rewarded LP (because LP rewarded are calculated in bucketTake as rewarded quote tokens -> LP rounded down)

* Pr feedback

* Fix failing unit tests

* update poolInfoUtils.borrowerInfo interface

* return thresholdPrice instead of t0ThresholdPrice

* fix compile warnings

* update borrowerInfo threshold price references

* resolved comments on borrowerInfo

---------

Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Prateek Gupta <prateek105@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: prateek105 <prateek@ajna.finance>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mattcushman <36414299+mattcushman@users.noreply.github.com>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
EdNoepel added a commit that referenced this pull request Jan 4, 2024
* Logging for RewardsManager and PositionManager invariants (#925)

* added logging for positionManager

* added rewards and position logging

* clean up

* updated rewards mapping back to public so tests pass

* how modifier was being called in rewardsPoolHandler

* revised so logging pools is not required when logging positions

* cleanup

* readme cleanup

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Invariants Improvement: Add multiple pool support in position and rewards manager invariant testing (#927)

* Add multiple pools in position and rewards manager invariant testing

* Fix RW6 regression test

* Fix rewardsClaimed and updateRewardsClaimed in Rewards manager

* Fix compile error

* PR feedback

* Add configurable number of pools for position and rewards manager invariant testing

* Positions Invariants: Multiple positions, transfer positions (#926)

* added randomness

* added the ability to transfer positions

* increased chance of rewards being claimed in handlers

* cleanup

* responded to comments

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Fuzz test additions (#924)

* Add fuzz test for borrower borrows fuzzed amount and getting kick after some time

* Add fuzz test for take fuzzed amount of collateral from auction

* Add fuzz test for settle with fuzzed pool deposit

* Add fuzz test for add and remove collateral in ERC721Pool

* Fuzzed buckets used in borrow and kick fuzz test

* PR feedback

* Invariant Improvements: Position rewards logging for multiple pools (#931)

* Update position and rewards manager invariant logging for multiple pools

* Fix regression test to run for any token precision and Quote token limits

* PR feedback

* Invariants Improvements: Add Multiple position in single handler in Position (#928)

* Update Position invariants handler to memorialize and redeem multiple positions

* PR feedback

* Add partial random positions redeem in redeem position handler

* Add random time skips between epochs in rewards manager

* Add bucket bankruptcy scenario for rewards manager (#930)

* Add bucket bankruptcy scenario for rewards manager

* Fix evm reverts

* PR feedback

* Update prepare test methods to add position in NFT if there is no position in it

* Fixed RewardsManager exchangeRate emit (#941)

* stopped updatedExchangeRates emit when the rates are not updated

* removed epoch check in _updateBucketExchangeRates

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Invariant Improvements: Add settle invariant scenario (#933)

* Add settle invariant scenario

* Reduce Loans and skip time to make undercollateralize

* Reduce time to skip in bucket bankruptcy scenario setup to fix regression tests (#936)

* Update unit test to increase test coverage (#938)

* Add unit tests to check deposits and debt limits in pool (#939)

* Add unit test to check exp function limit

* Add unit tests to check pool deposit and debt limits

* PR cleanup

* Add missing external function calls (#946)

* Update Position Manager unit tests to test against both ERC721 subset Pool and Collection Pool (#945)

* Merge changes from private-contracts repo into develop (#950)

* Merge Develop into Master (#934)

* Logging for RewardsManager and PositionManager invariants (#925)

* added logging for positionManager

* added rewards and position logging

* clean up

* updated rewards mapping back to public so tests pass

* how modifier was being called in rewardsPoolHandler

* revised so logging pools is not required when logging positions

* cleanup

* readme cleanup

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Invariants Improvement: Add multiple pool support in position and rewards manager invariant testing (#927)

* Add multiple pools in position and rewards manager invariant testing

* Fix RW6 regression test

* Fix rewardsClaimed and updateRewardsClaimed in Rewards manager

* Fix compile error

* PR feedback

* Add configurable number of pools for position and rewards manager invariant testing

* Positions Invariants: Multiple positions, transfer positions (#926)

* added randomness

* added the ability to transfer positions

* increased chance of rewards being claimed in handlers

* cleanup

* responded to comments

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Fuzz test additions (#924)

* Add fuzz test for borrower borrows fuzzed amount and getting kick after some time

* Add fuzz test for take fuzzed amount of collateral from auction

* Add fuzz test for settle with fuzzed pool deposit

* Add fuzz test for add and remove collateral in ERC721Pool

* Fuzzed buckets used in borrow and kick fuzz test

* PR feedback

* Invariant Improvements: Position rewards logging for multiple pools (#931)

* Update position and rewards manager invariant logging for multiple pools

* Fix regression test to run for any token precision and Quote token limits

* PR feedback

* Invariants Improvements: Add Multiple position in single handler in Position (#928)

* Update Position invariants handler to memorialize and redeem multiple positions

* PR feedback

* Add partial random positions redeem in redeem position handler

* Add random time skips between epochs in rewards manager

* Add bucket bankruptcy scenario for rewards manager (#930)

* Add bucket bankruptcy scenario for rewards manager

* Fix evm reverts

* PR feedback

* Update prepare test methods to add position in NFT if there is no position in it

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: Prateek Gupta <prateek105@users.noreply.github.com>

* manually merged from private-contracts/immutable-kicks

* eliminated alreadyTaken (drawio needs updating)

* annotated failing unit tests

* new limit to induce testAccruePoolInterestRevertDueToExpLimit revert

* fixed testUpdateInterestTuLimit

* fixed testAccrueInterestNewInterestLimit

* removed alreadyTaken from drawios

* updated drawio-generated html

* merged Prateek's post-merge changes

---------

Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: Prateek Gupta <prateek105@users.noreply.github.com>

* Return amount repaid in repayDebt and amount take in take (#947)

* Remove multicall from position manager (#948)

* L2 license grant (#949)

* updated license

* adjustment for public chains

* Pool info utils multicall (#944)

* Add PoolInfoUtilsMulticall contract to call multiple PoolInfoUtils methods in a single call to reduce rpc calls from subgraph

* Add tests for PoolInfoutilsMulticall

* Added comments and code improvements

* altered license

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* removed mention of momp in testPoolInfoUtilsMulticall (#952)

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* resolved compilation warnings and removed unused code (#953)

* Reuse _isCollateralized method in repayment (#959)

* this underflows instead of giving expected revert

* move isCollateralized check after updating borrower collateral

* remove local calculation of encumbered collateral

* trying to properly fix testBorrowRepayPrecision

* resolve rounding issue in fuzz test

* testCollateralization improvements

* updated unit tests for new _collateralization implementation

* more collateralization tests

* Revert "Remove multicall from position manager (#948)" (#961)

This reverts commit f540c8a75fe58b9fdb8249da33f271a5f0ad335c.

* PR template (#963)

* changed PR template

* commented out example test, as requested in PR review

* Low-lying fruit (#967)

* added a fenwick OOB test

* unit test to prove 0 loan heap insertions don't break anythnig

* test harness for the auction queue and simple unit tests

* comment to resolve Kirill L-07

* removed redundant code per Kirill L-05

* added SafeCasts

* Fix incorrect lup is used to calculate new interest rate in lenderKick (#972)

* correct reserve auction kick timing logic (#974)

* Add debt and collateral settled returns in settle function (#960)

* Return debt and collateral settled from settle method

* Add isBorrowerSettled return in settle method

* Catch interest accrual and update interest overflow (#954)

* Add try catch for interest accrual and update interest method to avoid pool locking

* PR feedback

* Incorrect(Unscaled) deposits are used to check bucket bankruptcy in forgive bad debt (#971)

* Fix incorrect deposits used to check bucket bankruptcy in forgive bad debt

* PR feedback

* Use bucket price for BPF calculation (#970)

* use bucket price in BPF calc where applicable

* fixed unit tests

* revert CRA kick if a liquidation awaits settlement (#977)

* First borrower (#968)

* this did not work; cannot prevent rate from changing after 12 hours

* fixed issue with _updateInterestState

* fixed unit tests

* removed unused test utility

* Contract size mitigation (#979)

* moved inflator state update logic to PoolHelper

* moved flashLoan impl into PoolCommons

* Memorialize borrower threshold price on kick  (#976)

* Memorialize borrower threshold price at time of kick to calculate bpf on take

* Fix tests

* Record borrower threshold price inside _recordAuction method

* Remove redundant conversions

* Fix natspec

* Fix unit tests

* Remove redundant variable

* Borrower with threshold price less than `MIN_PRICE` cannot be kicked. (#973)

* Add test for borrower with tp less than min price cannot be kicked

* Update _isCollateralized method to return borrower is not collateralized if TP < MIN_PRICE and LUP = MIN_PRICE

* Set borrower to be undercollateralized if LUP = MIN_PRICE

* Fix unit tests

* Fix regression test

* Fix regression test

* Optimize stake cost by reducing calls to currentBurnEpoch (#940)

* reduce external calls to burn epoch

* Don't cast epoch

* further reduce gas in stake by casting curBurnEpoch on use

* moved changes off of kirill-L01-dust-test to a fresh branch (#980)

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Merge rc9 (#1010)

* Universal deposit fee (#983)

* charge fee on all deposit

* unit tests compile

* test harness updates

* working on ERC20PoolQuoteTokenTest

* removed deposit fee cap

* more work on ERC20PoolQuoteTokenTest

* do not charge deposit fee if moving liquidity to higher price

* Eliminate reserves bad debt allocation and add margin to TP  (#962)

* this underflows instead of giving expected revert

* move isCollateralized check after updating borrower collateral

* remove local calculation of encumbered collateral

* trying to properly fix testBorrowRepayPrecision

* resolve rounding issue in fuzz test

* testCollateralization improvements

* updated unit tests for new _collateralization implementation

* more collateralization tests

* Add 1.04 factor in borrower collateralization

* Update nptp ratio to '1 + sqrt(r)/2'

* Remove Settle debt with pool reserves

* Remove 0.995 factor from claimable reserves calculation

* Update bond factor calculation to minimum 0.005

* added testcase where debt exceeds deposit

* updated test so debt exceeds deposit

* allow  up to half of current orig fee to be used to settle bad debt

* updated testTakeAndSettle

* more test fixes

* Enabled settling with all reserves if
 Deposits.treeSum==0 or 72 hrs pass

* cleanup

* Half orig fee res | Matt example (#966)

* added Matts test as proof that attack no longer works on his branch

* Revert "Remove multicall from position manager (#948)" (#961)

This reverts commit f540c8a75fe58b9fdb8249da33f271a5f0ad335c.

* added test testSpendOrigFeePushBadDebtToBorrowers test

* cleaned up testStealReservesWithMarginm to match minted balances

* responded to Matts comments

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Revert "Remove Settle debt with pool reserves"

This reverts commit 290d6cf6f7baa1fb17a66322faf755b78a4a379c.

* Update half origination fees reserves settlement time to 144 hours from kickTime

* Fix alignment and extra spaces

* Fix some unit tests

* PR feedback

* Update encumberance and collateralization method in poolInfoUtils

* Fix some unit tests

---------

Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Fix invariant setup

* Fix some unit tests

* ERC20PoolQuoteTokenTest updated

* updated ERC20PoolPurchaseQuoteTokenTest

* Fixed tests in ERC20PoolReserveAuction.t.sol

* updated ERC20PoolBorrowTest and ERC20PoolBorrowFuzzyTest

* Fix ERC20PoolCollateral and ERC20PoolInfoUtils tests

* Fixed ERC20 arbtake and depositTake tests

* Fix ERC20PoolLiquidationsKickTest, ERC20PoolLiquidationKickFuzzyTest and ERC20PoolLiquidationsLenderKickAuctionTest

* updated ERC20PoolMulticallTest

* cleaned up ERC20PoolDebtExceedsDepositTest

* fixed testTakeLoanColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosResidual

* fixed testTakeCallerColConstraintBpfNegResidual

* fixed testTakeLoanDebtConstraintBpfPosResidual

* fixed testTakeAndSettle

* cleaned up ERC20PoolDebtExceedsDepositTest

* updated ERC20PoolPrecisionTest

* Update ERC20PoolLiquidationsSettleTest

* Update ERC20PoolLiquidationsMisc

* Update ERC20PoolLiquidationSettleFuzzyTest

* Update ERC20PoolLiquidationTakeFuzzyTest

* fixeed revert tests

* ERC20PoolLiquidationsTake -- fixed rest

* Mh update tests (#985)

* fix most position manager tests

* fix additional pm tests

* fix rewards requiredCollateralRewards setup

* fix ClaimRewards tests

* update additional rewards manager tests

* fix additional tests

* more test fixes

* commit wip bankruptcy tests

* fixed testMoveLiquidityToOverwriteBankruptBucket

* fix additional tests

* fix testMoveLiquidityWithDebtInPool

* fix remaining rewards manager tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mwc <matt@ajna.finance>

* Add 1.04 factor in HTP calculations (#987)

* Add 1.04 factor in HTP calculations

* Add COLLATERALIZATION_FACTOR constant in PoolHelpers

* Add collateralization factor in dwatp

* Fix poolPricesInfo

* Update ERC20PoolBorrowFuzzyTest

* Fix some unit tests

* Fix some unit tests

* Fix some unit tests

* Update ERC20PoolTransferLPs

* fix most rewards manager tests

* update remaining rewards manager tests

* update ERC721SubsetPoolBorrowTest and commit wip changes to testMergeOrRemoveERC721Collateral

* updated testSettlePartialDebtSubsetPool (#988)

* updated testSettlePartialDebtSubsetPool

* re-added teardown

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fix ERC721PoolCollateral tests

* fix borrowRepayDebtFuzzy and additional PM tests

* cleaned up testBorrowAndRepayWith4DecimalQuote

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Fix some unit tests

* Deployment updates for RC8+ releases (#986)

* cherry-picked from master

* updated README

* Fix ERC721PoolLiquidationsTakeTest

* updated ERC721PoolReserveAuctionTest

* updated testMergeOrRemoveERC721Collateral (#989)

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* updated ERC721PoolPurchaseQuoteTest and fixed bug in ERC721 tearDown

* cleaned up testLiquidationLenderKickAuction, testLiquidationSingleBorrower, testSettleAuctionWithoutTakes

* updated testMoveLiquidityToOverwriteBankruptBucket

* updated PoolHelperTest

* cleaned up asserts in addLiquidity

* update testMoveLiquidityInBankruptBucket_LP_report_179_494

* updated ERC721PoolEMAsTest

* fixed testKickHighThresholdPriceBorrower

* updated testBorrowerInterestCalculationAfterRepayingAllDebtOnce and testBorrowerInterestCalculation

* updated testMultipleBorrowerInterestAccumulation

* Fix regression tests

* updated RE3, fixed _addQuoteToken

* addQuoteToken - return amount added (#993)

* addQuoteToken now returns amount added

* update unit tests to validate return values

* Fix up add liquidity (#992)

* cleaned up addLiquidity() method in ERC20PoolLiquidationsScaled.t.sol

* remove console

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fixed issue with test_regression_fenwick_index_2 in non-18-decimal env

* added regression tests for two failing reserves scenarios

* rename tests such that automake runs them with other regression tests

* UnboundedLiquidationPoolHandler bucketTake fix (#994)

* updated UnboundedLiquidationPoolHandler to handle compensated collateral in bucketTake

* cleanup, trap unhandled use case

* settle event now emits actual debt settled rather than t0 amount (#999)

* settle event now emits actual debt settled rather than t0 amount

* updated test_regression_settle_with_reserves

* Updated auctionInfo (#996)

* add thresholdPrice to auctionInfo; update test iterface usages

* temp fix tests

* remove unneeded comment

* Update auction status (#998)

* wip auction status update w/ stack too deep

* update auctionStatus; add auctionInfo method to poolInfoUtils

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* updated brownie tests, removed obsolete invariant tests (#1001)

* Block addqt above auction price (#997)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* added unit test showing adding qt above auction price reverts

* updated nit spellings

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Invariant testing fixes (#1006)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* documented a sample of invariant failures in regression tests

* added unit test showing adding qt above auction price reverts

* fixed _isCollateralized bug not returning true in all 0-debt use cases

* updated nit spellings

* fixed underflow calculating kicker reward

* _repayDebtByThirdParty should check for expected pool errors

* Round down when reward kicker, round up when kicker is penalized
Fix roundings in tests

* update test comments

* fix and enable A9 invariant

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* RC9 suggested improvements (#1005)

* Revert AuctionNotTakeable in same place, load auction kickTime only once from storage

* Calculate ERC721 collateralTaken only once
cosmetize code (read from result struct in local var and reuse)
Results in shrinking a little bit contract sizes

* Read borrower Np Tp ratio from storage only once when kick

* If block style, proper indentation

* Proposed changes to PR #972:
- avoid calculating current LUP twice in lender kick
- change _kick function to accept proposed LUP (for regular kick proposed LUP is current LUP, for lender kick proposed LUP is calculated based on additional debt)
- in both kick cases return current LUP in kick result
- reduce gas costs by saving a Fenwick traversal
- reduce contract size by removing LUP calculation within Pool

* Cosmetic flashloan code changes, PoolCommons.flashLoan doesn't return false but always reverts if flashloan fails

* PR#983 style, remove redundant line

* PR#999 suggested improvement - calculate current settled debt only once and include in settle result for state update

* PR #962 proposed changes:
- get Fenwick deposits only once when settle with reserves
- define constants for min bond factor and max npTp ratio values

* PR #987 proposed improvement:
- add and reuse _htp helper function (instead duplicated maths)

* Continuation of PR #962: (#1008)

- Record settle amount limmit in Liquidtion struct, at the time of kick (that is instead incrementing accumulator in Borrower struct, each time debt is drawn)
- This way accumulator will be reseted when auction is settled
- fix tests

TODO:
- assert Liquidation.t0ReserveSettleAmount in unit tests (_assertAuction), make sure is set to 0 after auction settled and decreased when partial settles done
- update invariant test to check new introduced accumulator

* Misc test fixes (#1009)

* handle another reward rounding error use case

* fix intermittant fuzz test failure - cannot draw debt from liquidity in bucket 7388

* PositionManager should expect AddAboveAuctionPrice, which can happen in moveLiquidity

* Invariant fix: round up quote tokens calculated from rewarded LP (because LP rewarded are calculated in bucketTake as rewarded quote tokens -> LP rounded down)

* Pr feedback

* Fix failing unit tests

---------

Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Prateek Gupta <prateek105@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: prateek105 <prateek@ajna.finance>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mattcushman <36414299+mattcushman@users.noreply.github.com>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* [L-02] Some unit tests are not properly executed
- split priceToIndex and indexToPrice revert tests

* removed several unused errors and one unused event, per Kirill I-03

* eliminated unused TakeLocalVars.factor

* removed unused KickResult.poolDebt

* Remove more unused vars (#1022)

* Remove DrawDebtLocalVars.compensatedCollateral and RepayDebtLocalVars.compensatedCollateral

* remove unused `ConstructTokenURIParams::pool` and `ConstructTokenURIParams::indexes`

* Include 1.04 COLLATERALIZATION_FACTOR (#1021)

* Include 1.04 COLLATERALIZATION_FACTOR
in neutral price used in kicks

* fixed `testDepositTakeAndSettleByBucketTakeSubsetPool`

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* Moved `wmul` inside `mulDiv`

* fix position, rewards, and poolInfoUtils tests

* fix pool factory emit; fix borrowAndRepay tests

* updated ERC20PoolBorrowTest, ERC20PoolCollateralTest, and ERC20PoolDebtExceedsDepositTest

* rounding update

* updated ERC20PoolQuoteTokenTest and ERC20PoolPrecisionTest

* Fix ERC721 unit tests

* Fix ERC20PoolLiquidationsArbTakeTest and ERC20PoolLiquidationsDepositTakeTest

* Fix ERC20PoolFactory, ERC20PoolLenderKick and ERC20PoolKick

* Fix ERC20PoolLiquidationSettleFuzzyTest and ERC20PoolLiquidationTakeFuzzyTest

* Fix ERC20PoolLiquidationsMisc

* Fix ERC20PoolLiquidationsLowPriceCollateralTest, ERC20PoolLiquidationsTakeAndRepayAllDebtInPoolTest and PositionManagerERC20PoolTest

* Fix ERC20PoolLiquidationsSettle test

* Fix testTakeWithFlashLoan test

* Fix ERC20PoolLiquidationsTakeTest

* Include COLLATERALIZATION_FACTOR in loanInfo

* Remove redundant code from testTakeAndSettle that was already been tested in other tests

* Update testTakeAndSettle

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: prateek105 <prateek@ajna.finance>

* Kirill [M-07] | Liquidation of positions with bad debt can cause losses for `HPB` depositors (#1024)

- Don’t allow calls to `kickReserveAuction` until all pending auctions are fully settled - revert with AuctionNotCleared if so
- update unit test to cover scenario
- apply consistent style for _revertIfAuctionPriceBelow helper (storage param first)

* Fixed Take event emit for ERC721 pools (#1026)

* fixed emit for take

* Fix testDepositTakeAndSettleByRegularTakeSubsetPool

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: prateek105 <prateek@ajna.finance>

* removed COLLATERALIZATION_FACTOR where it was not used (#1018)

* removed collateralization_factor where it was not used

* Import missing COLLATERALIZATION_FACTOR

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: prateek105 <prateek@ajna.finance>

* Address merge-rc9 PR feedback (#1025)

* reuse pendingInflator logic

* better wording

---------

Co-authored-by: prateek105 <prateek@ajna.finance>

* Expand code coverage (#1013)

* Universal deposit fee (#983)

* charge fee on all deposit

* unit tests compile

* test harness updates

* working on ERC20PoolQuoteTokenTest

* removed deposit fee cap

* more work on ERC20PoolQuoteTokenTest

* do not charge deposit fee if moving liquidity to higher price

* Eliminate reserves bad debt allocation and add margin to TP  (#962)

* this underflows instead of giving expected revert

* move isCollateralized check after updating borrower collateral

* remove local calculation of encumbered collateral

* trying to properly fix testBorrowRepayPrecision

* resolve rounding issue in fuzz test

* testCollateralization improvements

* updated unit tests for new _collateralization implementation

* more collateralization tests

* Add 1.04 factor in borrower collateralization

* Update nptp ratio to '1 + sqrt(r)/2'

* Remove Settle debt with pool reserves

* Remove 0.995 factor from claimable reserves calculation

* Update bond factor calculation to minimum 0.005

* added testcase where debt exceeds deposit

* updated test so debt exceeds deposit

* allow  up to half of current orig fee to be used to settle bad debt

* updated testTakeAndSettle

* more test fixes

* Enabled settling with all reserves if
 Deposits.treeSum==0 or 72 hrs pass

* cleanup

* Half orig fee res | Matt example (#966)

* added Matts test as proof that attack no longer works on his branch

* Revert "Remove multicall from position manager (#948)" (#961)

This reverts commit f540c8a75fe58b9fdb8249da33f271a5f0ad335c.

* added test testSpendOrigFeePushBadDebtToBorrowers test

* cleaned up testStealReservesWithMarginm to match minted balances

* responded to Matts comments

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Revert "Remove Settle debt with pool reserves"

This reverts commit 290d6cf6f7baa1fb17a66322faf755b78a4a379c.

* Update half origination fees reserves settlement time to 144 hours from kickTime

* Fix alignment and extra spaces

* Fix some unit tests

* PR feedback

* Update encumberance and collateralization method in poolInfoUtils

* Fix some unit tests

---------

Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Fix invariant setup

* Fix some unit tests

* ERC20PoolQuoteTokenTest updated

* updated ERC20PoolPurchaseQuoteTokenTest

* Fixed tests in ERC20PoolReserveAuction.t.sol

* updated ERC20PoolBorrowTest and ERC20PoolBorrowFuzzyTest

* Fix ERC20PoolCollateral and ERC20PoolInfoUtils tests

* Fixed ERC20 arbtake and depositTake tests

* Fix ERC20PoolLiquidationsKickTest, ERC20PoolLiquidationKickFuzzyTest and ERC20PoolLiquidationsLenderKickAuctionTest

* updated ERC20PoolMulticallTest

* cleaned up ERC20PoolDebtExceedsDepositTest

* fixed testTakeLoanColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosResidual

* fixed testTakeCallerColConstraintBpfNegResidual

* fixed testTakeLoanDebtConstraintBpfPosResidual

* fixed testTakeAndSettle

* cleaned up ERC20PoolDebtExceedsDepositTest

* updated ERC20PoolPrecisionTest

* Update ERC20PoolLiquidationsSettleTest

* Update ERC20PoolLiquidationsMisc

* Update ERC20PoolLiquidationSettleFuzzyTest

* Update ERC20PoolLiquidationTakeFuzzyTest

* fixeed revert tests

* ERC20PoolLiquidationsTake -- fixed rest

* Mh update tests (#985)

* fix most position manager tests

* fix additional pm tests

* fix rewards requiredCollateralRewards setup

* fix ClaimRewards tests

* update additional rewards manager tests

* fix additional tests

* more test fixes

* commit wip bankruptcy tests

* fixed testMoveLiquidityToOverwriteBankruptBucket

* fix additional tests

* fix testMoveLiquidityWithDebtInPool

* fix remaining rewards manager tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mwc <matt@ajna.finance>

* Add 1.04 factor in HTP calculations (#987)

* Add 1.04 factor in HTP calculations

* Add COLLATERALIZATION_FACTOR constant in PoolHelpers

* Add collateralization factor in dwatp

* Fix poolPricesInfo

* Update ERC20PoolBorrowFuzzyTest

* Fix some unit tests

* Fix some unit tests

* Fix some unit tests

* Update ERC20PoolTransferLPs

* fix most rewards manager tests

* update remaining rewards manager tests

* update ERC721SubsetPoolBorrowTest and commit wip changes to testMergeOrRemoveERC721Collateral

* updated testSettlePartialDebtSubsetPool (#988)

* updated testSettlePartialDebtSubsetPool

* re-added teardown

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fix ERC721PoolCollateral tests

* fix borrowRepayDebtFuzzy and additional PM tests

* cleaned up testBorrowAndRepayWith4DecimalQuote

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Fix some unit tests

* Deployment updates for RC8+ releases (#986)

* cherry-picked from master

* updated README

* Fix ERC721PoolLiquidationsTakeTest

* updated ERC721PoolReserveAuctionTest

* updated testMergeOrRemoveERC721Collateral (#989)

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* updated ERC721PoolPurchaseQuoteTest and fixed bug in ERC721 tearDown

* cleaned up testLiquidationLenderKickAuction, testLiquidationSingleBorrower, testSettleAuctionWithoutTakes

* updated testMoveLiquidityToOverwriteBankruptBucket

* updated PoolHelperTest

* cleaned up asserts in addLiquidity

* update testMoveLiquidityInBankruptBucket_LP_report_179_494

* updated ERC721PoolEMAsTest

* fixed testKickHighThresholdPriceBorrower

* updated testBorrowerInterestCalculationAfterRepayingAllDebtOnce and testBorrowerInterestCalculation

* updated testMultipleBorrowerInterestAccumulation

* Fix regression tests

* updated RE3, fixed _addQuoteToken

* addQuoteToken - return amount added (#993)

* addQuoteToken now returns amount added

* update unit tests to validate return values

* Fix up add liquidity (#992)

* cleaned up addLiquidity() method in ERC20PoolLiquidationsScaled.t.sol

* remove console

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fixed issue with test_regression_fenwick_index_2 in non-18-decimal env

* added regression tests for two failing reserves scenarios

* rename tests such that automake runs them with other regression tests

* UnboundedLiquidationPoolHandler bucketTake fix (#994)

* updated UnboundedLiquidationPoolHandler to handle compensated collateral in bucketTake

* cleanup, trap unhandled use case

* settle event now emits actual debt settled rather than t0 amount (#999)

* settle event now emits actual debt settled rather than t0 amount

* updated test_regression_settle_with_reserves

* Updated auctionInfo (#996)

* add thresholdPrice to auctionInfo; update test iterface usages

* temp fix tests

* remove unneeded comment

* Update auction status (#998)

* wip auction status update w/ stack too deep

* update auctionStatus; add auctionInfo method to poolInfoUtils

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* updated brownie tests, removed obsolete invariant tests (#1001)

* Block addqt above auction price (#997)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* added unit test showing adding qt above auction price reverts

* updated nit spellings

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Invariant testing fixes (#1006)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* documented a sample of invariant failures in regression tests

* added unit test showing adding qt above auction price reverts

* fixed _isCollateralized bug not returning true in all 0-debt use cases

* updated nit spellings

* fixed underflow calculating kicker reward

* _repayDebtByThirdParty should check for expected pool errors

* Round down when reward kicker, round up when kicker is penalized
Fix roundings in tests

* update test comments

* fix and enable A9 invariant

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* RC9 suggested improvements (#1005)

* Revert AuctionNotTakeable in same place, load auction kickTime only once from storage

* Calculate ERC721 collateralTaken only once
cosmetize code (read from result struct in local var and reuse)
Results in shrinking a little bit contract sizes

* Read borrower Np Tp ratio from storage only once when kick

* If block style, proper indentation

* Proposed changes to PR #972:
- avoid calculating current LUP twice in lender kick
- change _kick function to accept proposed LUP (for regular kick proposed LUP is current LUP, for lender kick proposed LUP is calculated based on additional debt)
- in both kick cases return current LUP in kick result
- reduce gas costs by saving a Fenwick traversal
- reduce contract size by removing LUP calculation within Pool

* Cosmetic flashloan code changes, PoolCommons.flashLoan doesn't return false but always reverts if flashloan fails

* PR#983 style, remove redundant line

* PR#999 suggested improvement - calculate current settled debt only once and include in settle result for state update

* PR #962 proposed changes:
- get Fenwick deposits only once when settle with reserves
- define constants for min bond factor and max npTp ratio values

* PR #987 proposed improvement:
- add and reuse _htp helper function (instead duplicated maths)

* Continuation of PR #962: (#1008)

- Record settle amount limmit in Liquidtion struct, at the time of kick (that is instead incrementing accumulator in Borrower struct, each time debt is drawn)
- This way accumulator will be reseted when auction is settled
- fix tests

TODO:
- assert Liquidation.t0ReserveSettleAmount in unit tests (_assertAuction), make sure is set to 0 after auction settled and decreased when partial settles done
- update invariant test to check new introduced accumulator

* Misc test fixes (#1009)

* handle another reward rounding error use case

* fix intermittant fuzz test failure - cannot draw debt from liquidity in bucket 7388

* PositionManager should expect AddAboveAuctionPrice, which can happen in moveLiquidity

* Invariant fix: round up quote tokens calculated from rewarded LP (because LP rewarded are calculated in bucketTake as rewarded quote tokens -> LP rounded down)

* full coverage of PermitERC20 and poolInfoUtils

* create liquidation in PoolInfoUtils test (#1015)

---------

Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Prateek Gupta <prateek105@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: prateek105 <prateek@ajna.finance>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mattcushman <36414299+mattcushman@users.noreply.github.com>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* Take high price (#1016)

* Universal deposit fee (#983)

* charge fee on all deposit

* unit tests compile

* test harness updates

* working on ERC20PoolQuoteTokenTest

* removed deposit fee cap

* more work on ERC20PoolQuoteTokenTest

* do not charge deposit fee if moving liquidity to higher price

* Eliminate reserves bad debt allocation and add margin to TP  (#962)

* this underflows instead of giving expected revert

* move isCollateralized check after updating borrower collateral

* remove local calculation of encumbered collateral

* trying to properly fix testBorrowRepayPrecision

* resolve rounding issue in fuzz test

* testCollateralization improvements

* updated unit tests for new _collateralization implementation

* more collateralization tests

* Add 1.04 factor in borrower collateralization

* Update nptp ratio to '1 + sqrt(r)/2'

* Remove Settle debt with pool reserves

* Remove 0.995 factor from claimable reserves calculation

* Update bond factor calculation to minimum 0.005

* added testcase where debt exceeds deposit

* updated test so debt exceeds deposit

* allow  up to half of current orig fee to be used to settle bad debt

* updated testTakeAndSettle

* more test fixes

* Enabled settling with all reserves if
 Deposits.treeSum==0 or 72 hrs pass

* cleanup

* Half orig fee res | Matt example (#966)

* added Matts test as proof that attack no longer works on his branch

* Revert "Remove multicall from position manager (#948)" (#961)

This reverts commit f540c8a75fe58b9fdb8249da33f271a5f0ad335c.

* added test testSpendOrigFeePushBadDebtToBorrowers test

* cleaned up testStealReservesWithMarginm to match minted balances

* responded to Matts comments

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Revert "Remove Settle debt with pool reserves"

This reverts commit 290d6cf6f7baa1fb17a66322faf755b78a4a379c.

* Update half origination fees reserves settlement time to 144 hours from kickTime

* Fix alignment and extra spaces

* Fix some unit tests

* PR feedback

* Update encumberance and collateralization method in poolInfoUtils

* Fix some unit tests

---------

Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Fix invariant setup

* Fix some unit tests

* ERC20PoolQuoteTokenTest updated

* updated ERC20PoolPurchaseQuoteTokenTest

* Fixed tests in ERC20PoolReserveAuction.t.sol

* updated ERC20PoolBorrowTest and ERC20PoolBorrowFuzzyTest

* Fix ERC20PoolCollateral and ERC20PoolInfoUtils tests

* Fixed ERC20 arbtake and depositTake tests

* Fix ERC20PoolLiquidationsKickTest, ERC20PoolLiquidationKickFuzzyTest and ERC20PoolLiquidationsLenderKickAuctionTest

* updated ERC20PoolMulticallTest

* cleaned up ERC20PoolDebtExceedsDepositTest

* fixed testTakeLoanColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosResidual

* fixed testTakeCallerColConstraintBpfNegResidual

* fixed testTakeLoanDebtConstraintBpfPosResidual

* fixed testTakeAndSettle

* cleaned up ERC20PoolDebtExceedsDepositTest

* updated ERC20PoolPrecisionTest

* Update ERC20PoolLiquidationsSettleTest

* Update ERC20PoolLiquidationsMisc

* Update ERC20PoolLiquidationSettleFuzzyTest

* Update ERC20PoolLiquidationTakeFuzzyTest

* fixeed revert tests

* ERC20PoolLiquidationsTake -- fixed rest

* Mh update tests (#985)

* fix most position manager tests

* fix additional pm tests

* fix rewards requiredCollateralRewards setup

* fix ClaimRewards tests

* update additional rewards manager tests

* fix additional tests

* more test fixes

* commit wip bankruptcy tests

* fixed testMoveLiquidityToOverwriteBankruptBucket

* fix additional tests

* fix testMoveLiquidityWithDebtInPool

* fix remaining rewards manager tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mwc <matt@ajna.finance>

* Add 1.04 factor in HTP calculations (#987)

* Add 1.04 factor in HTP calculations

* Add COLLATERALIZATION_FACTOR constant in PoolHelpers

* Add collateralization factor in dwatp

* Fix poolPricesInfo

* Update ERC20PoolBorrowFuzzyTest

* Fix some unit tests

* Fix some unit tests

* Fix some unit tests

* Update ERC20PoolTransferLPs

* fix most rewards manager tests

* update remaining rewards manager tests

* update ERC721SubsetPoolBorrowTest and commit wip changes to testMergeOrRemoveERC721Collateral

* updated testSettlePartialDebtSubsetPool (#988)

* updated testSettlePartialDebtSubsetPool

* re-added teardown

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fix ERC721PoolCollateral tests

* fix borrowRepayDebtFuzzy and additional PM tests

* cleaned up testBorrowAndRepayWith4DecimalQuote

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Fix some unit tests

* Deployment updates for RC8+ releases (#986)

* cherry-picked from master

* updated README

* Fix ERC721PoolLiquidationsTakeTest

* updated ERC721PoolReserveAuctionTest

* updated testMergeOrRemoveERC721Collateral (#989)

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* updated ERC721PoolPurchaseQuoteTest and fixed bug in ERC721 tearDown

* cleaned up testLiquidationLenderKickAuction, testLiquidationSingleBorrower, testSettleAuctionWithoutTakes

* updated testMoveLiquidityToOverwriteBankruptBucket

* updated PoolHelperTest

* cleaned up asserts in addLiquidity

* update testMoveLiquidityInBankruptBucket_LP_report_179_494

* updated ERC721PoolEMAsTest

* fixed testKickHighThresholdPriceBorrower

* updated testBorrowerInterestCalculationAfterRepayingAllDebtOnce and testBorrowerInterestCalculation

* updated testMultipleBorrowerInterestAccumulation

* Fix regression tests

* updated RE3, fixed _addQuoteToken

* addQuoteToken - return amount added (#993)

* addQuoteToken now returns amount added

* update unit tests to validate return values

* Fix up add liquidity (#992)

* cleaned up addLiquidity() method in ERC20PoolLiquidationsScaled.t.sol

* remove console

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fixed issue with test_regression_fenwick_index_2 in non-18-decimal env

* added regression tests for two failing reserves scenarios

* rename tests such that automake runs them with other regression tests

* UnboundedLiquidationPoolHandler bucketTake fix (#994)

* updated UnboundedLiquidationPoolHandler to handle compensated collateral in bucketTake

* cleanup, trap unhandled use case

* settle event now emits actual debt settled rather than t0 amount (#999)

* settle event now emits actual debt settled rather than t0 amount

* updated test_regression_settle_with_reserves

* Updated auctionInfo (#996)

* add thresholdPrice to auctionInfo; update test iterface usages

* temp fix tests

* remove unneeded comment

* Update auction status (#998)

* wip auction status update w/ stack too deep

* update auctionStatus; add auctionInfo method to poolInfoUtils

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* updated brownie tests, removed obsolete invariant tests (#1001)

* Block addqt above auction price (#997)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* added unit test showing adding qt above auction price reverts

* updated nit spellings

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Invariant testing fixes (#1006)

* initial commit

* tweaks to Matt's PR to block adding quote token above auction price (#1000)

* reduce cost of reference price assignment

* reduce pool contract size

* fixed testDepositTakeAndSettleByRegularTakeSubsetPool

* fixed tests in ERC20PoolLiquidationsArbTake.t.sol

* fixed tests in ERC20PoolLiquidationsDepositTake.sol

* fixed two more

* updated testDepositTakeAndSettleSubsetPool

* updated testKickAndSettleSubsetPoolFractionalCollateral

* updated testSettleWithDepositFuzzy

* Fixed final tests

* add "AddAboveAuctionPrice" as expected pool error

* implemented invariant A9: reference prices in liquidation queue shall not decrease

* Update assertAuction to use ThresholdPrice from auctionInfo (#1003)

* use auctionInfo thresholdprice instead of recalculating

* fix most tests

* update remaining tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>

* Contract size mitigation (#1004)

* moved debtInfo to PoolCommons, saving 10 bytes

* moved withdrawBonds to KickerActions

* documented a sample of invariant failures in regression tests

* added unit test showing adding qt above auction price reverts

* fixed _isCollateralized bug not returning true in all 0-debt use cases

* updated nit spellings

* fixed underflow calculating kicker reward

* _repayDebtByThirdParty should check for expected pool errors

* Round down when reward kicker, round up when kicker is penalized
Fix roundings in tests

* update test comments

* fix and enable A9 invariant

---------

Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* RC9 suggested improvements (#1005)

* Revert AuctionNotTakeable in same place, load auction kickTime only once from storage

* Calculate ERC721 collateralTaken only once
cosmetize code (read from result struct in local var and reuse)
Results in shrinking a little bit contract sizes

* Read borrower Np Tp ratio from storage only once when kick

* If block style, proper indentation

* Proposed changes to PR #972:
- avoid calculating current LUP twice in lender kick
- change _kick function to accept proposed LUP (for regular kick proposed LUP is current LUP, for lender kick proposed LUP is calculated based on additional debt)
- in both kick cases return current LUP in kick result
- reduce gas costs by saving a Fenwick traversal
- reduce contract size by removing LUP calculation within Pool

* Cosmetic flashloan code changes, PoolCommons.flashLoan doesn't return false but always reverts if flashloan fails

* PR#983 style, remove redundant line

* PR#999 suggested improvement - calculate current settled debt only once and include in settle result for state update

* PR #962 proposed changes:
- get Fenwick deposits only once when settle with reserves
- define constants for min bond factor and max npTp ratio values

* PR #987 proposed improvement:
- add and reuse _htp helper function (instead duplicated maths)

* Continuation of PR #962: (#1008)

- Record settle amount limmit in Liquidtion struct, at the time of kick (that is instead incrementing accumulator in Borrower struct, each time debt is drawn)
- This way accumulator will be reseted when auction is settled
- fix tests

TODO:
- assert Liquidation.t0ReserveSettleAmount in unit tests (_assertAuction), make sure is set to 0 after auction settled and decreased when partial settles done
- update invariant test to check new introduced accumulator

* Misc test fixes (#1009)

* handle another reward rounding error use case

* fix intermittant fuzz test failure - cannot draw debt from liquidity in bucket 7388

* PositionManager should expect AddAboveAuctionPrice, which can happen in moveLiquidity

* Invariant fix: round up quote tokens calculated from rewarded LP (because LP rewarded are calculated in bucketTake as rewarded quote tokens -> LP rounded down)

* initial commit

* cleaned up, its executing

* updated

* rough draft of tests written

* cleaned up examples added collateral asserts

* borrower change not needed in PR

* added new class inside ERC721PoolLiquidationsTake.t.sol

* updated tests to adjust for take event

---------

Co-authored-by: Ed Noepel <46749157+EdNoepel@users.noreply.github.com>
Co-authored-by: Prateek Gupta <prateek105@users.noreply.github.com>
Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>
Co-authored-by: prateek105 <prateek@ajna.finance>
Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mattcushman <36414299+mattcushman@users.noreply.github.com>
Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* Emit subset hash on pool creation (#1029)

* updated unit tests following merge of PR#1013 (#1030)

* Continuation of #1021 - clear TP naming and improved code descriptions (#1027)

* Continuation of #1021 - better naming and improved code descriptions
- change Loan.thresholdPrice and Liquidation.thresholdPrice to unadjustedThresholdPrice naming in order to reflect Collateral factor not applied to these values
- reflect in var names where max unadjusted threshold price is used (Move/Remove param struct)
- natspec update

- rename MAX_NP_TP_RATIO to MAX_BOND_FACTOR

* clear Tp naming
        - t0DebtToCollateral : ( t0Debt / collateral )
        - debtToCollateral :   ( debt / collateral )
        - t0ThresholdPrice :   ( t0Debt / collateral ) * collateralization factor
        - thresholdPrice :     ( debt / collateral ) * collateralization factor

* Fix HeapTest

* Update LoansInfo and LoanInfo methods to return maxT0DebtToCollateral and t0DebtToCollateral

* Fix unit tests

* Update assertLoans in tests and fix htp in BaseHandler

* Update loansInfo and threshold Price in Loans library

* Rename thresholdPrice to debtToCollateral in assertAuction in tests

* updated zerothresholdprice error to zerodebttocollateral

* removed unused _htp import in pool.sol

* updated invariants to include ZeroDebtToCollateral

* Use SafeCast in Loans library

---------

Co-authored-by: prateek105 <prateek@ajna.finance>
Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Fix unit test (#1034)

* `_revertIfActiveAuctions` helper should revert with `ActiveAuction` error (#1031)

* _revertIfActiveAuctions helper should revert with ActiveAuction error

* Fix comment

* added min protection to restrict underflow on `bucketTake` (#1033)

* added min protection to restrict ability to underflow

* updated repay

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Calculate reserve auction price using kicked amount (#1032)

* implement reserve auction pricing as originally described in whitepaper

* bug fixes

* wip updating RewardsManager tests

* disable rewards unit tests

* handle 0 bids on reserve auctions

* updated erc721 reserve auction unit tests

* fixed issue bidding on more than the quote token trading increment

* updated new unit test

* added tearDown to testZeroBid

* removed rayToWad

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* Modify computation of quotetoken amount in TakerActions.sol (#1035)

* test_regression_exchange_rate_failure

* Modify computation of quotetoken amount in TakerActions.sol
to compute bond reward accurately for collateral constrained
takes with collateral tokens with decimals != 18.

* Fix tests (#1036)

* updated baseline

---------

Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* Invariants improvements (#955)

* Fix test_regression_failure_A8_5

* Remove repayDebtByThirdParty handler in SettleERC20PoolHandler, as repayment for borrower in auction is restricted

* Add failing regression test_regression_bucket_take_arithmetic_over_underflow

* Fix test_regression_bucket_take_arithmetic_over_underflow

* Invariant RE9 improvement

* Add failing regression test_regression_bucket_take_reserves_failure

* Fix test_regression_bucket_take_reserves_failure

* Add failing regression test_regression_bucket_take_re9_failure

* Move failing regression tests to RegressionTestReservesWith8QuotePrecision12CollateralPrecisionERC20Pool

* Fix test_regression_bucket_take_re9_failure

* Fix regression tests failing due to reserve error margin calculation when auction price is 0

* Universal deposit fee (#983)

* charge fee on all deposit

* unit tests compile

* test harness updates

* working on ERC20PoolQuoteTokenTest

* removed deposit fee cap

* more work on ERC20PoolQuoteTokenTest

* do not charge deposit fee if moving liquidity to higher price

* Eliminate reserves bad debt allocation and add margin to TP  (#962)

* this underflows instead of giving expected revert

* move isCollateralized check after updating borrower collateral

* remove local calculation of encumbered collateral

* trying to properly fix testBorrowRepayPrecision

* resolve rounding issue in fuzz test

* testCollateralization improvements

* updated unit tests for new _collateralization implementation

* more collateralization tests

* Add 1.04 factor in borrower collateralization

* Update nptp ratio to '1 + sqrt(r)/2'

* Remove Settle debt with pool reserves

* Remove 0.995 factor from claimable reserves calculation

* Update bond factor calculation to minimum 0.005

* added testcase where debt exceeds deposit

* updated test so debt exceeds deposit

* allow  up to half of current orig fee to be used to settle bad debt

* updated testTakeAndSettle

* more test fixes

* Enabled settling with all reserves if
 Deposits.treeSum==0 or 72 hrs pass

* cleanup

* Half orig fee res | Matt example (#966)

* added Matts test as proof that attack no longer works on his branch

* Revert "Remove multicall from position manager (#948)" (#961)

This reverts commit f540c8a75fe58b9fdb8249da33f271a5f0ad335c.

* added test testSpendOrigFeePushBadDebtToBorrowers test

* cleaned up testStealReservesWithMarginm to match minted balances

* responded to Matts comments

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Revert "Remove Settle debt with pool reserves"

This reverts commit 290d6cf6f7baa1fb17a66322faf755b78a4a379c.

* Update half origination fees reserves settlement time to 144 hours from kickTime

* Fix alignment and extra spaces

* Fix some unit tests

* PR feedback

* Update encumberance and collateralization method in poolInfoUtils

* Fix some unit tests

---------

Co-authored-by: Ed Noepel <ed@noepel.net>
Co-authored-by: Ian Harvey <iharvey@comcast.net>
Co-authored-by: mwc <matt@ajna.finance>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored-by: Mike Hathaway <mahathaway93@gmail.com>

* Fix invariant setup

* Fix some unit tests

* ERC20PoolQuoteTokenTest updated

* updated ERC20PoolPurchaseQuoteTokenTest

* Fixed tests in ERC20PoolReserveAuction.t.sol

* updated ERC20PoolBorrowTest and ERC20PoolBorrowFuzzyTest

* Fix ERC20PoolCollateral and ERC20PoolInfoUtils tests

* Fixed ERC20 arbtake and depositTake tests

* Fix ERC20PoolLiquidationsKickTest, ERC20PoolLiquidationKickFuzzyTest and ERC20PoolLiquidationsLenderKickAuctionTest

* updated ERC20PoolMulticallTest

* cleaned up ERC20PoolDebtExceedsDepositTest

* fixed testTakeLoanColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosNoResidual

* fixed testTakeCallerColConstraintBpfPosResidual

* fixed testTakeCallerColConstraintBpfNegResidual

* fixed testTakeLoanDebtConstraintBpfPosResidual

* fixed testTakeAndSettle

* cleaned up ERC20PoolDebtExceedsDepositTest

* updated ERC20PoolPrecisionTest

* Update ERC20PoolLiquidationsSettleTest

* Update ERC20PoolLiquidationsMisc

* Update ERC20PoolLiquidationSettleFuzzyTest

* Update ERC20PoolLiquidationTakeFuzzyTest

* fixeed revert tests

* ERC20PoolLiquidationsTake -- fixed rest

* Mh update tests (#985)

* fix most position manager tests

* fix additional pm tests

* fix rewards requiredCollateralRewards setup

* fix ClaimRewards tests

* update additional rewards manager tests

* fix additional tests

* more test fixes

* commit wip bankruptcy tests

* fixed testMoveLiquidityToOverwriteBankruptBucket

* fix additional tests

* fix testMoveLiquidityWithDebtInPool

* fix remaining rewards manager tests

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: mwc <matt@ajna.finance>

* Add 1.04 factor in HTP calculations (#987)

* Add 1.04 factor in HTP calculations

* Add COLLATERALIZATION_FACTOR constant in PoolHelpers

* Add collateralization factor in dwatp

* Fix poolPricesInfo

* Update ERC20PoolBorrowFuzzyTest

* Fix some unit tests

* Fix some unit tests

* Fix some unit tests

* Update ERC20PoolTransferLPs

* fix most rewards manager tests

* update remaining rewards manager tests

* update ERC721SubsetPoolBorrowTest and commit wip changes to testMergeOrRemoveERC721Collateral

* updated testSettlePartialDebtSubsetPool (#988)

* updated testSettlePartialDebtSubsetPool

* re-added teardown

---------

Co-authored-by: Ian Harvey <iharvey@comcast.net>

* fix ERC721PoolCollateral tests

* fix borrowRepayDebtFuzzy and additional PM tests

* cleaned up testBorrowAndRepayWith4DecimalQuote

---------

Co-authored-by: Mike <mikehathaway@makerdao.com>
Co-authored-by: Ian Harvey <ith.harvey@gmail.com>
Co-authored…
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

Successfully merging this pull request may close these issues.

5 participants