Sponsored Link:   Learn and build dApps today without code using Crowd Machine's Crowd App Studio.
Contract Overview
Balance: 0 Ether
Ether Value: $0
Transactions: 27223 txns
Misc
Address Watch: Add To Watch List
Contract Creator: 0xf31930014f57b93496f967698f92b2430c62fc43at txn 0x5e3a9db209f5728869b25104740a33a52b150d8fbdc3cd019ab90411a4ca48be
Token Balances:
 Latest 25 txns from a total Of 27223 transactions

TxHash Age From To Value [TxFee]
0xe8680109358aa355ac18f209d2c94322b826ce9de05a9af64fe081b6b2d4fbf62 days 1 hr ago0xe324e9320c42f4f55de0b1ef3f5a60029023430e  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000395296
0x57c937563803a788a57c83835c9ed6b3198cc773e4b2cf754fbc9f52d4fe4dfc2 days 19 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.0000955327
0xb3cdd28e05b6101e59163b135119c76ffc22cd702458f408c379482c174d90e52 days 20 hrs ago0xe324e9320c42f4f55de0b1ef3f5a60029023430e  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00049412
0x5311e251325c9387cb588e1feeb54edc9e11a4d91f7b6046752918959f9497de2 days 20 hrs ago0xe324e9320c42f4f55de0b1ef3f5a60029023430e  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00154419
0x5b93614a24db36b41a859e788717925c3798c4f74c522a4f453bfbdbdc7938372 days 20 hrs ago0xe324e9320c42f4f55de0b1ef3f5a60029023430e  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00150563
0xea931b00f92bea889143598c2e822d1ffe3e46b3cc2adbd0a0ed3a466e34c7952 days 20 hrs ago0xe324e9320c42f4f55de0b1ef3f5a60029023430e  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00154419
0x3fceacb3aefce0e6686a87a400a8fa23a607f7eba984d0a0a072c9e808c837a92 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00045345
0x161a6972b6347760c40507ecb1b9fb6861086ec6310a89f7bc4d266d7ddd17a52 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00122703
0xaf04199ec118114879ea3e4bdc463e9162914040fd38fa9da73fec2780ea15bb2 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00045345
0x2208498dc24e6552547c8b6002bc4eba552bbb7d1119f6508449877f3cb016912 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00122639
0x2e97a747f0dcbba8d0fd1c3682a3163a3bf9922623cb1f45657ec4c90deb26ef2 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00045345
0x3e93549f0c135a3436b528ab19aa3c749c4915bdbc5f51cad96cdad509b3d53f2 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00122703
0xab26a16d5c45a45566d761e0ff09cc82fc59f1edb55cf83bc505bc1c262bdfb62 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00045345
0x6d172cc494323e49959e3bd6195fdb7bcd92b5d209eb05191911fb07d4fb86082 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00122703
0x669c223bc0682a2c257cc2aaa694c088fca0f52475c985cde20d588b91afcd492 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00045345
0xbddf7e7240939cd043ce8c0b05a549968ac07990be10b32c562081004a9666422 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00122703
0x6cee9128f7d4e91ba9a66a01382a4d69d5869be179bc1109fbeed68c57b4876d2 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00045345
0x33a28ce21cfc8550de73231c408847bb9c1888d58126926ea8b8703ad452192b2 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00122703
0xd0cd7158a84169fc3261dcc084f249480d4be04c8249aca984a19f670817feea2 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00045345
0xf331ab120a0aaf34fcda7dd8e7ac61c82fbba719857fcc09856ec4fcdd5a86be2 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00122703
0x013fec5cd4f0626468fec7aa53a3825ddc8cf1fc0496842929bbc3272f56cd2b2 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00045345
0xfdbc35e13d31828c8b9f2edc6cf7bb0cc1bd40e65cb26b265ba3bec7adec53a12 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00122703
0xb211eb0dca01b2f067ceef909c0dae307c6aac8c09ecdf1f603ef9d3270baaf92 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00045345
0x758e11c79dc51f835d1f0035cb7fa8204f2831e961d04750279783815b0f1f182 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00122703
0x9a5e61c1286f4099543b23885d23c2df2503511a4f40582b5fced0a777e285cd2 days 20 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43  IN   0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00045345
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
View All
ParentTxHash Block Age From To Value
Contract Source Code Verified (Exact match)
Contract Name: Atonomi
Compiler Version: v0.4.23+commit.124ca40d
Optimization Enabled: No
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.23;

// File: zeppelin-solidity/contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @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(owner, newOwner);
    owner = newOwner;
  }

}

// File: zeppelin-solidity/contracts/lifecycle/Pausable.sol

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    emit Unpause();
  }
}

// File: zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

// File: zeppelin-solidity/contracts/lifecycle/TokenDestructible.sol

/**
 * @title TokenDestructible:
 * @author Remco Bloemen <remco@2π.com>
 * @dev Base contract that can be destroyed by owner. All funds in contract including
 * listed tokens will be sent to the owner.
 */
contract TokenDestructible is Ownable {

  function TokenDestructible() public payable { }

  /**
   * @notice Terminate contract and refund to owner
   * @param tokens List of addresses of ERC20 or ERC20Basic token contracts to
   refund.
   * @notice The called token contracts could try to re-enter this contract. Only
   supply token contracts you trust.
   */
  function destroy(address[] tokens) onlyOwner public {

    // Transfer tokens to owner
    for (uint256 i = 0; i < tokens.length; i++) {
      ERC20Basic token = ERC20Basic(tokens[i]);
      uint256 balance = token.balanceOf(this);
      token.transfer(owner, balance);
    }

    // Transfer Eth to owner and terminate contract
    selfdestruct(owner);
  }
}

// File: contracts/Atonomi.sol

// solhint-disable-line




/// @title ERC-20 Token Standard
/// @author Fabian Vogelsteller <fabian@ethereum.org>, Vitalik Buterin <vitalik.buterin@ethereum.org>
/// @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
interface ERC20Interface {
    function decimals() public constant returns (uint8);
    function totalSupply() public constant returns (uint);
    function balanceOf(address tokenOwner) public constant returns (uint balance);
    function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);

    event Transfer(address indexed from, address indexed to, uint tokens);   // solhint-disable-line
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}


/// @title Safe Math library
/// @dev Math operations with safety checks that throw on error
/// @dev https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/math/SafeMath.sol
library SafeMath {
    /// @dev Multiplies two numbers, throws on overflow.
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        assert(c / a == b);
        return c;
    }

    /// @dev Integer division of two numbers, truncating the quotient.
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }

    /// @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    /// @dev Adds two numbers, throws on overflow.
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }
}


/// @dev Interface for the Network Settings contract
interface SettingsInterface {
    function registrationFee() external view returns (uint256);
    function activationFee() external view returns (uint256);
    function defaultReputationReward() external view returns (uint256);
    function reputationIRNNodeShare() external view returns (uint256);
    function blockThreshold() external view returns (uint256);
}


