# defihack.xyz
## 1. May The Force Be With You
Цель:
- Забрать все токены YODA с смартконтракта
### Анализ
В коде представлены две сущности:
- MayTheForceBeWithYou (inherited from ERC20, ReentrancyGuard)
- MiniMeToken (inherited from Ownable)
Обе сущности - токены. Однако MayTheForceBeWithYou (xYODA) релизует надстройку над MiniMeToken (YODA).
При вызове deposit() xYODA выполняется странный кусок кода:
```solidity
function deposit(uint256 amount) external nonReentrant {
...
// If no xYODA exists, mint it 1:1 to the amount put in
if (totalShares == 0 || totalYoda == 0) {
_mint(msg.sender, amount);
}
...
}
```
Если у того кто вызывает эту функцию нет YODA на балансе (или totalShares == 0), то ему выдаётся то количество xYODA, которое он запрашивает. Вероятно, это условие должно было выглядеть как `totalShares == 0 && totalYoda == 0` - т.е. тут логическая ошибка, которая позволяет нам получить любое количество xYODA.
Так как после этого мы получаем токены xYODA, то используя функцию withdraw мы можем вызвести токены YODA со смартконтракта.
## 3. P2PSwapper
Цель:
- Увести все WETH полученные как комиссии за транзакции
### Анализ
В коде представлены две сущности:
- P2P_WETH (токен, который используется для комиссии)
- P2PSwapper (обменик)
P2PSwapper реализует работу со сделками. Схематично сделку через этот контракт можно представить следующим образом:
```mermaid
sequenceDiagram
actor User1
participant P2PSwapper
actor User2
rect rgb(191, 223, 255)
User1->>P2PSwapper: createDeal(bidToken, bidPrice, askToken, askAmount)
User1-->>P2PSwapper: fee
User1-->>P2PSwapper: bidToken
end
rect rgb(200, 150, 255)
User2->>P2PSwapper: takeDeal(dealId)
User2-->>User1: askToken
P2PSwapper-->>User2: bidToken
end
```
Отмена сделки будет выглядеть следующим образом:
```mermaid
sequenceDiagram
actor User1
participant P2PSwapper
rect rgb(191, 223, 255)
User1->>P2PSwapper: createDeal(bidToken, bidPrice, askToken, askAmount)
User1-->>P2PSwapper: fee
User1-->>P2PSwapper: bidToken
end
rect rgb(200, 150, 255)
User1->>P2PSwapper: cancelDeal(dealId)
P2PSwapper-->>User1: bidToken
end
```
Однако нет никакой проверки, была ли сделка уже отменена. Поэтому мы можем отменить сделку два и более раз, выводя любое количество bidToken со смартконтракта:
```mermaid
sequenceDiagram
actor User1
participant P2PSwapper
rect rgb(191, 223, 255)
User1->>P2PSwapper: createDeal(bidToken, bidPrice, askToken, askAmount)
User1-->>P2PSwapper: fee
User1-->>P2PSwapper: bidToken
end
rect rgb(200, 150, 255)
User1->>P2PSwapper: cancelDeal(dealId)
P2PSwapper-->>User1: bidToken
end
rect rgb(200, 150, 255)
User1->>P2PSwapper: cancelDeal(dealId)
P2PSwapper-->>User1: bidToken
end
rect rgb(200, 150, 255)
User1->>P2PSwapper: cancelDeal(dealId)
P2PSwapper-->>User1: bidToken
end
rect rgb(200, 150, 255)
User1->>P2PSwapper: cancelDeal(dealId)
P2PSwapper-->>User1: bidToken
end
```
Код эксплойтов на гитхаб:
- https://github.com/ArturLukianov/defihack-solutions/blob/main/scripts/exploit-1.js
- https://github.com/ArturLukianov/defihack-solutions/blob/main/scripts/exploit-3.js