## CRIT суровый крит 1) надо взять большой борроу из любого пула, уменьшается баланс андрелаинга в пуле 1) потом сделать в него депозит, а шейры считаются от текущего баланса токенов - их там мало после борроу, значит выпишется огромное число шейров 3) Далее делаем репэй долга с закрытие позиции и возвращаем значение баланса в прежнее положение. 4) Делаем redeem своих шейрсов, забираем все средства из пула. ## CRIT ошибка в редиме пула в берн передается эмоунт, надо шейрс/lpAmount ``` function redeem(uint256 _lpAmount) external { require(_lpAmount > 0, "INCORRECT_REDEEM"); uint256 amount = _lpAmount * IERC20Ext(underlying).balanceOf(address(this)) / totalSupply; require(amount > 0, "INCORRECT_AMOUNT"); IERC20Ext(underlying).transfer(msg.sender, amount); _burn(msg.sender, amount); } ``` ## CRIT LP не умеет зарабтывать проценты, и скорее всего не сможет репэи совершить последние в borrow у нас `totalBorrowed += _amount` а в repay `totalBorrowed -= _amount` но через репэй возвращается больше средств, т.к. долги возвращаются с процентами поэтому totalBorrowed уйдет в андерфлоу ## HIGH bm.repay() для сценария когда close=True ``` require(leverageInfo[msg.sender][_token].borrowAmount == 0, "UNABLE_TO_CLOSE"); ILiquidityPool(registeredTokens[_token]).repay( leverageInfo[msg.sender][_token].leverageAmount + _amount, msg.sender ); leverageInfo[msg.sender][_token].leverageAmount = 0; uint256 base = IERC20Ext(_token).balanceOf(msg.sender); IERC20Ext(_token).transferFrom(msg.sender, registeredAccounts[msg.sender], base)` ``` Сперва делаем lp.repay(тело+процент) Внутри этой функции тело+процент пересылают в LP из аккаунта Затем base = баланс аакаунта Пересылаем этот баланс на registeredAccounts[msg.sender], а это оунер аккаунта. То есть мы еще и весь коллатерал возвращаем юзеру Что неправильно, ведь этот коллатерал может являться обеспечением других позиций для долга взятого в других токенах У нас в итоге нет способа уменьшить свой долг не убрав еще весь коллатерал в этой токене Это ошибка скорее всего ## HIGH _updateBorrow не начислят процент если успевать делать новую операцию с течение суток после предыдущей операции ## MEDIUM lp.deposit атака Кости ## LOW очень странная конструкция в healthFactor наверное второй аргумент имелся ввиду totalCollateral ``` if ((totalUnpayed == 0) && (totalUnpayed == 0)) { return 11111; } ``` ## LOW конечно же нельзя токены типо USDT конечно же нельзя ERC777, т.к. там в куче мест реентранси