/// @title Atonomi Smart Contract
/// @author Atonomi
/// @notice Governs the activation, registration, and reputation of devices on the Atonomi network
/// @dev Ownable: Owner governs the access of Atonomi Admins, Fees, and Rewards on the network
/// @dev Pausable: Gives ability for Owner to pull emergency stop to prevent actions on the network
/// @dev TokenDestructible: Gives owner ability to kill the contract and extract funds to a new contract
contract Atonomi is Pausable, TokenDestructible {
    using SafeMath for uint256;

    /// @title ATMI Token
    /// @notice Standard ERC20 Token
    /// @dev AMLToken source: https://github.com/TokenMarketNet/ico/blob/master/contracts/AMLToken.sol
    ERC20Interface public token;

    /// @title Network Settings
    /// @notice Atonomi Owner controlled settings are governed in this contract
    SettingsInterface public settings;

    ///
    /// STORAGE MAPPINGS 
    ///
    /// @title Atonomi Devices registry
    /// @notice Contains all devices participating in the Atonomi Network
    /// @dev Key is a keccak256 hash of the device id
    /// @dev Value is a struct that contains the device status and metadata
    mapping (bytes32 => Device) public devices;

    /// @title Atonomi Participant whitelist
    /// @notice Contains all the network participants
    /// @dev Atonomi Admins: Govern the access to manufacturers and IRN Nodes on the network
    /// @dev IRN Nodes: Governs reputation score data of devices
    /// @dev Manufacturers: Governs devices on the network
    /// @dev Key is ethereum account of the participant
    /// @dev Value is a struct that contains the role of the participant
    mapping (address => NetworkMember) public network;

    /// @title Token Pools
    /// @notice each manufacturer will manage a pool of tokens for reputation rewards
    /// @dev Key is ethereum account for pool owner
    /// @dev Value is struct representing token pool attributes
    /// @dev incoming tokens will come from registrations, activations, or public donations
    /// @dev outgoing tokens will come from reputation rewards
    mapping (address => TokenPool) public pools;

    /// @title Reward Balances
    /// @notice balances of rewards that are able to be claimed by participants
    /// @dev Key is ethereum account of the owner of the tokens
    /// @dev Value is tokens available for withdraw
    mapping (address => uint256) public rewards;

    /// @title Lookup by Manufacturer ID the wallet for reputation rewards
    /// @dev Key is the manufacturer id
    /// @dev Value is ethereum account to be rewarded
    mapping (bytes32 => address) public manufacturerRewards;

    /// @title Track last write by reputation author
    /// @dev First key is the ethereum address of the reputation author
    /// @dev Second key is the device id
    /// @dev Value is the block number of the last time the author has submitted a score for the device
    mapping (address => mapping (bytes32 => uint256)) public authorWrites;

    /// @title Default Repuration score for manufacturers
    /// @dev Key is the manufacturer id
    /// @dev value is the score to use for newly registered devices
    mapping (bytes32 => bytes32) public defaultManufacturerReputations;

    ///
    /// TYPES 
    ///
    /// @title Atonomi Device
    /// @notice Contains the device state on the Atonomi network
    /// @dev manufacturerId is the manufacturer the device belongs to
    /// @dev deviceType is the type of device categorized by the manufacturer
    /// @dev registered is true when device is registered, otherwise false
    /// @dev activated is true when device is activated, otherwise false
    /// @dev reputationScore is official Atonomi Reputation score for the device
    /// @dev devicePublicKey is public key used by IRN Nodes for validation
    struct Device {
        bytes32 manufacturerId;
        bytes32 deviceType;
        bool registered;
        bool activated;
        bytes32 reputationScore;
        bytes32 devicePublicKey;
    }

    /// @title Token Pool
    /// @notice Contains balance and reputation reward amounts for each token pool
    /// @dev balance is total amount of tokens available in the pool
    /// @dev rewardAmount is the total amount distributed between the manufacturer and reputation author
    struct TokenPool {
        uint256 balance;
        uint256 rewardAmount;
    }

    /// @title Atonomi Network Participant
    /// @notice Contains role information for a participant
    /// @dev isIRNAdmin is true if participant is an IRN Admin, otherwise false
    /// @dev isManufacturer is true if participant is a Manufacturer, otherwise false
    /// @dev isIRNNode is true if participant is an IRN Node, otherwise false
    /// @dev memberId is the manufacturer id, for all other participants this will be 0
    struct NetworkMember {
        bool isIRNAdmin;
        bool isManufacturer;
        bool isIRNNode;
        bytes32 memberId;
    }

    ///
    /// MODIFIERS
    ///
    /// @notice only manufacturers can call, otherwise throw
    modifier onlyManufacturer() {
        require(network[msg.sender].isManufacturer, "must be a manufacturer");
        _;
    }

    /// @notice only IRNAdmins or Owner can call, otherwise throw
    modifier onlyIRNorOwner() {
        require(msg.sender == owner || network[msg.sender].isIRNAdmin, "must be owner or an irn admin");
        _;
    }

    /// @notice only IRN Nodes can call, otherwise throw
    modifier onlyIRNNode() {
        require(network[msg.sender].isIRNNode, "must be an irn node");
        _;
    }

    /// @notice Constructor sets the ERC Token contract and initial values for network fees
    /// @param _token is the Atonomi Token contract address (must be ERC20)
    /// @param _settings is the Atonomi Network Settings contract address
    constructor (
        address _token,
        address _settings) public {
        require(_token != address(0), "token address cannot be 0x0");
        require(_settings != address(0), "settings address cannot be 0x0");
        token = ERC20Interface(_token);
        settings = SettingsInterface(_settings);
    }

    ///
    /// EVENTS 
    ///
    /// @notice emitted on successful device registration
    /// @param _sender manufacturer paying for registration
    /// @param _fee registration fee paid by manufacturer
    /// @param _deviceHashKey keccak256 hash of device id used as the key in devices mapping
    /// @param _manufacturerId of the manufacturer the device belongs to
    /// @param _deviceType is the type of device categorized by the manufacturer
    event DeviceRegistered(
        address indexed _sender,
        uint256 _fee,
        bytes32 indexed _deviceHashKey,
        bytes32 indexed _manufacturerId,
        bytes32 _deviceType
    );

    /// @notice emitted on successful device activation
    /// @param _sender manufacturer or device owner paying for activation
    /// @param _fee registration fee paid by manufacturer
    /// @param _deviceId the real device id (only revealed after activation)
    /// @param _manufacturerId of the manufacturer the device belongs to
    /// @param _deviceType is the type of device categorized by the manufacturer
    event DeviceActivated(
        address indexed _sender,
        uint256 _fee,
        bytes32 indexed _deviceId,
        bytes32 indexed _manufacturerId,
        bytes32 _deviceType
    );

    /// @notice emitted on reputation change for a device
    /// @param _deviceId device id of the target device
    /// @param _deviceType is the type of device categorized by the manufacturer
    /// @param _newScore updated reputation score
    /// @param _irnNode IRN node submitting the new reputation
    /// @param _irnReward tokens awarded to irn node
    /// @param _manufacturerWallet manufacturer associated with the device is rewared a share of tokens
    /// @param _manufacturerReward tokens awarded to contributor
    event ReputationScoreUpdated(
        bytes32 indexed _deviceId,
        bytes32 _deviceType,
        bytes32 _newScore,
        address indexed _irnNode,
        uint256 _irnReward,
        address indexed _manufacturerWallet,
        uint256 _manufacturerReward
    );

    /// @notice emitted on successful addition of network member address
    /// @param _sender ethereum account of participant that made the change
    /// @param _member address of added member
    /// @param _memberId manufacturer id for manufacturer, otherwise 0x0
    event NetworkMemberAdded(
        address indexed _sender,
        address indexed _member,
        bytes32 indexed _memberId
    );

    /// @notice emitted on successful removal of network member address
    /// @param _sender ethereum account of participant that made the change
    /// @param _member address of removed member
    /// @param _memberId manufacturer id for manufacturer, otherwise 0x0
    event NetworkMemberRemoved(
        address indexed _sender,
        address indexed _member,
        bytes32 indexed _memberId
    );

    /// @notice emitted everytime a manufacturer changes their wallet for rewards
    /// @param _old ethereum account
    /// @param _new ethereum account
    /// @param _manufacturerId that the member belongs to
    event ManufacturerRewardWalletChanged(
        address indexed _old,
        address indexed _new,
        bytes32 indexed _manufacturerId
    );

    /// @notice emitted everytime a token pool reward amount changes
    /// @param _sender ethereum account of the token pool owner
    /// @param _newReward new reward value in ATMI tokens
    event TokenPoolRewardUpdated(
        address indexed _sender,
        uint256 _newReward
    );

    /// @notice emitted everytime someone donates tokens to a manufacturer
    /// @param _sender ethereum account of the donater
    /// @param _manufacturerId of the manufacturer
    /// @param _manufacturer ethereum account
    /// @param _amount of tokens deposited
    event TokensDeposited(
        address indexed _sender,
        bytes32 indexed _manufacturerId,
        address indexed _manufacturer,
        uint256 _amount
    );
    
    /// @notice emitted everytime a participant withdraws from token pool
    /// @param _sender ethereum account of participant that made the change
    /// @param _amount tokens withdrawn
    event TokensWithdrawn(
        address indexed _sender,
        uint256 _amount
    );

    /// @notice emitted everytime the default reputation for a manufacturer changes
    /// @param _sender ethereum account of participant that made the change
    /// @param _manufacturerId of the manufacturer
    /// @param _newDefaultScore to use for newly registered devices
    event DefaultReputationScoreChanged(
        address indexed _sender,
        bytes32 indexed _manufacturerId,
        bytes32 _newDefaultScore
    );

    ///
    /// DEVICE ONBOARDING
    ///
    /// @notice registers device on the Atonomi network
    /// @param _deviceIdHash keccak256 hash of the device's id (needs to be hashed by caller)
    /// @param _deviceType is the type of device categorized by the manufacturer
    /// @dev devicePublicKey is public key used by IRN Nodes for validation
    /// @return true if successful, otherwise false
    /// @dev msg.sender is expected to be the manufacturer
    /// @dev tokens will be deducted from the manufacturer and added to the token pool
    /// @dev owner has ability to pause this operation
    function registerDevice(
        bytes32 _deviceIdHash,
        bytes32 _deviceType,
        bytes32 _devicePublicKey)
        public onlyManufacturer whenNotPaused returns (bool)
    {
        uint256 registrationFee = settings.registrationFee();
        Device memory d = _registerDevice(msg.sender, _deviceIdHash, _deviceType, _devicePublicKey);
        emit DeviceRegistered(
            msg.sender,
            registrationFee,
            _deviceIdHash,
            d.manufacturerId,
            _deviceType);
        _depositTokens(msg.sender, registrationFee);
        require(token.transferFrom(msg.sender, address(this), registrationFee), "transferFrom failed");
        return true;
    }

    /// @notice Activates the device
    /// @param _deviceId id of the real device id to be activated (not the hash of the device id)
    /// @return true if successful, otherwise false
    /// @dev if the hash doesnt match, the device is considered not registered and will throw
    /// @dev anyone with the device id (in hand) is considered the device owner
    /// @dev tokens will be deducted from the device owner and added to the token pool
    /// @dev owner has ability to pause this operation
    function activateDevice(bytes32 _deviceId) public whenNotPaused returns (bool) {
        uint256 activationFee = settings.activationFee();
        Device memory d = _activateDevice(_deviceId);
        emit DeviceActivated(msg.sender, activationFee, _deviceId, d.manufacturerId, d.deviceType);
        address manufacturer = manufacturerRewards[d.manufacturerId];
        require(manufacturer != address(this), "manufacturer is unknown");
        _depositTokens(manufacturer, activationFee);
        require(token.transferFrom(msg.sender, address(this), activationFee), "transferFrom failed");
        return true;
    }

    /// @notice Registers and immediately activates device, used by manufacturers to prepay activation
    /// @param _deviceId id of the real device id to be activated (not the has of the device id)
    /// @param _deviceType is the type of device categorized by the manufacturer
    /// @return true if successful, otherwise false
    /// @dev since the manufacturer is trusted, no need for the caller to hash the device id
    /// @dev msg.sender is expected to be the manufacturer
    /// @dev tokens will be deducted from the manufacturer and added to the token pool
    /// @dev owner has ability to pause this operation
    function registerAndActivateDevice(
        bytes32 _deviceId,
        bytes32 _deviceType,
        bytes32 _devicePublicKey) 
        public onlyManufacturer whenNotPaused returns (bool)
    {
        uint256 registrationFee = settings.registrationFee();
        uint256 activationFee = settings.activationFee();

        bytes32 deviceIdHash = keccak256(_deviceId);
        Device memory d = _registerDevice(msg.sender, deviceIdHash, _deviceType, _devicePublicKey);
        bytes32 manufacturerId = d.manufacturerId;
        emit DeviceRegistered(msg.sender, registrationFee, deviceIdHash, manufacturerId, _deviceType);

        d = _activateDevice(_deviceId);
        emit DeviceActivated(msg.sender, activationFee, _deviceId, manufacturerId, _deviceType);

        uint256 fee = registrationFee.add(activationFee);
        _depositTokens(msg.sender, fee);
        require(token.transferFrom(msg.sender, address(this), fee), "transferFrom failed");
        return true;
    }

    ///
    /// REPUTATION MANAGEMENT
    ///
    /// @notice updates reputation for a device
    /// @param _deviceId target device Id
    /// @param _reputationScore updated reputation score computed by the author
    /// @return true if successful, otherwise false
    /// @dev msg.sender is expected to be the reputation author (either irn node or the reputation auditor)
    /// @dev tokens will be deducted from the contract pool
    /// @dev author and manufacturer will be rewarded a split of the tokens
    /// @dev owner has ability to pause this operation
    function updateReputationScore(
        bytes32 _deviceId,
        bytes32 _reputationScore)
        public onlyIRNNode whenNotPaused returns (bool)
    {
        Device memory d = _updateReputationScore(_deviceId, _reputationScore);

        address _manufacturerWallet = manufacturerRewards[d.manufacturerId];
        require(_manufacturerWallet != address(0), "_manufacturerWallet cannot be 0x0");
        require(_manufacturerWallet != msg.sender, "manufacturers cannot collect the full reward");

        uint256 irnReward;
        uint256 manufacturerReward;
        (irnReward, manufacturerReward) = getReputationRewards(msg.sender, _manufacturerWallet, _deviceId);
        _distributeRewards(_manufacturerWallet, msg.sender, irnReward);
        _distributeRewards(_manufacturerWallet, _manufacturerWallet, manufacturerReward);
        emit ReputationScoreUpdated(
            _deviceId,
            d.deviceType,
            _reputationScore,
            msg.sender,
            irnReward,
            _manufacturerWallet,
            manufacturerReward);
        authorWrites[msg.sender][_deviceId] = block.number;
        return true;
    }

    /// @notice computes the portion of the reputation reward allotted to the manufacturer and author
    /// @param author is the reputation node submitting the score
    /// @param manufacturer is the token pool owner
    /// @param deviceId of the device being updated
    /// @return irnReward and manufacturerReward
    function getReputationRewards(
        address author,
        address manufacturer,
        bytes32 deviceId)
        public view returns (uint256 irnReward, uint256 manufacturerReward)
    {
        uint256 lastWrite = authorWrites[author][deviceId];
        uint256 blocks = 0;
        if (lastWrite > 0) {
            blocks = block.number.sub(lastWrite);
        }
        uint256 totalRewards = calculateReward(pools[manufacturer].rewardAmount, blocks);
        irnReward = totalRewards.mul(settings.reputationIRNNodeShare()).div(100);
        manufacturerReward = totalRewards.sub(irnReward);
    }

    /// @notice computes total reward based on the authors last submission
    /// @param rewardAmount total amount available for reward
    /// @param blocksSinceLastWrite number of blocks since last write
    /// @return actual reward available
    function calculateReward(uint256 rewardAmount, uint256 blocksSinceLastWrite) public view returns (uint256) {
        uint256 totalReward = rewardAmount;
        uint256 blockThreshold = settings.blockThreshold();
        if (blocksSinceLastWrite > 0 && blocksSinceLastWrite < blockThreshold) {
            uint256 multiplier = 10 ** uint256(token.decimals());
            totalReward = rewardAmount.mul(blocksSinceLastWrite.mul(multiplier)).div(blockThreshold.mul(multiplier));
        }
        return totalReward;
    }

    ///
    /// BULK OPERATIONS
    ///
    /// @notice registers multiple devices on the Atonomi network
    /// @param _deviceIdHashes array of keccak256 hashed ID's of each device
    /// @param _deviceTypes array of types of device categorized by the manufacturer
    /// @param _devicePublicKeys array of public keys associated with the devices
    /// @return true if successful, otherwise false
    /// @dev msg.sender is expected to be the manufacturer
    /// @dev tokens will be deducted from the manufacturer and added to the token pool
    /// @dev owner has ability to pause this operation
    function registerDevices(
        bytes32[] _deviceIdHashes,
        bytes32[] _deviceTypes,
        bytes32[] _devicePublicKeys)
        public onlyManufacturer whenNotPaused returns (bool)
    {
        require(_deviceIdHashes.length > 0, "at least one device is required");
        require(
            _deviceIdHashes.length == _deviceTypes.length,
            "device type array needs to be same size as devices"
        );
        require(
            _deviceIdHashes.length == _devicePublicKeys.length,
            "device public key array needs to be same size as devices"
        );

        uint256 runningBalance = 0;
        uint256 registrationFee = settings.registrationFee();
        for (uint256 i = 0; i < _deviceIdHashes.length; i++) {
            bytes32 deviceIdHash = _deviceIdHashes[i];
            bytes32 deviceType = _deviceTypes[i];
            bytes32 devicePublicKey = _devicePublicKeys[i];
            Device memory d = _registerDevice(msg.sender, deviceIdHash, deviceType, devicePublicKey);
            emit DeviceRegistered(msg.sender, registrationFee, deviceIdHash, d.manufacturerId, deviceType);

            runningBalance = runningBalance.add(registrationFee);
        }

        _depositTokens(msg.sender, runningBalance);
        require(token.transferFrom(msg.sender, address(this), runningBalance), "transferFrom failed");
        return true;
    }

    ///
    /// WHITELIST PARTICIPANT MANAGEMENT
    ///
    /// @notice add a member to the network
    /// @param _member ethereum address of member to be added
    /// @param _isIRNAdmin true if an irn admin, otherwise false
    /// @param _isManufacturer true if an manufactuter, otherwise false
    /// @param _memberId manufacturer id for manufacturers, otherwise 0x0
    /// @return true if successful, otherwise false
    /// @dev _memberId is only relevant for manufacturer, but is flexible to allow use for other purposes
    /// @dev msg.sender is expected to be either owner or irn admin
    function addNetworkMember(
        address _member,
        bool _isIRNAdmin,
        bool _isManufacturer,
        bool _isIRNNode,
        bytes32 _memberId)
        public onlyIRNorOwner returns(bool)
    {
        NetworkMember storage m = network[_member];
        require(!m.isIRNAdmin, "already an irn admin");
        require(!m.isManufacturer, "already a manufacturer");
        require(!m.isIRNNode, "already an irn node");
        require(m.memberId == 0, "already assigned a member id");

        m.isIRNAdmin = _isIRNAdmin;
        m.isManufacturer = _isManufacturer;
        m.isIRNNode = _isIRNNode;
        m.memberId = _memberId;

        if (m.isManufacturer) {
            require(_memberId != 0, "manufacturer id is required");

            // keep lookup for rewards in sync
            require(manufacturerRewards[m.memberId] == address(0), "manufacturer is already assigned");
            manufacturerRewards[m.memberId] = _member;

            // set reputation reward if token pool doesnt exist
            if (pools[_member].rewardAmount == 0) {
                pools[_member].rewardAmount = settings.defaultReputationReward();
            }
        }

        emit NetworkMemberAdded(msg.sender, _member, _memberId);

        return true;
    }

    /// @notice remove a member from the network
    /// @param _member ethereum address of member to be removed
    /// @return true if successful, otherwise false
    /// @dev msg.sender is expected to be either owner or irn admin
    function removeNetworkMember(address _member) public onlyIRNorOwner returns(bool) {
        bytes32 memberId = network[_member].memberId;
        if (network[_member].isManufacturer) {
            // remove token pool if there is a zero balance
            if (pools[_member].balance == 0) {
                delete pools[_member];
            }

            // keep lookup with rewards in sync
            delete manufacturerRewards[memberId];
        }

        delete network[_member];

        emit NetworkMemberRemoved(msg.sender, _member, memberId);
        return true;
    }

    //
    // TOKEN POOL MANAGEMENT
    //
    /// @notice changes the ethereum wallet for a manufacturer used in reputation rewards
    /// @param _new new ethereum account
    /// @return true if successful, otherwise false
    /// @dev msg.sender is expected to be original manufacturer account
    function changeManufacturerWallet(address _new) public onlyManufacturer returns (bool) {
        require(_new != address(0), "new address cannot be 0x0");

        NetworkMember memory old = network[msg.sender];
        require(old.isManufacturer && old.memberId != 0, "must be a manufacturer");

        // copy permissions
        require(!network[_new].isIRNAdmin, "already an irn admin");
        require(!network[_new].isManufacturer, "already a manufacturer");
        require(!network[_new].isIRNNode, "already an irn node");
        require(network[_new].memberId == 0, "memberId already exists");
        network[_new] = NetworkMember(
            old.isIRNAdmin,
            old.isManufacturer,
            old.isIRNNode,
            old.memberId
        );

        // transfer balance from old pool to the new pool
        require(pools[_new].balance == 0 && pools[_new].rewardAmount == 0, "new token pool already exists");
        pools[_new].balance = pools[msg.sender].balance;
        pools[_new].rewardAmount = pools[msg.sender].rewardAmount;
        delete pools[msg.sender];

        // update reward mapping
        manufacturerRewards[old.memberId] = _new;

        // delete old member
        delete network[msg.sender];

        emit ManufacturerRewardWalletChanged(msg.sender, _new, old.memberId);
        return true;
    }

    /// @notice allows a token pool owner to set a new reward amount
    /// @param newReward new reputation reward amount
    /// @return true if successful, otherwise false
    /// @dev msg.sender expected to be manufacturer
    function setTokenPoolReward(uint256 newReward) public onlyManufacturer returns (bool) {
        require(newReward != 0, "newReward is required");

        TokenPool storage p = pools[msg.sender];
        require(p.rewardAmount != newReward, "newReward should be different");

        p.rewardAmount = newReward;
        emit TokenPoolRewardUpdated(msg.sender, newReward);
        return true;
    }

    /// @notice anyone can donate tokens to a manufacturer's pool
    /// @param manufacturerId of the manufacturer to receive the tokens
    /// @param amount of tokens to deposit
    function depositTokens(bytes32 manufacturerId, uint256 amount) public returns (bool) {
        require(manufacturerId != 0, "manufacturerId is required");
        require(amount > 0, "amount is required");

        address manufacturer = manufacturerRewards[manufacturerId];
        require(manufacturer != address(0));

        _depositTokens(manufacturer, amount);
        emit TokensDeposited(msg.sender, manufacturerId, manufacturer, amount);

        require(token.transferFrom(msg.sender, address(this), amount));
        return true;
    }

    /// @notice allows participants in the Atonomi network to claim their rewards
    /// @return true if successful, otherwise false
    /// @dev owner has ability to pause this operation
    function withdrawTokens() public whenNotPaused returns (bool) {
        uint256 amount = rewards[msg.sender];
        require(amount > 0, "amount is zero");

        rewards[msg.sender] = 0;
        emit TokensWithdrawn(msg.sender, amount);

        require(token.transfer(msg.sender, amount), "token transfer failed");
        return true;
    }

    /// @notice allows the owner to change the default reputation for manufacturers
    /// @param _manufacturerId of the manufacturer
    /// @param _newDefaultScore to use for newly registered devices
    /// @return true if successful, otherwise false
    /// @dev owner is the only one with this feature
    function setDefaultReputationForManufacturer(
        bytes32 _manufacturerId,
        bytes32 _newDefaultScore) public onlyOwner returns (bool) {
        require(_manufacturerId != 0, "_manufacturerId is required");
        require(
            _newDefaultScore != defaultManufacturerReputations[_manufacturerId],
            "_newDefaultScore should be different"
        );

        defaultManufacturerReputations[_manufacturerId] = _newDefaultScore;
        emit DefaultReputationScoreChanged(msg.sender, _manufacturerId, _newDefaultScore);
        return true;
    }

    ///
    /// INTERNAL FUNCTIONS
    ///
    /// @dev track balances of any deposits going into a token pool
    function _depositTokens(address _owner, uint256 _amount) internal {
        pools[_owner].balance = pools[_owner].balance.add(_amount);
    }

    /// @dev track balances of any rewards going out of the token pool
    function _distributeRewards(address _manufacturer, address _owner, uint256 _amount) internal {
        require(_amount > 0, "_amount is required");
        pools[_manufacturer].balance = pools[_manufacturer].balance.sub(_amount);
        rewards[_owner] = rewards[_owner].add(_amount);
    }

    /// @dev ensure a device is validated for registration
    /// @dev updates device registry
    function _registerDevice(
        address _manufacturer,
        bytes32 _deviceIdHash,
        bytes32 _deviceType,
        bytes32 _devicePublicKey) internal returns (Device) {
        require(_manufacturer != address(0), "manufacturer is required");
        require(_deviceIdHash != 0, "device id hash is required");
        require(_deviceType != 0, "device type is required");
        require(_devicePublicKey != 0, "device public key is required");

        Device storage d = devices[_deviceIdHash];
        require(!d.registered, "device is already registered");
        require(!d.activated, "device is already activated");

        bytes32 manufacturerId = network[_manufacturer].memberId;
        require(manufacturerId != 0, "manufacturer id is unknown");

        d.manufacturerId = manufacturerId;
        d.deviceType = _deviceType;
        d.registered = true;
        d.activated = false;
        d.reputationScore = defaultManufacturerReputations[manufacturerId];
        d.devicePublicKey = _devicePublicKey;
        return d;
    }

    /// @dev ensure a device is validated for activation
    /// @dev updates device registry
    function _activateDevice(bytes32 _deviceId) internal returns (Device) {
        bytes32 deviceIdHash = keccak256(_deviceId);
        Device storage d = devices[deviceIdHash];
        require(d.registered, "not registered");
        require(!d.activated, "already activated");
        require(d.manufacturerId != 0, "no manufacturer id was found");

        d.activated = true;
        return d;
    }

    /// @dev ensure a device is validated for a new reputation score
    /// @dev updates device registry
    function _updateReputationScore(bytes32 _deviceId, bytes32 _reputationScore) internal returns (Device) {
        require(_deviceId != 0, "device id is empty");

        Device storage d = devices[keccak256(_deviceId)];
        require(d.registered, "not registered");
        require(d.activated, "not activated");
        require(d.reputationScore != _reputationScore, "new score needs to be different");

        d.reputationScore = _reputationScore;
        return d;
    }
}

    Contract ABI  
