# web3.py Cheatsheet

By [The Roccrypto](https://paragraph.com/@roccrypto) · 2024-03-08

---

_Данная статья больше подойдет тем, кто занимается кодингом на Python для своих потребностей в Web3 пространстве. Тут я подробно опишу репозиторий на Github, и расскажу чем он тебе пригодится._

[https://github.com/Nomzegh/web3py-cheatsheet](https://github.com/Nomzegh/web3py-cheatsheet)

* * *

### **Web3 Cheatsheet - твой помощник в написании будущих скриптов для всех существующих EVM сетей.**

> При многократном написании скриптов, вы наверное сталкивались с тем, что практически всегда вы пишете довольно похожий код на свои предыдущие. Согласен, в каждом проекте контракты и их функции обычно разные, но часть вашей работы над скриптом всегда будет повторяться.
> 
> Проще говоря, вы **создаете большой неповторяемый код** (абуз проекта `N`) **из маленьких повторяемых фич** (трансферы, аппрувы, чекер балансов, поддержка мультиакков, личный дисперс, прокси, …).

**Вот как раз для маленьких повторяемых фич и был создан этот репозиторий.**

![](https://storage.googleapis.com/papyrus_images/3db3f1034f438ffcc9be7f9e57f525abbe726aa1de400de0bd38872c02416ec9.png)

`./payable-utilities`: **обычный трансфер, отмена транзакции**, **дисперс нативного токена**, **трансфер фулл баланса с приватников**, **транзакция типа eip1559**, **функции юнисвапа**.

`./nonpayable-utilities`: **декодинг транзакции**, **высчитывание всех газовых значений**, **генератор кастомных адресов**, **мониторинг пендинг транзакций**, **подпись сообщения**.

`./wallets`: **использование N к-ва приватных ключей с файла**, **генератор приватников в файл**.

* * *

> **Теперь мы отдельно рассмотрим каждый файл и узнаем где он может пригодиться.**

Payable Utilities - Платные инструменты
---------------------------------------

*   [**cancel\_transaction.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/cancel_transaction.py) - **отмена зависшей предыдущей транзакции. Возвращает хеш транзакции.**
    
    С помощью этого кода можно отменить pending транзакцию. Зачастую, транзакция “зависает“ в блокчейне из-за слишком малого `gasPrice`. По сути, код делает обычный пустой трансфер с `tx[“value”]: 0` самому себе, поставив тот же `nonce` (порядок транзакции), что и у зависшей транзакции, но с `gasPrice` уже повыше.  
      
    `Зачем: был поставлен слишком малый gasPrice, и отправка следующих транзакций - невозможна.`
    

* * *

*   [**native\_transfer.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/native_transfer.py) - **пересыл нативного токена.**
    
    Возвращает хеш транзакции. Самый обычный трансфер нативного токена от адреса `A` к адресу `B`. Тут ничего особенного.  
      
    `Зачем: это самый базовый трансфер, который пригодится нам везде.`
    

* * *

*   [**disperse\_native.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/disperse_native.py) **\- пересыл нативного токена на адреса с** `disperse_addresses.txt`**. Возвращает хеши каждой транзакции.**  
      
    Использует обычный трансфер нативного токена от одного адреса к нескольким. Для работы нужно создать `disperse_addresses.txt` и поместить туда все адреса на которые нужно разделить токены. Наотмену от `native_transfer.py`, этот код не ожидает результата транзакции, поэтому заранее отправит все транзакции с nonce повыше. К сожалению, **этот способ дисперса довольно топорный, и для абузов лучше подойдет вывод с биржи, но он будет дороже**.  
      
    `Зачем: нам нужно вывести деньги на мультиакки для дальнейших транзакций.`
    

* * *

*   [**transfer\_all\_native.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/transfer_all_native.py) - **пересыл полного баланса нативного токена всех приватных ключей из** `private_keys.txt` **на один адрес.**  
      
    Для работы нужно создать `private_keys.txt` и поместить туда приватные ключи, с которых мы хотим снять фулл баланс. Довольно часто может пригодится в случаях, когда после какого-то абуза остается много приватников с мелким балансом, а выводить вручную супер затратно по времени. _(Вот останется на 100 адресах по $0.1-$1 в каком-то BNB, а если вывести полный баланс, то уже +$10-$100, что довольно приятно.)_  
      
    `Зачем: остался баланс на “заброшенных” приватниках после очередного абуза`
    

* * *

*   [**eip1559\_example.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/eip1559_transfer.py) - пример трансфер-транзакции типа eip-1559.  
      
    Чем она отличается от транзакции типа **Legacy**? В Legacy мы устанавливаем комиссию через параметр `gasPrice`, и чем выше это значение - тем больше шанс что наша транзакция попадет в блок.В **EIP-1559** у нас немного другие параметры: `base fee` (базовая комса которая сжигается)`miner tip` - “чаевые, взятка” для майнера. В коде мы вписываем два новых параметра вместо `gasPrice`: `maxPriorityFeePerGas` (вызываем через `web.eth.max_priority_fee`) и `maxFeePerGas` = `base_fee` + `max_priority_fee`. Этот тип транзакции пока самый актуальный, так что лучше использовать его вместо Legacy.  
      
    `Зачем: большинство DAPP использует именно этот тип транзакций, так что в абузах лучше использовать его, но Legacy транзы никто не отменял.`
    

* * *

*   [**uniswap\_functions.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/eip1559_transfer.py) - \*\*пример нескольких функций на всем известном Uniswap.  
    \*\*  
    Для начала нужно установить библиотеку **Uniswap** через команду:
    
        pip install uniswap-python
        
    
    В файле есть 4 функции - две для того чтобы узнать точные ценовые значения, и две для свапов. Очень удобная библиотека для свапов где нужно минимум кода для работы.  
      
    `Зачем: мы можем интегрировать свапы/парсинг цен в код, если нужно иметь дело с DEX обменниками.`
    

* * *

Non-Payable Utilities - Бесплатные Инструменты
----------------------------------------------

*   [**estimate\_gas\_values.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/nonpayable-utilities/estimate_gas_values.py) - пример как высчитывать следующие параметры: `gas`, `gasPrice`, `baseFee`, `maxFeePerGas`, `maxPriorityFeePerGas`  
      
    Тут ничего сложного, просто функции которые возвращают каждое значение для **Legacy** и **EIP-1559** транзакций. Так же, есть функция для вычисления всегда правильных значений `tx[“gas”]`, чтобы никогда не столкнуться с ошибкой `Out of gas`.  
      
    `Зачем: без этих значений мы просто не сможем отправить ни одну транзакцию`
    

* * *

*   [**vanity\_generator.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/nonpayable-utilities/vanity_generator.py) - генератор адресов с кастомным префиксом.  
      
    Вот хотите вы себе крутой пацанский префикс адреса чтобы вас друзья уважали? Это не проблема.  
      
    Дед инсайд? `0xdead`  
    Элитный криптоюзер? `0x1337`  
    Любитель кофе? `0xс0ffee`  
    Роняешь запад? `0xFACE`  
    …? `0xda7baeb`  
    Или же вы просто хотите блатные номера с 77777 в начале? `0x77777`  
      
    Все это можно сгенерировать с помощью этого кода, который еще и может работать через `multiprocessing`. Но имейте в виду, что чем длиннее кастом префикс вы хотите - тем дольше вы будете его генерировать. Так же, контроллируйте нагрузку процессора к-вом процессов. **Доступные буквы A-F и цифры 0-9**  
      
    `Зачем: пользы в этом мало, но генерируем, если хотим слегка кастомный адрес.`
    

* * *

*   [**sign\_message.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/nonpayable-utilities/sign_message.py) - генератор подписи с помощью приватного ключа.  
      
    Очень часто бывает, что для логина на сайт проекта, мы подписываем сообщение, и при этом не платим за газ. Так вот, это оно и есть. В большинстве случаев, мы вызываем уникальное сообщение через `requests`, подписываем его, и полученную сигнатуру вставляем уже в другой запрос.  
      
    `Зачем: многие проекты используют логин через подпись текстового сообщения. Сигнатуру мы отправляем на их API и получаем access_token для различных действий.`
    

* * *

*   [**web3\_with\_proxy.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/wallets/web3_with_proxy.py) - маленький пример использования прокси с web3py.  
      
    Имея прокси в формате `http://login:password@ip:port`, мы можем создать некий слой соединения с помощью `requests.session` и начать делать наши транзакции. Можно сразу на месте проверить и работоспособность прокси, и подключились ли вы к web3.  
      
    `Зачем: мы можем использовать такой метод подключения прокси к веб3, если хотим работать с мультиакками.`
    

* * *

*   [**decode\_transaction.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/nonpayable-utilities/decode_transaction.py) - расшифровка `txData` любой транзакции.  
      
    Практически всегда критически важно знать что именно нужно вписывать в параметры функции контракта `N`.  
    Ключевым элементом расшифровки `txData` и отправки нормальных транзакций, является `ABI` (интерфейс) целого контракта или одной функции.  
    **Как же действовать в следующих ситуациях?  
      
    Контракт проекта полностью верифицирован на скане.**  
    В таком случае код не понадобится - вы просто смотрите введенные параметры транзакции сразу на скане, и используем ABI в нужных целях.  
      
    **Контракт проекта не верифицирован на скане.**  
    _Тут не стоит расстраиваться, у вас еще есть шанс расшифровать свою транзакцию. Первым делом вбиваем в гугле первые символы (метод айди функции)_ _нашей_ `txData` _\- к примеру_ `0xf340fa01`_. (Так же есть хороший инструмент_ - [openchain.xyz](https://openchain.xyz/tools/abi))  
      
    **Если в поиске видны результаты с этой функцией**, но на сканах других чейнов - просто заходим и копируем `ABI` _этого контракта. Теперь вы можете коллить эту функцию в будущем, либо расшифровать свою транзакцию с помощью_ `decode_transaction.py` _или через_ [openchain.xyz](https://openchain.xyz/tools/abi).  
      
    **Контракт не верифицирован на скане, а хеш метод не гуглится.**  
    Вот тут уже можно грустить, так как теперь шанс найти `ABI` _очень мал. Пробуем найти документацию или репозиторий проекта на_ `Github`, _и в поиске вбиваем ключевые слова по типу_ `contracts`, `ABI` или банально адрес контракта.  
      
    **Если после всех шагов вы не смогли найти** `ABI`, _тогда можете попробовать изменить_ `txData` _вручную, но тут уже надо быть осторожным, так как даже один лишний/неправильный символ зафейлит вашу транзакцию. Для ручного редактирования_ `txData` _лучше воспользоваться_ `ChatGPT 4`.  
      
    `Зачем: имея ABI, нам важно знать что вписывалось в транзакцию в tx[“data”].`
    

* * *

*   [**pending\_tx\_monitoring.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/nonpayable-utilities/pending_tx_monitoring.py) - мониторинг `pending` транзакций.  
      
    Бывают редкие случаи, когда нам нужно в какой-то определенный момент отправить транзакцию. Возьмем в пример прошлогодний проект - **Friendtech**. Суть была в том, чтобы как можно быстрее купить акцию популярного инфла.  
      
    Зная адрес этого инфла, мы могли чекать пендинг транзакции, и как только мы увидели транзу с определенной `txData` от этого адреса - мы сразу же запускаем свою транзакцию на покупку.  
      
    Так же, довольно часто мониторинг мемпула/пендинг транзакций используются в **NFT** **и других сейлах**. И для **самой** **лучшей эффективности** нам нужно поставить **свою ноду** на сервер, так как публичные `RPC` довольно слабые и там легко поймать рейт лимит.  
      
    `Зачем: используется если важен момент и скорость отправки транзакции`
    

* * *

Wallets - кошельки
------------------

*   [**multiple\_keys\_usage.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/wallets/multiple_keys_usage.py) - небольшой пример использования нескольких приватных ключей с/без прокси.  
      
    Для работы мы должны создать файлы `private_keys.txt` и `proxies.txt` (формат прокси следующий: **login:password@ip:port**). В случае, если вы хотите быстро спамить транзакциями с кучи кошельков - хорошим решением будет прикрутить `asyncio`, но об этом в другой раз.  
      
    `Зачем: нам нужно знать как использовать мультиакки для транзакций.`
    

* * *

*   [**simple\_generator.py**](https://github.com/Nomzegh/web3py-cheatsheet/blob/main/wallets/simple_generator.py) - самый обычный генератор новых кошельков.Запустив код, нам нужно указать количество желаемых кошельков, и в результате получим приватники и адреса, записанные в `private_keys.txt` и `public_keys.txt` соответственно.  
      
    `Зачем: нам нужно создать N количество кошельков для дальнейших использований.`
    

* * *

### Этот репозиторий получился довольно небольшим, так что всех кодеров желающих помочь, попрошу открывать пулл реквесты с новым кодом, чтобы покрыть как можно больше различных фич, которыми смогут пользоваться все кому это нужно (даже сами кодеры).

[https://t.me/roccrypto](https://t.me/roccrypto)

---

*Originally published on [The Roccrypto](https://paragraph.com/@roccrypto/web3-py-cheatsheet)*
