Contract 0xc3948136b5e33d01e4fa95f01bf372fb319145f9

Contract Overview

Balance:
0 BNB

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xff42d295b16a8be889e60527beb11b76dce27507be64206d56194cde9f0e2ea8Claim Award112173582021-08-05 14:54:1050 days 1 hr ago0xd8ef701bc1b8d08ac492266692e10479ee3a4ca5 IN  0xc3948136b5e33d01e4fa95f01bf372fb319145f90 BNB0.00027368
0xa8da02af4de6ced0d2cf8fdb6f460257581a6c8607db9fdd1e071756bf08185dClaim Award112173432021-08-05 14:53:2550 days 1 hr ago0x1a8efac3e19dd34c8353f9e4a14b585bce361dd2 IN  0xc3948136b5e33d01e4fa95f01bf372fb319145f90 BNB0.00066902
0xa67fde3723e0e78722830832f25d06af977631758f354b25dcf5c2906b218454End Battle112172942021-08-05 14:50:5850 days 1 hr ago0x1a8efac3e19dd34c8353f9e4a14b585bce361dd2 IN  0xc3948136b5e33d01e4fa95f01bf372fb319145f90 BNB0.00177202
0xef11c1379404cf56550a8d4cc923a974873f72ea5aa3b6b75d17f4e0d8e2f4adParticipate Batt...112172642021-08-05 14:49:2850 days 1 hr ago0x1a8efac3e19dd34c8353f9e4a14b585bce361dd2 IN  0xc3948136b5e33d01e4fa95f01bf372fb319145f90 BNB0.00141465
0xe42f8197492ac5c6d077636ec2e5aa60146bf311791e10c72f11b657d2d0a926Participate Batt...112172542021-08-05 14:48:5850 days 1 hr ago0x1a8efac3e19dd34c8353f9e4a14b585bce361dd2 IN  0xc3948136b5e33d01e4fa95f01bf372fb319145f90 BNB0.00042354
0x1560b54d915884c1834291921f213508e2297e50d998a96bbd9b9aa2e66b0958Participate Batt...112172412021-08-05 14:48:1950 days 1 hr ago0xd8ef701bc1b8d08ac492266692e10479ee3a4ca5 IN  0xc3948136b5e33d01e4fa95f01bf372fb319145f90 BNB0.00248575
0xbf3a8fe22e310a76776999a7b1e2143da1ce2bbf991f930b8c29bfc1bd6b5544Participate Batt...112172372021-08-05 14:48:0750 days 1 hr ago0x1a8efac3e19dd34c8353f9e4a14b585bce361dd2 IN  0xc3948136b5e33d01e4fa95f01bf372fb319145f90 BNB0.00042354
0x5d7310a88e16b0e349fd024f5b5c1a8539045bcdc84810608228e192688d1affCreate Battle112172272021-08-05 14:47:3750 days 1 hr ago0x1a8efac3e19dd34c8353f9e4a14b585bce361dd2 IN  0xc3948136b5e33d01e4fa95f01bf372fb319145f90 BNB0.0020231
0x2b6740f02929cbf56354ef806d732f1602c7aeacbf1d1b3f899c8158a3d294b5Initialize112169742021-08-05 14:34:5850 days 1 hr ago0x1a8efac3e19dd34c8353f9e4a14b585bce361dd2 IN  0xc3948136b5e33d01e4fa95f01bf372fb319145f90 BNB0.00065346
0x24ef0072db6f1c00bd4492fff7eb0a83d185d4bc5b94cef4ec6a95f13f54bc970x60c06040112169402021-08-05 14:33:1650 days 1 hr ago0x1a8efac3e19dd34c8353f9e4a14b585bce361dd2 IN  Contract Creation0 BNB0.04073965
[ Download CSV Export 
Latest 21 internal transactions
Parent Txn Hash Block From To Value
0xa8da02af4de6ced0d2cf8fdb6f460257581a6c8607db9fdd1e071756bf08185d112173432021-08-05 14:53:2550 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
0x852f341a838cadce3694c4f5505cff4111dda1befc5bb55d4928095702b50102112173102021-08-05 14:51:4650 days 1 hr ago 0xa555fc018435bef5a13c6c6870a9d4c11dec329c 0xc3948136b5e33d01e4fa95f01bf372fb319145f90 BNB
0xa67fde3723e0e78722830832f25d06af977631758f354b25dcf5c2906b218454112172942021-08-05 14:50:5850 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0x84b9b910527ad5c03a9ca831909e21e236ea7b060 BNB
0xa67fde3723e0e78722830832f25d06af977631758f354b25dcf5c2906b218454112172942021-08-05 14:50:5850 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0x84b9b910527ad5c03a9ca831909e21e236ea7b060 BNB
0xef11c1379404cf56550a8d4cc923a974873f72ea5aa3b6b75d17f4e0d8e2f4ad112172642021-08-05 14:49:2850 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
0xef11c1379404cf56550a8d4cc923a974873f72ea5aa3b6b75d17f4e0d8e2f4ad112172642021-08-05 14:49:2850 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0x3e349e56212753732bedff468656dfc02ed8b43a0 BNB
0xef11c1379404cf56550a8d4cc923a974873f72ea5aa3b6b75d17f4e0d8e2f4ad112172642021-08-05 14:49:2850 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
0xef11c1379404cf56550a8d4cc923a974873f72ea5aa3b6b75d17f4e0d8e2f4ad112172642021-08-05 14:49:2850 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
0xef11c1379404cf56550a8d4cc923a974873f72ea5aa3b6b75d17f4e0d8e2f4ad112172642021-08-05 14:49:2850 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0x3e349e56212753732bedff468656dfc02ed8b43a0 BNB
0xe42f8197492ac5c6d077636ec2e5aa60146bf311791e10c72f11b657d2d0a926112172542021-08-05 14:48:5850 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
0xe42f8197492ac5c6d077636ec2e5aa60146bf311791e10c72f11b657d2d0a926112172542021-08-05 14:48:5850 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
0xe42f8197492ac5c6d077636ec2e5aa60146bf311791e10c72f11b657d2d0a926112172542021-08-05 14:48:5850 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0x3e349e56212753732bedff468656dfc02ed8b43a0 BNB
0x1560b54d915884c1834291921f213508e2297e50d998a96bbd9b9aa2e66b0958112172412021-08-05 14:48:1950 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
0x1560b54d915884c1834291921f213508e2297e50d998a96bbd9b9aa2e66b0958112172412021-08-05 14:48:1950 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0x3e349e56212753732bedff468656dfc02ed8b43a0 BNB
0x1560b54d915884c1834291921f213508e2297e50d998a96bbd9b9aa2e66b0958112172412021-08-05 14:48:1950 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
0x1560b54d915884c1834291921f213508e2297e50d998a96bbd9b9aa2e66b0958112172412021-08-05 14:48:1950 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
0x1560b54d915884c1834291921f213508e2297e50d998a96bbd9b9aa2e66b0958112172412021-08-05 14:48:1950 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0x3e349e56212753732bedff468656dfc02ed8b43a0 BNB
0xbf3a8fe22e310a76776999a7b1e2143da1ce2bbf991f930b8c29bfc1bd6b5544112172372021-08-05 14:48:0750 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
0xbf3a8fe22e310a76776999a7b1e2143da1ce2bbf991f930b8c29bfc1bd6b5544112172372021-08-05 14:48:0750 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
0xbf3a8fe22e310a76776999a7b1e2143da1ce2bbf991f930b8c29bfc1bd6b5544112172372021-08-05 14:48:0750 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0x3e349e56212753732bedff468656dfc02ed8b43a0 BNB
0x5d7310a88e16b0e349fd024f5b5c1a8539045bcdc84810608228e192688d1aff112172272021-08-05 14:47:3750 days 1 hr ago 0xc3948136b5e33d01e4fa95f01bf372fb319145f9 0xf42b36d09c0e2091fe7c47f0a563ce08669d34120 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PrivateBattle

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 8 : VRFConsumerBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "../interfaces/LinkTokenInterface.sol";

import "./VRFRequestIDBase.sol";

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constuctor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator, _link) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.)
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBase expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomness the VRF output
   */
  function fulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    internal
    virtual;

  /**
   * @notice requestRandomness initiates a request for VRF output given _seed
   *
   * @dev The fulfillRandomness method receives the output, once it's provided
   * @dev by the Oracle, and verified by the vrfCoordinator.
   *
   * @dev The _keyHash must already be registered with the VRFCoordinator, and
   * @dev the _fee must exceed the fee specified during registration of the
   * @dev _keyHash.
   *
   * @dev The _seed parameter is vestigial, and is kept only for API
   * @dev compatibility with older versions. It can't *hurt* to mix in some of
   * @dev your own randomness, here, but it's not necessary because the VRF
   * @dev oracle will mix the hash of the block containing your request into the
   * @dev VRF seed it ultimately uses.
   *
   * @param _keyHash ID of public key against which randomness is generated
   * @param _fee The amount of LINK to send with the request
   * @param _seed seed mixed into the input of the VRF.
   *
   * @return requestId unique ID for this request
   *
   * @dev The returned requestId can be used to distinguish responses to
   * @dev concurrent requests. It is passed as the first argument to
   * @dev fulfillRandomness.
   */
  function requestRandomness(
    bytes32 _keyHash,
    uint256 _fee,
    uint256 _seed
  )
    internal
    returns (
      bytes32 requestId
    )
  {
    LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, _seed));
    // This is the seed passed to VRFCoordinator. The oracle will mix this with
    // the hash of the block containing this request to obtain the seed/input
    // which is finally passed to the VRF cryptographic machinery.
    uint256 vRFSeed  = makeVRFInputSeed(_keyHash, _seed, address(this), nonces[_keyHash]);
    // nonces[_keyHash] must stay in sync with
    // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
    // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
    // This provides protection against the user repeating their input seed,
    // which would result in a predictable/duplicate output, if multiple such
    // requests appeared in the same block.
    nonces[_keyHash] = nonces[_keyHash] + 1;
    return makeRequestId(_keyHash, vRFSeed);
  }

  LinkTokenInterface immutable internal LINK;
  address immutable private vrfCoordinator;

  // Nonces for each VRF key from which randomness has been requested.
  //
  // Must stay in sync with VRFCoordinator[_keyHash][this]
  mapping(bytes32 /* keyHash */ => uint256 /* nonce */) private nonces;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   * @param _link address of LINK token contract
   *
   * @dev https://docs.chain.link/docs/link-token-contracts
   */
  constructor(
    address _vrfCoordinator,
    address _link
  ) {
    vrfCoordinator = _vrfCoordinator;
    LINK = LinkTokenInterface(_link);
  }

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    external
  {
    require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
    fulfillRandomness(requestId, randomness);
  }
}

