Sponsored:   LH-CRYPTO - 200 instruments (BTC, EUR, GOLD, OIL, SHARES). Leverage up to 1:500. OPEN ACCOUNT
Contract Overview
Balance: 1,109.058581127749267736 Ether
Ether Value: $152,839.36 (@ $137.81/ETH)
Transactions: 40470 txns
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xe44c4cbfdfb747dcde4f99c5462c0ff82d8c6903at txn 0x053b0c0d962be99313f474514c085608e3edcbf4ba47fa0792f2f0f73c905a84
Token Balance:
 Latest 25 transactions from a total of 40470 transactions
(+3 PendingTxns)

TxHash Age From To Value [TxFee]
0x0ca5aeb8ee1c3fad8e5a24b34f14010ab46dec9178d74f62b9f7dee3b960fdec(pending)0xbcac953dc21655c268ea2f4fa783d826de6f02f9  IN  0xe7232a9fd8bf427aa41918bc008d32290e22990e0 Ether(Pending)
0x87ab912560d1f3c073b14fd3ea896c0d008e81f2e074913f86b8cf2afe859a8b(pending)0xac408406cb803180f886d45b6058d650fc8ec3b7  IN  0xe7232a9fd8bf427aa41918bc008d32290e22990e0.72 Ether(Pending)
0xec0bbe60a77b648d9a37f3cfd9f3bab429c929d369da11a371186640f30dc2f1(pending)0x17b1242d9bfb0acab9bb95bcf8623937ac23a3f5  IN  0xe7232a9fd8bf427aa41918bc008d32290e22990e0 Ether(Pending)
0x8a0c0367ace3e29c3c25f2db82fa3525e1affa0ad11ca0a4ea20c4623477b6d850 mins ago0x0b013cca6335dd62353ca60ecec9c39b5227d270  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.12 Ether0.000729624
0x51b3af922ccbf3e346241a1df1f83a8ec863b78a23521c1d37edc9d36ac802831 hr 28 mins ago0xfe3ac249d5af74c55af8e2132c8a355eb5b479a4  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0 Ether0.0001883
0x811675b90fcd7c2c96fd939f395fed17520c50c9c70473b8e967661eb6e26d151 hr 28 mins ago0xfe3ac249d5af74c55af8e2132c8a355eb5b479a4  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0 Ether0.000794472
0xcf6f03fb3d447b6b37660b30c21bb8b7df05df77905c7b981293d514bcddff5c1 hr 30 mins ago0xfe3ac249d5af74c55af8e2132c8a355eb5b479a4  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0 Ether0.000846972
0xc563a701059ea4cff094b6c48dc5d44de4e8ecc4380a989569a408e4f8e47bbb2 hrs 24 mins ago0x31400d4673f4176df400424fef2b37ff4d9058d0  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.32 Ether0.000486288
0x956bb3e19a7d4b6344cb5e7e8733a36d4716c63859f81482818098391ef1dae62 hrs 27 mins ago0x0b013cca6335dd62353ca60ecec9c39b5227d270  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0 Ether0.000681168
0x7b136e6147e4df8bbfc86a3851ac2775615861888196cef97ffd0060c71683302 hrs 27 mins ago0x0b013cca6335dd62353ca60ecec9c39b5227d270  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0 Ether0.000680976
0x74dba544f64dfc278e59ff77f7b6cbc7a0cfe431950318fd5a7462a4ecd749842 hrs 28 mins ago0x0b013cca6335dd62353ca60ecec9c39b5227d270  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0 Ether0.000681168
0x7b915c68c9393da8c9eed148535d28b5142fe6d14b5ab935c7e7909d9ecf28492 hrs 29 mins ago0x0b013cca6335dd62353ca60ecec9c39b5227d270  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0 Ether0.000680976
0x5353e049f748b5752e73936fa92cfa68d8d08dee9376d194785e5f89dbca65d12 hrs 35 mins ago0x31400d4673f4176df400424fef2b37ff4d9058d0  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.03 Ether0.000486288
0x9cfeca6556e0f5bcd4eb7a3959a0a96ab9aae1a2d539ce1a3cad65a37c0d58122 hrs 43 mins ago0xc4bb83b0245aa98659c64503cb9db44cb67a9537  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.09 Ether0.00060786
0x4c98178258dc850bb97c2beab64e2812f997b19df019a48bbef2c005827fc9b82 hrs 54 mins ago0x31400d4673f4176df400424fef2b37ff4d9058d0  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.05 Ether0.000486288
0xdc5d8ce3d1e0ac46df58ab507b7d53ad502b00a1f784191f0c7eeca5afc4149e2 hrs 57 mins ago0x31400d4673f4176df400424fef2b37ff4d9058d0  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0 Ether0.000454112
0x4050567a6f8bbdc06aa4ac8e05a2eb8e9aed6d177bc21e52a1cd5b73ac7f7ed22 hrs 57 mins ago0x31400d4673f4176df400424fef2b37ff4d9058d0  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0 Ether0.000454112
0xbb7906d5e1b9669dc6260674abcd266da3263d53a644eed77512f44d77c8a3093 hrs 2 mins ago0x3401ea5a8d91c5e3944962c0148b08ac4a77f153  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.03 Ether0.000486288
0xcc2904cfaff4b8abf3b4b6152ad0b5c9387ca5b8c740de6372f4233c70f90d193 hrs 2 mins ago0x3401ea5a8d91c5e3944962c0148b08ac4a77f153  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.02 Ether0.000486288
0x43a1b5469de34c31da162f0adee2e1f7b084f8fa2ba4624840a5221ea5c36f643 hrs 2 mins ago0x3401ea5a8d91c5e3944962c0148b08ac4a77f153  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.01 Ether0.000486288
0x2be4459ea81831dae4a3cf3b2fba9b70c2dc747bfd3f4bcd20d7a5912ce0fa9b3 hrs 18 mins ago0x32a88f097056c773569abb6a3cf8d88228466e00  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.0245 Ether0.000729624
0x108ee5770c5da53642fc38c27cfdc4cf4f354283e493b87c673a8e3c4d90ab2f3 hrs 19 mins ago0x3401ea5a8d91c5e3944962c0148b08ac4a77f153  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.0491 Ether0.0004012932
0xfb574bcc8f7528327c1ddaf00abbd190ae8fdd5d512a28a194f7f6b98a6b3f6f3 hrs 21 mins ago0x32a88f097056c773569abb6a3cf8d88228466e00  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.009 Ether0.000729432
0xe8bcc5a965ec97461389f97f6bf2be455c1110831e3e8b93b655139bf7d2d17d3 hrs 22 mins ago0x32a88f097056c773569abb6a3cf8d88228466e00  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.00895 Ether0.000729432
0x9de015f2ae748e6f4e41d415dc3bfdf0064f763f5f18ceae23479838667861223 hrs 23 mins ago0x32a88f097056c773569abb6a3cf8d88228466e00  IN   0xe7232a9fd8bf427aa41918bc008d32290e22990e0.008 Ether0.000729432
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here To View More View All
ParentTxHash Block Age From To Value
0x8a0c0367ace3e29c3c25f2db82fa3525e1affa0ad11ca0a4ea20c4623477b6d8673818050 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x31400d4673f4176df400424fef2b37ff4d9058d00.114 Ether
0xc563a701059ea4cff094b6c48dc5d44de4e8ecc4380a989569a408e4f8e47bbb67377952 hrs 24 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xa4e15ae120c283eccb3d38ebf8b02baeaddef0ff0.304 Ether
0x5353e049f748b5752e73936fa92cfa68d8d08dee9376d194785e5f89dbca65d167377452 hrs 35 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x450fe78870f5b58c5a3b0cf173a6c552933fc76d0.0285 Ether
0x9cfeca6556e0f5bcd4eb7a3959a0a96ab9aae1a2d539ce1a3cad65a37c0d581267377092 hrs 43 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xb786074078d2cd10146521b500cfd8a154c13b2d0.0855 Ether
0x4c98178258dc850bb97c2beab64e2812f997b19df019a48bbef2c005827fc9b867376602 hrs 54 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x450fe78870f5b58c5a3b0cf173a6c552933fc76d0.0475 Ether
0xbb7906d5e1b9669dc6260674abcd266da3263d53a644eed77512f44d77c8a30967376173 hrs 2 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x450fe78870f5b58c5a3b0cf173a6c552933fc76d0.0285 Ether
0xcc2904cfaff4b8abf3b4b6152ad0b5c9387ca5b8c740de6372f4233c70f90d1967376173 hrs 2 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x450fe78870f5b58c5a3b0cf173a6c552933fc76d0.019 Ether
0x43a1b5469de34c31da162f0adee2e1f7b084f8fa2ba4624840a5221ea5c36f6467376173 hrs 2 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xeace206af7039fe91f5fd047f03118d4d7d4f8ba0.0095 Ether
0x2be4459ea81831dae4a3cf3b2fba9b70c2dc747bfd3f4bcd20d7a5912ce0fa9b67375653 hrs 18 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xa4e15ae120c283eccb3d38ebf8b02baeaddef0ff0.023275 Ether
0x108ee5770c5da53642fc38c27cfdc4cf4f354283e493b87c673a8e3c4d90ab2f67375573 hrs 19 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xc4bb83b0245aa98659c64503cb9db44cb67a95370.046645 Ether
0xfb574bcc8f7528327c1ddaf00abbd190ae8fdd5d512a28a194f7f6b98a6b3f6f67375533 hrs 21 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xbfe8d5abf248081fe03236e31efdfdfe1562f9a20.00855 Ether
0xe8bcc5a965ec97461389f97f6bf2be455c1110831e3e8b93b655139bf7d2d17d67375473 hrs 22 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xc4bb83b0245aa98659c64503cb9db44cb67a95370.0085025 Ether
0x9de015f2ae748e6f4e41d415dc3bfdf0064f763f5f18ceae234798386678612267375443 hrs 23 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xfa6d19a1892820d5525324f2bb632037abfe21f50.0076 Ether
0xd90be05b08a660566068ce51136bccfeeedaa73fa41e06000991afe539f061d667375423 hrs 23 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xc4bb83b0245aa98659c64503cb9db44cb67a95370.007125 Ether
0xcdc25a7394dfe27d99270cb368a0386e1dbacda22226479746dc647df42a402467375423 hrs 23 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x0d919f036c84277e4bc6ccf1df56715f86eda4310.00665 Ether
0x4371e07dc241d82b94ef4ce09e48d78e118d7a35a19aa7a6ef94483c8b631ba467375393 hrs 23 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xfa6d19a1892820d5525324f2bb632037abfe21f50.00855 Ether
0x66f2bf88c95e083a1be65f6b3127231f6bd8e8bddac27bc3655113cf72acddf367365917 hrs 3 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xc4bb83b0245aa98659c64503cb9db44cb67a95370.6555 Ether
0x1cee2fa05a9837c942ac02f5b1d12612138ae3518b168eaa037c32ea967d780567365517 hrs 13 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x0c6fc5083f7f4ec4a3b2de37ccef88a72b64fa1a0.0494 Ether
0x1d160ba7353096d3ccc67874347626b5e5b7c2861aabb6618bd362c9eb1d626d67363947 hrs 53 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x0c6fc5083f7f4ec4a3b2de37ccef88a72b64fa1a0.0475 Ether
0x35c2e354664905f10f26f21b21983ad065bf0d323e3ee1f5e11a69115890596e673549111 hrs 25 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x5302d0b614947ec0b2c3607c838ceb02620275600.0434625 Ether
0xa13c4db1882dbb285b628991b9926eac59b0db2055b14a721dcfc71016c0a527673489013 hrs 48 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x16ded7bd5a8c697259f3406513061e40d408306a0.000150462962962963 Ether
0xa13c4db1882dbb285b628991b9926eac59b0db2055b14a721dcfc71016c0a527673489013 hrs 48 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x9830242fe206809b66f57a150311aa925b96ac590.188805902777777779 Ether
0x2f47477528f94e198691934c4dca7e1f5e4f039c3d8aac56bf36e232c5925a53673488313 hrs 50 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x16ded7bd5a8c697259f3406513061e40d408306a0.000168981481481482 Ether
0x2f47477528f94e198691934c4dca7e1f5e4f039c3d8aac56bf36e232c5925a53673488313 hrs 50 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0x9830242fe206809b66f57a150311aa925b96ac590.284228125 Ether
0xd0a3f0ade373e82e1b6169dd42033241d1650b0ea4613013665a923fec20a2ea673466414 hrs 43 mins ago0xe7232a9fd8bf427aa41918bc008d32290e22990e0xc7a12f62da7f97c163fb11eb344f4379b63270ae0.001818783068783069 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: SaleManager
Compiler Text: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.23;

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

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

    uint256 c = _a * _b;
    require(c / _a == _b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b > 0); // Solidity only automatically asserts 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 c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b <= _a);
    uint256 c = _a - _b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
    uint256 c = _a + _b;
    require(c >= _a);

    return c;
  }
}