[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"rewards","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"manufacturerRewards","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_member","type":"address"},{"name":"_isIRNAdmin","type":"bool"},{"name":"_isManufacturer","type":"bool"},{"name":"_isIRNNode","type":"bool"},{"name":"_memberId","type":"bytes32"}],"name":"addNetworkMember","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"rewardAmount","type":"uint256"},{"name":"blocksSinceLastWrite","type":"uint256"}],"name":"calculateReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_manufacturerId","type":"bytes32"},{"name":"_newDefaultScore","type":"bytes32"}],"name":"setDefaultReputationForManufacturer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"author","type":"address"},{"name":"manufacturer","type":"address"},{"name":"deviceId","type":"bytes32"}],"name":"getReputationRewards","outputs":[{"name":"irnReward","type":"uint256"},{"name":"manufacturerReward","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"manufacturerId","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"depositTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newReward","type":"uint256"}],"name":"setTokenPoolReward","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deviceId","type":"bytes32"},{"name":"_reputationScore","type":"bytes32"}],"name":"updateReputationScore","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"defaultManufacturerReputations","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deviceId","type":"bytes32"}],"name":"activateDevice","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deviceId","type":"bytes32"},{"name":"_deviceType","type":"bytes32"},{"name":"_devicePublicKey","type":"bytes32"}],"name":"registerAndActivateDevice","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deviceIdHash","type":"bytes32"},{"name":"_deviceType","type":"bytes32"},{"name":"_devicePublicKey","type":"bytes32"}],"name":"registerDevice","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"changeManufacturerWallet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deviceIdHashes","type":"bytes32[]"},{"name":"_deviceTypes","type":"bytes32[]"},{"name":"_devicePublicKeys","type":"bytes32[]"}],"name":"registerDevices","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pools","outputs":[{"name":"balance","type":"uint256"},{"name":"rewardAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_member","type":"address"}],"name":"removeNetworkMember","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"network","outputs":[{"name":"isIRNAdmin","type":"bool"},{"name":"isManufacturer","type":"bool"},{"name":"isIRNNode","type":"bool"},{"name":"memberId","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"devices","outputs":[{"name":"manufacturerId","type":"bytes32"},{"name":"deviceType","type":"bytes32"},{"name":"registered","type":"bool"},{"name":"activated","type":"bool"},{"name":"reputationScore","type":"bytes32"},{"name":"devicePublicKey","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokens","type":"address[]"}],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"settings","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"bytes32"}],"name":"authorWrites","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_token","type":"address"},{"name":"_settings","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":false,"name":"_fee","type":"uint256"},{"indexed":true,"name":"_deviceHashKey","type":"bytes32"},{"indexed":true,"name":"_manufacturerId","type":"bytes32"},{"indexed":false,"name":"_deviceType","type":"bytes32"}],"name":"DeviceRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":false,"name":"_fee","type":"uint256"},{"indexed":true,"name":"_deviceId","type":"bytes32"},{"indexed":true,"name":"_manufacturerId","type":"bytes32"},{"indexed":false,"name":"_deviceType","type":"bytes32"}],"name":"DeviceActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_deviceId","type":"bytes32"},{"indexed":false,"name":"_deviceType","type":"bytes32"},{"indexed":false,"name":"_newScore","type":"bytes32"},{"indexed":true,"name":"_irnNode","type":"address"},{"indexed":false,"name":"_irnReward","type":"uint256"},{"indexed":true,"name":"_manufacturerWallet","type":"address"},{"indexed":false,"name":"_manufacturerReward","type":"uint256"}],"name":"ReputationScoreUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"_member","type":"address"},{"indexed":true,"name":"_memberId","type":"bytes32"}],"name":"NetworkMemberAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"_member","type":"address"},{"indexed":true,"name":"_memberId","type":"bytes32"}],"name":"NetworkMemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_old","type":"address"},{"indexed":true,"name":"_new","type":"address"},{"indexed":true,"name":"_manufacturerId","type":"bytes32"}],"name":"ManufacturerRewardWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":false,"name":"_newReward","type":"uint256"}],"name":"TokenPoolRewardUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"_manufacturerId","type":"bytes32"},{"indexed":true,"name":"_manufacturer","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"TokensDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"_manufacturerId","type":"bytes32"},{"indexed":false,"name":"_newDefaultScore","type":"bytes32"}],"name":"DefaultReputationScoreChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

  Contract Creation Code Switch To Opcodes View