File 2 of 8 : VRFRequestIDBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract VRFRequestIDBase {

  /**
   * @notice returns the seed which is actually input to the VRF coordinator
   *
   * @dev To prevent repetition of VRF output due to repetition of the
   * @dev user-supplied seed, that seed is combined in a hash with the
   * @dev user-specific nonce, and the address of the consuming contract. The
   * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
   * @dev the final seed, but the nonce does protect against repetition in
   * @dev requests which are included in a single block.
   *
   * @param _userSeed VRF seed input provided by user
   * @param _requester Address of the requesting contract
   * @param _nonce User-specific nonce at the time of the request
   */
  function makeVRFInputSeed(
    bytes32 _keyHash,
    uint256 _userSeed,
    address _requester,
    uint256 _nonce
  )
    internal
    pure
    returns (
      uint256
    )
  {
    return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
  }

  /**
   * @notice Returns the id for this request
   * @param _keyHash The serviceAgreement ID to be used for this request
   * @param _vRFInputSeed The seed to be passed directly to the VRF
   * @return The id for this request
   *
   * @dev Note that _vRFInputSeed is not the seed passed by the consuming
   * @dev contract, but the one generated by makeVRFInputSeed
   */
  function makeRequestId(
    bytes32 _keyHash,
    uint256 _vRFInputSeed
  )
    internal
    pure
    returns (
      bytes32
    )
  {
    return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
  }
}

File 3 of 8 : LinkTokenInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface LinkTokenInterface {

  function allowance(
    address owner,
    address spender
  )
    external
    view
    returns (
      uint256 remaining
    );

  function approve(
    address spender,
    uint256 value
  )
    external
    returns (
      bool success
    );

  function balanceOf(
    address owner
  )
    external
    view
    returns (
      uint256 balance
    );

  function decimals()
    external
    view
    returns (
      uint8 decimalPlaces
    );

  function decreaseApproval(
    address spender,
    uint256 addedValue
  )
    external
    returns (
      bool success
    );

  function increaseApproval(
    address spender,
    uint256 subtractedValue
  ) external;

  function name()
    external
    view
    returns (
      string memory tokenName
    );

  function symbol()
    external
    view
    returns (
      string memory tokenSymbol
    );

  function totalSupply()
    external
    view
    returns (
      uint256 totalTokensIssued
    );

  function transfer(
    address to,
    uint256 value
  )
    external
    returns (
      bool success
    );

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  )
    external
    returns (
      bool success
    );

  function transferFrom(
    address from,
    address to,
    uint256 value
  )
    external
    returns (
      bool success
    );

}

File 4 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 5 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 6 of 8 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 7 of 8 : INFTContract.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;

interface INFTContract {
    function nfts(uint256 nftId)
        external
        view
        returns (
            uint256,
            string memory,
            string memory,
            uint256,
            bool,
            uint256
        );

