96cad7de9c
* tests: reorganize testing packages * gitignore and minor changes
60 lines
1.8 KiB
Solidity
60 lines
1.8 KiB
Solidity
/*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
pragma solidity ^0.4.24;
|
|
|
|
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);
|
|
}
|
|
}
|