-
Notifications
You must be signed in to change notification settings - Fork 62
/
Copy pathMockParaSwapAugustus.sol
101 lines (91 loc) · 3.22 KB
/
MockParaSwapAugustus.sol
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
89
90
91
92
93
94
95
96
97
98
99
100
101
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import {IParaSwapAugustus} from '../../extensions/paraswap-adapters/interfaces/IParaSwapAugustus.sol';
import {MockParaSwapTokenTransferProxy} from './MockParaSwapTokenTransferProxy.sol';
import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol';
import {MintableERC20} from '../tokens/MintableERC20.sol';
contract MockParaSwapAugustus is IParaSwapAugustus {
MockParaSwapTokenTransferProxy immutable TOKEN_TRANSFER_PROXY;
bool _expectingSwap;
address _expectedFromToken;
address _expectedToToken;
uint256 _expectedFromAmountMin;
uint256 _expectedFromAmountMax;
uint256 _receivedAmount;
uint256 _fromAmount;
uint256 _expectedToAmountMax;
uint256 _expectedToAmountMin;
constructor() {
TOKEN_TRANSFER_PROXY = new MockParaSwapTokenTransferProxy();
}
function getTokenTransferProxy() external view override returns (address) {
return address(TOKEN_TRANSFER_PROXY);
}
function expectSwap(
address fromToken,
address toToken,
uint256 fromAmountMin,
uint256 fromAmountMax,
uint256 receivedAmount
) external {
_expectingSwap = true;
_expectedFromToken = fromToken;
_expectedToToken = toToken;
_expectedFromAmountMin = fromAmountMin;
_expectedFromAmountMax = fromAmountMax;
_receivedAmount = receivedAmount;
}
function expectBuy(
address fromToken,
address toToken,
uint256 fromAmount,
uint256 toAmountMin,
uint256 toAmountMax
) external {
_expectingSwap = true;
_expectedFromToken = fromToken;
_expectedToToken = toToken;
_fromAmount = fromAmount;
_expectedToAmountMin = toAmountMin;
_expectedToAmountMax = toAmountMax;
}
function swap(
address fromToken,
address toToken,
uint256 fromAmount,
uint256 toAmount
) external returns (uint256) {
require(_expectingSwap, 'Not expecting swap');
require(fromToken == _expectedFromToken, 'Unexpected from token');
require(toToken == _expectedToToken, 'Unexpected to token');
require(
fromAmount >= _expectedFromAmountMin && fromAmount <= _expectedFromAmountMax,
'From amount out of range'
);
require(_receivedAmount >= toAmount, 'Received amount of tokens are less than expected');
TOKEN_TRANSFER_PROXY.transferFrom(fromToken, msg.sender, address(this), fromAmount);
MintableERC20(toToken).mint(_receivedAmount);
IERC20(toToken).transfer(msg.sender, _receivedAmount);
_expectingSwap = false;
return _receivedAmount;
}
function buy(
address fromToken,
address toToken,
uint256 fromAmount,
uint256 toAmount
) external returns (uint256) {
require(_expectingSwap, 'Not expecting swap');
require(fromToken == _expectedFromToken, 'Unexpected from token');
require(toToken == _expectedToToken, 'Unexpected to token');
require(
toAmount >= _expectedToAmountMin && toAmount <= _expectedToAmountMax,
'To amount out of range'
);
require(_fromAmount <= fromAmount, 'From amount of tokens are higher than expected');
TOKEN_TRANSFER_PROXY.transferFrom(fromToken, msg.sender, address(this), _fromAmount);
MintableERC20(toToken).mint(msg.sender, toAmount);
_expectingSwap = false;
return fromAmount;
}
}