UniswapV2Factory 部署新的 UniswapV2Pair 合约时都会运行。Web3 Action 将比较新部署合约的字节码与另一个 UniswapV2Pair 合约的字节码。在此示例中,我们将使用 USDC Pair 合约。
为了获取字节码,我们将使用 Node RPC 作为节点提供商。如果字节码匹配,Web3 Action 会将该 pair 的地址和合约的字节码存储在 Web3 Action 的 Storage 中。
如果您想跳过本教程,以下是完整的解决方案:
example.tsx
前提条件
Web3 Actions 的触发机制仅在触发器定义中使用的合约已在
Tenderly 上验证时才有效。了解 如何在 Tenderly 上验证合约
。
UniswapV2Factory 和 UniswapV2Pair 合约。由于这两个合约已在 Tenderly 上公开验证,因此无需手动验证。
导航到 UniswapV2Factory 并点击 Add to Project 按钮将该合约添加到您的项目。对 UniswapV2Pair 执行相同的步骤。
步骤 1:定义触发器
每当UniswapV2Factory 合约的 createPair 函数 被调用时,会发生以下情况:
- 为代币对创建一个新的 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 存储匹配的字节码。
了解 如何在 Web3 Actions 中使用 Node RPC
以访问任何
受支持的网络(包括 Mainnet),而无需管理 URL 或密钥。
transactionEvent 负载,我们将使用它的 logs 属性查找对应于 PairCreated topic 的事件日志。
步骤 2.1:解码 PairCreated 事件
触发时,Web3 Action 需要在负载的日志中查找PairCreated 事件。我们将这段代码放入 getPairCreatedEvent 函数。
要获取 PairCreated topic 的哈希值,我们需要使用 UniswapV2Factory 合约的 ABI。为此,前往 Tenderly 中的 UniswapV2Factory 合约,点击 View ABI 并将其复制/粘贴到 actions 目录中的本地文件。
在此浏览 Web3 Action 的项目结构
。
example.tsx
example.tsx
UniswapPair 类型。
getPairCreatedEvent 函数的结果是一个包含以下内容的对象:
- 构成 pair 的代币地址 ——
token0和token1属性 - 已部署
UniswapV2Pair合约的地址 ——pair属性
步骤 3:比较字节码
现在我们有了新部署合约的地址(包含在UniswapPair 类型的 pair 属性中),可以使用它获取合约的字节码。
我们将使用 USDC UniswapV2Pair 合约的字节码来判断新创建的合约字节码是否为有效的 UniswapV2Pair 合约。它们的字节码必须完全匹配。
要获取这些合约的字节码,我们需要使用 Ethers 的 getCode 函数。
要完成这些步骤,我们首先需要设置一个节点提供商,即 Node RPC:gateways。
通过访问 context 对象的 gateways 属性,我们可以调用 getGateway() 函数轻松获取我们期望网络(在我们的例子中是 MAINNET)的 JSON-RPC URL,并将其用作 Ethers 的提供商。
example.tsx
example.tsx
pair_address: bytecode 的格式在项目 Storage 中名为 PairContracts 的 JSON 属性下存储新 pair 的字节码:
example.tsx
UniswapV2Pair 合约的地址,而值都相同,代表 UniswapV2Pair 合约的字节码。