ETH Price: $3,180.63 (+1.47%)
Gas: 17 Gwei

Contract

0xF9439027c8A21E1375CCDFf31c46ca21f8603305
 

Overview

ETH Balance

0.2782 ETH

Eth Value

$884.85 (@ $3,180.63/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Cancel Subscript...174662232023-06-12 20:04:59397 days ago1686600299IN
0xF9439027...1f8603305
0 ETH0.0034031118.47912513
Add Consumer159990552022-11-18 19:42:11603 days ago1668800531IN
0xF9439027...1f8603305
0 ETH0.0010450212.24137658
Set Game Contrac...159660592022-11-14 5:02:59607 days ago1668402179IN
0xF9439027...1f8603305
0 ETH0.0002916111.92019213
Set Game Contrac...159660572022-11-14 5:02:35607 days ago1668402155IN
0xF9439027...1f8603305
0 ETH0.0005808312.52445235
Set Game Contrac...159660552022-11-14 5:02:11607 days ago1668402131IN
0xF9439027...1f8603305
0 ETH0.0003267612.34174348
Set Game Contrac...158995552022-11-04 22:11:35617 days ago1667599895IN
0xF9439027...1f8603305
0 ETH0.000591212.74812215
Set Game Contrac...158987282022-11-04 19:25:23617 days ago1667589923IN
0xF9439027...1f8603305
0 ETH0.0009378920.22370469
Add Consumer158942002022-11-04 4:16:11617 days ago1667535371IN
0xF9439027...1f8603305
0 ETH0.0014017316.41992131
Remove Consumer158941912022-11-04 4:14:23617 days ago1667535263IN
0xF9439027...1f8603305
0 ETH0.000900218.07639223
Add Consumer158941672022-11-04 4:09:35617 days ago1667534975IN
0xF9439027...1f8603305
0 ETH0.0016299419.09588156
Remove Consumer158941662022-11-04 4:09:23617 days ago1667534963IN
0xF9439027...1f8603305
0 ETH0.0009466519.00460045
Set Game Contrac...158940362022-11-04 3:42:47617 days ago1667533367IN
0xF9439027...1f8603305
0 ETH0.0007654816.50596911
Set Game Contrac...158936352022-11-04 2:21:47617 days ago1667528507IN
0xF9439027...1f8603305
0 ETH0.0006739814.53301617
Set Game Contrac...158936342022-11-04 2:21:35617 days ago1667528495IN
0xF9439027...1f8603305
0 ETH0.0006660214.36132042
Set Game Contrac...158936332022-11-04 2:21:23617 days ago1667528483IN
0xF9439027...1f8603305
0 ETH0.0006791814.64511631
Set Game Contrac...158936302022-11-04 2:20:47617 days ago1667528447IN
0xF9439027...1f8603305
0 ETH0.0006349513.69145461
Set Game Contrac...158936282022-11-04 2:20:23617 days ago1667528423IN
0xF9439027...1f8603305
0 ETH0.0006384813.76765208
Set Game Contrac...158936272022-11-04 2:20:11617 days ago1667528411IN
0xF9439027...1f8603305
0 ETH0.0005779212.4617118
Set Game Contrac...158936252022-11-04 2:19:47617 days ago1667528387IN
0xF9439027...1f8603305
0 ETH0.0006601114.23397691
Add Consumer158936192022-11-04 2:18:35617 days ago1667528315IN
0xF9439027...1f8603305
0 ETH0.0012069114.13782612
Add Consumer158260442022-10-25 15:39:23627 days ago1666712363IN
0xF9439027...1f8603305
0 ETH0.0021812625.55132619
Swap And Top Lin...156482572022-09-30 19:31:35652 days ago1664566295IN
0xF9439027...1f8603305
0 ETH0.0027059315.61922678
Set Swap Thresho...156482552022-09-30 19:31:11652 days ago1664566271IN
0xF9439027...1f8603305
0 ETH0.0004201314.64813381
Swap And Top Lin...156482462022-09-30 19:29:23652 days ago1664566163IN
0xF9439027...1f8603305
0 ETH0.0003317612.94812342
Transfer156482422022-09-30 19:28:35652 days ago1664566115IN
0xF9439027...1f8603305
1 ETH0.0003152814.97432706
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
173769552023-05-31 6:04:23409 days ago1685513063
0xF9439027...1f8603305
0.0045 ETH
173769472023-05-31 6:02:47409 days ago1685512967
0xF9439027...1f8603305
0.005 ETH
172435102023-05-12 10:22:23428 days ago1683886943
0xF9439027...1f8603305
0.0005 ETH
170782622023-04-19 4:22:35451 days ago1681878155
0xF9439027...1f8603305
0.0005 ETH
168884662023-03-23 6:28:23478 days ago1679552903
0xF9439027...1f8603305
0.0005 ETH
168796022023-03-22 0:35:47479 days ago1679445347
0xF9439027...1f8603305
0.001 ETH
168795902023-03-22 0:33:23479 days ago1679445203
0xF9439027...1f8603305
0.0005 ETH
168795882023-03-22 0:32:59479 days ago1679445179
0xF9439027...1f8603305
0.0005 ETH
168565222023-03-18 18:48:35483 days ago1679165315
0xF9439027...1f8603305
0.0005 ETH
167431752023-03-02 20:15:47499 days ago1677788147
0xF9439027...1f8603305
0.0005 ETH
167297792023-02-28 23:00:35501 days ago1677625235
0xF9439027...1f8603305
0.005 ETH
167180782023-02-27 7:34:23502 days ago1677483263
0xF9439027...1f8603305
0.0005 ETH
167179642023-02-27 7:11:35502 days ago1677481895
0xF9439027...1f8603305
0.005 ETH
167179492023-02-27 7:08:35502 days ago1677481715
0xF9439027...1f8603305
0.005 ETH
167179322023-02-27 7:05:11502 days ago1677481511
0xF9439027...1f8603305
0.005 ETH
167143472023-02-26 19:00:23503 days ago1677438023
0xF9439027...1f8603305
0.005 ETH
167093052023-02-26 2:00:35503 days ago1677376835
0xF9439027...1f8603305
0.005 ETH
166876952023-02-23 1:00:23506 days ago1677114023
0xF9439027...1f8603305
0.005 ETH
166584812023-02-18 22:28:11511 days ago1676759291
0xF9439027...1f8603305
0.0125 ETH
166574312023-02-18 18:55:47511 days ago1676746547
0xF9439027...1f8603305
0.001 ETH
166518312023-02-18 0:00:23511 days ago1676678423
0xF9439027...1f8603305
0.005 ETH
166515842023-02-17 23:09:59512 days ago1676675399
0xF9439027...1f8603305
0.0015 ETH
166316122023-02-15 3:58:47514 days ago1676433527
0xF9439027...1f8603305
0.0015 ETH
166180852023-02-13 6:35:47516 days ago1676270147
0xF9439027...1f8603305
0.001 ETH
166180762023-02-13 6:33:59516 days ago1676270039
0xF9439027...1f8603305
0.001 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Randomizer

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license
File 1 of 7 : Randomizer.sol
// SPDX-License-Identifier: MIT
// An example of a consumer contract that also owns and manages the subscription
pragma solidity ^0.8.7;
pragma abicoder v2;

import "@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol";
import "@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol";
import "@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./interfaces/IUniswapV2Router.sol";
import "./interfaces/IWETH.sol";

contract Randomizer is VRFConsumerBaseV2 {
  VRFCoordinatorV2Interface COORDINATOR;
  LinkTokenInterface LINKTOKEN;

  address vrfCoordinator = 0x271682DEB8C4E0901D1a1550aD2e64D568E69909;
  address link_token_contract = 0x514910771AF9Ca656af840dff83E8264EcF986CA;
  bytes32 keyHash = 0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef;
  uint32 callbackGasLimit = 2500000;
  uint16 requestConfirmations = 3;
  uint32 numWords =  100;

  // Storage parameters
  uint256[] private s_randomWords;
  uint256 public s_requestId;
  uint64 public s_subscriptionId;
  address s_owner;

  mapping(address => bool) gameContracts;

  uint256 wordsThreshold = 25;
  bool requestPending;
  
  address private constant UNISWAP_V2_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
  address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
  address public constant LINK = 0x514910771AF9Ca656af840dff83E8264EcF986CA;
  uint256 public swapThreshold = 10000000000000000;

  constructor() VRFConsumerBaseV2(vrfCoordinator) {
    COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator);
    LINKTOKEN = LinkTokenInterface(link_token_contract);
    s_owner = msg.sender;
    //Create a new subscription when you deploy the contract.
    createNewSubscription();
    gameContracts[address(this)] = true;
  }

  receive() external payable {}

  modifier onlyGames() {
    require(gameContracts[msg.sender], "only game contracts allowed");
    _;
  }

  // Assumes the subscription is funded sufficiently.
  function requestRandomWords() public onlyGames {
    // Will revert if subscription is not set and funded.
    s_requestId = COORDINATOR.requestRandomWords(
      keyHash,
      s_subscriptionId,
      requestConfirmations,
      callbackGasLimit,
      numWords
    );
  }

  function fulfillRandomWords(
    uint256, /* requestId */
    uint256[] memory randomWords
  ) internal override {
    s_randomWords = randomWords;
    requestPending = false;
  }

  function getRandomWords(uint256 number) external onlyGames returns (uint256[] memory ranWords) {
    ranWords = new uint256[](number);
    for (uint i = 0; i < number; i++) {
      uint256 curIndex = s_randomWords.length-1;
      ranWords[i] = s_randomWords[curIndex];
      s_randomWords.pop();
    }

    uint256 remainingWords = s_randomWords.length;
    if(remainingWords < wordsThreshold && !requestPending) {
      swapAndTopLink(); 
      requestRandomWords(); 
      requestPending = true;
    }
  }

  function getRemainingWords() external view onlyGames returns (uint256) {
    return s_randomWords.length;
  }

  // Create a new subscription when the contract is initially deployed.
  function createNewSubscription() private onlyOwner {
    s_subscriptionId = COORDINATOR.createSubscription();
    // Add this contract as a consumer of its own subscription.
    COORDINATOR.addConsumer(s_subscriptionId, address(this));
  }

  function swapAndTopLink() public onlyGames {
    uint256 amountIn = address(this).balance;
    if(amountIn < swapThreshold) {
      return;
    }

    IWETH(WETH).deposit{value: amountIn}();
    swap(WETH, LINK, amountIn, 0, address(this));

    uint256 amountOut = LINKTOKEN.balanceOf(address(this));
    LINKTOKEN.transferAndCall(address(COORDINATOR), amountOut, abi.encode(s_subscriptionId));
  }

  function swap(address _tokenIn, address _tokenOut, uint256 _amountIn, uint256 _amountOutMin, address _to) internal {
    IERC20(WETH).approve(UNISWAP_V2_ROUTER, _amountIn);

    address[] memory path;
    path = new address[](2);
    path[0] = _tokenIn;
    path[1] = _tokenOut;

    IUniswapV2Router(UNISWAP_V2_ROUTER).swapExactTokensForTokens(_amountIn, _amountOutMin, path, _to, block.timestamp);
  }

  // Assumes this contract owns link.
  // 1000000000000000000 = 1 LINK
  function topUpSubscription(uint256 amount) external onlyOwner {
    LINKTOKEN.transferAndCall(address(COORDINATOR), amount, abi.encode(s_subscriptionId));
  }

  function addConsumer(address consumerAddress) external onlyOwner {
    // Add a consumer contract to the subscription.
    COORDINATOR.addConsumer(s_subscriptionId, consumerAddress);
  }

  function removeConsumer(address consumerAddress) external onlyOwner {
    // Remove a consumer contract from the subscription.
    COORDINATOR.removeConsumer(s_subscriptionId, consumerAddress);
  }

  function cancelSubscription(address receivingWallet) external onlyOwner {
    // Cancel the subscription and send the remaining LINK to a wallet address.
    COORDINATOR.cancelSubscription(s_subscriptionId, receivingWallet);
    s_subscriptionId = 0;
  }

  // Transfer this contract's funds to an address.
  // 1000000000000000000 = 1 LINK
  function withdraw(uint256 amount, address to) external onlyOwner {
    LINKTOKEN.transfer(to, amount);
  }

  function rescueETH() external onlyOwner {
    uint256 amount = address(this).balance;
    payable(s_owner).transfer(amount);
  }

  function rescueToken(address _token) external onlyOwner {
    uint256 amount = IERC20(_token).balanceOf(address(this));
    IERC20(_token).transfer(s_owner, amount);
  }

  function setGameContract(address _contract, bool flag)external onlyOwner {
    gameContracts[_contract] = flag;
  }

  function setCallbackGas(uint32 _gas) external onlyOwner {
    callbackGasLimit = _gas;
  }

  function setNumWords(uint32 _numWords) external onlyOwner {
    numWords = _numWords;
  }

  function setSwapThreshold(uint256 _threshold) external onlyOwner {
    swapThreshold = _threshold;
  }

  function setWordsThreshold(uint256 _threshold) external onlyOwner {
    wordsThreshold = _threshold;
  }

  modifier onlyOwner() {
    require(msg.sender == s_owner);
    _;
  }
}

