Contract Address Details
contract
0x3E0eA49698C81E7ba52c8844731F6BA128F4e539
Sponsored:
- Contract name:
- BlockReward
- Optimization enabled
- true
- Compiler version
- v0.4.26+commit.4563c3fc
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2023-10-02T01:55:25.757799Z
Contract source code
// File: contracts/abstracts/BlockRewardBase.sol
pragma solidity ^0.4.24;
/**
* @title Interface to be implemented by block reward contract
* @author LiorRabin
* @dev abstract contract
*/
contract BlockRewardBase {
// Produce rewards for the given benefactors, with corresponding reward codes.
// Only valid when msg.sender == SYSTEM_ADDRESS (EIP96, 2**160 - 2)
function reward(address[] benefactors, uint16[] kind) external returns (address[], uint256[]);
}
// File: contracts/interfaces/IConsensus.sol
pragma solidity ^0.4.24;
interface IConsensus {
function currentValidatorsLength() external view returns(uint256);
function currentValidatorsAtPosition(uint256 _p) external view returns(address);
function getCycleDurationBlocks() external view returns(uint256);
function getCurrentCycleEndBlock() external view returns(uint256);
function cycle(address _validator) external;
function isValidator(address _address) external view returns(bool);
function getDelegatorsForRewardDistribution(address _validator, uint256 _rewardAmount) external view returns(address[], uint256[]);
function isFinalized() external view returns(bool);
function stakeAmount(address _address) external view returns(uint256);
function totalStakeAmount() external view returns(uint256);
}
// File: contracts/eternal-storage/EternalStorage.sol
pragma solidity ^0.4.24;
/**
* @title EternalStorage
* @author LiorRabin
* @dev This contract holds all the necessary state variables to carry out the storage of any contract and to support the upgrade functionality.
*/
contract EternalStorage {
// Version number of the current implementation
uint256 internal version;
// Address of the current implementation
address internal implementation;
// Storage mappings
mapping(bytes32 => uint256) internal uintStorage;
mapping(bytes32 => string) internal stringStorage;
mapping(bytes32 => address) internal addressStorage;
mapping(bytes32 => bytes) internal bytesStorage;
mapping(bytes32 => bool) internal boolStorage;
mapping(bytes32 => int256) internal intStorage;
mapping(bytes32 => uint256[]) internal uintArrayStorage;
mapping(bytes32 => string[]) internal stringArrayStorage;
mapping(bytes32 => address[]) internal addressArrayStorage;
mapping(bytes32 => bytes[]) internal bytesArrayStorage;
mapping(bytes32 => bool[]) internal boolArrayStorage;
mapping(bytes32 => int256[]) internal intArrayStorage;
mapping(bytes32 => bytes32[]) internal bytes32ArrayStorage;
function isInitialized() public view returns(bool) {
return boolStorage[keccak256(abi.encodePacked("isInitialized"))];
}
function setInitialized(bool _status) internal {
boolStorage[keccak256(abi.encodePacked("isInitialized"))] = _status;
}
}
// File: contracts/eternal-storage/EternalStorageProxy.sol
pragma solidity ^0.4.24;
/**
* @title EternalStorageProxy
* @author LiorRabin
* @dev This proxy holds the storage of the token contract and delegates every call to the current implementation set.
* Besides, it allows to upgrade the token's behaviour towards further implementations, and provides authorization control functionalities
*/
contract EternalStorageProxy is EternalStorage {
/**
* @dev This event will be emitted every time the implementation gets upgraded
* @param version representing the version number of the upgraded implementation
* @param implementation representing the address of the upgraded implementation
*/
event Upgraded(uint256 version, address indexed implementation);
/**
* @dev This event will be emitted when ownership is renounces
* @param previousOwner address which is renounced from ownership
*/
event OwnershipRenounced(address indexed previousOwner);
/**
* @dev This event will be emitted when ownership is transferred
* @param previousOwner address which represents the previous owner
* @param newOwner address which represents the new owner
*/
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev This modifier verifies that msg.sender is the ProxyStorage contract
*/
modifier onlyProxyStorage() {
require(msg.sender == getProxyStorage());
_;
}
/**
* @dev This modifier verifies that msg.sender is the owner of the contract
*/
modifier onlyOwner() {
require(msg.sender == getOwner());
_;
}
/**
* @dev Constructor
* @param _proxyStorage address representing the ProxyStorage contract
* @param _implementation address representing the implementation contract
*/
constructor(address _proxyStorage, address _implementation) public {
require(_implementation != address(0));
if (_proxyStorage != address(0)) {
_setProxyStorage(_proxyStorage);
} else {
_setProxyStorage(address(this));
}
_setImplementation(_implementation);
_setOwner(msg.sender);
}
/**
* @dev Fallback function allowing to perform a delegatecall to the given implementation.
* This function will return whatever the implementation call returns
*/
// solhint-disable no-complex-fallback, no-inline-assembly
function() payable public {
address _impl = getImplementation();
require(_impl != address(0));
assembly {
// Copy msg.data. We take full control of memory in this inline assembly
// block because it will not return to Solidity code. We overwrite the
// Solidity scratch pad at memory position 0
calldatacopy(0, 0, calldatasize)
// Call the implementation.
// out and outsize are 0 because we don't know the size yet
let result := delegatecall(gas, _impl, 0, calldatasize, 0, 0)
// Copy the returned data
returndatacopy(0, 0, returndatasize)
switch result
// delegatecall returns 0 on error
case 0 { revert(0, returndatasize) }
default { return(0, returndatasize) }
}
}
// solhint-enable no-complex-fallback, no-inline-assembly
/**
* @dev Allows ProxyStorage contract (only) to upgrade the current implementation.
* @param _newImplementation representing the address of the new implementation to be set.
*/
function upgradeTo(address _newImplementation) public onlyProxyStorage returns(bool) {
if (_newImplementation == address(0)) return false;
if (getImplementation() == _newImplementation) return false;
uint256 _newVersion = getVersion() + 1;
_setVersion(_newVersion);
_setImplementation(_newImplementation);
emit Upgraded(_newVersion, _newImplementation);
return true;
}
/**
* @dev Allows the current owner to relinquish ownership.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipRenounced(getOwner());
_setOwner(address(0));
}
/**
* @dev Allows the current owner to transfer control of the contract to a _newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function transferOwnership(address _newOwner) public onlyOwner {
require(_newOwner != address(0));
emit OwnershipTransferred(getOwner(), _newOwner);
_setOwner(_newOwner);
}
function getOwner() public view returns(address) {
return addressStorage[keccak256(abi.encodePacked("owner"))];
}
function _setOwner(address _owner) private {
addressStorage[keccak256(abi.encodePacked("owner"))] = _owner;
}
function getVersion() public view returns(uint256) {
return version;
}
function _setVersion(uint256 _newVersion) private {
version = _newVersion;
}
function getImplementation() public view returns(address) {
return implementation;
}
function _setImplementation(address _newImplementation) private {
implementation = _newImplementation;
}
function getProxyStorage() public view returns(address) {
return addressStorage[keccak256(abi.encodePacked("proxyStorage"))];
}
function _setProxyStorage(address _proxyStorage) private {
addressStorage[keccak256(abi.encodePacked("proxyStorage"))] = _proxyStorage;
}
}
// File: openzeppelin-solidity/contracts/math/SafeMath.sol
pragma solidity ^0.4.24;
/**
* @title SafeMath
* @dev Math operations with safety checks that revert on error
*/
library SafeMath {
int256 constant private INT256_MIN = -2**255;
/**
* @dev Multiplies two unsigned integers, reverts on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b);
return c;
}
/**
* @dev Multiplies two signed integers, reverts on overflow.
*/
function mul(int256 a, int256 b) internal pure returns (int256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (a == 0) {
return 0;
}
require(!(a == -1 && b == INT256_MIN)); // This is the only case of overflow not detected by the check below
int256 c = a * b;
require(c / a == b);
return c;
}
/**
* @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.
*/
function div(int256 a, int256 b) internal pure returns (int256) {
require(b != 0); // Solidity only automatically asserts when dividing by 0
require(!(b == -1 && a == INT256_MIN)); // This is the only case of overflow
int256 c = a / b;
return c;
}
/**
* @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
uint256 c = a - b;
return c;
}
/**
* @dev Subtracts two signed integers, reverts on overflow.
*/
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a));
return c;
}
/**
* @dev Adds two unsigned integers, reverts on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}
/**
* @dev Adds two signed integers, reverts on overflow.
*/
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a));
return c;
}
/**
* @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
* reverts when dividing by zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0);
return a % b;
}
}
// File: contracts/ProxyStorage.sol
pragma solidity ^0.4.24;
/**
* @title Contract used for access and upgradeability to all network contracts
* @author LiorRabin
*/
contract ProxyStorage is EternalStorage {
using SafeMath for uint256;
/**
* @dev Available contract types on the network
*/
enum ContractTypes {
Invalid,
Consensus,
BlockReward,
ProxyStorage,
Voting
}
/**
* @dev This event will be emitted when all contract addresses have been initialized by the contract owner
*/
event ProxyInitialized(
address consensus,
address blockReward,
address voting
);
/**
* @dev This event will be emitted each time a contract address is updated
* @param contractType contract type (See ContractTypes enum)
* @param contractAddress contract address set for the contract type
*/
event AddressSet(uint256 contractType, address contractAddress);
/**
* @dev This modifier verifies that msg.sender is the owner of the contract
*/
modifier onlyOwner() {
require(msg.sender == addressStorage[OWNER]);
_;
}
/**
* @dev This modifier verifies that msg.sender is the voting contract which implement proxy address change
*/
modifier onlyVoting() {
require(msg.sender == getVoting());
_;
}
/**
* @dev Function to be called on contract initialization
* @param _consensus address of the network consensus contract
*/
function initialize(address _consensus) external onlyOwner {
require(!isInitialized());
require(_consensus != address(0));
require(_consensus != address(this));
_setConsensus(_consensus);
setInitialized(true);
}
/**
* @dev Function to be called to initialize all available contract types addresses
*/
function initializeAddresses(address _blockReward, address _voting) external onlyOwner {
require(!boolStorage[PROXY_STORAGE_ADDRESSES_INITIALIZED]);
addressStorage[BLOCK_REWARD] = _blockReward;
addressStorage[VOTING] = _voting;
boolStorage[PROXY_STORAGE_ADDRESSES_INITIALIZED] = true;
emit ProxyInitialized(
getConsensus(),
_blockReward,
_voting
);
}
/**
* @dev Function to be called to set specific contract type address
* @param _contractType contract type (See ContractTypes enum)
* @param _contractAddress contract address set for the contract type
*/
function setContractAddress(uint256 _contractType, address _contractAddress) external onlyVoting returns(bool) {
if (!isInitialized()) return false;
if (_contractAddress == address(0)) return false;
bool success = false;
if (_contractType == uint256(ContractTypes.Consensus)) {
success = EternalStorageProxy(getConsensus()).upgradeTo(_contractAddress);
} else if (_contractType == uint256(ContractTypes.BlockReward)) {
success = EternalStorageProxy(getBlockReward()).upgradeTo(_contractAddress);
} else if (_contractType == uint256(ContractTypes.ProxyStorage)) {
success = EternalStorageProxy(this).upgradeTo(_contractAddress);
} else if (_contractType == uint256(ContractTypes.Voting)) {
success = EternalStorageProxy(getVoting()).upgradeTo(_contractAddress);
}
if (success) {
emit AddressSet(_contractType, _contractAddress);
}
return success;
}
/**
* @dev Function checking if a contract type is valid one for proxy usage
* @param _contractType contract type to check if valid
*/
function isValidContractType(uint256 _contractType) external pure returns(bool) {
return
_contractType == uint256(ContractTypes.Consensus) ||
_contractType == uint256(ContractTypes.BlockReward) ||
_contractType == uint256(ContractTypes.ProxyStorage) ||
_contractType == uint256(ContractTypes.Voting);
}
bytes32 internal constant OWNER = keccak256(abi.encodePacked("owner"));
bytes32 internal constant CONSENSUS = keccak256(abi.encodePacked("consensus"));
bytes32 internal constant BLOCK_REWARD = keccak256(abi.encodePacked("blockReward"));
bytes32 internal constant VOTING = keccak256(abi.encodePacked("voting"));
bytes32 internal constant PROXY_STORAGE_ADDRESSES_INITIALIZED = keccak256(abi.encodePacked("proxyStorageAddressesInitialized"));
function _setConsensus(address _consensus) private {
addressStorage[CONSENSUS] = _consensus;
}
function getConsensus() public view returns(address){
return addressStorage[CONSENSUS];
}
function getBlockReward() public view returns(address){
return addressStorage[BLOCK_REWARD];
}
function getVoting() public view returns(address){
return addressStorage[VOTING];
}
}
// File: contracts/BlockReward.sol
pragma solidity ^0.4.24;
/**
* @title Contract handling block reward logic
* @author LiorRabin
*/
contract BlockReward is EternalStorage, BlockRewardBase {
using SafeMath for uint256;
uint256 public constant DECIMALS = 10 ** 18;
uint256 public constant INFLATION = 2;
uint256 public constant BLOCKS_PER_YEAR = 2102400;
/**
* @dev This event will be emitted every block, describing the rewards given
* @param receivers array of addresses to reward
* @param rewards array of balance increases corresponding to the receivers array
*/
event Rewarded(address[] receivers, uint256[] rewards);
/**
* @dev This event will be emitted on cycle end, describing the amount of rewards distributed on the cycle
* @param amount total rewards distributed on this cycle
*/
event RewardedOnCycle(uint256 amount);
/**
* @dev This modifier verifies that msg.sender is the system address (EIP96)
*/
modifier onlySystem() {
require(msg.sender == addressStorage[SYSTEM_ADDRESS]);
_;
}
/**
* @dev This modifier verifies that msg.sender is the owner of the contract
*/
modifier onlyOwner() {
require(msg.sender == addressStorage[OWNER]);
_;
}
/**
* @dev This modifier verifies that msg.sender is the consensus contract
*/
modifier onlyConsensus() {
require(msg.sender == ProxyStorage(getProxyStorage()).getConsensus());
_;
}
/**
* @dev This modifier verifies that msg.sender is a validator
*/
modifier onlyValidator() {
require(IConsensus(ProxyStorage(getProxyStorage()).getConsensus()).isValidator(msg.sender));
_;
}
/**
* @dev Function to be called on contract initialization
*/
function initialize(uint256 _supply) external onlyOwner {
require(!isInitialized());
_setSystemAddress(0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE);
_setTotalSupply(_supply);
_initRewardedOnCycle();
_setBlockRewardAmount();
setInitialized(true);
}
/**
* @dev Function called to produce the reward on each block
* @param benefactors array of addresses representing benefectors to be considered for reward
* @param kind array of reward types. We support only arrays with one item and type = 0 (Author - Reward attributed to the block author)
* See https://wiki.parity.io/Block-Reward-Contract.html
*/
function reward(address[] benefactors, uint16[] kind) external onlySystem returns (address[], uint256[]) {
require(benefactors.length == kind.length);
require(benefactors.length == 1);
require(kind[0] == 0);
uint256 blockRewardAmount = getBlockRewardAmountPerValidator(benefactors[0]);
(address[] memory _delegators, uint256[] memory _rewards) = IConsensus(ProxyStorage(getProxyStorage()).getConsensus()).getDelegatorsForRewardDistribution(benefactors[0], blockRewardAmount);
address[] memory receivers = new address[](_delegators.length + 1);
uint256[] memory rewards = new uint256[](receivers.length);
receivers[0] = benefactors[0];
rewards[0] = blockRewardAmount;
for (uint256 i = 1; i <= _delegators.length; i++) {
receivers[i] = _delegators[i - 1];
rewards[i] = _rewards[i - 1];
rewards[0] = rewards[0].sub(rewards[i]);
}
_setRewardedOnCycle(getRewardedOnCycle().add(blockRewardAmount));
_setTotalSupply(getTotalSupply().add(blockRewardAmount));
if ((block.number).mod(getBlocksPerYear()) == 0) {
_setBlockRewardAmount();
}
IConsensus(ProxyStorage(getProxyStorage()).getConsensus()).cycle(benefactors[0]);
emit Rewarded(receivers, rewards);
return (receivers, rewards);
}
function onCycleEnd() external onlyConsensus {
_setShouldEmitRewardedOnCycle(true);
}
/**
* @dev Function to be called by validators only to emit RewardedOnCycle event (only if `shouldEmitRewardedOnCycle` returns true)
*/
function emitRewardedOnCycle() external onlyValidator {
require(shouldEmitRewardedOnCycle());
emit RewardedOnCycle(getRewardedOnCycle());
_setShouldEmitRewardedOnCycle(false);
_setRewardedOnCycle(0);
}
bytes32 internal constant OWNER = keccak256(abi.encodePacked("owner"));
bytes32 internal constant SYSTEM_ADDRESS = keccak256(abi.encodePacked("SYSTEM_ADDRESS"));
bytes32 internal constant PROXY_STORAGE = keccak256(abi.encodePacked("proxyStorage"));
bytes32 internal constant TOTAL_SUPPLY = keccak256(abi.encodePacked("totalSupply"));
bytes32 internal constant REWARDED_THIS_CYCLE = keccak256(abi.encodePacked("rewardedOnCycle"));
bytes32 internal constant BLOCK_REWARD_AMOUNT = keccak256(abi.encodePacked("blockRewardAmount"));
bytes32 internal constant SHOULD_EMIT_REWARDED_ON_CYCLE = keccak256(abi.encodePacked("shouldEmitRewardedOnCycle"));
function _setSystemAddress(address _newAddress) private {
addressStorage[SYSTEM_ADDRESS] = _newAddress;
}
function _setTotalSupply(uint256 _supply) private {
require(_supply >= 0);
uintStorage[TOTAL_SUPPLY] = _supply;
}
function getTotalSupply() public view returns(uint256) {
return uintStorage[TOTAL_SUPPLY];
}
function _initRewardedOnCycle() private {
_setRewardedOnCycle(0);
}
function _setRewardedOnCycle(uint256 _amount) private {
require(_amount >= 0);
uintStorage[REWARDED_THIS_CYCLE] = _amount;
}
function getRewardedOnCycle() public view returns(uint256) {
return uintStorage[REWARDED_THIS_CYCLE];
}
/**
* returns yearly inflation rate (percentage)
*/
function getInflation() public pure returns(uint256) {
return INFLATION;
}
/**
* returns blocks per year (block time is 5 seconds)
*/
function getBlocksPerYear() public pure returns(uint256) {
return BLOCKS_PER_YEAR;
}
function _setBlockRewardAmount() private {
uintStorage[BLOCK_REWARD_AMOUNT] = (getTotalSupply().mul(getInflation().mul(DECIMALS).div(100))).div(getBlocksPerYear()).div(DECIMALS);
}
function getBlockRewardAmount() public view returns(uint256) {
return uintStorage[BLOCK_REWARD_AMOUNT];
}
function getBlockRewardAmountPerValidator(address _validator) public view returns(uint256) {
IConsensus consensus = IConsensus(ProxyStorage(getProxyStorage()).getConsensus());
uint256 stakeAmount = consensus.stakeAmount(_validator);
uint256 totalStakeAmount = consensus.totalStakeAmount();
uint256 currentValidatorsLength = consensus.currentValidatorsLength();
// this may arise in peculiar cases when the consensus totalStakeAmount wasn't calculated yet
// for example at the first blocks after the contract was deployed
if (totalStakeAmount == 0) {
return getBlockRewardAmount();
}
return getBlockRewardAmount().mul(stakeAmount).mul(currentValidatorsLength).div(totalStakeAmount);
}
function getProxyStorage() public view returns(address) {
return addressStorage[PROXY_STORAGE];
}
function shouldEmitRewardedOnCycle() public view returns(bool) {
return IConsensus(ProxyStorage(getProxyStorage()).getConsensus()).isFinalized() && boolStorage[SHOULD_EMIT_REWARDED_ON_CYCLE];
}
function _setShouldEmitRewardedOnCycle(bool _status) internal {
boolStorage[SHOULD_EMIT_REWARDED_ON_CYCLE] = _status;
}
}
Contract ABI
[{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"BLOCKS_PER_YEAR","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"DECIMALS","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"INFLATION","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emitRewardedOnCycle","inputs":[],"constant":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"getBlockRewardAmount","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"getBlockRewardAmountPerValidator","inputs":[{"type":"address","name":"_validator"}],"constant":true},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":""}],"name":"getBlocksPerYear","inputs":[],"constant":true},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":""}],"name":"getInflation","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":""}],"name":"getProxyStorage","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"getRewardedOnCycle","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"getTotalSupply","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"uint256","name":"_supply"}],"constant":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":""}],"name":"isInitialized","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"onCycleEnd","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address[]","name":""},{"type":"uint256[]","name":""}],"name":"reward","inputs":[{"type":"address[]","name":"benefactors"},{"type":"uint16[]","name":"kind"}],"constant":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":""}],"name":"shouldEmitRewardedOnCycle","inputs":[],"constant":true},{"type":"event","name":"Rewarded","inputs":[{"type":"address[]","name":"receivers","indexed":false},{"type":"uint256[]","name":"rewards","indexed":false}],"anonymous":false},{"type":"event","name":"RewardedOnCycle","inputs":[{"type":"uint256","name":"amount","indexed":false}],"anonymous":false}]
Contract Creation Code
0x608060405234801561001057600080fd5b5061193e806100206000396000f3006080604052600436106100cc5763ffffffff60e060020a6000350416632e0f262581146100d1578063392e53cd146100f8578063537cc17c146101215780635c3be315146101365780635dba8c4a1461014b57806363037afc146101605780636d20d6ae14610181578063741de14814610196578063b1f0c8e1146101ab578063c4e41b22146101c2578063d37db1d2146101d7578063d56f4f28146101ec578063d5a9577114610201578063ec15a5e614610216578063f91c289814610247578063fe4b84df1461030c575b600080fd5b3480156100dd57600080fd5b506100e6610324565b60408051918252519081900360200190f35b34801561010457600080fd5b5061010d610330565b604080519115158252519081900360200190f35b34801561012d57600080fd5b506100e66103e8565b34801561014257600080fd5b5061010d61049d565b34801561015757600080fd5b506100e6610617565b34801561016c57600080fd5b506100e6600160a060020a036004351661068b565b34801561018d57600080fd5b506100e66108fe565b3480156101a257600080fd5b506100e6610903565b3480156101b757600080fd5b506101c061090a565b005b3480156101ce57600080fd5b506100e661099b565b3480156101e357600080fd5b506100e6610a0f565b3480156101f857600080fd5b506101c0610a16565b34801561020d57600080fd5b506100e6610b82565b34801561022257600080fd5b5061022b610b87565b60408051600160a060020a039092168252519081900360200190f35b34801561025357600080fd5b506102736024600480358281019290820135918135918201910135610c45565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156102b757818101518382015260200161029f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156102f65781810151838201526020016102de565b5050505090500194505050505060405180910390f35b34801561031857600080fd5b506101c0600435611310565b670de0b6b3a764000081565b60006006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b602083106103a55780518252601f199092019160209182019101610386565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff16949350505050565b60006002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b6020831061045d5780518252601f19909201916020918201910161043e565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054949350505050565b60006104a7610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156104e457600080fd5b505af11580156104f8573d6000803e3d6000fd5b505050506040513d602081101561050e57600080fd5b5051604080517f8d4e40830000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921691638d4e4083916004808201926020929091908290030181600087803b15801561056d57600080fd5b505af1158015610581573d6000803e3d6000fd5b505050506040513d602081101561059757600080fd5b5051801561061257506006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c65000000000000008152506019019050604051602081830303815290604052604051808280519060200190808383602083106103a55780518252601f199092019160209182019101610386565b905090565b60006002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b600080600080600061069b610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b505050506040513d602081101561070257600080fd5b5051604080517fbf135267000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519296509086169163bf135267916024808201926020929091908290030181600087803b15801561076c57600080fd5b505af1158015610780573d6000803e3d6000fd5b505050506040513d602081101561079657600080fd5b5051604080517f94409a560000000000000000000000000000000000000000000000000000000081529051919450600160a060020a038616916394409a56916004808201926020929091908290030181600087803b1580156107f757600080fd5b505af115801561080b573d6000803e3d6000fd5b505050506040513d602081101561082157600080fd5b5051604080517f40c9cdeb0000000000000000000000000000000000000000000000000000000081529051919350600160a060020a038616916340c9cdeb916004808201926020929091908290030181600087803b15801561088257600080fd5b505af1158015610896573d6000803e3d6000fd5b505050506040513d60208110156108ac57600080fd5b505190508115156108c6576108bf610617565b94506108f5565b6108f2826108e6836108da876108da610617565b9063ffffffff61142916565b9063ffffffff61146216565b94505b50505050919050565b600281565b6220148090565b610912610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d602081101561097957600080fd5b5051600160a060020a0316331461098f57600080fd5b6109996001611485565b565b60006002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b0190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b6220148081565b610a1e610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a5b57600080fd5b505af1158015610a6f573d6000803e3d6000fd5b505050506040513d6020811015610a8557600080fd5b5051604080517ffacd743b0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a039092169163facd743b916024808201926020929091908290030181600087803b158015610aea57600080fd5b505af1158015610afe573d6000803e3d6000fd5b505050506040513d6020811015610b1457600080fd5b50511515610b2157600080fd5b610b2961049d565b1515610b3457600080fd5b7f5c0daed232a37723b040b8aa1c0b060b1d5fb3dea06a55fd30c35cab3e8fc3d7610b5d6103e8565b60408051918252519081900360200190a1610b786000611485565b6109996000611546565b600290565b60006004600060405160200180807f70726f787953746f726167650000000000000000000000000000000000000000815250600c0190506040516020818303038152906040526040518082805190602001908083835b60208310610bfc5780518252601f199092019160209182019101610bdd565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316949350505050565b606080600060608060608060006004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b60208310610cc55780518252601f199092019160209182019101610ca6565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a031633149250610d1691505057600080fd5b8a8914610d2257600080fd5b60018b14610d2f57600080fd5b89896000818110610d3c57fe5b9050602002013561ffff1661ffff166000141515610d5957600080fd5b610d7e8c8c6000818110610d6957fe5b90506020020135600160a060020a031661068b565b9550610d88610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610dc557600080fd5b505af1158015610dd9573d6000803e3d6000fd5b505050506040513d6020811015610def57600080fd5b5051600160a060020a0316636a28f12f8d8d6000818110610e0c57fe5b90506020020135600160a060020a0316886040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015610e6f57600080fd5b505af1158015610e83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015610eac57600080fd5b810190808051640100000000811115610ec457600080fd5b82016020810184811115610ed757600080fd5b8151856020820283011164010000000082111715610ef457600080fd5b50509291906020018051640100000000811115610f1057600080fd5b82016020810184811115610f2357600080fd5b8151856020820283011164010000000082111715610f4057600080fd5b5050929190505050945094508451600101604051908082528060200260200182016040528015610f7a578160200160208202803883390190505b5092508251604051908082528060200260200182016040528015610fa8578160200160208202803883390190505b5091508b8b6000818110610fb857fe5b90506020020135600160a060020a0316836000815181101515610fd757fe5b600160a060020a039092166020928302909101909101528151869083906000908110610fff57fe5b602090810290910101525060015b845181116110eb57846001820381518110151561102657fe5b90602001906020020151838281518110151561103e57fe5b600160a060020a0390921660209283029091019091015283518490600019830190811061106757fe5b90602001906020020151828281518110151561107f57fe5b6020908102909101015281516110ca9083908390811061109b57fe5b906020019060200201518360008151811015156110b457fe5b602090810290910101519063ffffffff61160916565b8260008151811015156110d957fe5b6020908102909101015260010161100d565b61110b611106876110fa6103e8565b9063ffffffff61162016565b611546565b61111f61111a876110fa61099b565b611632565b61113761112a610903565b439063ffffffff6116b316565b1515611145576111456116d4565b61114d610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561118a57600080fd5b505af115801561119e573d6000803e3d6000fd5b505050506040513d60208110156111b457600080fd5b5051600160a060020a03166385cd84648d8d60008181106111d157fe5b90506020020135600160a060020a03166040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b15801561122c57600080fd5b505af1158015611240573d6000803e3d6000fd5b505050507fb747d4e9a0b39cc47496d84b42e4066ba8b8a0b89776528bcec4ac2997e224538383604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156112ab578181015183820152602001611293565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156112ea5781810151838201526020016112d2565b5050505090500194505050505060405180910390a150909a909950975050505050505050565b6004600060405160200180807f6f776e657200000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040526040518082805190602001908083835b602083106113835780518252601f199092019160209182019101611364565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316331492506113d491505057600080fd5b6113dc610330565b156113e657600080fd5b61140373fffffffffffffffffffffffffffffffffffffffe6117c2565b61140c81611632565b611414610b78565b61141c6116d4565b611426600161189f565b50565b60008083151561143c576000915061145b565b5082820282848281151561144c57fe5b041461145757600080fd5b8091505b5092915050565b60008080831161147157600080fd5b828481151561147c57fe5b04949350505050565b806006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c650000000000000081525060190190506040516020818303038152906040526040518082805190602001908083835b602083106114f95780518252601f1990920191602091820191016114da565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff19169415159490941790935550505050565b600081101561155457600080fd5b806002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b602083106115c85780518252601f1990920191602091820191016115a9565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550505050565b6000808383111561161957600080fd5b5050900390565b60008282018381101561145757600080fd5b600081101561164057600080fd5b806002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052604051808280519060200190808383602083106115c85780518252601f1990920191602091820191016115a9565b60008115156116c157600080fd5b81838115156116cc57fe5b069392505050565b61170f670de0b6b3a76400006108e66116eb610903565b6108e661170760646108e6670de0b6b3a76400006108da610b82565b6108da61099b565b6002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083835b602083106117825780518252601f199092019160209182019101611763565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002093909355505050565b806004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b602083106118365780518252601f199092019160209182019101611817565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03959095169490941790935550505050565b806006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d019050604051602081830303815290604052604051808280519060200190808383602083106114f95780518252601f1990920191602091820191016114da5600a165627a7a72305820f42af149f1f2399ef8c0b2dff2f03206614d03f430c27888862756f336634b880029
Deployed ByteCode
0x6080604052600436106100cc5763ffffffff60e060020a6000350416632e0f262581146100d1578063392e53cd146100f8578063537cc17c146101215780635c3be315146101365780635dba8c4a1461014b57806363037afc146101605780636d20d6ae14610181578063741de14814610196578063b1f0c8e1146101ab578063c4e41b22146101c2578063d37db1d2146101d7578063d56f4f28146101ec578063d5a9577114610201578063ec15a5e614610216578063f91c289814610247578063fe4b84df1461030c575b600080fd5b3480156100dd57600080fd5b506100e6610324565b60408051918252519081900360200190f35b34801561010457600080fd5b5061010d610330565b604080519115158252519081900360200190f35b34801561012d57600080fd5b506100e66103e8565b34801561014257600080fd5b5061010d61049d565b34801561015757600080fd5b506100e6610617565b34801561016c57600080fd5b506100e6600160a060020a036004351661068b565b34801561018d57600080fd5b506100e66108fe565b3480156101a257600080fd5b506100e6610903565b3480156101b757600080fd5b506101c061090a565b005b3480156101ce57600080fd5b506100e661099b565b3480156101e357600080fd5b506100e6610a0f565b3480156101f857600080fd5b506101c0610a16565b34801561020d57600080fd5b506100e6610b82565b34801561022257600080fd5b5061022b610b87565b60408051600160a060020a039092168252519081900360200190f35b34801561025357600080fd5b506102736024600480358281019290820135918135918201910135610c45565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156102b757818101518382015260200161029f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156102f65781810151838201526020016102de565b5050505090500194505050505060405180910390f35b34801561031857600080fd5b506101c0600435611310565b670de0b6b3a764000081565b60006006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b602083106103a55780518252601f199092019160209182019101610386565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff16949350505050565b60006002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b6020831061045d5780518252601f19909201916020918201910161043e565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054949350505050565b60006104a7610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156104e457600080fd5b505af11580156104f8573d6000803e3d6000fd5b505050506040513d602081101561050e57600080fd5b5051604080517f8d4e40830000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921691638d4e4083916004808201926020929091908290030181600087803b15801561056d57600080fd5b505af1158015610581573d6000803e3d6000fd5b505050506040513d602081101561059757600080fd5b5051801561061257506006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c65000000000000008152506019019050604051602081830303815290604052604051808280519060200190808383602083106103a55780518252601f199092019160209182019101610386565b905090565b60006002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b600080600080600061069b610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b505050506040513d602081101561070257600080fd5b5051604080517fbf135267000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519296509086169163bf135267916024808201926020929091908290030181600087803b15801561076c57600080fd5b505af1158015610780573d6000803e3d6000fd5b505050506040513d602081101561079657600080fd5b5051604080517f94409a560000000000000000000000000000000000000000000000000000000081529051919450600160a060020a038616916394409a56916004808201926020929091908290030181600087803b1580156107f757600080fd5b505af115801561080b573d6000803e3d6000fd5b505050506040513d602081101561082157600080fd5b5051604080517f40c9cdeb0000000000000000000000000000000000000000000000000000000081529051919350600160a060020a038616916340c9cdeb916004808201926020929091908290030181600087803b15801561088257600080fd5b505af1158015610896573d6000803e3d6000fd5b505050506040513d60208110156108ac57600080fd5b505190508115156108c6576108bf610617565b94506108f5565b6108f2826108e6836108da876108da610617565b9063ffffffff61142916565b9063ffffffff61146216565b94505b50505050919050565b600281565b6220148090565b610912610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d602081101561097957600080fd5b5051600160a060020a0316331461098f57600080fd5b6109996001611485565b565b60006002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b0190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b6220148081565b610a1e610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a5b57600080fd5b505af1158015610a6f573d6000803e3d6000fd5b505050506040513d6020811015610a8557600080fd5b5051604080517ffacd743b0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a039092169163facd743b916024808201926020929091908290030181600087803b158015610aea57600080fd5b505af1158015610afe573d6000803e3d6000fd5b505050506040513d6020811015610b1457600080fd5b50511515610b2157600080fd5b610b2961049d565b1515610b3457600080fd5b7f5c0daed232a37723b040b8aa1c0b060b1d5fb3dea06a55fd30c35cab3e8fc3d7610b5d6103e8565b60408051918252519081900360200190a1610b786000611485565b6109996000611546565b600290565b60006004600060405160200180807f70726f787953746f726167650000000000000000000000000000000000000000815250600c0190506040516020818303038152906040526040518082805190602001908083835b60208310610bfc5780518252601f199092019160209182019101610bdd565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316949350505050565b606080600060608060608060006004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b60208310610cc55780518252601f199092019160209182019101610ca6565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a031633149250610d1691505057600080fd5b8a8914610d2257600080fd5b60018b14610d2f57600080fd5b89896000818110610d3c57fe5b9050602002013561ffff1661ffff166000141515610d5957600080fd5b610d7e8c8c6000818110610d6957fe5b90506020020135600160a060020a031661068b565b9550610d88610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610dc557600080fd5b505af1158015610dd9573d6000803e3d6000fd5b505050506040513d6020811015610def57600080fd5b5051600160a060020a0316636a28f12f8d8d6000818110610e0c57fe5b90506020020135600160a060020a0316886040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015610e6f57600080fd5b505af1158015610e83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015610eac57600080fd5b810190808051640100000000811115610ec457600080fd5b82016020810184811115610ed757600080fd5b8151856020820283011164010000000082111715610ef457600080fd5b50509291906020018051640100000000811115610f1057600080fd5b82016020810184811115610f2357600080fd5b8151856020820283011164010000000082111715610f4057600080fd5b5050929190505050945094508451600101604051908082528060200260200182016040528015610f7a578160200160208202803883390190505b5092508251604051908082528060200260200182016040528015610fa8578160200160208202803883390190505b5091508b8b6000818110610fb857fe5b90506020020135600160a060020a0316836000815181101515610fd757fe5b600160a060020a039092166020928302909101909101528151869083906000908110610fff57fe5b602090810290910101525060015b845181116110eb57846001820381518110151561102657fe5b90602001906020020151838281518110151561103e57fe5b600160a060020a0390921660209283029091019091015283518490600019830190811061106757fe5b90602001906020020151828281518110151561107f57fe5b6020908102909101015281516110ca9083908390811061109b57fe5b906020019060200201518360008151811015156110b457fe5b602090810290910101519063ffffffff61160916565b8260008151811015156110d957fe5b6020908102909101015260010161100d565b61110b611106876110fa6103e8565b9063ffffffff61162016565b611546565b61111f61111a876110fa61099b565b611632565b61113761112a610903565b439063ffffffff6116b316565b1515611145576111456116d4565b61114d610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561118a57600080fd5b505af115801561119e573d6000803e3d6000fd5b505050506040513d60208110156111b457600080fd5b5051600160a060020a03166385cd84648d8d60008181106111d157fe5b90506020020135600160a060020a03166040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b15801561122c57600080fd5b505af1158015611240573d6000803e3d6000fd5b505050507fb747d4e9a0b39cc47496d84b42e4066ba8b8a0b89776528bcec4ac2997e224538383604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156112ab578181015183820152602001611293565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156112ea5781810151838201526020016112d2565b5050505090500194505050505060405180910390a150909a909950975050505050505050565b6004600060405160200180807f6f776e657200000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040526040518082805190602001908083835b602083106113835780518252601f199092019160209182019101611364565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316331492506113d491505057600080fd5b6113dc610330565b156113e657600080fd5b61140373fffffffffffffffffffffffffffffffffffffffe6117c2565b61140c81611632565b611414610b78565b61141c6116d4565b611426600161189f565b50565b60008083151561143c576000915061145b565b5082820282848281151561144c57fe5b041461145757600080fd5b8091505b5092915050565b60008080831161147157600080fd5b828481151561147c57fe5b04949350505050565b806006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c650000000000000081525060190190506040516020818303038152906040526040518082805190602001908083835b602083106114f95780518252601f1990920191602091820191016114da565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff19169415159490941790935550505050565b600081101561155457600080fd5b806002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b602083106115c85780518252601f1990920191602091820191016115a9565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550505050565b6000808383111561161957600080fd5b5050900390565b60008282018381101561145757600080fd5b600081101561164057600080fd5b806002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052604051808280519060200190808383602083106115c85780518252601f1990920191602091820191016115a9565b60008115156116c157600080fd5b81838115156116cc57fe5b069392505050565b61170f670de0b6b3a76400006108e66116eb610903565b6108e661170760646108e6670de0b6b3a76400006108da610b82565b6108da61099b565b6002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083835b602083106117825780518252601f199092019160209182019101611763565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002093909355505050565b806004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b602083106118365780518252601f199092019160209182019101611817565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03959095169490941790935550505050565b806006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d019050604051602081830303815290604052604051808280519060200190808383602083106114f95780518252601f1990920191602091820191016114da5600a165627a7a72305820f42af149f1f2399ef8c0b2dff2f03206614d03f430c27888862756f336634b880029