---
# System prepended metadata

title: Анализ смартконтрактов

---

# Анализ смартконтрактов

## Сбор
Для сбора используется smart-contract-sanctuary-ethereum (ныне https://github.com/tintinweb/smart-contract-sanctuary-ethereum/tree/master/utils)

- Скрипт собирает только 500 последних смартконтрактов

Для сбора с mainnet
```bash=
python download_etherscan.py -c etherscan.io
```
Смартконтракты будут в `../contracts/mainnet`

Следующие операции производятся из `..`

## Получть версию solidity
```bash=
cat contracts/mainnet/00/006dd3008e9f982aedb1ce815d359461e52b9c1c_CursedSudoPortraits.sol | grep pragma | cut -d' ' -f3 | tr -d ';^' | head -n1
```

## Фильтрация контрактов с балансом
```bash=
cat contracts/mainnet/contracts.json | jq 'select(.balance != "0 Ether")'
```

![](https://i.imgur.com/k9P0i14.png)


## Запуск slither для всех контрактов

```bash
mkdir -p slither-results

contracts=($(find ./contracts/mainnet -type f -name '*.sol'))

for contract in $contracts
do
    filename=$(basename $contract)
    solc_version=$(cat $contract | grep pragma | cut -d' ' -f3 | tr -d ';^' | head -n1 | tr -d '\r\n')
    solc-select install $solc_version
    solc-select use $solc_version
    echo $filename
    python3 -m slither $contract --json slither-results/$filename.json
done
```

## Запуск slither только для контрактов с балансом
```bash=
mkdir -p slither-results

contracts=($(find ./contracts/mainnet -type f -name '*.sol'))
addresses_with_balance=($(cat contracts/mainnet/contracts.json| jq 'select(.balance != "0 Ether")|.address' | tr -d '"'))

for contract in $contracts
do
    filename=$(basename $contract)
    echo $filename
    address=$(echo $filename | sed 's/_.*$//g' | sed 's/^/0x/g')
    if [[ " ${addresses_with_balance[*]} " =~ " ${address} " ]]; then
        solc_version=$(cat $contract | grep pragma | cut -d' ' -f3 | tr -d ';^' | head -n1 | tr -d '\r\n')
        solc-select install $solc_version
        solc-select use $solc_version
        python3 -m slither $contract --json slither-results/$filename.json
    fi
done
```

## Выбираем только те контракты, которые были проанализированны успешно
```bash
cat slither-results/*.json | jq 'select(.success)'
```

## Ищем смартконтракты с определённым impact

Impact - High:
```bash
rg '"impact": "High"' slither-results
```

![](https://i.imgur.com/pbzJnvq.png)

Другой способ (экспорт в Markdown):
```bash=
cat slither-results/*.json | jq -r 'select(.success)|.results.detectors[] | select(.impact=="High") | .description' | sed ':a;N;$!ba;s/\n\n/\n\n---\n\n/g' > slither-high.md
```
![](https://i.imgur.com/nKJET3s.png)

## Поиск смартконтрактов не используюзих ERC20, ERC721
```bash=
rg --files-without-match '(ERC20)|(ERC721)' contracts/mainnet/
```

Другой вариант (без ERC и BEP):
```bash=
rg --files-without-match '(ERC)|(BEP)' contracts/mainnet/
```

## Декодируем конструкторы смартконтрактов (in progress)
```bash=
contracts=($(find ./contracts/mainnet -type f -name '*.sol'))

for contract in $contracts
do
    filename=$(basename $contract)
    echo $filename
    address=$(echo $filename | sed 's/_.*$//g' | sed 's/^/0x/g')
    python3 get_constructor.py $address $contract
done
```