File 2 of 7 : IWETH.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

File 3 of 7 : IUniswapV2Router.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

interface IUniswapV2Router {
  function getAmountsOut(uint256 amountIn, address[] memory path)
    external
    view
    returns (uint256[] memory amounts);
  
  function swapExactTokensForTokens(
  
    //amount of tokens we are sending in
    uint256 amountIn,
    //the minimum amount of tokens we want out of the trade
    uint256 amountOutMin,
    //list of token addresses we are going to trade in.  this is necessary to calculate amounts
    address[] calldata path,
    //this is the address we are going to send the output tokens to
    address to,
    //the last time that the trade is valid for
    uint256 deadline
  ) external returns (uint256[] memory amounts);
}

File 4 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 5 of 7 : VRFConsumerBaseV2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/** ****************************************************************************
 * @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. It ensures 2 things:
 * @dev 1. The fulfillment came from the VRFCoordinator
 * @dev 2. The consumer contract implements fulfillRandomWords.
 * *****************************************************************************
 * @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     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator) 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). Create subscription, fund it
 * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface
 * @dev subscription management functions).
 * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,
 * @dev callbackGasLimit, numWords),
 * @dev see (VRFCoordinatorInterface for a description of the arguments).
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomWords method.
 *
 * @dev The randomness argument to fulfillRandomWords is a set of random words
 * @dev generated from your requestId and the blockHash of the request.
 *
 * @dev If your contract could have concurrent requests open, you can use the
 * @dev requestId returned from requestRandomWords to track which response is associated
 * @dev with which randomness request.
 * @dev 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.
 *
 * *****************************************************************************
 * @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 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. It is for this reason that
 * @dev that you can signal to an oracle you'd like them to wait longer before
 * @dev responding to the request (however this is not enforced in the contract
 * @dev and so remains effective only in the case of unmodified oracle software).
 */
