forked from balancer/balancer-v2-monorepo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
AaveLinearPool.sol
78 lines (66 loc) · 2.96 KB
/
AaveLinearPool.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
// SPDX-License-Identifier: GPL-3.0-or-later
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;
import "@balancer-labs/v2-interfaces/contracts/pool-linear/IStaticAToken.sol";
import "../LinearPool.sol";
contract AaveLinearPool is LinearPool {
ILendingPool private immutable _lendingPool;
struct ConstructorArgs {
IVault vault;
string name;
string symbol;
IERC20 mainToken;
IERC20 wrappedToken;
address assetManager;
uint256 upperTarget;
uint256 swapFeePercentage;
uint256 pauseWindowDuration;
uint256 bufferPeriodDuration;
address owner;
}
constructor(ConstructorArgs memory args)
LinearPool(
args.vault,
args.name,
args.symbol,
args.mainToken,
args.wrappedToken,
args.upperTarget,
_toAssetManagerArray(args),
args.swapFeePercentage,
args.pauseWindowDuration,
args.bufferPeriodDuration,
args.owner
)
{
_lendingPool = IStaticAToken(address(args.wrappedToken)).LENDING_POOL();
_require(address(args.mainToken) == IStaticAToken(address(args.wrappedToken)).ASSET(), Errors.TOKENS_MISMATCH);
}
function _toAssetManagerArray(ConstructorArgs memory args) private pure returns (address[] memory) {
// We assign the same asset manager to both the main and wrapped tokens.
address[] memory assetManagers = new address[](2);
assetManagers[0] = args.assetManager;
assetManagers[1] = args.assetManager;
return assetManagers;
}
function _getWrappedTokenRate() internal view override returns (uint256) {
// This pulls in the implementation of `rate` used in the StaticAToken contract
// except avoiding storing relevant variables in storage for gas reasons.
// solhint-disable-next-line max-line-length
// see: https://github.com/aave/protocol-v2/blob/ac58fea62bb8afee23f66197e8bce6d79ecda292/contracts/protocol/tokenization/StaticATokenLM.sol#L255-L257
uint256 rate = _lendingPool.getReserveNormalizedIncome(address(getMainToken()));
// This function returns a 18 decimal fixed point number, but `rate` has 27 decimals (i.e. a 'ray' value)
// so we need to convert it.
return rate / 10**9;
}
}