Contract Overview
Balance: 23.759875 Ether
Transactions: 174 txns
Token Tracker: Block Brawlers (BB)
 Latest 25 transactions from a total of 174 transactions

TxHash Age From To Value [TxFee]
0x19605bdb5ad02758ea66adda4f3bce3d926245e346e5f2058be9a42648f9ffbf39 days 7 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.01 Ether0.000045041
0xe6a2552c77b70c5f14f4d52bd64d807caefcfc9716a21e20c318e63c810dc02139 days 8 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.02 Ether0.000131884
0x1931fe2579dcb815156d74f623831f41b36921f28bf3a4dc9afbefa79e47ae8639 days 8 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.01 Ether0.000044883
0xe02928444b02975ca75852a14c5409287c2f604fb7280f94a43f948fb4fd769139 days 8 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.06 Ether0.000335181
0xdf6ee98fb536a723bfc5780b6e5f896082f15795d2600efbdfd23a343d4463bd49 days 10 hrs ago0xc29485b3cd883580a40c540e9cc72a127fd14a77  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.06 Ether0.000335113
0x7e001b1147c072c37f2b0ca11a77fd61b9810ca534979a9a30bb8a256d4d786f50 days 8 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.06 Ether0.000335149
0x250bd23f32de85b18a46d1541b465ca03f98c2fbcda91b745040eb52221325b357 days 5 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.045 Ether0.000032662
0x8ead1efcc73b5d7c1ca6f93c4d9a4b3fa46be0f14d9a2760bb59f1a8a902018b57 days 5 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.045 Ether0.000044301
0x86ad5a256a2182c68222705ea70ae68c82b11a56b8cc7f4cebed7f779d2ecdeb57 days 5 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.04 Ether0.000044301
0xb5794db378bae47f0e6b3cfb28b2b60eeb732e30a123450a7502a7cc77509ca757 days 5 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.035 Ether0.000044087
0x67607659d7f491a89120764a7fa4dc9d4a53e4cbff43b215e2701f294bc3ef6557 days 5 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.03 Ether0.000044087
0xaf6a2707b67c5d5dbb135786b114e0f25f433715459849b4abcf26c02299899d57 days 5 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.025 Ether0.000045159
0xacccb5ac5d77b37b2c35c7e37873774b3190c2a9591373e1958db8261aa5b93857 days 5 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.02 Ether0.000043949
0x62cb83181e1ec13537f8e36e5ec33cbe07e1181524b4ea681c0886ff3c0ca3fa57 days 5 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.015 Ether0.000043949
0x10b4efc881e92869d5194f5889903e311f8569f28874684e2e6df9963f0e46e957 days 5 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.01 Ether0.00004451
0x939857763c61511351679d69b8e79929df004f4d85a4474c12adf66dbf1c241957 days 6 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.02 Ether0.000131884
0x6f4ac4f781a67fb202a6815224252917501d2de7fb748092b9368471aacc3bf857 days 6 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.02 Ether0.000131832
0xc92073c4abe23267aacf3af490290dfe83fc8470907a081c8d4fa6df6f13514a57 days 6 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.06 Ether0.000329538
0x0d4642c07b05fdc4dae5faeefd814b7c1ab59cc7e71bdeac95a56070c91b163857 days 6 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether0.000045072
0xba54c9cbbccf5f18fd6b45bb14ffc1789fb02efede6e062da7d85f549703d44657 days 7 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether0.000045061
0xa76db30fa3d1f345bd78923343f4b0e26562578470d45bd7f281d103be53ec8757 days 7 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether0.000045072
0xc695190f9b55549f0a1515645e6e02cb5ebcb33aa9d9bb0566dcda193766f6fc57 days 7 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140.06 Ether0.000335175
0x5bbd70f23aee4c52ad5634f1a8b45bfa679089da95948f1d32fc81add4424d2e58 days 3 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether0.000028286
0xc6f78f98dcebd8c65fab9cd301dcd49a94bec6873b88365b908c7efaa09b661b58 days 3 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether0.000044205
0x63e787e5a188766cce4f8c47030d294201cc718caf2bd5704695660c765c95cd58 days 3 hrs ago0xd9a2117f1172e19beda8af02aa71b2f396911891  IN   0x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether0.000028286
[ 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
0x53181670fbca2fd7ff2861f55d1eb939d14aa938a992b6dbe2a4b9a90fbb74711000985337 days 8 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x53181670fbca2fd7ff2861f55d1eb939d14aa938a992b6dbe2a4b9a90fbb74711000985337 days 8 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x53181670fbca2fd7ff2861f55d1eb939d14aa938a992b6dbe2a4b9a90fbb74711000985337 days 8 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x53181670fbca2fd7ff2861f55d1eb939d14aa938a992b6dbe2a4b9a90fbb74711000985337 days 8 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x53181670fbca2fd7ff2861f55d1eb939d14aa938a992b6dbe2a4b9a90fbb74711000985337 days 8 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x53181670fbca2fd7ff2861f55d1eb939d14aa938a992b6dbe2a4b9a90fbb74711000985337 days 8 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0xe3807dfcb8211a7964c940721e4392cb75ab17eb232c2a6747e1a8888215c603998666439 days 6 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0xe3807dfcb8211a7964c940721e4392cb75ab17eb232c2a6747e1a8888215c603998666439 days 6 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x95ec6a4fa8496bdd1329ce4527b6399652025f028afa5f0460b163fa64a13c3a998664639 days 6 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x95ec6a4fa8496bdd1329ce4527b6399652025f028afa5f0460b163fa64a13c3a998664639 days 6 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x95ec6a4fa8496bdd1329ce4527b6399652025f028afa5f0460b163fa64a13c3a998664639 days 6 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x95ec6a4fa8496bdd1329ce4527b6399652025f028afa5f0460b163fa64a13c3a998664639 days 6 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x83836b2752db4cc86199d8d7dd67d9edb3d3ef296b10c4680bb374dcd3164899998657339 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x808e78b7d19468c5f3a9aaa869bc2cd9417ee2277a81ec759ce198d5ed2308f6998657239 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x10c1bba082593c7ad57468ffe315e53f8fff428e65d606c504ef6609c07b873d998652539 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x10c1bba082593c7ad57468ffe315e53f8fff428e65d606c504ef6609c07b873d998652539 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x10c1bba082593c7ad57468ffe315e53f8fff428e65d606c504ef6609c07b873d998652539 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x9a5fbec135fe4083b696d2e925d42a7892d5af3d1122e92388d079f529dc8db6998648339 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x9a5fbec135fe4083b696d2e925d42a7892d5af3d1122e92388d079f529dc8db6998648339 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x9a5fbec135fe4083b696d2e925d42a7892d5af3d1122e92388d079f529dc8db6998648339 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x9a5fbec135fe4083b696d2e925d42a7892d5af3d1122e92388d079f529dc8db6998648339 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x9a5fbec135fe4083b696d2e925d42a7892d5af3d1122e92388d079f529dc8db6998648339 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x9a5fbec135fe4083b696d2e925d42a7892d5af3d1122e92388d079f529dc8db6998648339 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x09c4d5cc853902b003beaf1d5d02b9a650aec4cc8518ffcdbb9cb95adebcbad6998632039 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 Ether
0x09c4d5cc853902b003beaf1d5d02b9a650aec4cc8518ffcdbb9cb95adebcbad6998632039 days 7 hrs ago0x10ff82bd13feb3d38a3a7895ad21f1c82d124f570x5f9b34613d685e5c2b80c453c38cd8dab0ac78140 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: HeroContract
Compiler Version: v0.4.23+commit.124ca40d
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.23;


// @title ERC165Implementation - An implementation of the ERC-165 interface
contract ERC165Implementation {

  mapping(bytes4 => bool) internal supportedInterfaces;

  constructor() 
    internal 
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  function supportsInterface(bytes4 interfaceID) 
    external 
    view 
  returns (bool) {
    return supportedInterfaces[interfaceID];
  }
}


contract ApproveAndCallFallBack {
  function receiveApproval(address from, uint tokens, address token, bytes data) external;
}






// @title GameplayInterface
// @dev The interface for the Gameplay contract
//  Only methods required for calling by sibling contracts are required here
// @author Block Brawlers (https://www.blockbrawlers.com)
// (c) 2018 Block Brawlers LLC. All Rights Reserved. This code is not open source.
contract GameplayInterface {

  // @dev The number of Arena queues that exist
  //  We expose here because the Arena contract needs to know this information
  uint public maxArenaQueues;

  // @dev Called by the Hero contract to create stats for a new hero
  //  This doesn't require security, as it's a View function
  function createHeroStats(uint additionalWei, uint heroPricePerLevel, uint heroID, uint random, bool isBasic) 
    external view returns(uint);

  // @dev Called by the Hero contract to increase stats for an existing hero
  //  This doesn't require security, as it's a View function
  function trainHeroStats(uint weiPaid, uint heroPricePerLevel, uint tokenCode, uint choice)
    external view returns(uint);

  // @dev simply a boolean to indicate this is the contract we expect to be
  function isGameplayInterface() external pure returns (bool) {
    return true;
  }
}



// @title AuctionInterface
// @dev The interface for the Auction contract
//  Only methods required for calling by sibling contracts are required here
// @author Block Brawlers (https://www.blockbrawlers.com)
// (c) 2018 Block Brawlers LLC. All Rights Reserved. This code is not open source.
contract AuctionInterface {

  // @dev Allows a calling contract to create an auction
  //  This function must be restricted to onlyTokenContract
  //   - it's designed to be as efficient as possible.
  function createAuction(
    uint _tokenID,
    uint _startingPrice,
    uint _endingPrice,
    uint _duration,
    address _seller
  ) external;
  
  // @dev simply a boolean to indicate this is the contract we expect to be
  function isAuctionInterface() external pure returns (bool) {
    return true;
  }
}



// @title HeroInterface
// @dev The interface for the main Hero contract
//  Only methods required for calling by sibling contracts are required here
// @author Block Brawlers (https://www.blockbrawlers.com)
// (c) 2018 Block Brawlers LLC. All Rights Reserved. This code is not open source.
contract HeroInterface {
  // @dev simply a boolean to indicate this is the contract we expect to be
  function isHeroInterface() external pure returns (bool) {
    return true;
  }

  // @dev Takes a set of three heroIDs; returns the hero code for each of them.
  function getHeroGroup(uint heroID1, uint heroID2, uint heroID3) 
    external view returns(uint heroCode1, uint heroCode2, uint heroCode3);

  // @dev Gets the owner of a team of three heroes.
  // @notice If the heroes are owned by different accounts, returns address(0).
  function ownerOfHeroGroup(uint[3] heroIDs)
    external view returns (address _owner);
  
  // @dev Returns the hero code for the heroID
  function getHeroAt(uint heroID) external view returns (uint);

  // @dev Updates a group of heroes (owned by the same account)
  // @notice This MUST be restricted to only sibling contracts;
  //   it can make wide-ranging changes to hero state
  function updateHeroGroup(uint heroCode1, uint heroCode2, uint heroCode3, bool isWinner) external;

  // @dev Updates a single hero
  // @notice This MUST be restricted to only sibling contracts;
  //   it can make wide-ranging changes to hero state
  function updateHero(uint heroCode, bool isWinner) external;
}







// @title ERC-721 Non-Fungible Token Standard
// @dev Interface for contracts conforming to ERC-721: Non-Fungible Tokens
// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
//  Note: the ERC-165 identifier for this interface is 0x80ac58cd
interface ERC721Interface {

  // @notice Count all NFTs assigned to an owner
  // @dev NFTs assigned to the zero address are considered invalid, and this
  //  function throws for queries about the zero address.
  // @param _owner An address for whom to query the balance
  // @return The number of NFTs owned by `_owner`, possibly zero
  function balanceOf(address _owner) external view returns (uint);

  // @notice Find the owner of an NFT
  // @param _tokenID The identifier for an NFT
  // @dev NFTs assigned to zero address are considered invalid, and queries
  //  about them do throw.
  // @return The address of the owner of the NFT
  function ownerOf(uint _tokenID) external view returns (address);

  // @notice Transfers the ownership of an NFT from one address to another address
  // @dev Throws unless `msg.sender` is the current owner, an authorized
  //  operator, or the approved address for this NFT. Throws if `_from` is
  //  not the current owner. Throws if `_to` is the zero address. Throws if
  //  `_tokenID` is not a valid NFT. When transfer is complete, this function
  //  checks if `_to` is a smart contract (code size > 0). If so, it calls
  //  `onERC721Received` on `_to` and throws if the return value is not
  //  `bytes4(keccak256("onERC721Received(address,uint,bytes)"))`.
  // @param _from The current owner of the NFT
  // @param _to The new owner
  // @param _tokenID The NFT to transfer
  // @param data Additional data with no specified format, sent in call to `_to`
  function safeTransferFrom(address _from, address _to, uint _tokenID, bytes data) external;

  // @notice Transfers the ownership of an NFT from one address to another address
  // @dev This works identically to the other function with an extra data parameter,
  //  except this function just sets data to ""
  // @param _from The current owner of the NFT
  // @param _to The new owner
  // @param _tokenID The NFT to transfer
  function safeTransferFrom(address _from, address _to, uint _tokenID) external;

  // @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
  //  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
  //  THEY MAY BE PERMANENTLY LOST
  // @dev Throws unless `msg.sender` is the current owner, an authorized
  //  operator, or the approved address for this NFT. Throws if `_from` is
  //  not the current owner. Throws if `_to` is the zero address. Throws if
  //  `_tokenID` is not a valid NFT.
  // @param _from The current owner of the NFT
  // @param _to The new owner
  // @param _tokenID The NFT to transfer
  function transferFrom(address _from, address _to, uint _tokenID) external;

  // @notice Set or reaffirm the approved address for an NFT
  // @dev The zero address indicates there is no approved address.
  // @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
  //  operator of the current owner.
  // @param _approved The new approved NFT controller
  // @param _tokenID The NFT to approve
  function approve(address _approved, uint _tokenID) external;

  // @notice Enable or disable approval for a third party ("operator") to manage
  //  all your assets.
  // @dev Throws unless `msg.sender` is the current NFT owner.
  // @dev Emits the ApprovalForAll event
  // @param _operator Address to add to the set of authorized operators.
  // @param _approved True if the operators is approved, false to revoke approval
  function setApprovalForAll(address _operator, bool _approved) external;

  // @notice Get the approved address for a single NFT
  // @dev Throws if `_tokenID` is not a valid NFT
  // @param _tokenID The NFT to find the approved address for
  // @return The approved address for this NFT, or the zero address if there is none
  function getApproved(uint _tokenID) external view returns (address);

  // @notice Query if an address is an authorized operator for another address
  // @param _owner The address that owns the NFTs
  // @param _operator The address that acts on behalf of the owner
  // @return True if `_operator` is an approved operator for `_owner`, false otherwise
  function isApprovedForAll(address _owner, address _operator) external view returns (bool);

  // ****** ADDITIONAL INTERFACE METHODS ****** //
  // @dev Not every contract in the application supports ERC165; this helper solves that issue
  function isERC721() external pure returns(bool);
}



// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface ERC721TokenReceiver {
  // @notice Handle the receipt of an NFT
  // @dev The ERC721 smart contract calls this function on the recipient
  //  after a `transfer`. 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 _operator The address which called `safeTransferFrom` function
  // @param _from The address which previously owned the token
  // @param _tokenId The NFT identifier which is being transferred
  // @param _data Additional data with no specified format
  // @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
  //    unless throwing
  function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4);
}



// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
//  Note: the ERC-165 identifier for this interface is 0x780e9d63
interface ERC721Enumerable /* is ERC721 */ {
  // @notice Count NFTs tracked by this contract
  // @return A count of valid NFTs tracked by this contract, where each one of
  //  them has an assigned and queryable owner not equal to the zero address
  function totalSupply() external view returns (uint);

  // @notice Enumerate valid NFTs
  // @dev Throws if `_index` >= `totalSupply()`.
  // @param _index A counter less than `totalSupply()`
  // @return The token identifier for the `_index`th NFT,
  //  (sort order not specified)
  function tokenByIndex(uint _index) external view returns (uint);

  // @notice Enumerate NFTs assigned to an owner
  // @dev Throws if `_index` >= `balanceOf(_owner)` or if
  //  `_owner` is the zero address, representing invalid NFTs.
  // @param _owner An address where we are interested in NFTs owned by them
  // @param _index A counter less than `balanceOf(_owner)`
  // @return The token identifier for the `_index`th NFT assigned to `_owner`,
  //   (sort order not specified)
  function tokenOfOwnerByIndex(address _owner, uint _index) external view returns (uint);
}



// @title ERC721 Impementation
// @dev Utility contract that manages ownership, ERC-721 (draft) compliant.
// @dev Ref: https://github.com/ethereum/EIPs/issues/721
// @author Block Brawlers (https://www.blockbrawlers.com)
// (c) 2018 Block Brawlers LLC. All Rights Reserved. This code is not open source.
contract ERC721Implementation is ERC721Interface, ERC165Implementation, ERC721Enumerable {
   
  // @dev This emits when ownership of any NFT changes by any mechanism.
  //  This event emits when NFTs are created (`from` == 0) and destroyed
  //  (`to` == 0). Exception: during contract creation, any number of NFTs
  //  may be created and assigned without emitting Transfer. At the time of
  //  any transfer, the approved address for that NFT (if any) is reset to none.
  event Transfer(address indexed _from, address indexed _to, uint indexed _tokenId);

  // @dev This emits when the approved address for an NFT is changed or
  //  reaffirmed. The zero address indicates there is no approved address.
  //  When a Transfer event emits, this also indicates that the approved
  //  address for that NFT (if any) is reset to none.
  event Approval(address indexed _owner, address indexed _approved, uint _tokenId);

  // @dev This emits when an operator is enabled or disabled for an owner.
  //  The operator can manage all NFTs of the owner.
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

  // @dev A mapping from token IDs to the address that owns them.
  //  All non-retired tokens have some valid owner address.
  mapping (uint => address) public indexToOwner;

  // @dev A mapping from TokenIDs to an address that has been approved to call
  //  transferFrom(). Each token can only have one approved address for transfer
  //  at any time. A zero value means no approval is outstanding.
  mapping (uint => address) public indexToApproved;

  // @dev The authorized operators for each address. Operators can approve or transfer
  //  ANY token owned by the address
  mapping (address => mapping (address => bool)) private _operatorsOfAddress;

  // @dev An array containing the Hero encodings for all Heroes in existence. The ID
  //  of each hero is an index into this array.
  // @dev This is stored as a uint, not as a HeroToken[], becasue the storage costs
  //  related to storing structs are 5k gas PER ELEMENT.
  uint[] public tokens;

  // Two mappings for the "ones" (Accounts) to the "many (Tokens).
  mapping(address => uint[]) internal tokenKeys;
  mapping(address => mapping(uint => uint)) internal tokenKeyPointers;
  
  // @notice Name and symbol of the non fungible token, as defined in ERC721.
  string internal constant NAME = "Block Brawlers";
  string internal constant SYMBOL = "BB";
  bytes4 private constant ON_ERC721_RECEIVED = bytes4(keccak256("onERC721Received(address,address,uint,bytes)"));

  constructor() internal {
    supportedInterfaces[0x80ac58cd] = true; // ERC721 
    supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable
  }

  modifier canApprove(uint _tokenID) {
    address owner = indexToOwner[_tokenID];
    require(msg.sender == owner || _operatorsOfAddress[owner][msg.sender]);
    _;
  }

  modifier canTransfer(uint _tokenID, address _from) {
    address owner = indexToOwner[_tokenID];
    require(owner == _from);
    require(msg.sender == owner || msg.sender == indexToApproved[_tokenID] ||
      _operatorsOfAddress[owner][msg.sender]);
    _;
  }

  modifier isValidToken(uint _tokenID) {
    require(_tokenID < tokens.length);
    _;
  }

  // @dev simply a boolean to indicate this is the contract we expect to be
  function isERC721()
    external 
    pure 
  returns (bool) {
    return true;
  }
  // ****** ERC721 Enumerable *****//
  // @notice Count NFTs tracked by this contract
  // @return A count of NFTs tracked by this contract
  // @dev We're taking a small liberty with the implementation here - this returns
  //  the total number of tokens ever created, not the total number that currently exist
  function totalSupply() 
    external 
    view 
  returns(uint) {
    return tokens.length;
  }

  // @notice Enumerate valid NFTs
  // @dev Throws if `_index` >= `totalSupply()`.
  // @param _index A counter less than `totalSupply()`
  // @return The token identifier for the `_index`th NFT (sort order not specified)
  function tokenByIndex(uint _index) 
    external 
    view
    isValidToken(_index)
  returns(uint) {
    return _index;
  }

  // @notice Enumerate NFTs assigned to an owner
  // @dev Throws if `_index` >= `balanceOf(_owner)` or if
  //  `_owner` is the zero address, representing invalid NFTs.
  // @param _owner An address where we are interested in NFTs owned by them
  // @param _index A counter less than `balanceOf(_owner)`
  // @return The token identifier for the `_index`th NFT assigned to `_owner`,
  //   (sort order not specified)
  function tokenOfOwnerByIndex(address _owner, uint _index) 
    external 
    view 
  returns(uint _tokenID) {
    require(_owner != address(0));
    _tokenID = tokenKeys[_owner][_index];
  }

  // ****** ERC721 Metadata *****//
  // @notice We don't implement the ERC721 Metadata interface here - there's
  //  no on-chain metadata links
  // @notice Name of the token, as defined in ERC721 Metadata
  function name() 
    external 
    pure
  returns(string) {
    return NAME;
  } 
  
  // @notice Symbol of the token, as defined in ERC721 Metadata
  function symbol() 
    external 
    pure
  returns(string) {
    return SYMBOL;
  }
  
  // @notice Find the owner of an NFT
  // @param _tokenID The identifier for an NFT
  // @dev We're taking a small liberty here, to ensure there's a difference between
  //  a NFT that hasn't been created (will throw), and one that's owne by the zero
  //  address (will return zero)
  // @return The address of the owner of the NFT
  function ownerOf(uint _tokenID)
    external 
    view
  returns (address _owner) {
    _owner = indexToOwner[_tokenID];
  }

  // @notice Get the approved address for a single NFT
  // @dev Throws if `_tokenID` is not a valid NFT
  // @param _tokenID The NFT to find the approved address for
  // @return The approved address for this NFT, or the zero address if there is none
  function getApproved(uint _tokenID)
    external
    view
    isValidToken(_tokenID)
  returns(address) {
    return indexToApproved[_tokenID];
  }
  
  // @notice Query if an address is an authorized operator for another address
  // @param _owner The address that owns the NFTs
  // @param _operator The address that acts on behalf of the owner
  // @return True if `_operator` is an approved operator for `_owner`, false otherwise
  function isApprovedForAll(address _owner, address _operator) 
    external 
    view 
  returns(bool) {
    return _operatorsOfAddress[_owner][_operator];
  }

  // @notice Returns the number of Tokens owned by a specific address.
  // @param _owner The owner address to check.
  // @dev Required for ERC-721 compliance
  function balanceOf(address _owner) 
    external 
    view 
  returns(uint count) {
    return tokenKeys[_owner].length;
  }

  // @notice Grant another address the right to transfer a specific token via
  //  transferFrom(). This is the preferred flow for transfering NFTs to contracts.
  // @param _to The address to be granted transfer approval. Pass address(0) to
  //  clear all approvals.
  // @param _tokenID The ID of the token that can be transferred if this call succeeds.
  // @dev Required for ERC-721 compliance.
  function approve(address _approved, uint _tokenID)
    external
    canApprove(_tokenID)
  {
    // Register the approval (replacing any previous approval).
    indexToApproved[_tokenID] = _approved;

    // Emit approval event.
    emit Approval(msg.sender, _approved, _tokenID);
  }

  // @notice Enable or disable approval for a third party ("operator") to manage
  //  all your asset.
  // @dev Emits the ApprovalForAll event
  // @param _operator Address to add to the set of authorized operators.
  // @param _approved True if the operators is approved, false to revoke approval
  function setApprovalForAll(address _operator, bool _approved) 
    external 
  {
    _operatorsOfAddress[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  // @notice Transfers the ownership of an NFT from one address to another address
  // @dev Throws unless `msg.sender` is the current owner, an authorized
  //  operator, or the approved address for this NFT. Throws if `_from` is
  //  not the current owner. Throws if `_to` is the zero address. Throws if
  //  `_tokenID` is not a valid NFT. When transfer is complete, this function
  //  checks if `_to` is a smart contract (code size > 0). If so, it calls
  //  `onERC721Received` on `_to` and throws if the return value is not
  //  `bytes4(keccak256("onERC721Received(address,uint,bytes)"))`.
  // @param _from The current owner of the NFT
  // @param _to The new owner
  // @param _tokenID The NFT to transfer
  // @param data Additional data with no specified format, sent in call to `_to`
  function safeTransferFrom(address _from, address _to, uint _tokenID, bytes data) 
    external
  {
    _safeTransferFrom(_from, _to, _tokenID, data);
  }

  // @notice Transfers the ownership of an NFT from one address to another address
  // @dev This works identically to the other function with an extra data parameter,
  //  except this function just sets data to ""
  // @param _from The current owner of the NFT
  // @param _to The new owner
  // @param _tokenID The NFT to transfer
  function safeTransferFrom(address _from, address _to, uint _tokenID) 
    external
  {
    _safeTransferFrom(_from, _to, _tokenID, "");
  }

  // @notice Transfers a token from the sender to another address. If transferring 
  //  to a smart contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or
  //  this contract specifically) or your token may be lost forever. Seriously.
  // @param _from The address that owns the token to be transfered.
  // @param _to The address that should take ownership of the token. Can be any address,
  //  including the caller.
  // @param _tokenID The ID of the token to be transferred.
  function transferFrom(address _from, address _to, uint _tokenID)
    external
    canTransfer(_tokenID, _from)
  {
    // Safety check to prevent against an unexpected 0x0 default.
    require(_to != address(0));
    // Disallow transfers to this contract to prevent accidental misuse.
    // The contract should never own any Tokens.
    require(_to != address(this));

    // Reassign ownership (also clears pending approvals and emits Transfer event).
    _transfer(_to, _tokenID);
  }
  
  // @dev Assigns ownership of a specific token to an address.
  function _transfer(address _to, uint _tokenID) 
    internal 
    isValidToken(_tokenID)
  {
    address _from = indexToOwner[_tokenID];
    // When creating new tokens _from is 0x0, but we can't account that address.
    if (_from != address(0)) {
      // we have to delete this key from the list in the old ONE
      uint rowToDelete = tokenKeyPointers[_from][_tokenID];
      uint lastKeyPosition = tokenKeys[_from].length-1;
      uint keyToMove = tokenKeys[_from][lastKeyPosition];
      tokenKeys[_from][rowToDelete] = keyToMove;
      tokenKeyPointers[_from][keyToMove] = rowToDelete;
      delete tokenKeys[_from][lastKeyPosition];
      tokenKeys[_from].length--;
      // clear any previously approved ownership exchange
      delete indexToApproved[_tokenID];
    }

    // Point the token to the right owner:
    indexToOwner[_tokenID] = _to;

    if (_to != address(0)) {
      // Set the token to be owned by the new owner, unless the new owner is 0 (deleted)
      tokenKeyPointers[_to][_tokenID] = tokenKeys[_to].push(_tokenID) - 1;
    }

    // Emit the transfer event.
    emit Transfer(_from, _to, _tokenID);
  }

  // @dev Actually perform the safeTransferFrom
  function _safeTransferFrom(address _from, address _to, uint _tokenID, bytes data)
    private
    isValidToken(_tokenID)
    canTransfer(_tokenID, _from)
  {
    require(_to != address(0));
    _transfer(_to, _tokenID);

    // Do the callback after everything is done to avoid reentrancy attack
    uint codeSize;
    assembly { codeSize := extcodesize(_to) }
    if (codeSize == 0) {
      return;
    }
    bytes4 result = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenID, data);
    require(result == ON_ERC721_RECEIVED);
  }
}





// @title SiblingInterface
// @dev The interface for any contract that's a Sibling contract
//  Only methods required for calling by the master contract are required here
// @author Block Brawlers (https://www.blockbrawlers.com)
// (c) 2018 Block Brawlers LLC. All Rights Reserved. This code is not open source.
contract SiblingInterface {
  bool public isPaused;
  
  // @dev Withdraw all ETH in the contract's account, and send it to the master contract
  function withdrawToMaster() external returns(uint);
  
  // @dev Update the contract with a new manager
  function updateManager(address newManager) external;

  // @dev utility function to allow the sibling to transfer out any ERC20 tokens it accidentally gets
  function transferERC20TokensToCFO(address _tokenAddress, address cfoAddress) external;

  // @dev utility to pause the contract
  function pauseSibling() external;

  // @dev utility to unpause a paused contract
  function unpauseSibling() external;

  // @dev simply a boolean to indicate this is the contract we expect to be
  function isSiblingInterface() external pure returns (bool) {
    return true;
  }
}



// @title ERC20Interface
// @dev This ERC20Interface is used to power the TransferTokens functionality in Master and Sibling
contract ERC20Interface {
  function totalSupply() public view returns (uint);
  function balanceOf(address tokenOwner) public view returns (uint balance);
  function allowance(address tokenOwner, address spender) public view returns (uint remaining);
  function transfer(address to, uint tokens) public returns (bool success);
  function approve(address spender, uint tokens) public returns (bool success);
  function transferFrom(address from, address to, uint tokens) public returns (bool success);

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


// @title Master
// @dev The contract module that allows a contract to be the Master, and control aspects of
//  Sibling contracts
// @author Block Brawlers (https://www.blockbrawlers.com)
// (c) 2018 Block Brawlers LLC. All Rights Reserved. This code is not open source.
contract Master {
  // This facet controls access control for the dAPP There are three roles managed here, and this is
  // the recommended usage of each role:
  //
  //     - The Owner: The Owner can reassign other roles and change the addresses of our dependent smart
  //         contracts. It is also the only role that can unpause the smart contract. It should be
  //         initialy set to the address that created the smart contract that implements this.
  //         (set this in the contract constructor).
  //     - The CFO: The CFO can withdraw funds from the contracts, but cannot assign roles, or perform
  //         any operational tasks.
  //     - The COO: The COO can perform operational tasks, but cannot withdraw funds, and cannot
  //         assign roles. (set this in the contract constructor).
  //
  // Different addresses should be set for each role, to maximize security here. Each role is independent
  // and has no overlap overlap in their access abilities. In particular, while the Owner can assign any
  // address to any role, the Owner address itself doesn't have the ability to act in those roles. This
  // restriction is intentional, to minimize the use of addresses.
  // 
  // The Sibling contracts have a single role, "Owner". We recommend that the "Owner" for the siblings
  // be set to the "COO" address, to minimize use of the main Owner address.

  event SiblingAdded(address _added);
  event SiblingRemoved(address _removed);
  event OwnershipTransferred(address previousOwner, address newOwner);

  // The addresses of the accounts (or contracts) that can execute actions within each roles.
  address public owner;
  address public cfoAddress;
  address public cooAddress;
  address public recoveryAddress;
  SiblingInterface[] public siblingContracts;

  bool public isPaused;

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

  modifier onlyWhenPaused() {
    require(isPaused == true);
    _;
  }

  modifier onlyWhenUnpaused() {
    require(isPaused == false);
    _;
  }

  // @dev Access modifier for Owner-only functionality
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  // @dev Access modifier for CFO-only functionality
  modifier onlyCFO() {
    require(msg.sender == cfoAddress);
    _;
  }

  // @dev Access modifier for COO-only functionality
  modifier onlyCOO() {
    require(msg.sender == cooAddress);
    _;
  }

  // @dev Access modifier for Server-only functionality
  modifier onlyRecovery() {
    require(msg.sender == recoveryAddress);
    _;
  }

  // @dev Access modifier for functions that can only be called from sibling contracts
  modifier onlySibling() {
    for (uint i = 0; i < siblingContracts.length; i++) {
      if (siblingContracts[i] == msg.sender) {
        bool isSibling = true;
        break;
      }
    }
    require(isSibling);
    _;
  }

  function getSiblings() 
    external 
    view
  returns(address[]) {
    address[] memory siblingAddresses = new address[](siblingContracts.length);
    for (uint i = 0; i < siblingContracts.length; i++) {
      siblingAddresses[i] = address(siblingContracts[i]);
    }
    return siblingAddresses;
  }

  function getPauseState()
    external
    view
  returns(bool, bool[]) {
    bool[] memory siblingIsPaused = new bool[](siblingContracts.length);
    for (uint i = 0; i < siblingContracts.length; i++) {
      siblingIsPaused[i] = siblingContracts[i].isPaused();
    }
    return (isPaused, siblingIsPaused);
  }

  function pauseContracts() 
    external
    onlyOwner
    onlyWhenUnpaused
  {
    isPaused = true;
    for (uint i = 0; i < siblingContracts.length; i++) {
      siblingContracts[i].pauseSibling();
    }
  }

  function unpauseContracts()
    external
    onlyOwner
    onlyWhenPaused
  {
    isPaused = false;
    for (uint i = 0; i < siblingContracts.length; i++) {
      siblingContracts[i].unpauseSibling();
    }
  }

  // @dev Assigns a new address to act as the Owner. Only available to the current owner account.
  // @param _newOwner The address of the new Owner
  function setOwner(address _newOwner) 
    external 
    onlyRecovery 
  {
    require(_newOwner != address(0));
    require(_newOwner != cooAddress);
    require(_newOwner != cfoAddress);
    require(_newOwner != recoveryAddress);

    owner = _newOwner;
    emit OwnershipTransferred(owner, _newOwner);
  }

  // @dev Assigns a new address to act as the CFO. Only available to the current Owner.
  // @param _newCFO The address of the new CFO
  function setCFO(address _newCFO) 
    external 
    onlyOwner 
  {
    require(_newCFO != address(0));
    require(_newCFO != owner);
    require(_newCFO != cooAddress);
    require(_newCFO != recoveryAddress);

    cfoAddress = _newCFO;
  }

  // @dev Assigns a new address to act as the COO. Only available to the current Owner.
  // @param _newCOO The address of the new COO
  function setCOO(address _newCOO) 
    external 
    onlyOwner 
  {
    require(_newCOO != address(0));
    require(_newCOO != owner);
    require(_newCOO != cfoAddress);
    require(_newCOO != recoveryAddress);

    cooAddress = _newCOO;
  }

  // @dev Assigns a new address to act as the Recovery address. Only available to the current Owner.
  // @param _newRecovery The address of the new Recovery account
  function setRecovery(address _newRecovery) 
    external 
    onlyOwner 
  {
    require(_newRecovery != address(0));
    require(_newRecovery != owner);
    require(_newRecovery != cfoAddress);
    require(_newRecovery != cooAddress);

    recoveryAddress = _newRecovery;
  }

  // @dev Assigns a new Owner address to all the sibling contracts.
  // @param _newSiblingOwner The address of the new sibling owner
  //  (it's reasonable to make this the same as the COO)
  function setSiblingManagers(address _newSiblingManager) 
    external 
    onlyOwner
  {
    require(_newSiblingManager != owner);
    require(_newSiblingManager != cfoAddress);
    require(_newSiblingManager != recoveryAddress);
    for (uint i = 0; i < siblingContracts.length; i++) {
      siblingContracts[i].updateManager(_newSiblingManager);
    }
  }

  // @dev Allows the CFO to withdraw the balance of fees available to the contract.
  // @notice Also draws all ETH balances from sibling contracts.
  // @param isTransferSiblings - false if just transferring from this contract,
  //   true to also transfer from all siblings
  function withdrawBalances(bool isTransferSiblings) 
    external 
    onlyCFO 
  {
    if(isTransferSiblings) {
      for (uint i = 0; i < siblingContracts.length; i++) {
        siblingContracts[i].withdrawToMaster();
      }
    }
    uint balance = address(this).balance;
    cfoAddress.transfer(balance);
  }

  // @dev Transfers accidentally gained ERC20 tokens from the contract to the CFO
  // @param _tokenAddress - the address of the ERC20 contract to transfer
  // @param isTransferSiblings - false if just transferring from this contract,
  //   true to also transfer from all siblings
  // @notice Cannot transfer the tokens used for payments. Those are locked to this contract.
  //  But it can transfer that token from other contracts, if the token gets stuck there somehow.
  function transferERC20TokensToCFO(address _tokenAddress, bool isTransferSiblings)
    external
    onlyCFO
  {
    ERC20Interface erc20 = ERC20Interface(_tokenAddress);
    uint balance = erc20.balanceOf(this);
    if (balance > 0) {
      erc20.transfer(msg.sender, balance);
    }

    if (isTransferSiblings) {
      for (uint i = 0; i < siblingContracts.length; i++) {
        siblingContracts[i].transferERC20TokensToCFO(_tokenAddress, msg.sender);
      }
    }
  }

  // @dev Adds or updates a sibling contract to the sibling list
  // @param _oldAddress - The previous address of this sibling. Leave as 0 to add a sibling
  // @param _newAddress - leave this as address(0) to delete the old sibling
  function updateSibling(address _oldAddress, address _newAddress) 
    public 
    onlyOwner
    onlyWhenPaused
  {
    for (uint i = 0; i < siblingContracts.length; i++) {
      if (siblingContracts[i] == _oldAddress) {
        if (i == siblingContracts.length - 1) {
          delete siblingContracts[i];
        } else {
          siblingContracts[i] = siblingContracts[siblingContracts.length - 1];
          delete siblingContracts[siblingContracts.length - 1];
        }
        siblingContracts.length -= 1;
        emit SiblingRemoved(_oldAddress);
      }
    }
    if (_newAddress != address(0)) {
      SiblingInterface newSibling = SiblingInterface(_newAddress);
      require(newSibling.isSiblingInterface());
      siblingContracts.push(newSibling);
      emit SiblingAdded(_newAddress);
    }
  }
}




// @title HeroBase
// @dev Holds all common structs, events and base variables.
// @author Block Brawlers (https://www.blockbrawlers.com)
// (c) 2018 Block Brawlers LLC. All Rights Reserved. This code is not open source.
contract HeroBase is HeroInterface, Master, ERC721Implementation, ApproveAndCallFallBack {

  // @dev The Create event is fired whenever a new hero comes into existence.
  event Create(address _owner, uint indexed tokenID, uint heroID, 
    uint heroCode);

  // @dev The Train event is fired whenever a hero is trained
  event Train(address _owner, uint indexed tokenID, uint heroID, 
    uint oldStats, uint newStats);

  // @dev Track the number of wins each hero's had
  event LogVictory(uint indexed heroID, uint heroCode);
  // @dev Tracking for hero changes, to ensure we maintain history of changes to a hero
  event UpdateHero(address indexed _owner, uint indexed tokenID, uint heroID, uint newStats);

  // @dev used to require that the msg.sender owns the hero they want to
  //  operate on
  modifier addressMustOwnHero(address _owner, uint _heroID) {
    require(_owner == indexToOwner[_heroID]);
    _;
  }

  modifier onlyERC20Payable(address erc20Contract) {
    require(erc20ExchangeRatioETH[erc20Contract] > 0);
    _;
  }

  // @dev The address of the sibling contract that is used to manage gameplay.
  GameplayInterface public gameplayInterface;

  // @dev The address of the Auction contract that handles sales of Heroes.
  AuctionInterface public heroSaleInterface;

  // @dev The price of a Level 1 hero, in Wei.
  uint public heroPriceBase;

  // @dev Amount of WEI (multiplied by the level to be achieved) you have to spend to acquire a hero.
  uint public heroPricePerLevel;

  // @dev Amount of WEI you have to spend on the first hero team you create
  uint public firstHeroTeamPrice;

  // The root source of the ERC20 tokens that can be used for payments
  mapping(address => uint) public erc20ExchangeRatioETH;
  mapping(address => uint) public erc20ExchangeRatioERC20;

  // @dev Stores the user-submitted names of heroes.
  mapping(uint => bytes32) public heroNames;

  mapping(address => bytes32) public userNames;

  mapping(bytes32 => address) public usersByUserName;

  mapping(bytes32 => uint) internal promoHeroes;
  mapping(bytes32 => uint) internal promoRandomHeroes;

  mapping(address => uint) public lastBoughtHeroes;

  // @dev returns the current stats and name of a single hero.
  // @param heroID - the ID of the hero to find
  function getHero(uint heroID) 
    external 
    view 
  returns(uint _heroCode, bytes32 _name) {
    _heroCode = tokens[heroID];
    _name = heroNames[heroID];
  }

  // @dev This gets the stats, but not the names, of a group
  function getHeroGroup(uint heroID1, uint heroID2, uint heroID3) 
    external 
    view 
  returns(uint heroCode1, uint heroCode2, uint heroCode3) {
    heroCode1 = tokens[heroID1];
    heroCode2 = tokens[heroID2];
    heroCode3 = tokens[heroID3];
  }

  // @notice Returns a list of all heroIDs assigned to an address.
  // @param _owner The owner whose Heroes we are interested in.
  // @dev Returns a dynamic array, which is only supported for web3 calls, and
  //  not contract-to-contract calls.
  function heroIDsOfOwner(address _owner)
    external 
    view
  returns(uint[])
  {
    require(_owner != address(0));
    return tokenKeys[_owner];
  }

  // @dev Returns a dynamic array, which is only supported for web3 calls, and
  //  not contract-to-contract calls. 
  // @notice This one's also pretty heavy for users with >100 heroes, but can be chunked
  // @notice Returns a the actual hero data.
  // @param _owner - The owner whose Heroes we are interested in.
  // @param numberToPull - the number of heroes to pull data for
  // @param startNumber - the starting number hero to pull
  function heroDataOfOwner(address _owner, uint numberToPull, uint startNumber) 
    external 
    view 
  returns(uint[], bytes32[]) {
    uint heroCount = tokenKeys[_owner].length;
    require(startNumber < heroCount);
    uint availableToPull = heroCount - startNumber;
    availableToPull = numberToPull > availableToPull ? availableToPull : numberToPull;

    uint[] memory _heroes = new uint[](availableToPull);
    bytes32[] memory _names = new bytes32[](availableToPull);
    for (uint i = startNumber; i < startNumber + availableToPull; i++) {
      uint key = tokenKeys[_owner][i];
      _heroes[i] = tokens[key];
      _names[i] = heroNames[key];
    }
    return (_heroes, _names);
  }

  function heroOfOwnerByIndex(address _owner, uint _index) 
    external 
    view 
  returns(uint _heroCode) {
    require(_owner != address(0));
    _heroCode = tokens[tokenKeys[_owner][_index]];
  }
  
  // @dev Gets the owner of a team of three heroes.
  // @notice If the heroes are owned by different accounts, returns address(0).
  function ownerOfHeroGroup(uint[3] heroIDs)
    external 
    view
  returns (address _owner) {
    _owner = indexToOwner[heroIDs[0]];
    _owner = _owner != indexToOwner[heroIDs[1]] || _owner != indexToOwner[heroIDs[2]] 
      ? address(0) 
      : _owner;
  }

  // @dev Returns the heroCode at the given heroID
  // @param heroID - the ID of the hero
  function getHeroAt(uint heroID) 
    external 
    view 
  returns(uint) {
    return tokens[heroID];
  }

  // @dev returns the current exchange rate value for a given contract
  // @param _erc20address - the ERC-20 contract to query
  // @returns ethRatio - the ETH side of the ratio (in WEI)
  // @returns erc20Ratio = the ERC-20 side of the ratio (in the base value, not counting decimals)
  // @notice To convert from ETH to ERC20, multiply by ethRatio, then divide by erc20Ratio
  //   To convert from ERC20 to ETH, multiply by erc20Ratio, then divide by ethRatio
  //   Always multiply first...
  function getExchangeRatio(address _erc20address)
    external
    view
  returns(uint ethRatio, uint erc20Ratio) {
    ethRatio = erc20ExchangeRatioETH[_erc20address];
    erc20Ratio = erc20ExchangeRatioERC20[_erc20address];
  }

  // @dev This function allows the gameplay contract to update multiple heroes with a single call
  //  It doesn't have any error checking. Error checking must be in the gameplay contract.
  // @param heroCode1 - the code of the first hero
  // @param heroCode1 - the code of the second hero
  // @param heroCode1 - the code of the third hero
  function updateHeroGroup(uint heroCode1, uint heroCode2, uint heroCode3, bool isWinner)
    external 
    onlySibling 
  {
    uint heroID1 = uint(uint32(heroCode1>>224));
    uint heroID2 = uint(uint32(heroCode2>>224));
    uint heroID3 = uint(uint32(heroCode3>>224));
    tokens[heroID1] = heroCode1;
    tokens[heroID2] = heroCode2;
    tokens[heroID3] = heroCode3;
    emit UpdateHero(indexToOwner[heroID1], heroID1, heroID1, heroCode1);
    emit UpdateHero(indexToOwner[heroID2], heroID2, heroID2, heroCode2);
    emit UpdateHero(indexToOwner[heroID3], heroID3, heroID3, heroCode3);
    if (isWinner) {
      emit LogVictory(heroID1, heroCode1);
      emit LogVictory(heroID2, heroCode2);
      emit LogVictory(heroID2, heroCode2);
    }
  }

  // @dev This function allows the gameplay contract to update multiple heroes with a single call
  //  It doesn't have any error checking. Error checking must be in the gameplay contract.
  // @param heroCode - the code of the hero
  function updateHero(uint heroCode, bool isWinner)
    external 
    onlySibling 
  {
    uint heroID = uint(uint32(heroCode>>224));
    tokens[heroID] = heroCode;
    if (isWinner) {
      emit LogVictory(heroID, heroCode);
    }
    emit UpdateHero(indexToOwner[heroID], heroID, heroID, heroCode);
  }

  function receiveApproval(address from, uint tokens, address token, bytes data)
    external
    onlyWhenUnpaused
    onlyERC20Payable(token)
  {
    // Only accept tokens if (a) there's a non-zero amount, and (b) some data comes along with them.
    require(data.length > 0);
    require(tokens > 0);
    uint ethRatio = erc20ExchangeRatioETH[token];
    uint erc20Ratio = erc20ExchangeRatioERC20[token];
    // Only allow approvals from contracts which have approved exchange ratios
    require(ethRatio > 0);
    require(erc20Ratio > 0);
    uint tokenEquivalent = tokens * erc20Ratio;
    // Overflow check (it almost certainly can't overflow, but still...)
    require(tokenEquivalent / tokens == erc20Ratio);
    uint weiEquivalent = tokenEquivalent / ethRatio;

    // Transfer the tokens
    require(ERC20Interface(token).transferFrom(from, this, tokens));

    // Either
    // (a) call the Create Hero function,
    // (b) call the Train Hero function, or
    // (c) fail
    if (data.length == 32) {
      _createHero(from, weiEquivalent, 0);
    } else 
    if (data.length == 36) {
      // 32 bytes for the uint, then 4 bytes for the hero ID
      uint _choice = 0;
      for (uint i = 0; i < 32; i++) {
        _choice |= uint(data[i] >> (i * 8));
      }
      uint _heroID = uint(data[32]);
      _heroID |= uint(data[33]) >> 8;
      _heroID |= uint(data[34]) >> 16;
      _heroID |= uint(data[35]) >> 24;
      _trainHero(from, weiEquivalent, _heroID, _choice);
    } else {
      assert(false);
    }
  }

  // @notice No tipping!
  // @dev Reject all Ether from being sent here, unless it's from one of the
  //  sibling contracts, or it's to a payable method.
  //  (Hopefully, we can prevent user accidents.)
  function() 
    external 
    payable 
    onlySibling 
  {}

  // @dev Update the address of the gameplay contract, can only be called by the Owner.
  // @param _address An address of a GameplayInterface contract instance to be used from this point forward.
  function setGameplayContractAddress(address _address) 
    external 
    onlyOwner 
    onlyWhenPaused
  {
    require(_address != address(0));
    GameplayInterface candidateContract = GameplayInterface(_address);
    require(candidateContract.isGameplayInterface());
    // Arena SHOULD be empty on this new contract. Otherwise bad things can happen.

    updateSibling(address(gameplayInterface), _address);

    // Set the new contract address
    gameplayInterface = candidateContract;
  }

  // @dev Sets the reference to the sale auction.
  // @param _address - Address of sale contract.
  function setHeroSaleAuctionAddress(address _address) 
    external 
    onlyOwner 
    onlyWhenPaused
  {
    require(_address != address(0));
    AuctionInterface candidateContract = AuctionInterface(_address);
    require(candidateContract.isAuctionInterface());

    updateSibling(address(heroSaleInterface), _address);

    // Set the new contract address
    heroSaleInterface = candidateContract;
  }

  // @dev Sets the reference to an ERC-20 contract that can be used to pay for actions.
  // @param _address - Address of the ERC-20 contract.
  // @param exchangeRate - the exchange rate between ETH and the ERC-20 token
  // @notice The exchange ratio is between WEI and the raw token value,
  //   before decimals are taken into account.
  // @notice To convert from ETH to ERC20, multiply by ethRatio, then divide by erc20Ratio
  //   To convert from ERC20 to ETH, multiply by erc20Ratio, then divide by ethRatio
  //   Always multiply first...
  function setERC20ExchangeRate(address _erc20address, uint ethRatio, uint erc20Ratio) 
    external 
    onlyCOO 
  {
    if (ethRatio > 0 && erc20Ratio > 0) {
      ERC20Interface candidateContract = ERC20Interface(_erc20address);
      uint totalSupply = candidateContract.totalSupply();
      // Must have non-zero supply
      require(totalSupply > 0);
      // Set the new contract address exchange rate
      erc20ExchangeRatioETH[_erc20address] = ethRatio;
      erc20ExchangeRatioERC20[_erc20address] = erc20Ratio;
    } else {
      erc20ExchangeRatioETH[_erc20address] = 0;
      erc20ExchangeRatioERC20[_erc20address] = 0;
    }
  }

  // @dev Sets the pricing for the heroes (can be called by the COO)
  // @param _basePrice - the base price of a Level 1 hero, in WEI
  // @param _perLevelPrice - the price multiplier per level for higher level heroes, in WEI
  function setHeroPricing(uint _basePrice, uint _perLevelPrice, uint _firstHeroTeamPrice)
    external
    onlyCOO
  {
    heroPricePerLevel = _perLevelPrice;
    heroPriceBase = _basePrice;
    firstHeroTeamPrice = _firstHeroTeamPrice;
  }

  // @dev Allows the COO to create promo tokens & assign them to the promo list.
  // @param couponCodes - an array of coupon codes to enter;
  function mintPromoHeroes(bytes32[] couponCodes)
    external
    onlyCOO
  {
    for (uint i = 0; i < couponCodes.length; i++) {
      require(promoHeroes[couponCodes[i]] == 0);
      promoHeroes[couponCodes[i]] = _createHero(address(this), heroPriceBase, 0);
    }
  }

  function allocatePromoRandomHeroes(bytes32[] couponCodes) 
    external
    onlyCOO
  {
    for (uint i = 0; i < couponCodes.length; i++) {
      promoRandomHeroes[couponCodes[i]] = 1;
    }
  }

  // @dev Allows the COO to read created promo tokens
  // @param couponCodes - codes to check
  function readPromoHeroes(bytes32[] couponCodes) 
    external
    view
    onlyCOO
  returns(uint[]) {
    uint[] memory toReturn = new uint[](couponCodes.length);
    for (uint i = 0; i < couponCodes.length; i++) {
      toReturn[i] = promoHeroes[couponCodes[i]];
    }
    return toReturn;
  }

  // @dev Allows the COO to read created RANDOM promo tokens
  // @param couponCodes - codes to check
  function readPromoRandomHeroes(bytes32[] couponCodes) 
    external
    view
    onlyCOO
  returns(uint[]) {
    uint[] memory toReturn = new uint[](couponCodes.length);
    for (uint i = 0; i < couponCodes.length; i++) {
      toReturn[i] = promoRandomHeroes[couponCodes[i]];
    }
    return toReturn;
  }

  // @dev Internal function to perform the hero creation
  // @param _owner - the account who will own this hero on creation
  // @param weiAmount - the amount of wei paid to create this hero
  function _createHero(address _owner, uint weiAmount, uint psuedoRandom)
    internal
  returns(uint newHeroID) {
    // Ensure payment that minimum price is met
    require(weiAmount >= heroPriceBase);
    // It's probably never going to happen, 1 billion heroes is A LOT, but
    //  let's just be 100% sure we never let this happen.
    newHeroID = tokens.length;
    require(newHeroID < 2**30);
    bool isBasic = psuedoRandom > 0;
    if(!isBasic) {
      psuedoRandom = _getLongRandom(newHeroID);
    }
    uint heroCode = gameplayInterface.createHeroStats(weiAmount - heroPriceBase, heroPricePerLevel, newHeroID, psuedoRandom, isBasic);
    // @dev store in array of uint is massively cheaper than an array of struct.
    tokens.push(heroCode);

    // emit the creation event
    emit Create(_owner, newHeroID, newHeroID, heroCode);
    // Assign ownership, and also emit the Transfer event as per ERC721 draft
    _transfer(_owner, newHeroID);
  }

  // @dev Internal function to perform the hero training
  // @param requestor - the account who requested the training (has to be the owner)
  // @param weiAmount - the amount of wei paid to train this hero
  // @param _heroID - the hero to be trained
  // @param _choice - a uint value representing a choice that may be made for training
  function _trainHero(address requestor, uint weiAmount, uint _heroID, uint _choice) 
    internal
    addressMustOwnHero(requestor, _heroID)
  {
    // get the current heroCode
    uint oldHeroCode = tokens[_heroID];
    // Update the heroCode with its new data
    uint newHeroCode = gameplayInterface.trainHeroStats(weiAmount, heroPricePerLevel, oldHeroCode, _choice);
    // Update the hero storage
    tokens[_heroID] = newHeroCode;
    emit Train(msg.sender, _heroID, _heroID, oldHeroCode, newHeroCode);
  }

  // @dev Generates a psuedo-random number.
  // @param seed - the seed used to modify the blockhash, so multiple different numbers
  //  can be generated each block
  function _getLongRandom(uint seed) internal view returns(uint) { 
    return uint(keccak256(keccak256(seed)^blockhash(block.number-1)));
  }
}


// @title HeroContract
// @notice Collectible heroes battle on the Ethereum blockchain.
// @dev The main Block Brawlers contract, keeps track of heroes so they don't
//  just hang out in the tavern all day.
// @author Block Brawlers (https://www.blockbrawlers.com)
// (c) 2018 Block Brawlers LLC. All Rights Reserved. This code is not open source.
contract HeroContract is HeroBase {

  constructor(uint _basePrice, uint _perLevelPrice, uint _firstTeamPrice) 
    public 
  {
    // the creator of the contract initially owns the Owner and COO addresses (not the CFO)
    cooAddress = msg.sender;
    heroPricePerLevel = _perLevelPrice;
    heroPriceBase = _basePrice;
    firstHeroTeamPrice = _firstTeamPrice;
  }

  event BoughtSpecificHeroes(address buyer, uint timeslot, uint price, uint hero1, uint hero2, uint hero3);

  // @dev The main function for creating new heroes
  // @notice BEWARE: This will still take all the ether if this function is called
  //  from a non-private (exchange) account, but the account won't be able to access the hero
  function createHero()
    external 
    payable 
    onlyWhenUnpaused
  {
    _createHero(msg.sender, msg.value, 0);
  }

  // @dev The main function for creating a team of multiple heroes
  // @notice BEWARE: This will still take all the ether if this function is called
  //  from a non-private (exchange) account, but the account won't be able to access the hero
  function createMultipleHeroes(uint numberToCreate)
    external
    payable
    onlyWhenUnpaused
  {
    require(numberToCreate > 0);
    uint valuePerHero = msg.value/numberToCreate;
    for(uint i = 0; i < numberToCreate; i++) {
      _createHero(msg.sender, valuePerHero, 0);
    }
  }

  // @dev The main function for creating a team of multiple heroes
  // @notice BEWARE: This will still take all the ether if this function is called
  //  from a non-private (exchange) account, but the account won't be able to access the hero
  function buySpecificHeroes(uint timeslot)
    external
    payable
    onlyWhenUnpaused
  {
    uint lbh = lastBoughtHeroes[msg.sender];
    if(lbh == 0) {
      require(msg.value == firstHeroTeamPrice);
    } else {
      require(lbh < timeslot);
      require(msg.value == heroPriceBase * 3);
    }
    uint r1; 
    uint r2;
    uint r3;
    ( r1, r2, r3)  = _generateSpecificRandoms(timeslot);
    uint hero1 = _createHero(msg.sender, heroPriceBase, r1);
    uint hero2 = _createHero(msg.sender, heroPriceBase, r2);
    uint hero3 = _createHero(msg.sender, heroPriceBase, r3);
    lastBoughtHeroes[msg.sender] = timeslot;
    emit BoughtSpecificHeroes(msg.sender, timeslot, msg.value, hero1, hero2, hero3);
  }

  function viewSpecificHeroes()
    external
    view
  returns(uint hero1, uint hero2, uint hero3) {
    (hero1, hero2, hero3) = _generateSpecificRandoms((now / 28800));
    hero1 = gameplayInterface.createHeroStats(0, heroPricePerLevel, 1, hero1, true);
    hero2 = gameplayInterface.createHeroStats(0, heroPricePerLevel, 2, hero2, true);
    hero3 = gameplayInterface.createHeroStats(0, heroPricePerLevel, 3, hero3, true);
  }

  function _generateSpecificRandoms(uint timeslot)
    internal
    view
  returns(uint random1, uint random2, uint random3) {
    // factors are (a) msg.sender
    // (b) time span (check vs now)
    // (c) char ID
    // ADDRESS | timestamp | id
    
    // You can buy the current timeslot, or the previous one.
    uint actualTimeslot = (now / 28800);
    require(timeslot == actualTimeslot || timeslot == actualTimeslot - 1);
  
    uint seed = uint(msg.sender) <<96;
    seed = seed|timeslot;
    random1 = uint(keccak256(seed));
    seed++;
    random2 = uint(keccak256(seed));
    seed++;
    random3 = uint(keccak256(seed));
  }


  // @dev Add Wei (converted to XP) to level up your hero
  // @param _heroID - the hero to train
  function trainHero(uint _heroID, uint choice) 
    external 
    payable
    onlyWhenUnpaused
    addressMustOwnHero(msg.sender, _heroID)
  {
    // Ensure training payment is non-zero
    _trainHero(msg.sender, msg.value, _heroID, choice);
  }

  // @dev Allows a user to rename a hero they own, for a small fee
  // @param _heroID - the ID of the hero to rename;
  // @param _name - the name (int UTF-8 bytes32) to add to the hero
  function renameHero(uint _heroID, bytes32 _name) 
    external 
    payable
    onlyWhenUnpaused
    addressMustOwnHero(msg.sender, _heroID)
  {
    require(msg.value >= 50 finney);
    
    // Store the new name. Allows the user to set the name to ""
    heroNames[_heroID] = _name;
  }

  // @dev Sets a user's username, or resets it if it's previously set
  // @notice Usernames are unique.
  function setUserName(bytes32 _name)
    external
    payable
    onlyWhenUnpaused
  {
    // usernames must be unique
    require(usersByUserName[_name] == address(0));
    bytes32 previousName = userNames[msg.sender];
    // new name must be different from old name
    require(_name != previousName);
    // If name was previously set, chargs & cleanup
    if (previousName != "") {
      // Changing a previously-set username costs ether
      require(msg.value >= 50 finney);
      // Wipe the record of the previous user name
      delete usersByUserName[previousName];
    }
    // Store the new username mappings
    usersByUserName[_name] = msg.sender;
    userNames[msg.sender] = _name;
  }

  // @dev Allows the COO to rename any hero
  // @param _heroID - the ID of the hero to rename;
  // @param _name - the name (int UTF-8 bytes32) to add to the hero
  function forceRenameHero(uint _heroID) 
    external 
    onlyCOO
  {
    // Store the new name. Allows the COO to set the name to ""
    heroNames[_heroID] = "";
  }

  // @dev Allows the COO to rename any user
  // @param _owner - the address of the owner to rename;
  // @param _name - the name (int UTF-8 bytes32) to add to the owner
  function forceRenameOwner(address _owner, bytes32 _name)
    external
    onlyCOO
  {
    userNames[_owner] = _name;
  }

  // @dev Put a hero up for auction.
  //  Does some ownership trickery to create auctions in one tx.
  // @param _heroId The ID of the hero to be put on auction.
  // @param _startingPrice - the start price of the Auction to add.
  // @param _endingPrice - the end price of the Auction to add.
  // @param _duration - the length of the Auction in seconds.
  function createAuction(
    uint _heroID,
    uint _startingPrice,
    uint _endingPrice,
    uint _duration
  )
    external
    onlyWhenUnpaused
    addressMustOwnHero(msg.sender, _heroID)
  {
    uint _cooldown = uint(uint32(tokens[_heroID]>>152));
    // Check to make sure the hero isn't in the arena
    require(_cooldown == 0 || _cooldown >= 10000);

    // Sanity check that no inputs overflow how many bits we've allocated
    // to store them in the auction struct.
    require(_startingPrice == uint(uint128(_startingPrice)));
    require(_endingPrice == uint(uint128(_endingPrice)));
    require(_duration == uint(uint48(_duration)));

    // Our auctions are only Dutch or fixed price.
    require(_startingPrice >= _endingPrice);

    // Auctions can be no more than 7 days, and no less than 10 minutes
    require(_duration <= 7 days);
    require(_duration >= 10 minutes);
    
    _transfer(heroSaleInterface, _heroID);
    // Auction throws if inputs are invalid and clears transfer of the hero.
    heroSaleInterface.createAuction(
      _heroID,
      _startingPrice,
      _endingPrice,
      _duration,
      msg.sender
    );
  }

  // @dev Allows the server to transfer a minted promo hero to a new owner
  // @param couponCode - the code of the requesting account, which will receive the hero
  function redeemPromoHero(bytes32 couponCode) 
    external
    onlyWhenUnpaused
  {
    // Promo token must be (a) on the promo list, and (b) owned by the hero contract itself
    require(uint(couponCode) > 0);
    uint heroID = promoHeroes[couponCode];
    require(indexToOwner[heroID] == address(this));
    _transfer(msg.sender, heroID);
    promoHeroes[couponCode] = 0;
  }

  // @dev Allows the server to transfer a freshly minted random promo hero to a new owner
  // @param couponCode - the code of the requesting account, which will receive the hero
  function redeemPromoRandomHero(bytes32 couponCode) 
    external
    onlyWhenUnpaused
  {
    // Promo token must be on the promo list, and unused
    require(promoRandomHeroes[couponCode] > 0);
    _createHero(msg.sender, heroPriceBase, 0);
    promoRandomHeroes[couponCode] = 0;
  }

  function mintHeroes(address recipient, uint numberToGrant) 
    external
    onlyCOO
  {
    for (uint i = 0; i < numberToGrant; i++) {
      _createHero(recipient == address(0) ? cooAddress : recipient, heroPriceBase, 0);
    }
  }

  function mintAndAuctionHero(uint _startingPrice, uint _endingPrice, uint _duration)
    external
    onlyCOO
  {
    uint _heroID = _createHero(this, heroPriceBase, 0);

    _transfer(heroSaleInterface, _heroID);
    // Auction throws if inputs are invalid and clears transfer of the hero.
    heroSaleInterface.createAuction(
      _heroID,
      _startingPrice,
      _endingPrice,
      _duration,
      this
    );
  }
}

    Contract ABI  
[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_tokenID","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenID","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"heroIDsOfOwner","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oldAddress","type":"address"},{"name":"_newAddress","type":"address"}],"name":"updateSibling","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_erc20address","type":"address"},{"name":"ethRatio","type":"uint256"},{"name":"erc20Ratio","type":"uint256"}],"name":"setERC20ExchangeRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"mintAndAuctionHero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"indexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"timeslot","type":"uint256"}],"name":"buySpecificHeroes","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"heroID","type":"uint256"}],"name":"getHero","outputs":[{"name":"_heroCode","type":"uint256"},{"name":"_name","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenID","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"couponCode","type":"bytes32"}],"name":"redeemPromoHero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_erc20address","type":"address"}],"name":"getExchangeRatio","outputs":[{"name":"ethRatio","type":"uint256"},{"name":"erc20Ratio","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"_tokenID","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"erc20ExchangeRatioETH","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenID","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_heroID","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"firstHeroTeamPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"numberToPull","type":"uint256"},{"name":"startNumber","type":"uint256"}],"name":"heroDataOfOwner","outputs":[{"name":"","type":"uint256[]"},{"name":"","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddress","type":"address"},{"name":"isTransferSiblings","type":"bool"}],"name":"transferERC20TokensToCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenID","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newSiblingManager","type":"address"}],"name":"setSiblingManagers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_basePrice","type":"uint256"},{"name":"_perLevelPrice","type":"uint256"},{"name":"_firstHeroTeamPrice","type":"uint256"}],"name":"setHeroPricing","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"heroSaleInterface","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"heroOfOwnerByIndex","outputs":[{"name":"_heroCode","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"recoveryAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"usersByUserName","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSiblings","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gameplayInterface","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"heroID1","type":"uint256"},{"name":"heroID2","type":"uint256"},{"name":"heroID3","type":"uint256"}],"name":"getHeroGroup","outputs":[{"name":"heroCode1","type":"uint256"},{"name":"heroCode2","type":"uint256"},{"name":"heroCode3","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setHeroSaleAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"setUserName","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"userNames","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"heroID","type":"uint256"}],"name":"getHeroAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_heroID","type":"uint256"},{"name":"choice","type":"uint256"}],"name":"trainHero","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"couponCodes","type":"bytes32[]"}],"name":"allocatePromoRandomHeroes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"viewSpecificHeroes","outputs":[{"name":"hero1","type":"uint256"},{"name":"hero2","type":"uint256"},{"name":"hero3","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lastBoughtHeroes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"tokens","type":"uint256"},{"name":"token","type":"address"},{"name":"data","type":"bytes"}],"name":"receiveApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isHeroInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getPauseState","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"couponCode","type":"bytes32"}],"name":"redeemPromoRandomHero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"heroPricePerLevel","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pauseContracts","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"siblingContracts","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"couponCodes","type":"bytes32[]"}],"name":"mintPromoHeroes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"createHero","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"isTransferSiblings","type":"bool"}],"name":"withdrawBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"heroNames","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"erc20ExchangeRatioERC20","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenID","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setGameplayContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"numberToCreate","type":"uint256"}],"name":"createMultipleHeroes","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"heroIDs","type":"uint256[3]"}],"name":"ownerOfHeroGroup","outputs":[{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"indexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"numberToGrant","type":"uint256"}],"name":"mintHeroes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"couponCodes","type":"bytes32[]"}],"name":"readPromoRandomHeroes","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"couponCodes","type":"bytes32[]"}],"name":"readPromoHeroes","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_heroID","type":"uint256"}],"name":"forceRenameHero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"heroPriceBase","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"heroCode1","type":"uint256"},{"name":"heroCode2","type":"uint256"},{"name":"heroCode3","type":"uint256"},{"name":"isWinner","type":"bool"}],"name":"updateHeroGroup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"heroCode","type":"uint256"},{"name":"isWinner","type":"bool"}],"name":"updateHero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newRecovery","type":"address"}],"name":"setRecovery","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpauseContracts","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_name","type":"bytes32"}],"name":"forceRenameOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_heroID","type":"uint256"},{"name":"_name","type":"bytes32"}],"name":"renameHero","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[{"name":"_basePrice","type":"uint256"},{"name":"_perLevelPrice","type":"uint256"},{"name":"_firstTeamPrice","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"buyer","type":"address"},{"indexed":false,"name":"timeslot","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":false,"name":"hero1","type":"uint256"},{"indexed":false,"name":"hero2","type":"uint256"},{"indexed":false,"name":"hero3","type":"uint256"}],"name":"BoughtSpecificHeroes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_owner","type":"address"},{"indexed":true,"name":"tokenID","type":"uint256"},{"indexed":false,"name":"heroID","type":"uint256"},{"indexed":false,"name":"heroCode","type":"uint256"}],"name":"Create","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_owner","type":"address"},{"indexed":true,"name":"tokenID","type":"uint256"},{"indexed":false,"name":"heroID","type":"uint256"},{"indexed":false,"name":"oldStats","type":"uint256"},{"indexed":false,"name":"newStats","type":"uint256"}],"name":"Train","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"heroID","type":"uint256"},{"indexed":false,"name":"heroCode","type":"uint256"}],"name":"LogVictory","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"tokenID","type":"uint256"},{"indexed":false,"name":"heroID","type":"uint256"},{"indexed":false,"name":"newStats","type":"uint256"}],"name":"UpdateHero","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_added","type":"address"}],"name":"SiblingAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_removed","type":"address"}],"name":"SiblingRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

  Contract Creation Code Switch To Opcodes View