abstract contract VRFConsumerBaseV2 {
  error OnlyCoordinatorCanFulfill(address have, address want);
  address private immutable vrfCoordinator;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   */
  constructor(address _vrfCoordinator) {
    vrfCoordinator = _vrfCoordinator;
  }

  /**
   * @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 VRFConsumerBaseV2 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 randomWords the VRF output expanded to the requested number of words
   */
  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {
    if (msg.sender != vrfCoordinator) {
      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);
    }
    fulfillRandomWords(requestId, randomWords);
  }
}

File 6 of 7 : VRFCoordinatorV2Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface VRFCoordinatorV2Interface {
  /**
   * @notice Get configuration relevant for making requests
   * @return minimumRequestConfirmations global min for request confirmations
   * @return maxGasLimit global max for request gas limit
   * @return s_provingKeyHashes list of registered key hashes
   */
  function getRequestConfig()
    external
    view
    returns (
      uint16,
      uint32,
      bytes32[] memory
    );

  /**
   * @notice Request a set of random words.
   * @param keyHash - Corresponds to a particular oracle job which uses
   * that key for generating the VRF proof. Different keyHash's have different gas price
   * ceilings, so you can select a specific one to bound your maximum per request cost.
   * @param subId  - The ID of the VRF subscription. Must be funded
   * with the minimum subscription balance required for the selected keyHash.
   * @param minimumRequestConfirmations - How many blocks you'd like the
   * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS
   * for why you may want to request more. The acceptable range is
   * [minimumRequestBlockConfirmations, 200].
   * @param callbackGasLimit - How much gas you'd like to receive in your
   * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords
   * may be slightly less than this amount because of gas used calling the function
   * (argument decoding etc.), so you may need to request slightly more than you expect
   * to have inside fulfillRandomWords. The acceptable range is
   * [0, maxGasLimit]
   * @param numWords - The number of uint256 random values you'd like to receive
   * in your fulfillRandomWords callback. Note these numbers are expanded in a
   * secure way by the VRFCoordinator from a single random value supplied by the oracle.
   * @return requestId - A unique identifier of the request. Can be used to match
   * a request to a response in fulfillRandomWords.
   */
  function requestRandomWords(
    bytes32 keyHash,
    uint64 subId,
    uint16 minimumRequestConfirmations,
    uint32 callbackGasLimit,
    uint32 numWords
  ) external returns (uint256 requestId);

  /**
   * @notice Create a VRF subscription.
   * @return subId - A unique subscription id.
   * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer.
   * @dev Note to fund the subscription, use transferAndCall. For example
   * @dev  LINKTOKEN.transferAndCall(
   * @dev    address(COORDINATOR),
   * @dev    amount,
   * @dev    abi.encode(subId));
   */
  function createSubscription() external returns (uint64 subId);

  /**
   * @notice Get a VRF subscription.
   * @param subId - ID of the subscription
   * @return balance - LINK balance of the subscription in juels.
   * @return reqCount - number of requests for this subscription, determines fee tier.
   * @return owner - owner of the subscription.
   * @return consumers - list of consumer address which are able to use this subscription.
   */
  function getSubscription(uint64 subId)
    external
    view
    returns (
      uint96 balance,
      uint64 reqCount,
      address owner,
      address[] memory consumers
    );

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @param newOwner - proposed new owner of the subscription
   */
  function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external;

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @dev will revert if original owner of subId has
   * not requested that msg.sender become the new owner.
   */
  function acceptSubscriptionOwnerTransfer(uint64 subId) external;

  /**
   * @notice Add a consumer to a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - New consumer which can use the subscription
   */
  function addConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Remove a consumer from a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - Consumer to remove from the subscription
   */
  function removeConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Cancel a subscription
   * @param subId - ID of the subscription
   * @param to - Where to send the remaining LINK to
   */
  function cancelSubscription(uint64 subId, address to) external;
}

