/ test / common / mock / UniswapV2RouterMock.t.sol
UniswapV2RouterMock.t.sol
  1  pragma solidity >=0.6.0;
  2  
  3  import "../../../contracts/deployment/ManagedContract.sol";
  4  import "../../../contracts/governance/ProtocolSettings.sol";
  5  import "../../../contracts/interfaces/IUniswapV2Router01.sol";
  6  import "../../../contracts/interfaces/UnderlyingFeed.sol";
  7  import "../../../contracts/utils/ERC20.sol";
  8  import "../../../contracts/utils/SafeMath.sol";
  9  import "../../common/mock/ERC20Mock.t.sol";
 10  
 11  contract UniswapV2RouterMock is ManagedContract, IUniswapV2Router01 {
 12  
 13      using SafeMath for uint;
 14  
 15      ProtocolSettings private settings;
 16      UnderlyingFeed private feed;
 17      ERC20 private underlying;
 18      ERC20Mock private stablecoin;
 19  
 20      function initialize(Deployer deployer) override internal {
 21  
 22          settings = ProtocolSettings(deployer.getContractAddress("ProtocolSettings"));
 23          feed = UnderlyingFeed(deployer.getContractAddress("UnderlyingFeed"));
 24          underlying = ERC20(feed.getUnderlyingAddr());
 25          stablecoin = ERC20Mock(deployer.getContractAddress("StablecoinA"));
 26      }
 27  
 28      function factory() override external pure returns (address) {
 29  
 30          return address(0);
 31      }
 32  
 33      function WETH() override external pure returns (address){
 34  
 35          revert("not implemented");
 36      }
 37  
 38      function addLiquidity(
 39          address,
 40          address,
 41          uint,
 42          uint,
 43          uint,
 44          uint,
 45          address,
 46          uint
 47      )
 48          override
 49          external
 50          returns (uint, uint, uint)
 51      {
 52          revert("not implemented");
 53      }
 54  
 55      function addLiquidityETH(
 56          address,
 57          uint,
 58          uint,
 59          uint,
 60          address,
 61          uint
 62      )
 63          override
 64          external
 65          payable
 66          returns (uint, uint, uint)
 67      {
 68          revert("not implemented");
 69      }
 70  
 71      function removeLiquidity(
 72          address,
 73          address,
 74          uint,
 75          uint,
 76          uint,
 77          address,
 78          uint
 79      )
 80          override
 81          external
 82          returns (uint, uint)
 83      {
 84          revert("not implemented");
 85      }
 86  
 87      function removeLiquidityETH(
 88          address,
 89          uint,
 90          uint,
 91          uint,
 92          address,
 93          uint
 94      )
 95          override
 96          external
 97          returns (uint, uint)
 98      {
 99          revert("not implemented");
100      }
101  
102      function removeLiquidityWithPermit(
103          address,
104          address,
105          uint,
106          uint,
107          uint,
108          address,
109          uint,
110          bool, uint8, bytes32, bytes32
111      )
112          override
113          external
114          returns (uint, uint)
115      {
116          revert("not implemented");
117      }
118  
119      function removeLiquidityETHWithPermit(
120          address,
121          uint,
122          uint,
123          uint,
124          address,
125          uint,
126          bool, uint8, bytes32, bytes32
127      )
128          override
129          external
130          returns (uint, uint)
131      {
132          revert("not implemented");
133      }
134  
135      function swapExactTokensForTokens(
136          uint,
137          uint,
138          address[] calldata,
139          address,
140          uint
141      )
142          override
143          external
144          returns (uint[] memory)
145      {
146          revert("not implemented");
147      }
148  
149      function swapTokensForExactTokens(
150          uint amountOut,
151          uint amountInMax,
152          address[] calldata path,
153          address to,
154          uint
155      )
156          override
157          external
158          returns (uint[] memory amounts)
159      {
160          require(
161              path[0] == address(underlying) && path[1] == address(stablecoin),
162              "invalid path"
163          );
164  
165          (uint r, uint b) = settings.getTokenRate(path[1]);
166          (, int p) = feed.getLatestPrice();
167          uint v = amountOut.mul(10 ** uint(underlying.decimals())).div(uint(p).mul(r).div(b));
168  
169          require(v <= amountInMax, "amountInMax exceeded");
170          underlying.transferFrom(msg.sender, address(this), v);
171          stablecoin.issue(to, amountOut);
172  
173          amounts = new uint[](2);
174          amounts[0] = v;
175          amounts[1] = amountOut;
176      }
177  
178      function swapExactETHForTokens(
179          uint,
180          address[] calldata,
181          address,
182          uint
183      )
184          override
185          external
186          payable
187          returns (uint[] memory)
188      {
189          revert("not implemented");
190      }
191  
192      function swapTokensForExactETH(
193          uint,
194          uint,
195          address[] calldata,
196          address,
197          uint
198      )
199          override
200          external
201          returns (uint[] memory)
202      {
203          revert("not implemented");
204      }
205  
206      function swapExactTokensForETH(
207          uint,
208          uint,
209          address[] calldata,
210          address,
211          uint
212      )
213          override
214          external
215          returns (uint[] memory)
216      {
217          revert("not implemented");
218      }
219  
220      function swapETHForExactTokens(
221          uint,
222          address[] calldata,
223          address,
224          uint
225      )
226          override
227          external
228          payable
229          returns (uint[] memory)
230      {
231          revert("not implemented");
232      }
233  
234      function quote(
235          uint,
236          uint,
237          uint
238      )
239          override
240          external
241          pure
242          returns (uint)
243      {
244          revert("not implemented");
245      }
246  
247      function getAmountOut(
248          uint,
249          uint,
250          uint
251      )
252          override
253          external
254          pure
255          returns (uint)
256      {
257          revert("not implemented");
258      }
259  
260      function getAmountIn(
261          uint,
262          uint,
263          uint
264      )
265          override
266          external
267          pure
268          returns (uint)
269      {
270          revert("not implemented");
271      }
272  
273      function getAmountsOut(
274          uint,
275          address[] calldata
276      )
277          override
278          external
279          view
280          returns (uint[] memory)
281      {
282          revert("not implemented");
283      }
284  
285      function getAmountsIn(
286          uint,
287          address[] calldata
288      )
289          override
290          external
291          view
292          returns (uint[] memory)
293      {
294          revert("not implemented");
295      }
296  }