Contract 0x5f25233ca99104d31612d4fb937b090d5a2ebb75

Contract Overview

Balance:
0 Ether
TxHash Block Age From To Value [TxFee]
0xe3c6289215b16ef51eef26b96a01681aaaa7a9699fb593e4cb6d0e6d9324b6178847806175 days 14 hrs ago0xfa3d5d64bb36aa097f893220a147e2d4f4ffa616 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0xd12c015f0359242ba099ad9adf8ca27932a3f46963aa34c96df9fedfcf8f41098847805175 days 14 hrs ago0xa1dbaf8bb7cd6986e15cd3f38881d10813ce117e IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000432992
0x55511ec4280263c7fa017678c4d1b829a010503937a5f609124da0b3590821358847804175 days 14 hrs ago0x794080d5c79b87f9c71614b3dafd70b78331d355 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000432992
0xeae1e87070cd226829d17f2289335bf4354fbc73ba7030cf13ad33214411ba4f8847803175 days 14 hrs ago0xfa3d5d64bb36aa097f893220a147e2d4f4ffa616 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0xc3b7375fb8773b3fde4e7ec55c789cde3daacebd55c86c298e41ffd69d52aa0d8847803175 days 14 hrs ago0x1c10f9e67c5ea5ef60ab38cbf9f744a19de27e69 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0x0ed9e26ad5aca8e4a88c2badf05166f392c063089f0f27c3671f76caf8522e948847802175 days 14 hrs ago0xa1dbaf8bb7cd6986e15cd3f38881d10813ce117e IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0xedadc6d1ce88a7a2f1a0a8fa02dbbd030b3620079bb4f117476cbbb9857bc9ba8847801175 days 14 hrs ago0xfa3d5d64bb36aa097f893220a147e2d4f4ffa616 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0xf061d1b5df61a8e4a48dfe90b3f6ca85f3bf1c44026798f6f674eff7b96bb1268847799175 days 14 hrs ago0xa1dbaf8bb7cd6986e15cd3f38881d10813ce117e IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000432992
0xcedca3cba3e4269d07b6771ed954a90385413414a897dca3af1a1b98c9851f6d8847798175 days 14 hrs ago0x1c10f9e67c5ea5ef60ab38cbf9f744a19de27e69 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0x5e091ccb0f10e7abdc5b8a7d9d312ff2423f8f3c586f57dca7e7a54c4c1b5d998847798175 days 14 hrs ago0x794080d5c79b87f9c71614b3dafd70b78331d355 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000432992
0x143407ff90a26b60338354a29a64d0bb32626ebbd950b4f704202023ff5e25768847797175 days 14 hrs ago0xfa3d5d64bb36aa097f893220a147e2d4f4ffa616 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0xc98829b12296ff9331c6030259914302a2bb9120a7affe9118bd1da7043da7698847796175 days 14 hrs ago0xa1dbaf8bb7cd6986e15cd3f38881d10813ce117e IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0xa2165bca9b699d92562e650a31d1daf811a37ef01c862a339232f22423765d6c8847795175 days 14 hrs ago0xfa3d5d64bb36aa097f893220a147e2d4f4ffa616 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0x0ad3c59c20d3cce5880f15165801cb87cbb7a6fc4195fbd8b73e174f7b841cf88847793175 days 14 hrs ago0x1c10f9e67c5ea5ef60ab38cbf9f744a19de27e69 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0x98fa8c3a87d9fcbeeea3e801616fba0c3440ad85dd4cedaef5336b56ed60cf358847793175 days 14 hrs ago0x794080d5c79b87f9c71614b3dafd70b78331d355 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000432992
0xa9b7322e884a5088a58e9384a871cec7709338b15ff0ff80694afa9fcb486d618847793175 days 14 hrs ago0xa1dbaf8bb7cd6986e15cd3f38881d10813ce117e IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000432992
0x59921687c46f4db52672ee32159753a6a3535e2978f026a56a2482047bf907fa8847791175 days 14 hrs ago0xfa3d5d64bb36aa097f893220a147e2d4f4ffa616 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0x0f0bb865887d54a04f7aa13a4266888fe03a46a5a319ae0d18d45afa0b1035628847791175 days 14 hrs ago0xa1dbaf8bb7cd6986e15cd3f38881d10813ce117e IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0xae4895cb06870efc8a22fb0f978192ed112b5f97ed12da1fa12f69dd7e28cb1d8847790175 days 14 hrs ago0xfa3d5d64bb36aa097f893220a147e2d4f4ffa616 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0x400f8016ee8af2028b41c7b9c36100e23e69eba1b973f84599fe0400c48a99488847788175 days 14 hrs ago0x794080d5c79b87f9c71614b3dafd70b78331d355 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000432992
0x896f6f15e505349a7c34796a1094336a8cdf9f3769154055bc08ed343204f8cb8847788175 days 14 hrs ago0xa1dbaf8bb7cd6986e15cd3f38881d10813ce117e IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000432992
0x13b943add3dcb32cf4ef5ffc69fb6201b12ed27814f7047a54b7aadad281ad288847787175 days 14 hrs ago0x1c10f9e67c5ea5ef60ab38cbf9f744a19de27e69 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0x1c464458d20aefa28d5b22e1d181d5e963eea074979751aa78b4e68add9faafb8847785175 days 14 hrs ago0xfa3d5d64bb36aa097f893220a147e2d4f4ffa616 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0x0a6dca4c5800d3576ebb74d99aba0fb2e14a44cd39d16efbd4da87862749a5098847785175 days 14 hrs ago0xa1dbaf8bb7cd6986e15cd3f38881d10813ce117e IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
0xa3b68ba44207e389aee59b22755e60a559b6842ff920e8dcde4d389c093f731a8847784175 days 14 hrs ago0xfa3d5d64bb36aa097f893220a147e2d4f4ffa616 IN  0x5f25233ca99104d31612d4fb937b090d5a2ebb750 Ether0.000433504
[ Download CSV Export 

Latest 25 internal transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0xe3c6289215b16ef51eef26b96a01681aaaa7a9699fb593e4cb6d0e6d9324b6178847806175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750xa95de870ddfb6188519d5cc63ced5e0fbac1aa8e0 Ether
0xe3c6289215b16ef51eef26b96a01681aaaa7a9699fb593e4cb6d0e6d9324b6178847806175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0xe3c6289215b16ef51eef26b96a01681aaaa7a9699fb593e4cb6d0e6d9324b6178847806175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0xe3c6289215b16ef51eef26b96a01681aaaa7a9699fb593e4cb6d0e6d9324b6178847806175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x160eca47935be4139ec5b94d99b678d6f7e18f950 Ether
0xe3c6289215b16ef51eef26b96a01681aaaa7a9699fb593e4cb6d0e6d9324b6178847806175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x160eca47935be4139ec5b94d99b678d6f7e18f950 Ether
0xe3c6289215b16ef51eef26b96a01681aaaa7a9699fb593e4cb6d0e6d9324b6178847806175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0xd12c015f0359242ba099ad9adf8ca27932a3f46963aa34c96df9fedfcf8f41098847805175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750xa95de870ddfb6188519d5cc63ced5e0fbac1aa8e0 Ether
0xd12c015f0359242ba099ad9adf8ca27932a3f46963aa34c96df9fedfcf8f41098847805175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0xd12c015f0359242ba099ad9adf8ca27932a3f46963aa34c96df9fedfcf8f41098847805175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0xd12c015f0359242ba099ad9adf8ca27932a3f46963aa34c96df9fedfcf8f41098847805175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x160eca47935be4139ec5b94d99b678d6f7e18f950 Ether
0xd12c015f0359242ba099ad9adf8ca27932a3f46963aa34c96df9fedfcf8f41098847805175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x160eca47935be4139ec5b94d99b678d6f7e18f950 Ether
0xd12c015f0359242ba099ad9adf8ca27932a3f46963aa34c96df9fedfcf8f41098847805175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0x55511ec4280263c7fa017678c4d1b829a010503937a5f609124da0b3590821358847804175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750xa95de870ddfb6188519d5cc63ced5e0fbac1aa8e0 Ether
0x55511ec4280263c7fa017678c4d1b829a010503937a5f609124da0b3590821358847804175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0x55511ec4280263c7fa017678c4d1b829a010503937a5f609124da0b3590821358847804175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0x55511ec4280263c7fa017678c4d1b829a010503937a5f609124da0b3590821358847804175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x160eca47935be4139ec5b94d99b678d6f7e18f950 Ether
0x55511ec4280263c7fa017678c4d1b829a010503937a5f609124da0b3590821358847804175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x160eca47935be4139ec5b94d99b678d6f7e18f950 Ether
0x55511ec4280263c7fa017678c4d1b829a010503937a5f609124da0b3590821358847804175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0xeae1e87070cd226829d17f2289335bf4354fbc73ba7030cf13ad33214411ba4f8847803175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750xa95de870ddfb6188519d5cc63ced5e0fbac1aa8e0 Ether
0xeae1e87070cd226829d17f2289335bf4354fbc73ba7030cf13ad33214411ba4f8847803175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0xeae1e87070cd226829d17f2289335bf4354fbc73ba7030cf13ad33214411ba4f8847803175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0xeae1e87070cd226829d17f2289335bf4354fbc73ba7030cf13ad33214411ba4f8847803175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x160eca47935be4139ec5b94d99b678d6f7e18f950 Ether
0xeae1e87070cd226829d17f2289335bf4354fbc73ba7030cf13ad33214411ba4f8847803175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x160eca47935be4139ec5b94d99b678d6f7e18f950 Ether
0xeae1e87070cd226829d17f2289335bf4354fbc73ba7030cf13ad33214411ba4f8847803175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750x376127adc18260fc238ebfb6626b2f4b59ec9b660 Ether
0xc3b7375fb8773b3fde4e7ec55c789cde3daacebd55c86c298e41ffd69d52aa0d8847803175 days 14 hrs ago0x5f25233ca99104d31612d4fb937b090d5a2ebb750xa95de870ddfb6188519d5cc63ced5e0fbac1aa8e0 Ether
[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: RenExSettlement
Compiler Version: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
pragma solidity 0.4.24;

/**
 * @title Math
 * @dev Assorted math operations
 */
library Math {
    function max64(uint64 a, uint64 b) internal pure returns (uint64) {
        return a >= b ? a : b;
    }

    function min64(uint64 a, uint64 b) internal pure returns (uint64) {
        return a < b ? a : b;
    }

    function max256(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    function min256(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
}

/**
 * @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 OwnershipRenounced(address indexed previousOwner);
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
    * @dev The Ownable constructor sets the original `owner` of the contract to the sender
    * account.
    */
    constructor() 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 relinquish control of the contract.
    * @notice Renouncing to ownership will leave the contract without an owner.
    * It will not be possible to call the functions with the `onlyOwner`
    * modifier anymore.
    */
    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(owner);
        owner = address(0);
    }

    /**
    * @dev Allows the current owner to transfer control of the contract to a newOwner.
    * @param _newOwner The address to transfer ownership to.
    */
    function transferOwnership(address _newOwner) public onlyOwner {
        _transferOwnership(_newOwner);
    }

    /**
    * @dev Transfers control of the contract to a newOwner.
    * @param _newOwner The address to transfer ownership to.
    */
    function _transferOwnership(address _newOwner) internal {
        require(_newOwner != address(0));
        emit OwnershipTransferred(owner, _newOwner);
        owner = _newOwner;
    }
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        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;
    }
}

/// @notice The Orderbook contract stores the state and priority of orders and
/// allows the Darknodes to easily reach consensus. Eventually, this contract
/// will only store a subset of order states, such as cancellation, to improve
/// the throughput of orders.
contract Orderbook  {
    /// @notice OrderState enumerates the possible states of an order. All
    /// orders default to the Undefined state.
    enum OrderState {Undefined, Open, Confirmed, Canceled}

    /// @notice returns a list of matched orders to the given orderID.
    function orderMatch(bytes32 _orderID) external view returns (bytes32);

    /// @notice returns the trader of the given orderID.
    /// Trader is the one who signs the message and does the actual trading.
    function orderTrader(bytes32 _orderID) external view returns (address);

    /// @notice returns status of the given orderID.
    function orderState(bytes32 _orderID) external view returns (OrderState);

    /// @notice returns the darknode address which confirms the given orderID.
    function orderConfirmer(bytes32 _orderID) external view returns (address);
}


/// @notice RenExTokens is a registry of tokens that can be traded on RenEx.
contract RenExTokens is Ownable {
    struct TokenDetails {
        address addr;
        uint8 decimals;
        bool registered;
    }

    mapping(uint32 => TokenDetails) public tokens;

    /// @notice Allows the owner to register and the details for a token.
    /// Once details have been submitted, they cannot be overwritten.
    /// To re-register the same token with different details (e.g. if the address
    /// has changed), a different token identifier should be used and the
    /// previous token identifier should be deregistered.
    /// If a token is not Ethereum-based, the address will be set to 0x0.
    ///
    /// @param _tokenCode A unique 32-bit token identifier.
    /// @param _tokenAddress The address of the token.
    /// @param _tokenDecimals The decimals to use for the token.
    function registerToken(uint32 _tokenCode, address _tokenAddress, uint8 _tokenDecimals) public onlyOwner;

    /// @notice Sets a token as being deregistered. The details are still stored
    /// to prevent the token from being re-registered with different details.
    ///
    /// @param _tokenCode The unique 32-bit token identifier.
    function deregisterToken(uint32 _tokenCode) external onlyOwner;
}


/// @notice RenExBalances is responsible for holding RenEx trader funds.
contract RenExBalances {
    address public settlementContract;

    /// @notice Restricts a function to only being called by the RenExSettlement
    /// contract.
    modifier onlyRenExSettlementContract() {
        require(msg.sender == address(settlementContract), "not authorized");
        _;
    }

    /// @notice Transfer a token value from one trader to another, transferring
    /// a fee to the RewardVault. Can only be called by the RenExSettlement
    /// contract.
    ///
    /// @param _traderFrom The address of the trader to decrement the balance of.
    /// @param _traderTo The address of the trader to increment the balance of.
    /// @param _token The token's address.
    /// @param _value The number of tokens to decrement the balance by (in the
    ///        token's smallest unit).
    /// @param _fee The fee amount to forward on to the RewardVault.
    /// @param _feePayee The recipient of the fee.
    function transferBalanceWithFee(address _traderFrom, address _traderTo, address _token, uint256 _value, uint256 _fee, address _feePayee)
    external onlyRenExSettlementContract;
}


/// @notice A library for calculating and verifying order match details
library SettlementUtils {

    struct OrderDetails {
        uint64 settlementID;
        uint64 tokens;
        uint256 price;
        uint256 volume;
        uint256 minimumVolume;
    }

    /// @notice Calculates the ID of the order.
    /// @param details Order details that are not required for settlement
    ///        execution. They are combined as a single byte array.
    /// @param order The order details required for settlement execution.
    function hashOrder(bytes details, OrderDetails memory order) internal pure returns (bytes32) {
        return keccak256(
            abi.encodePacked(
                details,
                order.settlementID,
                order.tokens,
                order.price,
                order.volume,
                order.minimumVolume
            )
        );
    }

    /// @notice Verifies that two orders match when considering the tokens,
    /// price, volumes / minimum volumes and settlement IDs. verifyMatchDetails is used
    /// my the DarknodeSlasher to verify challenges. Settlement layers may also
    /// use this function.
    /// @dev When verifying two orders for settlement, you should also:
    ///   1) verify the orders have been confirmed together
    ///   2) verify the orders' traders are distinct
    /// @param _buy The buy order details.
    /// @param _sell The sell order details.
    function verifyMatchDetails(OrderDetails memory _buy, OrderDetails memory _sell) internal pure returns (bool) {

        // Buy and sell tokens should match
        if (!verifyTokens(_buy.tokens, _sell.tokens)) {
            return false;
        }

        // Buy price should be greater than sell price
        if (_buy.price < _sell.price) {
            return false;
        }

        // // Buy volume should be greater than sell minimum volume
        if (_buy.volume < _sell.minimumVolume) {
            return false;
        }

        // Sell volume should be greater than buy minimum volume
        if (_sell.volume < _buy.minimumVolume) {
            return false;
        }

        // Require that the orders were submitted to the same settlement layer
        if (_buy.settlementID != _sell.settlementID) {
            return false;
        }

        return true;
    }

    /// @notice Verifies that two token requirements can be matched and that the
    /// tokens are formatted correctly.
    /// @param _buyTokens The buy token details.
    /// @param _sellToken The sell token details.
    function verifyTokens(uint64 _buyTokens, uint64 _sellToken) internal pure returns (bool) {
        return ((
                uint32(_buyTokens) == uint32(_sellToken >> 32)) && (
                uint32(_sellToken) == uint32(_buyTokens >> 32)) && (
                uint32(_buyTokens >> 32) <= uint32(_buyTokens))
        );
    }
}

/// @notice RenExSettlement implements the Settlement interface. It implements
/// the on-chain settlement for the RenEx settlement layer, and the fee payment
/// for the RenExAtomic settlement layer.
contract RenExSettlement is Ownable {
    using SafeMath for uint256;

    string public VERSION; // Passed in as a constructor parameter.

    // This contract handles the settlements with ID 1 and 2.
    uint32 constant public RENEX_SETTLEMENT_ID = 1;
    uint32 constant public RENEX_ATOMIC_SETTLEMENT_ID = 2;

    // Fees in RenEx are 0.2%. To represent this as integers, it is broken into
    // a numerator and denominator.
    uint256 constant public DARKNODE_FEES_NUMERATOR = 2;
    uint256 constant public DARKNODE_FEES_DENOMINATOR = 1000;

    // Constants used in the price / volume inputs.
    int16 constant private PRICE_OFFSET = 12;
    int16 constant private VOLUME_OFFSET = 12;

    // Constructor parameters, updatable by the owner
    Orderbook public orderbookContract;
    RenExTokens public renExTokensContract;
    RenExBalances public renExBalancesContract;
    address public slasherAddress;
    uint256 public submissionGasPriceLimit;

    enum OrderStatus {None, Submitted, Settled, Slashed}

    struct TokenPair {
        RenExTokens.TokenDetails priorityToken;
        RenExTokens.TokenDetails secondaryToken;
    }

    // A uint256 tuple representing a value and an associated fee
    struct ValueWithFees {
        uint256 value;
        uint256 fees;
    }

    // A uint256 tuple representing a fraction
    struct Fraction {
        uint256 numerator;
        uint256 denominator;
    }

    // We use left and right because the tokens do not always represent the
    // priority and secondary tokens.
    struct SettlementDetails {
        uint256 leftVolume;
        uint256 rightVolume;
        uint256 leftTokenFee;
        uint256 rightTokenFee;
        address leftTokenAddress;
        address rightTokenAddress;
    }

    // Events
    event LogOrderbookUpdated(Orderbook previousOrderbook, Orderbook nextOrderbook);
    event LogRenExTokensUpdated(RenExTokens previousRenExTokens, RenExTokens nextRenExTokens);
    event LogRenExBalancesUpdated(RenExBalances previousRenExBalances, RenExBalances nextRenExBalances);
    event LogSubmissionGasPriceLimitUpdated(uint256 previousSubmissionGasPriceLimit, uint256 nextSubmissionGasPriceLimit);
    event LogSlasherUpdated(address previousSlasher, address nextSlasher);

    // Order Storage
    mapping(bytes32 => SettlementUtils.OrderDetails) public orderDetails;
    mapping(bytes32 => address) public orderSubmitter;
    mapping(bytes32 => OrderStatus) public orderStatus;

    // Match storage (match details are indexed by [buyID][sellID])
    mapping(bytes32 => mapping(bytes32 => uint256)) public matchTimestamp;

    /// @notice Prevents a function from being called with a gas price higher
    /// than the specified limit.
    ///
    /// @param _gasPriceLimit The gas price upper-limit in Wei.
    modifier withGasPriceLimit(uint256 _gasPriceLimit) {
        require(tx.gasprice <= _gasPriceLimit, "gas price too high");
        _;
    }

    /// @notice Restricts a function to only being called by the slasher
    /// address.
    modifier onlySlasher() {
        require(msg.sender == slasherAddress, "unauthorized");
        _;
    }

    /// @notice The contract constructor.
    ///
    /// @param _VERSION A string defining the contract version.
    /// @param _orderbookContract The address of the Orderbook contract.
    /// @param _renExBalancesContract The address of the RenExBalances
    ///        contract.
    /// @param _renExTokensContract The address of the RenExTokens contract.
    constructor(
        string _VERSION,
        Orderbook _orderbookContract,
        RenExTokens _renExTokensContract,
        RenExBalances _renExBalancesContract,
        address _slasherAddress,
        uint256 _submissionGasPriceLimit
    ) public {
        VERSION = _VERSION;
        orderbookContract = _orderbookContract;
        renExTokensContract = _renExTokensContract;
        renExBalancesContract = _renExBalancesContract;
        slasherAddress = _slasherAddress;
        submissionGasPriceLimit = _submissionGasPriceLimit;
    }

    /// @notice The owner of the contract can update the Orderbook address.
    /// @param _newOrderbookContract The address of the new Orderbook contract.
    function updateOrderbook(Orderbook _newOrderbookContract) external onlyOwner {
        emit LogOrderbookUpdated(orderbookContract, _newOrderbookContract);
        orderbookContract = _newOrderbookContract;
    }

    /// @notice The owner of the contract can update the RenExTokens address.
    /// @param _newRenExTokensContract The address of the new RenExTokens
    ///       contract.
    function updateRenExTokens(RenExTokens _newRenExTokensContract) external onlyOwner {
        emit LogRenExTokensUpdated(renExTokensContract, _newRenExTokensContract);
        renExTokensContract = _newRenExTokensContract;
    }
    
    /// @notice The owner of the contract can update the RenExBalances address.
    /// @param _newRenExBalancesContract The address of the new RenExBalances
    ///       contract.
    function updateRenExBalances(RenExBalances _newRenExBalancesContract) external onlyOwner {
        emit LogRenExBalancesUpdated(renExBalancesContract, _newRenExBalancesContract);
        renExBalancesContract = _newRenExBalancesContract;
    }

    /// @notice The owner of the contract can update the order submission gas
    /// price limit.
    /// @param _newSubmissionGasPriceLimit The new gas price limit.
    function updateSubmissionGasPriceLimit(uint256 _newSubmissionGasPriceLimit) external onlyOwner {
        emit LogSubmissionGasPriceLimitUpdated(submissionGasPriceLimit, _newSubmissionGasPriceLimit);
        submissionGasPriceLimit = _newSubmissionGasPriceLimit;
    }

    /// @notice The owner of the contract can update the slasher address.
    /// @param _newSlasherAddress The new slasher address.
    function updateSlasher(address _newSlasherAddress) external onlyOwner {
        emit LogSlasherUpdated(slasherAddress, _newSlasherAddress);
        slasherAddress = _newSlasherAddress;
    }

    /// @notice Stores the details of an order.
    ///
    /// @param _prefix The miscellaneous details of the order required for
    ///        calculating the order id.
    /// @param _settlementID The settlement identifier.
    /// @param _tokens The encoding of the token pair (buy token is encoded as
    ///        the first 32 bytes and sell token is encoded as the last 32
    ///        bytes).
    /// @param _price The price of the order. Interpreted as the cost for 1
    ///        standard unit of the non-priority token, in 1e12 (i.e.
    ///        PRICE_OFFSET) units of the priority token).
    /// @param _volume The volume of the order. Interpreted as the maximum
    ///        number of 1e-12 (i.e. VOLUME_OFFSET) units of the non-priority
    ///        token that can be traded by this order.
    /// @param _minimumVolume The minimum volume the trader is willing to
    ///        accept. Encoded the same as the volume.
    function submitOrder(
        bytes _prefix,
        uint64 _settlementID,
        uint64 _tokens,
        uint256 _price,
        uint256 _volume,
        uint256 _minimumVolume
    ) external withGasPriceLimit(submissionGasPriceLimit) {

        SettlementUtils.OrderDetails memory order = SettlementUtils.OrderDetails({
            settlementID: _settlementID,
            tokens: _tokens,
            price: _price,
            volume: _volume,
            minimumVolume: _minimumVolume
        });
        bytes32 orderID = SettlementUtils.hashOrder(_prefix, order);

        require(orderStatus[orderID] == OrderStatus.None, "order already submitted");
        require(orderbookContract.orderState(orderID) == Orderbook.OrderState.Confirmed, "unconfirmed order");

        orderSubmitter[orderID] = msg.sender;
        orderStatus[orderID] = OrderStatus.Submitted;
        orderDetails[orderID] = order;
    }

    /// @notice Settles two orders that are matched. `submitOrder` must have been
    /// called for each order before this function is called.
    ///
    /// @param _buyID The 32 byte ID of the buy order.
    /// @param _sellID The 32 byte ID of the sell order.
    function settle(bytes32 _buyID, bytes32 _sellID) external {
        require(orderStatus[_buyID] == OrderStatus.Submitted, "invalid buy status");
        require(orderStatus[_sellID] == OrderStatus.Submitted, "invalid sell status");

        // Check the settlement ID (only have to check for one, since
        // `verifyMatchDetails` checks that they are the same)
        require(
            orderDetails[_buyID].settlementID == RENEX_ATOMIC_SETTLEMENT_ID ||
            orderDetails[_buyID].settlementID == RENEX_SETTLEMENT_ID,
            "invalid settlement id"
        );

        // Verify that the two order details are compatible.
        require(SettlementUtils.verifyMatchDetails(orderDetails[_buyID], orderDetails[_sellID]), "incompatible orders");

        // Verify that the two orders have been confirmed to one another.
        require(orderbookContract.orderMatch(_buyID) == _sellID, "unconfirmed orders");

        // Retrieve token details.
        TokenPair memory tokens = getTokenDetails(orderDetails[_buyID].tokens);

        // Require that the tokens have been registered.
        require(tokens.priorityToken.registered, "unregistered priority token");
        require(tokens.secondaryToken.registered, "unregistered secondary token");

        address buyer = orderbookContract.orderTrader(_buyID);
        address seller = orderbookContract.orderTrader(_sellID);

        require(buyer != seller, "orders from same trader");

        execute(_buyID, _sellID, buyer, seller, tokens);

        /* solium-disable-next-line security/no-block-members */
        matchTimestamp[_buyID][_sellID] = now;

        // Store that the orders have been settled.
        orderStatus[_buyID] = OrderStatus.Settled;
        orderStatus[_sellID] = OrderStatus.Settled;
    }

    /// @notice Slashes the bond of a guilty trader. This is called when an
    /// atomic swap is not executed successfully.
    /// To open an atomic order, a trader must have a balance equivalent to
    /// 0.6% of the trade in the Ethereum-based token. 0.2% is always paid in
    /// darknode fees when the order is matched. If the remaining amount is
    /// is slashed, it is distributed as follows:
    ///   1) 0.2% goes to the other trader, covering their fee
    ///   2) 0.2% goes to the slasher address
    /// Only one order in a match can be slashed.
    ///
    /// @param _guiltyOrderID The 32 byte ID of the order of the guilty trader.
    function slash(bytes32 _guiltyOrderID) external onlySlasher {
        require(orderDetails[_guiltyOrderID].settlementID == RENEX_ATOMIC_SETTLEMENT_ID, "slashing non-atomic trade");

        bytes32 innocentOrderID = orderbookContract.orderMatch(_guiltyOrderID);

        require(orderStatus[_guiltyOrderID] == OrderStatus.Settled, "invalid order status");
        require(orderStatus[innocentOrderID] == OrderStatus.Settled, "invalid order status");
        orderStatus[_guiltyOrderID] = OrderStatus.Slashed;

        (bytes32 buyID, bytes32 sellID) = isBuyOrder(_guiltyOrderID) ?
            (_guiltyOrderID, innocentOrderID) : (innocentOrderID, _guiltyOrderID);

        TokenPair memory tokens = getTokenDetails(orderDetails[buyID].tokens);

        SettlementDetails memory settlementDetails = calculateAtomicFees(buyID, sellID, tokens);

        // Transfer the fee amount to the other trader
        renExBalancesContract.transferBalanceWithFee(
            orderbookContract.orderTrader(_guiltyOrderID),
            orderbookContract.orderTrader(innocentOrderID),
            settlementDetails.leftTokenAddress,
            settlementDetails.leftTokenFee,
            0,
            0x0
        );

        // Transfer the fee amount to the slasher
        renExBalancesContract.transferBalanceWithFee(
            orderbookContract.orderTrader(_guiltyOrderID),
            slasherAddress,
            settlementDetails.leftTokenAddress,
            settlementDetails.leftTokenFee,
            0,
            0x0
        );
    }

    /// @notice Retrieves the settlement details of an order.
    /// For atomic swaps, it returns the full volumes, not the settled fees.
    ///
    /// @param _orderID The order to lookup the details of. Can be the ID of a
    ///        buy or a sell order.
    /// @return [
    ///     a boolean representing whether or not the order has been settled,
    ///     the volume of the priority token,
    ///     the volume of the secondary token,
    ///     the fee paid in the priority token,
    ///     the fee paid in the secondary token,
    ///     the address of the priority token,
    ///     the address of the secondary token
    /// ]
    function getMatchDetails(bytes32 _orderID)
    external view returns (
        bool settled,
        bool orderIsBuy,
        bytes32 matchedID,
        uint256 priorityVolume,
        uint256 secondaryVolume,
        uint256 priorityFee,
        uint256 secondaryFee,
        uint32 priorityToken,
        uint32 secondaryToken
    ) {
        matchedID = orderbookContract.orderMatch(_orderID);

        orderIsBuy = isBuyOrder(_orderID);

        (bytes32 buyID, bytes32 sellID) = orderIsBuy ?
            (_orderID, matchedID) : (matchedID, _orderID);

        SettlementDetails memory settlementDetails = calculateSettlementDetails(
            buyID,
            sellID,
            getTokenDetails(orderDetails[buyID].tokens)
        );

        return (
            orderStatus[_orderID] == OrderStatus.Settled || orderStatus[_orderID] == OrderStatus.Slashed,
            orderIsBuy,
            matchedID,
            settlementDetails.leftVolume,
            settlementDetails.rightVolume,
            settlementDetails.leftTokenFee,
            settlementDetails.rightTokenFee,
            uint32(orderDetails[buyID].tokens >> 32),
            uint32(orderDetails[buyID].tokens)
        );
    }

    /// @notice Exposes the hashOrder function for computing a hash of an
    /// order's details. An order hash is used as its ID. See `submitOrder`
    /// for the parameter descriptions.
    ///
    /// @return The 32-byte hash of the order.
    function hashOrder(
        bytes _prefix,
        uint64 _settlementID,
        uint64 _tokens,
        uint256 _price,
        uint256 _volume,
        uint256 _minimumVolume
    ) external pure returns (bytes32) {
        return SettlementUtils.hashOrder(_prefix, SettlementUtils.OrderDetails({
            settlementID: _settlementID,
            tokens: _tokens,
            price: _price,
            volume: _volume,
            minimumVolume: _minimumVolume
        }));
    }

    /// @notice Called by `settle`, executes the settlement for a RenEx order
    /// or distributes the fees for a RenExAtomic swap.
    ///
    /// @param _buyID The 32 byte ID of the buy order.
    /// @param _sellID The 32 byte ID of the sell order.
    /// @param _buyer The address of the buy trader.
    /// @param _seller The address of the sell trader.
    /// @param _tokens The details of the priority and secondary tokens.
    function execute(
        bytes32 _buyID,
        bytes32 _sellID,
        address _buyer,
        address _seller,
        TokenPair memory _tokens
    ) private {
        // Calculate the fees for atomic swaps, and the settlement details
        // otherwise.
        SettlementDetails memory settlementDetails = (orderDetails[_buyID].settlementID == RENEX_ATOMIC_SETTLEMENT_ID) ?
            settlementDetails = calculateAtomicFees(_buyID, _sellID, _tokens) :
            settlementDetails = calculateSettlementDetails(_buyID, _sellID, _tokens);

        // Transfer priority token value
        renExBalancesContract.transferBalanceWithFee(
            _buyer,
            _seller,
            settlementDetails.leftTokenAddress,
            settlementDetails.leftVolume,
            settlementDetails.leftTokenFee,
            orderSubmitter[_buyID]
        );

        // Transfer secondary token value
        renExBalancesContract.transferBalanceWithFee(
            _seller,
            _buyer,
            settlementDetails.rightTokenAddress,
            settlementDetails.rightVolume,
            settlementDetails.rightTokenFee,
            orderSubmitter[_sellID]
        );
    }

    /// @notice Calculates the details required to execute two matched orders.
    ///
    /// @param _buyID The 32 byte ID of the buy order.
    /// @param _sellID The 32 byte ID of the sell order.
    /// @param _tokens The details of the priority and secondary tokens.
    /// @return A struct containing the settlement details.
    function calculateSettlementDetails(
        bytes32 _buyID,
        bytes32 _sellID,
        TokenPair memory _tokens
    ) private view returns (SettlementDetails memory) {

        // Calculate the mid-price (using numerator and denominator to not loose
        // precision).
        Fraction memory midPrice = Fraction(orderDetails[_buyID].price + orderDetails[_sellID].price, 2);

        // Calculate the lower of the two max volumes of each trader
        uint256 commonVolume = Math.min256(orderDetails[_buyID].volume, orderDetails[_sellID].volume);

        uint256 priorityTokenVolume = joinFraction(
            commonVolume.mul(midPrice.numerator),
            midPrice.denominator,
            int16(_tokens.priorityToken.decimals) - PRICE_OFFSET - VOLUME_OFFSET
        );
        uint256 secondaryTokenVolume = joinFraction(
            commonVolume,
            1,
            int16(_tokens.secondaryToken.decimals) - VOLUME_OFFSET
        );

        // Calculate darknode fees
        ValueWithFees memory priorityVwF = subtractDarknodeFee(priorityTokenVolume);
        ValueWithFees memory secondaryVwF = subtractDarknodeFee(secondaryTokenVolume);

        return SettlementDetails({
            leftVolume: priorityVwF.value,
            rightVolume: secondaryVwF.value,
            leftTokenFee: priorityVwF.fees,
            rightTokenFee: secondaryVwF.fees,
            leftTokenAddress: _tokens.priorityToken.addr,
            rightTokenAddress: _tokens.secondaryToken.addr
        });
    }

    /// @notice Calculates the fees to be transferred for an atomic swap.
    ///
    /// @param _buyID The 32 byte ID of the buy order.
    /// @param _sellID The 32 byte ID of the sell order.
    /// @param _tokens The details of the priority and secondary tokens.
    /// @return A struct containing the fee details.
    function calculateAtomicFees(
        bytes32 _buyID,
        bytes32 _sellID,
        TokenPair memory _tokens
    ) private view returns (SettlementDetails memory) {

        // Calculate the mid-price (using numerator and denominator to not loose
        // precision).
        Fraction memory midPrice = Fraction(orderDetails[_buyID].price + orderDetails[_sellID].price, 2);

        // Calculate the lower of the two max volumes of each trader
        uint256 commonVolume = Math.min256(orderDetails[_buyID].volume, orderDetails[_sellID].volume);

        if (isEthereumBased(_tokens.secondaryToken.addr)) {
            uint256 secondaryTokenVolume = joinFraction(
                commonVolume,
                1,
                int16(_tokens.secondaryToken.decimals) - VOLUME_OFFSET
            );

            // Calculate darknode fees
            ValueWithFees memory secondaryVwF = subtractDarknodeFee(secondaryTokenVolume);

            return SettlementDetails({
                leftVolume: 0,
                rightVolume: 0,
                leftTokenFee: secondaryVwF.fees,
                rightTokenFee: secondaryVwF.fees,
                leftTokenAddress: _tokens.secondaryToken.addr,
                rightTokenAddress: _tokens.secondaryToken.addr
            });
        } else if (isEthereumBased(_tokens.priorityToken.addr)) {
            uint256 priorityTokenVolume = joinFraction(
                commonVolume.mul(midPrice.numerator),
                midPrice.denominator,
                int16(_tokens.priorityToken.decimals) - PRICE_OFFSET - VOLUME_OFFSET
            );

            // Calculate darknode fees
            ValueWithFees memory priorityVwF = subtractDarknodeFee(priorityTokenVolume);

            return SettlementDetails({
                leftVolume: 0,
                rightVolume: 0,
                leftTokenFee: priorityVwF.fees,
                rightTokenFee: priorityVwF.fees,
                leftTokenAddress: _tokens.priorityToken.addr,
                rightTokenAddress: _tokens.priorityToken.addr
            });
        } else {
            // Currently, at least one token must be Ethereum-based.
            // This will be implemented in the future.
            revert("non-eth atomic swaps are not supported");
        }
    }

    /// @notice Order parity is set by the order tokens are listed. This returns
    /// whether an order is a buy or a sell.
    /// @return true if _orderID is a buy order.
    function isBuyOrder(bytes32 _orderID) private view returns (bool) {
        uint64 tokens = orderDetails[_orderID].tokens;
        uint32 firstToken = uint32(tokens >> 32);
        uint32 secondaryToken = uint32(tokens);
        return (firstToken < secondaryToken);
    }

    /// @return (value - fee, fee) where fee is 0.2% of value
    function subtractDarknodeFee(uint256 _value) private pure returns (ValueWithFees memory) {
        uint256 newValue = (_value * (DARKNODE_FEES_DENOMINATOR - DARKNODE_FEES_NUMERATOR)) / DARKNODE_FEES_DENOMINATOR;
        return ValueWithFees(newValue, _value - newValue);
    }

    /// @notice Gets the order details of the priority and secondary token from
    /// the RenExTokens contract and returns them as a single struct.
    ///
    /// @param _tokens The 64-bit combined token identifiers.
    /// @return A TokenPair struct containing two TokenDetails structs.
    function getTokenDetails(uint64 _tokens) private view returns (TokenPair memory) {
        (
            address priorityAddress,
            uint8 priorityDecimals,
            bool priorityRegistered
        ) = renExTokensContract.tokens(uint32(_tokens >> 32));

        (
            address secondaryAddress,
            uint8 secondaryDecimals,
            bool secondaryRegistered
        ) = renExTokensContract.tokens(uint32(_tokens));

        return TokenPair({
            priorityToken: RenExTokens.TokenDetails(priorityAddress, priorityDecimals, priorityRegistered),
            secondaryToken: RenExTokens.TokenDetails(secondaryAddress, secondaryDecimals, secondaryRegistered)
        });
    }

    /// @return true if _tokenAddress is 0x0, representing a token that is not
    /// on Ethereum
    function isEthereumBased(address _tokenAddress) private pure returns (bool) {
        return (_tokenAddress != address(0x0));
    }

    /// @notice Computes (_numerator / _denominator) * 10 ** _scale
    function joinFraction(uint256 _numerator, uint256 _denominator, int16 _scale) private pure returns (uint256) {
        if (_scale >= 0) {
            // Check that (10**_scale) doesn't overflow
            assert(_scale <= 77); // log10(2**256) = 77.06
            return _numerator.mul(10 ** uint256(_scale)) / _denominator;
        } else {
            /// @dev If _scale is less than -77, 10**-_scale would overflow.
            // For now, -_scale > -24 (when a token has 0 decimals and
            // VOLUME_OFFSET and PRICE_OFFSET are each 12). It is unlikely these
            // will be increased to add to more than 77.
            // assert((-_scale) <= 77); // log10(2**256) = 77.06
            return (_numerator / _denominator) / 10 ** uint256(-_scale);
        }
    }
}

Contract ABI
[{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"orderStatus","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newRenExTokensContract","type":"address"}],"name":"updateRenExTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"renExTokensContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"submissionGasPriceLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_orderID","type":"bytes32"}],"name":"getMatchDetails","outputs":[{"name":"settled","type":"bool"},{"name":"orderIsBuy","type":"bool"},{"name":"matchedID","type":"bytes32"},{"name":"priorityVolume","type":"uint256"},{"name":"secondaryVolume","type":"uint256"},{"name":"priorityFee","type":"uint256"},{"name":"secondaryFee","type":"uint256"},{"name":"priorityToken","type":"uint32"},{"name":"secondaryToken","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOrderbookContract","type":"address"}],"name":"updateOrderbook","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newSubmissionGasPriceLimit","type":"uint256"}],"name":"updateSubmissionGasPriceLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"DARKNODE_FEES_DENOMINATOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"orderSubmitter","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RENEX_ATOMIC_SETTLEMENT_ID","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"orderDetails","outputs":[{"name":"settlementID","type":"uint64"},{"name":"tokens","type":"uint64"},{"name":"price","type":"uint256"},{"name":"volume","type":"uint256"},{"name":"minimumVolume","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"},{"name":"","type":"bytes32"}],"name":"matchTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DARKNODE_FEES_NUMERATOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newSlasherAddress","type":"address"}],"name":"updateSlasher","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_prefix","type":"bytes"},{"name":"_settlementID","type":"uint64"},{"name":"_tokens","type":"uint64"},{"name":"_price","type":"uint256"},{"name":"_volume","type":"uint256"},{"name":"_minimumVolume","type":"uint256"}],"name":"submitOrder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"orderbookContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_prefix","type":"bytes"},{"name":"_settlementID","type":"uint64"},{"name":"_tokens","type":"uint64"},{"name":"_price","type":"uint256"},{"name":"_volume","type":"uint256"},{"name":"_minimumVolume","type":"uint256"}],"name":"hashOrder","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"RENEX_SETTLEMENT_ID","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_buyID","type":"bytes32"},{"name":"_sellID","type":"bytes32"}],"name":"settle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"slasherAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"renExBalancesContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newRenExBalancesContract","type":"address"}],"name":"updateRenExBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_guiltyOrderID","type":"bytes32"}],"name":"slash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"VERSION","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_VERSION","type":"string"},{"name":"_orderbookContract","type":"address"},{"name":"_renExTokensContract","type":"address"},{"name":"_renExBalancesContract","type":"address"},{"name":"_slasherAddress","type":"address"},{"name":"_submissionGasPriceLimit","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousOrderbook","type":"address"},{"indexed":false,"name":"nextOrderbook","type":"address"}],"name":"LogOrderbookUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousRenExTokens","type":"address"},{"indexed":false,"name":"nextRenExTokens","type":"address"}],"name":"LogRenExTokensUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousRenExBalances","type":"address"},{"indexed":false,"name":"nextRenExBalances","type":"address"}],"name":"LogRenExBalancesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousSubmissionGasPriceLimit","type":"uint256"},{"indexed":false,"name":"nextSubmissionGasPriceLimit","type":"uint256"}],"name":"LogSubmissionGasPriceLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousSlasher","type":"address"},{"indexed":false,"name":"nextSlasher","type":"address"}],"name":"LogSlasherUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

