Skip to content

Commit 56dd758

Browse files
committed
chore; add missing spec options
1 parent 148e37c commit 56dd758

File tree

2 files changed

+97
-2
lines changed

2 files changed

+97
-2
lines changed

certora/gsm/conf/gsm/GelatoOracleSwapFreezer.conf

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,19 @@
88
],
99
"assert_autofinder_success": true,
1010
"optimistic_loop":true,
11-
… "-depth 20",
11+
"loop_iter":"1",
12+
"optimistic_hashing":true,
13+
"hashing_length_bound":"416",
14+
"solc": "solc8.20",
15+
"rule_sanity" : "basic",
16+
"multi_assert_check": true,
17+
"msg": "GelatoOracleSwapFreezer",
18+
"smt_timeout": "4000",
19+
"prover_args": [
20+
"-copyLoopUnroll 6",
21+
"-depth 20",
1222
],
1323
"verify":
1424
"GelatoOracleSwapFreezerHarness:certora/gsm/specs/gsm/GelatoOracleSwapFreezer.spec",
1525
//"build_cache": true,
16-
}
26+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
2+
// verifies properties of GelatoOracleSwapFreezer
3+
4+
methods {
5+
function getFreezeBound() external returns (uint128, uint128) envfree;
6+
function getUnfreezeBound() external returns (uint128, uint128) envfree;
7+
function validateBounds(uint128,uint128,uint128,uint128,bool) external returns bool envfree;
8+
function _.hasRole(bytes32, address) external => hasRole expect bool;
9+
function _.getAssetPrice(address) external => CONSTANT;
10+
function _.getPriceOracle() external => CONSTANT;
11+
function _.getIsSeized() external => CONSTANT;
12+
function _.SWAP_FREEZER_ROLE() external => CONSTANT;
13+
function _.getIsFrozen() external => CONSTANT;
14+
}
15+
16+
function boundsAreValid() returns bool
17+
{
18+
uint128 freezeLower; uint128 freezeUpper; uint128 unFreezeLower; uint128 unFreezeUpper;
19+
freezeLower, freezeUpper = getFreezeBound();
20+
unFreezeLower, unFreezeUpper = getUnfreezeBound();
21+
return validateBounds(freezeLower, freezeUpper, unFreezeLower, unFreezeUpper, true);
22+
}
23+
24+
ghost bool hasRole;
25+
26+
// @title Freeze action is executable under specified conditions
27+
// Freeze action is executable if GSM is not seized, not frozen and price is outside of the freeze bounds
28+
// STATUS: PASS
29+
// https://prover.certora.com/output/40748/9802a015eadc415ab6e449384f60e944?anonymousKey=e43bbc0fc9409b164be311adbadaa6d473db1a00
30+
rule freezeExecutable()
31+
{
32+
env e;
33+
uint256 price = getPrice(e);
34+
require hasRole == true;
35+
require !isFrozen(e) && !isSeized(e);
36+
uint128 freezeLower; uint128 freezeUpper;
37+
freezeLower, freezeUpper = getFreezeBound();
38+
require price < require_uint256(freezeLower) || price > require_uint256(freezeUpper);
39+
assert price != 0 => getAction(e) == 1; //represents the freeze action
40+
}
41+
42+
// @title Unfreeze action is executable under specified conditions
43+
//Unfreeze action is executable if GSM is not seized, frozen, unfreezing is allowed and price is inside the unfreeze bounds
44+
// STATUS: PASS
45+
// https://prover.certora.com/output/11775/184ae7de9b56415088118d8e6d027ff3?anonymousKey=4f8fcda010d0dbba62ed4fd5663650233a3f7969
46+
rule unfreezeExecutable()
47+
{
48+
env e;
49+
uint256 price = getPrice(e);
50+
require hasRole == true;
51+
require boundsAreValid();
52+
require isFrozen(e) && !isSeized(e);
53+
uint128 unFreezeLower; uint128 unFreezeUpper;
54+
unFreezeLower, unFreezeUpper = getUnfreezeBound();
55+
require price >= require_uint256(unFreezeLower) && price <= require_uint256(unFreezeUpper);
56+
assert getCanUnfreeze(e) => getAction(e) == 2; //represents the unfreeze action
57+
}
58+
59+
// @title Unfreeze boundaries are contained in freeze boundaries
60+
//Unfreeze boundaries are "contained" in freeze boundaries, where freezeLowerBound < unfreezeLowerBound and unfreezeUpperBound < freezeUpperBound
61+
// STATUS: PASS
62+
// https://prover.certora.com/output/11775/184ae7de9b56415088118d8e6d027ff3?anonymousKey=4f8fcda010d0dbba62ed4fd5663650233a3f7969
63+
rule boundsAreContained()
64+
{
65+
env e;
66+
require boundsAreValid();
67+
uint128 freezeLower; uint128 freezeUpper;
68+
freezeLower, freezeUpper = getFreezeBound();
69+
70+
uint128 unfreezeLower; uint128 unfreezeUpper;
71+
unfreezeLower, unfreezeUpper = getUnfreezeBound();
72+
73+
assert freezeLower < unfreezeLower && unfreezeUpper < freezeUpper;
74+
}
75+
76+
// @title freeze and unfreeze are never executable at the same time.
77+
//there should never be an oracle price that could allow both freeze and unfreeze
78+
// STATUS: PASS
79+
// https://prover.certora.com/output/11775/184ae7de9b56415088118d8e6d027ff3?anonymousKey=4f8fcda010d0dbba62ed4fd5663650233a3f7969
80+
rule freezeAndUnfreezeAreExclusive()
81+
{
82+
env e;
83+
require boundsAreValid();
84+
assert !(isFreezeAllowed(e) && isUnfreezeAllowed(e));
85+
}

0 commit comments

Comments
 (0)