false
false
0

Contract Address Details

0x88BAbA2Dba9753Dbd2FC8e7AADB688A7cc399446

Contract Name
BlockReward
Creator
0x489dbd–f9a864 at 0x001202–bc1a73
Balance
0 AI
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
2005322
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
BlockReward




Optimization enabled
true
Compiler version
v0.4.26+commit.4563c3fc




Optimization runs
200
EVM Version
default




Verified at
2025-04-01T07:12:29.610430Z

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 = 5;
  uint256 public constant BLOCKS_PER_YEAR = 10512000;

  /**
  * @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(1000))).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","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"DECIMALS","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"isInitialized","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getRewardedOnCycle","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"shouldEmitRewardedOnCycle","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getBlockRewardAmount","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getBlockRewardAmountPerValidator","inputs":[{"type":"address","name":"_validator"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"INFLATION","inputs":[],"constant":true},{"type":"function","stateMutability":"pure","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getBlocksPerYear","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"onCycleEnd","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getTotalSupply","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"BLOCKS_PER_YEAR","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"emitRewardedOnCycle","inputs":[],"constant":false},{"type":"function","stateMutability":"pure","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getInflation","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getProxyStorage","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"address[]","name":""},{"type":"uint256[]","name":""}],"name":"reward","inputs":[{"type":"address[]","name":"benefactors"},{"type":"uint16[]","name":"kind"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"initialize","inputs":[{"type":"uint256","name":"_supply"}],"constant":false},{"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

Verify & Publish
0x608060405234801561001057600080fd5b5061193f806100206000396000f3006080604052600436106100cc5763ffffffff60e060020a6000350416632e0f262581146100d1578063392e53cd146100f8578063537cc17c146101215780635c3be315146101365780635dba8c4a1461014b57806363037afc146101605780636d20d6ae14610181578063741de14814610196578063b1f0c8e1146101ab578063c4e41b22146101c2578063d37db1d2146101d7578063d56f4f28146101ec578063d5a9577114610201578063ec15a5e614610216578063f91c289814610247578063fe4b84df1461030c575b600080fd5b3480156100dd57600080fd5b506100e6610324565b60408051918252519081900360200190f35b34801561010457600080fd5b5061010d610330565b604080519115158252519081900360200190f35b34801561012d57600080fd5b506100e66103e8565b34801561014257600080fd5b5061010d61049d565b34801561015757600080fd5b506100e6610617565b34801561016c57600080fd5b506100e6600160a060020a036004351661068b565b34801561018d57600080fd5b506100e66108fe565b3480156101a257600080fd5b506100e6610903565b3480156101b757600080fd5b506101c061090a565b005b3480156101ce57600080fd5b506100e661099b565b3480156101e357600080fd5b506100e6610a0f565b3480156101f857600080fd5b506101c0610a16565b34801561020d57600080fd5b506100e6610b82565b34801561022257600080fd5b5061022b610b87565b60408051600160a060020a039092168252519081900360200190f35b34801561025357600080fd5b506102736024600480358281019290820135918135918201910135610c45565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156102b757818101518382015260200161029f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156102f65781810151838201526020016102de565b5050505090500194505050505060405180910390f35b34801561031857600080fd5b506101c0600435611310565b670de0b6b3a764000081565b60006006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b602083106103a55780518252601f199092019160209182019101610386565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff16949350505050565b60006002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b6020831061045d5780518252601f19909201916020918201910161043e565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054949350505050565b60006104a7610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156104e457600080fd5b505af11580156104f8573d6000803e3d6000fd5b505050506040513d602081101561050e57600080fd5b5051604080517f8d4e40830000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921691638d4e4083916004808201926020929091908290030181600087803b15801561056d57600080fd5b505af1158015610581573d6000803e3d6000fd5b505050506040513d602081101561059757600080fd5b5051801561061257506006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c65000000000000008152506019019050604051602081830303815290604052604051808280519060200190808383602083106103a55780518252601f199092019160209182019101610386565b905090565b60006002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b600080600080600061069b610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b505050506040513d602081101561070257600080fd5b5051604080517fbf135267000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519296509086169163bf135267916024808201926020929091908290030181600087803b15801561076c57600080fd5b505af1158015610780573d6000803e3d6000fd5b505050506040513d602081101561079657600080fd5b5051604080517f94409a560000000000000000000000000000000000000000000000000000000081529051919450600160a060020a038616916394409a56916004808201926020929091908290030181600087803b1580156107f757600080fd5b505af115801561080b573d6000803e3d6000fd5b505050506040513d602081101561082157600080fd5b5051604080517f40c9cdeb0000000000000000000000000000000000000000000000000000000081529051919350600160a060020a038616916340c9cdeb916004808201926020929091908290030181600087803b15801561088257600080fd5b505af1158015610896573d6000803e3d6000fd5b505050506040513d60208110156108ac57600080fd5b505190508115156108c6576108bf610617565b94506108f5565b6108f2826108e6836108da876108da610617565b9063ffffffff61142916565b9063ffffffff61146216565b94505b50505050919050565b600581565b62a0668090565b610912610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d602081101561097957600080fd5b5051600160a060020a0316331461098f57600080fd5b6109996001611485565b565b60006002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b0190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b62a0668081565b610a1e610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a5b57600080fd5b505af1158015610a6f573d6000803e3d6000fd5b505050506040513d6020811015610a8557600080fd5b5051604080517ffacd743b0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a039092169163facd743b916024808201926020929091908290030181600087803b158015610aea57600080fd5b505af1158015610afe573d6000803e3d6000fd5b505050506040513d6020811015610b1457600080fd5b50511515610b2157600080fd5b610b2961049d565b1515610b3457600080fd5b7f5c0daed232a37723b040b8aa1c0b060b1d5fb3dea06a55fd30c35cab3e8fc3d7610b5d6103e8565b60408051918252519081900360200190a1610b786000611485565b6109996000611546565b600590565b60006004600060405160200180807f70726f787953746f726167650000000000000000000000000000000000000000815250600c0190506040516020818303038152906040526040518082805190602001908083835b60208310610bfc5780518252601f199092019160209182019101610bdd565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316949350505050565b606080600060608060608060006004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b60208310610cc55780518252601f199092019160209182019101610ca6565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a031633149250610d1691505057600080fd5b8a8914610d2257600080fd5b60018b14610d2f57600080fd5b89896000818110610d3c57fe5b9050602002013561ffff1661ffff166000141515610d5957600080fd5b610d7e8c8c6000818110610d6957fe5b90506020020135600160a060020a031661068b565b9550610d88610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610dc557600080fd5b505af1158015610dd9573d6000803e3d6000fd5b505050506040513d6020811015610def57600080fd5b5051600160a060020a0316636a28f12f8d8d6000818110610e0c57fe5b90506020020135600160a060020a0316886040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015610e6f57600080fd5b505af1158015610e83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015610eac57600080fd5b810190808051640100000000811115610ec457600080fd5b82016020810184811115610ed757600080fd5b8151856020820283011164010000000082111715610ef457600080fd5b50509291906020018051640100000000811115610f1057600080fd5b82016020810184811115610f2357600080fd5b8151856020820283011164010000000082111715610f4057600080fd5b5050929190505050945094508451600101604051908082528060200260200182016040528015610f7a578160200160208202803883390190505b5092508251604051908082528060200260200182016040528015610fa8578160200160208202803883390190505b5091508b8b6000818110610fb857fe5b90506020020135600160a060020a0316836000815181101515610fd757fe5b600160a060020a039092166020928302909101909101528151869083906000908110610fff57fe5b602090810290910101525060015b845181116110eb57846001820381518110151561102657fe5b90602001906020020151838281518110151561103e57fe5b600160a060020a0390921660209283029091019091015283518490600019830190811061106757fe5b90602001906020020151828281518110151561107f57fe5b6020908102909101015281516110ca9083908390811061109b57fe5b906020019060200201518360008151811015156110b457fe5b602090810290910101519063ffffffff61160916565b8260008151811015156110d957fe5b6020908102909101015260010161100d565b61110b611106876110fa6103e8565b9063ffffffff61162016565b611546565b61111f61111a876110fa61099b565b611632565b61113761112a610903565b439063ffffffff6116b316565b1515611145576111456116d4565b61114d610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561118a57600080fd5b505af115801561119e573d6000803e3d6000fd5b505050506040513d60208110156111b457600080fd5b5051600160a060020a03166385cd84648d8d60008181106111d157fe5b90506020020135600160a060020a03166040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b15801561122c57600080fd5b505af1158015611240573d6000803e3d6000fd5b505050507fb747d4e9a0b39cc47496d84b42e4066ba8b8a0b89776528bcec4ac2997e224538383604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156112ab578181015183820152602001611293565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156112ea5781810151838201526020016112d2565b5050505090500194505050505060405180910390a150909a909950975050505050505050565b6004600060405160200180807f6f776e657200000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040526040518082805190602001908083835b602083106113835780518252601f199092019160209182019101611364565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316331492506113d491505057600080fd5b6113dc610330565b156113e657600080fd5b61140373fffffffffffffffffffffffffffffffffffffffe6117c3565b61140c81611632565b611414610b78565b61141c6116d4565b61142660016118a0565b50565b60008083151561143c576000915061145b565b5082820282848281151561144c57fe5b041461145757600080fd5b8091505b5092915050565b60008080831161147157600080fd5b828481151561147c57fe5b04949350505050565b806006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c650000000000000081525060190190506040516020818303038152906040526040518082805190602001908083835b602083106114f95780518252601f1990920191602091820191016114da565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff19169415159490941790935550505050565b600081101561155457600080fd5b806002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b602083106115c85780518252601f1990920191602091820191016115a9565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550505050565b6000808383111561161957600080fd5b5050900390565b60008282018381101561145757600080fd5b600081101561164057600080fd5b806002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052604051808280519060200190808383602083106115c85780518252601f1990920191602091820191016115a9565b60008115156116c157600080fd5b81838115156116cc57fe5b069392505050565b611710670de0b6b3a76400006108e66116eb610903565b6108e66117086103e86108e6670de0b6b3a76400006108da610b82565b6108da61099b565b6002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083835b602083106117835780518252601f199092019160209182019101611764565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002093909355505050565b806004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b602083106118375780518252601f199092019160209182019101611818565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03959095169490941790935550505050565b806006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d019050604051602081830303815290604052604051808280519060200190808383602083106114f95780518252601f1990920191602091820191016114da5600a165627a7a723058201535a1163acb7e9dcc445a2736601495cfa347a14bf1ba5674fa4a36fbaa68210029

Deployed ByteCode

0x6080604052600436106100cc5763ffffffff60e060020a6000350416632e0f262581146100d1578063392e53cd146100f8578063537cc17c146101215780635c3be315146101365780635dba8c4a1461014b57806363037afc146101605780636d20d6ae14610181578063741de14814610196578063b1f0c8e1146101ab578063c4e41b22146101c2578063d37db1d2146101d7578063d56f4f28146101ec578063d5a9577114610201578063ec15a5e614610216578063f91c289814610247578063fe4b84df1461030c575b600080fd5b3480156100dd57600080fd5b506100e6610324565b60408051918252519081900360200190f35b34801561010457600080fd5b5061010d610330565b604080519115158252519081900360200190f35b34801561012d57600080fd5b506100e66103e8565b34801561014257600080fd5b5061010d61049d565b34801561015757600080fd5b506100e6610617565b34801561016c57600080fd5b506100e6600160a060020a036004351661068b565b34801561018d57600080fd5b506100e66108fe565b3480156101a257600080fd5b506100e6610903565b3480156101b757600080fd5b506101c061090a565b005b3480156101ce57600080fd5b506100e661099b565b3480156101e357600080fd5b506100e6610a0f565b3480156101f857600080fd5b506101c0610a16565b34801561020d57600080fd5b506100e6610b82565b34801561022257600080fd5b5061022b610b87565b60408051600160a060020a039092168252519081900360200190f35b34801561025357600080fd5b506102736024600480358281019290820135918135918201910135610c45565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156102b757818101518382015260200161029f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156102f65781810151838201526020016102de565b5050505090500194505050505060405180910390f35b34801561031857600080fd5b506101c0600435611310565b670de0b6b3a764000081565b60006006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b602083106103a55780518252601f199092019160209182019101610386565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff16949350505050565b60006002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b6020831061045d5780518252601f19909201916020918201910161043e565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054949350505050565b60006104a7610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156104e457600080fd5b505af11580156104f8573d6000803e3d6000fd5b505050506040513d602081101561050e57600080fd5b5051604080517f8d4e40830000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921691638d4e4083916004808201926020929091908290030181600087803b15801561056d57600080fd5b505af1158015610581573d6000803e3d6000fd5b505050506040513d602081101561059757600080fd5b5051801561061257506006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c65000000000000008152506019019050604051602081830303815290604052604051808280519060200190808383602083106103a55780518252601f199092019160209182019101610386565b905090565b60006002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b600080600080600061069b610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b505050506040513d602081101561070257600080fd5b5051604080517fbf135267000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519296509086169163bf135267916024808201926020929091908290030181600087803b15801561076c57600080fd5b505af1158015610780573d6000803e3d6000fd5b505050506040513d602081101561079657600080fd5b5051604080517f94409a560000000000000000000000000000000000000000000000000000000081529051919450600160a060020a038616916394409a56916004808201926020929091908290030181600087803b1580156107f757600080fd5b505af115801561080b573d6000803e3d6000fd5b505050506040513d602081101561082157600080fd5b5051604080517f40c9cdeb0000000000000000000000000000000000000000000000000000000081529051919350600160a060020a038616916340c9cdeb916004808201926020929091908290030181600087803b15801561088257600080fd5b505af1158015610896573d6000803e3d6000fd5b505050506040513d60208110156108ac57600080fd5b505190508115156108c6576108bf610617565b94506108f5565b6108f2826108e6836108da876108da610617565b9063ffffffff61142916565b9063ffffffff61146216565b94505b50505050919050565b600581565b62a0668090565b610912610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d602081101561097957600080fd5b5051600160a060020a0316331461098f57600080fd5b6109996001611485565b565b60006002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b0190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b62a0668081565b610a1e610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a5b57600080fd5b505af1158015610a6f573d6000803e3d6000fd5b505050506040513d6020811015610a8557600080fd5b5051604080517ffacd743b0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a039092169163facd743b916024808201926020929091908290030181600087803b158015610aea57600080fd5b505af1158015610afe573d6000803e3d6000fd5b505050506040513d6020811015610b1457600080fd5b50511515610b2157600080fd5b610b2961049d565b1515610b3457600080fd5b7f5c0daed232a37723b040b8aa1c0b060b1d5fb3dea06a55fd30c35cab3e8fc3d7610b5d6103e8565b60408051918252519081900360200190a1610b786000611485565b6109996000611546565b600590565b60006004600060405160200180807f70726f787953746f726167650000000000000000000000000000000000000000815250600c0190506040516020818303038152906040526040518082805190602001908083835b60208310610bfc5780518252601f199092019160209182019101610bdd565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316949350505050565b606080600060608060608060006004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b60208310610cc55780518252601f199092019160209182019101610ca6565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a031633149250610d1691505057600080fd5b8a8914610d2257600080fd5b60018b14610d2f57600080fd5b89896000818110610d3c57fe5b9050602002013561ffff1661ffff166000141515610d5957600080fd5b610d7e8c8c6000818110610d6957fe5b90506020020135600160a060020a031661068b565b9550610d88610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610dc557600080fd5b505af1158015610dd9573d6000803e3d6000fd5b505050506040513d6020811015610def57600080fd5b5051600160a060020a0316636a28f12f8d8d6000818110610e0c57fe5b90506020020135600160a060020a0316886040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015610e6f57600080fd5b505af1158015610e83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015610eac57600080fd5b810190808051640100000000811115610ec457600080fd5b82016020810184811115610ed757600080fd5b8151856020820283011164010000000082111715610ef457600080fd5b50509291906020018051640100000000811115610f1057600080fd5b82016020810184811115610f2357600080fd5b8151856020820283011164010000000082111715610f4057600080fd5b5050929190505050945094508451600101604051908082528060200260200182016040528015610f7a578160200160208202803883390190505b5092508251604051908082528060200260200182016040528015610fa8578160200160208202803883390190505b5091508b8b6000818110610fb857fe5b90506020020135600160a060020a0316836000815181101515610fd757fe5b600160a060020a039092166020928302909101909101528151869083906000908110610fff57fe5b602090810290910101525060015b845181116110eb57846001820381518110151561102657fe5b90602001906020020151838281518110151561103e57fe5b600160a060020a0390921660209283029091019091015283518490600019830190811061106757fe5b90602001906020020151828281518110151561107f57fe5b6020908102909101015281516110ca9083908390811061109b57fe5b906020019060200201518360008151811015156110b457fe5b602090810290910101519063ffffffff61160916565b8260008151811015156110d957fe5b6020908102909101015260010161100d565b61110b611106876110fa6103e8565b9063ffffffff61162016565b611546565b61111f61111a876110fa61099b565b611632565b61113761112a610903565b439063ffffffff6116b316565b1515611145576111456116d4565b61114d610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561118a57600080fd5b505af115801561119e573d6000803e3d6000fd5b505050506040513d60208110156111b457600080fd5b5051600160a060020a03166385cd84648d8d60008181106111d157fe5b90506020020135600160a060020a03166040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b15801561122c57600080fd5b505af1158015611240573d6000803e3d6000fd5b505050507fb747d4e9a0b39cc47496d84b42e4066ba8b8a0b89776528bcec4ac2997e224538383604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156112ab578181015183820152602001611293565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156112ea5781810151838201526020016112d2565b5050505090500194505050505060405180910390a150909a909950975050505050505050565b6004600060405160200180807f6f776e657200000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040526040518082805190602001908083835b602083106113835780518252601f199092019160209182019101611364565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316331492506113d491505057600080fd5b6113dc610330565b156113e657600080fd5b61140373fffffffffffffffffffffffffffffffffffffffe6117c3565b61140c81611632565b611414610b78565b61141c6116d4565b61142660016118a0565b50565b60008083151561143c576000915061145b565b5082820282848281151561144c57fe5b041461145757600080fd5b8091505b5092915050565b60008080831161147157600080fd5b828481151561147c57fe5b04949350505050565b806006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c650000000000000081525060190190506040516020818303038152906040526040518082805190602001908083835b602083106114f95780518252601f1990920191602091820191016114da565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff19169415159490941790935550505050565b600081101561155457600080fd5b806002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b602083106115c85780518252601f1990920191602091820191016115a9565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550505050565b6000808383111561161957600080fd5b5050900390565b60008282018381101561145757600080fd5b600081101561164057600080fd5b806002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052604051808280519060200190808383602083106115c85780518252601f1990920191602091820191016115a9565b60008115156116c157600080fd5b81838115156116cc57fe5b069392505050565b611710670de0b6b3a76400006108e66116eb610903565b6108e66117086103e86108e6670de0b6b3a76400006108da610b82565b6108da61099b565b6002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083835b602083106117835780518252601f199092019160209182019101611764565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002093909355505050565b806004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b602083106118375780518252601f199092019160209182019101611818565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03959095169490941790935550505050565b806006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d019050604051602081830303815290604052604051808280519060200190808383602083106114f95780518252601f1990920191602091820191016114da5600a165627a7a723058201535a1163acb7e9dcc445a2736601495cfa347a14bf1ba5674fa4a36fbaa68210029