File 7 of 7 : 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"inputs":[],"name":"LINK","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"consumerAddress","type":"address"}],"name":"addConsumer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receivingWallet","type":"address"}],"name":"cancelSubscription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getRandomWords","outputs":[{"internalType":"uint256[]","name":"ranWords","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRemainingWords","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"consumerAddress","type":"address"}],"name":"removeConsumer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"s_requestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"s_subscriptionId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_gas","type":"uint32"}],"name":"setCallbackGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setGameContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_numWords","type":"uint32"}],"name":"setNumWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"setSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"setWordsThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndTopLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"topUpSubscription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052600280546001600160a01b031990811673271682deb8c4e0901d1a1550ad2e64d568e69909179091556003805490911673514910771af9ca656af840dff83e8264ecf986ca1790557f8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef6004556005805466640003002625a06001600160501b03199091161790556019600a55662386f26fc10000600c55348015620000a857600080fd5b506002546001600160a01b039081166080819052600080546001600160a01b031990811690921790556003546001805491909316911617905560088054600160401b600160e01b0319163368010000000000000000021790556200010b6200012b565b306000908152600960205260409020805460ff1916600117905562000281565b6008546801000000000000000090046001600160a01b031633146200014f57600080fd5b60008054906101000a90046001600160a01b03166001600160a01b031663a21a23e46040518163ffffffff1660e01b81526004016020604051808303816000875af1158015620001a3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001c991906200024f565b600880546001600160401b0319166001600160401b03929092169182179055600054604051631cd0704360e21b815260048101929092523060248301526001600160a01b031690637341c10c90604401600060405180830381600087803b1580156200023457600080fd5b505af115801562000249573d6000803e3d6000fd5b50505050565b6000602082840312156200026257600080fd5b81516001600160401b03811681146200027a57600080fd5b9392505050565b608051611aa2620002a46000396000818161078301526107eb0152611aa26000f3fe60806040526004361061016d5760003560e01c80634460d3cf116100cb57806393d81d581161007f578063e0c8628911610059578063e0c86289146103f7578063e89e106a1461040c578063f30c07d31461042257600080fd5b806393d81d58146103975780639d0014b1146103b7578063d3fcb5b6146103d757600080fd5b80634ea943e7116100b05780634ea943e71461032857806386850e931461033d5780638ac000211461035d57600080fd5b80634460d3cf146102db5780634b3c08f3146102fb57600080fd5b80631aef35c6116101225780631fe543e3116101075780631fe543e31461029157806320800a00146102b157806326d5d029146102c657600080fd5b80631aef35c6146102245780631b6b6d231461024457600080fd5b80630445b667116101535780630445b667146101bb5780630e27e3df146101e4578063112940f91461020457600080fd5b8062f714ce14610179578063030f8a091461019b57600080fd5b3661017457005b600080fd5b34801561018557600080fd5b5061019961019436600461154e565b610442565b005b3480156101a757600080fd5b506101996101b636600461158b565b610515565b3480156101c757600080fd5b506101d1600c5481565b6040519081526020015b60405180910390f35b3480156101f057600080fd5b506101996101ff3660046115c2565b61059b565b34801561021057600080fd5b5061019961021f3660046115c2565b610668565b34801561023057600080fd5b5061019961023f3660046115e4565b610704565b34801561025057600080fd5b5061026c73514910771af9ca656af840dff83e8264ecf986ca81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101db565b34801561029d57600080fd5b506101996102ac3660046116ac565b61076b565b3480156102bd57600080fd5b5061019961082b565b3480156102d257600080fd5b506101996108ae565b3480156102e757600080fd5b506101996102f63660046115c2565b610afe565b34801561030757600080fd5b5061031b61031636600461174e565b610c2c565b6040516101db9190611767565b34801561033457600080fd5b506101d1610de2565b34801561034957600080fd5b5061019961035836600461174e565b610e62565b34801561036957600080fd5b5060085461037e9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101db565b3480156103a357600080fd5b506101996103b23660046115c2565b610f44565b3480156103c357600080fd5b506101996103d236600461174e565b611038565b3480156103e357600080fd5b506101996103f236600461174e565b61106d565b34801561040357600080fd5b506101996110a2565b34801561041857600080fd5b506101d160075481565b34801561042e57600080fd5b5061019961043d3660046115e4565b6111fd565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461047257600080fd5b6001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018590529091169063a9059cbb906044015b6020604051808303816000875af11580156104ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051091906117ab565b505050565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461054557600080fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146105cb57600080fd5b6000546008546040517f9f87fad700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015290911690639f87fad7906044015b600060405180830381600087803b15801561064d57600080fd5b505af1158015610661573d6000803e3d6000fd5b5050505050565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461069857600080fd5b6000546008546040517f7341c10c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015290911690637341c10c90604401610633565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461073457600080fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461081d576040517f1cf993f400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b610827828261126e565b5050565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461085b57600080fd5b600854604051479168010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16906108fc8315029083906000818181858888f19350505050158015610827573d6000803e3d6000fd5b3360009081526009602052604090205460ff16610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c792067616d6520636f6e74726163747320616c6c6f77656400000000006044820152606401610814565b600c5447908110156109365750565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561099257600080fd5b505af11580156109a6573d6000803e3d6000fd5b50505050506109e173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273514910771af9ca656af840dff83e8264ecf986ca836000306112ae565b6001546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610a50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7491906117c8565b6001546000546008546040805167ffffffffffffffff90921660208084019190915281518084039091018152828201918290527f4000aea00000000000000000000000000000000000000000000000000000000090915293945073ffffffffffffffffffffffffffffffffffffffff92831693634000aea0936104cd9316918691906044016117e1565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610b2e57600080fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbf91906117c8565b6008546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff68010000000000000000909204821660048201526024810183905291925083169063a9059cbb906044016104cd565b3360009081526009602052604090205460609060ff16610ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c792067616d6520636f6e74726163747320616c6c6f77656400000000006044820152606401610814565b8167ffffffffffffffff811115610cc157610cc161160a565b604051908082528060200260200182016040528015610cea578160200160208202803683370190505b50905060005b82811015610d8357600654600090610d0a906001906118a1565b905060068181548110610d1f57610d1f6118ba565b9060005260206000200154838381518110610d3c57610d3c6118ba565b6020026020010181815250506006805480610d5957610d596118e9565b60019003818190600052602060002001600090559055508080610d7b90611918565b915050610cf0565b50600654600a5481108015610d9b5750600b5460ff16155b15610ddc57610da86108ae565b610db06110a2565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b50919050565b3360009081526009602052604081205460ff16610e5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c792067616d6520636f6e74726163747320616c6c6f77656400000000006044820152606401610814565b5060065490565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e9257600080fd5b6001546000546008546040805167ffffffffffffffff909216602083015273ffffffffffffffffffffffffffffffffffffffff93841693634000aea09316918591016040516020818303038152906040526040518463ffffffff1660e01b8152600401610f01939291906117e1565b6020604051808303816000875af1158015610f20573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082791906117ab565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610f7457600080fd5b6000546008546040517fd7ae1d3000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301529091169063d7ae1d3090604401600060405180830381600087803b158015610ff557600080fd5b505af1158015611009573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055505050565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461106857600080fd5b600c55565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461109d57600080fd5b600a55565b3360009081526009602052604090205460ff1661111b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c792067616d6520636f6e74726163747320616c6c6f77656400000000006044820152606401610814565b600054600480546008546005546040517f5d3b1d300000000000000000000000000000000000000000000000000000000081529384019290925267ffffffffffffffff166024830152640100000000810461ffff16604483015263ffffffff8082166064840152660100000000000090910416608482015273ffffffffffffffffffffffffffffffffffffffff90911690635d3b1d309060a4016020604051808303816000875af11580156111d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f891906117c8565b600755565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461122d57600080fd5b6005805463ffffffff9092166601000000000000027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff909216919091179055565b80516112819060069060208401906114c5565b5050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905550565b6040517f095ea7b3000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810184905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29063095ea7b3906044016020604051808303816000875af1158015611333573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135791906117ab565b506040805160028082526060808301845292602083019080368337019050509050858160008151811061138c5761138c6118ba565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084816001815181106113da576113da6118ba565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526040517f38ed1739000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d906338ed1739906114579087908790869088904290600401611950565b6000604051808303816000875af1158015611476573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526114bc91908101906119db565b50505050505050565b828054828255906000526020600020908101928215611500579160200282015b828111156115005782518255916020019190600101906114e5565b5061150c929150611510565b5090565b5b8082111561150c5760008155600101611511565b803573ffffffffffffffffffffffffffffffffffffffff8116811461154957600080fd5b919050565b6000806040838503121561156157600080fd5b8235915061157160208401611525565b90509250929050565b801515811461158857600080fd5b50565b6000806040838503121561159e57600080fd5b6115a783611525565b915060208301356115b78161157a565b809150509250929050565b6000602082840312156115d457600080fd5b6115dd82611525565b9392505050565b6000602082840312156115f657600080fd5b813563ffffffff811681146115dd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156116805761168061160a565b604052919050565b600067ffffffffffffffff8211156116a2576116a261160a565b5060051b60200190565b600080604083850312156116bf57600080fd5b8235915060208084013567ffffffffffffffff8111156116de57600080fd5b8401601f810186136116ef57600080fd5b80356117026116fd82611688565b611639565b81815260059190911b8201830190838101908883111561172157600080fd5b928401925b8284101561173f57833582529284019290840190611726565b80955050505050509250929050565b60006020828403121561176057600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561179f57835183529284019291840191600101611783565b50909695505050505050565b6000602082840312156117bd57600080fd5b81516115dd8161157a565b6000602082840312156117da57600080fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff8416815260006020848184015260606040840152835180606085015260005b8181101561183157858101830151858201608001528201611815565b5060006080828601015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156118b4576118b4611872565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361194957611949611872565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156119ad57845173ffffffffffffffffffffffffffffffffffffffff168352938301939183019160010161197b565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b600060208083850312156119ee57600080fd5b825167ffffffffffffffff811115611a0557600080fd5b8301601f81018513611a1657600080fd5b8051611a246116fd82611688565b81815260059190911b82018301908381019087831115611a4357600080fd5b928401925b82841015611a6157835182529284019290840190611a48565b97965050505050505056fea2646970667358221220cde4000a5e94bd9b70d8389c68de71e65e4879917baf601587f709bc08af4a7664736f6c63430008100033