/* Controls game play state and access rights for game functions
 * @title Operational Control
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 * Inspired and adapted from contract created by OpenZeppelin
 * Ref: https://github.com/OpenZeppelin/zeppelin-solidity/
 */
contract OperationalControl {
    // Facilitates access & control for the game.
    // Roles:
    //  -The Game Managers (Primary/Secondary): Has universal control of all game elements (No ability to withdraw)
    //  -The Banker: The Bank can withdraw funds and adjust fees / prices.

    /// @dev Emited when contract is upgraded
    event ContractUpgrade(address newContract);

    mapping (address => bool) allowedAddressList;
    

    // The addresses of the accounts (or contracts) that can execute actions within each roles.
    address public gameManagerPrimary;
    address public gameManagerSecondary;
    address public bankManager;

    // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked
    bool public paused = false;

    /// @dev Operation modifiers for limiting access
    modifier onlyGameManager() {
        require(msg.sender == gameManagerPrimary || msg.sender == gameManagerSecondary);
        _;
    }

    /// @dev Operation modifiers for limiting access to only Banker
    modifier onlyBanker() {
        require(msg.sender == bankManager);
        _;
    }

    /// @dev Operation modifiers for access to any Manager
    modifier anyOperator() {
        require(
            msg.sender == gameManagerPrimary ||
            msg.sender == gameManagerSecondary ||
            msg.sender == bankManager
        );
        _;
    }

    /// @dev Assigns a new address to act as the GM.
    function setPrimaryGameManager(address _newGM) external onlyGameManager {
        require(_newGM != address(0));

        gameManagerPrimary = _newGM;
    }

    /// @dev Assigns a new address to act as the GM.
    function setSecondaryGameManager(address _newGM) external onlyGameManager {
        require(_newGM != address(0));

        gameManagerSecondary = _newGM;
    }

    /// @dev Assigns a new address to act as the Banker.
    function setBanker(address _newBK) external onlyBanker {
        require(_newBK != address(0));

        bankManager = _newBK;
    }

    function updateAllowedAddressesList (address _newAddress, bool _value) external onlyGameManager {

        require (_newAddress != address(0));

        allowedAddressList[_newAddress] = _value;
        
    }

    modifier canTransact() { 
        require (msg.sender == gameManagerPrimary
            || msg.sender == gameManagerSecondary
            || allowedAddressList[msg.sender]); 
        _; 
    }
    

    /*** Pausable functionality adapted from OpenZeppelin ***/

    /// @dev Modifier to allow actions only when the contract IS NOT paused
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /// @dev Modifier to allow actions only when the contract IS paused
    modifier whenPaused {
        require(paused);
        _;
    }

    /// @dev Called by any Operator role to pause the contract.
    /// Used only if a bug or exploit is discovered (Here to limit losses / damage)
    function pause() external onlyGameManager whenNotPaused {
        paused = true;
    }

    /// @dev Unpauses the smart contract. Can only be called by the Game Master
    /// @notice This is public rather than external so it can be called by derived contracts. 
    function unpause() public onlyGameManager whenPaused {
        // can't unpause if contract was upgraded
        paused = false;
    }
}

/* @title Interface for MLBNFT Contract
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 */
contract MLBNFT {
    function exists(uint256 _tokenId) public view returns (bool _exists);
    function ownerOf(uint256 _tokenId) public view returns (address _owner);
    function approve(address _to, uint256 _tokenId) public;
    function setApprovalForAll(address _to, bool _approved) public;
    function transferFrom(address _from, address _to, uint256 _tokenId) public;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;
    function createPromoCollectible(uint8 _teamId, uint8 _posId, uint256 _attributes, address _owner, uint256 _gameId, uint256 _playerOverrideId, uint256 _mlbPlayerId) external returns (uint256);
    function createSeedCollectible(uint8 _teamId, uint8 _posId, uint256 _attributes, address _owner, uint256 _gameId, uint256 _playerOverrideId, uint256 _mlbPlayerId) public returns (uint256);
    function checkIsAttached(uint256 _tokenId) public view returns (uint256);
    function getTeamId(uint256 _tokenId) external view returns (uint256);
    function getPlayerId(uint256 _tokenId) external view returns (uint256 playerId);
    function getApproved(uint256 _tokenId) public view returns (address _operator);
    function isApprovedForAll(address _owner, address _operator) public view returns (bool);
}

/* @title Interface for ETH Escrow Contract
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 */
contract LSEscrow {
    function escrowTransfer(address seller, address buyer, uint256 currentPrice, uint256 marketsCut) public returns(bool);
}



/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 *  from ERC721 asset contracts.
 */
contract ERC721Receiver {
    /**
    * @dev Magic value to be returned upon successful reception of an NFT
    *  Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`,
    *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
    */
    bytes4 public constant ERC721_RECEIVED = 0x150b7a02;

    /**
    * @notice Handle the receipt of an NFT
    * @dev The ERC721 smart contract calls this function on the recipient
    *  after a `safetransfer`. This function MAY throw to revert and reject the
    *  transfer. This function MUST use 50,000 gas or less. Return of other
    *  than the magic value MUST result in the transaction being reverted.
    *  Note: the contract address is always the message sender.
    * @param _from The sending address
    * @param _tokenId The NFT identifier which is being transfered
    * @param _data Additional data with no specified format
    * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    */
    function onERC721Received(
        address _operator,
        address _from,
        uint256 _tokenId,
        bytes _data
    )
        public
        returns(bytes4);
}

contract ERC721Holder is ERC721Receiver {
    function onERC721Received(address,address, uint256, bytes) public returns(bytes4) {
        return ERC721_RECEIVED;
    }
}

