Полный код доступен в этом Github-репозитории. Обратите внимание, что на данный момент он находится в отдельной ветке.
Обзор проекта
Цель этого проекта — научить вас использовать Web3 Actions для отправки сообщения в Discord всякий раз, когда создаётся пул Uniswap. Мы покажем два подхода: более удобный — использовать событиеPoolCreated как триггер для нашего Web3 Action (см. функции, события и триггеры и документацию Uniswap).
План
- Добавьте контракты в свой проект Tenderly — UniswapV3ContractFactory. Он уже верифицирован и присутствует в Tenderly, поэтому вам просто нужно добавить его в свой проект.
- Сохраните URL webhook Discord в Secrets вашего Web3 Action.
- Создайте Web3 Action, который будет реагировать на событие
[PoolCreated](<https://developers.uniswap.org/protocol/reference/core/interfaces/IUniswapV3Factory#poolcreated>).
1: Добавьте контракты Uniswap в ваш проект Tenderly
Web3 Actions требуют, чтобы смарт-контракты, используемые для задания триггеров, были верифицированы в Tenderly. Web3 Actions требуют, чтобы смарт-контракты, используемые для задания триггеров, были верифицированы в Tenderly. Поскольку мы используем существующие контракты, вы можете найти их через строку поиска, введя имя или адрес контракта. Как вариант, перейдите на UniswapV2ContractFactory и нажмите «Add to Project». Сделайте то же для UniswapV2Pair.2: Создайте Web3 Action для события PoolCreated
Ниже вы найдёте код нашего Web3 Action, а также объяснение, как он работает:example.ts
getEventLog. Мы используем Ethers и ABI контракта: UniswapV3FactoryAbi. Перейдите к контракту UniswapV3Factory в Tenderly, нажмите «View ABI» и скопируйте его в локальный файл в каталоге actions.
По сути, мы ищем запись лога в topic PoolCreate. Сначала берём ссылку на этот topic (poolCreatedTopic = ifc.getEventTopic("PoolCreated")), а затем фильтруем сами логи (tx.logs), пока не найдём запись, ссылающуюся на этот topic. Наконец, декодируем найденный лог (poolCreatedEventLog) с помощью Ethers. Это то самое событие, которое мы ищем, и оно содержит адреса токенов: token0 и token1.
Получите данные о токенах через Graph API Uniswap на TheGraph. Uniswap предоставляет доступ к своим данным через TheGraph. Мы используем функцию getTokensData, чтобы обратиться к TheGraph и получить несколько полей для ID token0 и token1 — тех, что присутствуют в событии PoolCreated из первого шага.
Уведомите сообщество Discord. Собрав всю необходимую информацию, мы готовы отправить сообщение в наш канал Discord. С функцией notifyDiscord нам нужно получить URL webhook из secrets. Мы используем Axios, чтобы сделать HTTP-запрос POST и запустить webhook, передав ему содержимое.
3: Настройте ваш Web3 Action
В файлеtenderly.yaml нам нужно указать, что мы хотим запускать uniswapActions:onPoolCreatedEventEmitted при генерации события контрактом UniswapV3Factory (по адресу 0xd849b2af570ffa3033973ea11be6e01b7ba661d9) в транзакции, заминированной в Mainnet (network 1).
example.yaml
4: Сохраните URL webhook Discord в Secrets
Прежде чем запускать наш Web3 Action в Tenderly, необходимо задать значение для webhook Discord. В Tenderly Dashboard перейдите на страницу Actions вашего проекта и нажмите Secrets. Добавьте новый секрет с именемdiscord.uniswapChannelWebhook и вставьте webhook вашего канала Discord.
5: Разверните и опробуйте ваш Web3 Action
Разверните ваш Web3 Action, выполнив эту команду:example.yaml