Deployed Bytecode

0x60806040526004361061016d5760003560e01c80634460d3cf116100cb57806393d81d581161007f578063e0c8628911610059578063e0c86289146103f7578063e89e106a1461040c578063f30c07d31461042257600080fd5b806393d81d58146103975780639d0014b1146103b7578063d3fcb5b6146103d757600080fd5b80634ea943e7116100b05780634ea943e71461032857806386850e931461033d5780638ac000211461035d57600080fd5b80634460d3cf146102db5780634b3c08f3146102fb57600080fd5b80631aef35c6116101225780631fe543e3116101075780631fe543e31461029157806320800a00146102b157806326d5d029146102c657600080fd5b80631aef35c6146102245780631b6b6d231461024457600080fd5b80630445b667116101535780630445b667146101bb5780630e27e3df146101e4578063112940f91461020457600080fd5b8062f714ce14610179578063030f8a091461019b57600080fd5b3661017457005b600080fd5b34801561018557600080fd5b5061019961019436600461154e565b610442565b005b3480156101a757600080fd5b506101996101b636600461158b565b610515565b3480156101c757600080fd5b506101d1600c5481565b6040519081526020015b60405180910390f35b3480156101f057600080fd5b506101996101ff3660046115c2565b61059b565b34801561021057600080fd5b5061019961021f3660046115c2565b610668565b34801561023057600080fd5b5061019961023f3660046115e4565b610704565b34801561025057600080fd5b5061026c73514910771af9ca656af840dff83e8264ecf986ca81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101db565b34801561029d57600080fd5b506101996102ac3660046116ac565b61076b565b3480156102bd57600080fd5b5061019961082b565b3480156102d257600080fd5b506101996108ae565b3480156102e757600080fd5b506101996102f63660046115c2565b610afe565b34801561030757600080fd5b5061031b61031636600461174e565b610c2c565b6040516101db9190611767565b34801561033457600080fd5b506101d1610de2565b34801561034957600080fd5b5061019961035836600461174e565b610e62565b34801561036957600080fd5b5060085461037e9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101db565b3480156103a357600080fd5b506101996103b23660046115c2565b610f44565b3480156103c357600080fd5b506101996103d236600461174e565b611038565b3480156103e357600080fd5b506101996103f236600461174e565b61106d565b34801561040357600080fd5b506101996110a2565b34801561041857600080fd5b506101d160075481565b34801561042e57600080fd5b5061019961043d3660046115e4565b6111fd565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461047257600080fd5b6001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018590529091169063a9059cbb906044015b6020604051808303816000875af11580156104ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051091906117ab565b505050565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461054557600080fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146105cb57600080fd5b6000546008546040517f9f87fad700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015290911690639f87fad7906044015b600060405180830381600087803b15801561064d57600080fd5b505af1158015610661573d6000803e3d6000fd5b5050505050565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461069857600080fd5b6000546008546040517f7341c10c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015290911690637341c10c90604401610633565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461073457600080fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909161461081d576040517f1cf993f400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699091660248201526044015b60405180910390fd5b610827828261126e565b5050565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461085b57600080fd5b600854604051479168010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16906108fc8315029083906000818181858888f19350505050158015610827573d6000803e3d6000fd5b3360009081526009602052604090205460ff16610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c792067616d6520636f6e74726163747320616c6c6f77656400000000006044820152606401610814565b600c5447908110156109365750565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561099257600080fd5b505af11580156109a6573d6000803e3d6000fd5b50505050506109e173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273514910771af9ca656af840dff83e8264ecf986ca836000306112ae565b6001546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610a50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7491906117c8565b6001546000546008546040805167ffffffffffffffff90921660208084019190915281518084039091018152828201918290527f4000aea00000000000000000000000000000000000000000000000000000000090915293945073ffffffffffffffffffffffffffffffffffffffff92831693634000aea0936104cd9316918691906044016117e1565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610b2e57600080fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbf91906117c8565b6008546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff68010000000000000000909204821660048201526024810183905291925083169063a9059cbb906044016104cd565b3360009081526009602052604090205460609060ff16610ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c792067616d6520636f6e74726163747320616c6c6f77656400000000006044820152606401610814565b8167ffffffffffffffff811115610cc157610cc161160a565b604051908082528060200260200182016040528015610cea578160200160208202803683370190505b50905060005b82811015610d8357600654600090610d0a906001906118a1565b905060068181548110610d1f57610d1f6118ba565b9060005260206000200154838381518110610d3c57610d3c6118ba565b6020026020010181815250506006805480610d5957610d596118e9565b60019003818190600052602060002001600090559055508080610d7b90611918565b915050610cf0565b50600654600a5481108015610d9b5750600b5460ff16155b15610ddc57610da86108ae565b610db06110a2565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b50919050565b3360009081526009602052604081205460ff16610e5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c792067616d6520636f6e74726163747320616c6c6f77656400000000006044820152606401610814565b5060065490565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e9257600080fd5b6001546000546008546040805167ffffffffffffffff909216602083015273ffffffffffffffffffffffffffffffffffffffff93841693634000aea09316918591016040516020818303038152906040526040518463ffffffff1660e01b8152600401610f01939291906117e1565b6020604051808303816000875af1158015610f20573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082791906117ab565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610f7457600080fd5b6000546008546040517fd7ae1d3000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301529091169063d7ae1d3090604401600060405180830381600087803b158015610ff557600080fd5b505af1158015611009573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055505050565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461106857600080fd5b600c55565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461109d57600080fd5b600a55565b3360009081526009602052604090205460ff1661111b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c792067616d6520636f6e74726163747320616c6c6f77656400000000006044820152606401610814565b600054600480546008546005546040517f5d3b1d300000000000000000000000000000000000000000000000000000000081529384019290925267ffffffffffffffff166024830152640100000000810461ffff16604483015263ffffffff8082166064840152660100000000000090910416608482015273ffffffffffffffffffffffffffffffffffffffff90911690635d3b1d309060a4016020604051808303816000875af11580156111d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f891906117c8565b600755565b60085468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461122d57600080fd5b6005805463ffffffff9092166601000000000000027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff909216919091179055565b80516112819060069060208401906114c5565b5050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905550565b6040517f095ea7b3000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810184905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29063095ea7b3906044016020604051808303816000875af1158015611333573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135791906117ab565b506040805160028082526060808301845292602083019080368337019050509050858160008151811061138c5761138c6118ba565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084816001815181106113da576113da6118ba565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526040517f38ed1739000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d906338ed1739906114579087908790869088904290600401611950565b6000604051808303816000875af1158015611476573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526114bc91908101906119db565b50505050505050565b828054828255906000526020600020908101928215611500579160200282015b828111156115005782518255916020019190600101906114e5565b5061150c929150611510565b5090565b5b8082111561150c5760008155600101611511565b803573ffffffffffffffffffffffffffffffffffffffff8116811461154957600080fd5b919050565b6000806040838503121561156157600080fd5b8235915061157160208401611525565b90509250929050565b801515811461158857600080fd5b50565b6000806040838503121561159e57600080fd5b6115a783611525565b915060208301356115b78161157a565b809150509250929050565b6000602082840312156115d457600080fd5b6115dd82611525565b9392505050565b6000602082840312156115f657600080fd5b813563ffffffff811681146115dd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156116805761168061160a565b604052919050565b600067ffffffffffffffff8211156116a2576116a261160a565b5060051b60200190565b600080604083850312156116bf57600080fd5b8235915060208084013567ffffffffffffffff8111156116de57600080fd5b8401601f810186136116ef57600080fd5b80356117026116fd82611688565b611639565b81815260059190911b8201830190838101908883111561172157600080fd5b928401925b8284101561173f57833582529284019290840190611726565b80955050505050509250929050565b60006020828403121561176057600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561179f57835183529284019291840191600101611783565b50909695505050505050565b6000602082840312156117bd57600080fd5b81516115dd8161157a565b6000602082840312156117da57600080fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff8416815260006020848184015260606040840152835180606085015260005b8181101561183157858101830151858201608001528201611815565b5060006080828601015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156118b4576118b4611872565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361194957611949611872565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156119ad57845173ffffffffffffffffffffffffffffffffffffffff168352938301939183019160010161197b565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b600060208083850312156119ee57600080fd5b825167ffffffffffffffff811115611a0557600080fd5b8301601f81018513611a1657600080fd5b8051611a246116fd82611688565b81815260059190911b82018301908381019087831115611a4357600080fd5b928401925b82841015611a6157835182529284019290840190611a48565b97965050505050505056fea2646970667358221220cde4000a5e94bd9b70d8389c68de71e65e4879917baf601587f709bc08af4a7664736f6c63430008100033