Contract Creation Code
60806040523480156200001157600080fd5b50604051620029b8380380620029b88339810160409081528151602080840151928401516060850151608086015160a087015160008054600160a060020a031916331790559490960180519096929491936200007391600191890190620000cc565b5060028054600160a060020a0319908116600160a060020a039788161790915560038054821695871695909517909455600480548516938616939093179092556005805490931693169290921790556006555062000171565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200010f57805160ff19168380011785556200013f565b828001600101855582156200013f579182015b828111156200013f57825182559160200191906001019062000122565b506200014d92915062000151565b5090565b6200016e91905b808211156200014d576000815560010162000158565b90565b61283780620001816000396000f3006080604052600436106101455763ffffffff60e060020a6000350416632dff692d811461014a57806334106c89146101865780634015e83b146101a95780634c3052de146101da5780634f54f4d8146102015780636074b8061461026b578063675df16f1461028c5780636af630d1146102a4578063715018a6146102b957806375d4115e146102ce5780638da5cb5b146102e6578063943a5e28146102fb578063a3c50b3214610329578063ab0fd37314610379578063aba8803714610394578063b3139d38146103a9578063b86f602c146103ca578063bbe7221e14610408578063ce0f92b71461041d578063d23df2d11461045b578063d32a9cd914610470578063d53c61bf1461048b578063ddf25ce9146104a0578063ee0715ed146104b5578063f2fde38b146104d6578063f415ed14146104f7578063ffa1ad741461050f575b600080fd5b34801561015657600080fd5b50610162600435610599565b6040518082600381111561017257fe5b60ff16815260200191505060405180910390f35b34801561019257600080fd5b506101a7600160a060020a03600435166105ae565b005b3480156101b557600080fd5b506101be61062f565b60408051600160a060020a039092168252519081900360200190f35b3480156101e657600080fd5b506101ef61063e565b60408051918252519081900360200190f35b34801561020d57600080fd5b50610219600435610644565b604080519915158a5297151560208a0152888801969096526060880194909452608087019290925260a086015260c085015263ffffffff90811660e08501521661010083015251908190036101200190f35b34801561027757600080fd5b506101a7600160a060020a0360043516610844565b34801561029857600080fd5b506101a76004356108c5565b3480156102b057600080fd5b506101ef61091e565b3480156102c557600080fd5b506101a7610924565b3480156102da57600080fd5b506101be600435610983565b3480156102f257600080fd5b506101be61099e565b34801561030757600080fd5b506103106109ad565b6040805163ffffffff9092168252519081900360200190f35b34801561033557600080fd5b506103416004356109b2565b6040805167ffffffffffffffff9687168152949095166020850152838501929092526060830152608082015290519081900360a00190f35b34801561038557600080fd5b506101ef6004356024356109f2565b3480156103a057600080fd5b506101ef6109ad565b3480156103b557600080fd5b506101a7600160a060020a0360043516610a0f565b3480156103d657600080fd5b506101a7602460048035828101929101359067ffffffffffffffff90358116906044351660643560843560a435610a90565b34801561041457600080fd5b506101be610d97565b34801561042957600080fd5b506101ef602460048035828101929101359067ffffffffffffffff90358116906044351660643560843560a435610da6565b34801561046757600080fd5b50610310610e2b565b34801561047c57600080fd5b506101a7600435602435610e30565b34801561049757600080fd5b506101be6114f5565b3480156104ac57600080fd5b506101be611504565b3480156104c157600080fd5b506101a7600160a060020a0360043516611513565b3480156104e257600080fd5b506101a7600160a060020a0360043516611594565b34801561050357600080fd5b506101a76004356115b7565b34801561051b57600080fd5b50610524611b39565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561055e578181015183820152602001610546565b50505050905090810190601f16801561058b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60096020526000908152604090205460ff1681565b600054600160a060020a031633146105c557600080fd5b60035460408051600160a060020a039283168152918316602083015280517fc44a7f49dd4281e6c3ed47edb754b69b064653d53ed217e1354e79e8fe4b06a09281900390910190a160038054600160a060020a031916600160a060020a0392909216919091179055565b600354600160a060020a031681565b60065481565b600080600080600080600080600080600061065d612721565b600260009054906101000a9004600160a060020a0316600160a060020a031663af3e8a408e6040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b1580156106c357600080fd5b505af11580156106d7573d6000803e3d6000fd5b505050506040513d60208110156106ed57600080fd5b505199506106fa8d611bc6565b9a508a61070857898d61070b565b8c8a5b600082815260076020526040902054919450925061074b90849084906107469068010000000000000000900467ffffffffffffffff16611c04565b611dce565b9050600260008e81526009602052604090205460ff16600381111561076c57fe5b14806107945750600360008e81526009602052604090205460ff16600381111561079257fe5b145b8b8b83600001518460200151856040015186606001516020600760008c6000191660001916815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169060020a9004600760008c6000191660001916815260200190815260200160002060000160089054906101000a900467ffffffffffffffff169b509b509b509b509b509b509b509b509b505050509193959799909294969850565b600054600160a060020a0316331461085b57600080fd5b60025460408051600160a060020a039283168152918316602083015280517ff7af59918b82b5e13957d357d0fcc86f12a806b0d2e826bc24a0f13ae85e45989281900390910190a160028054600160a060020a031916600160a060020a0392909216919091179055565b600054600160a060020a031633146108dc57600080fd5b600654604080519182526020820183905280517fd0ef246766073915a6813492cff2a021d7cd4bf7d4feff3ef74327c7f4940e969281900390910190a1600655565b6103e881565b600054600160a060020a0316331461093b57600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a260008054600160a060020a0319169055565b600860205260009081526040902054600160a060020a031681565b600054600160a060020a031681565b600281565b600760205260009081526040902080546001820154600283015460039093015467ffffffffffffffff808416946801000000000000000090940416929085565b600a60209081526000928352604080842090915290825290205481565b600054600160a060020a03163314610a2657600080fd5b60055460408051600160a060020a039283168152918316602083015280517f933228a1c3ba8fadd3ce47a9db5b898be647f89af99ba7c1b9a655f59ea306c89281900390910190a160058054600160a060020a031916600160a060020a0392909216919091179055565b610a9861276a565b6000600654803a11151515610af7576040805160e560020a62461bcd02815260206004820152601260248201527f67617320707269636520746f6f20686967680000000000000000000000000000604482015290519081900360640190fd5b60a0604051908101604052808967ffffffffffffffff1681526020018867ffffffffffffffff168152602001878152602001868152602001858152509250610b708a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843750899450611f559350505050565b91506000808381526009602052604090205460ff166003811115610b9057fe5b14610be5576040805160e560020a62461bcd02815260206004820152601760248201527f6f7264657220616c7265616479207375626d6974746564000000000000000000604482015290519081900360640190fd5b60028054604080517faab14d04000000000000000000000000000000000000000000000000000000008152600481018690529051600160a060020a039092169163aab14d04916024808201926020929091908290030181600087803b158015610c4d57600080fd5b505af1158015610c61573d6000803e3d6000fd5b505050506040513d6020811015610c7757600080fd5b50516003811115610c8457fe5b14610cd9576040805160e560020a62461bcd02815260206004820152601160248201527f756e636f6e6669726d6564206f72646572000000000000000000000000000000604482015290519081900360640190fd5b60008281526008602090815260408083208054600160a060020a031916331790556009909152902080546001919060ff19168280021790555050600090815260076020908152604091829020835181549285015167ffffffffffffffff1990931667ffffffffffffffff918216176fffffffffffffffff000000000000000019166801000000000000000091909316029190911781559082015160018201556060820151600282015560809091015160039091015550505050505050565b600254600160a060020a031681565b6000610e1f88888080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505060a0604051908101604052808967ffffffffffffffff1681526020018867ffffffffffffffff16815260200187815260200186815260200185815250611f55565b98975050505050505050565b600181565b610e386127ae565b600080600160008681526009602052604090205460ff166003811115610e5a57fe5b14610eaf576040805160e560020a62461bcd02815260206004820152601260248201527f696e76616c696420627579207374617475730000000000000000000000000000604482015290519081900360640190fd5b600160008581526009602052604090205460ff166003811115610ece57fe5b14610f23576040805160e560020a62461bcd02815260206004820152601360248201527f696e76616c69642073656c6c2073746174757300000000000000000000000000604482015290519081900360640190fd5b60008581526007602052604090205467ffffffffffffffff1660021480610f62575060008581526007602052604090205467ffffffffffffffff166001145b1515610fb8576040805160e560020a62461bcd02815260206004820152601560248201527f696e76616c696420736574746c656d656e742069640000000000000000000000604482015290519081900360640190fd5b61111260076000876000191660001916815260200190815260200160002060a060405190810160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152505060076000876000191660001916815260200190815260200160002060a060405190810160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815250506120bd565b1515611168576040805160e560020a62461bcd02815260206004820152601360248201527f696e636f6d70617469626c65206f726465727300000000000000000000000000604482015290519081900360640190fd5b600254604080517faf3e8a400000000000000000000000000000000000000000000000000000000081526004810188905290518692600160a060020a03169163af3e8a409160248083019260209291908290030181600087803b1580156111ce57600080fd5b505af11580156111e2573d6000803e3d6000fd5b505050506040513d60208110156111f857600080fd5b50511461124f576040805160e560020a62461bcd02815260206004820152601260248201527f756e636f6e6669726d6564206f72646572730000000000000000000000000000604482015290519081900360640190fd5b60008581526007602052604090205461127d9068010000000000000000900467ffffffffffffffff16611c04565b80516040015190935015156112dc576040805160e560020a62461bcd02815260206004820152601b60248201527f756e72656769737465726564207072696f7269747920746f6b656e0000000000604482015290519081900360640190fd5b826020015160400151151561133b576040805160e560020a62461bcd02815260206004820152601c60248201527f756e72656769737465726564207365636f6e6461727920746f6b656e00000000604482015290519081900360640190fd5b6002546040805160e460020a630b1a0801028152600481018890529051600160a060020a039092169163b1a08010916024808201926020929091908290030181600087803b15801561138c57600080fd5b505af11580156113a0573d6000803e3d6000fd5b505050506040513d60208110156113b657600080fd5b50516002546040805160e460020a630b1a0801028152600481018890529051929450600160a060020a039091169163b1a08010916024808201926020929091908290030181600087803b15801561140c57600080fd5b505af1158015611420573d6000803e3d6000fd5b505050506040513d602081101561143657600080fd5b50519050600160a060020a03828116908216141561149e576040805160e560020a62461bcd02815260206004820152601760248201527f6f72646572732066726f6d2073616d6520747261646572000000000000000000604482015290519081900360640190fd5b6114ab858584848761214f565b5050506000828152600a602090815260408083208484528252808320429055938252600990528281208054600260ff19918216811790925592825292902080549091169091179055565b600554600160a060020a031681565b600454600160a060020a031681565b600054600160a060020a0316331461152a57600080fd5b60045460408051600160a060020a039283168152918316602083015280517f28e85eee30dd92456f8c6864bcdaadb36644672cee6f285d571b1e58c08adca19281900390910190a160048054600160a060020a031916600160a060020a0392909216919091179055565b600054600160a060020a031633146115ab57600080fd5b6115b481612307565b50565b60008060006115c46127ae565b6115cc612721565b600554600160a060020a0316331461162e576040805160e560020a62461bcd02815260206004820152600c60248201527f756e617574686f72697a65640000000000000000000000000000000000000000604482015290519081900360640190fd5b60008681526007602052604090205467ffffffffffffffff1660021461169e576040805160e560020a62461bcd02815260206004820152601960248201527f736c617368696e67206e6f6e2d61746f6d696320747261646500000000000000604482015290519081900360640190fd5b600254604080517faf3e8a40000000000000000000000000000000000000000000000000000000008152600481018990529051600160a060020a039092169163af3e8a40916024808201926020929091908290030181600087803b15801561170557600080fd5b505af1158015611719573d6000803e3d6000fd5b505050506040513d602081101561172f57600080fd5b50519450600260008781526009602052604090205460ff16600381111561175257fe5b146117a7576040805160e560020a62461bcd02815260206004820152601460248201527f696e76616c6964206f7264657220737461747573000000000000000000000000604482015290519081900360640190fd5b600260008681526009602052604090205460ff1660038111156117c657fe5b1461181b576040805160e560020a62461bcd02815260206004820152601460248201527f696e76616c6964206f7264657220737461747573000000000000000000000000604482015290519081900360640190fd5b6000868152600960205260409020805460ff1916600317905561183d86611bc6565b61184857848661184b565b85855b600082815260076020526040902054919550935061187e9068010000000000000000900467ffffffffffffffff16611c04565b915061188b848484612377565b600480546002546040805160e460020a630b1a08010281529384018b905251939450600160a060020a03918216936334814e5893929091169163b1a080109160248083019260209291908290030181600087803b1580156118eb57600080fd5b505af11580156118ff573d6000803e3d6000fd5b505050506040513d602081101561191557600080fd5b50516002546040805160e460020a630b1a0801028152600481018b90529051600160a060020a039092169163b1a08010916024808201926020929091908290030181600087803b15801561196857600080fd5b505af115801561197c573d6000803e3d6000fd5b505050506040513d602081101561199257600080fd5b50516080850151604080870151815160e060020a63ffffffff8816028152600160a060020a0395861660048201529385166024850152939091166044830152606482019290925260006084820181905260a48201819052915160c4808301939282900301818387803b158015611a0757600080fd5b505af1158015611a1b573d6000803e3d6000fd5b5050600480546002546040805160e460020a630b1a08010281529384018c905251600160a060020a0392831695506334814e58945091169163b1a080109160248083019260209291908290030181600087803b158015611a7a57600080fd5b505af1158015611a8e573d6000803e3d6000fd5b505050506040513d6020811015611aa457600080fd5b50516005546080850151604080870151815160e060020a63ffffffff8816028152600160a060020a0395861660048201529385166024850152919093166044830152606482015260006084820181905260a48201819052915160c4808301939282900301818387803b158015611b1957600080fd5b505af1158015611b2d573d6000803e3d6000fd5b50505050505050505050565b60018054604080516020600284861615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611bbe5780601f10611b9357610100808354040283529160200191611bbe565b820191906000526020600020905b815481529060010190602001808311611ba157829003601f168201915b505050505081565b60009081526007602052604090205468010000000000000000900463ffffffff81811664010000000067ffffffffffffffff90931692909204161090565b611c0c6127ae565b600354604080517ffbb6272d00000000000000000000000000000000000000000000000000000000815263ffffffff64010000000067ffffffffffffffff871604166004820152905160009283928392839283928392600160a060020a039092169163fbb6272d9160248082019260609290919082900301818787803b158015611c9557600080fd5b505af1158015611ca9573d6000803e3d6000fd5b505050506040513d6060811015611cbf57600080fd5b508051602082015160409283015160035484517ffbb6272d00000000000000000000000000000000000000000000000000000000815263ffffffff8e1660048201529451939a509198509650600160a060020a03169163fbb6272d9160248083019260609291908290030181600087803b158015611d3c57600080fd5b505af1158015611d50573d6000803e3d6000fd5b505050506040513d6060811015611d6657600080fd5b508051602080830151604093840151845160a081018652600160a060020a039b8c1681870190815260ff9b8c166060808401919091529a1515608083015281528551998a0186529a909316885297909716868801521515908501525050509082015292915050565b611dd6612721565b611dde6127d4565b6000806000611deb6127d4565b611df36127d4565b6040805190810160405280600760008c6000191660001916815260200190815260200160002060010154600760008e600019166000191681526020019081526020016000206001015401815260200160028152509550611e8f600760008c6000191660001916815260200190815260200160002060020154600760008c60001916600019168152602001908152602001600020600201546125d0565b8651909550611ec490611ea990879063ffffffff6125e816565b8760200151600c808c600001516020015160ff160303612611565b9350611ee0856001600c8b602001516020015160ff1603612611565b9250611eeb84612676565b9150611ef683612676565b6040805160c08101825284518152825160208083019190915280860151928201929092528183015160608201528a5151600160a060020a039081166080830152918b01515190911660a0820152975090505b5050505050509392505050565b600082826000015183602001518460400151856060015186608001516040516020018087805190602001908083835b60208310611fa35780518252601f199092019160209182019101611f84565b6001836020036101000a0380198251168184511680821785525050505050509050018667ffffffffffffffff1667ffffffffffffffff1678010000000000000000000000000000000000000000000000000281526008018567ffffffffffffffff1667ffffffffffffffff16780100000000000000000000000000000000000000000000000002815260080184815260200183815260200182815260200196505050505050506040516020818303038152906040526040518082805190602001908083835b602083106120875780518252601f199092019160209182019101612068565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902090505b92915050565b60006120d1836020015183602001516126a0565b15156120df575060006120b7565b8160400151836040015110156120f7575060006120b7565b81608001518360600151101561210f575060006120b7565b826080015182606001511015612127575060006120b7565b8151835167ffffffffffffffff908116911614612146575060006120b7565b50600192915050565b612157612721565b60008681526007602052604090205467ffffffffffffffff1660021461218a57612182868684611dce565b905080612199565b612195868684612377565b9050805b600480546080830151835160408086015160008d815260086020528281205483517f34814e58000000000000000000000000000000000000000000000000000000008152600160a060020a038e8116998201999099528c8916602482015295881660448701526064860194909452608485019190915291851660a48401525194955092909116926334814e589260c48084019391929182900301818387803b15801561224457600080fd5b505af1158015612258573d6000803e3d6000fd5b50506004805460a0850151602080870151606088015160008d8152600890935260408084205481517f34814e58000000000000000000000000000000000000000000000000000000008152600160a060020a038e8116998201999099528e8916602482015295881660448701526064860193909352608485019190915290851660a4840152519390921694506334814e58935060c4808201939182900301818387803b158015611b1957600080fd5b600160a060020a038116151561231c57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a031916600160a060020a0392909216919091179055565b61237f612721565b6123876127d4565b6000806123926127d4565b600061239c6127d4565b6040805190810160405280600760008c6000191660001916815260200190815260200160002060010154600760008e600019166000191681526020019081526020016000206001015401815260200160028152509550612438600760008c6000191660001916815260200190815260200160002060020154600760008c60001916600019168152602001908152602001600020600201546125d0565b945061244b886020015160000151612713565b156124d85761246a856001600c8b602001516020015160ff1603612611565b935061247584612676565b925060c06040519081016040528060008152602001600081526020018460200151815260200184602001518152602001896020015160000151600160a060020a03168152602001896020015160000151600160a060020a03168152509650611f48565b8751516124e490612713565b1561255a57855161250090611ea990879063ffffffff6125e816565b915061250b82612676565b6040805160c0810182526000808252602080830191909152830180519282019290925290516060820152895151600160a060020a0390811660808301528a51511660a082015297509050611f48565b6040805160e560020a62461bcd02815260206004820152602660248201527f6e6f6e2d6574682061746f6d696320737761707320617265206e6f742073757060448201527f706f727465640000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008183106125df57816125e1565b825b9392505050565b60008215156125f9575060006120b7565b5081810281838281151561260957fe5b04146120b757fe5b6000808260010b12151561265757604d600183900b131561262e57fe5b8261264685600185900b600a0a63ffffffff6125e816565b81151561264f57fe5b0490506125e1565b8160000360010b600a0a838581151561266c57fe5b0481151561264f57fe5b61267e6127d4565b50604080518082019091526103e86103e6830204808252909103602082015290565b600064010000000067ffffffffffffffff83160463ffffffff9081169084161480156126e6575064010000000067ffffffffffffffff84160463ffffffff908116908316145b80156125e15750505063ffffffff81811664010000000067ffffffffffffffff9093169290920416111590565b600160a060020a0316151590565b60c060405190810160405280600081526020016000815260200160008152602001600081526020016000600160a060020a031681526020016000600160a060020a031681525090565b60a060405190810160405280600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016000815260200160008152602001600081525090565b60c0604051908101604052806127c26127eb565b81526020016127cf6127eb565b905290565b604080518082019091526000808252602082015290565b6040805160608101825260008082526020820181905291810191909152905600a165627a7a723058208ab978ee2141825b9b548b5a6e979dfe5eb5eddaad85eaf482c127bbef19e4fd002900000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000376127adc18260fc238ebfb6626b2f4b59ec9b66000000000000000000000000160eca47935be4139ec5b94d99b678d6f7e18f95000000000000000000000000a95de870ddfb6188519d5cc63ced5e0fbac1aa8e000000000000000000000000565839e16bac459884b0f0d7377ac04e04be150d000000000000000000000000000000000000000000000000000000174876e800000000000000000000000000000000000000000000000000000000000000000d6e696768746c792d302e312e3000000000000000000000000000000000000000


    Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000376127adc18260fc238ebfb6626b2f4b59ec9b66000000000000000000000000160eca47935be4139ec5b94d99b678d6f7e18f95000000000000000000000000a95de870ddfb6188519d5cc63ced5e0fbac1aa8e000000000000000000000000565839e16bac459884b0f0d7377ac04e04be150d000000000000000000000000000000000000000000000000000000174876e800000000000000000000000000000000000000000000000000000000000000000d6e696768746c792d302e312e3000000000000000000000000000000000000000

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 000000000000000000000000376127adc18260fc238ebfb6626b2f4b59ec9b66
Arg [2] : 000000000000000000000000160eca47935be4139ec5b94d99b678d6f7e18f95
Arg [3] : 000000000000000000000000a95de870ddfb6188519d5cc63ced5e0fbac1aa8e
Arg [4] : 000000000000000000000000565839e16bac459884b0f0d7377ac04e04be150d
Arg [5] : 000000000000000000000000000000000000000000000000000000174876e800
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [7] : 6e696768746c792d302e312e3000000000000000000000000000000000000000


   Swarm Source:
bzzr://8ab978ee2141825b9b548b5a6e979dfe5eb5eddaad85eaf482c127bbef19e4fd
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward