Перейти к основному содержанию
В этом туториале мы покажем вам, как настроить Tenderly Web3 Action для мониторинга создания новых пулов в контракте UniswapV3Factory и выполнения автоматизированных действий. Этот проект демонстрирует, как использовать Web3 Actions для взаимодействия со смарт-контрактами и возможности Tenderly для создания собственной системы мониторинга.

Шаблон Web3 Action для мониторинга UniswapV3Factory

Обзор проекта

Цель этого проекта — настроить систему, которая отслеживает создание новых пулов в контракте UniswapV3Factory и выполняет автоматизированные действия при выполнении определённых условий. Вот краткое описание процесса проекта:
  1. Web3 Action отслеживает события PoolCreated от контракта UniswapV3Factory в Ethereum mainnet.
  2. Когда событие обнаружено, извлекается адрес нового пула из данных события.
  3. Action добавляет новый контракт пула в ваш проект Tenderly и помечает его тегом для облегчения управления.

Предварительные требования

Прежде чем начать, убедитесь, что у вас есть следующее:
  • Установленный Tenderly CLI
  • Node.js (сейчас поддерживается v20)
  • npm
  • Аккаунт и проект Tenderly

Настройка

Пройдём через шаги настройки вашей системы мониторинга UniswapV3Factory:
1
Создайте новый проект Tenderly
2
Если вы ещё этого не сделали, создайте новый проект в панели Tenderly или используйте существующий.
3
Создайте оповещение в Tenderly
4
  • Войдите в Tenderly Dashboard
  • Перейдите в свой проект
  • Перейдите на вкладку Alerts и нажмите New Alert
  • Установите тип оповещения на Event Emitted
  • Настройте оповещение:
    • Contract Address: 0x1f98431c8ad98523631ae4a59f267346ea31f984 (контракт UniswapV3Factory)
    • Event Signature: PoolCreated(address,address,uint24,int24,address)
    • Дайте оповещению подходящее имя для удобства
  • Сохраните оповещение и запишите id оповещения для дальнейшего использования
  • 5
    Инициализируйте проект Web3 Action
    6
    Откройте терминал и выполните следующую команду, чтобы инициализировать новый проект Web3 Actions:
    7
    tenderly actions init
    
    8
    Выберите ваш проект Tenderly, когда будет предложено, и выберите имя каталога для ваших actions.
    9
    Настройте tenderly.yaml
    10
    Обновите файл tenderly.yaml следующей конфигурацией:
    11
    account_id: "<YOUR_ACCOUNT_ID>"
    actions:
      <YOUR_ACCOUNT_ID>/<YOUR_PROJECT_SLUG>:
        runtime: v2
        sources: actions
        specs:
          uniswapV3:
            description: "Monitoring UniswapV3 Factory Contract and adding Child/Pool to Contracts page with proper tag"
            function: uniswapV3Monitoring:actionFn
            trigger:
              type: alert
              alert: { <ALERT_ID> }
            execution_type: parallel
    project_slug: "<YOUR_PROJECT_SLUG>"
    
    12
    Замените <YOUR_ACCOUNT_ID>, <YOUR_PROJECT_SLUG> и <ALERT_ID> вашими фактическими Account Name, Project Slug Tenderly и Alert ID, который вы записали ранее.
    13
    Настройте Secrets
    14
    Добавьте следующий секрет в настройки вашего проекта Tenderly:
    15
  • ACCESS-KEY: ваш ключ доступа API Tenderly
  • 16
    Чтобы добавить secrets, перейдите в настройки проекта Tenderly и перейдите в раздел «Secrets».
    17
    Реализуйте Web3 Action
    18
    Создайте новый файл в каталоге actions с именем uniswapV3Monitoring.ts и реализуйте логику вашего Web3 Action следующим образом:
    19
    const ethers = require('ethers');
    
    const actionFn = async (context: Context, alertEvent: AlertEvent) => {
      const key = await context.secrets.get('ACCESS-KEY');
    
      const accountSlug = '<YOUR_ACCOUNT_ID>';
      const projectSlug = '<YOUR_PROJECT_SLUG>';
      const tagName = 'pool';
    
      const tenderly = new Tenderly({
        accountName: accountSlug,
        projectName: projectSlug,
        accessKey: key,
        network: Number(alertEvent.network),
      });
    
      const poolCreatedSignature = ethers.utils.id("PoolCreated(address,address,uint24,int24,address)");
    
      let poolAddress = "";
      for (const log of alertEvent.logs) {
        if (log.topics[0] === poolCreatedSignature) {
          const data = log.data;
          const addressHex = data.substring(data.length - 40);
          poolAddress = ethers.utils.getAddress('0x' + addressHex).toLowerCase();
          break;
        }
      }
    
      try {
        await tenderly.contracts.add(poolAddress, {
          displayName: 'Pool'
        });
        await tenderly.contracts.update(poolAddress, { appendTags: [tagName] });
        console.log(`Pool contract is: ${poolAddress}, and has been added with tag ${tagName}`);
      } catch (error) {
        console.error('Error adding contract:', error);
      }
    };
    
    module.exports = { actionFn };
    
    20
    Обязательно замените <YOUR_ACCOUNT_ID> и <YOUR_PROJECT_SLUG> вашими фактическими Account Name и Project Slug Tenderly.
    21
    Развёртывание
    22
    Чтобы развернуть ваш Web3 Action, используйте Tenderly CLI:
    23
    tenderly actions deploy
    
    24
    Эта команда развернёт action, определённый в вашем файле tenderly.yaml.

    Как это работает

    Настроенный вами Web3 Action будет автоматически срабатывать всякий раз, когда контракт UniswapV3Factory генерирует событие PoolCreated. Вот разбор функции actionFn:
    1. Получает секрет ACCESS-KEY из контекста Tenderly.
    2. Инициализирует новый экземпляр Tenderly SDK с деталями вашего аккаунта и проекта.
    3. Определяет сигнатуру события PoolCreated с помощью ethers.js.
    4. Проходит по логам события, чтобы найти событие PoolCreated, и извлекает адрес нового пула.
    5. С помощью Tenderly SDK добавляет новый контракт пула в ваш проект Tenderly с отображаемым именем Pool.
    6. Помечает новый контракт пула тегом pool для облегчения управления.
    7. Логирует адрес пула и подтверждение процесса тегирования.
    Эта реализация автоматически добавляет новые пулы Uniswap V3 в ваш проект Tenderly и помечает их тегами, что упрощает мониторинг и управление этими контрактами.

    Кастомизация

    Чтобы изменить поведение вашего Web3 Action:
    1. Отредактируйте actionFn в файле uniswapV3Monitoring.ts.
    2. Вы можете изменить переменную tagName, чтобы использовать другой тег для пулов.
    3. Добавьте дополнительную логику для обработки большей информации из события или выполнения других действий с помощью Tenderly SDK.
    Например, для добавления более подробного логирования:
    console.log(`New pool created: ${poolAddress}`);
    console.log(`Network: ${alertEvent.network}`);
    console.log(`Transaction hash: ${alertEvent.hash}`);
    

    Мониторинг и устранение неполадок

    Чтобы убедиться, что ваш Web3 Action работает корректно:
    • Отслеживайте выполнения Web3 Action в панели Tenderly
    • Проверяйте логи Tenderly на предмет сообщений об ошибках или деталей выполнения
    • Используйте инструменты отладки Tenderly для инспекции деталей транзакций и взаимодействий с контрактами
    • Проверяйте страницу Contracts вашего проекта Tenderly, чтобы увидеть добавленные и помеченные контракты пулов
    Эта настройка специально предназначена для мониторинга контракта UniswapV3Factory в Ethereum mainnet.

    Заключение

    Теперь вы настроили пользовательскую систему мониторинга с использованием Tenderly Web3 Actions для отслеживания создания новых пулов в контракте UniswapV3Factory. Этот проект демонстрирует, как взаимодействовать со смарт-контрактами, использовать Tenderly SDK и создавать автоматизированную систему для мониторинга и реагирования на конкретные события блокчейна. Для получения дополнительной информации о Uniswap V3 и его контрактах обратитесь к документации Uniswap V3.