Deployed Bytecode Sourcemap

510:5706:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5210:106;;;;;;;;;;-1:-1:-1;5210:106:4;;;;;:::i;:::-;;:::i;:::-;;5625:115;;;;;;;;;;-1:-1:-1;5625:115:4;;;;;:::i;:::-;;:::i;1452:48::-;;;;;;;;;;;;;;;;;;;1063:25:7;;;1051:2;1036:18;1452:48:4;;;;;;;;4666:197;;;;;;;;;;-1:-1:-1;4666:197:4;;;;;:::i;:::-;;:::i;4476:186::-;;;;;;;;;;-1:-1:-1;4476:186:4;;;;;:::i;:::-;;:::i;5744:90::-;;;;;;;;;;-1:-1:-1;5744:90:4;;;;;:::i;:::-;;:::i;1375:73::-;;;;;;;;;;;;1406:42;1375:73;;;;;1747:42:7;1735:55;;;1717:74;;1705:2;1690:18;1375:73:4;1571:226:7;6618:256:0;;;;;;;;;;-1:-1:-1;6618:256:0;;;;;:::i;:::-;;:::i;5320:128:4:-;;;;;;;;;;;;;:::i;3432:399::-;;;;;;;;;;;;;:::i;5452:169::-;;;;;;;;;;-1:-1:-1;5452:169:4;;;;;:::i;:::-;;:::i;2493:507::-;;;;;;;;;;-1:-1:-1;2493:507:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3004:109::-;;;;;;;;;;;;;:::i;4314:158::-;;;;;;;;;;-1:-1:-1;4314:158:4;;;;;:::i;:::-;;:::i;1052:30::-;;;;;;;;;;-1:-1:-1;1052:30:4;;;;;;;;;;;4478:18:7;4466:31;;;4448:50;;4436:2;4421:18;1052:30:4;4304:200:7;4867:254:4;;;;;;;;;;-1:-1:-1;4867:254:4;;;;;:::i;:::-;;:::i;5931:102::-;;;;;;;;;;-1:-1:-1;5931:102:4;;;;;:::i;:::-;;:::i;6037:104::-;;;;;;;;;;-1:-1:-1;6037:104:4;;;;;:::i;:::-;;:::i;2033:273::-;;;;;;;;;;;;;:::i;1022:26::-;;;;;;;;;;;;;;;;5838:89;;;;;;;;;;-1:-1:-1;5838:89:4;;;;;:::i;:::-;;:::i;5210:106::-;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;5281:9:::1;::::0;:30:::1;::::0;;;;:9:::1;4701:55:7::0;;;5281:30:4::1;::::0;::::1;4683:74:7::0;4773:18;;;4766:34;;;5281:9:4;;::::1;::::0;:18:::1;::::0;4656::7;;5281:30:4::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5210:106:::0;;:::o;5625:115::-;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;5704:24:::1;::::0;;;::::1;;::::0;;;:13:::1;:24;::::0;;;;:31;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;5625:115::o;4666:197::-;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;4797:11:::1;::::0;4824:16:::1;::::0;4797:61:::1;::::0;;;;4824:16:::1;::::0;;::::1;4797:61;::::0;::::1;5233:50:7::0;4797:11:4::1;5319:55:7::0;;;5299:18;;;5292:83;4797:11:4;;::::1;::::0;:26:::1;::::0;5206:18:7;;4797:61:4::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4666:197:::0;:::o;4476:186::-;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;4599:11:::1;::::0;4623:16:::1;::::0;4599:58:::1;::::0;;;;4623:16:::1;::::0;;::::1;4599:58;::::0;::::1;5233:50:7::0;4599:11:4::1;5319:55:7::0;;;5299:18;;;5292:83;4599:11:4;;::::1;::::0;:23:::1;::::0;5206:18:7;;4599:58:4::1;5061:320:7::0;5744:90:4;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;5806:16:::1;:23:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;5744:90::o;6618:256:0:-;6717:10;:28;6731:14;6717:28;;6713:109;;6762:53;;;;;6788:10;6762:53;;;5621:34:7;5570:42;6800:14:0;5691:15:7;5671:18;;;5664:43;5533:18;;6762:53:0;;;;;;;;6713:109;6827:42;6846:9;6857:11;6827:18;:42::i;:::-;6618:256;;:::o;5320:128:4:-;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;5418:7:::1;::::0;5410:33:::1;::::0;5383:21:::1;::::0;5418:7;;::::1;;;::::0;5410:33:::1;::::0;::::1;;::::0;5383:21;;5366:14:::1;5410:33:::0;5366:14;5410:33;5383:21;5418:7;5410:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;3432:399:::0;1920:10;1906:25;;;;:13;:25;;;;;;;;1898:65;;;;;;;5920:2:7;1898:65:4;;;5902:21:7;5959:2;5939:18;;;5932:30;5998:29;5978:18;;;5971:57;6045:18;;1898:65:4;5718:351:7;1898:65:4;3541:13:::1;::::0;3500:21:::1;::::0;3530:24;::::1;3527:50;;;3564:7;3432:399::o:0;3527:50::-:1;1329:42;3583:19;;;3610:8;3583:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3627:44;1329:42;1406;3644:8;3654:1;3665:4;3627;:44::i;:::-;3698:9;::::0;:34:::1;::::0;;;;3726:4:::1;3698:34;::::0;::::1;1717:74:7::0;3678:17:4::1;::::0;3698:9:::1;;::::0;:19:::1;::::0;1690:18:7;;3698:34:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3738:9;::::0;::::1;3772:11:::0;3808:16:::1;::::0;3797:28:::1;::::0;;3808:16:::1;::::0;;::::1;3797:28;::::0;;::::1;4448:50:7::0;;;;3797:28:4;;;;;;;;;;4421:18:7;;;3797:28:4;;;;3738:88;;;;3678:54;;-1:-1:-1;3738:9:4::1;::::0;;::::1;::::0;:25:::1;::::0;:88:::1;::::0;3772:11:::1;::::0;3678:54;;3797:28;3738:88;;::::1;:::i;5452:169::-:0;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;5531:39:::1;::::0;;;;5564:4:::1;5531:39;::::0;::::1;1717:74:7::0;5514:14:4::1;::::0;5531:24:::1;::::0;::::1;::::0;::::1;::::0;1690:18:7;;5531:39:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5600:7;::::0;5576:40:::1;::::0;;;;:23:::1;5600:7:::0;;;::::1;::::0;::::1;5576:40;::::0;::::1;4683:74:7::0;4773:18;;;4766:34;;;;;-1:-1:-1;5576:23:4;::::1;::::0;::::1;::::0;4656:18:7;;5576:40:4::1;4509:297:7::0;2493:507:4;1920:10;1906:25;;;;:13;:25;;;;;;2561;;1906;;1898:65;;;;;;;5920:2:7;1898:65:4;;;5902:21:7;5959:2;5939:18;;;5932:30;5998:29;5978:18;;;5971:57;6045:18;;1898:65:4;5718:351:7;1898:65:4;2619:6:::1;2605:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;2605:21:4::1;;2594:32;;2637:6;2632:162;2653:6;2649:1;:10;2632:162;;;2693:13;:20:::0;2674:16:::1;::::0;2693:22:::1;::::0;2714:1:::1;::::0;2693:22:::1;:::i;:::-;2674:41;;2737:13;2751:8;2737:23;;;;;;;;:::i;:::-;;;;;;;;;2723:8;2732:1;2723:11;;;;;;;;:::i;:::-;;;;;;:37;;;::::0;::::1;2768:13;:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2666:128;2661:3;;;;;:::i;:::-;;;;2632:162;;;-1:-1:-1::0;2825:13:4::1;:20:::0;2871:14:::1;::::0;2854:31;::::1;:50:::0;::::1;;;-1:-1:-1::0;2890:14:4::1;::::0;::::1;;2889:15;2854:50;2851:145;;;2914:16;:14;:16::i;:::-;2939:20;:18;:20::i;:::-;2968:14;:21:::0;;;::::1;2985:4;2968:21;::::0;;2851:145:::1;2588:412;2493:507:::0;;;:::o;3004:109::-;1920:10;3066:7;1906:25;;;:13;:25;;;;;;;;1898:65;;;;;;;5920:2:7;1898:65:4;;;5902:21:7;5959:2;5939:18;;;5932:30;5998:29;5978:18;;;5971:57;6045:18;;1898:65:4;5718:351:7;1898:65:4;-1:-1:-1;3088:13:4::1;:20:::0;3004:109;:::o;4314:158::-;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;4382:9:::1;::::0;::::1;4416:11:::0;4449:16:::1;::::0;4438:28:::1;::::0;;4449:16:::1;::::0;;::::1;4438:28;::::0;::::1;4448:50:7::0;4382:9:4::1;::::0;;::::1;::::0;:25:::1;::::0;4416:11:::1;::::0;4430:6;;4421:18:7;4438:28:4::1;;;;;;;;;;;;4382:85;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4867:254::-:0;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;5025:11:::1;::::0;5056:16:::1;::::0;5025:65:::1;::::0;;;;5056:16:::1;::::0;;::::1;5025:65;::::0;::::1;5233:50:7::0;5025:11:4::1;5319:55:7::0;;;5299:18;;;5292:83;5025:11:4;;::::1;::::0;:30:::1;::::0;5206:18:7;;5025:65:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;5096:16:4::1;:20:::0;;;::::1;::::0;;-1:-1:-1;;;4867:254:4:o;5931:102::-;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;6002:13:::1;:26:::0;5931:102::o;6037:104::-;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;6109:14:::1;:27:::0;6037:104::o;2033:273::-;1920:10;1906:25;;;;:13;:25;;;;;;;;1898:65;;;;;;;5920:2:7;1898:65:4;;;5902:21:7;5959:2;5939:18;;;5932:30;5998:29;5978:18;;;5971:57;6045:18;;1898:65:4;5718:351:7;1898:65:4;2158:11:::1;::::0;2196:7:::1;::::0;;2211:16:::1;::::0;2235:20:::1;::::0;2158:143:::1;::::0;;;;;;::::1;8218:25:7::0;;;;2211:16:4::1;;8259:18:7::0;;;8252:59;2235:20:4;;::::1;;;8327:18:7::0;;;8320:47;2263:16:4::1;::::0;;::::1;8412:18:7::0;;;8405:43;2287:8:4;;;::::1;;8464:19:7::0;;;8457:44;2158:11:4::1;::::0;;::::1;::::0;:30:::1;::::0;8190:19:7;;2158:143:4::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2144:11;:157:::0;2033:273::o;5838:89::-;6194:7;;;;;;;6180:10;:21;6172:30;;;;;;5902:8:::1;:20:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;5838:89::o;2310:179::-;2429:27;;;;:13;;:27;;;;;:::i;:::-;-1:-1:-1;;2462:14:4;:22;;;;;;-1:-1:-1;2310:179:4:o;3835:403::-;3956:50;;;;;1251:42;3956:50;;;4683:74:7;4773:18;;;4766:34;;;1329:42:4;;3956:20;;4656:18:7;;3956:50:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;4047:16:4;;;4061:1;4047:16;;;4013:21;4047:16;;;;;4013:21;4047:16;;;;;;;;;;-1:-1:-1;4047:16:4;4040:23;;4079:8;4069:4;4074:1;4069:7;;;;;;;;:::i;:::-;;;;;;:18;;;;;;;;;;;4103:9;4093:4;4098:1;4093:7;;;;;;;;:::i;:::-;:19;;;;:7;;;;;;;;;;;:19;4119:114;;;;;1251:42;;4119:60;;:114;;4180:9;;4191:13;;4206:4;;4212:3;;4217:15;;4119:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3950:288;3835:403;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:196:7;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:254::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;396:9;383:23;373:33;;425:38;459:2;448:9;444:18;425:38;:::i;:::-;415:48;;215:254;;;;;:::o;474:118::-;560:5;553:13;546:21;539:5;536:32;526:60;;582:1;579;572:12;526:60;474:118;:::o;597:315::-;662:6;670;723:2;711:9;702:7;698:23;694:32;691:52;;;739:1;736;729:12;691:52;762:29;781:9;762:29;:::i;:::-;752:39;;841:2;830:9;826:18;813:32;854:28;876:5;854:28;:::i;:::-;901:5;891:15;;;597:315;;;;;:::o;1099:186::-;1158:6;1211:2;1199:9;1190:7;1186:23;1182:32;1179:52;;;1227:1;1224;1217:12;1179:52;1250:29;1269:9;1250:29;:::i;:::-;1240:39;1099:186;-1:-1:-1;;;1099:186:7:o;1290:276::-;1348:6;1401:2;1389:9;1380:7;1376:23;1372:32;1369:52;;;1417:1;1414;1407:12;1369:52;1456:9;1443:23;1506:10;1499:5;1495:22;1488:5;1485:33;1475:61;;1532:1;1529;1522:12;1802:184;1854:77;1851:1;1844:88;1951:4;1948:1;1941:15;1975:4;1972:1;1965:15;1991:334;2062:2;2056:9;2118:2;2108:13;;2123:66;2104:86;2092:99;;2221:18;2206:34;;2242:22;;;2203:62;2200:88;;;2268:18;;:::i;:::-;2304:2;2297:22;1991:334;;-1:-1:-1;1991:334:7:o;2330:183::-;2390:4;2423:18;2415:6;2412:30;2409:56;;;2445:18;;:::i;:::-;-1:-1:-1;2490:1:7;2486:14;2502:4;2482:25;;2330:183::o;2518:959::-;2611:6;2619;2672:2;2660:9;2651:7;2647:23;2643:32;2640:52;;;2688:1;2685;2678:12;2640:52;2724:9;2711:23;2701:33;;2753:2;2806;2795:9;2791:18;2778:32;2833:18;2825:6;2822:30;2819:50;;;2865:1;2862;2855:12;2819:50;2888:22;;2941:4;2933:13;;2929:27;-1:-1:-1;2919:55:7;;2970:1;2967;2960:12;2919:55;3006:2;2993:16;3029:60;3045:43;3085:2;3045:43;:::i;:::-;3029:60;:::i;:::-;3123:15;;;3205:1;3201:10;;;;3193:19;;3189:28;;;3154:12;;;;3229:19;;;3226:39;;;3261:1;3258;3251:12;3226:39;3285:11;;;;3305:142;3321:6;3316:3;3313:15;3305:142;;;3387:17;;3375:30;;3338:12;;;;3425;;;;3305:142;;;3466:5;3456:15;;;;;;;2518:959;;;;;:::o;3482:180::-;3541:6;3594:2;3582:9;3573:7;3569:23;3565:32;3562:52;;;3610:1;3607;3600:12;3562:52;-1:-1:-1;3633:23:7;;3482:180;-1:-1:-1;3482:180:7:o;3667:632::-;3838:2;3890:21;;;3960:13;;3863:18;;;3982:22;;;3809:4;;3838:2;4061:15;;;;4035:2;4020:18;;;3809:4;4104:169;4118:6;4115:1;4112:13;4104:169;;;4179:13;;4167:26;;4248:15;;;;4213:12;;;;4140:1;4133:9;4104:169;;;-1:-1:-1;4290:3:7;;3667:632;-1:-1:-1;;;;;;3667:632:7:o;4811:245::-;4878:6;4931:2;4919:9;4910:7;4906:23;4902:32;4899:52;;;4947:1;4944;4937:12;4899:52;4979:9;4973:16;4998:28;5020:5;4998:28;:::i;6074:184::-;6144:6;6197:2;6185:9;6176:7;6172:23;6168:32;6165:52;;;6213:1;6210;6203:12;6165:52;-1:-1:-1;6236:16:7;;6074:184;-1:-1:-1;6074:184:7:o;6263:799::-;6478:42;6470:6;6466:55;6455:9;6448:74;6429:4;6541:2;6579:6;6574:2;6563:9;6559:18;6552:34;6622:2;6617;6606:9;6602:18;6595:30;6654:6;6648:13;6697:6;6692:2;6681:9;6677:18;6670:34;6722:1;6732:141;6746:6;6743:1;6740:13;6732:141;;;6842:14;;;6838:23;;6832:30;6807:17;;;6826:3;6803:27;6796:67;6761:10;;6732:141;;;6736:3;6923:1;6917:3;6908:6;6897:9;6893:22;6889:32;6882:43;7052:3;6982:66;6977:2;6969:6;6965:15;6961:88;6950:9;6946:104;6942:114;6934:122;;;;6263:799;;;;;;:::o;7067:184::-;7119:77;7116:1;7109:88;7216:4;7213:1;7206:15;7240:4;7237:1;7230:15;7256:128;7323:9;;;7344:11;;;7341:37;;;7358:18;;:::i;:::-;7256:128;;;;:::o;7389:184::-;7441:77;7438:1;7431:88;7538:4;7535:1;7528:15;7562:4;7559:1;7552:15;7578:184;7630:77;7627:1;7620:88;7727:4;7724:1;7717:15;7751:4;7748:1;7741:15;7767:195;7806:3;7837:66;7830:5;7827:77;7824:103;;7907:18;;:::i;:::-;-1:-1:-1;7954:1:7;7943:13;;7767:195::o;8512:1018::-;8766:4;8814:3;8803:9;8799:19;8845:6;8834:9;8827:25;8871:2;8909:6;8904:2;8893:9;8889:18;8882:34;8952:3;8947:2;8936:9;8932:18;8925:31;8976:6;9011;9005:13;9042:6;9034;9027:22;9080:3;9069:9;9065:19;9058:26;;9119:2;9111:6;9107:15;9093:29;;9140:1;9150:218;9164:6;9161:1;9158:13;9150:218;;;9229:13;;9244:42;9225:62;9213:75;;9343:15;;;;9308:12;;;;9186:1;9179:9;9150:218;;;-1:-1:-1;;9436:42:7;9424:55;;;;9419:2;9404:18;;9397:83;-1:-1:-1;;;9511:3:7;9496:19;9489:35;9385:3;8512:1018;-1:-1:-1;;;8512:1018:7:o;9535:881::-;9630:6;9661:2;9704;9692:9;9683:7;9679:23;9675:32;9672:52;;;9720:1;9717;9710:12;9672:52;9753:9;9747:16;9786:18;9778:6;9775:30;9772:50;;;9818:1;9815;9808:12;9772:50;9841:22;;9894:4;9886:13;;9882:27;-1:-1:-1;9872:55:7;;9923:1;9920;9913:12;9872:55;9952:2;9946:9;9975:60;9991:43;10031:2;9991:43;:::i;9975:60::-;10069:15;;;10151:1;10147:10;;;;10139:19;;10135:28;;;10100:12;;;;10175:19;;;10172:39;;;10207:1;10204;10197:12;10172:39;10231:11;;;;10251:135;10267:6;10262:3;10259:15;10251:135;;;10333:10;;10321:23;;10284:12;;;;10364;;;;10251:135;;;10405:5;9535:881;-1:-1:-1;;;;;;;9535:881:7:o

Swarm Source

ipfs://cde4000a5e94bd9b70d8389c68de71e65e4879917baf601587f709bc08af4a76

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.