UniswapV2Factory развёртывает новый контракт UniswapV2Pair. Web3 Action будет сравнивать байткод нового развёрнутого контракта с байткодом другого контракта UniswapV2Pair. В данном случае мы используем контракт пары USDC.
Для получения байткодов мы будем использовать Node RPC в качестве нашего провайдера ноды. Если байткоды совпадают, Web3 Action сохранит адрес пары и байткод контракта в Storage вашего Web3 Action.
Если вы хотите пропустить туториал, вот полное решение:
example.tsx
Предварительные требования
Механизм триггеров Web3 Actions работает только если контракт, используемый в определении
триггера, верифицирован в Tenderly. Узнайте, как верифицировать контракты в Tenderly
здесь.
UniswapV2Factory и UniswapV2Pair. Поскольку оба контракта публично верифицированы в Tenderly, нет необходимости верифицировать их вручную.
Перейдите к UniswapV2Factory и нажмите кнопку Add to Project, чтобы добавить контракт в ваш проект. Повторите тот же шаг для UniswapV2Pair.
Шаг 1: Определите триггер
Всякий раз, когда вызывается функцияcreatePair контракта UniswapV2Factory, происходит следующее:
- Создаётся новый контракт UniswapV2Pair для пары токенов (если такого ещё не существует)
- Генерируется событие
PairCreated
UniswapV2Factory генерирует событие PairCreated. Другими словами, всякий раз при развёртывании нового контракта UniswapV2Pair.
Конфигурация триггера выглядит так и должна быть сохранена в файле tenderly.yaml:
example.yaml
Шаг 2: Определите логику Web3 Action
Когда наш Web3 Action запускается, он получает два входа:- Объект
context, обеспечивающий доступ к Node RPC и Storage - Полезная нагрузка
transactionEvent, содержащая данные, относящиеся к транзакции, вызвавшей Web3 Action
context для доступа к gateways, которые будут нашим провайдером ноды для Ethers, и Storage для хранения совпавших байткодов.
Узнайте, как использовать Node RPC в Web3
Actions для доступа к любой
поддерживаемой сети, включая Mainnet, без хлопот с управлением URL или секретными ключами.
transactionEvent, мы используем её свойство logs, чтобы найти лог события, соответствующий topic PairCreated.
Шаг 2.1: Декодируйте событие PairCreated
При срабатывании Web3 Action нужно найти событиеPairCreated в логах полезной нагрузки. Этот код мы поместим в функцию getPairCreatedEvent.
Чтобы получить хеш topic’а PairCreated, нам нужен ABI контракта UniswapV2Factory. Для этого перейдите к контракту UniswapV2Factory в Tenderly, нажмите View ABI и скопируйте его в локальный файл в каталоге actions.
Изучите структуру проекта Web3 Action
здесь.
example.tsx
example.tsx
UniswapPair с помощью Ethers.
Результат функции getPairCreatedEvent — это объект, содержащий следующее:
- Адреса токенов, составляющих пару, — свойства
token0иtoken1 - Адрес развёрнутого контракта
UniswapV2Pair— свойствоpair
Шаг 3: Сравните байткоды
Теперь, когда у нас есть адрес вновь развёрнутого контракта (содержащийся в свойствеpair типа UniswapPair), мы можем использовать его для получения байткода контракта.
Мы будем использовать байткод контракта USDC UniswapV2Pair, чтобы определить, является ли байткод вновь созданного контракта валидным контрактом UniswapV2Pair. Их байткоды должны совпадать в точности.
Чтобы получить байткоды этих контрактов, нам нужно использовать функцию getCode Ethers.
Для выполнения этих шагов нам сначала нужно настроить провайдера ноды, Node RPC: gateways.
Обратившись к свойству gateways объекта context, мы можем легко получить JSON-RPC URL для нужной сети (MAINNET в нашем случае), вызвав функцию getGateway() и используя её как провайдер для Ethers.
example.tsx
example.tsx
pair_address: bytecode под свойством JSON PairContracts в Storage нашего проекта:
example.tsx
UniswapV2Pair, а значения все одинаковые и представляют собой байткод контракта UniswapV2Pair.