Finish Initializable

pull/4525/head
ernestognw 2 years ago
parent de70816716
commit 01aea1b704
No known key found for this signature in database
  1. 4
      certora/diff/access_AccessControl.sol.patch
  2. 4
      certora/diff/access_IAccessControl.sol.patch
  3. 4
      certora/diff/access_Ownable.sol.patch
  4. 4
      certora/diff/access_Ownable2Step.sol.patch
  5. 4
      certora/diff/access_extensions_AccessControlDefaultAdminRules.sol.patch
  6. 4
      certora/diff/access_extensions_IAccessControlDefaultAdminRules.sol.patch
  7. 4
      certora/diff/interfaces_IERC3156FlashBorrower.sol.patch
  8. 4
      certora/diff/interfaces_IERC3156FlashLender.sol.patch
  9. 4
      certora/diff/interfaces_IERC5267.sol.patch
  10. 4
      certora/diff/interfaces_IERC5313.sol.patch
  11. 4
      certora/diff/interfaces_draft-IERC6093.sol.patch
  12. 11
      certora/diff/proxy_utils_Initializable.sol.patch
  13. 4
      certora/diff/security_Pausable.sol.patch
  14. 4
      certora/diff/token_ERC20_ERC20.sol.patch
  15. 4
      certora/diff/token_ERC20_IERC20.sol.patch
  16. 4
      certora/diff/token_ERC20_extensions_ERC20FlashMint.sol.patch
  17. 4
      certora/diff/token_ERC20_extensions_ERC20Permit.sol.patch
  18. 4
      certora/diff/token_ERC20_extensions_IERC20Metadata.sol.patch
  19. 4
      certora/diff/token_ERC20_extensions_IERC20Permit.sol.patch
  20. 10
      certora/diff/token_ERC721_ERC721.sol.patch
  21. 4
      certora/diff/utils_Context.sol.patch
  22. 4
      certora/diff/utils_Nonces.sol.patch
  23. 4
      certora/diff/utils_ShortStrings.sol.patch
  24. 4
      certora/diff/utils_StorageSlot.sol.patch
  25. 4
      certora/diff/utils_Strings.sol.patch
  26. 4
      certora/diff/utils_cryptography_ECDSA.sol.patch
  27. 4
      certora/diff/utils_cryptography_EIP712.sol.patch
  28. 4
      certora/diff/utils_cryptography_MessageHashUtils.sol.patch
  29. 4
      certora/diff/utils_introspection_ERC165.sol.patch
  30. 4
      certora/diff/utils_introspection_IERC165.sol.patch
  31. 4
      certora/diff/utils_math_Math.sol.patch
  32. 4
      certora/diff/utils_math_SafeCast.sol.patch
  33. 4
      certora/diff/utils_math_SignedMath.sol.patch
  34. 4
      certora/diff/utils_structs_DoubleEndedQueue.sol.patch
  35. 14
      certora/harnesses/InitializableHarness.sol
  36. 38
      certora/specs/Initializable.spec

@ -1,5 +1,5 @@
--- access/AccessControl.sol 2023-08-10 22:02:18
+++ access/AccessControl.sol 2023-08-11 12:22:17
--- access/AccessControl.sol 2023-08-11 20:33:54
+++ access/AccessControl.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)

@ -1,5 +1,5 @@
--- access/IAccessControl.sol 2023-08-10 22:02:20
+++ access/IAccessControl.sol 2023-08-11 12:22:17
--- access/IAccessControl.sol 2023-08-11 20:33:54
+++ access/IAccessControl.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

@ -1,5 +1,5 @@
--- access/Ownable.sol 2023-08-09 11:45:05
+++ access/Ownable.sol 2023-08-11 12:22:17
--- access/Ownable.sol 2023-08-11 20:33:54
+++ access/Ownable.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

@ -1,5 +1,5 @@
--- access/Ownable2Step.sol 2023-08-09 11:45:05
+++ access/Ownable2Step.sol 2023-08-11 12:22:17
--- access/Ownable2Step.sol 2023-08-11 20:33:54
+++ access/Ownable2Step.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)

@ -1,5 +1,5 @@
--- access/extensions/AccessControlDefaultAdminRules.sol 2023-08-09 11:45:05
+++ access/extensions/AccessControlDefaultAdminRules.sol 2023-08-11 12:22:17
--- access/extensions/AccessControlDefaultAdminRules.sol 2023-08-11 20:33:54
+++ access/extensions/AccessControlDefaultAdminRules.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControlDefaultAdminRules.sol)

@ -1,5 +1,5 @@
--- access/extensions/IAccessControlDefaultAdminRules.sol 2023-08-09 11:45:05
+++ access/extensions/IAccessControlDefaultAdminRules.sol 2023-08-11 12:22:17
--- access/extensions/IAccessControlDefaultAdminRules.sol 2023-08-11 20:33:54
+++ access/extensions/IAccessControlDefaultAdminRules.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/IAccessControlDefaultAdminRules.sol)

@ -1,5 +1,5 @@
--- interfaces/IERC3156FlashBorrower.sol 2023-08-09 11:45:05
+++ interfaces/IERC3156FlashBorrower.sol 2023-08-11 13:36:59
--- interfaces/IERC3156FlashBorrower.sol 2023-08-11 20:33:54
+++ interfaces/IERC3156FlashBorrower.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC3156FlashBorrower.sol)

@ -1,5 +1,5 @@
--- interfaces/IERC3156FlashLender.sol 2023-08-09 11:45:05
+++ interfaces/IERC3156FlashLender.sol 2023-08-11 13:37:04
--- interfaces/IERC3156FlashLender.sol 2023-08-11 20:33:54
+++ interfaces/IERC3156FlashLender.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC3156FlashLender.sol)

@ -1,5 +1,5 @@
--- interfaces/IERC5267.sol 2023-08-09 11:45:05
+++ interfaces/IERC5267.sol 2023-08-11 12:22:17
--- interfaces/IERC5267.sol 2023-08-11 20:33:54
+++ interfaces/IERC5267.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)

@ -1,5 +1,5 @@
--- interfaces/IERC5313.sol 2023-08-09 11:45:05
+++ interfaces/IERC5313.sol 2023-08-11 12:22:17
--- interfaces/IERC5313.sol 2023-08-11 20:33:54
+++ interfaces/IERC5313.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5313.sol)

@ -1,5 +1,5 @@
--- interfaces/draft-IERC6093.sol 2023-08-09 11:45:05
+++ interfaces/draft-IERC6093.sol 2023-08-11 12:22:17
--- interfaces/draft-IERC6093.sol 2023-08-11 20:33:54
+++ interfaces/draft-IERC6093.sol 2023-08-13 09:56:16
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;

@ -0,0 +1,11 @@
--- proxy/utils/Initializable.sol 2023-08-11 20:33:54
+++ proxy/utils/Initializable.sol 2023-08-13 09:56:19
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.19;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed

@ -1,5 +1,5 @@
--- security/Pausable.sol 2023-08-10 21:54:54
+++ security/Pausable.sol 2023-08-11 12:22:17
--- security/Pausable.sol 2023-08-11 20:33:54
+++ security/Pausable.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

@ -1,5 +1,5 @@
--- token/ERC20/ERC20.sol 2023-08-09 11:45:05
+++ token/ERC20/ERC20.sol 2023-08-11 13:37:08
--- token/ERC20/ERC20.sol 2023-08-11 20:33:54
+++ token/ERC20/ERC20.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

@ -1,5 +1,5 @@
--- token/ERC20/IERC20.sol 2023-08-09 11:45:05
+++ token/ERC20/IERC20.sol 2023-08-11 12:22:17
--- token/ERC20/IERC20.sol 2023-08-11 20:33:54
+++ token/ERC20/IERC20.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

@ -1,5 +1,5 @@
--- token/ERC20/extensions/ERC20FlashMint.sol 2023-08-09 11:45:05
+++ token/ERC20/extensions/ERC20FlashMint.sol 2023-08-11 13:36:55
--- token/ERC20/extensions/ERC20FlashMint.sol 2023-08-11 20:33:54
+++ token/ERC20/extensions/ERC20FlashMint.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/extensions/ERC20FlashMint.sol)

@ -1,5 +1,5 @@
--- token/ERC20/extensions/ERC20Permit.sol 2023-08-09 11:45:05
+++ token/ERC20/extensions/ERC20Permit.sol 2023-08-11 12:22:17
--- token/ERC20/extensions/ERC20Permit.sol 2023-08-11 20:33:54
+++ token/ERC20/extensions/ERC20Permit.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol)

@ -1,5 +1,5 @@
--- token/ERC20/extensions/IERC20Metadata.sol 2023-08-09 11:45:05
+++ token/ERC20/extensions/IERC20Metadata.sol 2023-08-11 12:22:17
--- token/ERC20/extensions/IERC20Metadata.sol 2023-08-11 20:33:54
+++ token/ERC20/extensions/IERC20Metadata.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

@ -1,5 +1,5 @@
--- token/ERC20/extensions/IERC20Permit.sol 2023-08-11 12:19:57
+++ token/ERC20/extensions/IERC20Permit.sol 2023-08-11 12:22:17
--- token/ERC20/extensions/IERC20Permit.sol 2023-08-11 20:33:54
+++ token/ERC20/extensions/IERC20Permit.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)

