-
Notifications
You must be signed in to change notification settings - Fork 135
Expand file tree
/
Copy pathPoolManager.sol
More file actions
88 lines (77 loc) · 2.61 KB
/
PoolManager.sol
File metadata and controls
88 lines (77 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.24;
pragma abicoder v2;
import "./interfaces/IPoolManager.sol";
import "./Factory.sol";
import "./interfaces/IPool.sol";
contract PoolManager is Factory, IPoolManager {
Pair[] public pairs;
function getPairs() external view override returns (Pair[] memory) {
return pairs;
}
function getAllPools()
external
view
override
returns (PoolInfo[] memory poolsInfo)
{
uint32 length = 0;
// 先算一下大小
for (uint32 i = 0; i < pairs.length; i++) {
length += uint32(pools[pairs[i].token0][pairs[i].token1].length);
}
// 再填充数据
poolsInfo = new PoolInfo[](length);
uint256 index;
for (uint32 i = 0; i < pairs.length; i++) {
address[] memory addresses = pools[pairs[i].token0][
pairs[i].token1
];
for (uint32 j = 0; j < addresses.length; j++) {
IPool pool = IPool(addresses[j]);
poolsInfo[index] = PoolInfo({
pool: addresses[j],
token0: pool.token0(),
token1: pool.token1(),
index: j,
fee: pool.fee(),
feeProtocol: 0,
tickLower: pool.tickLower(),
tickUpper: pool.tickUpper(),
tick: pool.tick(),
sqrtPriceX96: pool.sqrtPriceX96(),
liquidity: pool.liquidity()
});
index++;
}
}
return poolsInfo;
}
function createAndInitializePoolIfNecessary(
CreateAndInitializeParams calldata params
) external payable override returns (address poolAddress) {
require(
params.token0 < params.token1,
"token0 must be less than token1"
);
poolAddress = this.createPool(
params.token0,
params.token1,
params.tickLower,
params.tickUpper,
params.fee
);
IPool pool = IPool(poolAddress);
uint256 index = pools[pool.token0()][pool.token1()].length;
// 新创建的池子,没有初始化价格,需要初始化价格
if (pool.sqrtPriceX96() == 0) {
pool.initialize(params.sqrtPriceX96);
if (index == 1) {
// 如果是第一次添加该交易对,需要记录
pairs.push(
Pair({token0: pool.token0(), token1: pool.token1()})
);
}
}
}
}