|
@@ -0,0 +1,165 @@
|
|
|
|
+import "helpers.spec"
|
|
|
|
+
|
|
|
|
+methods {
|
|
|
|
+ // initialize, reinitialize, disable
|
|
|
|
+ initialize() envfree
|
|
|
|
+ reinitialize(uint8) envfree
|
|
|
|
+ disable() envfree
|
|
|
|
+
|
|
|
|
+ nested_init_init() envfree
|
|
|
|
+ nested_init_reinit(uint8) envfree
|
|
|
|
+ nested_reinit_init(uint8) envfree
|
|
|
|
+ nested_reinit_reinit(uint8,uint8) envfree
|
|
|
|
+
|
|
|
|
+ // view
|
|
|
|
+ version() returns uint8 envfree
|
|
|
|
+ initializing() returns bool envfree
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+โ Definitions โ
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+*/
|
|
|
|
+definition isUninitialized() returns bool = version() == 0;
|
|
|
|
+definition isInitialized() returns bool = version() > 0;
|
|
|
|
+definition isDisabled() returns bool = version() == 255;
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+โ Invariant: A contract must only ever be in an initializing state while in the middle of a transaction execution. โ
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+*/
|
|
|
|
+invariant notInitializing()
|
|
|
|
+ !initializing()
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+โ Rule: The version cannot decrease & disable state is irrevocable. โ
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+*/
|
|
|
|
+rule increasingVersion(env e) {
|
|
|
|
+ uint8 versionBefore = version();
|
|
|
|
+ bool disabledBefore = isDisabled();
|
|
|
|
+
|
|
|
|
+ method f; calldataarg args;
|
|
|
|
+ f(e, args);
|
|
|
|
+
|
|
|
|
+ assert versionBefore <= version(), "_initialized must only increase";
|
|
|
|
+ assert disabledBefore => isDisabled(), "a disabled initializer must stay disabled";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+โ Rule: Cannot initialize a contract that is already initialized. โ
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+*/
|
|
|
|
+rule cannotInitializeTwice() {
|
|
|
|
+ require isInitialized();
|
|
|
|
+
|
|
|
|
+ initialize@withrevert();
|
|
|
|
+
|
|
|
|
+ assert lastReverted, "contract must only be initialized once";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+โ Rule: Cannot initialize once disabled. โ
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+*/
|
|
|
|
+rule cannotInitializeOnceDisabled() {
|
|
|
|
+ require isDisabled();
|
|
|
|
+
|
|
|
|
+ initialize@withrevert();
|
|
|
|
+
|
|
|
|
+ assert lastReverted, "contract is disabled";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+โ Rule: Cannot reinitialize once disabled. โ
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+*/
|
|
|
|
+rule cannotReinitializeOnceDisabled() {
|
|
|
|
+ require isDisabled();
|
|
|
|
+
|
|
|
|
+ uint8 n;
|
|
|
|
+ reinitialize@withrevert(n);
|
|
|
|
+
|
|
|
|
+ assert lastReverted, "contract is disabled";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+โ Rule: Cannot nest initializers (after construction). โ
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+*/
|
|
|
|
+rule cannotNestInitializers_init_init() {
|
|
|
|
+ nested_init_init@withrevert();
|
|
|
|
+ assert lastReverted, "nested initializers";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+rule cannotNestInitializers_init_reinit(uint8 m) {
|
|
|
|
+ nested_init_reinit@withrevert(m);
|
|
|
|
+ assert lastReverted, "nested initializers";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+rule cannotNestInitializers_reinit_init(uint8 n) {
|
|
|
|
+ nested_reinit_init@withrevert(n);
|
|
|
|
+ assert lastReverted, "nested initializers";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+rule cannotNestInitializers_reinit_reinit(uint8 n, uint8 m) {
|
|
|
|
+ nested_reinit_reinit@withrevert(n, m);
|
|
|
|
+ assert lastReverted, "nested initializers";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+โ Rule: Initialize correctly sets the version. โ
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+*/
|
|
|
|
+rule initializeEffects() {
|
|
|
|
+ requireInvariant notInitializing();
|
|
|
|
+
|
|
|
|
+ bool isUninitializedBefore = isUninitialized();
|
|
|
|
+
|
|
|
|
+ initialize@withrevert();
|
|
|
|
+ bool success = !lastReverted;
|
|
|
|
+
|
|
|
|
+ assert success <=> isUninitializedBefore, "can only initialize uninitialized contracts";
|
|
|
|
+ assert success => version() == 1, "initialize must set version() to 1";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+โ Rule: Reinitialize correctly sets the version. โ
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+*/
|
|
|
|
+rule reinitializeEffects() {
|
|
|
|
+ requireInvariant notInitializing();
|
|
|
|
+
|
|
|
|
+ uint8 versionBefore = version();
|
|
|
|
+
|
|
|
|
+ uint8 n;
|
|
|
|
+ reinitialize@withrevert(n);
|
|
|
|
+ bool success = !lastReverted;
|
|
|
|
+
|
|
|
|
+ assert success <=> versionBefore < n, "can only reinitialize to a latter versions";
|
|
|
|
+ assert success => version() == n, "reinitialize must set version() to n";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+โ Rule: Can disable. โ
|
|
|
|
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
|
|
+*/
|
|
|
|
+rule disableEffect() {
|
|
|
|
+ requireInvariant notInitializing();
|
|
|
|
+
|
|
|
|
+ disable@withrevert();
|
|
|
|
+ bool success = !lastReverted;
|
|
|
|
+
|
|
|
|
+ assert success, "call to _disableInitializers failed";
|
|
|
|
+ assert isDisabled(), "disable state not set";
|
|
|
|
+}
|