-
Notifications
You must be signed in to change notification settings - Fork 6
/
adapter.sol
159 lines (136 loc) · 4.81 KB
/
adapter.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// SPDX-License-Identifier: MIT
pragma solidity 0.8.21;
// ========== External imports ==========
import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable//utils/math/SafeMathUpgradeable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./interface/IVault.sol";
import "./interface/INgnx.sol";
contract CollateralAdapter is Initializable, AccessControlUpgradeable {
IVault public vaultContract; // Vault Engine
bytes32 public collateralType; // Collateral Type USDC-A | USDT-A
IERC20 public collateralContract; // usdc contract
uint public live; // Active Flag
// -- EVENTS --
event CollateralJoined(uint vaultId, address indexed owner, uint256 amount);
event CollateralExited(uint vaultId, address indexed owner, uint256 amount);
// -- ERRORS --
error NotLive(string error);
error ZeroAmount(string error);
error NotOwner(string error);
function initialize(
address _vault,
bytes32 _collateralType,
address _collateralContract
) public initializer {
__AccessControl_init();
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
vaultContract = IVault(_vault);
collateralType = _collateralType;
collateralContract = IERC20(_collateralContract);
live = 1;
}
// ========== External Functions ==========
function join(
uint256 amount,
address owner,
uint256 _vaultId
) external isLive {
if (amount <= 0) {
revert ZeroAmount("Adapter/amount-is-zero");
}
// calls vault contract to open it
vaultContract.collateralizeVault(amount, owner, _vaultId);
// transfers collateral from user to adapter contract
collateralContract.transferFrom(msg.sender, address(this), amount);
emit CollateralJoined(_vaultId, owner, amount);
}
function exit(
uint256 amount,
address owner,
uint256 _vaultId
) external isLive {
if (amount <= 0) {
revert ZeroAmount("Adapter/amount-is-zero");
}
address vaultOwner = vaultContract.getVaultOwner(_vaultId);
if (vaultOwner != owner) {
revert NotOwner("Adapter/owner-not-match");
}
// transfers the collateral from adapter contract to user
collateralContract.transfer(owner, amount);
// calls vault contract to exit it
vaultContract.withdrawUnlockedCollateral(_vaultId, amount);
emit CollateralExited(_vaultId, owner, amount);
}
// ========== Modifiers ==========
modifier isLive() {
if (live != 1) {
revert NotLive("Adapter/not-live");
}
_;
}
}
contract NGNxAdapter is Initializable, AccessControlUpgradeable {
IVault public vaultContract; // Vault Engine
INGNX public ngnx; // NGNx contract
uint public live; // Active Flag
// -- EVENTS --
event NGNxJoined(uint vaultId, address indexed owner, uint256 amount);
event NGNxExited(uint vaultId, address indexed owner, uint256 amount);
// -- ERRORS --
error NotLive(string error);
error ZeroAmount(string error);
error NotOwner(string error);
function initialize(
address _vault,
address _ngnx,
) public initializer {
__AccessControl_init();
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
vaultContract = IVault(_vault);
ngnx = INGNX(_ngnx);
live = 1;
}
// ========== External Functions ==========
function join(
uint256 amount,
address owner,
uint256 _vaultId
) external isLive {
if (amount <= 0) {
revert ZeroAmount("Adapter/amount-is-zero");
}
// calls the cleanse vault contrarct method
vaultContract.cleanseVault(_vaultId, amount);
// burns the NGNx tokens from the user
ngnx.burn(owner, amount);
emit NGNxJoined(_vaultId, owner, amount);
}
function exit(
uint256 amount,
address owner,
uint256 _vaultId
) external isLive {
if (amount <= 0) {
revert ZeroAmount("Adapter/amount-is-zero");
}
address vaultOwner = vaultContract.getVaultOwner(_vaultId);
if (vaultOwner != owner) {
revert NotOwner("Adapter/owner-not-match");
}
// calls the withdrawNGNx vault contrarct method
vaultContract.withdrawNGNx(_vaultId, amount);
// burns the NGNx tokens from the user
ngnx.mint(owner, amount)
emit NGNxExited(_vaultId, owner, amount);
}
// ========== Modifiers ==========
modifier isLive() {
if (live != 1) {
revert NotLive("Adapter/not-live");
}
_;
}
}