From c49fc436d069c12f3ff9ac38f0d86a6b1735a5b5 Mon Sep 17 00:00:00 2001 From: "tingzhao.ytz" Date: Mon, 5 Aug 2024 11:37:21 +0800 Subject: [PATCH] feat: update contract design doc --- P002_WhatIsUniswap/readme.md | 12 +- P101_ContractsDesign/code/IFactory.sol | 29 ---- P101_ContractsDesign/code/IPool.sol | 98 ------------ P101_ContractsDesign/code/IPoolManager.sol | 51 ------- .../code/IPositionManager.sol | 58 ------- P101_ContractsDesign/code/ISwapRouter.sol | 59 -------- P101_ContractsDesign/img/uml.png | Bin 0 -> 148275 bytes P101_ContractsDesign/readme.md | 141 +++++++++--------- P102_InitContracts/code/Factory.sol | 8 +- .../code/interfaces/IFactory.sol | 8 +- README.md | 2 +- demo-contract/contracts/wtfswap/Factory.sol | 23 +-- .../contracts/wtfswap/interfaces/IFactory.sol | 18 +-- .../wtfswap/interfaces/IPoolManager.sol | 13 +- .../wtfswap/interfaces/IPositionManager.sol | 4 +- 15 files changed, 107 insertions(+), 417 deletions(-) delete mode 100644 P101_ContractsDesign/code/IFactory.sol delete mode 100644 P101_ContractsDesign/code/IPool.sol delete mode 100644 P101_ContractsDesign/code/IPoolManager.sol delete mode 100644 P101_ContractsDesign/code/IPositionManager.sol delete mode 100644 P101_ContractsDesign/code/ISwapRouter.sol create mode 100644 P101_ContractsDesign/img/uml.png diff --git a/P002_WhatIsUniswap/readme.md b/P002_WhatIsUniswap/readme.md index 91588c5..7ae718e 100644 --- a/P002_WhatIsUniswap/readme.md +++ b/P002_WhatIsUniswap/readme.md @@ -104,8 +104,8 @@ function createAndInitializePoolIfNecessary( 创建交易池调用的是 `UniswapV3Factory` 合约的 [createPool](https://github.com/Uniswap/v3-core/blob/main/contracts/UniswapV3Factory.sol#L35),参数为: -- tokenA:token0 的地址 -- tokenB 地址:token1 的地址; +- token0:token0 的地址 +- token1 地址:token1 的地址; - fee:手续费费率。 代码为: @@ -113,12 +113,12 @@ function createAndInitializePoolIfNecessary( ```solidity /// @inheritdoc IUniswapV3Factory function createPool( - address tokenA, - address tokenB, + address token0, + address token1, uint24 fee ) external override noDelegateCall returns (address pool) { - require(tokenA != tokenB); - (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); + require(token0 != token1); + (address token0, address token1) = token0 < token1 ? (token0, token1) : (token1, token0); require(token0 != address(0)); int24 tickSpacing = feeAmountTickSpacing[fee]; require(tickSpacing != 0); diff --git a/P101_ContractsDesign/code/IFactory.sol b/P101_ContractsDesign/code/IFactory.sol deleted file mode 100644 index 9d051c5..0000000 --- a/P101_ContractsDesign/code/IFactory.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.8.24; - -interface IFactory { - function parameters() - external - view - returns (address factory, address token0, address token1, uint24 fee); - - event PoolCreated( - address indexed token0, - address indexed token1, - uint32 indexed index, - address pool - ); - - function getPool( - address tokenA, - address tokenB, - uint32 index - ) external view returns (address pool); - - function createPool( - address tokenA, - address tokenB, - uint32 index, - uint24 fee - ) external returns (address pool); -} diff --git a/P101_ContractsDesign/code/IPool.sol b/P101_ContractsDesign/code/IPool.sol deleted file mode 100644 index 293620a..0000000 --- a/P101_ContractsDesign/code/IPool.sol +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.8.24; - -interface IMintCallback { - function mintCallback( - uint256 amount0Owed, - uint256 amount1Owed, - bytes calldata data - ) external; -} - -interface ISwapCallback { - function swapCallback( - int256 amount0Delta, - int256 amount1Delta, - bytes calldata data - ) external; -} - -interface IPool { - function factory() external view returns (address); - - function token0() external view returns (address); - - function token1() external view returns (address); - - function fee() external view returns (uint24); - - function tickLower() external view returns (int24); - - function tickUpper() external view returns (int24); - - function sqrtPriceX96() external view returns (uint160); - - function tick() external view returns (int24); - - function liquidity() external view returns (uint128); - - function initialize( - uint160 sqrtPriceX96, - int24 tickLower, - int24 tickUpper - ) external; - - event Mint( - address sender, - address indexed owner, - uint128 amount, - uint256 amount0, - uint256 amount1 - ); - - function mint( - address recipient, - uint128 amount, - bytes calldata data - ) external returns (uint256 amount0, uint256 amount1); - - event Collect( - address indexed owner, - address recipient, - uint128 amount0, - uint128 amount1 - ); - - function collect( - address recipient - ) external returns (uint128 amount0, uint128 amount1); - - event Burn( - address indexed owner, - uint128 amount, - uint256 amount0, - uint256 amount1 - ); - - function burn( - uint128 amount - ) external returns (uint256 amount0, uint256 amount1); - - event Swap( - address indexed sender, - address indexed recipient, - int256 amount0, - int256 amount1, - uint160 sqrtPriceX96, - uint128 liquidity, - int24 tick - ); - - function swap( - address recipient, - bool zeroForOne, - int256 amountSpecified, - uint160 sqrtPriceLimitX96, - bytes calldata data - ) external returns (int256 amount0, int256 amount1); -} diff --git a/P101_ContractsDesign/code/IPoolManager.sol b/P101_ContractsDesign/code/IPoolManager.sol deleted file mode 100644 index 4a274ac..0000000 --- a/P101_ContractsDesign/code/IPoolManager.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.8.24; -pragma abicoder v2; - -interface IPoolManager { - struct PoolKey { - address token0; - address token1; - uint32 index; - } - - function getPools() external view returns (PoolKey[] memory pools); - - function getTokens() external view returns (address[] memory tokens); - - function getTokenPools( - address token - ) external view returns (PoolKey[] memory pools); - - struct PoolInfo { - // the current protocol fee as a percentage of the swap fee taken on withdrawal - // represented as an integer denominator (1/x)% - uint8 feeProtocol; - // tick range - int24 tickLower; - int24 tickUpper; - // the current tick - int24 tick; - // the current price - uint160 sqrtPriceX96; - } - - function getPoolInfo( - address token0, - address token1, - uint32 index - ) external view returns (PoolInfo memory poolInfo); - - struct CreateAndInitializeParams { - address token0; - address token1; - uint24 fee; - int24 tickLower; - int24 tickUpper; - uint160 sqrtPriceX96; - } - - function createAndInitializePoolIfNecessary( - CreateAndInitializeParams calldata params - ) external payable returns (address pool, uint32 index); -} diff --git a/P101_ContractsDesign/code/IPositionManager.sol b/P101_ContractsDesign/code/IPositionManager.sol deleted file mode 100644 index 9d88fca..0000000 --- a/P101_ContractsDesign/code/IPositionManager.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.8.24; -pragma abicoder v2; - -interface IPositionManager { - function getPositions( - address owner - ) external view returns (uint256[] memory positionIds); - - struct PositionInfo { - // address owner; - address token0; - address token1; - uint24 fee; - int128 liquidity; - // tick range - int24 tickLower; - int24 tickUpper; - uint256 tokensOwed0; - uint256 tokensOwed1; - } - - function getPositionInfo( - uint256 positionId - ) external view returns (PositionInfo memory positionInfo); - - struct MintParams { - address token0; - address token1; - uint32 index; - uint256 amount0Desired; - uint256 amount1Desired; - address recipient; - uint256 deadline; - } - - function mint( - MintParams calldata params - ) - external - payable - returns ( - uint256 positionId, - uint128 liquidity, - uint256 amount0, - uint256 amount1 - ); - - function burn( - uint256 positionId, - uint128 amount - ) external returns (uint256 amount0, uint256 amount1); - - function collect( - uint256 positionId, - address recipient - ) external returns (uint256 amount0, uint256 amount1); -} diff --git a/P101_ContractsDesign/code/ISwapRouter.sol b/P101_ContractsDesign/code/ISwapRouter.sol deleted file mode 100644 index 49c8f8e..0000000 --- a/P101_ContractsDesign/code/ISwapRouter.sol +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.8.24; -pragma abicoder v2; - -interface ISwapRouter { - struct ExactInputParams { - address tokenIn; - address tokenOut; - uint32[] indexPath; - address recipient; - uint256 deadline; - uint256 amountIn; - uint256 amountOutMinimum; - uint160 sqrtPriceLimitX96; - } - - function exactInput( - ExactInputParams calldata params - ) external payable returns (uint256 amountOut); - - struct ExactOutputParams { - address tokenIn; - address tokenOut; - uint32[] indexPath; - address recipient; - uint256 deadline; - uint256 amountOut; - uint256 amountInMaximum; - uint160 sqrtPriceLimitX96; - } - - function exactOutput( - ExactOutputParams calldata params - ) external payable returns (uint256 amountIn); - - struct QuoteExactInputParams { - address tokenIn; - address tokenOut; - uint32[] indexPath; - uint256 amountIn; - uint160 sqrtPriceLimitX96; - } - - function quoteExactInput( - QuoteExactInputParams memory params - ) external returns (uint256 amountOut); - - struct QuoteExactOutputParams { - address tokenIn; - address tokenOut; - uint32[] indexPath; - uint256 amount; - uint160 sqrtPriceLimitX96; - } - - function quoteExactOutput( - QuoteExactOutputParams memory params - ) external returns (uint256 amountIn); -} diff --git a/P101_ContractsDesign/img/uml.png b/P101_ContractsDesign/img/uml.png new file mode 100644 index 0000000000000000000000000000000000000000..a21353ff764df1ffe1a8ebace444d8fbd9d174e4 GIT binary patch literal 148275 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 z z^*G=uvELsD(#My(^GiVi1}zPRS)0-pI%P(R!d6v*Sb5RaxUk5~^xm-vcneAYfO=P> z>%xt^@LXE}#mM-U7zruBW~{>H%cn3*`yh*q!-QV?9!*{aw6N^>na@UPih&1q@`4|awT4A&QrNx+j#-nAme2hj+9cX3Z)KPR;FWgYgp z1ssU3@dlfI0!r$rK%>P|=ty!sm1Dug`3mbzdLM{me<>`A9`;4>It^Yt=f@16MaC^G zHao<)5A`<0RGy&N)6T$RE+)7~)h@tJkq>PGeAXKUc(c#7d$gCzu6MKXC| z9*S||PD4;j(VDdkpAH6C(+LmI3uza+Y)~@QUB`l?m<=wc#nYb1O-!H{@WKqZZ&3ln zS8Z>Tn+e1w3yi#CHwUxe3Ig5lX&hL|4B<$IyNBLa9OEmm4N?#MIae|~Bl!)C@-Lk7 z<;;i63}a#K@3$m)2m$&RF8%-I4h!=B=rQ)2<(^AQ9;d8+LDRy2*;+r@(&&`0=BK4f literal 0 HcmV?d00001 diff --git a/P101_ContractsDesign/readme.md b/P101_ContractsDesign/readme.md index 15cb9d9..12130da 100644 --- a/P101_ContractsDesign/readme.md +++ b/P101_ContractsDesign/readme.md @@ -18,34 +18,42 @@ wtfswap 设计每个池子都有一个价格范围,swap 只能在此价格范 以简单为原则,我们不按照 Uniswap V3 将合约分为 `periphery` 和 `core` 两个独立仓库,而是自顶向下分为以下四个合约。 -- `PoolManager.sol`: 顶层合约,对应 Pool 页面,负责 Pool 的创建和管理; +- `PoolManager.sol`: 顶层合约,对应 Pool 页面,负责 Pool 的创建和管理。 - `PositionManager.sol`: 顶层合约,对应 Position 页面,负责 LP 头寸和流动性的管理; - `SwapRouter.sol`: 顶层合约,对应 Swap 页面,负责预估价格和交易; - `Factory.sol`: 底层合约,Pool 的工厂合约; - `Pool.sol`: 最底层合约,对应一个交易池,记录了当前价格、头寸、流动性等信息。 +下面是合约的 UML 图: + +![uml](./img/uml.png) + ## 合约接口设计 因为我们是自顶向下设计合约,因此我们首先分析前端页面(Pool 页面、Position 页面和 Swap 页面)需要哪些功能,并为此设计出顶层合约,再进一步分析细节,设计出底层合约。 #### PoolManager -`PoolManager.sol` 对应 Pool 页面,我们首先来看 Pool 页面有哪些功能 +`PoolManager.sol` 对应 Pool 页面,我们首先来看 Pool 页面有哪些功能。 首先是展示所有的 pool ,对应前端页面如下: ![pool](../P003_OverallDesign/img/pool.png) -注意,由于相同交易对和费率的池子可以重复创建,因此我们定义一个 `PoolKey` 的结构,参数包含 `token0`、`token1` 和 `index`,`index` 表示相同交易对池子的序号,从 0 开始递增,池子的地址可以由 `PoolKey` 唯一计算出来。定义出返回所有 pool 的方法 `getPools`,接口定义如下: +对应我们需要有接口支持 DApp 前端获取所有的交易池。在 Uniswap 中,这个接口是通过服务端提供的,服务端拉取链上的合约信息,然后返回给前端。但是我们的设计是直接调用合约获取当前可供交易的交易池,使得 DApp 不依赖于服务端(当然,对于实际项目来说,依赖服务端可能更合适)。为此,我们定义了 `getAllPools` 接口,用于获取所有的交易池,定义 `PoolInfo` 保存每个池子的信息。 ```solidity -struct PoolKey { +struct PoolInfo { address token0; address token1; uint32 index; + uint8 feeProtocol; + int24 tickLower; + int24 tickUpper; + int24 tick; + uint160 sqrtPriceX96; } - -function getPools() external view returns (PoolKey[] memory pools); +function getAllPools() external view returns (PoolInfo[] memory poolsInfo); ``` 每个 pool 的信息包括: @@ -56,29 +64,6 @@ function getPools() external view returns (PoolKey[] memory pools); - 当前价格; - 三个区间的总流动性。 -我们可以根据以上信息定义出 `PoolInfo`,以及获取 `PoolInfo` 的方法 `getPoolInfo`,接口定义如下: - -```solidity -struct PoolInfo { - // the current protocol fee as a percentage of the swap fee taken on withdrawal - // represented as an integer denominator (1/x)% - uint8 feeProtocol; - // tick range - int24 tickLower; - int24 tickUpper; - // the current tick - int24 tick; - // the current price - uint160 sqrtPriceX96; -} - -function getPoolInfo( - address token0, - address token1, - uint32 index -) external view returns (PoolInfo memory poolInfo); -``` - 此外还有一个添加池子的操作,当添加头寸时如果发现还没有对应的池子,需要先创建一个池子。 参数包括: @@ -105,10 +90,12 @@ struct CreateAndInitializeParams { function createAndInitializePoolIfNecessary( CreateAndInitializeParams calldata params -) external payable returns (address pool, uint32 index); +) external payable returns (address pool); ``` -完整的接口在 [IPoolManager](./code/IPoolManager.sol) 中。 +`PoolManager` 直接继承了 `Factory`(交易池的工厂合约),而不是通过合约调用来调用 `Factory`,所有交易池的创建都需要经过 `PoolManager`。你可以理解为 `PoolManager` 就是一个加强版的 `Factory` 合约。 + +完整的接口在 [IPoolManager](../demo-contract/contracts/wtfswap/interfaces/IPoolManager.sol) 中。 #### PositionManager @@ -118,32 +105,26 @@ function createAndInitializePoolIfNecessary( ![positions](../P003_OverallDesign/img/positions.png) -可以通过用户地址返回所有其创建的头寸,定义 `getPositions` 方法,接口定义如下: +在我们的设计中 `PositionManager` 并不是必须的。因为理论上来说 LP 可以直接调用 `Pool` 合约来管理头寸,DApp 提供一个后端接口来获取 LP 的头寸信息。但是为了课程需要,我们设计了一个符合 ERC721 标准的 `PositionManager` 合约,用于管理 LP 的头寸。你可以理解为 `PositionManager` 就是一个代理,是一个中间商,帮助 LP 管理头寸。你也可以直接调用 `Pool` 合约来注入流动性,但是这部分头寸不会被 `PositionManager` 所感知。 ```solidity -function getPositions( - address owner -) external view returns (uint256[] memory positionIds); -``` - -每个头寸的信息包括: +import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -- token 对的符号以及数量(这里的数量是头寸拥有的两种代币数量); -- 费率; -- 价格范围; -- 添加的流动性; -- 收取的两种代币的手续费。 +interface IPositionManager is IERC721 { + // 相关接口 +} +``` -我们可以根据以上信息定义出 `PositionInfo`,以及获取 `PositionInfo` 的方法 `getPositionInfo`,接口定义如下: +`PositionManager` 合约就是一个 ERC721 的合约,LP 可以通过 NFT 的 id(对应我们定义为 `positionId`)来获取他创建的头寸信息,定义 `getPositionInfo` 方法,接口定义如下: ```solidity struct PositionInfo { - // address owner; + address owner; address token0; address token1; + uint32 index; uint24 fee; - int128 liquidity; - // tick range + uint128 liquidity; int24 tickLower; int24 tickUpper; uint256 tokensOwed0; @@ -155,7 +136,17 @@ function getPositionInfo( ) external view returns (PositionInfo memory positionInfo); ``` -右上角有一个添加头寸的操作,点击弹出以下页面: +每个头寸的信息包括: + +- token 对的符号以及数量(这里的数量是头寸拥有的两种代币数量); +- 费率; +- 价格范围; +- 添加的流动性; +- 收取的两种代币的手续费。 + +另外我们不单独定义获取所有头寸的接口,因为这个合约本身是一个 ERC721 的合约,所以我们可以通过类似 [ZAN Advanced API](https://zan.top/service/advance-api) 这样的服务来获取某个用户的所有的头寸(`zan_getNFTsByOwner`)。 + +接下来我们来看如何注入流动性(添加头寸),在 UI 设计的右上角有一个添加头寸的操作,点击弹出以下页面: ![add](../P003_OverallDesign/img/add.png) @@ -191,19 +182,15 @@ function mint( ); ``` -值得注意的是,选定 token0 和 token1 是两个下拉框,费率会自动显示。要想实现这个逻辑,我们需要进一步完善 `PoolManager.sol`,新增两个方法: +值得注意的是,选定 token0 和 token1 是两个下拉框,费率会自动显示。要想实现这个逻辑,我们需要依赖 `PoolManager.sol` 的接口,分别是: -- `getTokens`: 获取所有的 tokens,用于用户第一个下拉框选择; -- `getTokenPools`:参数是一个 token 地址,返回所有的池子,用于用户第二个下拉框选择。 +- `getPairs`: 获取所有的交易对,用于 LP 选择交易对。 +- `getAllPools`:获取所有的交易池信息,选择交易对后可以通过该方法获得全部的交易池,并按照 LP 选择的交易对等信息过滤。 -接口定义如下: +`getPairs` 在上面的 PositionManager 中未定义,需要接口定义如下: ```solidity -function getTokens() external view returns (address[] memory tokens); - -function getTokenPools( - address token -) external view returns (PoolKey[] memory pools); +function getPairs() external view returns (Pair[] memory); ``` 每行头寸的信息还有两个按钮,分别是 `burn` 和 `collect`,分别代表销毁头寸的流动性,以及提取全部手续费。 @@ -212,8 +199,7 @@ function getTokenPools( ```solidity function burn( - uint256 positionId, - uint128 amount + uint256 positionId ) external returns (uint256 amount0, uint256 amount1); function collect( @@ -222,7 +208,7 @@ function collect( ) external returns (uint256 amount0, uint256 amount1); ``` -完整的接口在 [IPositionManager](./code/IPositionManager.sol) 中。 +完整的接口在 [IPositionManager](../demo-contract/contracts/wtfswap/interfaces/IPositionManager.sol) 中。 #### SwapRouter @@ -309,7 +295,9 @@ function exactOutput( ) external payable returns (uint256 amountIn); ``` -完整的接口在 [ISwapRouter](./code/ISwapRouter.sol) 中。 +理论上来说,用户也可以直接调用 `Pool` 来交易。但是因为同一个交易对会有很多交易池,所以为了让用户交易更方便,我们设计了 `SwapRouter` 合约。DApp 通过分析交易池的情况,选择最优的交易池,然后由 `SwapRouter` 合约来调用 `Pool` 合约,一次性完成在不同交易池的交易。在 Uniswap 中也设计了类似的合约,只不过 Uniswap 是用来选择不同的交易对的,Uniswap 支持跨交易对的交易,比如用户想要交易 `A` 和 `C`,但是没有直接的交易对,那么 Uniswap 会选择 `A` 和 `B` 以及 `B` 和 `C` 两个交易对来完成交易。在本课程中,为了简化课程,我们不做这样的设计。但是因为我们在一个交易池上定义了不同的价格区间,所以我们也设计了 `SwapRouter` 合约来选择不同的价格区间的交易池。 + +完整的接口在 [ISwapRouter](../demo-contract/contracts/wtfswap/interfaces/ISwapRouter.sol) 中。 #### Factory @@ -326,16 +314,16 @@ event PoolCreated( ); function getPool( - address tokenA, - address tokenB, - uint24 fee, - uint8 bump + address token0, + address token1, + uint32 index ) external view returns (address pool); function createPool( - address tokenA, - address tokenB, - uint32 index, + address token0, + address token1, + int24 tickLower, + int24 tickUpper, uint24 fee ) external returns (address pool); ``` @@ -346,10 +334,17 @@ function createPool( function parameters() external view - returns (address factory, address token0, address token1, uint24 fee); + returns ( + address factory, + address token0, + address token1, + int24 tickLower, + int24 tickUpper, + uint24 fee + ); ``` -完整的接口在 [IFactory](./code/IFactory.sol) 中。 +完整的接口在 [IFactory](../demo-contract//contracts/wtfswap/interfaces/IFactory.sol) 中。 #### Pool @@ -385,9 +380,7 @@ function liquidity() external view returns (uint128); ```solidity function initialize( - uint160 sqrtPriceX96, - int24 tickLower, - int24 tickUpper + uint160 sqrtPriceX96 ) external; ``` @@ -471,4 +464,4 @@ interface ISwapCallback { } ``` -完整的接口在 [IPool.sol](./code/IPool.sol) 中。 +完整的接口在 [IPool.sol](../demo-contract/contracts/wtfswap/interfaces/IPool.sol) 中。 diff --git a/P102_InitContracts/code/Factory.sol b/P102_InitContracts/code/Factory.sol index eab92eb..5317046 100644 --- a/P102_InitContracts/code/Factory.sol +++ b/P102_InitContracts/code/Factory.sol @@ -12,14 +12,14 @@ contract Factory is IFactory { {} function getPool( - address tokenA, - address tokenB, + address token0, + address token1, uint24 fee ) external view override returns (address pool) {} function createPool( - address tokenA, - address tokenB, + address token0, + address token1, uint24 fee ) external override returns (address pool) {} } diff --git a/P102_InitContracts/code/interfaces/IFactory.sol b/P102_InitContracts/code/interfaces/IFactory.sol index 9c74cbc..467dc09 100644 --- a/P102_InitContracts/code/interfaces/IFactory.sol +++ b/P102_InitContracts/code/interfaces/IFactory.sol @@ -15,14 +15,14 @@ interface IFactory { ); function getPool( - address tokenA, - address tokenB, + address token0, + address token1, uint24 fee ) external view returns (address pool); function createPool( - address tokenA, - address tokenB, + address token0, + address token1, uint24 fee ) external returns (address pool); } diff --git a/README.md b/README.md index 9ba684f..025d23a 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ WTF Dapp 是一个 DApp 极简入门教程,帮助开发者入门去中心应 **第 P003 讲:Wtfswap 整体设计**:[教程](./P003_OverallDesign/readme.md) -**第 P101 讲:Wtfswap 合约设计**:[教程](./P101_ContractsDesign/readme.md) | [代码](./P101_ContractsDesign/code/) +**第 P101 讲:Wtfswap 合约设计**:[教程](./P101_ContractsDesign/readme.md) | [代码](./demo-contract/contracts/wtfswap/interfaces/) **第 P102 讲:初始化合约和开发环境**:[教程](./P102_InitContracts/readme.md) | [代码](./P102_InitContracts/code/) diff --git a/demo-contract/contracts/wtfswap/Factory.sol b/demo-contract/contracts/wtfswap/Factory.sol index 2b71405..7520491 100644 --- a/demo-contract/contracts/wtfswap/Factory.sol +++ b/demo-contract/contracts/wtfswap/Factory.sol @@ -16,37 +16,30 @@ contract Factory is IFactory { override returns ( address factory, - address tokenA, - address tokenB, + address token0, + address token1, int24 tickLower, int24 tickUpper, uint24 fee ) {} - function getPools( - address tokenA, - address tokenB - ) external view override returns (address[] memory) { - return pools[tokenA][tokenB]; - } - function getPool( - address tokenA, - address tokenB, + address token0, + address token1, uint32 index ) external view override returns (address) { - return pools[tokenA][tokenB][index]; + return pools[token0][token1][index]; } function createPool( - address tokenA, - address tokenB, + address token0, + address token1, int24 tickLower, int24 tickUpper, uint24 fee ) external override returns (address pool) { - // 先调用 getPools 获取当前 tokenA tokenB 的所有 pool + // 先调用 getPools 获取当前 token0 token1 的所有 pool // 然后判断是否已经存在 tickLower tickUpper fee 相同的 pool // 如果存在就直接返回 // 如果不存在就创建一个新的 pool diff --git a/demo-contract/contracts/wtfswap/interfaces/IFactory.sol b/demo-contract/contracts/wtfswap/interfaces/IFactory.sol index 01d3bbe..230568e 100644 --- a/demo-contract/contracts/wtfswap/interfaces/IFactory.sol +++ b/demo-contract/contracts/wtfswap/interfaces/IFactory.sol @@ -15,28 +15,24 @@ interface IFactory { ); event PoolCreated( - address tokenA, - address tokenB, + address token0, + address token1, + uint32 index, int24 tickLower, int24 tickUpper, uint24 fee, address pool ); - function getPools( - address tokenA, - address tokenB - ) external view returns (address[] memory pools); - function getPool( - address tokenA, - address tokenB, + address token0, + address token1, uint32 index ) external view returns (address pool); function createPool( - address tokenA, - address tokenB, + address token0, + address token1, int24 tickLower, int24 tickUpper, uint24 fee diff --git a/demo-contract/contracts/wtfswap/interfaces/IPoolManager.sol b/demo-contract/contracts/wtfswap/interfaces/IPoolManager.sol index 616757c..8eb7ee5 100644 --- a/demo-contract/contracts/wtfswap/interfaces/IPoolManager.sol +++ b/demo-contract/contracts/wtfswap/interfaces/IPoolManager.sol @@ -6,8 +6,9 @@ import "./IFactory.sol"; interface IPoolManager is IFactory { struct PoolInfo { - address tokenA; - address tokenB; + address token0; + address token1; + uint32 index; uint8 feeProtocol; int24 tickLower; int24 tickUpper; @@ -16,8 +17,8 @@ interface IPoolManager is IFactory { } struct Pair { - address tokenA; - address tokenB; + address token0; + address token1; } function getPairs() external view returns (Pair[] memory); @@ -25,8 +26,8 @@ interface IPoolManager is IFactory { function getAllPools() external view returns (PoolInfo[] memory poolsInfo); struct CreateAndInitializeParams { - address tokenA; - address tokenB; + address token0; + address token1; uint24 fee; int24 tickLower; int24 tickUpper; diff --git a/demo-contract/contracts/wtfswap/interfaces/IPositionManager.sol b/demo-contract/contracts/wtfswap/interfaces/IPositionManager.sol index a9c54b0..1abd665 100644 --- a/demo-contract/contracts/wtfswap/interfaces/IPositionManager.sol +++ b/demo-contract/contracts/wtfswap/interfaces/IPositionManager.sol @@ -2,7 +2,9 @@ pragma solidity ^0.8.24; pragma abicoder v2; -interface IPositionManager { +import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; + +interface IPositionManager is IERC721 { struct PositionInfo { address owner; address token0;