608060405260008060146101000a81548160ff0219169083151502179055503480156200002b57600080fd5b5060405160408062005f6f8339810180604052810190808051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156200013f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f746f6b656e20616464726573732063616e6e6f7420626520307830000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515620001e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f73657474696e677320616464726573732063616e6e6f7420626520307830000081525060200191505060405180910390fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050615cf680620002796000396000f300608060405260043610610175576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630700037d1461017a578063135ca124146101d157806313ac2bdb1461024257806313ed0846146102cf5780631db1c8051461031a5780632217bf7814610371578063222b8947146103fd578063252dbc36146104505780633d32cb63146104955780633e870203146104ec5780633f4ba83a14610539578063568f9ce1146105505780635c975abb146105995780636d54ec91146105c85780637900438b1461062d5780638456cb59146106925780638b3edbdf146106a95780638d8f2adb146107045780638da5cb5b1461073357806395f62fb91461078a578063a4063dbc1461088e578063b27f829e146108ec578063c3aa168414610947578063c5c400de146109c7578063c6786e5a14610a57578063e06174e414610abd578063f2fde38b14610b14578063fc0c546a14610b57578063fe4a22eb14610bae575b600080fd5b34801561018657600080fd5b506101bb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c13565b6040518082815260200191505060405180910390f35b3480156101dd57600080fd5b506102006004803603810190808035600019169060200190929190505050610c2b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561024e57600080fd5b506102b5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291908035151590602001909291908035151590602001909291908035600019169060200190929190505050610c5e565b604051808215151515815260200191505060405180910390f35b3480156102db57600080fd5b5061030460048036038101908080359060200190929190803590602001909291905050506113cf565b6040518082815260200191505060405180910390f35b34801561032657600080fd5b50610357600480360381019080803560001916906020019092919080356000191690602001909291905050506115d0565b604051808215151515815260200191505060405180910390f35b34801561037d57600080fd5b506103e0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291905050506117f7565b604051808381526020018281526020019250505060405180910390f35b34801561040957600080fd5b506104366004803603810190808035600019169060200190929190803590602001909291905050506119d3565b604051808215151515815260200191505060405180910390f35b34801561045c57600080fd5b5061047b60048036038101908080359060200190929190505050611d06565b604051808215151515815260200191505060405180910390f35b3480156104a157600080fd5b506104d260048036038101908080356000191690602001909291908035600019169060200190929190505050611f64565b604051808215151515815260200191505060405180910390f35b3480156104f857600080fd5b5061051b6004803603810190808035600019169060200190929190505050612360565b60405180826000191660001916815260200191505060405180910390f35b34801561054557600080fd5b5061054e612378565b005b34801561055c57600080fd5b5061057f6004803603810190808035600019169060200190929190505050612436565b604051808215151515815260200191505060405180910390f35b3480156105a557600080fd5b506105ae612840565b604051808215151515815260200191505060405180910390f35b3480156105d457600080fd5b50610613600480360381019080803560001916906020019092919080356000191690602001909291908035600019169060200190929190505050612853565b604051808215151515815260200191505060405180910390f35b34801561063957600080fd5b50610678600480360381019080803560001916906020019092919080356000191690602001909291908035600019169060200190929190505050612db2565b604051808215151515815260200191505060405180910390f35b34801561069e57600080fd5b506106a7613199565b005b3480156106b557600080fd5b506106ea600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613259565b604051808215151515815260200191505060405180910390f35b34801561071057600080fd5b50610719613cc8565b604051808215151515815260200191505060405180910390f35b34801561073f57600080fd5b50610748613fb0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561079657600080fd5b50610874600480360381019080803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050613fd5565b604051808215151515815260200191505060405180910390f35b34801561089a57600080fd5b506108cf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614602565b604051808381526020018281526020019250505060405180910390f35b3480156108f857600080fd5b5061092d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614626565b604051808215151515815260200191505060405180910390f35b34801561095357600080fd5b50610988600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506149aa565b60405180851515151581526020018415151515815260200183151515158152602001826000191660001916815260200194505050505060405180910390f35b3480156109d357600080fd5b506109f66004803603810190808035600019169060200190929190505050614a01565b6040518087600019166000191681526020018660001916600019168152602001851515151581526020018415151515815260200183600019166000191681526020018260001916600019168152602001965050505050505060405180910390f35b348015610a6357600080fd5b50610abb60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050614a57565b005b348015610ac957600080fd5b50610ad2614cfe565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b2057600080fd5b50610b55600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614d24565b005b348015610b6357600080fd5b50610b6c614e79565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bba57600080fd5b50610bfd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050614e9f565b6040518082815260200191505060405180910390f35b60066020528060005260406000206000915090505481565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d085750600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b1515610d7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6d757374206265206f776e6572206f7220616e2069726e2061646d696e00000081525060200191505060405180910390fd5b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060000160009054906101000a900460ff16151515610e44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f616c726561647920616e2069726e2061646d696e00000000000000000000000081525060200191505060405180910390fd5b8060000160019054906101000a900460ff16151515610ecb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616c72656164792061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b8060000160029054906101000a900460ff16151515610f52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f616c726561647920616e2069726e206e6f64650000000000000000000000000081525060200191505060405180910390fd5b6000600102816001015460001916141515610fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f616c72656164792061737369676e65642061206d656d6265722069640000000081525060200191505060405180910390fd5b858160000160006101000a81548160ff021916908315150217905550848160000160016101000a81548160ff021916908315150217905550838160000160026101000a81548160ff021916908315150217905550828160010181600019169055508060000160019054906101000a900460ff16156113625760006001028360001916141515156110cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d616e756661637475726572206964206973207265717569726564000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166007600083600101546000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6d616e75666163747572657220697320616c72656164792061737369676e656481525060200191505060405180910390fd5b866007600083600101546000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154141561136157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a10a77826040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156112df57600080fd5b505af11580156112f3573d6000803e3d6000fd5b505050506040513d602081101561130957600080fd5b8101908080519060200190929190505050600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b5b82600019168773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdb4fd010b1822efc1cfe6c978216999bda713c5f143d17f2e142d61d79c2cfaf60405160405180910390a4600191505095945050505050565b600080600080859250600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634c41a6c76040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561145e57600080fd5b505af1158015611472573d6000803e3d6000fd5b505050506040513d602081101561148857600080fd5b810190808051906020019092919050505091506000851180156114aa57508185105b156115c457600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561153557600080fd5b505af1158015611549573d6000803e3d6000fd5b505050506040513d602081101561155f57600080fd5b810190808051906020019092919050505060ff16600a0a90506115c161158e8284614ec490919063ffffffff16565b6115b36115a48489614ec490919063ffffffff16565b89614ec490919063ffffffff16565b614efc90919063ffffffff16565b92505b82935050505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561162d57600080fd5b60006001028360001916141515156116ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5f6d616e7566616374757265724964206973207265717569726564000000000081525060200191505060405180910390fd5b600960008460001916600019168152602001908152602001600020546000191682600019161415151561176e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f5f6e657744656661756c7453636f72652073686f756c6420626520646966666581526020017f72656e740000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b81600960008560001916600019168152602001908152602001600020816000191690555082600019163373ffffffffffffffffffffffffffffffffffffffff167f06d7e68cd9327cfb10eceecb9d9ad605c95ee202de1c6c65dbe0436ef4a5e6138460405180826000191660001916815260200191505060405180910390a36001905092915050565b6000806000806000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000876000191660001916815260200190815260200160002054925060009150600083111561187d5761187a8343614f1290919063ffffffff16565b91505b6118c9600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154836113cf565b90506119b160646119a3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aaabdf166040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561195957600080fd5b505af115801561196d573d6000803e3d6000fd5b505050506040513d602081101561198357600080fd5b810190808051906020019092919050505084614ec490919063ffffffff16565b614efc90919063ffffffff16565b94506119c68582614f1290919063ffffffff16565b9350505050935093915050565b6000806000600102846000191614151515611a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d616e756661637475726572496420697320726571756972656400000000000081525060200191505060405180910390fd5b600083111515611ace576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f616d6f756e74206973207265717569726564000000000000000000000000000081525060200191505060405180910390fd5b60076000856000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b4857600080fd5b611b528184614f2b565b8073ffffffffffffffffffffffffffffffffffffffff1684600019163373ffffffffffffffffffffffffffffffffffffffff167f811880d278d5f75cf96199a9c79c2fa6e8eebee04e2afda088a7b1dd765889bb866040518082815260200191505060405180910390a4600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611cb557600080fd5b505af1158015611cc9573d6000803e3d6000fd5b505050506040513d6020811015611cdf57600080fd5b81019080805190602001909291905050501515611cfb57600080fd5b600191505092915050565b600080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff161515611dcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b60008314151515611e46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6e6577526577617264206973207265717569726564000000000000000000000081525060200191505060405180910390fd5b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905082816001015414151515611f03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6e65775265776172642073686f756c6420626520646966666572656e7400000081525060200191505060405180910390fd5b8281600101819055503373ffffffffffffffffffffffffffffffffffffffff167f78b008c8623496713f0a108a67aa2804f75d388bf5f12cd93e8a5bb404b579e5846040518082815260200191505060405180910390a26001915050919050565b6000611f6e615c51565b6000806000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900460ff161515612037576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6d75737420626520616e2069726e206e6f64650000000000000000000000000081525060200191505060405180910390fd5b600060149054906101000a900460ff1615151561205357600080fd5b61205d8787614fca565b93506007600085600001516000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561216c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f5f6d616e75666163747572657257616c6c65742063616e6e6f7420626520307881526020017f300000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f6d616e756661637475726572732063616e6e6f7420636f6c6c6563742074686581526020017f2066756c6c20726577617264000000000000000000000000000000000000000081525060400191505060405180910390fd5b6122413384896117f7565b80925081935050506122548333846152be565b61225f8384836152be565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1688600019167f623469fb6c872fc53daa40e4a20f7eb2fc3fe6816dacc59ad6f3b924f679174587602001518a8787604051808560001916600019168152602001846000191660001916815260200183815260200182815260200194505050505060405180910390a443600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000896000191660001916815260200190815260200160002081905550600194505050505092915050565b60096020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156123d357600080fd5b600060149054906101000a900460ff1615156123ee57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600080612441615c51565b60008060149054906101000a900460ff1615151561245e57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166377d630ae6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156124e457600080fd5b505af11580156124f8573d6000803e3d6000fd5b505050506040513d602081101561250e57600080fd5b8101908080519060200190929190505050925061252a8561546b565b915081600001516000191685600019163373ffffffffffffffffffffffffffffffffffffffff167fba2136e45a61f966f69316c7c8ff08dc8ffb4886fc5d9027314755ee1a6238578686602001516040518083815260200182600019166000191681526020019250505060405180910390a46007600083600001516000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6d616e75666163747572657220697320756e6b6e6f776e00000000000000000081525060200191505060405180910390fd5b61268c8184614f2b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561278557600080fd5b505af1158015612799573d6000803e3d6000fd5b505050506040513d60208110156127af57600080fd5b81019080805190602001909291905050501515612834576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b60019350505050919050565b600060149054906101000a900460ff1681565b600080600080612861615c51565b600080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff161515612928576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600060149054906101000a900460ff1615151561294457600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314c44e096040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b505050506040513d60208110156129f457600080fd5b81019080805190602001909291905050509550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166377d630ae6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612a8d57600080fd5b505af1158015612aa1573d6000803e3d6000fd5b505050506040513d6020811015612ab757600080fd5b810190808051906020019092919050505094508960405180826000191660001916815260200191505060405180910390209350612af633858b8b6156f5565b925082600001519150816000191684600019163373ffffffffffffffffffffffffffffffffffffffff167f0eb7a49a7f427b424a9fe87d487fd12d3f155c956145b0ac06a72ea85235e7d5898d6040518083815260200182600019166000191681526020019250505060405180910390a4612b708a61546b565b925081600019168a600019163373ffffffffffffffffffffffffffffffffffffffff167fba2136e45a61f966f69316c7c8ff08dc8ffb4886fc5d9027314755ee1a623857888d6040518083815260200182600019166000191681526020019250505060405180910390a4612bed8587615c3590919063ffffffff16565b9050612bf93382614f2b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612cf257600080fd5b505af1158015612d06573d6000803e3d6000fd5b505050506040513d6020811015612d1c57600080fd5b81019080805190602001909291905050501515612da1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b600196505050505050509392505050565b600080612dbd615c51565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff161515612e81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600060149054906101000a900460ff16151515612e9d57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314c44e096040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612f2357600080fd5b505af1158015612f37573d6000803e3d6000fd5b505050506040513d6020811015612f4d57600080fd5b81019080805190602001909291905050509150612f6c338787876156f5565b905080600001516000191686600019163373ffffffffffffffffffffffffffffffffffffffff167f0eb7a49a7f427b424a9fe87d487fd12d3f155c956145b0ac06a72ea85235e7d585896040518083815260200182600019166000191681526020019250505060405180910390a4612fe43383614f2b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156130dd57600080fd5b505af11580156130f1573d6000803e3d6000fd5b505050506040513d602081101561310757600080fd5b8101908080519060200190929190505050151561318c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b6001925050509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156131f457600080fd5b600060149054906101000a900460ff1615151561321057600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000613263615c98565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff161515613327576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156133cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6e657720616464726573732063616e6e6f74206265203078300000000000000081525060200191505060405180910390fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020608060405190810160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff161515151581526020016000820160029054906101000a900460ff1615151515815260200160018201546000191660001916815250509050806020015180156134995750600060010281606001516000191614155b151561350d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff161515156135d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f616c726561647920616e2069726e2061646d696e00000000000000000000000081525060200191505060405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff16151515613697576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616c72656164792061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900460ff1615151561375c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f616c726561647920616e2069726e206e6f64650000000000000000000000000081525060200191505060405180910390fd5b6000600102600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000191614151561381d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6d656d626572496420616c72656164792065786973747300000000000000000081525060200191505060405180910390fd5b608060405190810160405280826000015115158152602001826020015115158152602001826040015115158152602001826060015160001916815250600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff021916908315150217905550606082015181600101906000191690559050506000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414801561399f57506000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154145b1515613a13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6e657720746f6b656e20706f6f6c20616c72656164792065786973747300000081525060200191505060405180910390fd5b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090555050826007600083606001516000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549060ff02191690556000820160026101000a81549060ff0219169055600182016000905550508060600151600019168373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcd2abdf6b4e963e07e9584816486597def4b3ec7dee88f7f66ad7dfb2c40d79e60405160405180910390a46001915050919050565b600080600060149054906101000a900460ff16151515613ce757600080fd5b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111515613da1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f616d6f756e74206973207a65726f00000000000000000000000000000000000081525060200191505060405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040518082815260200191505060405180910390a2600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613ef957600080fd5b505af1158015613f0d573d6000803e3d6000fd5b505050506040513d6020811015613f2357600080fd5b81019080805190602001909291905050501515613fa8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f746f6b656e207472616e73666572206661696c6564000000000000000000000081525060200191505060405180910390fd5b600191505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000613fe8615c51565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff1615156140ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600060149054906101000a900460ff161515156140c857600080fd5b60008b51111515614141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6174206c65617374206f6e65206465766963652069732072657175697265640081525060200191505060405180910390fd5b89518b511415156141e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f6465766963652074797065206172726179206e6565647320746f20626520736181526020017f6d652073697a652061732064657669636573000000000000000000000000000081525060400191505060405180910390fd5b88518b5114151561427f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f646576696365207075626c6963206b6579206172726179206e6565647320746f81526020017f2062652073616d652073697a652061732064657669636573000000000000000081525060400191505060405180910390fd5b60009650600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314c44e096040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561430957600080fd5b505af115801561431d573d6000803e3d6000fd5b505050506040513d602081101561433357600080fd5b81019080805190602001909291905050509550600094505b8a5185101561443e578a8581518110151561436257fe5b906020019060200201519350898581518110151561437c57fe5b906020019060200201519250888581518110151561439657fe5b9060200190602002015191506143ae338585856156f5565b905080600001516000191684600019163373ffffffffffffffffffffffffffffffffffffffff167f0eb7a49a7f427b424a9fe87d487fd12d3f155c956145b0ac06a72ea85235e7d589876040518083815260200182600019166000191681526020019250505060405180910390a461442f8688615c3590919063ffffffff16565b9650848060010195505061434b565b6144483388614f2b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308a6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561454157600080fd5b505af1158015614555573d6000803e3d6000fd5b505050506040513d602081101561456b57600080fd5b810190808051906020019092919050505015156145f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b60019750505050505050509392505050565b60056020528060005260406000206000915090508060000154908060010154905082565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806146d05750600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b1515614744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6d757374206265206f776e6572206f7220616e2069726e2061646d696e00000081525060200191505060405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff16156148bb576000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561487c57600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905550505b60076000826000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549060ff02191690556000820160026101000a81549060ff02191690556001820160009055505080600019168373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdb9b3d3fa67ccdd9e527c3495268d215a339f094b8e0997c3bc9eef209a5016060405160405180910390a46001915050919050565b60046020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060010154905084565b60036020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900460ff16908060020160019054906101000a900460ff16908060030154908060040154905086565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614ab757600080fd5b600092505b8351831015614cc4578383815181101515614ad357fe5b9060200190602002015191508173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015614b7a57600080fd5b505af1158015614b8e573d6000803e3d6000fd5b505050506040513d6020811015614ba457600080fd5b810190808051906020019092919050505090508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614c7b57600080fd5b505af1158015614c8f573d6000803e3d6000fd5b505050506040513d6020811015614ca557600080fd5b8101908080519060200190929190505050508280600101935050614abc565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614d7f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614dbb57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6008602052816000526040600020602052806000526040600020600091509150505481565b600080831415614ed75760009050614ef6565b8183029050818382811515614ee857fe5b04141515614ef257fe5b8090505b92915050565b60008183811515614f0957fe5b04905092915050565b6000828211151515614f2057fe5b818303905092915050565b614f8081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154615c3590919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505050565b614fd2615c51565b600080600102846000191614151515615053576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f64657669636520696420697320656d707479000000000000000000000000000081525060200191505060405180910390fd5b600360008560405180826000191660001916815260200191505060405180910390206000191660001916815260200190815260200160002090508060020160009054906101000a900460ff161515615113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f6e6f74207265676973746572656400000000000000000000000000000000000081525060200191505060405180910390fd5b8060020160019054906101000a900460ff161515615199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f74206163746976617465640000000000000000000000000000000000000081525060200191505060405180910390fd5b82600019168160030154600019161415151561521d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6e65772073636f7265206e6565647320746f20626520646966666572656e740081525060200191505060405180910390fd5b828160030181600019169055508060c060405190810160405290816000820154600019166000191681526020016001820154600019166000191681526020016002820160009054906101000a900460ff161515151581526020016002820160019054906101000a900460ff16151515158152602001600382015460001916600019168152602001600482015460001916600019168152505091505092915050565b600081111515615336576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5f616d6f756e742069732072657175697265640000000000000000000000000081525060200191505060405180910390fd5b61538b81600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154614f1290919063ffffffff16565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061542381600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615c3590919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b615473615c51565b600080836040518082600019166000191681526020019150506040518091039020915060036000836000191660001916815260200190815260200160002090508060020160009054906101000a900460ff161515615539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f6e6f74207265676973746572656400000000000000000000000000000000000081525060200191505060405180910390fd5b8060020160019054906101000a900460ff161515156155c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f616c72656164792061637469766174656400000000000000000000000000000081525060200191505060405180910390fd5b600060010281600001546000191614151515615644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6e6f206d616e7566616374757265722069642077617320666f756e640000000081525060200191505060405180910390fd5b60018160020160016101000a81548160ff0219169083151502179055508060c060405190810160405290816000820154600019166000191681526020016001820154600019166000191681526020016002820160009054906101000a900460ff161515151581526020016002820160019054906101000a900460ff16151515158152602001600382015460001916600019168152602001600482015460001916600019168152505092505050919050565b6156fd615c51565b600080600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141515156157a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6d616e756661637475726572206973207265717569726564000000000000000081525060200191505060405180910390fd5b6000600102866000191614151515615825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f646576696365206964206861736820697320726571756972656400000000000081525060200191505060405180910390fd5b60006001028560001916141515156158a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f646576696365207479706520697320726571756972656400000000000000000081525060200191505060405180910390fd5b6000600102846000191614151515615925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f646576696365207075626c6963206b657920697320726571756972656400000081525060200191505060405180910390fd5b60036000876000191660001916815260200190815260200160002091508160020160009054906101000a900460ff161515156159c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f64657669636520697320616c726561647920726567697374657265640000000081525060200191505060405180910390fd5b8160020160019054906101000a900460ff16151515615a50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f64657669636520697320616c726561647920616374697661746564000000000081525060200191505060405180910390fd5b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000600102816000191614151515615b15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d616e75666163747572657220696420697320756e6b6e6f776e00000000000081525060200191505060405180910390fd5b808260000181600019169055508482600101816000191690555060018260020160006101000a81548160ff02191690831515021790555060008260020160016101000a81548160ff02191690831515021790555060096000826000191660001916815260200190815260200160002054826003018160001916905550838260040181600019169055508160c060405190810160405290816000820154600019166000191681526020016001820154600019166000191681526020016002820160009054906101000a900460ff161515151581526020016002820160019054906101000a900460ff16151515158152602001600382015460001916600019168152602001600482015460001916600019168152505092505050949350505050565b60008183019050828110151515615c4857fe5b80905092915050565b60c060405190810160405280600080191681526020016000801916815260200160001515815260200160001515815260200160008019168152602001600080191681525090565b6080604051908101604052806000151581526020016000151581526020016000151581526020016000801916815250905600a165627a7a723058204d2ff784448524fb6edf8e9272a47100642593d626e1d13ec6015e6dfe28949b002900000000000000000000000097aeb5066e1a590e868b511457beb6fe99d329f50000000000000000000000002566c658331eac75d3b3ccd0e45c78d9cf6c4c4c

    Constructor Arguments (ABI-encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000097aeb5066e1a590e868b511457beb6fe99d329f50000000000000000000000002566c658331eac75d3b3ccd0e45c78d9cf6c4c4c

-----Decoded View---------------
Found 2 constructor arguments :
Arg [0] : 00000000000000000000000097aeb5066e1a590e868b511457beb6fe99d329f5
Arg [1] : 0000000000000000000000002566c658331eac75d3b3ccd0e45c78d9cf6c4c4c


   Swarm Source:
bzzr://4d2ff784448524fb6edf8e9272a47100642593d626e1d13ec6015e6dfe28949b

 

View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.