/* Contains models, variables, and internal methods for the ERC-721 sales.
 * @title Sale Base
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 */
contract SaleBase is OperationalControl, ERC721Holder {
    using SafeMath for uint256;
    
    /// EVENTS 

    event SaleCreated(uint256 tokenID, uint256 startingPrice, uint256 endingPrice, uint256 duration, uint256 startedAt);
    event TeamSaleCreated(uint256[9] tokenIDs, uint256 startingPrice, uint256 endingPrice, uint256 duration, uint256 startedAt);
    event SaleWinner(uint256 tokenID, uint256 totalPrice, address winner);
    event TeamSaleWinner(uint256[9] tokenIDs, uint256 totalPrice, address winner);
    event SaleCancelled(uint256 tokenID, address sellerAddress);
    event EtherWithdrawed(uint256 value);

    /// STORAGE

    /**
     * @dev        Represents an Sale on MLB CryptoBaseball (ERC721)
     */
    struct Sale {
        // Current owner of NFT (ERC721)
        address seller;
        // Price (in wei) at beginning of sale
        uint256 startingPrice;
        // Price (in wei) at end of sale
        uint256 endingPrice;
        // Duration (in seconds) of sale
        uint256 duration;
        // Time when sale started
        // NOTE: 0 if this sale has been concluded
        uint256 startedAt;
        // ERC721 AssetID
        uint256[9] tokenIds;
    }

    /**
     * @dev        Reference to contract tracking ownership & asset details
     */
    MLBNFT public nonFungibleContract;

    /**
     * @dev        Reference to contract tracking ownership & asset details
     */
    LSEscrow public LSEscrowContract;

    /**
     * @dev   Defining a GLOBAL delay time for the auctions to start accepting bidExcess
     * @notice This variable is made to delay the bid process.
     */
    uint256 public BID_DELAY_TIME = 0;

    // Cut owner takes on each sale, measured in basis points (1/100 of a percent).
    // Values 0-10,000 map to 0%-100%
    uint256 public ownerCut = 500; //5%

    // Map from token to their corresponding sale.
    mapping (uint256 => Sale) tokenIdToSale;

    /**
     * @dev        Returns true if the claimant owns the token.
     * @param      _claimant  The claimant
     * @param      _tokenId   The token identifier
     */
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return (nonFungibleContract.ownerOf(_tokenId) == _claimant);
    }

    /**
     * @dev        Internal function to ESCROW
     * @notice     Escrows the ERC721 Token, assigning ownership to this contract. Throws if the escrow fails.
     * @param      _owner    The owner
     * @param      _tokenId  The token identifier
     */
    function _escrow(address _owner, uint256 _tokenId) internal {
        nonFungibleContract.safeTransferFrom(_owner, this, _tokenId);
    }

    /**
     * @dev        Internal Transfer function
     * @notice     Transfers an ERC721 Token owned by this contract to another address. Returns true if the transfer succeeds.
     * @param      _owner     The owner
     * @param      _receiver  The receiver
     * @param      _tokenId   The token identifier
     */
    function _transfer(address _owner, address _receiver, uint256 _tokenId) internal {
        nonFungibleContract.transferFrom(_owner, _receiver, _tokenId);
    }

    /**
     * @dev        Internal Function to add Sale, which duration check (atleast 1 min duration required)
     * @notice     Adds an sale to the list of open sales. Also fires the SaleCreated event.
     * @param      _tokenId  The token identifier
     * @param      _sale     The sale
     */
    function _addSale(uint256 _tokenId, Sale _sale) internal {
        // Require that all sales have a duration of
        // at least one minute.
        require(_sale.duration >= 1 minutes);
        
        tokenIdToSale[_tokenId] = _sale;

        emit SaleCreated(
            uint256(_tokenId),
            uint256(_sale.startingPrice),
            uint256(_sale.endingPrice),
            uint256(_sale.duration),
            uint256(_sale.startedAt)
        );
    }

    /**
     * @dev        Internal Function to add Team Sale, which duration check (atleast 1 min duration required)
     * @notice     Adds an sale to the list of open sales. Also fires the SaleCreated event.
     * @param      _tokenIds  The token identifiers
     * @param      _sale      The sale
     */
    function _addTeamSale(uint256[9] _tokenIds, Sale _sale) internal {
        // Require that all sales have a duration of
        // at least one minute.
        require(_sale.duration >= 1 minutes);
        
        for(uint ii = 0; ii < 9; ii++) {
            require(_tokenIds[ii] != 0);
            require(nonFungibleContract.exists(_tokenIds[ii]));

            tokenIdToSale[_tokenIds[ii]] = _sale;
        }

        emit TeamSaleCreated(
            _tokenIds,
            uint256(_sale.startingPrice),
            uint256(_sale.endingPrice),
            uint256(_sale.duration),
            uint256(_sale.startedAt)
        );
    }

    /**
     * @dev        Facilites Sale cancellation. Also removed the Sale from the array
     * @notice     Cancels an sale (given the collectibleID is not 0). SaleCancelled Event
     * @param      _tokenId  The token identifier
     * @param      _seller   The seller
     */
    function _cancelSale(uint256 _tokenId, address _seller) internal {
        Sale memory saleItem = tokenIdToSale[_tokenId];

        //Check for team sale
        if(saleItem.tokenIds[1] != 0) {
            for(uint ii = 0; ii < 9; ii++) {
                _removeSale(saleItem.tokenIds[ii]);
                _transfer(address(this), _seller, saleItem.tokenIds[ii]);
            }
            emit SaleCancelled(_tokenId, _seller);
        } else {
            _removeSale(_tokenId);
            _transfer(address(this), _seller, _tokenId);
            emit SaleCancelled(_tokenId, _seller);
        }
    }

    /**
     * @dev        Computes the price and transfers winnings. Does NOT transfer ownership of token.
     * @notice     Internal function, helps in making the bid and transferring asset if successful
     * @param      _tokenId    The token identifier
     * @param      _bidAmount  The bid amount
     */
    function _bid(uint256 _tokenId, uint256 _bidAmount)
        internal
        returns (uint256)
    {
        // Get a reference to the sale struct
        Sale storage _sale = tokenIdToSale[_tokenId];
        uint256[9] memory tokenIdsStore = tokenIdToSale[_tokenId].tokenIds;
        
        // Explicitly check that this sale is currently live.
        require(_isOnSale(_sale));

        // Check that the bid is greater than or equal to the current price
        uint256 price = _currentPrice(_sale);
        require(_bidAmount >= price);

        // Grab a reference to the seller before the sale struct
        // gets deleted.
        address seller = _sale.seller;

        // The bid is good! Remove the sale before sending the fees
        // to the sender so we can't have a reentrancy attack.
        if(tokenIdsStore[1] > 0) {
            for(uint ii = 0; ii < 9; ii++) {
                _removeSale(tokenIdsStore[ii]);
            }
        } else {
            _removeSale(_tokenId);
        }

        // Transfer proceeds to seller (if there are any!)
        if (price > 0) {
            // Calculate the marketplace's cut.
            // (NOTE: _computeCut() is guaranteed to return a
            // value <= price)
            uint256 marketsCut = _computeCut(price);
            uint256 sellerProceeds = price.sub(marketsCut);

            seller.transfer(sellerProceeds);
        }

        // Calculate any excess funds included with the bid. If the excess
        // is anything worth worrying about, transfer it back to bidder.
        uint256 bidExcess = _bidAmount.sub(price);

        // Return the funds. Similar to the previous transfer.
        msg.sender.transfer(bidExcess);

        // Tell the world!
        // uint256 assetID, uint256 totalPrice, address winner, uint16 generation
        if(tokenIdsStore[1] > 0) {
            emit TeamSaleWinner(tokenIdsStore, price, msg.sender);
        } else {
            emit SaleWinner(_tokenId, price, msg.sender);
        }
        
        return price;
    }

    /**
     * @dev        Removes an sale from the list of open sales.
     * @notice     Internal Function to remove sales
     * @param      _tokenId  The token identifier
     */
    function _removeSale(uint256 _tokenId) internal {
        delete tokenIdToSale[_tokenId];
    }

    /**
     * @dev        Returns true if the FT (ERC721) is on sale.
     * @notice     Internal function to check if an
     * @param      _sale  The sale
     */
    function _isOnSale(Sale memory _sale) internal pure returns (bool) {
        return (_sale.startedAt > 0);
    }

    /** @dev Returns current price of an FT (ERC721) on sale. Broken into two
     *  functions (this one, that computes the duration from the sale
     *  structure, and the other that does the price computation) so we
     *  can easily test that the price computation works correctly.
     */
    function _currentPrice(Sale memory _sale)
        internal
        view
        returns (uint256)
    {
        uint256 secondsPassed = 0;

        // A bit of insurance against negative values (or wraparound).
        // Probably not necessary (since Ethereum guarnatees that the
        // now variable doesn't ever go backwards).
        if (now > _sale.startedAt.add(BID_DELAY_TIME)) {
            secondsPassed = now.sub(_sale.startedAt.add(BID_DELAY_TIME));
        }

        return _computeCurrentPrice(
            _sale.startingPrice,
            _sale.endingPrice,
            _sale.duration,
            secondsPassed
        );
    }

    /** @dev Computes the current price of an sale. Factored out
     *  from _currentPrice so we can run extensive unit tests.
     *  When testing, make this function public and turn on
     *  `Current price computation` test suite.
     */
    function _computeCurrentPrice(
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        uint256 _secondsPassed
    )
        internal
        pure
        returns (uint256)
    {
        // NOTE: We don't use SafeMath (or similar) in this function because
        //  all of our public functions carefully cap the maximum values for
        //  time (at 64-bits) and currency (at 128-bits). _duration is
        //  also known to be non-zero (see the require() statement in
        //  _addSale())
        if (_secondsPassed >= _duration) {
            // We've reached the end of the dynamic pricing portion
            // of the sale, just return the end price.
            return _endingPrice;
        } else {
            // Starting price can be higher than ending price (and often is!), so
            // this delta can be negative.
            int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);

            // This multiplication can't overflow, _secondsPassed will easily fit within
            // 64-bits, and totalPriceChange will easily fit within 128-bits, their product
            // will always fit within 256-bits.
            int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);

            // currentPriceChange can be negative, but if so, will have a magnitude
            // less that _startingPrice. Thus, this result will always end up positive.
            int256 currentPrice = int256(_startingPrice) + currentPriceChange;

            return uint256(currentPrice);
        }
    }

    /**
     * @dev        Computes owner's cut of a sale.
     * @param      _price  The price
     */
    function _computeCut(uint256 _price) internal view returns (uint256) {
        return _price.mul(ownerCut).div(10000);
    }
}

