Contract Address Details
contract

0x3E0eA49698C81E7ba52c8844731F6BA128F4e539

Sponsored: 

Overview

GOLDX Balance

0 GOLDX

GOLDX Value

$0.00

Token Holdings

Fetching tokens...

More Info

Private Name Tags

Last Balance Update

Blocks Validated

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