608060405234801561001057600080fd5b5060405160608061442f8339810160409081528151602080840151929093015160008054600160a060020a033316600160a060020a0319918216811783556005805460ff19908116600190811790925560069098527f477a984de5936bcb02475f64e0ea676103106ac0785c67bf7e9e846450b51ef680548916821790557fd544553a2e70858ffdf1e1169f6f124859d29ddf2686bcabf4e6f71bc630442280548916821790557f780e9d63000000000000000000000000000000000000000000000000000000009093527fa99870648958e45dc5b37a02b811cf5f899ba384167c205b3dcb1f6df5e4737280549097169092179095556002805490951617909355601091909155600f556011556143028061012d6000396000f3006080604052600436106103a25763ffffffff60e060020a60003504166301ffc9a781146104075780630519ce791461045257806306fdde0314610483578063081812fc1461050d578063095ea7b3146105255780630b25454e1461054b5780630dd7be3e146105bc57806313af4035146105e357806318160ddd146106045780631a0543781461062b5780631b963f01146106525780631f173e10146106705780632171f44d1461068857806321d801111461069357806323b872dd146106c4578063250e61d6146106ee5780632a6f802b146107065780632ba73c15146107275780632f745c59146107485780633e9036bc1461076c57806342842e0e1461078d578063431f21da146107b757806343362611146107d85780634e0a3379146107ed5780634f64b2be1461080e5780634f6ccce7146108265780635b2936801461083e5780635cd99330146108fe5780636352211e1461092457806369b917c31461093c5780636af73fcd1461095d5780636c9267711461097b578063702394c31461099057806370a08231146109b4578063710eb26c146109d5578063712e525e146109ea578063725b68c814610a02578063741a9eec14610a1757806374fd9fb114610a2c57806375f76ca014610a685780637875567514610a895780637f28163514610a94578063827b296214610ab5578063838b5e9f14610acd578063858d702d14610adb57806386e725f814610afb57806388f064e714610b105780638da5cb5b14610b315780638f4ffcb114610b465780639184360514610b7e57806395d89b4114610b935780639a44f1fb14610ba85780639bf43ebd14610c1c5780639d36ec0914610c34578063a1ad59ff14610c49578063a22cb46514610c5e578063a3e9991814610c84578063a76b844314610c9c578063a80d3e6e14610cbc578063ae0bb53714610cc4578063b047fb5014610cde578063b17cf1eb14610cf3578063b187bd2614610d0b578063b2924ce514610d20578063b88d4fde14610d41578063b903da8d14610d7a578063be4bd12d14610d9b578063c085e54314610da6578063cd78aefb14610dbd578063cddabb2414610dd5578063d19c5e3e14610df9578063d2afa8c114610b7e578063dacca35b14610e19578063db283fdf14610e39578063e769dff314610e51578063e985e9c514610e66578063eb4d09dc14610e8d578063f0cd893a14610eb0578063f0d85c8914610ecd578063f389aaad14610eee578063f6279c7c14610f03578063fa34b70514610f27575b6000805b6004548210156103f75733600160a060020a03166004838154811015156103c957fe5b600091825260209091200154600160a060020a031614156103ec575060016103f7565b6001909101906103a6565b80151561040357600080fd5b5050005b34801561041357600080fd5b5061043e7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516610f35565b604080519115158252519081900360200190f35b34801561045e57600080fd5b50610467610f69565b60408051600160a060020a039092168252519081900360200190f35b34801561048f57600080fd5b50610498610f78565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104d25781810151838201526020016104ba565b50505050905090810190601f1680156104ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561051957600080fd5b50610467600435610fb0565b34801561053157600080fd5b50610549600160a060020a0360043516602435610fe0565b005b34801561055757600080fd5b5061056c600160a060020a03600435166110a8565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156105a8578181015183820152602001610590565b505050509050019250505060405180910390f35b3480156105c857600080fd5b50610549600160a060020a0360043581169060243516611129565b3480156105ef57600080fd5b50610549600160a060020a03600435166113d4565b34801561061057600080fd5b506106196114b6565b60408051918252519081900360200190f35b34801561063757600080fd5b50610549600160a060020a03600435166024356044356114bc565b34801561065e57600080fd5b506105496004356024356044356115c8565b34801561067c57600080fd5b506104676004356116ae565b6105496004356116c9565b34801561069f57600080fd5b506106ab6004356117f6565b6040805192835260208301919091528051918290030190f35b3480156106d057600080fd5b50610549600160a060020a0360043581169060243516604435611829565b3480156106fa57600080fd5b50610549600435611913565b34801561071257600080fd5b506106ab600160a060020a0360043516611986565b34801561073357600080fd5b50610549600160a060020a03600435166119ae565b34801561075457600080fd5b50610619600160a060020a0360043516602435611a51565b34801561077857600080fd5b50610619600160a060020a0360043516611a9f565b34801561079957600080fd5b50610549600160a060020a0360043581169060243516604435611ab1565b3480156107c357600080fd5b50610549600435602435604435606435611ad2565b3480156107e457600080fd5b50610619611c8b565b3480156107f957600080fd5b50610549600160a060020a0360043516611c91565b34801561081a57600080fd5b50610619600435611d34565b34801561083257600080fd5b50610619600435611d53565b34801561084a57600080fd5b50610865600160a060020a0360043516602435604435611d6d565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156108a9578181015183820152602001610891565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156108e85781810151838201526020016108d0565b5050505090500194505050505060405180910390f35b34801561090a57600080fd5b50610549600160a060020a03600435166024351515611ec3565b34801561093057600080fd5b506104676004356120c3565b34801561094857600080fd5b50610549600160a060020a03600435166120de565b34801561096957600080fd5b506105496004356024356044356121fa565b34801561098757600080fd5b50610467612226565b34801561099c57600080fd5b50610619600160a060020a0360043516602435612235565b3480156109c057600080fd5b50610619600160a060020a036004351661228b565b3480156109e157600080fd5b506104676122a6565b3480156109f657600080fd5b506104676004356122b5565b348015610a0e57600080fd5b5061056c6122d0565b348015610a2357600080fd5b5061046761236f565b348015610a3857600080fd5b50610a4a60043560243560443561237e565b60408051938452602084019290925282820152519081900360600190f35b348015610a7457600080fd5b50610549600160a060020a03600435166123e0565b6105496004356124d6565b348015610aa057600080fd5b50610619600160a060020a03600435166125a3565b348015610ac157600080fd5b506106196004356125b5565b6105496004356024356125d8565b348015610ae757600080fd5b50610549600480356024810191013561261e565b348015610b0757600080fd5b50610a4a61267c565b348015610b1c57600080fd5b50610619600160a060020a0360043516612880565b348015610b3d57600080fd5b50610467612892565b348015610b5257600080fd5b5061054960048035600160a060020a0390811691602480359260443516916064359182019101356128a1565b348015610b8a57600080fd5b5061043e612bb1565b348015610b9f57600080fd5b50610498612bb6565b348015610bb457600080fd5b50610bbd612bed565b604051808315151515815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610c07578181015183820152602001610bef565b50505050905001935050505060405180910390f35b348015610c2857600080fd5b50610549600435612cfe565b348015610c4057600080fd5b50610619612d47565b348015610c5557600080fd5b50610549612d4d565b348015610c6a57600080fd5b50610549600160a060020a03600435166024351515612e2a565b348015610c9057600080fd5b50610467600435612e98565b348015610ca857600080fd5b506105496004803560248101910135612ec0565b610549612f5e565b348015610cd057600080fd5b506105496004351515612f7a565b348015610cea57600080fd5b5061046761308d565b348015610cff57600080fd5b5061061960043561309c565b348015610d1757600080fd5b5061043e6130ae565b348015610d2c57600080fd5b50610619600160a060020a03600435166130b7565b348015610d4d57600080fd5b50610549600160a060020a03600480358216916024803590911691604435916064359081019101356130c9565b348015610d8657600080fd5b50610549600160a060020a0360043516613105565b6105496004356131fb565b348015610db257600080fd5b50610467600461324d565b348015610dc957600080fd5b506104676004356132b6565b348015610de157600080fd5b50610549600160a060020a03600435166024356132d1565b348015610e0557600080fd5b5061056c6004803560248101910135613333565b348015610e2557600080fd5b5061056c60048035602481019101356133e1565b348015610e4557600080fd5b50610549600435613487565b348015610e5d57600080fd5b506106196134b3565b348015610e7257600080fd5b5061043e600160a060020a03600435811690602435166134b9565b348015610e9957600080fd5b5061054960043560243560443560643515156134e7565b348015610ebc57600080fd5b50610549600435602435151561370d565b348015610ed957600080fd5b50610549600160a060020a0360043516613812565b348015610efa57600080fd5b506105496138b5565b348015610f0f57600080fd5b50610549600160a060020a0360043516602435613990565b6105496004356024356139c7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660009081526006602052604090205460ff1690565b600154600160a060020a031681565b60408051808201909152600e81527f426c6f636b20427261776c65727300000000000000000000000000000000000060208201525b90565b600a5460009082908110610fc357600080fd5b5050600090815260086020526040902054600160a060020a031690565b6000818152600760205260409020548190600160a060020a039081169033168114806110325750600160a060020a038082166000908152600960209081526040808320339094168352929052205460ff165b151561103d57600080fd5b6000838152600860209081526040918290208054600160a060020a031916600160a060020a0388811691821790925583518781529351909333909216927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350505050565b6060600160a060020a03821615156110bf57600080fd5b600160a060020a0382166000908152600b60209081526040918290208054835181840281018401909452808452909183018282801561111d57602002820191906000526020600020905b815481526020019060010190808311611109575b50505050509050919050565b60008054819033600160a060020a0390811691161461114757600080fd5b60055460ff16151560011461115b57600080fd5b600091505b6004548210156112c15783600160a060020a031660048381548110151561118357fe5b600091825260209091200154600160a060020a031614156112b657600454600019018214156111d85760048054839081106111ba57fe5b60009182526020909120018054600160a060020a0319169055611265565b6004805460001981019081106111ea57fe5b60009182526020909120015460048054600160a060020a03909216918490811061121057fe5b60009182526020909120018054600160a060020a031916600160a060020a039290921691909117905560048054600019810190811061124b57fe5b60009182526020909120018054600160a060020a03191690555b6004805460001901906112789082614259565b5060408051600160a060020a038616815290517f1932e36384561dae1d70ebce4a7ba6f8d314b0b48dcf5cca7549d3a6671b72c69181900360200190a15b600190910190611160565b600160a060020a038316156113ce5782905080600160a060020a031663f3a5a0ec6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561131157600080fd5b505af1158015611325573d6000803e3d6000fd5b505050506040513d602081101561133b57600080fd5b5051151561134857600080fd5b600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018054600160a060020a031916600160a060020a0383811691909117909155604080519185168252517f947720e8556ec24877ff51e4a86046046dc228c2fa1a2ff23dd3fb2dce13aedf916020908290030190a15b50505050565b60035433600160a060020a039081169116146113ef57600080fd5b600160a060020a038116151561140457600080fd5b600254600160a060020a038281169116141561141f57600080fd5b600154600160a060020a038281169116141561143a57600080fd5b600354600160a060020a038281169116141561145557600080fd5b60008054600160a060020a031916600160a060020a038381169182179283905560408051939091168352602083019190915280517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09281900390910190a150565b600a5490565b600254600090819033600160a060020a039081169116146114dc57600080fd5b6000841180156114ec5750600083115b1561159a5784915081600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561153257600080fd5b505af1158015611546573d6000803e3d6000fd5b505050506040513d602081101561155c57600080fd5b505190506000811161156d57600080fd5b600160a060020a0385166000908152601260209081526040808320879055601390915290208390556115c1565b600160a060020a038516600090815260126020908152604080832083905560139091528120555b5050505050565b60025460009033600160a060020a039081169116146115e657600080fd5b6115f430600f546000613a29565b600e5490915061160d90600160a060020a031682613ba2565b600e54604080517f27ebe40a00000000000000000000000000000000000000000000000000000000815260048101849052602481018790526044810186905260648101859052600160a060020a033081166084830152915191909216916327ebe40a9160a480830192600092919082900301818387803b15801561169057600080fd5b505af11580156116a4573d6000803e3d6000fd5b5050505050505050565b600860205260009081526040902054600160a060020a031681565b60055460009081908190819081908190819060ff16156116e857600080fd5b600160a060020a033316600090815260196020526040902054965086151561171d57601154341461171857600080fd5b61173c565b87871061172957600080fd5b600f546003023414151561173c57600080fd5b61174588613db6565b600f54929850909650945061175c90339088613a29565b925061176b33600f5487613a29565b915061177a33600f5486613a29565b600160a060020a0333166000818152601960209081526040918290208c9055815192835282018b90523482820152606082018690526080820185905260a08201839052519192507fdf46e5116b5b4ed48539078839bd001125ffc99c7830a760406d70a736e9216a919081900360c00190a15050505050505050565b600080600a8381548110151561180857fe5b60009182526020808320909101549482526014905260409020549293915050565b60008181526007602052604090205481908490600160a060020a03908116908216811461185557600080fd5b80600160a060020a031633600160a060020a0316148061188f575060008381526008602052604090205433600160a060020a039081169116145b806118c05750600160a060020a038082166000908152600960209081526040808320339094168352929052205460ff165b15156118cb57600080fd5b600160a060020a03851615156118e057600080fd5b30600160a060020a031685600160a060020a03161415151561190157600080fd5b61190b8585613ba2565b505050505050565b60055460009060ff161561192657600080fd5b6000821161193357600080fd5b5060008181526017602090815260408083205480845260079092529091205430600160a060020a0390811691161461196a57600080fd5b6119743382613ba2565b50600090815260176020526040812055565b600160a060020a03166000908152601260209081526040808320546013909252909120549091565b60005433600160a060020a039081169116146119c957600080fd5b600160a060020a03811615156119de57600080fd5b600054600160a060020a03828116911614156119f957600080fd5b600154600160a060020a0382811691161415611a1457600080fd5b600354600160a060020a0382811691161415611a2f57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b6000600160a060020a0383161515611a6857600080fd5b600160a060020a0383166000908152600b60205260409020805483908110611a8c57fe5b9060005260206000200154905092915050565b60126020526000908152604090205481565b611acd8383836020604051908101604052806000815250613e3a565b505050565b60055460009060ff1615611ae557600080fd5b60008581526007602052604090205433908690600160a060020a03808416911614611b0f57600080fd5b6098600a88815481101515611b2057fe5b90600052602060002001549060020a900463ffffffff1692508260001480611b4a57506127108310155b1515611b5557600080fd5b6fffffffffffffffffffffffffffffffff86168614611b7357600080fd5b6fffffffffffffffffffffffffffffffff85168514611b9157600080fd5b65ffffffffffff84168414611ba557600080fd5b84861015611bb257600080fd5b62093a80841115611bc257600080fd5b610258841015611bd157600080fd5b600e54611be790600160a060020a031688613ba2565b600e54604080517f27ebe40a000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044810188905260648101879052600160a060020a033381166084830152915191909216916327ebe40a9160a480830192600092919082900301818387803b158015611c6a57600080fd5b505af1158015611c7e573d6000803e3d6000fd5b5050505050505050505050565b60115481565b60005433600160a060020a03908116911614611cac57600080fd5b600160a060020a0381161515611cc157600080fd5b600054600160a060020a0382811691161415611cdc57600080fd5b600254600160a060020a0382811691161415611cf757600080fd5b600354600160a060020a0382811691161415611d1257600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b600a805482908110611d4257fe5b600091825260209091200154905081565b600a5460009082908110611d6657600080fd5b5090919050565b600160a060020a0383166000908152600b602052604081205460609182919082808280858910611d9c57600080fd5b8886039450848a11611dae5789611db0565b845b945084604051908082528060200260200182016040528015611ddc578160200160208202803883390190505b50935084604051908082528060200260200182016040528015611e09578160200160208202803883390190505b5092508891505b848901821015611eb357600160a060020a038b166000908152600b60205260409020805483908110611e3e57fe5b90600052602060002001549050600a81815481101515611e5a57fe5b90600052602060002001548483815181101515611e7357fe5b60209081029091018101919091526000828152601490915260409020548351849084908110611e9e57fe5b60209081029091010152600190910190611e10565b5091999098509650505050505050565b6001546000908190819033600160a060020a03908116911614611ee557600080fd5b84925082600160a060020a03166370a08231306040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015611f4357600080fd5b505af1158015611f57573d6000803e3d6000fd5b505050506040513d6020811015611f6d57600080fd5b50519150600082111561200a5782600160a060020a031663a9059cbb33846040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015611fdd57600080fd5b505af1158015611ff1573d6000803e3d6000fd5b505050506040513d602081101561200757600080fd5b50505b83156115c1575060005b6004548110156115c157600480548290811061202c57fe5b6000918252602082200154604080517fc45a7a2e000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015233811660248301529151919092169263c45a7a2e926044808201939182900301818387803b15801561209f57600080fd5b505af11580156120b3573d6000803e3d6000fd5b5050600190920191506120149050565b600090815260076020526040902054600160a060020a031690565b6000805433600160a060020a039081169116146120fa57600080fd5b600054600160a060020a038381169116141561211557600080fd5b600154600160a060020a038381169116141561213057600080fd5b600354600160a060020a038381169116141561214b57600080fd5b5060005b6004548110156121f657600480548290811061216757fe5b6000918252602082200154604080517f58aba00f000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915191909216926358aba00f926024808201939182900301818387803b1580156121d257600080fd5b505af11580156121e6573d6000803e3d6000fd5b50506001909201915061214f9050565b5050565b60025433600160a060020a0390811691161461221557600080fd5b601091909155600f91909155601155565b600e54600160a060020a031681565b6000600160a060020a038316151561224c57600080fd5b600160a060020a0383166000908152600b602052604090208054600a91908490811061227457fe5b9060005260206000200154815481101515611a8c57fe5b600160a060020a03166000908152600b602052604090205490565b600354600160a060020a031681565b601660205260009081526040902054600160a060020a031681565b6060806000600480549050604051908082528060200260200182016040528015612304578160200160208202803883390190505b509150600090505b60045481101561236957600480548290811061232457fe5b6000918252602090912001548251600160a060020a039091169083908390811061234a57fe5b600160a060020a0390921660209283029091019091015260010161230c565b50919050565b600d54600160a060020a031681565b6000806000600a8681548110151561239257fe5b90600052602060002001549250600a858154811015156123ae57fe5b90600052602060002001549150600a848154811015156123ca57fe5b9060005260206000200154905093509350939050565b6000805433600160a060020a039081169116146123fc57600080fd5b60055460ff16151560011461241057600080fd5b600160a060020a038216151561242557600080fd5b81905080600160a060020a031663970608e66040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561246657600080fd5b505af115801561247a573d6000803e3d6000fd5b505050506040513d602081101561249057600080fd5b5051151561249d57600080fd5b600e546124b390600160a060020a031683611129565b600e8054600160a060020a031916600160a060020a039290921691909117905550565b60055460009060ff16156124e957600080fd5b600082815260166020526040902054600160a060020a03161561250b57600080fd5b50600160a060020a0333166000908152601560205260409020548181141561253257600080fd5b80156125695766b1a2bc2ec5000034101561254c57600080fd5b60008181526016602052604090208054600160a060020a03191690555b5060008181526016602090815260408083208054600160a060020a03191633600160a060020a031690811790915583526015909152902055565b60156020526000908152604090205481565b6000600a828154811015156125c657fe5b90600052602060002001549050919050565b60055460ff16156125e857600080fd5b60008281526007602052604090205433908390600160a060020a0380841691161461261257600080fd5b6113ce333486866140c7565b60025460009033600160a060020a0390811691161461263c57600080fd5b5060005b81811015611acd5760016018600085858581811061265a57fe5b6020908102929092013583525081019190915260400160002055600101612640565b6000808061268d6170804204613db6565b600d546010546040805160e060020a63dd5d0b1702815260006004820181905260248201939093526001604482018190526064820188905260848201529051959850939650919450600160a060020a03169263dd5d0b179260a4808201936020939283900390910190829087803b15801561270757600080fd5b505af115801561271b573d6000803e3d6000fd5b505050506040513d602081101561273157600080fd5b5051600d546010546040805160e060020a63dd5d0b1702815260006004820181905260248201939093526002604482015260648101879052600160848201529051939650600160a060020a039092169263dd5d0b179260a4808201936020939283900390910190829087803b1580156127a957600080fd5b505af11580156127bd573d6000803e3d6000fd5b505050506040513d60208110156127d357600080fd5b5051600d546010546040805160e060020a63dd5d0b1702815260006004820181905260248201939093526003604482015260648101869052600160848201529051939550600160a060020a039092169263dd5d0b179260a4808201936020939283900390910190829087803b15801561284b57600080fd5b505af115801561285f573d6000803e3d6000fd5b505050506040513d602081101561287557600080fd5b505192939192919050565b60196020526000908152604090205481565b600054600160a060020a031681565b60055460009081908190819081908190819060ff16156128c057600080fd5b600160a060020a038a166000908152601260205260408120548b91106128e557600080fd5b600089116128f257600080fd5b60008c116128ff57600080fd5b600160a060020a038b1660009081526012602090815260408083205460139092528220549099509750881161293357600080fd5b6000871161294057600080fd5b868c029550868c8781151561295157fe5b041461295c57600080fd5b878681151561296757fe5b0494508a600160a060020a03166323b872dd8e308f6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183600160a060020a0316600160a060020a031681526020018281526020019350505050602060405180830381600087803b1580156129e757600080fd5b505af11580156129fb573d6000803e3d6000fd5b505050506040513d6020811015612a1157600080fd5b50511515612a1e57600080fd5b6020891415612a3957612a338d866000613a29565b50612ba2565b6024891415612ba05760009350600092505b6020831015612aa757600883028a8a85818110612a6457fe5b9050013560f860020a900460f860020a02600160f860020a031916600160f860020a0319169060020a900460f860020a9004841793508280600101935050612a4b565b89896020818110612ab457fe5b9050013560f860020a900460f860020a02600160f860020a03191660f860020a9004915060088a8a60218181101515612ae957fe5b9050013560f860020a900460f860020a02600160f860020a03191660f860020a90049060020a90048217915060108a8a60228181101515612b2657fe5b9050013560f860020a900460f860020a02600160f860020a03191660f860020a90049060020a90048217915060188a8a60238181101515612b6357fe5b9050013560f860020a900460f860020a02600160f860020a03191660f860020a90049060020a900482179150612b9b8d8684876140c7565b612ba2565bfe5b50505050505050505050505050565b600190565b60408051808201909152600281527f4242000000000000000000000000000000000000000000000000000000000000602082015290565b60006060806000600480549050604051908082528060200260200182016040528015612c23578160200160208202803883390190505b509150600090505b600454811015612cef576004805482908110612c4357fe5b9060005260206000200160009054906101000a9004600160a060020a0316600160a060020a031663b187bd266040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612c9e57600080fd5b505af1158015612cb2573d6000803e3d6000fd5b505050506040513d6020811015612cc857600080fd5b50518251839083908110612cd857fe5b911515602092830290910190910152600101612c2b565b5060055460ff16939092509050565b60055460ff1615612d0e57600080fd5b60008181526018602052604081205411612d2757600080fd5b612d3533600f546000613a29565b50600090815260186020526040812055565b60105481565b6000805433600160a060020a03908116911614612d6957600080fd5b60055460ff1615612d7957600080fd5b506005805460ff1916600117905560005b600454811015612e27576004805482908110612da257fe5b6000918252602082200154604080517fb23b5dfd0000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169263b23b5dfd9260048084019382900301818387803b158015612e0357600080fd5b505af1158015612e17573d6000803e3d6000fd5b505060019092019150612d8a9050565b50565b600160a060020a03338116600081815260096020908152604080832094871680845294825291829020805486151560ff199091168117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a35050565b6004805482908110612ea657fe5b600091825260209091200154600160a060020a0316905081565b60025460009033600160a060020a03908116911614612ede57600080fd5b5060005b81811015611acd5760176000848484818110612efa57fe5b602090810292909201358352508101919091526040016000205415612f1e57600080fd5b612f2c30600f546000613a29565b60176000858585818110612f3c57fe5b6020908102929092013583525081019190915260400160002055600101612ee2565b60055460ff1615612f6e57600080fd5b612e2733346000613a29565b600154600090819033600160a060020a03908116911614612f9a57600080fd5b821561304f57600091505b60045482101561304f576004805483908110612fbd57fe5b9060005260206000200160009054906101000a9004600160a060020a0316600160a060020a031663c8c913216040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561301857600080fd5b505af115801561302c573d6000803e3d6000fd5b505050506040513d602081101561304257600080fd5b5050600190910190612fa5565b50600154604051600160a060020a033081163192169082156108fc029083906000818181858888f193505050501580156113ce573d6000803e3d6000fd5b600254600160a060020a031681565b60146020526000908152604090205481565b60055460ff1681565b60136020526000908152604090205481565b6115c185858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750613e3a945050505050565b6000805433600160a060020a0390811691161461312157600080fd5b60055460ff16151560011461313557600080fd5b600160a060020a038216151561314a57600080fd5b81905080600160a060020a03166397eca9fb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561318b57600080fd5b505af115801561319f573d6000803e3d6000fd5b505050506040513d60208110156131b557600080fd5b505115156131c257600080fd5b600d546131d890600160a060020a031683611129565b600d8054600160a060020a031916600160a060020a039290921691909117905550565b600554600090819060ff161561321057600080fd5b6000831161321d57600080fd5b823481151561322857fe5b049150600090505b82811015611acd5761324433836000613a29565b50600101613230565b803560009081526007602090815260408083205491840135835290912054600160a060020a039182169116811415806132a35750604082810135600090815260076020522054600160a060020a03828116911614155b6132ad57806132b0565b60005b92915050565b600760205260009081526040902054600160a060020a031681565b60025460009033600160a060020a039081169116146132ef57600080fd5b5060005b81811015611acd5761332a600160a060020a038416156133135783613320565b600254600160a060020a03165b600f546000613a29565b506001016132f3565b600254606090819060009033600160a060020a0390811691161461335657600080fd5b60408051858152602080870282010190915284801561337f578160200160208202803883390190505b509150600090505b838110156133d9576018600086868481811061339f57fe5b602090810292909201358352508101919091526040016000205482518390839081106133c757fe5b60209081029091010152600101613387565b509392505050565b600254606090819060009033600160a060020a0390811691161461340457600080fd5b60408051858152602080870282010190915284801561342d578160200160208202803883390190505b509150600090505b838110156133d9576017600086868481811061344d57fe5b6020908102929092013583525081019190915260400160002054825183908390811061347557fe5b60209081029091010152600101613435565b60025433600160a060020a039081169116146134a257600080fd5b600090815260146020526040812055565b600f5481565b600160a060020a03918216600090815260096020908152604080832093909416825291909152205460ff1690565b6000808080805b60045482101561353f5733600160a060020a031660048381548110151561351157fe5b600091825260209091200154600160a060020a031614156135345750600161353f565b6001909101906134ee565b80151561354b57600080fd5b600a805463ffffffff60e060020a808d0482169850808c04821697508a041694508a91908790811061357957fe5b906000526020600020018190555087600a8581548110151561359757fe5b906000526020600020018190555086600a848154811015156135b557fe5b6000918252602080832090910192909255868152600782526040908190205481518881529283018c905281518893600160a060020a0390921692600080516020614297833981519152928290030190a36000848152600760209081526040918290205482518781529182018b905282518793600160a060020a039092169260008051602061429783398151915292908290030190a36000838152600760209081526040918290205482518681529182018a905282518693600160a060020a039092169260008051602061429783398151915292908290030190a3851561370257604080518a8152905186916000805160206142b7833981519152919081900360200190a260408051898152905185916000805160206142b7833981519152919081900360200190a260408051898152905185916000805160206142b7833981519152919081900360200190a25b505050505050505050565b600080805b6004548210156137635733600160a060020a031660048381548110151561373557fe5b600091825260209091200154600160a060020a0316141561375857506001613763565b600190910190613712565b80151561376f57600080fd5b600a805463ffffffff60e060020a88041694508691908590811061378f57fe5b60009182526020909120015583156137c65760408051868152905184916000805160206142b7833981519152919081900360200190a25b60008381526007602090815260409182902054825186815291820188905282518693600160a060020a039092169260008051602061429783398151915292908290030190a35050505050565b60005433600160a060020a0390811691161461382d57600080fd5b600160a060020a038116151561384257600080fd5b600054600160a060020a038281169116141561385d57600080fd5b600154600160a060020a038281169116141561387857600080fd5b600254600160a060020a038281169116141561389357600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b6000805433600160a060020a039081169116146138d157600080fd5b60055460ff1615156001146138e557600080fd5b506005805460ff1916905560005b600454811015612e2757600480548290811061390b57fe5b6000918252602082200154604080517f8014239a0000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921692638014239a9260048084019382900301818387803b15801561396c57600080fd5b505af1158015613980573d6000803e3d6000fd5b5050600190920191506138f39050565b60025433600160a060020a039081169116146139ab57600080fd5b600160a060020a03909116600090815260156020526040902055565b60055460ff16156139d757600080fd5b60008281526007602052604090205433908390600160a060020a03808416911614613a0157600080fd5b66b1a2bc2ec50000341015613a1557600080fd5b505060009182526014602052604090912055565b6000806000600f548510151515613a3f57600080fd5b600a54925063400000008310613a5457600080fd5b60008411915081613a6b57613a6883614230565b93505b600d54600f546010546040805160e060020a63dd5d0b17028152928903600484015260248301919091526044820186905260648201879052841515608483015251600160a060020a039092169163dd5d0b179160a4808201926020929091908290030181600087803b158015613ae057600080fd5b505af1158015613af4573d6000803e3d6000fd5b505050506040513d6020811015613b0a57600080fd5b5051600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80181905560408051600160a060020a038916815260208101869052808201839052905191925084917fe3a07e2ac405f9c908f600ba464ed28dd28f04e308ccc0610a33ca7ed1c59abb9181900360600190a2613b998684613ba2565b50509392505050565b60008060008084600a8054905081101515613bbc57600080fd5b600086815260076020526040902054600160a060020a031694508415613cfb57600160a060020a0385166000818152600c602090815260408083208a8452825280832054938352600b90915290208054919550600019820194509084908110613c2157fe5b9060005260206000200154915081600b600087600160a060020a0316600160a060020a0316815260200190815260200160002085815481101515613c6157fe5b6000918252602080832090910192909255600160a060020a038716808252600c835260408083208684528452808320889055908252600b90925220805484908110613ca857fe5b60009182526020808320909101829055600160a060020a0387168252600b905260409020805490613cdd906000198301614259565b5060008681526008602052604090208054600160a060020a03191690555b60008681526007602052604090208054600160a060020a031916600160a060020a03891690811790915515613d6c57600160a060020a0387166000818152600b60209081526040808320805460018101825590845282842081018b9055938352600c82528083208a84529091529020555b8587600160a060020a031686600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050505050565b6000808061708042048185821480613dd057506001820386145b1515613ddb57600080fd5b5050604080516c01000000000000000000000000600160a060020a033316029590951780865281519586900360209081018720600183018852835197889003820188206002939093018852925196879003019095209095909350915050565b600a54600090819084908110613e4f57600080fd5b60008581526007602052604090205485908890600160a060020a039081169082168114613e7b57600080fd5b80600160a060020a031633600160a060020a03161480613eb5575060008381526008602052604090205433600160a060020a039081169116145b80613ee65750600160a060020a038082166000908152600960209081526040808320339094168352929052205460ff165b1515613ef157600080fd5b600160a060020a0389161515613f0657600080fd5b613f108989613ba2565b883b9550851515613f20576140bb565b88600160a060020a031663150b7a02338c8b8b6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613fb8578181015183820152602001613fa0565b50505050905090810190601f168015613fe55780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561400757600080fd5b505af115801561401b573d6000803e3d6000fd5b505050506040513d602081101561403157600080fd5b5051604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e742c62797465732900000000000000000000000000000000000000006020820152905190819003602c0190209095507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198087169116146140bb57600080fd5b50505050505050505050565b600082815260076020526040812054819086908590600160a060020a038084169116146140f357600080fd5b600a80548790811061410157fe5b90600052602060002001549350600d60009054906101000a9004600160a060020a0316600160a060020a031663faedb5ec8860105487896040518563ffffffff1660e060020a02815260040180858152602001848152602001838152602001828152602001945050505050602060405180830381600087803b15801561418657600080fd5b505af115801561419a573d6000803e3d6000fd5b505050506040513d60208110156141b057600080fd5b5051600a80549194508491889081106141c557fe5b6000918252602091829020019190915560408051600160a060020a0333168152918201889052818101869052606082018590525187917fcda591ef82a90697defc79bceb923705a07399a43a09e920e12d218efe87feaf919081900360800190a25050505050505050565b604080519182528051918290036020908101832060001943014018835290519182900301902090565b815481835581811115611acd57600083815260209020611acd918101908301610fad91905b80821115614292576000815560010161427e565b50905600e82cd03bff293e74d77180056009877437cf3d901f17a84dd2ffd382563c9edc841ae9315d50a35bb3cc7918080448ff165d3cf6a1e51e5caf5379952cfd6938a165627a7a723058209e829c0992ac649f41e2f14a0e35054253959dce3db521b1de175def4ffe2f47002900000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000006a94d74f430000

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

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000470de4df820000
Arg [1] : 0000000000000000000000000000000000000000000000000011c37937e08000
Arg [2] : 000000000000000000000000000000000000000000000000006a94d74f430000


   Swarm Source:
bzzr://9e829c0992ac649f41e2f14a0e35054253959dce3db521b1de175def4ffe2f47

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward