c9639c3860
* tests: add solidity test suite * tests: remove require strings * Update tests-solidity/init-test-node.sh * Update tests-solidity/init-test-node.sh Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com>
59 lines
2.0 KiB
Solidity
59 lines
2.0 KiB
Solidity
// Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/common/Initializable.sol
|
|
// Adapted to use pragma ^0.5.17 and satisfy our linter rules
|
|
|
|
pragma solidity ^0.5.17;
|
|
|
|
import "./TimeHelpers.sol";
|
|
import "./UnstructuredStorage.sol";
|
|
|
|
|
|
contract Initializable is TimeHelpers {
|
|
using UnstructuredStorage for bytes32;
|
|
|
|
// keccak256("aragonOS.initializable.initializationBlock")
|
|
bytes32 internal constant INITIALIZATION_BLOCK_POSITION = 0xebb05b386a8d34882b8711d156f463690983dc47815980fb82aeeff1aa43579e;
|
|
|
|
string private constant ERROR_ALREADY_INITIALIZED = "INIT_ALREADY_INITIALIZED";
|
|
string private constant ERROR_NOT_INITIALIZED = "INIT_NOT_INITIALIZED";
|
|
|
|
modifier onlyInit {
|
|
require(getInitializationBlock() == 0, ERROR_ALREADY_INITIALIZED);
|
|
_;
|
|
}
|
|
|
|
modifier isInitialized {
|
|
require(hasInitialized(), ERROR_NOT_INITIALIZED);
|
|
_;
|
|
}
|
|
|
|
/**
|
|
* @return Block number in which the contract was initialized
|
|
*/
|
|
function getInitializationBlock() public view returns (uint256) {
|
|
return INITIALIZATION_BLOCK_POSITION.getStorageUint256();
|
|
}
|
|
|
|
/**
|
|
* @return Whether the contract has been initialized by the time of the current block
|
|
*/
|
|
function hasInitialized() public view returns (bool) {
|
|
uint256 initializationBlock = getInitializationBlock();
|
|
return initializationBlock != 0 && getBlockNumber() >= initializationBlock;
|
|
}
|
|
|
|
/**
|
|
* @dev Function to be called by top level contract after initialization has finished.
|
|
*/
|
|
function initialized() internal onlyInit {
|
|
INITIALIZATION_BLOCK_POSITION.setStorageUint256(getBlockNumber());
|
|
}
|
|
|
|
/**
|
|
* @dev Function to be called by top level contract after initialization to enable the contract
|
|
* at a future block number rather than immediately.
|
|
*/
|
|
function initializedAt(uint256 _blockNumber) internal onlyInit {
|
|
INITIALIZATION_BLOCK_POSITION.setStorageUint256(_blockNumber);
|
|
}
|
|
}
|