/* Clock sales functions and interfaces
 * @title SaleManager
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 */
contract SaleManager is SaleBase {

    /// @dev MAPINGS
    mapping (uint256 => uint256[3]) public lastTeamSalePrices;
    mapping (uint256 => uint256) public lastSingleSalePrices;
    mapping (uint256 => uint256) public seedTeamSaleCount;
    uint256 public seedSingleSaleCount = 0;

    /// @dev CONSTANTS
    uint256 public constant SINGLE_SALE_MULTIPLIER = 35;
    uint256 public constant TEAM_SALE_MULTIPLIER = 12;
    uint256 public constant STARTING_PRICE = 10 finney;
    uint256 public constant SALES_DURATION = 1 days;

    bool public isBatchSupported = true;

    /**
     * @dev        Constructor creates a reference to the MLB_NFT Sale Manager contract
     */
    constructor() public {
        require(ownerCut <= 10000); // You can't collect more than 100% silly ;)
        require(msg.sender != address(0));
        paused = true;
        gameManagerPrimary = msg.sender;
        gameManagerSecondary = msg.sender;
        bankManager = msg.sender;
    }

    /// @dev Override unpause so it requires all external contract addresses
    ///  to be set before contract can be unpaused. Also, we can't have
    ///  newContractAddress set either, because then the contract was upgraded.
    /// @notice This is public rather than external so we can call super.unpause
    ///  without using an expensive CALL.
    function unpause() public onlyGameManager whenPaused {
        require(nonFungibleContract != address(0));

        // Actually unpause the contract.
        super.unpause();
    }

    /** @dev Remove all Ether from the contract, which is the owner's cuts
     *  as well as any Ether sent directly to the contract address.
     *  Always transfers to the NFT (ERC721) contract, but can be called either by
     *  the owner or the NFT (ERC721) contract.
     */
    function _withdrawBalance() internal {
        // We are using this boolean method to make sure that even if one fails it will still work
        bankManager.transfer(address(this).balance);
    }


    /** @dev Reject all Ether from being sent here, unless it's from one of the
     *  contracts. (Hopefully, we can prevent user accidents.)
     *  @notice No tipping!
     */
    function() external payable {
        address nftAddress = address(nonFungibleContract);
        require(
            msg.sender == address(this) || 
            msg.sender == gameManagerPrimary ||
            msg.sender == gameManagerSecondary ||
            msg.sender == bankManager ||
            msg.sender == nftAddress ||
            msg.sender == address(LSEscrowContract)
        );
    }

    /**
     * @dev        Creates and begins a new sale.
     * @param      _tokenId        The token identifier
     * @param      _startingPrice  The starting price
     * @param      _endingPrice    The ending price
     * @param      _duration       The duration
     * @param      _seller         The seller
     */
    function _createSale(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _seller
    )
        internal
    {
        Sale memory sale = Sale(
            _seller,
            _startingPrice,
            _endingPrice,
            _duration,
            now,
            [_tokenId,0,0,0,0,0,0,0,0]
        );
        _addSale(_tokenId, sale);
    }

    /**
     * @dev        Internal Function, helps in creating team sale
     * @param      _tokenIds       The token identifiers
     * @param      _startingPrice  The starting price
     * @param      _endingPrice    The ending price
     * @param      _duration       The duration
     * @param      _seller         The seller
     */
    function _createTeamSale(
        uint256[9] _tokenIds,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _seller)
        internal {

        Sale memory sale = Sale(
            _seller,
            _startingPrice,
            _endingPrice,
            _duration,
            now,
            _tokenIds
        );

        /// Add sale obj to all tokens
        _addTeamSale(_tokenIds, sale);
    }

    /** @dev            Cancels an sale that hasn't been won yet. Returns the MLBNFT (ERC721) to original owner.
     *  @notice         This is a state-modifying function that can be called while the contract is paused.
     */
    function cancelSale(uint256 _tokenId) external whenNotPaused {
        Sale memory sale = tokenIdToSale[_tokenId];
        require(_isOnSale(sale));
        address seller = sale.seller;
        require(msg.sender == seller);
        _cancelSale(_tokenId, seller);
    }

    /** @dev        Cancels an sale that hasn't been won yet. Returns the MLBNFT (ERC721) to original owner.
     *  @notice     This is a state-modifying function that can be called while the contract is paused. Can be only called by the GameManagers
     */
    function cancelSaleWhenPaused(uint256 _tokenId) external whenPaused onlyGameManager {
        Sale memory sale = tokenIdToSale[_tokenId];
        require(_isOnSale(sale));
        address seller = sale.seller;
        _cancelSale(_tokenId, seller);
    }

    /** 
     * @dev    Returns sales info for an CSLCollectibles (ERC721) on sale.
     * @notice Fetches the details related to the Sale
     * @param  _tokenId    ID of the token on sale
     */
    function getSale(uint256 _tokenId) external view returns (address seller, uint256 startingPrice, uint256 endingPrice, uint256 duration, uint256 startedAt, uint256[9] tokenIds) {
        Sale memory sale = tokenIdToSale[_tokenId];
        require(_isOnSale(sale));
        return (
            sale.seller,
            sale.startingPrice,
            sale.endingPrice,
            sale.duration,
            sale.startedAt,
            sale.tokenIds
        );
    }

    /**
     * @dev        Returns the current price of an sale.
     * @param      _tokenId  The token identifier
     */
    function getCurrentPrice(uint256 _tokenId) external view returns (uint256) {
        Sale memory sale = tokenIdToSale[_tokenId];
        require(_isOnSale(sale));
        return _currentPrice(sale);
    }

    /** @dev Calculates the new price for Sale Item
     * @param   _saleType     Sale Type Identifier (0 - Single Sale, 1 - Team Sale)
     * @param   _teamId       Team Identifier
     */
    function _averageSalePrice(uint256 _saleType, uint256 _teamId) internal view returns (uint256) {
        uint256 _price = 0;
        if(_saleType == 0) {
            for(uint256 ii = 0; ii < 10; ii++) {
                _price = _price.add(lastSingleSalePrices[ii]);
            }
            _price = _price.mul(SINGLE_SALE_MULTIPLIER).div(100);
        } else {
            for (uint256 i = 0; i < 3; i++) {
                _price = _price.add(lastTeamSalePrices[_teamId][i]);
            }
        
            _price = _price.mul(TEAM_SALE_MULTIPLIER).div(30);
            _price = _price.mul(9);
        }

        return _price;
    }
    
    /**
     * @dev        Put a Collectible up for sale. Does some ownership trickery to create sale in one tx.
     * @param      _tokenId        The token identifier
     * @param      _startingPrice  The starting price
     * @param      _endingPrice    The ending price
     * @param      _duration       The duration
     * @param      _owner          Owner of the token
     */
    function createSale(uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address _owner) external whenNotPaused {
        require(msg.sender == address(nonFungibleContract));

        // Check whether the collectible is inPlay. If inPlay cant put it on Sale
        require(nonFungibleContract.checkIsAttached(_tokenId) == 0);
        
        _escrow(_owner, _tokenId);

        // Sale throws if inputs are invalid and clears
        // transfer and sire approval after escrowing the CSLCollectible.
        _createSale(
            _tokenId,
            _startingPrice,
            _endingPrice,
            _duration,
            _owner
        );
    }

    /**
     * @dev        Put a Collectible up for sale. Only callable, if user approved contract for 1/All Collectibles
     * @param      _tokenId        The token identifier
     * @param      _startingPrice  The starting price
     * @param      _endingPrice    The ending price
     * @param      _duration       The duration
     */
    function userCreateSaleIfApproved (uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration) external whenNotPaused {
        
        require(nonFungibleContract.getApproved(_tokenId) == address(this) || nonFungibleContract.isApprovedForAll(msg.sender, address(this)));
        
        // Check whether the collectible is inPlay. If inPlay cant put it on Sale
        require(nonFungibleContract.checkIsAttached(_tokenId) == 0);
        
        _escrow(msg.sender, _tokenId);

        // Sale throws if inputs are invalid and clears
        // transfer and sire approval after escrowing the CSLCollectible.
        _createSale(
            _tokenId,
            _startingPrice,
            _endingPrice,
            _duration,
            msg.sender
        );
    }

    /** 
     * @dev        Transfers the balance of the sales manager contract to the CSLCollectible contract. We use two-step withdrawal to
     *              prevent two transfer calls in the sale bid function.
     */
    function withdrawSaleManagerBalances() public onlyBanker {
        _withdrawBalance();
    }

    /** 
     *  @dev Function to chnage the OwnerCut only accessible by the Owner of the contract
     *  @param _newCut - Sets the ownerCut to new value
     */
    function setOwnerCut(uint256 _newCut) external onlyBanker {
        require(_newCut <= 10000);
        ownerCut = _newCut;
    }
    
    /**
     * @dev        Facilitates seed collectible auction creation. Enforces strict check on the data being passed
     * @notice     Creates a new Collectible and creates an auction for it.
     * @param      _teamId            The team identifier
     * @param      _posId             The position identifier
     * @param      _attributes        The attributes
     * @param      _playerOverrideId  The player override identifier
     * @param      _mlbPlayerId       The mlb player identifier
     * @param      _startPrice        The start price
     * @param      _endPrice          The end price
     * @param      _saleDuration      The sale duration
     */
    function createSingleSeedAuction(
        uint8 _teamId,
        uint8 _posId,
        uint256 _attributes,
        uint256 _playerOverrideId,
        uint256 _mlbPlayerId,
        uint256 _startPrice,
        uint256 _endPrice,
        uint256 _saleDuration)
        public
        onlyGameManager
        whenNotPaused {
        // Check to see the NFT address is not 0
        require(nonFungibleContract != address(0));
        require(_teamId != 0);

        uint256 nftId = nonFungibleContract.createSeedCollectible(_teamId,_posId,_attributes,address(this),0, _playerOverrideId, _mlbPlayerId);

        uint256 startPrice = 0;
        uint256 endPrice = 0;
        uint256 duration = 0;
        
        if(_startPrice == 0) {
            startPrice = _computeNextSeedPrice(0, _teamId);
        } else {
            startPrice = _startPrice;
        }

        if(_endPrice != 0) {
            endPrice = _endPrice;
        } else {
            endPrice = 0;
        }

        if(_saleDuration == 0) {
            duration = SALES_DURATION;
        } else {
            duration = _saleDuration;
        }

        _createSale(
            nftId,
            startPrice,
            endPrice,
            duration,
            address(this)
        );
    }

    /**
     * @dev        Facilitates promo collectible auction creation. Enforces strict check on the data being passed
     * @notice     Creates a new Collectible and creates an auction for it.
     * @param      _teamId            The team identifier
     * @param      _posId             The position identifier
     * @param      _attributes        The attributes
     * @param      _playerOverrideId  The player override identifier
     * @param      _mlbPlayerId       The mlb player identifier
     * @param      _startPrice        The start price
     * @param      _endPrice          The end price
     * @param      _saleDuration      The sale duration
     */
    function createPromoSeedAuction(
        uint8 _teamId,
        uint8 _posId,
        uint256 _attributes,
        uint256 _playerOverrideId,
        uint256 _mlbPlayerId,
        uint256 _startPrice,
        uint256 _endPrice,
        uint256 _saleDuration)
        public
        onlyGameManager
        whenNotPaused {
        // Check to see the NFT address is not 0
        require(nonFungibleContract != address(0));
        require(_teamId != 0);

        uint256 nftId = nonFungibleContract.createPromoCollectible(_teamId, _posId, _attributes, address(this), 0, _playerOverrideId, _mlbPlayerId);

        uint256 startPrice = 0;
        uint256 endPrice = 0;
        uint256 duration = 0;
        
        if(_startPrice == 0) {
            startPrice = _computeNextSeedPrice(0, _teamId);
        } else {
            startPrice = _startPrice;
        }

        if(_endPrice != 0) {
            endPrice = _endPrice;
        } else {
            endPrice = 0;
        }

        if(_saleDuration == 0) {
            duration = SALES_DURATION;
        } else {
            duration = _saleDuration;
        }

        _createSale(
            nftId,
            startPrice,
            endPrice,
            duration,
            address(this)
        );
    }

    /**
     * @dev        Creates Team Sale Auction
     * @param      _teamId        The team identifier
     * @param      _tokenIds      The token identifiers
     * @param      _startPrice    The start price
     * @param      _endPrice      The end price
     * @param      _saleDuration  The sale duration
     */
    function createTeamSaleAuction(
        uint8 _teamId,
        uint256[9] _tokenIds,
        uint256 _startPrice,
        uint256 _endPrice,
        uint256 _saleDuration)
        public
        onlyGameManager
        whenNotPaused {

        require(_teamId != 0);

        // Helps in not creating sale with wrong team and player combination
        for(uint ii = 0; ii < _tokenIds.length; ii++){
            require(nonFungibleContract.getTeamId(_tokenIds[ii]) == _teamId);
        }
        
        uint256 startPrice = 0;
        uint256 endPrice = 0;
        uint256 duration = 0;
        
        if(_startPrice == 0) {
            startPrice = _computeNextSeedPrice(1, _teamId).mul(9);
        } else {
            startPrice = _startPrice;
        }

        if(_endPrice != 0) {
            endPrice = _endPrice;
        } else {
            endPrice = 0;
        }

        if(_saleDuration == 0) {
            duration = SALES_DURATION;
        } else {
            duration = _saleDuration;
        }

        _createTeamSale(
            _tokenIds,
            startPrice,
            endPrice,
            duration,
            address(this)
        );
    }

    /**
     * @dev        Computes the next auction starting price
     * @param      _saleType     The sale type
     * @param      _teamId       The team identifier
     */
    function _computeNextSeedPrice(uint256 _saleType, uint256 _teamId) internal view returns (uint256) {
        uint256 nextPrice = _averageSalePrice(_saleType, _teamId);

        // Sanity check to ensure we don't overflow arithmetic
        require(nextPrice == nextPrice);

        // We never auction for less than starting price
        if (nextPrice < STARTING_PRICE) {
            nextPrice = STARTING_PRICE;
        }

        return nextPrice;
    }

    /**
     * @dev        Sanity check that allows us to ensure that we are pointing to the right sale call.
     */
    bool public isSalesManager = true;

    /**
     * @dev        works the same as default bid method.
     * @param      _tokenId  The token identifier
     */
    function bid(uint256 _tokenId) public whenNotPaused payable {
        
        Sale memory sale = tokenIdToSale[_tokenId];
        address seller = sale.seller;

        // This check is added to give all users a level playing field to think & bid on the player
        require (now > sale.startedAt.add(BID_DELAY_TIME));
        
        uint256 price = _bid(_tokenId, msg.value);

        //If multi token sale
        if(sale.tokenIds[1] > 0) {
            
            for (uint256 i = 0; i < 9; i++) {
                _transfer(address(this), msg.sender, sale.tokenIds[i]);
            }

            // Avg price
            price = price.div(9);
        } else {
            
            _transfer(address(this), msg.sender, _tokenId);
        }
        
        // If not a seed, exit
        if (seller == address(this)) {
            if(sale.tokenIds[1] > 0){
                uint256 _teamId = nonFungibleContract.getTeamId(_tokenId);

                lastTeamSalePrices[_teamId][seedTeamSaleCount[_teamId] % 3] = price;

                seedTeamSaleCount[_teamId]++;
            } else {
                lastSingleSalePrices[seedSingleSaleCount % 10] = price;
                seedSingleSaleCount++;
            }
        }
    }
    
    /**
     * @dev        Sets the address for the NFT Contract
     * @param      _nftAddress  The nft address
     */
    function setNFTContractAddress(address _nftAddress) public onlyGameManager {
        require (_nftAddress != address(0));        
        nonFungibleContract = MLBNFT(_nftAddress);
    }

    /**
     * @dev        Added this module to allow retrieve of accidental asset transfer to contract
     * @param      _to       { parameter_description }
     * @param      _tokenId  The token identifier
     */
    function assetTransfer(address _to, uint256 _tokenId) public onlyGameManager {
        require(_tokenId != 0);
        nonFungibleContract.transferFrom(address(this), _to, _tokenId);
    }

     /**
     * @dev        Added this module to allow retrieve of accidental asset transfer to contract
     * @param      _to       { parameter_description }
     * @param      _tokenIds  The token identifiers
     */
    function batchAssetTransfer(address _to, uint256[] _tokenIds) public onlyGameManager {
        require(isBatchSupported);
        require (_tokenIds.length > 0);
        
        for(uint i = 0; i < _tokenIds.length; i++){
            require(_tokenIds[i] != 0);
            nonFungibleContract.transferFrom(address(this), _to, _tokenIds[i]);
        }
    }

    /**
     * @dev        Creates new Seed Team Collectibles
     * @notice     Creates a team and transfers all minted assets to SaleManager
     * @param      _teamId       The team identifier
     * @param      _attributes   The attributes
     * @param      _mlbPlayerId  The mlb player identifier
     */
    function createSeedTeam(uint8 _teamId, uint256[9] _attributes, uint256[9] _mlbPlayerId) public onlyGameManager whenNotPaused {
        require(_teamId != 0);
        
        for(uint ii = 0; ii < 9; ii++) {
            nonFungibleContract.createSeedCollectible(_teamId, uint8(ii.add(1)), _attributes[ii], address(this), 0, 0, _mlbPlayerId[ii]);
        }
    }

    /**
     * @dev            Cancels an sale that hasn't been won yet. Returns the MLBNFT (ERC721) to original owner.
     * @notice         This is a state-modifying function that can be called while the contract is paused.
     */
    function batchCancelSale(uint256[] _tokenIds) external whenNotPaused {
        require(isBatchSupported);
        require(_tokenIds.length > 0);

        for(uint ii = 0; ii < _tokenIds.length; ii++){
            Sale memory sale = tokenIdToSale[_tokenIds[ii]];
            require(_isOnSale(sale));
            
            address seller = sale.seller;
            require(msg.sender == seller);

            _cancelSale(_tokenIds[ii], seller);
        }
    }

    /**
     * @dev        Helps to toggle batch supported flag
     * @param      _flag  The flag
     */
    function updateBatchSupport(bool _flag) public onlyGameManager {
        isBatchSupported = _flag;
    }

    /**
     * @dev        Batching Operation: Creates a new Collectible and creates an auction for it.
     * @notice     Helps in creating single seed auctions in batches
     * @param      _teamIds            The team identifier
     * @param      _posIds            The position identifier
     * @param      _attributes        The attributes
     * @param      _playerOverrideIds  The player override identifier
     * @param      _mlbPlayerIds       The mlb player identifier
     * @param      _startPrice         The start price
     */
    function batchCreateSingleSeedAuction(
        uint8[] _teamIds,
        uint8[] _posIds,
        uint256[] _attributes,
        uint256[] _playerOverrideIds,
        uint256[] _mlbPlayerIds,
        uint256 _startPrice)
        public
        onlyGameManager
        whenNotPaused {

        require (isBatchSupported);

        require (_teamIds.length > 0 &&
            _posIds.length > 0 &&
            _attributes.length > 0 &&
            _playerOverrideIds.length > 0 &&
            _mlbPlayerIds.length > 0 );
        
        // Check to see the NFT address is not 0
        require(nonFungibleContract != address(0));
        
        uint256 nftId;

        require (_startPrice != 0);

        for(uint ii = 0; ii < _mlbPlayerIds.length; ii++){
            require(_teamIds[ii] != 0);

            nftId = nonFungibleContract.createSeedCollectible(
                        _teamIds[ii],
                        _posIds[ii],
                        _attributes[ii],
                        address(this),
                        0,
                        _playerOverrideIds[ii],
                        _mlbPlayerIds[ii]);

            _createSale(
                nftId,
                _startPrice,
                0,
                SALES_DURATION,
                address(this)
            );
        }
    }

    /**
     * @dev        Helps in incrementing the delay time to start bidding for any auctions
     * @notice     Function helps to update the delay time for bidding
     * @param      _newDelay       The new Delay time
     */
    function updateDelayTime(uint256 _newDelay) public onlyGameManager whenNotPaused {

        BID_DELAY_TIME = _newDelay;
    }

    function bidTransfer(uint256 _tokenId, address _buyer, uint256 _bidAmount) public canTransact {

        Sale memory sale = tokenIdToSale[_tokenId];
        address seller = sale.seller;

        // This check is added to give all users a level playing field to think & bid on the player
        require (now > sale.startedAt.add(BID_DELAY_TIME));
        
        uint256[9] memory tokenIdsStore = tokenIdToSale[_tokenId].tokenIds;
        
        // Explicitly check that this sale is currently live.
        require(_isOnSale(sale));

        // Check that the bid is greater than or equal to the current price
        uint256 price = _currentPrice(sale);
        require(_bidAmount >= price);

        // The bid is good! Remove the sale before sending the fees
        // to the sender so we can't have a reentrancy attack.
        if(tokenIdsStore[1] > 0) {
            for(uint ii = 0; ii < 9; ii++) {
                _removeSale(tokenIdsStore[ii]);
            }
        } else {
            _removeSale(_tokenId);
        }

        uint256 marketsCut = 0;
        uint256 sellerProceeds = 0;

        // Transfer proceeds to seller (if there are any!)
        if (price > 0) {
            // Calculate the marketplace's cut.
            // (NOTE: _computeCut() is guaranteed to return a
            // value <= price)
            marketsCut = _computeCut(price);
            sellerProceeds = price.sub(marketsCut);
        }

        //escrowTransfer(address seller, address buyer, uint256 currentPrice) public returns(bool);
        require (LSEscrowContract.escrowTransfer(seller, _buyer, sellerProceeds, marketsCut));
        
        // Tell the world!
        // uint256 assetID, uint256 totalPrice, address winner, uint16 generation
        if(tokenIdsStore[1] > 0) {
            emit TeamSaleWinner(tokenIdsStore, price, _buyer);
        } else {
            emit SaleWinner(_tokenId, price, _buyer);
        }

        //If multi token sale
        if(sale.tokenIds[1] > 0) {
            
            for (uint256 i = 0; i < 9; i++) {
                _transfer(address(this), _buyer, sale.tokenIds[i]);
            }

            // Avg price
            price = price.div(9);
        } else {
            
            _transfer(address(this), _buyer, _tokenId);
        }
        
        // If not a seed, exit
        if (seller == address(this)) {
            if(sale.tokenIds[1] > 0) {
                uint256 _teamId = nonFungibleContract.getTeamId(_tokenId);

                lastTeamSalePrices[_teamId][seedTeamSaleCount[_teamId] % 3] = price;

                seedTeamSaleCount[_teamId]++;
            } else {
                lastSingleSalePrices[seedSingleSaleCount % 10] = price;
                seedSingleSaleCount++;
            }
        }
    }

    /**
     * @dev        Sets the address for the LS Escrow Contract
     * @param      _lsEscrowAddress  The nft address
     */
    function setLSEscrowContractAddress(address _lsEscrowAddress) public onlyGameManager {
        require (_lsEscrowAddress != address(0));        
        LSEscrowContract = LSEscrow(_lsEscrowAddress);
    }
}

    Contract ABI  
