forked from aave-dao/aave-v3-origin
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathNEW-pool-base.spec
167 lines (135 loc) · 6.15 KB
/
NEW-pool-base.spec
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
160
161
162
163
164
165
166
167
/*
This is a Base Specification File for Smart Contract Verification with the Certora Prover.
This file is meant to be included
*/
import "NEW-CVLMath.spec";
/*
Declaration of contracts used in the spec
*/
using ATokenHarness as _aToken;
using PoolHarness as PH;
using AaveProtocolDataProvider as _dataProvider;
using SimpleERC20 as _underlyingAsset;
/*
Methods Summerizations and Enviroment-Free (e.g relative to e.msg variables) Declarations
*/
methods {
// Pool
function _.handleAction(address, uint256, uint256) external => NONDET;
function _.getAssetPrice(address) external => NONDET;
function _.getPriceOracle() external => ALWAYS(2);
function _.getPriceOracleSentinel() external => ALWAYS(4);
function _.calculateCompoundedInterest(uint256 x, uint40 t0, uint256 t1) internal => calculateCompoundedInterestSummary(x, t0, t1) expect uint256 ALL;
// ERC20
function _.transfer(address, uint256) external => DISPATCHER(true);
function _.transferFrom(address, address, uint256) external => DISPATCHER(true);
function _.approve(address, uint256) external => DISPATCHER(true);
// function _.mint(address, uint256) external => DISPATCHER(true);
//function _.burn(uint256) external => DISPATCHER(true);
function _.balanceOf(address) external => DISPATCHER(true);
function _.totalSupply() external => DISPATCHER(true);
// ATOKEN
//function _.mint(address user, uint256 amount, uint256 index) external => DISPATCHER(true);
function _.burn(address user, address receiverOfUnderlying, uint256 amount, uint256 index) external => DISPATCHER(true);
function _.mintToTreasury(uint256 amount, uint256 index) external => DISPATCHER(true);
function _.transferOnLiquidation(address from, address to, uint256 value) external => DISPATCHER(true);
function _.transferUnderlyingTo(address user, uint256 amount) external => DISPATCHER(true);
//function _.handleRepayment(address user, uint256 amount) external => DISPATCHER(true);
function _.permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external => DISPATCHER(true);
function _.ATokenBalanceOf(address user) external => DISPATCHER(true);
// Unsat Core Based
function _.getParams(DataTypes.ReserveConfigurationMap memory self) internal => NONDET;
function _.calculateUserAccountData(mapping(address => DataTypes.ReserveData) storage reservesData,mapping(uint256 => address) storage reservesList,mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories,DataTypes.CalculateUserAccountDataParams memory params) internal => NONDET;
function _._getUserBalanceInBaseCurrency(address user,DataTypes.ReserveData storage reserve,uint256 assetPrice,uint256 assetUnit) internal => NONDET;
function _.wadDiv(uint256 a, uint256 b) internal => NONDET;
function _.wadToRay(uint256 a) internal => NONDET;
function _._calculateDomainSeparator() internal => NONDET;
// Debt Tokens
function _.scaledTotalSupply() external => DISPATCHER(true);
function _.getReserveNormalizedIncome(address asset) external => DISPATCHER(true);
function _.getReserveNormalizedVariableDebt(address asset) external => DISPATCHER(true);
function _.getACLManager() external => DISPATCHER(true);
// function _.isBridge(address) external => DISPATCHER(true);
// variableDebt
function _.burn(address user, uint256 amount, uint256 index) external => DISPATCHER(true);
function getActive(DataTypes.ReserveConfigurationMap) external returns (bool);
function getFrozen(DataTypes.ReserveConfigurationMap) external returns (bool);
function getBorrowingEnabled(DataTypes.ReserveConfigurationMap) external returns (bool);
}
/* definitions and functions to be used within the spec file */
definition IS_UINT256(uint256 x) returns bool = ((x >= 0) && (x <= max_uint256));
function first_term(uint256 x, uint256 y) returns uint256 { return x; }
ghost mapping(uint256 => mapping(uint256 => uint256)) calculateCompoundedInterestSummaryValues;
function calculateCompoundedInterestSummary(uint256 rate, uint40 t0, uint256 t1) returns uint256
{
uint256 deltaT = assert_uint256( (t1-t0) % 2^256 );
if (deltaT == 0) {
return RAY();
}
if (rate == RAY()) {
return RAY();
}
if (rate >= RAY()) {
require calculateCompoundedInterestSummaryValues[rate][deltaT] >= rate;
}
else {
require calculateCompoundedInterestSummaryValues[rate][deltaT] < rate;
}
return calculateCompoundedInterestSummaryValues[rate][deltaT];
}
function isActiveReserve(env e, address asset) returns bool {
DataTypes.ReserveDataLegacy data = getReserveData(e, asset);
DataTypes.ReserveConfigurationMap configuration = data.configuration;
bool isActive = getActive(e, configuration);
return isActive;
}
function isFrozenReserve(env e, address asset) returns bool {
DataTypes.ReserveDataLegacy data = getReserveData(e, asset);
DataTypes.ReserveConfigurationMap configuration = data.configuration;
bool isFrozen = getFrozen(e, configuration);
return isFrozen;
}
function isEnabledForBorrow(env e, address asset) returns bool {
DataTypes.ReserveDataLegacy data = getReserveData(e, asset);
DataTypes.ReserveConfigurationMap configuration = data.configuration;
bool isBorrowEnabled = getBorrowingEnabled(e, configuration);
return isBorrowEnabled;
}
function getCurrentLiquidityRate(env e, address asset) returns mathint {
DataTypes.ReserveDataLegacy data = getReserveData(e, asset);
return data.currentLiquidityRate;
}
function getLiquidityIndex(env e, address asset) returns mathint {
DataTypes.ReserveDataLegacy data = getReserveData(e, asset);
return data.liquidityIndex;
}
function aTokenBalanceOf(env e, address user) returns uint256 {
return _aToken.ATokenBalanceOf(e, user);
}
function rayMulPreciseSummarization(uint256 x, uint256 y) returns uint256 {
if ((x == 0) || (y == 0)) {
return 0;
}
if (x == RAY()) {
return y;
}
if (y == RAY()) {
return x;
}
mathint c = x * y;
return require_uint256(c / RAY());
}
function rayDivPreciseSummarization(uint256 x, uint256 y) returns uint256 {
require y != 0;
if (x == 0) {
return 0;
}
if (y == RAY()) {
return x;
}
if (y == x) {
return RAY();
}
mathint c = x * RAY();
return require_uint256(c / y);
}