    function nftOwners(uint256 nftId) external view returns (address);

    function mint(
        address _from,
        string memory _name,
        string memory _uri
    ) external;

    function burnNFT(uint256 _nftId) external;

    function transferNFT(address _to, uint256 _nftId) external;

    function getNFTLevelById(uint256 _nftId) external returns (uint256);

    function getNFTById(uint256 _nftId)
        external
        returns (
            uint256,
            string memory,
            string memory,
            uint256
        );

    function setNFTLevelUp(uint256 _nftId) external;

    function setNFTURI(uint256 _nftId, string memory _uri) external;

    function ownerOf(uint256 _nftId) external returns (address);

    function balanceOf(address _from) external returns (uint256);
}

File 8 of 8 : PrivateBattle.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./INFTContract.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@chainlink/contracts/src/v0.8/dev/VRFConsumerBase.sol";

contract PrivateBattle is VRFConsumerBase, Ownable {
    enum STATUS {
        READY,
        END
    }

    struct Battle {
        uint256 id;
        address owner;
        uint256 startTime;
        uint256 endTime;
        uint256 fee;
        uint256 entryLimit;
        uint256 level;
        uint256 balance;
        STATUS status;
        bool claimedAward;
    }

    struct Participant {
        uint256 nftId;
        address nftOwner;
    }

    struct Winner {
        uint256 nftId;
        address nftOwner;
        bool claimedAward;
    }

    // Chainlink RNG
    bytes32 internal keyHash;
    uint256 internal fee;
    mapping(bytes32 => uint256) public requestedBattles;

    Battle[] public battles;
    uint256 public battlesCount;
    uint256 public battleTime;

    // battleId => Participant[]
    mapping(uint256 => Participant[]) public participants;
    mapping(uint256 => uint256) public participantsCount;
    mapping(uint256 => Winner) public winners;

    uint256 public requiredGfxAmount;

    uint256 public serviceFee;
    uint256 public creatorFee;

    IERC20 internal gfx_;
    INFTContract internal nft_;

    event NewBattle(
        uint256 battleId,
        uint256 startTime,
        uint256 endTime,
        uint256 fee,
        uint256 entryLimit,
        uint256 level
    );

    event NewParticipantJoined(
        uint256 battleId,
        uint256 battleBalance,
        uint256 nftId,
        address nftOwner
    );

    event BattleEnded(uint256 battleId);

    event ChainlinkRequest(uint256 battleId, bytes32 requestId);

    event ChainlinkResponse(
        uint256 battleId,
        bytes32 requestId,
        uint256 randomNumber
    );

    event NewWinner(uint256 battleId, uint256 nftId, address nftOwner);

    event ClaimedAward(
        uint256 battleId,
        uint256 nftId,
        address nftOwner,
        uint256 amount
    );

    event ClaimedFee(uint256 battleId, address nftOwner, uint256 amount);

    event WithdrawBalance(address target, address token, uint256 amount);

    /**
     * BattleContract constructor
     * @param _vrfCoordinator address of Chainlink VRFCoordinator
     * @param _linkToken address of Chainlink Token Address
     * @param _keyHash hash
     */
    constructor(
        address _vrfCoordinator,
        address _linkToken,
        bytes32 _keyHash
    ) VRFConsumerBase(_vrfCoordinator, _linkToken) {
        keyHash = _keyHash;
        fee = 0.2 * (10**18);

        battlesCount = 0;
        battleTime = 1 minutes;

        // default service fee is 5%
        serviceFee = 5;

        // default creator fee is 5%
        creatorFee = 5;

        // required gfx amount of pool creator
        requiredGfxAmount = 100 * (10**18);
    }

    /**
     * Initialize contract addresses
     * @param _nft NFTContract address
     * @param _gfx GFXContract address
     */
    function initialize(address _nft, address _gfx) public onlyOwner {
        require(
            _nft != address(0) && _gfx != address(0),
            "PrivateBattle: Invalid address"
        );

        nft_ = INFTContract(_nft);
        gfx_ = IERC20(_gfx);
    }

    /**
     * Set Battle time
     * @param _battleTime Battle Time
     */
    function setBattleTime(uint256 _battleTime) public onlyOwner {
        battleTime = _battleTime;
    }

    /**
     * Set Service Fee
     * @param _fee Service fee
     */
    function setServiceFee(uint256 _fee) public onlyOwner {
        serviceFee = _fee;
    }

    /**
     * Set Creator Fee
     * @param _fee Creator fee
     */
    function setCreatorFee(uint256 _fee) public onlyOwner {
        creatorFee = _fee;
    }

    /**
     * Set Required GFX Amount of battle creator
     * @param _amount GFX Amount
     */
    function setRequiredGfxAmount(uint256 _amount) public onlyOwner {
        requiredGfxAmount = _amount;
    }

    modifier checkRequest() {
        require(msg.sender != address(0), "PrivateBattle: Invalid request");
        _;
    }

    modifier checkBattleId(uint256 _battleId) {
        require(_battleId < battlesCount, "PrivateBattle: Invalid battleId");
        _;
    }

    modifier checkNftOwner(uint256 _nftId) {
        require(
            nft_.ownerOf(_nftId) == msg.sender,
            "PrivateBattle: Invalid NFT owner"
        );
        _;
    }

    modifier canCreateBattle(
        uint256 _startTime,
        uint256 _fee,
        uint256 _entryLimit
    ) {
        require(
            _startTime > block.timestamp,
            "PrivateBattle: StartTime is already gone"
        );
        require(
            gfx_.balanceOf(msg.sender) >= requiredGfxAmount,
            "PrivateBattle: Not enough GFX"
        );
        require(_fee > 0, "PrivateBattle: Fee should be over than 0");
        require(
            _entryLimit > 0,
            "PrivateBattle: Entry Limit should be over than 0"
        );
        _;
    }

    modifier canParticipate(uint256 _battleId) {
        require(
            participantsCount[_battleId] <= battles[_battleId].entryLimit,
            "PrivateBattle: Pool is full"
        );

        require(
            gfx_.balanceOf(msg.sender) >= battles[_battleId].fee,
            "PrivateBattle: Not enough GFX"
        );

        require(
            gfx_.allowance(msg.sender, address(this)) >= battles[_battleId].fee,
            "PrivateBattle: Not enough allowance"
        );

        require(
            battles[_battleId].startTime > block.timestamp,
            "PrivateBattle: Battle started"
        );

        for (uint256 i = 0; i < participants[_battleId].length; i++) {
            require(
                participants[_battleId][i].nftOwner != msg.sender,
                "PrivateBattle: Already participated"
            );
        }
        _;
    }

    modifier canEndBattle(uint256 _battleId) {
        require(
            battles[_battleId].endTime >= block.timestamp,
            "PrivateBattle: Battle is going"
        );
        _;
    }

    function _generateRandomNumber(uint256 _battleId) private {
        require(keyHash != bytes32(0), "Must have valid key hash");
        require(
            LINK.balanceOf(address(this)) >= fee,
            "Not enough LINK - fill contract with faucet"
        );

        uint256 seed = uint256(
            keccak256(
                abi.encodePacked(block.difficulty, block.timestamp, msg.sender)
            )
        );

        bytes32 requestId = requestRandomness(keyHash, fee, seed);

        requestedBattles[requestId] = _battleId;

        emit ChainlinkRequest(_battleId, requestId);
    }

    function _generateAmount(uint256 _balance, uint256 _fee)
        private
        pure
        returns (uint256)
    {
        return (_balance * _fee) / 100;
    }

    function fulfillRandomness(bytes32 _requestId, uint256 _randomness)
        internal
        override
    {
        uint256 battleId = requestedBattles[_requestId];
        uint256 winnerIndex = _randomness % participantsCount[battleId];

        Winner memory winner;
        winner.nftId = participants[battleId][winnerIndex].nftId;
        winner.nftOwner = participants[battleId][winnerIndex].nftOwner;
        winner.claimedAward = false;

        emit ChainlinkResponse(battleId, _requestId, _randomness);
        emit NewWinner(battleId, winner.nftId, winner.nftOwner);
    }

    /**
     * Create Battle
     * @param _startTime Battle start time
     * @param _fee Battle joining fee
     * @param _entryLimit Battle entry limit
     * @return uint256 Battle Id
     */
    function createBattle(
        uint256 _startTime,
        uint256 _fee,
        uint256 _entryLimit,
        uint256
    )
        public
        checkRequest
        canCreateBattle(_startTime, _fee, _entryLimit)
        returns (uint256)
    {
        Battle memory battle;
        battle.id = battlesCount;
        battle.owner = msg.sender;
        battle.startTime = _startTime;
        battle.endTime = _startTime + battleTime;
        battle.status = STATUS.READY;
        battle.fee = _fee;
        battle.entryLimit = _entryLimit;
        battle.balance = 0;
        battle.claimedAward = false;
        // ATM user can create only level 1 nft battle
        battle.level = 1;

        battles.push(battle);
        battlesCount++;

        participantsCount[battle.id] = 0;

        emit NewBattle(
            battle.id,
            battle.startTime,
            battle.endTime,
            battle.fee,
            battle.entryLimit,
            battle.level
        );

        return battle.id;
    }

    function endBattle(uint256 _battleId)
        public
        checkBattleId(_battleId)
        canEndBattle(_battleId)
    {
        battles[_battleId].status = STATUS.END;

        if (participantsCount[_battleId] > 0) {
            _generateRandomNumber(_battleId);
        }

        emit BattleEnded(_battleId);
    }

    /**
     * Participate Battle
     * @param _battleId Battle Id
     * @param _nftId NFT id
     */
    function participateBattle(uint256 _battleId, uint256 _nftId)
        public
        checkRequest
        checkBattleId(_battleId)
        checkNftOwner(_nftId)
        canParticipate(_battleId)
    {
        nft_.transferNFT(address(this), _nftId);
        require(
            gfx_.transferFrom(msg.sender, address(this), battles[_battleId].fee)
        );

        battles[_battleId].balance += battles[_battleId].fee;

        Participant memory participant;
        participant.nftId = _nftId;
        participant.nftOwner = msg.sender;

        participants[_battleId].push(participant);
        participantsCount[_battleId]++;

        emit NewParticipantJoined(
            _battleId,
            battles[_battleId].balance,
            _nftId,
            msg.sender
        );
    }

    function claimAward(uint256 _battleId)
        public
        checkRequest
        checkBattleId(_battleId)
    {
        require(
            battles[_battleId].status == STATUS.END,
            "PrivateBattle: Battle is going"
        );

        require(
            (winners[_battleId].nftOwner == msg.sender &&
                !winners[_battleId].claimedAward) ||
                (battles[_battleId].owner == msg.sender &&
                    !battles[_battleId].claimedAward),
            "PrivateBattle: Loser can't claim"
        );

        uint256 amount = 0;
        if (winners[_battleId].nftOwner == msg.sender) {
            amount += _generateAmount(
                battles[_battleId].balance,
                (100 - creatorFee - serviceFee)
            );

            nft_.setNFTLevelUp(winners[_battleId].nftId);
            nft_.transferNFT(msg.sender, winners[_battleId].nftId);
        }

        if (battles[_battleId].owner == msg.sender) {
            amount += _generateAmount(battles[_battleId].balance, creatorFee);
        }

        require(
            gfx_.transfer(msg.sender, amount),
            "PrivateBattle: GFX transaction failed"
        );

        if (winners[_battleId].nftOwner == msg.sender) {
            winners[_battleId].claimedAward = true;

            emit ClaimedAward(
                _battleId,
                winners[_battleId].nftId,
                msg.sender,
                amount
            );
        }

        if (battles[_battleId].owner == msg.sender) {
            battles[_battleId].claimedAward = true;

            emit ClaimedFee(
                _battleId,
                msg.sender,
                _generateAmount(battles[_battleId].balance, creatorFee)
            );
        }
    }

    /**
     * Withdraw Balance from Contract
     * @param _target Target address
     * @param _token ERC20 token address
     * @param _amount Transfering amount
     */
    function withdrawBalance(
        address _target,
        address _token,
        uint256 _amount
    ) external onlyOwner {
        require(_target != address(0), "Invalid Target Address");
        require(_token != address(0), "Invalid Token Address");
        require(_amount > 0, "Amount should be bigger than zero");

        IERC20 token = IERC20(_token);
        require(token.transfer(_target, _amount), "Withdraw failed");

        emit WithdrawBalance(_target, _token, _amount);
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "evmVersion": "berlin",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_vrfCoordinator","type":"address"},{"internalType":"address","name":"_linkToken","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"battleId","type":"uint256"}],"name":"BattleEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"battleId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"ChainlinkRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"battleId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"randomNumber","type":"uint256"}],"name":"ChainlinkResponse","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"battleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimedAward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"battleId","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimedFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"battleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"entryLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"level","type":"uint256"}],"name":"NewBattle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"battleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"battleBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftOwner","type":"address"}],"name":"NewParticipantJoined","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"battleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftOwner","type":"address"}],"name":"NewWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawBalance","type":"event"},{"inputs":[],"name":"battleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"battles","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"entryLimit","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"enum PrivateBattle.STATUS","name":"status","type":"uint8"},{"internalType":"bool","name":"claimedAward","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"battlesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_battleId","type":"uint256"}],"name":"claimAward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_entryLimit","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"createBattle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creatorFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_battleId","type":"uint256"}],"name":"endBattle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"address","name":"_gfx","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"participants","outputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"address","name":"nftOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"participantsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_battleId","type":"uint256"},{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"participateBattle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"requestedBattles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requiredGfxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serviceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_battleTime","type":"uint256"}],"name":"setBattleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setCreatorFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setRequiredGfxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setServiceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"winners","outputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"address","name":"nftOwner","type":"address"},{"internalType":"bool","name":"claimedAward","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b5060405162004930380380620049308339818101604052810190620000379190620001df565b82828173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050506000620000bb620001a960201b60201c565b905080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350806002819055506702c68af0bb1400006003819055506000600681905550603c6007819055506005600c819055506005600d8190555068056bc75e2d63100000600b81905550505050620002b2565b600033905090565b600081519050620001c2816200027e565b92915050565b600081519050620001d98162000298565b92915050565b600080600060608486031215620001fb57620001fa62000279565b5b60006200020b86828701620001b1565b93505060206200021e86828701620001b1565b92505060406200023186828701620001c8565b9150509250925092565b6000620002488262000259565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b62000289816200023b565b81146200029557600080fd5b50565b620002a3816200024f565b8114620002af57600080fd5b50565b60805160601c60a05160601c614644620002ec6000396000818161255c0152612be00152600081816128760152612ba401526146446000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80635cdf76f8116100c35780638abdf5aa1161007c5780638abdf5aa146103b75780638da5cb5b146103d557806394985ddd146103f3578063a2fb11751461040f578063e88958dc14610441578063f2fde38b1461045f57610158565b80635cdf76f8146102d9578063606d2e96146102f55780636698b89e1461032e578063715018a61461035e57806376cc5d291461036857806381fb1fb41461038657610158565b80633203497e116101155780633203497e1461021d5780634157e6ef1461023957806345d9a1ce1461025557806346f061b514610271578063485cc9551461028d5780634d6aa263146102a957610158565b8063021950841461015d57806308254f51146101795780630dd16fd5146101955780630ef2e857146101b157806311c9080d146101e1578063168ad76e146101ff575b600080fd5b61017760048036038101906101729190613058565b61047b565b005b610193600480360381019061018e9190613058565b610501565b005b6101af60048036038101906101aa9190613058565b610d9d565b005b6101cb60048036038101906101c69190613058565b610e23565b6040516101d89190613a23565b60405180910390f35b6101e9610e3b565b6040516101f69190613a23565b60405180910390f35b610207610e41565b6040516102149190613a23565b60405180910390f35b61023760048036038101906102329190613058565b610e47565b005b610253600480360381019061024e9190613058565b610ecd565b005b61026f600480360381019061026a9190612f6b565b61102b565b005b61028b600480360381019061028691906130b2565b6112dc565b005b6102a760048036038101906102a29190612f2b565b611beb565b005b6102c360048036038101906102be91906130f2565b611d96565b6040516102d09190613a23565b60405180910390f35b6102f360048036038101906102ee9190613058565b61224a565b005b61030f600480360381019061030a9190613058565b6122d0565b6040516103259a99989796959493929190613ad5565b60405180910390f35b61034860048036038101906103439190612feb565b61236e565b6040516103559190613a23565b60405180910390f35b610366612386565b005b6103706124c3565b60405161037d9190613a23565b60405180910390f35b6103a0600480360381019061039b91906130b2565b6124c9565b6040516103ae929190613a3e565b60405180910390f35b6103bf61252a565b6040516103cc9190613a23565b60405180910390f35b6103dd612530565b6040516103ea91906135d3565b60405180910390f35b61040d60048036038101906104089190613018565b61255a565b005b61042960048036038101906104249190613058565b6125f6565b60405161043893929190613a67565b60405180910390f35b61044961264d565b6040516104569190613a23565b60405180910390f35b61047960048036038101906104749190612ed1565b612653565b005b6104836127ff565b73ffffffffffffffffffffffffffffffffffffffff166104a1612530565b73ffffffffffffffffffffffffffffffffffffffff16146104f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ee90613943565b60405180910390fd5b80600b8190555050565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610571576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610568906139e3565b60405180910390fd5b8060065481106105b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ad90613923565b60405180910390fd5b6001808111156105c9576105c8613fef565b5b600583815481106105dd576105dc61401e565b5b906000526020600020906009020160080160009054906101000a900460ff16600181111561060e5761060d613fef565b5b1461064e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064590613823565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600a600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156106e05750600a600083815260200190815260200160002060010160149054906101000a900460ff16155b8061079757503373ffffffffffffffffffffffffffffffffffffffff16600583815481106107115761071061401e565b5b906000526020600020906009020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156107965750600582815481106107755761077461401e565b5b906000526020600020906009020160080160019054906101000a900460ff16155b5b6107d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cd906138a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600a600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156109e25761088c600584815481106108595761085861401e565b5b906000526020600020906009020160070154600c54600d54606461087d9190613e01565b6108879190613e01565b612807565b816108979190613d20565b9050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a27fd447600a6000868152602001908152602001600020600001546040518263ffffffff1660e01b815260040161090a9190613a23565b600060405180830381600087803b15801561092457600080fd5b505af1158015610938573d6000803e3d6000fd5b50505050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394ab67fe33600a6000878152602001908152602001600020600001546040518363ffffffff1660e01b81526004016109af92919061364e565b600060405180830381600087803b1580156109c957600080fd5b505af11580156109dd573d6000803e3d6000fd5b505050505b3373ffffffffffffffffffffffffffffffffffffffff1660058481548110610a0d57610a0c61401e565b5b906000526020600020906009020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a9a57610a8c60058481548110610a7257610a7161401e565b5b906000526020600020906009020160070154600d54612807565b81610a979190613d20565b90505b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610af792919061364e565b602060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b499190612fbe565b610b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f90613783565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600a600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c75576001600a600085815260200190815260200160002060010160146101000a81548160ff0219169083151502179055507f03def5dc772cb62e1a04e644e9f9c1e34ef745fc4d06479a9ea73ed8c4eacf6c83600a6000868152602001908152602001600020600001543384604051610c6c9493929190613c08565b60405180910390a15b3373ffffffffffffffffffffffffffffffffffffffff1660058481548110610ca057610c9f61401e565b5b906000526020600020906009020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610d9857600160058481548110610d0457610d0361401e565b5b906000526020600020906009020160080160016101000a81548160ff0219169083151502179055507fb2e75ae0d894593117fa7e7519801c654b0d494c63a832874f52146ee4cb0d3e8333610d8060058781548110610d6657610d6561401e565b5b906000526020600020906009020160070154600d54612807565b604051610d8f93929190613a9e565b60405180910390a15b505050565b610da56127ff565b73ffffffffffffffffffffffffffffffffffffffff16610dc3612530565b73ffffffffffffffffffffffffffffffffffffffff1614610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1090613943565b60405180910390fd5b80600d8190555050565b60096020528060005260406000206000915090505481565b60065481565b60075481565b610e4f6127ff565b73ffffffffffffffffffffffffffffffffffffffff16610e6d612530565b73ffffffffffffffffffffffffffffffffffffffff1614610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90613943565b60405180910390fd5b8060078190555050565b806006548110610f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0990613923565b60405180910390fd5b814260058281548110610f2857610f2761401e565b5b9060005260206000209060090201600301541015610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290613823565b60405180910390fd5b600160058481548110610f9157610f9061401e565b5b906000526020600020906009020160080160006101000a81548160ff02191690836001811115610fc457610fc3613fef565b5b0217905550600060096000858152602001908152602001600020541115610fef57610fee83612829565b5b7f6e89b8a2a3c481f57d678455f59f42429cb60be86708621a7d8a371ca5da3a048360405161101e9190613a23565b60405180910390a1505050565b6110336127ff565b73ffffffffffffffffffffffffffffffffffffffff16611051612530565b73ffffffffffffffffffffffffffffffffffffffff16146110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e90613943565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90613983565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90613903565b60405180910390fd5b600081116111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c1906139a3565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b815260040161120a92919061364e565b602060405180830381600087803b15801561122457600080fd5b505af1158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c9190612fbe565b61129b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611292906137c3565b60405180910390fd5b7f969daa955308836e9a3a6dc39b0a63e26ebda1bd655c878347304f2c22a7070a8484846040516112ce93929190613617565b60405180910390a150505050565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561134c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611343906139e3565b60405180910390fd5b816006548110611391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138890613923565b60405180910390fd5b813373ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016114049190613a23565b602060405180830381600087803b15801561141e57600080fd5b505af1158015611432573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114569190612efe565b73ffffffffffffffffffffffffffffffffffffffff16146114ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a3906137e3565b60405180910390fd5b83600581815481106114c1576114c061401e565b5b90600052602060002090600902016005015460096000838152602001908152602001600020541115611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f90613883565b60405180910390fd5b6005818154811061153c5761153b61401e565b5b906000526020600020906009020160040154600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016115a991906135d3565b60206040518083038186803b1580156115c157600080fd5b505afa1580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f99190613085565b101561163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190613723565b60405180910390fd5b6005818154811061164e5761164d61401e565b5b906000526020600020906009020160040154600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016116bd9291906135ee565b60206040518083038186803b1580156116d557600080fd5b505afa1580156116e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170d9190613085565b101561174e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611745906138e3565b60405180910390fd5b42600582815481106117635761176261401e565b5b906000526020600020906009020160020154116117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac906139c3565b60405180910390fd5b60005b60086000838152602001908152602001600020805490508110156118ae573373ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002082815481106118125761181161401e565b5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561189b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611892906138c3565b60405180910390fd5b80806118a690613edf565b9150506117b8565b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394ab67fe30866040518363ffffffff1660e01b815260040161190c92919061364e565b600060405180830381600087803b15801561192657600080fd5b505af115801561193a573d6000803e3d6000fd5b50505050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600589815481106119925761199161401e565b5b9060005260206000209060090201600401546040518463ffffffff1660e01b81526004016119c293929190613617565b602060405180830381600087803b1580156119dc57600080fd5b505af11580156119f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a149190612fbe565b611a1d57600080fd5b60058581548110611a3157611a3061401e565b5b90600052602060002090600902016004015460058681548110611a5757611a5661401e565b5b90600052602060002090600902016007016000828254611a779190613d20565b92505081905550611a86612d6d565b8481600001818152505033816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600860008781526020019081526020016000208190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050600960008781526020019081526020016000206000815480929190611b7c90613edf565b91905055507f2c967a82a440c8c007df1a6dbc91a54bdc3ada2bda20c027b5b94969ccb9782a8660058881548110611bb757611bb661401e565b5b9060005260206000209060090201600701548733604051611bdb9493929190613c4d565b60405180910390a1505050505050565b611bf36127ff565b73ffffffffffffffffffffffffffffffffffffffff16611c11612530565b73ffffffffffffffffffffffffffffffffffffffff1614611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90613943565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611cd15750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790613743565b60405180910390fd5b81600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfe906139e3565b60405180910390fd5b848484428311611e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4390613863565b60405180910390fd5b600b54600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611eaa91906135d3565b60206040518083038186803b158015611ec257600080fd5b505afa158015611ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efa9190613085565b1015611f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3290613723565b60405180910390fd5b60008211611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590613763565b60405180910390fd5b60008111611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb890613a03565b60405180910390fd5b611fc9612d9d565b60065481600001818152505033816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505088816040018181525050600754896120259190613d20565b8160600181815250506000816101000190600181111561204857612047613fef565b5b9081600181111561205c5761205b613fef565b5b8152505087816080018181525050868160a001818152505060008160e001818152505060008161012001901515908115158152505060018160c001818152505060058190806001815401808255809150506001900390600052602060002090600902016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a81548160ff0219169083600181111561218157612180613fef565b5b02179055506101208201518160080160016101000a81548160ff0219169083151502179055505050600660008154809291906121bc90613edf565b919050555060006009600083600001518152602001908152602001600020819055507f894d864be414517521962212c9c720f1c18ba95c3684f980b173b3db81abbe2d81600001518260400151836060015184608001518560a001518660c0015160405161222f96959493929190613c92565b60405180910390a18060000151945050505050949350505050565b6122526127ff565b73ffffffffffffffffffffffffffffffffffffffff16612270612530565b73ffffffffffffffffffffffffffffffffffffffff16146122c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bd90613943565b60405180910390fd5b80600c8190555050565b600581815481106122e057600080fd5b90600052602060002090600902016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060154908060070154908060080160009054906101000a900460ff16908060080160019054906101000a900460ff1690508a565b60046020528060005260406000206000915090505481565b61238e6127ff565b73ffffffffffffffffffffffffffffffffffffffff166123ac612530565b73ffffffffffffffffffffffffffffffffffffffff1614612402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f990613943565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b5481565b600860205281600052604060002081815481106124e557600080fd5b9060005260206000209060020201600091509150508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b600c5481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125df90613963565b60405180910390fd5b6125f282826129f9565b5050565b600a6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160149054906101000a900460ff16905083565b600d5481565b61265b6127ff565b73ffffffffffffffffffffffffffffffffffffffff16612679612530565b73ffffffffffffffffffffffffffffffffffffffff16146126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690613943565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561273f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612736906137a3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000606482846128179190613da7565b6128219190613d76565b905092915050565b6000801b6002541415612871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286890613843565b60405180910390fd5b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016128cd91906135d3565b60206040518083038186803b1580156128e557600080fd5b505afa1580156128f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291d9190613085565b101561295e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295590613803565b60405180910390fd5b600044423360405160200161297593929190613596565b6040516020818303038152906040528051906020012060001c905060006129a160025460035484612ba0565b90508260046000838152602001908152602001600020819055507fd75fd88a91c4cd12f423eed28c58bf37c258c01add88afd37e3617d9a14f701483826040516129ec929190613b71565b60405180910390a1505050565b6000600460008481526020019081526020016000205490506000600960008381526020019081526020016000205483612a329190613f60565b9050612a3c612e1a565b600860008481526020019081526020016000208281548110612a6157612a6061401e565b5b906000526020600020906002020160000154816000018181525050600860008481526020019081526020016000208281548110612aa157612aa061401e565b5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008160400190151590811515815250507f989becfe8a4a2165fbdd2aec5d1ffd184fb0df43aa223bfedd996b30fd10fee1838686604051612b4e93929190613b9a565b60405180910390a17f0bca21133cc65a2ac31f187f737199c5105afe8265eb1e603f7c0061e05e7ee88382600001518360200151604051612b9193929190613bd1565b60405180910390a15050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f0000000000000000000000000000000000000000000000000000000000000000858786604051602001612c139291906136b5565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612c4093929190613677565b602060405180830381600087803b158015612c5a57600080fd5b505af1158015612c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c929190612fbe565b506000612cb38584306000808a815260200190815260200160002054612cfe565b9050600160008087815260200190815260200160002054612cd49190613d20565b60008087815260200190815260200160002081905550612cf48582612d3a565b9150509392505050565b600084848484604051602001612d1794939291906136de565b6040516020818303038152906040528051906020012060001c9050949350505050565b60008282604051602001612d4f92919061356a565b60405160208183030381529060405280519060200120905092915050565b604051806040016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b60405180610140016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001811115612e0b57612e0a613fef565b5b81526020016000151581525090565b604051806060016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b600081359050612e62816145b2565b92915050565b600081519050612e77816145b2565b92915050565b600081519050612e8c816145c9565b92915050565b600081359050612ea1816145e0565b92915050565b600081359050612eb6816145f7565b92915050565b600081519050612ecb816145f7565b92915050565b600060208284031215612ee757612ee661404d565b5b6000612ef584828501612e53565b91505092915050565b600060208284031215612f1457612f1361404d565b5b6000612f2284828501612e68565b91505092915050565b60008060408385031215612f4257612f4161404d565b5b6000612f5085828601612e53565b9250506020612f6185828601612e53565b9150509250929050565b600080600060608486031215612f8457612f8361404d565b5b6000612f9286828701612e53565b9350506020612fa386828701612e53565b9250506040612fb486828701612ea7565b9150509250925092565b600060208284031215612fd457612fd361404d565b5b6000612fe284828501612e7d565b91505092915050565b6000602082840312156130015761300061404d565b5b600061300f84828501612e92565b91505092915050565b6000806040838503121561302f5761302e61404d565b5b600061303d85828601612e92565b925050602061304e85828601612ea7565b9150509250929050565b60006020828403121561306e5761306d61404d565b5b600061307c84828501612ea7565b91505092915050565b60006020828403121561309b5761309a61404d565b5b60006130a984828501612ebc565b91505092915050565b600080604083850312156130c9576130c861404d565b5b60006130d785828601612ea7565b92505060206130e885828601612ea7565b9150509250929050565b6000806000806080858703121561310c5761310b61404d565b5b600061311a87828801612ea7565b945050602061312b87828801612ea7565b935050604061313c87828801612ea7565b925050606061314d87828801612ea7565b91505092959194509250565b61316281613e35565b82525050565b61317961317482613e35565b613f28565b82525050565b61318881613e47565b82525050565b61319781613e53565b82525050565b6131ae6131a982613e53565b613f3a565b82525050565b60006131bf82613cf3565b6131c98185613cfe565b93506131d9818560208601613eac565b6131e281614052565b840191505092915050565b6131f681613e9a565b82525050565b6000613209601d83613d0f565b915061321482614070565b602082019050919050565b600061322c601e83613d0f565b915061323782614099565b602082019050919050565b600061324f602883613d0f565b915061325a826140c2565b604082019050919050565b6000613272602583613d0f565b915061327d82614111565b604082019050919050565b6000613295602683613d0f565b91506132a082614160565b604082019050919050565b60006132b8600f83613d0f565b91506132c3826141af565b602082019050919050565b60006132db602083613d0f565b91506132e6826141d8565b602082019050919050565b60006132fe602b83613d0f565b915061330982614201565b604082019050919050565b6000613321601e83613d0f565b915061332c82614250565b602082019050919050565b6000613344601883613d0f565b915061334f82614279565b602082019050919050565b6000613367602883613d0f565b9150613372826142a2565b604082019050919050565b600061338a601b83613d0f565b9150613395826142f1565b602082019050919050565b60006133ad602083613d0f565b91506133b88261431a565b602082019050919050565b60006133d0602383613d0f565b91506133db82614343565b604082019050919050565b60006133f3602383613d0f565b91506133fe82614392565b604082019050919050565b6000613416601583613d0f565b9150613421826143e1565b602082019050919050565b6000613439601f83613d0f565b91506134448261440a565b602082019050919050565b600061345c602083613d0f565b915061346782614433565b602082019050919050565b600061347f601f83613d0f565b915061348a8261445c565b602082019050919050565b60006134a2601683613d0f565b91506134ad82614485565b602082019050919050565b60006134c5602183613d0f565b91506134d0826144ae565b604082019050919050565b60006134e8601d83613d0f565b91506134f3826144fd565b602082019050919050565b600061350b601e83613d0f565b915061351682614526565b602082019050919050565b600061352e603083613d0f565b91506135398261454f565b604082019050919050565b61354d81613e90565b82525050565b61356461355f82613e90565b613f56565b82525050565b6000613576828561319d565b6020820191506135868284613553565b6020820191508190509392505050565b60006135a28286613553565b6020820191506135b28285613553565b6020820191506135c28284613168565b601482019150819050949350505050565b60006020820190506135e86000830184613159565b92915050565b60006040820190506136036000830185613159565b6136106020830184613159565b9392505050565b600060608201905061362c6000830186613159565b6136396020830185613159565b6136466040830184613544565b949350505050565b60006040820190506136636000830185613159565b6136706020830184613544565b9392505050565b600060608201905061368c6000830186613159565b6136996020830185613544565b81810360408301526136ab81846131b4565b9050949350505050565b60006040820190506136ca600083018561318e565b6136d76020830184613544565b9392505050565b60006080820190506136f3600083018761318e565b6137006020830186613544565b61370d6040830185613159565b61371a6060830184613544565b95945050505050565b6000602082019050818103600083015261373c816131fc565b9050919050565b6000602082019050818103600083015261375c8161321f565b9050919050565b6000602082019050818103600083015261377c81613242565b9050919050565b6000602082019050818103600083015261379c81613265565b9050919050565b600060208201905081810360008301526137bc81613288565b9050919050565b600060208201905081810360008301526137dc816132ab565b9050919050565b600060208201905081810360008301526137fc816132ce565b9050919050565b6000602082019050818103600083015261381c816132f1565b9050919050565b6000602082019050818103600083015261383c81613314565b9050919050565b6000602082019050818103600083015261385c81613337565b9050919050565b6000602082019050818103600083015261387c8161335a565b9050919050565b6000602082019050818103600083015261389c8161337d565b9050919050565b600060208201905081810360008301526138bc816133a0565b9050919050565b600060208201905081810360008301526138dc816133c3565b9050919050565b600060208201905081810360008301526138fc816133e6565b9050919050565b6000602082019050818103600083015261391c81613409565b9050919050565b6000602082019050818103600083015261393c8161342c565b9050919050565b6000602082019050818103600083015261395c8161344f565b9050919050565b6000602082019050818103600083015261397c81613472565b9050919050565b6000602082019050818103600083015261399c81613495565b9050919050565b600060208201905081810360008301526139bc816134b8565b9050919050565b600060208201905081810360008301526139dc816134db565b9050919050565b600060208201905081810360008301526139fc816134fe565b9050919050565b60006020820190508181036000830152613a1c81613521565b9050919050565b6000602082019050613a386000830184613544565b92915050565b6000604082019050613a536000830185613544565b613a606020830184613159565b9392505050565b6000606082019050613a7c6000830186613544565b613a896020830185613159565b613a96604083018461317f565b949350505050565b6000606082019050613ab36000830186613544565b613ac06020830185613159565b613acd6040830184613544565b949350505050565b600061014082019050613aeb600083018d613544565b613af8602083018c613159565b613b05604083018b613544565b613b12606083018a613544565b613b1f6080830189613544565b613b2c60a0830188613544565b613b3960c0830187613544565b613b4660e0830186613544565b613b546101008301856131ed565b613b6261012083018461317f565b9b9a5050505050505050505050565b6000604082019050613b866000830185613544565b613b93602083018461318e565b9392505050565b6000606082019050613baf6000830186613544565b613bbc602083018561318e565b613bc96040830184613544565b949350505050565b6000606082019050613be66000830186613544565b613bf36020830185613544565b613c006040830184613159565b949350505050565b6000608082019050613c1d6000830187613544565b613c2a6020830186613544565b613c376040830185613159565b613c446060830184613544565b95945050505050565b6000608082019050613c626000830187613544565b613c6f6020830186613544565b613c7c6040830185613544565b613c896060830184613159565b95945050505050565b600060c082019050613ca76000830189613544565b613cb46020830188613544565b613cc16040830187613544565b613cce6060830186613544565b613cdb6080830185613544565b613ce860a0830184613544565b979650505050505050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613d2b82613e90565b9150613d3683613e90565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d6b57613d6a613f91565b5b828201905092915050565b6000613d8182613e90565b9150613d8c83613e90565b925082613d9c57613d9b613fc0565b5b828204905092915050565b6000613db282613e90565b9150613dbd83613e90565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613df657613df5613f91565b5b828202905092915050565b6000613e0c82613e90565b9150613e1783613e90565b925082821015613e2a57613e29613f91565b5b828203905092915050565b6000613e4082613e70565b9050919050565b60008115159050919050565b6000819050919050565b6000819050613e6b8261459e565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613ea582613e5d565b9050919050565b60005b83811015613eca578082015181840152602081019050613eaf565b83811115613ed9576000848401525b50505050565b6000613eea82613e90565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f1d57613f1c613f91565b5b600182019050919050565b6000613f3382613f44565b9050919050565b6000819050919050565b6000613f4f82614063565b9050919050565b6000819050919050565b6000613f6b82613e90565b9150613f7683613e90565b925082613f8657613f85613fc0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f50726976617465426174746c653a204e6f7420656e6f75676820474658000000600082015250565b7f50726976617465426174746c653a20496e76616c696420616464726573730000600082015250565b7f50726976617465426174746c653a204665652073686f756c64206265206f766560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f50726976617465426174746c653a20474658207472616e73616374696f6e206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b7f50726976617465426174746c653a20496e76616c6964204e4654206f776e6572600082015250565b7f4e6f7420656e6f756768204c494e4b202d2066696c6c20636f6e74726163742060008201527f7769746820666175636574000000000000000000000000000000000000000000602082015250565b7f50726976617465426174746c653a20426174746c6520697320676f696e670000600082015250565b7f4d75737420686176652076616c6964206b657920686173680000000000000000600082015250565b7f50726976617465426174746c653a20537461727454696d6520697320616c726560008201527f61647920676f6e65000000000000000000000000000000000000000000000000602082015250565b7f50726976617465426174746c653a20506f6f6c2069732066756c6c0000000000600082015250565b7f50726976617465426174746c653a204c6f7365722063616e277420636c61696d600082015250565b7f50726976617465426174746c653a20416c72656164792070617274696369706160008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b7f50726976617465426174746c653a204e6f7420656e6f75676820616c6c6f776160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420546f6b656e20416464726573730000000000000000000000600082015250565b7f50726976617465426174746c653a20496e76616c696420626174746c65496400600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b7f496e76616c696420546172676574204164647265737300000000000000000000600082015250565b7f416d6f756e742073686f756c6420626520626967676572207468616e207a657260008201527f6f00000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726976617465426174746c653a20426174746c652073746172746564000000600082015250565b7f50726976617465426174746c653a20496e76616c696420726571756573740000600082015250565b7f50726976617465426174746c653a20456e747279204c696d69742073686f756c60008201527f64206265206f766572207468616e203000000000000000000000000000000000602082015250565b600281106145af576145ae613fef565b5b50565b6145bb81613e35565b81146145c657600080fd5b50565b6145d281613e47565b81146145dd57600080fd5b50565b6145e981613e53565b81146145f457600080fd5b50565b61460081613e90565b811461460b57600080fd5b5056fea264697066735822122067668525e0c9117bbd11ac82104b7cb286344b9090eb21d0a7f7df9117ffb93d64736f6c63430008060033000000000000000000000000a555fc018435bef5a13c6c6870a9d4c11dec329c00000000000000000000000084b9b910527ad5c03a9ca831909e21e236ea7b06caf3c3727e033261d383b315559476f48034c13b18f8cafed4d871abe5049186

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

000000000000000000000000a555fc018435bef5a13c6c6870a9d4c11dec329c00000000000000000000000084b9b910527ad5c03a9ca831909e21e236ea7b06caf3c3727e033261d383b315559476f48034c13b18f8cafed4d871abe5049186
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000a555fc018435bef5a13c6c6870a9d4c11dec329c
Arg [1] : 00000000000000000000000084b9b910527ad5c03a9ca831909e21e236ea7b06
Arg [2] : caf3c3727e033261d383b315559476f48034c13b18f8cafed4d871abe5049186


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading