原文作者:PaperMoon团队

具备以太坊兼容性的 PolkaVM 智能合约仍处于早期开发阶段,可能存在不稳定或功能不完整的情况。

简介

去中心化交易所(DEX)是 DeFi 生态系统的基石,它允许用户在无需中介的情况下进行许可式的代币交换。Uniswap V2 通过其自动做市商(AMM)模型彻底改变了 DEX 的设计,使任何 ERC-20 代币对都可以进行流动性提供和交易。

本教程将带你理解 Uniswap V2 的工作原理,并展示如何将其部署到 Polkadot Hub 上的项目中。通过学习这些合约,你将获得对最具影响力的 DeFi 协议之一的实践经验,并理解它如何在不同区块链生态中运行。

前置条件

在开始之前,请确保你具备以下条件:
    •    已安装 Node.js(v16.0.0 或更高版本) 和 npm
    •    对 Solidity 和 JavaScript 有基本了解
    •    熟悉 hardhat-polkadot 开发环境
    •    拥有一些 PAS 测试代币(用于支付交易手续费,可从 Polkadot 水龙头获取)
    •    对 AMM 与流动性池机制有基本理解

项目初始化

克隆 Uniswap V2 项目

git clone https://github.com/polkadot-developers/polkavm-hardhat-examples.git -b v0.0.6
cd polkavm-hardhat-examples/uniswap-v2-polkadot/

安装依赖

npm install

更新 Hardhat 配置

请更新 hardhat.config.js,确保 Substrate 节点与 ETH-RPC 适配器的路径与你本地机器一致。

hardhat: {
  polkavm: true,
  nodeConfig: {
    nodeBinaryPath: '../bin/substrate-node',
    rpcPort: 8000,
    dev: true,
  },
  adapterConfig: {
    adapterBinaryPath: '../bin/eth-rpc',
    dev: true,
  },
},

配置私钥

在项目根目录创建 .env 文件(可参考 env.example):

LOCAL_PRIV_KEY="INSERT_LOCAL_PRIVATE_KEY"
AH_PRIV_KEY="INSERT_AH_PRIVATE_KEY"

    •    LOCAL_PRIV_KEY:用于本地环境的私钥(可从示例文件中获取)
    •    AH_PRIV_KEY:用于部署合约的账户私钥(例如从 MetaMask 导出)

编译合约

npx hardhat compile

如果编译成功,你将看到如下输出:

Compiling 12 Solidity files
Successfully compiled 12 Solidity files

编译完成后,合约产物会生成在 artifacts-pvm 目录中,其中包含 ABI 与字节码。

理解 Uniswap V2 架构

在与合约交互之前,理解 Uniswap V2 的核心架构非常重要。该模型构成了几乎所有现代 DEX 的基础,核心理念包括:
    •    自动化做市(AMM)
    •    基于代币对的流动性池
    •    确定性的定价机制

Uniswap V2 的核心由两个主要合约组成:

Factory 合约

Factory 负责 创建与管理交易对。
当两个 ERC-20 代币需要进行交易时,Factory 会创建一个新的 Pair 合约来管理该代币对的流动性池。

其关键职责包括:
    •    记录所有已部署的交易对
    •    确保同一代币组合只存在一个交易池(避免重复池)

Pair 合约

每一个 Pair 合约都是一个 去中心化的流动性池,内部持有两种 ERC-20 代币的储备。

Pair 合约实现了 AMM 的核心逻辑:
    •    维持 恒定乘积公式(x × y = k)
    •    负责交易执行与价格计算
    •    允许用户存入代币以获取 LP(流动性提供者)代币,代表其在池中的份额

这种极简而模块化的架构,使 Uniswap 具备高度的可组合性、无需信任的特性以及强扩展性,也使其非常适合在 Polkadot Hub 等多链环境中复用。

项目结构

uniswap-V2-polkadot
├── bin/
├── contracts/
│   ├── interfaces/
│   │   ├── IERC20.sol
│   │   ├── IUniswapV2Callee.sol
│   │   ├── IUniswapV2ERC20.sol
│   │   ├── IUniswapV2Factory.sol
│   │   └── IUniswapV2Pair.sol
│   ├── libraries/
│   │   ├── Math.sol
│   │   ├── SafeMath.sol
│   │   └── UQ112x112.sol
│   ├── test/
│   │   └── ERC20.sol
│   ├── UniswapV2ERC20.sol
│   ├── UniswapV2Factory.sol
│   └── UniswapV2Pair.sol
├── ignition/
├── scripts/
│   └── deploy.js
├── node_modules/
├── test/
│   ├── shared/
│   │   ├── fixtures.js
│   │   └── utilities.js
│   ├── UniswapV2ERC20.js
│   ├── UniswapV2Factory.js
│   └── UniswapV2Pair.js
├── .env.example
├── .gitignore
├── hardhat.config.js
├── package.json
└── README.md

测试合约

你可以运行项目中提供的测试套件,以验证合约是否按预期工作。测试内容涵盖:
    •    创建交易对
    •    添加流动性
    •    执行代币交换

启动本地节点

npx hardhat node

该命令会启动:
    •    本地 Substrate 节点:ws://127.0.0.1:8000
    •    ETH-RPC 适配器:http://localhost:8545

运行测试

在新的终端中执行:

npx hardhat test --network localNode

若一切正常,你将看到类似以下输出(节选):

28 passing (12m)

部署合约

在测试成功后,你可以将合约部署到本地节点或 Polkadot Hub。部署脚本位于 scripts/deploy.js,负责部署 Factory 和 Pair 合约。

部署到本地节点

npx hardhat run scripts/deploy.js --network localNode

部署到 Polkadot Hub 测试网

npx hardhat run scripts/deploy.js --network passetHub

该命令会将合约部署到 Polkadot 测试网,需要 PAS 测试代币,并在真实网络环境下运行,部署结果会被永久记录。

部署完成后,脚本会输出合约地址,例如:

Factory deployed to : 0x85b108660f47caDfAB9e0503104C08C1c96e0DA9
Pair deployed to : 0xF0e46847c8bFD122C4b5EEE1D4494FF7C5FC5104

请妥善保存这些地址,后续交互将会用到。

总结

本教程展示了如何将 Uniswap V2 合约部署到 Polkadot Hub,将成熟的 AMM 架构引入 Polkadot 生态,为 ERC-20 代币的去中心化交易奠定基础。

通过本指南,你已经掌握了:
    •    在 Polkadot Hub 上配置 Hardhat 开发环境
    •    理解 Uniswap V2 的核心架构
    •    在本地环境中测试 Uniswap V2 合约
    •    将合约部署到本地网络与测试网

在此基础上,你可以进一步扩展:
    •    创建流动性池
    •    执行代币交换
    •    构建前端界面与合约交互

这些能力可以用于构建更复杂的 DeFi 应用,或将 Uniswap V2 功能整合进你现有的 Polkadot 项目中。

原文链接:https://docs.polkadot.com/tutorials/smart-contracts/demo-aplications/deploying-uniswap-v2/

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