@ -1,7 +1,7 @@
--- token/ERC721/ERC721.sol 2023-08-10 16:45:36
+++ token/ERC721/ERC721.sol 2023-08-11 12:22:17
@@ -208,6 +208,11 @@
return _owners[tokenId];
--- token/ERC721/ERC721.sol 2023-08-11 20:33:54
+++ token/ERC721/ERC721.sol 2023-08-13 09:56:16
@@ -214,6 +214,11 @@
}
}
+ // FV
@ -10,5 +10,5 @@
+ }
+
/**
* @dev Returns whether `tokenId` exists.
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*

@ -1,5 +1,5 @@
--- utils/Context.sol 2023-08-10 21:54:56
+++ utils/Context.sol 2023-08-11 12:22:17
--- utils/Context.sol 2023-08-11 20:33:54
+++ utils/Context.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

@ -1,5 +1,5 @@
--- utils/Nonces.sol 2023-08-09 11:45:05
+++ utils/Nonces.sol 2023-08-11 12:22:17
--- utils/Nonces.sol 2023-08-11 20:33:54
+++ utils/Nonces.sol 2023-08-13 09:56:16
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;

@ -1,5 +1,5 @@
--- utils/ShortStrings.sol 2023-08-09 11:45:05
+++ utils/ShortStrings.sol 2023-08-11 12:22:17
--- utils/ShortStrings.sol 2023-08-11 20:33:54
+++ utils/ShortStrings.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol)

@ -1,5 +1,5 @@
--- utils/StorageSlot.sol 2023-08-09 11:45:05
+++ utils/StorageSlot.sol 2023-08-11 12:22:17
--- utils/StorageSlot.sol 2023-08-11 20:33:54
+++ utils/StorageSlot.sol 2023-08-13 09:56:16
@@ -2,7 +2,7 @@
// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.

@ -1,5 +1,5 @@
--- utils/Strings.sol 2023-08-09 11:45:05
+++ utils/Strings.sol 2023-08-11 12:22:44
--- utils/Strings.sol 2023-08-11 20:33:54
+++ utils/Strings.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

@ -1,5 +1,5 @@
--- utils/cryptography/ECDSA.sol 2023-08-09 11:45:05
+++ utils/cryptography/ECDSA.sol 2023-08-11 12:22:17
--- utils/cryptography/ECDSA.sol 2023-08-11 20:33:54
+++ utils/cryptography/ECDSA.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)

@ -1,5 +1,5 @@
--- utils/cryptography/EIP712.sol 2023-08-09 11:45:05
+++ utils/cryptography/EIP712.sol 2023-08-11 12:22:17
--- utils/cryptography/EIP712.sol 2023-08-11 20:33:54
+++ utils/cryptography/EIP712.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol)

@ -1,5 +1,5 @@
--- utils/cryptography/MessageHashUtils.sol 2023-08-09 11:45:05
+++ utils/cryptography/MessageHashUtils.sol 2023-08-11 12:22:17
--- utils/cryptography/MessageHashUtils.sol 2023-08-11 20:33:54
+++ utils/cryptography/MessageHashUtils.sol 2023-08-13 09:56:16
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT

@ -1,5 +1,5 @@
--- utils/introspection/ERC165.sol 2023-08-10 22:02:24
+++ utils/introspection/ERC165.sol 2023-08-11 12:22:17
--- utils/introspection/ERC165.sol 2023-08-11 20:33:54
+++ utils/introspection/ERC165.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

@ -1,5 +1,5 @@
--- utils/introspection/IERC165.sol 2023-08-09 11:45:05
+++ utils/introspection/IERC165.sol 2023-08-11 12:22:17
--- utils/introspection/IERC165.sol 2023-08-11 20:33:54
+++ utils/introspection/IERC165.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

@ -1,5 +1,5 @@
--- utils/math/Math.sol 2023-08-09 11:45:05
+++ utils/math/Math.sol 2023-08-11 12:22:17
--- utils/math/Math.sol 2023-08-11 20:33:54
+++ utils/math/Math.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

@ -1,5 +1,5 @@
--- utils/math/SafeCast.sol 2023-08-09 11:45:05
+++ utils/math/SafeCast.sol 2023-08-11 12:22:17
--- utils/math/SafeCast.sol 2023-08-11 20:33:54
+++ utils/math/SafeCast.sol 2023-08-13 09:56:16
@@ -2,7 +2,7 @@
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)
// This file was procedurally generated from scripts/generate/templates/SafeCast.js.

@ -1,5 +1,5 @@
--- utils/math/SignedMath.sol 2023-08-09 11:45:05
+++ utils/math/SignedMath.sol 2023-08-11 12:22:51
--- utils/math/SignedMath.sol 2023-08-11 20:33:54
+++ utils/math/SignedMath.sol 2023-08-13 09:56:16
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

@ -1,5 +1,5 @@
--- utils/structs/DoubleEndedQueue.sol 2023-08-09 11:45:05
+++ utils/structs/DoubleEndedQueue.sol 2023-08-11 12:22:17
--- utils/structs/DoubleEndedQueue.sol 2023-08-11 20:33:54
+++ utils/structs/DoubleEndedQueue.sol 2023-08-13 09:56:16
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/DoubleEndedQueue.sol)

@ -1,19 +1,19 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
pragma solidity ^0.8.19;
import "../patched/proxy/utils/Initializable.sol";
import {Initializable} from "../patched/proxy/utils/Initializable.sol";
contract InitializableHarness is Initializable {
function initialize() public initializer {}
function reinitialize(uint8 n) public reinitializer(n) {}
function reinitialize(uint64 n) public reinitializer(n) {}
function disable() public { _disableInitializers(); }
function nested_init_init() public initializer { initialize(); }
function nested_init_reinit(uint8 m) public initializer { reinitialize(m); }
function nested_reinit_init(uint8 n) public reinitializer(n) { initialize(); }
function nested_reinit_reinit(uint8 n, uint8 m) public reinitializer(n) { reinitialize(m); }
function nested_init_reinit(uint64 m) public initializer { reinitialize(m); }
function nested_reinit_init(uint64 n) public reinitializer(n) { initialize(); }
function nested_reinit_reinit(uint64 n, uint64 m) public reinitializer(n) { reinitialize(m); }
function version() public view returns (uint8) {
function version() public view returns (uint64) {
return _getInitializedVersion();
}

@ -1,19 +1,19 @@
import "helpers/helpers.spec"
import "helpers/helpers.spec";
methods {
// initialize, reinitialize, disable
initialize() envfree
reinitialize(uint8) envfree
disable() envfree
function initialize() external envfree;
function reinitialize(uint64) external envfree;
function disable() external envfree;
nested_init_init() envfree
nested_init_reinit(uint8) envfree
nested_reinit_init(uint8) envfree
nested_reinit_reinit(uint8,uint8) envfree
function nested_init_init() external envfree;
function nested_init_reinit(uint64) external envfree;
function nested_reinit_init(uint64) external envfree;
function nested_reinit_reinit(uint64,uint64) external envfree;
// view
version() returns uint8 envfree
initializing() returns bool envfree
function version() external returns uint64 envfree;
function initializing() external returns bool envfree;
}
/*
@ -23,7 +23,7 @@ methods {
*/
definition isUninitialized() returns bool = version() == 0;
definition isInitialized() returns bool = version() > 0;
definition isDisabled() returns bool = version() == 255;
definition isDisabled() returns bool = version() == max_uint64;
/*
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
@ -31,7 +31,7 @@ definition isDisabled() returns bool = version() == 255;
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
*/
invariant notInitializing()
!initializing()
!initializing();
/*
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
@ -39,7 +39,7 @@ invariant notInitializing()
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
*/
rule increasingVersion(env e) {
uint8 versionBefore = version();
uint64 versionBefore = version();
bool disabledBefore = isDisabled();
method f; calldataarg args;
@ -83,7 +83,7 @@ rule cannotInitializeOnceDisabled() {
rule cannotReinitializeOnceDisabled() {
require isDisabled();
uint8 n;
uint64 n;
reinitialize@withrevert(n);
assert lastReverted, "contract is disabled";
@ -99,17 +99,17 @@ rule cannotNestInitializers_init_init() {
assert lastReverted, "nested initializers";
}
rule cannotNestInitializers_init_reinit(uint8 m) {
rule cannotNestInitializers_init_reinit(uint64 m) {
nested_init_reinit@withrevert(m);
assert lastReverted, "nested initializers";
}
rule cannotNestInitializers_reinit_init(uint8 n) {
rule cannotNestInitializers_reinit_init(uint64 n) {
nested_reinit_init@withrevert(n);
assert lastReverted, "nested initializers";
}
rule cannotNestInitializers_reinit_reinit(uint8 n, uint8 m) {
rule cannotNestInitializers_reinit_reinit(uint64 n, uint64 m) {
nested_reinit_reinit@withrevert(n, m);
assert lastReverted, "nested initializers";
}
@ -139,9 +139,9 @@ rule initializeEffects() {
rule reinitializeEffects() {
requireInvariant notInitializing();
uint8 versionBefore = version();
uint64 versionBefore = version();
uint8 n;
uint64 n;
reinitialize@withrevert(n);
bool success = !lastReverted;

Loading…
Cancel
Save