[{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_buyer","type":"address"},{"name":"_bidAmount","type":"uint256"}],"name":"bidTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gameManagerSecondary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TEAM_SALE_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nftAddress","type":"address"}],"name":"setNFTContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"cancelSaleWhenPaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_teamId","type":"uint8"},{"name":"_posId","type":"uint8"},{"name":"_attributes","type":"uint256"},{"name":"_playerOverrideId","type":"uint256"},{"name":"_mlbPlayerId","type":"uint256"},{"name":"_startPrice","type":"uint256"},{"name":"_endPrice","type":"uint256"},{"name":"_saleDuration","type":"uint256"}],"name":"createPromoSeedAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_flag","type":"bool"}],"name":"updateBatchSupport","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"},{"name":"_value","type":"bool"}],"name":"updateAllowedAddressesList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"bid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"LSEscrowContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"}],"name":"batchCancelSale","outputs":[],"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":"_teamId","type":"uint8"},{"name":"_attributes","type":"uint256[9]"},{"name":"_mlbPlayerId","type":"uint256[9]"}],"name":"createSeedTeam","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isSalesManager","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"},{"name":"_owner","type":"address"}],"name":"createSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawSaleManagerBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCut","type":"uint256"}],"name":"setOwnerCut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gameManagerPrimary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newGM","type":"address"}],"name":"setSecondaryGameManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ownerCut","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"userCreateSaleIfApproved","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"seedSingleSaleCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_teamId","type":"uint8"},{"name":"_tokenIds","type":"uint256[9]"},{"name":"_startPrice","type":"uint256"},{"name":"_endPrice","type":"uint256"},{"name":"_saleDuration","type":"uint256"}],"name":"createTeamSaleAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenIds","type":"uint256[]"}],"name":"batchAssetTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_teamId","type":"uint8"},{"name":"_posId","type":"uint8"},{"name":"_attributes","type":"uint256"},{"name":"_playerOverrideId","type":"uint256"},{"name":"_mlbPlayerId","type":"uint256"},{"name":"_startPrice","type":"uint256"},{"name":"_endPrice","type":"uint256"},{"name":"_saleDuration","type":"uint256"}],"name":"createSingleSeedAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"lastTeamSalePrices","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lsEscrowAddress","type":"address"}],"name":"setLSEscrowContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isBatchSupported","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newGM","type":"address"}],"name":"setPrimaryGameManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_teamIds","type":"uint8[]"},{"name":"_posIds","type":"uint8[]"},{"name":"_attributes","type":"uint256[]"},{"name":"_playerOverrideIds","type":"uint256[]"},{"name":"_mlbPlayerIds","type":"uint256[]"},{"name":"_startPrice","type":"uint256"}],"name":"batchCreateSingleSeedAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"cancelSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SINGLE_SALE_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getCurrentPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STARTING_PRICE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newDelay","type":"uint256"}],"name":"updateDelayTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"lastSingleSalePrices","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getSale","outputs":[{"name":"seller","type":"address"},{"name":"startingPrice","type":"uint256"},{"name":"endingPrice","type":"uint256"},{"name":"duration","type":"uint256"},{"name":"startedAt","type":"uint256"},{"name":"tokenIds","type":"uint256[9]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nonFungibleContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"assetTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bankManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BID_DELAY_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"seedTeamSaleCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ERC721_RECEIVED","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newBK","type":"address"}],"name":"setBanker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SALES_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenID","type":"uint256"},{"indexed":false,"name":"startingPrice","type":"uint256"},{"indexed":false,"name":"endingPrice","type":"uint256"},{"indexed":false,"name":"duration","type":"uint256"},{"indexed":false,"name":"startedAt","type":"uint256"}],"name":"SaleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenIDs","type":"uint256[9]"},{"indexed":false,"name":"startingPrice","type":"uint256"},{"indexed":false,"name":"endingPrice","type":"uint256"},{"indexed":false,"name":"duration","type":"uint256"},{"indexed":false,"name":"startedAt","type":"uint256"}],"name":"TeamSaleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenID","type":"uint256"},{"indexed":false,"name":"totalPrice","type":"uint256"},{"indexed":false,"name":"winner","type":"address"}],"name":"SaleWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenIDs","type":"uint256[9]"},{"indexed":false,"name":"totalPrice","type":"uint256"},{"indexed":false,"name":"winner","type":"address"}],"name":"TeamSaleWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenID","type":"uint256"},{"indexed":false,"name":"sellerAddress","type":"address"}],"name":"SaleCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"value","type":"uint256"}],"name":"EtherWithdrawed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]

  Contract Creation Code Switch To Opcodes View
