-
Notifications
You must be signed in to change notification settings - Fork 0
/
Controller.sol
116 lines (102 loc) · 3.03 KB
/
Controller.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.4;
import "./Constants.sol";
import "./IController.sol";
import "./IPoolSafe.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
contract Controller is IController {
using SafeERC20 for IERC20;
// Events
event Deposited(address indexed from, address indexed to, uint256 amount);
event Withdrawed(address indexed to, address indexed from, uint256 amount);
modifier onlyAdmins(IPoolSafe poolSafe) {
require(poolSafe.isAdmin(msg.sender), "Operation require admin privilige");
_;
}
modifier sufficientFunds(
IPoolSafe poolSafe,
IERC20 token,
uint256 amount
) {
require(poolSafe.balance(token) >= amount, "Insufficient funds");
_;
}
function deposit(
IPoolSafe poolSafe,
IERC20 token,
uint256 amount
) external {
bytes memory data = abi.encodeWithSelector(
Controller.executeDeposit.selector,
token,
msg.sender,
address(poolSafe),
amount
);
poolSafe.relayCall(Constants.CONTROLLER_ADDRESS, data);
}
function executeDeposit(
IERC20 token,
address from,
address to,
uint256 amount
) external {
token.safeTransferFrom(from, to, amount);
emit Deposited(from, to, amount);
}
function withdraw(
IPoolSafe poolSafe,
IERC20 token,
address to,
uint256 amount
) external onlyAdmins(poolSafe) sufficientFunds(poolSafe, token, amount) {
bytes memory data = abi.encodeWithSelector(
Controller.executeWithdraw.selector,
token,
address(poolSafe),
to,
amount
);
poolSafe.relayCall(Constants.CONTROLLER_ADDRESS, data);
}
function executeWithdraw(
IERC20 token,
address from,
address to,
uint256 amount
) external {
uint256 allowance = token.allowance(from, to);
if (allowance < amount) {
token.safeIncreaseAllowance(to, amount);
}
token.safeTransfer(to, amount);
emit Withdrawed(to, from, amount);
}
function increaseTokenAllowance(
IPoolSafe poolSafe,
IERC20 token,
address spender,
uint256 amount
) external onlyAdmins(poolSafe) sufficientFunds(poolSafe, token, amount) {
bytes memory data = abi.encodeWithSelector(
Controller._increaseTokenAllowance.selector,
token,
address(poolSafe),
spender,
amount
);
poolSafe.relayCall(Constants.CONTROLLER_ADDRESS, data);
}
function _increaseTokenAllowance(
IERC20 token,
address from,
address to,
uint256 amount
) external {
uint256 allowance = token.allowance(from, to);
if (allowance < amount) {
token.safeIncreaseAllowance(to, amount);
}
token.safeTransfer(to, amount);
}
}