# GMX что сделано + пояснения
## HIGH 1. Market prices for underlying tokens can make `USDG` under-collateralized. In this case some of LPs will not be able to withdraw.
**Что изменил:**
- добавил ссылку (но это по сути весь код функций buyUSDG()+sellUSDG())
- еще добавил абзац, где придумал более наглядную математику
**Что думаю:**
- в баунти отправлять не нужно, т.к. скорее всего эта проблема менеджится по факту токеном GLP. USDG как токен не ходит между юзерами, он почти весь держится контрактом GLPManager:
https://arbiscan.io/token/0x45096e7aa921f27590f8f19e457794eb09678141#balances
GLP уже позволяет входить/выходить по классической shares логике.
Но это уже Out of Scope.
- по мне где-то между High и Medium. Ибо это дизайн а не дыра. В лендингах тоже не все ликвидити провайдеры могут вытащить свои токены. До High натягиваю, потому что в нашем упражнении мы представляем что делаем заказной аудит, где есть Scope и не-Scope. Ну и представляем что не Подсматриваем на положение дел в сети.
- кстати связка GLP и USDG у меня вызывает большое любопытство, надеюсь в свободное время гляну как там
## HIGH 2. Irrelevant oracle return selection for stablecoins in case of their depeg.
**Что изменил:**
- было длинное название, сократил
**Что думаю:**
- написал подробное описание, которое можно им заслать, вышло много
https://hackmd.io/@Xbg00EiJQ-a4a46Yn6SZJA/H1xJW1qhi
- я там повысил серьезность, связанный с токеном GLP
При своем минте он в качестве знаминателя берет AUM ваулта - а его считает как раз по getMaxPrice (возвращает 1). Поэтому депегнутый токен будет завышать AUM => занижать выпускаемые GLP.
Причем этот AUM считается на весь пул и для всех токенов сразу, поэтому не важно какой токен приносишь в качестве ликвидности - весь AUM все равно будет завышен засчет этого депегнутого токена на балансе. Поэтому весь GLP станет невыгодно минтить.
- кажется даже, что могу еще что-то более суровое придумать на этой почве, но это надо на GLP побольше посидеть, я его пока поверхностно посмотрел
## HIGH 3. Price feed from AMM V1 is too controllable
**Что изменил:**
- ты просил понизить до Медиума. Но у меня есть контр-тезис, поэтому не исправил, сейчас обосную.
**Что думаю:**
- ты пишешь medium `because admin needs to set useV2Pricing to false`
- но там наоборот при деплое стоит, как дефолтное значение используется корявый V1
`bool public useV2Pricing = false;`
https://github.com/gmx-io/gmx-contracts/blob/96e516bc8d0979c51c7fdffee50622415d5c411d/contracts/core/VaultPriceFeed.sol#L31
а еще
`bool public isAmmEnabled = true;`
https://github.com/gmx-io/gmx-contracts/blob/96e516bc8d0979c51c7fdffee50622415d5c411d/contracts/core/VaultPriceFeed.sol#L29
или действительно ставить priceV2 (сейчас кстати V1 используется)
- поэтому им надо для закрытия этого вектора вызывать отдельную функцию будет
https://github.com/gmx-io/gmx-contracts/blob/96e516bc8d0979c51c7fdffee50622415d5c411d/contracts/core/VaultPriceFeed.sol#L91-L93
- интересный вектор атаки появляется в связке с GLP. Юзер несет ликвидность в токене. Через бандл флэшботов атакующий фронтраном занижает цену, бэкраном возвращет цену обратно. Юзерская транзакция посередине получит на свои токены очень мало USDG. И тогда будет получаться что юзеры кладут много токенов, но получают мало GLP. В этом смысле все другие GLP холдеры в этот момент богатеют. Под таким соусом это даже крит.
- **Важно: в сети стоит isAmmEnabled = false**
https://arbiscan.io/address/0x2d68011bca022ed0e474264145f46cc4de96a002#readContract
**Поэтому на багбаунти отдать нельзя.**
Более того на странице Иммунифая пишут:
`Vault.includeAmmPrice and Vault.useSwapPricing are not reset to default values for certain cases, these variables will not be used`
https://immunefi.com/bounty/gmx/
В транзакциях тоже проверил, что цена АММ не используется.
## HIGH 4. `Vault.usdgAmounts[token]` sets zero in case of decrease below zero.
**Что изменил:**
- там была грубая рекомендация "ревертить если уходит в минус"
- твой комментарий `I think it will stop the whole protocol which is bad.`
- поправил на более абстрактный комментарий "что надо учитывать негативные числа"
**Что думаю:**
- тут я ошибся, что дал слишком директивную рекоммендацию как испралять, и взял ответственность за возможные новые баги. Это нехорошо и опасно.
## MEDIUM 6. Vault.upgradeVault() is a poor way to migrate to a new vault contract
**Что изменил:**
- был High, теперь Medium
- осознал, исправил
## LOW 5. Vault.directPoolDeposit() is a public function but is likely used by the goverance
**Что изменил:**
- комментарий: `it is an informational bug (low)`
- осознал, исправил