60806040526003805460a060020a60ff0219169055600060068190556101f4600755600c55600d805461ff001960ff199091166001171661010017905534801561004857600080fd5b50600754612710101561005a57600080fd5b33151561006657600080fd5b6003805460018054600160a060020a0319908116339081179092556002805482168317905560a060020a60ff021990921674010000000000000000000000000000000000000000179190911617905561377580620000c56000396000f30060806040526004361061022c5763ffffffff60e060020a6000350416631430990a81146102b0578063150b7a02146102d95780631740b4791461037d57806319677635146103ae57806323949cd1146103d557806323edfb89146103f65780632598ab9d1461040e578063362f74e71461044157806338a6e8131461045b5780633f4ba83a14610481578063454a2ab314610496578063495b3bcc146104a1578063553ec6be146104b65780635c975abb146104d65780635da08c42146104ff5780636cfdc2421461057157806372a1b73f1461058657806374eb7c90146105b3578063757de573146105c85780637bf3f900146105e057806380373436146105f557806383b5ff8b146106165780638456cb591461062b57806384ececf2146106405780638cd6c7fa146106615780639951a2c8146106765780639a58c33d146106cd578063a29626c214610730578063a888ff6014610763578063aa54abb11461077e578063aaeaa36c1461079f578063b5a54627146107b4578063b792d022146107d5578063bd94b00514610910578063be86d99614610928578063c55d0f561461093d578063d12f702914610955578063d3f1a78c1461096a578063d72d681914610982578063d8f6d5961461099a578063dd1b7a0f14610a22578063e5d9dac414610a37578063e9e2990e14610a5b578063ebef28aa14610a70578063ec8b960814610a85578063ecc98ce414610a9d578063f1ff732b14610ab2578063f396e81b14610ad3575b600454600160a060020a0316333014806102505750600154600160a060020a031633145b806102655750600254600160a060020a031633145b8061027a5750600354600160a060020a031633145b8061028d575033600160a060020a038216145b806102a25750600554600160a060020a031633145b15156102ad57600080fd5b50005b3480156102bc57600080fd5b506102d7600435600160a060020a0360243516604435610ae8565b005b3480156102e557600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261034894600160a060020a03813581169560248035909216956044359536956084940191819084018382808284375094975061101c9650505050505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b34801561038957600080fd5b50610392611045565b60408051600160a060020a039092168252519081900360200190f35b3480156103ba57600080fd5b506103c3611054565b60408051918252519081900360200190f35b3480156103e157600080fd5b506102d7600160a060020a0360043516611059565b34801561040257600080fd5b506102d76004356110be565b34801561041a57600080fd5b506102d760ff6004358116906024351660443560643560843560a43560c43560e4356111c2565b34801561044d57600080fd5b506102d7600435151561136f565b34801561046757600080fd5b506102d7600160a060020a036004351660243515156113b0565b34801561048d57600080fd5b506102d761141e565b6102d7600435611485565b3480156104ad57600080fd5b50610392611709565b3480156104c257600080fd5b506102d76004803560248101910135611718565b3480156104e257600080fd5b506104eb611867565b604080519115158252519081900360200190f35b34801561050b57600080fd5b50604080516101208082019092526102d7916004803560ff16923692610144919060249060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375093965061187795505050505050565b34801561057d57600080fd5b506104eb6119df565b34801561059257600080fd5b506102d7600435602435604435606435600160a060020a03608435166119ed565b3480156105bf57600080fd5b506102d7611acd565b3480156105d457600080fd5b506102d7600435611aec565b3480156105ec57600080fd5b50610392611b17565b34801561060157600080fd5b506102d7600160a060020a0360043516611b26565b34801561062257600080fd5b506103c3611b8b565b34801561063757600080fd5b506102d7611b91565b34801561064c57600080fd5b506102d7600435602435604435606435611bfc565b34801561066d57600080fd5b506103c3611e0d565b34801561068257600080fd5b50604080516101208082019092526102d7916004803560ff16923692610144919060249060099083908390808284375093965050833594505050602082013591604001359050611e13565b3480156106d957600080fd5b506040805160206004602480358281013584810280870186019097528086526102d7968435600160a060020a031696369660449591949091019291829185019084908082843750949750611f989650505050505050565b34801561073c57600080fd5b506102d760ff6004358116906024351660443560643560843560a43560c43560e4356120d8565b34801561076f57600080fd5b506103c36004356024356121f9565b34801561078a57600080fd5b506102d7600160a060020a036004351661221b565b3480156107ab57600080fd5b506104eb612280565b3480156107c057600080fd5b506102d7600160a060020a0360043516612289565b3480156107e157600080fd5b50604080516020600480358082013583810280860185019096528085526102d795369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975050933594506122ee9350505050565b34801561091c57600080fd5b506102d7600435612537565b34801561093457600080fd5b506103c361261c565b34801561094957600080fd5b506103c3600435612621565b34801561096157600080fd5b506103c36126dc565b34801561097657600080fd5b506102d76004356126e7565b34801561098e57600080fd5b506103c3600435612731565b3480156109a657600080fd5b506109b2600435612743565b6040518087600160a060020a0316600160a060020a0316815260200186815260200185815260200184815260200183815260200182600960200280838360005b83811015610a0a5781810151838201526020016109f2565b50505050905001965050505050505060405180910390f35b348015610a2e57600080fd5b5061039261282c565b348015610a4357600080fd5b506102d7600160a060020a036004351660243561283b565b348015610a6757600080fd5b506103926128fe565b348015610a7c57600080fd5b506103c361290d565b348015610a9157600080fd5b506103c3600435612913565b348015610aa957600080fd5b50610348612925565b348015610abe57600080fd5b506102d7600160a060020a0360043516612949565b348015610adf57600080fd5b506103c3612997565b610af0613679565b6000610afa6136bf565b60015460009081908190819081908190600160a060020a0316331480610b2a5750600254600160a060020a031633145b80610b4457503360009081526020819052604090205460ff165b1515610b4f57600080fd5b60008c815260086020908152604091829020825160c0810184528154600160a060020a03168152600182015492810192909252600281015482840152600381015460608301526004810154608083015282516101208101938490529192909160a0840191600584019060099082845b815481526020019060010190808311610bbe57505050505081525050985088600001519750610bfc6006548a6080015161299e90919063ffffffff16565b4211610c0757600080fd5b60008c815260086020526040908190208151610120810190925260050160098282826020028201915b815481526020019060010190808311610c305750505050509650610c53896129bb565b1515610c5e57600080fd5b610c67896129c5565b9550858a1015610c7657600080fd5b602087015160001015610cba57600094505b6009851015610cb557610caa878660098110610ca057fe5b6020020151612a2c565b600190940193610c88565b610cc3565b610cc38c612a2c565b60009350600092506000861115610cf257610cdd86612a72565b9350610cef868563ffffffff612aa116565b92505b600554604080517f95955d22000000000000000000000000000000000000000000000000000000008152600160a060020a038b811660048301528e811660248301526044820187905260648201889052915191909216916395955d229160848083019260209291908290030181600087803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b505050506040513d6020811015610d9a57600080fd5b50511515610da757600080fd5b602087015160001015610e2c577f3e26b609bdb78965c3cc474d081fd9416c228fc7f1600c1b6511c736798e4b9f87878d6040518084600960200280838360005b83811015610e00578181015183820152602001610de8565b50505050919091019384525050600160a060020a031660208201526040805191829003019150a1610e75565b604080518d815260208101889052600160a060020a038d168183015290517fe7f91fae5e362a076a229ddbcc13864728b3f5dcceefc79cf8940e64997db9859181900360600190a15b60a08901516020015160001015610ed857600091505b6009821015610ec057610eb5308c8b60a0015185600981101515610eab57fe5b6020020151612ab8565b600190910190610e8b565b610ed186600963ffffffff612b4f16565b9550610ee3565b610ee3308c8e612ab8565b600160a060020a03881630141561100e5760a08901516020015160001015610fdf5760048054604080517f794285700000000000000000000000000000000000000000000000000000000081529283018f905251600160a060020a039091169163794285709160248083019260209291908290030181600087803b158015610f6a57600080fd5b505af1158015610f7e573d6000803e3d6000fd5b505050506040513d6020811015610f9457600080fd5b50516000818152600960209081526040808320600b9092529091205491925087916003900660038110610fc357fe5b01556000818152600b602052604090208054600101905561100e565b85600a6000600a600c54811515610ff257fe5b068152602081019190915260400160002055600c805460010190555b505050505050505050505050565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b600254600160a060020a031681565b600c81565b600154600160a060020a031633148061107c5750600254600160a060020a031633145b151561108757600080fd5b600160a060020a038116151561109c57600080fd5b60048054600160a060020a031916600160a060020a0392909216919091179055565b6110c6613679565b60035460009060a060020a900460ff1615156110e157600080fd5b600154600160a060020a03163314806111045750600254600160a060020a031633145b151561110f57600080fd5b600083815260086020908152604091829020825160c0810184528154600160a060020a03168152600182015492810192909252600281015482840152600381015460608301526004810154608083015282516101208101938490529192909160a0840191600584019060099082845b81548152602001906001019080831161117e5750505050508152505091506111a5826129bb565b15156111b057600080fd5b5080516111bd8382612b72565b505050565b600154600090819081908190600160a060020a03163314806111ee5750600254600160a060020a031633145b15156111f957600080fd5b60035460a060020a900460ff161561121057600080fd5b600454600160a060020a0316151561122757600080fd5b60ff8c16151561123657600080fd5b600460009054906101000a9004600160a060020a0316600160a060020a031663b7dcf6a98d8d8d3060008f8f6040518863ffffffff1660e060020a028152600401808860ff1660ff1681526020018760ff1660ff16815260200186815260200185600160a060020a0316600160a060020a03168152602001848152602001838152602001828152602001975050505050505050602060405180830381600087803b1580156112e357600080fd5b505af11580156112f7573d6000803e3d6000fd5b505050506040513d602081101561130d57600080fd5b50519350600092508291508190508615156113375761133060008d60ff16612cfa565b925061133b565b8692505b85156113495785915061134e565b600091505b84151561135f575062015180611362565b50835b61100e8484848430612d28565b600154600160a060020a03163314806113925750600254600160a060020a031633145b151561139d57600080fd5b600d805460ff1916911515919091179055565b600154600160a060020a03163314806113d35750600254600160a060020a031633145b15156113de57600080fd5b600160a060020a03821615156113f357600080fd5b600160a060020a03919091166000908152602081905260409020805460ff1916911515919091179055565b600154600160a060020a03163314806114415750600254600160a060020a031633145b151561144c57600080fd5b60035460a060020a900460ff16151561146457600080fd5b600454600160a060020a0316151561147b57600080fd5b611483612dbb565b565b61148d613679565b60035460009081908190819060a060020a900460ff16156114ad57600080fd5b600086815260086020908152604091829020825160c0810184528154600160a060020a03168152600182015492810192909252600281015482840152600381015460608301526004810154608083015282516101208101938490529192909160a0840191600584019060099082845b81548152602001906001019080831161151c5750505050508152505094508460000151935061155a600654866080015161299e90919063ffffffff16565b421161156557600080fd5b61156f8634612e21565b60a086015160200151909350600010156115cb57600091505b60098210156115b3576115a830338760a0015185600981101515610eab57fe5b600190910190611588565b6115c483600963ffffffff612b4f16565b92506115d6565b6115d6303388612ab8565b600160a060020a0384163014156117015760a085015160200151600010156116d25760048054604080517f7942857000000000000000000000000000000000000000000000000000000000815292830189905251600160a060020a039091169163794285709160248083019260209291908290030181600087803b15801561165d57600080fd5b505af1158015611671573d6000803e3d6000fd5b505050506040513d602081101561168757600080fd5b50516000818152600960209081526040808320600b90925290912054919250849160039006600381106116b657fe5b01556000818152600b6020526040902080546001019055611701565b82600a6000600a600c548115156116e557fe5b068152602081019190915260400160002055600c805460010190555b505050505050565b600554600160a060020a031681565b6000611722613679565b60035460009060a060020a900460ff161561173c57600080fd5b600d5460ff16151561174d57600080fd5b6000841161175a57600080fd5b600092505b83831015611860576008600086868681811061177757fe5b60209081029290920135835250818101929092526040908101600020815160c0810183528154600160a060020a0316815260018201549381019390935260028101548383015260038101546060840152600481015460808401528151610120810192839052909160a084019190600584019060099082845b8154815260200190600101908083116117ef575050505050815250509150611816826129bb565b151561182157600080fd5b50805133600160a060020a0382161461183957600080fd5b61185585858581811061184857fe5b9050602002013582612b72565b60019092019161175f565b5050505050565b60035460a060020a900460ff1681565b600154600090600160a060020a031633148061189d5750600254600160a060020a031633145b15156118a857600080fd5b60035460a060020a900460ff16156118bf57600080fd5b60ff841615156118ce57600080fd5b5060005b60098110156119d957600454600160a060020a0316634f6d04e7856118fe84600163ffffffff61299e16565b86856009811061190a57fe5b60200201513060008089896009811061191f57fe5b60200201516040518863ffffffff1660e060020a028152600401808860ff1660ff1681526020018760ff1660ff16815260200186815260200185600160a060020a0316600160a060020a03168152602001848152602001838152602001828152602001975050505050505050602060405180830381600087803b1580156119a557600080fd5b505af11580156119b9573d6000803e3d6000fd5b505050506040513d60208110156119cf57600080fd5b50506001016118d2565b50505050565b600d54610100900460ff1681565b60035460a060020a900460ff1615611a0457600080fd5b600454600160a060020a03163314611a1b57600080fd5b60048054604080517f5265440c00000000000000000000000000000000000000000000000000000000815292830188905251600160a060020a0390911691635265440c9160248083019260209291908290030181600087803b158015611a8057600080fd5b505af1158015611a94573d6000803e3d6000fd5b505050506040513d6020811015611aaa57600080fd5b505115611ab657600080fd5b611ac0818661315d565b6118608585858585612d28565b600354600160a060020a03163314611ae457600080fd5b6114836131d5565b600354600160a060020a03163314611b0357600080fd5b612710811115611b1257600080fd5b600755565b600154600160a060020a031681565b600154600160a060020a0316331480611b495750600254600160a060020a031633145b1515611b5457600080fd5b600160a060020a0381161515611b6957600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60075481565b600154600160a060020a0316331480611bb45750600254600160a060020a031633145b1515611bbf57600080fd5b60035460a060020a900460ff1615611bd657600080fd5b6003805474ff0000000000000000000000000000000000000000191660a060020a179055565b60035460a060020a900460ff1615611c1357600080fd5b60048054604080517f081812fc000000000000000000000000000000000000000000000000000000008152928301879052513092600160a060020a039092169163081812fc9160248083019260209291908290030181600087803b158015611c7a57600080fd5b505af1158015611c8e573d6000803e3d6000fd5b505050506040513d6020811015611ca457600080fd5b5051600160a060020a03161480611d50575060048054604080517fe985e9c5000000000000000000000000000000000000000000000000000000008152339381019390935230602484015251600160a060020a039091169163e985e9c59160448083019260209291908290030181600087803b158015611d2357600080fd5b505af1158015611d37573d6000803e3d6000fd5b505050506040513d6020811015611d4d57600080fd5b50515b1515611d5b57600080fd5b60048054604080517f5265440c00000000000000000000000000000000000000000000000000000000815292830187905251600160a060020a0390911691635265440c9160248083019260209291908290030181600087803b158015611dc057600080fd5b505af1158015611dd4573d6000803e3d6000fd5b505050506040513d6020811015611dea57600080fd5b505115611df657600080fd5b611e00338561315d565b6119d98484848433612d28565b600c5481565b600154600090819081908190600160a060020a0316331480611e3f5750600254600160a060020a031633145b1515611e4a57600080fd5b60035460a060020a900460ff1615611e6157600080fd5b60ff89161515611e7057600080fd5b600093505b6009841015611f1f5760045460ff8a1690600160a060020a031663794285708a8760098110611ea057fe5b60200201516040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b158015611ede57600080fd5b505af1158015611ef2573d6000803e3d6000fd5b505050506040513d6020811015611f0857600080fd5b505114611f1457600080fd5b600190930192611e75565b506000915081905080861515611f5557611f4e6009611f4260018c60ff16612cfa565b9063ffffffff61321216565b9250611f59565b8692505b8515611f6757859150611f6c565b600091505b841515611f7d575062015180611f80565b50835b611f8d8884848430613240565b505050505050505050565b600154600090600160a060020a0316331480611fbe5750600254600160a060020a031633145b1515611fc957600080fd5b600d5460ff161515611fda57600080fd5b8151600010611fe857600080fd5b5060005b81518110156111bd57818181518110151561200357fe5b60209081029091010151151561201857600080fd5b6004548251600160a060020a03909116906323b872dd903090869086908690811061203f57fe5b906020019060200201516040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183600160a060020a0316600160a060020a031681526020018281526020019350505050600060405180830381600087803b1580156120b457600080fd5b505af11580156120c8573d6000803e3d6000fd5b505060019092019150611fec9050565b600154600090819081908190600160a060020a03163314806121045750600254600160a060020a031633145b151561210f57600080fd5b60035460a060020a900460ff161561212657600080fd5b600454600160a060020a0316151561213d57600080fd5b60ff8c16151561214c57600080fd5b600460009054906101000a9004600160a060020a0316600160a060020a0316634f6d04e78d8d8d3060008f8f6040518863ffffffff1660e060020a028152600401808860ff1660ff1681526020018760ff1660ff16815260200186815260200185600160a060020a0316600160a060020a03168152602001848152602001838152602001828152602001975050505050505050602060405180830381600087803b1580156112e357600080fd5b6009602052600082815260409020816003811061221257fe5b01549150829050565b600154600160a060020a031633148061223e5750600254600160a060020a031633145b151561224957600080fd5b600160a060020a038116151561225e57600080fd5b60058054600160a060020a031916600160a060020a0392909216919091179055565b600d5460ff1681565b600154600160a060020a03163314806122ac5750600254600160a060020a031633145b15156122b757600080fd5b600160a060020a03811615156122cc57600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b6001546000908190600160a060020a03163314806123165750600254600160a060020a031633145b151561232157600080fd5b60035460a060020a900460ff161561233857600080fd5b600d5460ff16151561234957600080fd5b6000885111801561235b575060008751115b8015612368575060008651115b8015612375575060008551115b8015612382575060008451115b151561238d57600080fd5b600454600160a060020a031615156123a457600080fd5b8215156123b057600080fd5b5060005b835181101561252d5787818151811015156123cb57fe5b6020908102909101015160ff1615156123e357600080fd5b6004548851600160a060020a0390911690634f6d04e7908a908490811061240657fe5b90602001906020020151898481518110151561241e57fe5b90602001906020020151898581518110151561243657fe5b906020019060200201513060008b8881518110151561245157fe5b906020019060200201518b8981518110151561246957fe5b60209081029091018101516040805160e060020a63ffffffff8c1602815260ff998a1660048201529790981660248801526044870195909552600160a060020a039093166064860152608485019190915260a484015260c4830191909152915160e480830193928290030181600087803b1580156124e657600080fd5b505af11580156124fa573d6000803e3d6000fd5b505050506040513d602081101561251057600080fd5b50519150612525828460006201518030612d28565b6001016123b4565b5050505050505050565b61253f613679565b60035460009060a060020a900460ff161561255957600080fd5b600083815260086020908152604091829020825160c0810184528154600160a060020a03168152600182015492810192909252600281015482840152600381015460608301526004810154608083015282516101208101938490529192909160a0840191600584019060099082845b8154815260200190600101908083116125c85750505050508152505091506125ef826129bb565b15156125fa57600080fd5b50805133600160a060020a0382161461261257600080fd5b6111bd8382612b72565b602381565b600061262b613679565b600083815260086020908152604091829020825160c0810184528154600160a060020a03168152600182015492810192909252600281015482840152600381015460608301526004810154608083015282516101208101938490529192909160a0840191600584019060099082845b81548152602001906001019080831161269a5750505050508152505090506126c1816129bb565b15156126cc57600080fd5b6126d5816129c5565b9392505050565b662386f26fc1000081565b600154600160a060020a031633148061270a5750600254600160a060020a031633145b151561271557600080fd5b60035460a060020a900460ff161561272c57600080fd5b600655565b600a6020526000908152604090205481565b60008060008060006127536136bf565b61275b613679565b600088815260086020908152604091829020825160c0810184528154600160a060020a03168152600182015492810192909252600281015482840152600381015460608301526004810154608083015282516101208101938490529192909160a0840191600584019060099082845b8154815260200190600101908083116127ca5750505050508152505090506127f1816129bb565b15156127fc57600080fd5b8051602082015160408301516060840151608085015160a090950151939c929b5090995097509195509350915050565b600454600160a060020a031681565b600154600160a060020a031633148061285e5750600254600160a060020a031633145b151561286957600080fd5b80151561287557600080fd5b60048054604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523093810193909352600160a060020a0385811660248501526044840185905290519116916323b872dd91606480830192600092919082900301818387803b1580156128ea57600080fd5b505af1158015611701573d6000803e3d6000fd5b600354600160a060020a031681565b60065481565b600b6020526000908152604090205481565b7f150b7a020000000000000000000000000000000000000000000000000000000081565b600354600160a060020a0316331461296057600080fd5b600160a060020a038116151561297557600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b6201518081565b6000828201838110156129b057600080fd5b8091505b5092915050565b6080015160001090565b600654608082015160009182916129e19163ffffffff61299e16565b421115612a1457612a11612a04600654856080015161299e90919063ffffffff16565b429063ffffffff612aa116565b90505b6126d58360200151846040015185606001518461328b565b60008181526008602052604081208054600160a060020a031916815560018101829055600281018290556003810182905560048101829055906111bd60058301826136df565b6000612a9b612710612a8f6007548561321290919063ffffffff16565b9063ffffffff612b4f16565b92915050565b60008083831115612ab157600080fd5b5050900390565b60048054604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0387811694820194909452858416602482015260448101859052905192909116916323b872dd9160648082019260009290919082900301818387803b158015612b3257600080fd5b505af1158015612b46573d6000803e3d6000fd5b50505050505050565b600080808311612b5e57600080fd5b8284811515612b6957fe5b04949350505050565b612b7a613679565b6000838152600860209081526040808320815160c0810183528154600160a060020a0316815260018201549381019390935260028101548383015260038101546060840152600481015460808401528151610120810192839052909160a084019190600584019060099082845b815481526020019060010190808311612be7575050509190925250505060a08101516020015190925015612c9d575060005b6009811015612c555760a0820151612c36908260098110610ca057fe5b612c4d30848460a0015184600981101515610eab57fe5b600101612c19565b60408051858152600160a060020a038516602082015281517fd9e530acb8429c8e5337d9d3230e4cc7d742e32c2fc8d76608c19f2e1701ed04929181900390910190a16119d9565b612ca684612a2c565b612cb1308486612ab8565b60408051858152600160a060020a038516602082015281517fd9e530acb8429c8e5337d9d3230e4cc7d742e32c2fc8d76608c19f2e1701ed04929181900390910190a150505050565b600080612d0784846132c8565b9050662386f26fc100008110156129b05750662386f26fc100009392505050565b612d30613679565b60c06040519081016040528083600160a060020a0316815260200186815260200185815260200184815260200142815260200161012060405190810160405280898152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815250815250905061170186826133a5565b600154600160a060020a0316331480612dde5750600254600160a060020a031633145b1515612de957600080fd5b60035460a060020a900460ff161515612e0157600080fd5b6003805474ff000000000000000000000000000000000000000019169055565b600080612e2c6136bf565b60008581526008602052604080822081516101208101928390529094508291829182918291829160058a019060099082845b815481526020019060010190808311612e5e5750506040805160c0810182528d54600160a060020a0316815260018e0154602082015260028e01548183015260038e0154606082015260048e015460808201528151610120810192839052959c50612efc959094508d935060a08501925090600584019060099082845b815481526020019060010190808311612edb575050505050815250506129bb565b1515612f0757600080fd5b6040805160c0810182528954600160a060020a0316815260018a0154602082015260028a01548183015260038a0154606082015260048a015460808201528151610120810192839052612f87928b9160a0840191600584019060099082845b815481526020019060010190808311612f66575050505050815250506129c5565b9550858a1015612f9657600080fd5b8754600160a060020a03169450600087600160200201511115612fe057600093505b6009841015612fdb57612fd0878560098110610ca057fe5b600190930192612fb8565b612fe9565b612fe98b612a2c565b600086111561304857612ffb86612a72565b925061300d868463ffffffff612aa116565b604051909250600160a060020a0386169083156108fc029084906000818181858888f19350505050158015613046573d6000803e3d6000fd5b505b6130588a8763ffffffff612aa116565b604051909150339082156108fc029083906000818181858888f19350505050158015613088573d6000803e3d6000fd5b5060208701516000101561310e577f3e26b609bdb78965c3cc474d081fd9416c228fc7f1600c1b6511c736798e4b9f8787336040518084600960200280838360005b838110156130e25781810151838201526020016130ca565b50505050919091019384525050600160a060020a031660208201526040805191829003019150a161314e565b604080518c815260208101889052338183015290517fe7f91fae5e362a076a229ddbcc13864728b3f5dcceefc79cf8940e64997db9859181900360600190a15b50939998505050505050505050565b60048054604080517f42842e0e000000000000000000000000000000000000000000000000000000008152600160a060020a038681169482019490945230602482015260448101859052905192909116916342842e0e9160648082019260009290919082900301818387803b1580156128ea57600080fd5b600354604051600160a060020a0390911690303180156108fc02916000818181858888f1935050505015801561320f573d6000803e3d6000fd5b50565b60008083151561322557600091506129b4565b5082820282848281151561323557fe5b04146129b057600080fd5b613248613679565b60c06040519081016040528083600160a060020a03168152602001868152602001858152602001848152602001428152602001878152509050611701868261348a565b600080808085851061329f578693506132bd565b8787039250858584028115156132b157fe5b05915081880190508093505b505050949350505050565b600080808085151561332c57600091505b600a82101561330f576000828152600a602052604090205461330290849063ffffffff61299e16565b92506001909101906132d9565b6133256064612a8f85602363ffffffff61321216565b925061339b565b5060005b600381101561336f57600085815260096020526040902061336590826003811061335657fe5b0154849063ffffffff61299e16565b9250600101613330565b613385601e612a8f85600c63ffffffff61321216565b925061339883600963ffffffff61321216565b92505b5090949350505050565b6060810151603c11156133b757600080fd5b60008281526008602090815260409182902083518154600160a060020a031916600160a060020a03909116178155908301516001820155908201516002820155606082015160038201556080820151600482015560a082015182919061342390600583019060096136ee565b50505060208082015160408084015160608086015160808088015185518a8152978801969096528685019390935290850152830191909152517f6688114a9b77bcf97076216092c6794f7c541749631612664980599eaff1f5329181900360a00190a15050565b6000603c8260600151101515156134a057600080fd5b5060005b60098110156135e8578281600981106134b957fe5b602002015115156134c957600080fd5b600454600160a060020a0316634f558e798483600981106134e657fe5b60200201516040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b15801561352457600080fd5b505af1158015613538573d6000803e3d6000fd5b505050506040513d602081101561354e57600080fd5b5051151561355b57600080fd5b816008600085846009811061356c57fe5b60209081029190910151825281810192909252604090810160002083518154600160a060020a031916600160a060020a039091161781559183015160018301558201516002820155606082015160038201556080820151600482015560a08201516135dd90600583019060096136ee565b5050506001016134a4565b7f67296fd73b6bfd01e6b0ad1dc90e93fd5018a084590dc8aa4634e01290a45c348383602001518460400151856060015186608001516040518086600960200280838360005b8381101561364657818101518382015260200161362e565b505050509050018581526020018481526020018381526020018281526020019550505050505060405180910390a1505050565b6101c0604051908101604052806000600160a060020a03168152602001600081526020016000815260200160008152602001600081526020016136ba6136bf565b905290565b610120604051908101604052806009906020820280388339509192915050565b5061320f90600981019061372c565b826009810192821561371c579160200282015b8281111561371c578251825591602001919060010190613701565b5061372892915061372c565b5090565b61374691905b808211156137285760008155600101613732565b905600a165627a7a723058203408577a17c8dea00c33371e52dbd014003d4cb6986631dcb591ca03e0c953080029

   Swarm Source:
bzzr://3408577a17c8dea00c33371e52dbd014003d4cb6986631dcb591ca03e0c95308

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.