---
# System prepended metadata

title: defihack.xyz

---

# 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