2
2
3
3
pragma solidity ^ 0.8.19 ;
4
4
5
- import "./ISwapsERC20 .sol " ;
5
+ import "./IWETH .sol " ;
6
6
import "./ISwapsPair.sol " ;
7
7
import "./ISwapsRouter.sol " ;
8
8
import "./ISwapsFactory.sol " ;
9
+ import "./LiquidityHelper.sol " ;
9
10
10
- contract LiquidityMaker {
11
+ contract LiquidityMaker is LiquidityHelper {
11
12
13
+ address immutable WETH_ADDRESS;
12
14
address immutable ROUTER_ADDRESS;
13
15
16
+ IWETH public immutable WETH;
14
17
ISwapsRouter public immutable ROUTER;
15
18
ISwapsFactory public immutable FACTORY;
16
19
20
+ event SwapResults (
21
+ uint256 amountIn ,
22
+ uint256 amountOUt
23
+ );
24
+
17
25
event LiquidityAdded (
18
- uint256 amount
26
+ uint256 amountAdded
19
27
);
20
28
21
29
constructor (
@@ -28,6 +36,12 @@ contract LiquidityMaker {
28
36
29
37
ROUTER = _router;
30
38
FACTORY = _factory;
39
+
40
+ WETH_ADDRESS = ROUTER.WETH ();
41
+
42
+ WETH = IWETH (
43
+ WETH_ADDRESS
44
+ );
31
45
}
32
46
33
47
/**
@@ -37,6 +51,37 @@ contract LiquidityMaker {
37
51
* 2. Adds liquidity for token A and token B pair
38
52
*/
39
53
function makeLiquidity (
54
+ address _tokenB ,
55
+ uint256 _expectedAmountB ,
56
+ uint256 _minEther ,
57
+ uint256 _minToken
58
+ )
59
+ external
60
+ payable
61
+ returns (uint256 )
62
+ {
63
+ _wrapEther (
64
+ msg .value
65
+ );
66
+
67
+ return _makeLiquidity (
68
+ WETH_ADDRESS,
69
+ _tokenB,
70
+ msg .value ,
71
+ _expectedAmountB,
72
+ _minEther,
73
+ _minToken,
74
+ msg .sender
75
+ );
76
+ }
77
+
78
+ /**
79
+ * @dev
80
+ * Optimal one-sided supply
81
+ * 1. Swaps optimal amount from token A to token B
82
+ * 2. Adds liquidity for token A and token B pair
83
+ */
84
+ function makeLiquidityDual (
40
85
address _tokenA ,
41
86
address _tokenB ,
42
87
uint256 _depositAmountA ,
@@ -45,14 +90,45 @@ contract LiquidityMaker {
45
90
uint256 _minTokenB
46
91
)
47
92
external
48
- returns (uint256 swapAmount )
93
+ payable
94
+ returns (uint256 )
49
95
{
50
- ISwapsERC20 (_tokenA).transferFrom (
96
+ _safeTransferFrom (
97
+ _tokenA,
51
98
msg .sender ,
52
99
address (this ),
53
100
_depositAmountA
54
101
);
55
102
103
+ return _makeLiquidity (
104
+ _tokenA,
105
+ _tokenB,
106
+ _depositAmountA,
107
+ _expectedAmountB,
108
+ _minTokenA,
109
+ _minTokenB,
110
+ msg .sender
111
+ );
112
+ }
113
+
114
+ /**
115
+ * @dev
116
+ * Optimal one-sided supply
117
+ * 1. Swaps optimal amount from token A to token B
118
+ * 2. Adds liquidity for token A and token B pair
119
+ */
120
+ function _makeLiquidity (
121
+ address _tokenA ,
122
+ address _tokenB ,
123
+ uint256 _depositAmountA ,
124
+ uint256 _expectedAmountB ,
125
+ uint256 _minTokenA ,
126
+ uint256 _minTokenB ,
127
+ address _beneficiary
128
+ )
129
+ internal
130
+ returns (uint256 )
131
+ {
56
132
ISwapsPair pair = _getPair (
57
133
_tokenA,
58
134
_tokenB
@@ -63,24 +139,37 @@ contract LiquidityMaker {
63
139
uint256 reserve1 ,
64
140
) = pair.getReserves ();
65
141
66
- swapAmount = pair.token0 () == _tokenA
142
+ uint256 swapAmount = pair.token0 () == _tokenA
67
143
? getSwapAmount (reserve0, _depositAmountA)
68
144
: getSwapAmount (reserve1, _depositAmountA);
69
145
70
- _swap (
146
+ // uint256[] memory swapResult =
147
+
148
+ uint256 [] memory swapResults = _swap (
71
149
_tokenA,
72
150
_tokenB,
73
151
swapAmount,
74
152
_expectedAmountB
75
153
);
76
154
77
- _addLiquidity (
155
+ emit SwapResults (
156
+ swapResults[0 ],
157
+ swapResults[1 ]
158
+ );
159
+
160
+ uint256 lpTokenAmount = _addLiquidity (
78
161
_tokenA,
79
162
_tokenB,
80
- _minTokenA,
81
- _minTokenB,
82
- msg . sender
163
+ _minTokenA, // swapResult[0],
164
+ _minTokenB, // swapResult[1],
165
+ _beneficiary
83
166
);
167
+
168
+ emit LiquidityAdded (
169
+ lpTokenAmount
170
+ );
171
+
172
+ return swapAmount;
84
173
}
85
174
86
175
function stakeLiquidity (
@@ -135,7 +224,6 @@ contract LiquidityMaker {
135
224
);
136
225
137
226
// _farmDeposit(
138
- // liquidity
139
227
// );
140
228
}
141
229
0 commit comments