ETH Price: $2,291.98 (-2.79%)

Contract

0x207793a5a08e1da37b44c874a5006D32cF1d52C8
 

Overview

ETH Balance

0.5 ETH

Eth Value

$1,145.99 (@ $2,291.98/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Simple Shift196089542024-04-08 5:45:35152 days ago1712555135IN
Offshift: Anon Shifter 500
0 ETH0.0024290310.80974132
Simple Shift190099292024-01-15 4:34:47236 days ago1705293287IN
Offshift: Anon Shifter 500
0 ETH0.0037883821.34399069
Simple Shift190027122024-01-14 4:22:35237 days ago1705206155IN
Offshift: Anon Shifter 500
0 ETH0.0043813219.49526181
Simple Shift185363772023-11-09 19:08:11302 days ago1699556891IN
Offshift: Anon Shifter 500
0 ETH0.0114682156.20324079
Withdraw185363622023-11-09 19:05:11302 days ago1699556711IN
Offshift: Anon Shifter 500
0 ETH0.0194245457.87520832
Withdraw185363562023-11-09 19:03:59302 days ago1699556639IN
Offshift: Anon Shifter 500
0 ETH0.021283563.41398436
Withdraw185363162023-11-09 18:55:59302 days ago1699556159IN
Offshift: Anon Shifter 500
0 ETH0.0158250347.14883342
Simple Shift185362942023-11-09 18:51:35302 days ago1699555895IN
Offshift: Anon Shifter 500
0 ETH0.0122860848.84792653
Withdraw185362922023-11-09 18:51:11302 days ago1699555871IN
Offshift: Anon Shifter 500
0 ETH0.017852547.26135871
Withdraw185362852023-11-09 18:49:47302 days ago1699555787IN
Offshift: Anon Shifter 500
0 ETH0.0171705351.15940877
Withdraw185362702023-11-09 18:46:47302 days ago1699555607IN
Offshift: Anon Shifter 500
0 ETH0.0171398151.06970749
Withdraw185362472023-11-09 18:41:59302 days ago1699555319IN
Offshift: Anon Shifter 500
0 ETH0.017327751.63139387
Withdraw185362182023-11-09 18:36:11302 days ago1699554971IN
Offshift: Anon Shifter 500
0 ETH0.0238023363.02049866
Withdraw185361402023-11-09 18:20:35302 days ago1699554035IN
Offshift: Anon Shifter 500
0 ETH0.0186176455.47107485
Withdraw185361392023-11-09 18:20:23302 days ago1699554023IN
Offshift: Anon Shifter 500
0 ETH0.0209905255.57224954
Simple Shift185360652023-11-09 18:05:23302 days ago1699553123IN
Offshift: Anon Shifter 500
0 ETH0.0188154980.6355385
Withdraw185360582023-11-09 18:03:59302 days ago1699553039IN
Offshift: Anon Shifter 500
0 ETH0.0224613166.9256358
Withdraw185360562023-11-09 18:03:35302 days ago1699553015IN
Offshift: Anon Shifter 500
0 ETH0.0228801368.17111461
Withdraw185360422023-11-09 18:00:47302 days ago1699552847IN
Offshift: Anon Shifter 500
0 ETH0.0265352270.25179576
Simple Shift185360222023-11-09 17:56:47302 days ago1699552607IN
Offshift: Anon Shifter 500
0 ETH0.0182804467.74650697
Simple Shift185360152023-11-09 17:55:23302 days ago1699552523IN
Offshift: Anon Shifter 500
0 ETH0.0171225763.44466535
Simple Shift185360082023-11-09 17:53:59302 days ago1699552439IN
Offshift: Anon Shifter 500
0 ETH0.0166251961.60262454
Simple Shift185360012023-11-09 17:52:35302 days ago1699552355IN
Offshift: Anon Shifter 500
0 ETH0.0179574366.5420435
Withdraw185359842023-11-09 17:49:11302 days ago1699552151IN
Offshift: Anon Shifter 500
0 ETH0.0203046760.50189058
Withdraw185359602023-11-09 17:44:11302 days ago1699551851IN
Offshift: Anon Shifter 500
0 ETH0.0229182260.67389699
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
185363622023-11-09 19:05:11302 days ago1699556711
Offshift: Anon Shifter 500
0.05 ETH
185363562023-11-09 19:03:59302 days ago1699556639
Offshift: Anon Shifter 500
0.05 ETH
185363162023-11-09 18:55:59302 days ago1699556159
Offshift: Anon Shifter 500
0.05 ETH
185362922023-11-09 18:51:11302 days ago1699555871
Offshift: Anon Shifter 500
0.05 ETH
185362852023-11-09 18:49:47302 days ago1699555787
Offshift: Anon Shifter 500
0.05 ETH
185362702023-11-09 18:46:47302 days ago1699555607
Offshift: Anon Shifter 500
0.05 ETH
185362472023-11-09 18:41:59302 days ago1699555319
Offshift: Anon Shifter 500
0.05 ETH
185362182023-11-09 18:36:11302 days ago1699554971
Offshift: Anon Shifter 500
0.05 ETH
185361402023-11-09 18:20:35302 days ago1699554035
Offshift: Anon Shifter 500
0.05 ETH
185361392023-11-09 18:20:23302 days ago1699554023
Offshift: Anon Shifter 500
0.05 ETH
185360582023-11-09 18:03:59302 days ago1699553039
Offshift: Anon Shifter 500
0.05 ETH
185360562023-11-09 18:03:35302 days ago1699553015
Offshift: Anon Shifter 500
0.05 ETH
185360422023-11-09 18:00:47302 days ago1699552847
Offshift: Anon Shifter 500
0.05 ETH
185359842023-11-09 17:49:11302 days ago1699552151
Offshift: Anon Shifter 500
0.05 ETH
185359602023-11-09 17:44:11302 days ago1699551851
Offshift: Anon Shifter 500
0.05 ETH
185359382023-11-09 17:39:47302 days ago1699551587
Offshift: Anon Shifter 500
0.05 ETH
185359352023-11-09 17:39:11302 days ago1699551551
Offshift: Anon Shifter 500
0.05 ETH
185359332023-11-09 17:38:47302 days ago1699551527
Offshift: Anon Shifter 500
0.05 ETH
185359292023-11-09 17:37:59302 days ago1699551479
Offshift: Anon Shifter 500
0.05 ETH
185359252023-11-09 17:37:11302 days ago1699551431
Offshift: Anon Shifter 500
0.05 ETH
185359202023-11-09 17:36:11302 days ago1699551371
Offshift: Anon Shifter 500
0.05 ETH
185359172023-11-09 17:35:35302 days ago1699551335
Offshift: Anon Shifter 500
0.05 ETH
185358632023-11-09 17:24:47302 days ago1699550687
Offshift: Anon Shifter 500
0.05 ETH
185358082023-11-09 17:13:47302 days ago1699550027
Offshift: Anon Shifter 500
0.05 ETH
185331142023-11-09 8:12:11303 days ago1699517531
Offshift: Anon Shifter 500
0.05 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XFTanon

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-01
*/

// File: contracts\Interfaces\IStorage.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface for Storage.sol contract
 */
interface IStorage {
    
    function store(address depositor, bytes calldata encryptedNote, bytes32 _passwordHash) external;

    function xcrypt(bytes memory note, bytes32 key) external view returns (bytes memory);
}

// File: contracts\MerkleTreeWithHistory.sol

pragma solidity ^0.7.0;

interface IHasher {
  function MiMCSponge(uint256 in_xL, uint256 in_xR) external pure returns (uint256 xL, uint256 xR);
}

contract MerkleTreeWithHistory {
  uint256 public constant FIELD_SIZE = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
  uint256 public constant ZERO_VALUE = 21663839004416932945382355908790599225266501822907911457504978515578255421292; // = keccak256("tornado") % FIELD_SIZE
  IHasher public immutable hasher;
  uint32 public immutable levels;

  // the following variables are made public for easier testing and debugging and
  // are not supposed to be accessed in regular code

  // filledSubtrees and roots could be bytes32[size], but using mappings makes it cheaper because
  // it removes index range check on every interaction
  mapping(uint256 => bytes32) public filledSubtrees;
  mapping(uint256 => bytes32) public roots;
  uint32 public constant ROOT_HISTORY_SIZE = 30;
  uint32 public currentRootIndex = 0;
  uint32 public nextIndex = 0;

  constructor(uint32 _levels, IHasher _hasher) {
    require(_levels > 0, "_levels should be greater than zero");
    require(_levels < 32, "_levels should be less than 32");
    levels = _levels;
    hasher = _hasher;

    for (uint32 i = 0; i < _levels; i++) {
      filledSubtrees[i] = zeros(i);
    }

    roots[0] = zeros(_levels - 1);
  }

  /**
    @dev Hash 2 tree leaves, returns MiMC(_left, _right)
  */
  function hashLeftRight(
    IHasher _hasher,
    bytes32 _left,
    bytes32 _right
  ) public pure returns (bytes32) {
    require(uint256(_left) < FIELD_SIZE, "_left should be inside the field");
    require(uint256(_right) < FIELD_SIZE, "_right should be inside the field");
    uint256 R = uint256(_left);
    uint256 C = 0;
    (R, C) = _hasher.MiMCSponge(R, C);
    R = addmod(R, uint256(_right), FIELD_SIZE);
    (R, C) = _hasher.MiMCSponge(R, C);
    return bytes32(R);
  }

  function _insert(bytes32 _leaf) internal returns (uint32 index) {
    uint32 _nextIndex = nextIndex;
    require(_nextIndex != uint32(2)**levels, "Merkle tree is full. No more leaves can be added");
    uint32 currentIndex = _nextIndex;
    bytes32 currentLevelHash = _leaf;
    bytes32 left;
    bytes32 right;

    for (uint32 i = 0; i < levels; i++) {
      if (currentIndex % 2 == 0) {
        left = currentLevelHash;
        right = zeros(i);
        filledSubtrees[i] = currentLevelHash;
      } else {
        left = filledSubtrees[i];
        right = currentLevelHash;
      }
      currentLevelHash = hashLeftRight(hasher, left, right);
      currentIndex /= 2;
    }

    uint32 newRootIndex = (currentRootIndex + 1) % ROOT_HISTORY_SIZE;
    currentRootIndex = newRootIndex;
    roots[newRootIndex] = currentLevelHash;
    nextIndex = _nextIndex + 1;
    return _nextIndex;
  }

  /**
    @dev Whether the root is present in the root history
  */
  function isKnownRoot(bytes32 _root) public view returns (bool) {
    if (_root == 0) {
      return false;
    }
    uint32 _currentRootIndex = currentRootIndex;
    uint32 i = _currentRootIndex;
    do {
      if (_root == roots[i]) {
        return true;
      }
      if (i == 0) {
        i = ROOT_HISTORY_SIZE;
      }
      i--;
    } while (i != _currentRootIndex);
    return false;
  }

  /**
    @dev Returns the last root
  */
  function getLastRoot() public view returns (bytes32) {
    return roots[currentRootIndex];
  }

  /// @dev provides Zero (Empty) elements for a MiMC MerkleTree. Up to 32 levels
  function zeros(uint256 i) public pure returns (bytes32) {
    if (i == 0) return bytes32(0x2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c);
    else if (i == 1) return bytes32(0x256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d);
    else if (i == 2) return bytes32(0x1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c200);
    else if (i == 3) return bytes32(0x20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb);
    else if (i == 4) return bytes32(0x0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c9);
    else if (i == 5) return bytes32(0x24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb54959);
    else if (i == 6) return bytes32(0x1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c);
    else if (i == 7) return bytes32(0x19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb4);
    else if (i == 8) return bytes32(0x261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff80);
    else if (i == 9) return bytes32(0x0058459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c007);
    else if (i == 10) return bytes32(0x1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e30);
    else if (i == 11) return bytes32(0x1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e5);
    else if (i == 12) return bytes32(0x0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f);
    else if (i == 13) return bytes32(0x1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd);
    else if (i == 14) return bytes32(0x133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb108);
    else if (i == 15) return bytes32(0x13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b6);
    else if (i == 16) return bytes32(0x1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db61854);
    else if (i == 17) return bytes32(0x0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea);
    else if (i == 18) return bytes32(0x24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d);
    else if (i == 19) return bytes32(0x198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc05);
    else if (i == 20) return bytes32(0x29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d4);
    else if (i == 21) return bytes32(0x19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b2967);
    else if (i == 22) return bytes32(0x1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc3453);
    else if (i == 23) return bytes32(0x10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c48);
    else if (i == 24) return bytes32(0x0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd1);
    else if (i == 25) return bytes32(0x019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c);
    else if (i == 26) return bytes32(0x2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce99);
    else if (i == 27) return bytes32(0x2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f354);
    else if (i == 28) return bytes32(0x002df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d);
    else if (i == 29) return bytes32(0x104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f427);
    else if (i == 30) return bytes32(0x1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb);
    else if (i == 31) return bytes32(0x2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc);
    else revert("Index out of bounds");
  }
}

// File: @openzeppelin\contracts\utils\ReentrancyGuard.sol


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: contracts\Shifter.sol

pragma solidity ^0.7.0;




interface IVerifier {
  function verifyProof(bytes memory _proof, uint256[6] memory _input) external returns (bool);
}

abstract contract Shifter is MerkleTreeWithHistory, ReentrancyGuard {
  IVerifier public immutable verifier;
  IStorage public immutable noteStorage;
  uint256 public immutable denomination;
  uint256 public immutable ethDenomination;
  bytes32[] public allCommitments;
  uint256 public allCommitmentsLength = allCommitments.length;

  mapping(bytes32 => bool) public nullifierHashes;
  // we store all commitments just to prevent accidental deposits with the same commitment
  mapping(bytes32 => bool) public commitments;

  event Deposit(bytes32 indexed commitment, uint32 leafIndex, uint256 timestamp, address indexed depositor, uint256 ethDenomination, uint256 denomination);
  event Withdrawal(address to, bytes32 nullifierHash, address indexed relayer, uint256 fee);

  /**
    @dev The constructor
    @param _verifier the address of SNARK verifier for this contract
    @param _hasher the address of MiMC hash contract
    @param _storage the address of the storage contract
    @param _denomination transfer amount for each deposit
    @param _merkleTreeHeight the height of deposits' Merkle Tree
    @param _ethDenomination the amount of ETH to be deposted
  */
  constructor(
    IVerifier _verifier,
    IHasher _hasher,
    IStorage _storage,
    uint256 _denomination,
    uint256 _ethDenomination,
    uint32 _merkleTreeHeight
  ) MerkleTreeWithHistory(_merkleTreeHeight, _hasher) {
    require(_denomination > 0, "denomination should be greater than 0");
    noteStorage = _storage;
    verifier = _verifier;
    denomination = _denomination;
    ethDenomination = _ethDenomination;
  }
  
  /**
    @dev Return the entire commitment array
   */
  function commitmentList() public view returns (bytes32[] memory) {
    return allCommitments;
  }

  /**
    @dev Deposit funds into the contract. The caller must send (for ETH) or approve (for ERC20) value equal to or `denomination` of this instance.
    @param _commitment the note commitment, which is PedersenHash(nullifier + secret)
    @param _encryptedNote encrypted preimage, use xcrypt view for symmetrical encryption (unchecked)
    @param _passwordHash the hash of the password (unchecked)
  */
  function deposit(bytes32 _commitment, bytes calldata _encryptedNote, bytes32 _passwordHash) external payable nonReentrant {
    require(msg.value == ethDenomination, "Incorrect deposit value"); // Require fee for gas
    require(!commitments[_commitment], "The commitment has been submitted");
    uint32 insertedIndex = _insert(_commitment);
    allCommitments.push(_commitment);
    noteStorage.store(msg.sender, _encryptedNote, _passwordHash);
    commitments[_commitment] = true;
    _processDeposit();

    emit Deposit(_commitment, insertedIndex, block.timestamp, msg.sender, msg.value, denomination);
  }

  /** @dev this function is defined in a child contract */
  function _processDeposit() internal virtual;

  /**
    @dev Withdraw a deposit from the contract. `proof` is a zkSNARK proof data, and input is an array of circuit public inputs
    `input` array consists of:
      - merkle root of all deposits in the contract
      - hash of unique deposit nullifier to prevent double spends
      - the recipient of funds
      - optional fee that goes to the transaction sender (usually a relay)
  */
  function withdraw(
    bytes calldata _proof,
    bytes32 _root,
    bytes32 _nullifierHash,
    address payable _recipient,
    address payable _relayer,
    uint256 _fee,
    uint256 _refund
  ) external payable nonReentrant {
    require(_fee <= denomination, "Fee exceeds transfer value");
    require(!nullifierHashes[_nullifierHash], "The note has been already spent");
    require(isKnownRoot(_root), "Cannot find your merkle root"); // Make sure to use a recent one
    require(
      verifier.verifyProof(
        _proof,
        [uint256(_root), uint256(_nullifierHash), uint256(_recipient), uint256(_relayer), _fee, _refund]
      ),
      "Invalid withdraw proof"
    );

    nullifierHashes[_nullifierHash] = true;
    _processWithdraw(_recipient, _relayer, _fee, _refund);
    emit Withdrawal(_recipient, _nullifierHash, _relayer, _fee);
  }

  /** @dev this function is defined in a child contract */
  function _processWithdraw(
    address payable _recipient,
    address payable _relayer,
    uint256 _fee,
    uint256 _refund
  ) internal virtual;

  /** @dev whether a note is already spent */
  function isSpent(bytes32 _nullifierHash) public view returns (bool) {
    return nullifierHashes[_nullifierHash];
  }

  /** @dev whether an array of notes is already spent */
  function isSpentArray(bytes32[] calldata _nullifierHashes) external view returns (bool[] memory spent) {
    uint256 nullifierHashesLength = _nullifierHashes.length;
    spent = new bool[](nullifierHashesLength);
    for (uint256 i; i < nullifierHashesLength; i++) {
      if (isSpent(_nullifierHashes[i])) { 
        spent[i] = true;
      }
    }
  }
}

// File: contracts\Interfaces\ElasticIERC20.sol


pragma solidity >=0.6.0 <0.8.0;

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

    // Additional mint and burn functions
    function burn(address account, uint256 amount) external;
    function mint(address account, uint256 amount) external;

    /**
     * @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: @openzeppelin\contracts\math\SafeMath.sol


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin\contracts\utils\Address.sol


pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: contracts\Interfaces\SafeEERC20.sol


pragma solidity >=0.6.0 <0.8.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ElasticIERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeEERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(ElasticIERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(ElasticIERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {ElasticIERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(ElasticIERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(ElasticIERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(ElasticIERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(ElasticIERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts\Interfaces\IOracle.sol


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface for Oracle.sol contract
 */
interface IOracle {
    function getCost(
        uint256 _amount,
        address _chainlinkFeed,
        address _xftPool
    ) external view returns (uint256);

    function getCostSimpleShift(
        uint256 _amount,
        address _chainlinkFeed,
        address _xftPool,
        address _tokenPool
    ) external view returns (uint256);

    function getTokensForAmount(
        address _pool,
        uint32 _interval,
        address _chainlinkFeed,
        uint256 _amount,
        bool _ethLeftSide,
        address _weth9
    ) external view returns (uint256);

    function ethLeftSide(address _chainlinkFeed) external view returns (bool);

    function getTokensRaw(
        address _xftPool,
        address _tokenPool,
        uint32 _interval,
        uint256 _amount,
        address _weth9
    ) external view returns (uint256);

    function isTokenBelowThreshold(
        uint256 _threshold,
        address _pool,
        uint32 _interval,
        address _chainlinkFeed,
        bool _ethLeftSide,
        address _weth9
    ) external view returns (bool);
}

// File: node_modules\@openzeppelin\contracts\utils\Context.sol


pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

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

// File: @openzeppelin\contracts\utils\Pausable.sol


pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin\contracts\access\Ownable.sol


pragma solidity >=0.6.0 <0.8.0;

/**
 * @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 () internal {
        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: contracts\XFTanon.sol

pragma solidity ^0.7.0;








contract XFTanon is Shifter, Pausable, Ownable {
  using SafeEERC20 for ElasticIERC20;
  ElasticIERC20 public immutable xft;
  ElasticIERC20 public immutable token;
  IOracle public oracle;
  uint256 public tokenPrice;
  address public xftPool;
  address public tokenPool;
  address public weth9;
  address public chainlinkFeed;
  uint256 public flexFeeThreshold;
  bool public oracleActive = true;
  event SetOracle(address oracle);
  event SimpleShift(uint256 amount, address recipient, uint256 output);
  event SetFlexFeeThreshold(uint256 _threshold);
  event SetChainlinkFeed(address _chainlink);
  event SetPool(address _pool);

  constructor(
    IVerifier _verifier,
    IHasher _hasher,
    IStorage _storage,
    uint256 _denomination,
    uint256 _ethDenomination,
    uint32 _merkleTreeHeight,
    ElasticIERC20 _xft,
    ElasticIERC20 _token,
    IOracle _oracle,
    address _xftPool,
    address _tokenPool,
    address _weth9,
    address _chainlinkFeed,
    uint256 _flexFeeThreshold
  ) Shifter(_verifier, _hasher, _storage, _denomination, _ethDenomination, _merkleTreeHeight) {
    if (_tokenPool == address(0x0) || _xftPool == address(0x0)) oracleActive = false;
    oracle = _oracle;
    xft = _xft;
    token = _token;
    xftPool = _xftPool;
    tokenPool = _tokenPool;
    weth9 = _weth9;
    chainlinkFeed = _chainlinkFeed;
    flexFeeThreshold = _flexFeeThreshold;
  }
  function pause() external onlyOwner {
    _pause();
  }
  function setOracle(IOracle _oracle) external onlyOwner whenNotPaused {
    oracle = _oracle;
    emit SetOracle(address(_oracle));
  }
  function setChainlinkFeed(address _chainlink) external onlyOwner whenNotPaused {
    chainlinkFeed = _chainlink;
    emit SetChainlinkFeed(_chainlink);
  }
  function setXFTPool(address _xftPool) external onlyOwner whenNotPaused {
    xftPool = _xftPool;
    emit SetPool(_xftPool);
  }
  function setTokenPool(address _tokenPool) external onlyOwner whenNotPaused {
    tokenPool = _tokenPool;
    emit SetPool(_tokenPool);
  }
  function setFlexFeeThreshold(uint256 _threshold) external onlyOwner whenNotPaused {
    flexFeeThreshold = _threshold;
    emit SetFlexFeeThreshold(flexFeeThreshold);
  }
  function simpleShift(uint256 _amount, address _recipient) public whenNotPaused {
        require(token.balanceOf(msg.sender) >= _amount, "Insufficient balance");
        uint256 _output = oracle.getCostSimpleShift(_amount, chainlinkFeed, xftPool, tokenPool);
        token.burn(msg.sender, _amount);
        xft.mint(_recipient, _output);
        emit SimpleShift(_amount, _recipient, _output);
  }
  function getDenomination() external view returns (uint256) {
    return denomination;
  }

  function getCost(uint256 _amount) public view returns (uint256) {
    if (!oracleActive) return _amount;
    return oracle.getCost(_amount, chainlinkFeed, xftPool);
  }

  function _processDeposit() internal override whenNotPaused {
    uint256 depositCost = getCost(denomination);
    require(xft.balanceOf(msg.sender) >= depositCost, "Insufficient Balance");
    xft.burn(msg.sender, depositCost);
  }

  function _processWithdraw (
    address payable _recipient,
    address payable _relayer,
    uint256 _fee, // Fee is in USD
    uint256 _refund
  ) internal override {
    require(msg.value == _refund, "Incorrect refund amount received by the contract");
    token.mint(_recipient, denomination - _fee);
    if (_fee > 0) {
      token.mint(_relayer, _fee);
    }

    if (_refund + ethDenomination > 0) {
      (bool success, ) = _recipient.call{ value: _refund + ethDenomination }("");
      if (!success) {
        // let's return back to the relayer
        _relayer.transfer(_refund + ethDenomination);
      }
    }
    
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IVerifier","name":"_verifier","type":"address"},{"internalType":"contract IHasher","name":"_hasher","type":"address"},{"internalType":"contract IStorage","name":"_storage","type":"address"},{"internalType":"uint256","name":"_denomination","type":"uint256"},{"internalType":"uint256","name":"_ethDenomination","type":"uint256"},{"internalType":"uint32","name":"_merkleTreeHeight","type":"uint32"},{"internalType":"contract ElasticIERC20","name":"_xft","type":"address"},{"internalType":"contract ElasticIERC20","name":"_token","type":"address"},{"internalType":"contract IOracle","name":"_oracle","type":"address"},{"internalType":"address","name":"_xftPool","type":"address"},{"internalType":"address","name":"_tokenPool","type":"address"},{"internalType":"address","name":"_weth9","type":"address"},{"internalType":"address","name":"_chainlinkFeed","type":"address"},{"internalType":"uint256","name":"_flexFeeThreshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"commitment","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"leafIndex","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethDenomination","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"denomination","type":"uint256"}],"name":"Deposit","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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_chainlink","type":"address"}],"name":"SetChainlinkFeed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"SetFlexFeeThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oracle","type":"address"}],"name":"SetOracle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pool","type":"address"}],"name":"SetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"output","type":"uint256"}],"name":"SimpleShift","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes32","name":"nullifierHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"relayer","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"FIELD_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT_HISTORY_SIZE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_VALUE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allCommitments","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allCommitmentsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainlinkFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commitmentList","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"commitments","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRootIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"denomination","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_commitment","type":"bytes32"},{"internalType":"bytes","name":"_encryptedNote","type":"bytes"},{"internalType":"bytes32","name":"_passwordHash","type":"bytes32"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ethDenomination","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"filledSubtrees","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flexFeeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDenomination","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IHasher","name":"_hasher","type":"address"},{"internalType":"bytes32","name":"_left","type":"bytes32"},{"internalType":"bytes32","name":"_right","type":"bytes32"}],"name":"hashLeftRight","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"hasher","outputs":[{"internalType":"contract IHasher","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"isKnownRoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_nullifierHash","type":"bytes32"}],"name":"isSpent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_nullifierHashes","type":"bytes32[]"}],"name":"isSpentArray","outputs":[{"internalType":"bool[]","name":"spent","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"levels","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noteStorage","outputs":[{"internalType":"contract IStorage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"nullifierHashes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_chainlink","type":"address"}],"name":"setChainlinkFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"setFlexFeeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOracle","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenPool","type":"address"}],"name":"setTokenPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_xftPool","type":"address"}],"name":"setXFTPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"simpleShift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract ElasticIERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifier","outputs":[{"internalType":"contract IVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth9","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"bytes32","name":"_nullifierHash","type":"bytes32"},{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"address payable","name":"_relayer","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_refund","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"xft","outputs":[{"internalType":"contract ElasticIERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xftPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"zeros","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"}]

610180604052600280546001600160401b03191690556004546005556010805460ff191660011790553480156200003557600080fd5b5060405162003b3b38038062003b3b83398181016040526101c08110156200005c57600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516101408b01516101608c01516101808d01516101a0909d01519b9c9a9b999a9899979896979596949593949293919290918d8d8d8d8d8d808563ffffffff82166200010b5760405162461bcd60e51b815260040180806020018281038252602381526020018062003b186023913960400191505060405180910390fd5b60208263ffffffff161062000167576040805162461bcd60e51b815260206004820152601e60248201527f5f6c6576656c732073686f756c64206265206c657373207468616e2033320000604482015290519081900360640190fd5b6001600160e01b031960e083901b1660a0526001600160601b0319606082901b1660805260005b8263ffffffff168163ffffffff161015620001d357620001b463ffffffff8216620003ac565b63ffffffff82166000908152602081905260409020556001016200018e565b50620001e963ffffffff600019840116620003ac565b60008052600160208190527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49919091556003555050826200025c5760405162461bcd60e51b815260040180806020018281038252602581526020018062003af36025913960400191505060405180910390fd5b506001600160601b0319606093841b811660e0529490921b90931660c0526101009290925250610120526008805460ff1916905560006200029c62000a3a565b60088054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b03841615806200031057506001600160a01b038516155b1562000321576010805460ff191690555b600980546001600160a01b03199081166001600160a01b0398891617909155606098891b6001600160601b0319908116610140529790981b90961661016052600b8054881694861694909417909355600c8054871692851692909217909155600d80548616918416919091179055600e8054909416911617909155600f555062000a3e945050505050565b600081620003dc57507f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c62000a35565b81600114156200040e57507f256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d62000a35565b81600214156200044057507f1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c20062000a35565b81600314156200047257507f20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb62000a35565b8160041415620004a457507f0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c962000a35565b8160051415620004d657507f24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb5495962000a35565b81600614156200050857507f1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c62000a35565b81600714156200053a57507f19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb462000a35565b81600814156200056c57507f261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff8062000a35565b81600914156200059d57507e58459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c00762000a35565b81600a1415620005cf57507f1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e3062000a35565b81600b14156200060157507f1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e562000a35565b81600c14156200063357507f0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f62000a35565b81600d14156200066557507f1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd62000a35565b81600e14156200069757507f133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb10862000a35565b81600f1415620006c957507f13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b662000a35565b8160101415620006fb57507f1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db6185462000a35565b81601114156200072d57507f0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea62000a35565b81601214156200075f57507f24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d62000a35565b81601314156200079157507f198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc0562000a35565b8160141415620007c357507f29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d462000a35565b8160151415620007f557507f19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b296762000a35565b81601614156200082757507f1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc345362000a35565b81601714156200085957507f10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c4862000a35565b81601814156200088b57507f0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd162000a35565b8160191415620008bd57507f019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c62000a35565b81601a1415620008ef57507f2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce9962000a35565b81601b14156200092157507f2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f35462000a35565b81601c14156200095257507e2df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d62000a35565b81601d14156200098457507f104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f42762000a35565b81601e1415620009b657507f1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb62000a35565b81601f1415620009e857507f2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc62000a35565b6040805162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e647300000000000000000000000000604482015290519081900360640190fd5b919050565b3390565b60805160601c60a05160e01c60c05160601c60e05160601c61010051610120516101405160601c6101605160601c612fdc62000b176000398061125b528061140252806127a6528061281b52806128d5525080611464528061195c5280612c975280612d9f525080610ebc5280611d345280612965528061299e5280612a16525080610a8b5280610b0c52806110b45280611980528061284c5280612c6e525080610ff252806115b1525080610c3f5280610e3a5250806111285280612a805280612aec5250806126625280612b785250612fdc6000f3fe6080604052600436106102ae5760003560e01c806389aa6e0811610175578063c82ba2be116100dc578063e829558811610095578063f178e47c1161006f578063f178e47c146109de578063f2fde38b14610a08578063fc0c546a14610a3b578063fc7e9c6f14610a50576102ae565b8063e82955881461098a578063ec732959146109b4578063ed33639f146109c9576102ae565b8063c82ba2be146108e2578063cc59d277146108f7578063cd87a3b414610921578063d050786514610936578063d07e48aa1461094b578063e5285dcc14610960576102ae565b80639fa12d0b1161012e5780639fa12d0b1461077b578063ac98e82714610846578063ae24714c1461085b578063ba70f75714610870578063c2b40ae414610885578063c76b24df146108af576102ae565b806389aa6e08146106b55780638bca6d16146106ca5780638da5cb5b146106df5780638ea121a3146106f45780638ea3099e1461072757806390eeb02b14610766576102ae565b80636d9833e3116102195780637dc0d1d0116101d25780637dc0d1d01461060d5780637ff9b5961461062257806380493b9314610637578063839df945146106615780638456cb591461068b57806386f23a35146106a0576102ae565b80636d9833e31461053e578063706e9e7614610568578063715018a61461057d5780637764b4d2146105925780637adbf973146105c55780637dbdf1f5146105f8576102ae565b8063414a37ba1161026b578063414a37ba1461046e5780634ecf518b1461048357806350879c1c146104b15780635a4dd47d146104c65780635c975abb146104f05780636c26067714610505576102ae565b8063104e9929146102b357806317cc915c146102e45780631fc601c91461032257806321a0adb6146103495780632b7ac3f3146103e45780632f5fd8c6146103f9575b600080fd5b3480156102bf57600080fd5b506102c8610a65565b604080516001600160a01b039092168252519081900360200190f35b3480156102f057600080fd5b5061030e6004803603602081101561030757600080fd5b5035610a74565b604080519115158252519081900360200190f35b34801561032e57600080fd5b50610337610a89565b60408051918252519081900360200190f35b6103e2600480360360e081101561035f57600080fd5b810190602081018135600160201b81111561037957600080fd5b82018360208201111561038b57600080fd5b803590602001918460018302840111600160201b831117156103ac57600080fd5b91935091508035906020810135906001600160a01b03604082013581169160608101359091169060808101359060a00135610aad565b005b3480156103f057600080fd5b506102c8610e38565b6103e26004803603606081101561040f57600080fd5b81359190810190604081016020820135600160201b81111561043057600080fd5b82018360208201111561044257600080fd5b803590602001918460018302840111600160201b8311171561046357600080fd5b919350915035610e5c565b34801561047a57600080fd5b50610337611114565b34801561048f57600080fd5b50610498611126565b6040805163ffffffff9092168252519081900360200190f35b3480156104bd57600080fd5b506102c861114a565b3480156104d257600080fd5b50610337600480360360208110156104e957600080fd5b5035611159565b3480156104fc57600080fd5b5061030e611202565b34801561051157600080fd5b506103e26004803603604081101561052857600080fd5b50803590602001356001600160a01b031661120b565b34801561054a57600080fd5b5061030e6004803603602081101561056157600080fd5b503561153f565b34801561057457600080fd5b506102c86115af565b34801561058957600080fd5b506103e26115d3565b34801561059e57600080fd5b506103e2600480360360208110156105b557600080fd5b50356001600160a01b0316611685565b3480156105d157600080fd5b506103e2600480360360208110156105e857600080fd5b50356001600160a01b0316611788565b34801561060457600080fd5b506102c861188b565b34801561061957600080fd5b506102c861189a565b34801561062e57600080fd5b506103376118a9565b34801561064357600080fd5b506103376004803603602081101561065a57600080fd5b50356118af565b34801561066d57600080fd5b5061030e6004803603602081101561068457600080fd5b50356118d0565b34801561069757600080fd5b506103e26118e5565b3480156106ac57600080fd5b5061030e611951565b3480156106c157600080fd5b506102c861195a565b3480156106d657600080fd5b5061033761197e565b3480156106eb57600080fd5b506102c86119a2565b34801561070057600080fd5b506103e26004803603602081101561071757600080fd5b50356001600160a01b03166119b6565b34801561073357600080fd5b506103376004803603606081101561074a57600080fd5b506001600160a01b038135169060208101359060400135611ab9565b34801561077257600080fd5b50610498611c85565b34801561078757600080fd5b506107f66004803603602081101561079e57600080fd5b810190602081018135600160201b8111156107b857600080fd5b8201836020820111156107ca57600080fd5b803590602001918460208302840111600160201b831117156107eb57600080fd5b509092509050611c91565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561083257818101518382015260200161081a565b505050509050019250505060405180910390f35b34801561085257600080fd5b50610337611d32565b34801561086757600080fd5b50610337611d56565b34801561087c57600080fd5b50610337611d5c565b34801561089157600080fd5b50610337600480360360208110156108a857600080fd5b5035611d77565b3480156108bb57600080fd5b506103e2600480360360208110156108d257600080fd5b50356001600160a01b0316611d89565b3480156108ee57600080fd5b506107f6611e8c565b34801561090357600080fd5b506103e26004803603602081101561091a57600080fd5b5035611ee4565b34801561092d57600080fd5b50610498611fce565b34801561094257600080fd5b506102c8611fd3565b34801561095757600080fd5b50610337611fe2565b34801561096c57600080fd5b5061030e6004803603602081101561098357600080fd5b5035611fe8565b34801561099657600080fd5b50610337600480360360208110156109ad57600080fd5b5035611ffd565b3480156109c057600080fd5b5061033761263c565b3480156109d557600080fd5b506102c8612660565b3480156109ea57600080fd5b5061033760048036036020811015610a0157600080fd5b5035612684565b348015610a1457600080fd5b506103e260048036036020811015610a2b57600080fd5b50356001600160a01b0316612696565b348015610a4757600080fd5b506102c86127a4565b348015610a5c57600080fd5b506104986127c8565b600c546001600160a01b031681565b60066020526000908152604090205460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000090565b60026003541415610b05576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026003557f0000000000000000000000000000000000000000000000000000000000000000821115610b7f576040805162461bcd60e51b815260206004820152601a60248201527f4665652065786365656473207472616e736665722076616c7565000000000000604482015290519081900360640190fd5b60008581526006602052604090205460ff1615610be3576040805162461bcd60e51b815260206004820152601f60248201527f546865206e6f746520686173206265656e20616c7265616479207370656e7400604482015290519081900360640190fd5b610bec8661153f565b610c3d576040805162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742066696e6420796f7572206d65726b6c6520726f6f7400000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663695ef6f989896040518060c001604052808b60001c81526020018a60001c8152602001896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152506040518463ffffffff1660e01b8152600401808060200183600660200280838360005b83811015610cee578181015183820152602001610cd6565b505050509050018281038252858582818152602001925080828437600081840152601f19601f820116905080830192505050945050505050602060405180830381600087803b158015610d4057600080fd5b505af1158015610d54573d6000803e3d6000fd5b505050506040513d6020811015610d6a57600080fd5b5051610db6576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103bb4ba34323930bb90383937b7b360511b604482015290519081900360640190fd5b6000858152600660205260409020805460ff19166001179055610ddb848484846127db565b604080516001600160a01b038681168252602082018890528183018590529151918516917fe9e508bad6d4c3227e881ca19068f099da81b5164dd6d62b2eaf1e8bc6c349319181900360600190a250506001600355505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026003541415610eb4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600355347f000000000000000000000000000000000000000000000000000000000000000014610f2d576040805162461bcd60e51b815260206004820152601760248201527f496e636f7272656374206465706f7369742076616c7565000000000000000000604482015290519081900360640190fd5b60008481526007602052604090205460ff1615610f7b5760405162461bcd60e51b8152600401808060200182810382526021815260200180612f566021913960400191505060405180910390fd5b6000610f8685612a67565b6004805460018101825560008290527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018790556040516369dabc1360e11b81523391810182815260448201869052606060248301908152606483018890529394506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169363d3b578269392899289928992608401858580828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561106157600080fd5b505af1158015611075573d6000803e3d6000fd5b5050506000868152600760205260409020805460ff191660011790555061109a612c1a565b6040805163ffffffff8316815242602082015234818301527f000000000000000000000000000000000000000000000000000000000000000060608201529051339187917f2bbe99753c37b53c70399433c5f9bb95587299902df481e0cecc28c67776e9ba9181900360800190a350506001600355505050565b600080516020612f1683398151915281565b7f000000000000000000000000000000000000000000000000000000000000000081565b600d546001600160a01b031681565b60105460009060ff1661116d5750806111fd565b600954600e54600b546040805163096013cd60e11b8152600481018790526001600160a01b03938416602482015291831660448301525191909216916312c0279a916064808301926020929190829003018186803b1580156111ce57600080fd5b505afa1580156111e2573d6000803e3d6000fd5b505050506040513d60208110156111f857600080fd5b505190505b919050565b60085460ff1690565b611213611202565b15611258576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112c657600080fd5b505afa1580156112da573d6000803e3d6000fd5b505050506040513d60208110156112f057600080fd5b5051101561133c576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600954600e54600b54600c546040805163d577657d60e01b8152600481018890526001600160a01b0394851660248201529284166044840152908316606483015251600093929092169163d577657d91608480820192602092909190829003018186803b1580156113ac57600080fd5b505afa1580156113c0573d6000803e3d6000fd5b505050506040513d60208110156113d657600080fd5b505160408051632770a7eb60e21b81523360048201526024810186905290519192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639dc29fac9160448082019260009290919082900301818387803b15801561144a57600080fd5b505af115801561145e573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156114d957600080fd5b505af11580156114ed573d6000803e3d6000fd5b5050604080518681526001600160a01b038616602082015280820185905290517f72d11832dc4cb9122101cf2e7e611497ab526bc7af438ba7bd89dde9517923939350908190036060019150a1505050565b60008161154e575060006111fd565b60025463ffffffff16805b63ffffffff8116600090815260016020526040902054841415611581576001925050506111fd565b63ffffffff81166115905750601e5b6000190163ffffffff8082169083161415611559575060009392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6115db612dfa565b6001600160a01b03166115ec6119a2565b6001600160a01b031614611635576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b60085460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360088054610100600160a81b0319169055565b61168d612dfa565b6001600160a01b031661169e6119a2565b6001600160a01b0316146116e7576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6116ef611202565b15611734576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600c80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f67816c9262630d6052ccaada1732fda377aa9e9abb3bc91cfd887a016a18a43a9181900360200190a150565b611790612dfa565b6001600160a01b03166117a16119a2565b6001600160a01b0316146117ea576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6117f2611202565b15611837576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600980546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fd3b5d1e0ffaeff528910f3663f0adace7694ab8241d58e17a91351ced2e080319181900360200190a150565b600e546001600160a01b031681565b6009546001600160a01b031681565b600a5481565b600481815481106118bf57600080fd5b600091825260209091200154905081565b60076020526000908152604090205460ff1681565b6118ed612dfa565b6001600160a01b03166118fe6119a2565b6001600160a01b031614611947576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b61194f612dfe565b565b60105460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60085461010090046001600160a01b031690565b6119be612dfa565b6001600160a01b03166119cf6119a2565b6001600160a01b031614611a18576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611a20611202565b15611a65576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600e80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fb13eef744d54f8d44324b9b698a0e6ffca1c3f304cca39bd8c42ef9a948dccbe9181900360200190a150565b6000600080516020612f168339815191528310611b1d576040805162461bcd60e51b815260206004820181905260248201527f5f6c6566742073686f756c6420626520696e7369646520746865206669656c64604482015290519081900360640190fd5b600080516020612f168339815191528210611b695760405162461bcd60e51b8152600401808060200182810382526021815260200180612ef56021913960400191505060405180910390fd5b6040805163f47d33b560e01b8152600481018590526000602482018190528251869391926001600160a01b0389169263f47d33b592604480840193829003018186803b158015611bb857600080fd5b505afa158015611bcc573d6000803e3d6000fd5b505050506040513d6040811015611be257600080fd5b5080516020909101519092509050600080516020612f168339815191528483089150856001600160a01b031663f47d33b583836040518363ffffffff1660e01b81526004018083815260200182815260200192505050604080518083038186803b158015611c4f57600080fd5b505afa158015611c63573d6000803e3d6000fd5b505050506040513d6040811015611c7957600080fd5b50519695505050505050565b60025463ffffffff1681565b6060818067ffffffffffffffff81118015611cab57600080fd5b50604051908082528060200260200182016040528015611cd5578160200160208202803683370190505b50915060005b81811015611d2a57611cfe858583818110611cf257fe5b90506020020135611fe8565b15611d22576001838281518110611d1157fe5b911515602092830291909101909101525b600101611cdb565b505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60055481565b60025463ffffffff1660009081526001602052604090205490565b60016020526000908152604090205481565b611d91612dfa565b6001600160a01b0316611da26119a2565b6001600160a01b031614611deb576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611df3611202565b15611e38576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600b80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f67816c9262630d6052ccaada1732fda377aa9e9abb3bc91cfd887a016a18a43a9181900360200190a150565b60606004805480602002602001604051908101604052809291908181526020018280548015611eda57602002820191906000526020600020905b815481526020019060010190808311611ec6575b5050505050905090565b611eec612dfa565b6001600160a01b0316611efd6119a2565b6001600160a01b031614611f46576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611f4e611202565b15611f93576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600f8190556040805182815290517f55dcd7ccc8e8a64a6710ef7df032c7be305094fa356baeb1f626bfb0c53801a09181900360200190a150565b601e81565b600b546001600160a01b031681565b600f5481565b60009081526006602052604090205460ff1690565b60008161202b57507f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c6111fd565b816001141561205b57507f256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d6111fd565b816002141561208b57507f1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c2006111fd565b81600314156120bb57507f20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb6111fd565b81600414156120eb57507f0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c96111fd565b816005141561211b57507f24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb549596111fd565b816006141561214b57507f1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c6111fd565b816007141561217b57507f19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb46111fd565b81600814156121ab57507f261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff806111fd565b81600914156121da57507e58459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c0076111fd565b81600a141561220a57507f1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e306111fd565b81600b141561223a57507f1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e56111fd565b81600c141561226a57507f0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f6111fd565b81600d141561229a57507f1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd6111fd565b81600e14156122ca57507f133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb1086111fd565b81600f14156122fa57507f13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b66111fd565b816010141561232a57507f1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db618546111fd565b816011141561235a57507f0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea6111fd565b816012141561238a57507f24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d6111fd565b81601314156123ba57507f198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc056111fd565b81601414156123ea57507f29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d46111fd565b816015141561241a57507f19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b29676111fd565b816016141561244a57507f1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc34536111fd565b816017141561247a57507f10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c486111fd565b81601814156124aa57507f0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd16111fd565b81601914156124da57507f019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c6111fd565b81601a141561250a57507f2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce996111fd565b81601b141561253a57507f2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f3546111fd565b81601c141561256957507e2df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d6111fd565b81601d141561259957507f104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f4276111fd565b81601e14156125c957507f1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb6111fd565b81601f14156125f957507f2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc6111fd565b6040805162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b7f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c81565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006020819052908152604090205481565b61269e612dfa565b6001600160a01b03166126af6119a2565b6001600160a01b0316146126f8576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6001600160a01b03811661273d5760405162461bcd60e51b8152600401808060200182810382526026815260200180612e9f6026913960400191505060405180910390fd5b6008546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b600254600160201b900463ffffffff1681565b8034146128195760405162461bcd60e51b8152600401808060200182810382526030815260200180612ec56030913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1985847f0000000000000000000000000000000000000000000000000000000000000000036040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156128b257600080fd5b505af11580156128c6573d6000803e3d6000fd5b505050506000821115612963577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1984846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561294a57600080fd5b505af115801561295e573d6000803e3d6000fd5b505050505b7f0000000000000000000000000000000000000000000000000000000000000000810115612a61576040516000906001600160a01b038616907f00000000000000000000000000000000000000000000000000000000000000008401908381818185875af1925050503d80600081146129f8576040519150601f19603f3d011682016040523d82523d6000602084013e6129fd565b606091505b5050905080612a5f576040516001600160a01b038516907f0000000000000000000000000000000000000000000000000000000000000000840180156108fc02916000818181858888f19350505050158015612a5d573d6000803e3d6000fd5b505b505b50505050565b6002805460009163ffffffff600160201b9092048216917f0000000000000000000000000000000000000000000000000000000000000000811690910a16811415612ae35760405162461bcd60e51b8152600401808060200182810382526030815260200180612f776030913960400191505060405180910390fd5b8083600080805b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161015612bb45760018516612b5757839250612b388163ffffffff16611ffd565b63ffffffff821660009081526020819052604090208590559150612b73565b63ffffffff811660009081526020819052604090205492508391505b612b9e7f00000000000000000000000000000000000000000000000000000000000000008484611ab9565b9350600263ffffffff8616049450600101612aea565b505060028054601e63ffffffff8083166001908101821692909206811663ffffffff199093168317845560009283526020829052604090922094909455815493860116600160201b0267ffffffff00000000199093169290921790915550909392505050565b612c22611202565b15612c67576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000612c927f0000000000000000000000000000000000000000000000000000000000000000611159565b9050807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d0257600080fd5b505afa158015612d16573d6000803e3d6000fd5b505050506040513d6020811015612d2c57600080fd5b50511015612d78576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b60408051632770a7eb60e21b81523360048201526024810183905290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639dc29fac91604480830192600092919082900301818387803b158015612de657600080fd5b505af1158015612a5f573d6000803e3d6000fd5b3390565b612e06611202565b15612e4b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e81612dfa565b604080516001600160a01b039092168252519081900360200190a156fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e636f727265637420726566756e6420616d6f756e742072656365697665642062792074686520636f6e74726163745f72696768742073686f756c6420626520696e7369646520746865206669656c6430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000014f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657254686520636f6d6d69746d656e7420686173206265656e207375626d69747465644d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c65617665732063616e206265206164646564a26469706673582212209f1f1d612d9548d3bd7f680e9e90253aef1e3db414f055677c2d7fd313f6b62764736f6c6343000706003364656e6f6d696e6174696f6e2073686f756c642062652067726561746572207468616e20305f6c6576656c732073686f756c642062652067726561746572207468616e207a65726f000000000000000000000000cc76b5ea37a1beaae862d533b7795c4f2f9dbb7c000000000000000000000000484c0f23e30611b34f2fa503396a1a01c8951d330000000000000000000000008997f152a1da95fc7f966bddd64571c9ad11075e00000000000000000000000000000000000000000000001b1ae4d6e2ef50000000000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd0000000000000000000000000993a120c265ac7305347190579db9a28bae5fd2000000000000000000000000701b319aff36311f720f0a1ebd6636dd84bb3e8b00000000000000000000000012ded3d75fae8b27cd7f2b1a469fe088a3711dde000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000d87e55590018000

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c806389aa6e0811610175578063c82ba2be116100dc578063e829558811610095578063f178e47c1161006f578063f178e47c146109de578063f2fde38b14610a08578063fc0c546a14610a3b578063fc7e9c6f14610a50576102ae565b8063e82955881461098a578063ec732959146109b4578063ed33639f146109c9576102ae565b8063c82ba2be146108e2578063cc59d277146108f7578063cd87a3b414610921578063d050786514610936578063d07e48aa1461094b578063e5285dcc14610960576102ae565b80639fa12d0b1161012e5780639fa12d0b1461077b578063ac98e82714610846578063ae24714c1461085b578063ba70f75714610870578063c2b40ae414610885578063c76b24df146108af576102ae565b806389aa6e08146106b55780638bca6d16146106ca5780638da5cb5b146106df5780638ea121a3146106f45780638ea3099e1461072757806390eeb02b14610766576102ae565b80636d9833e3116102195780637dc0d1d0116101d25780637dc0d1d01461060d5780637ff9b5961461062257806380493b9314610637578063839df945146106615780638456cb591461068b57806386f23a35146106a0576102ae565b80636d9833e31461053e578063706e9e7614610568578063715018a61461057d5780637764b4d2146105925780637adbf973146105c55780637dbdf1f5146105f8576102ae565b8063414a37ba1161026b578063414a37ba1461046e5780634ecf518b1461048357806350879c1c146104b15780635a4dd47d146104c65780635c975abb146104f05780636c26067714610505576102ae565b8063104e9929146102b357806317cc915c146102e45780631fc601c91461032257806321a0adb6146103495780632b7ac3f3146103e45780632f5fd8c6146103f9575b600080fd5b3480156102bf57600080fd5b506102c8610a65565b604080516001600160a01b039092168252519081900360200190f35b3480156102f057600080fd5b5061030e6004803603602081101561030757600080fd5b5035610a74565b604080519115158252519081900360200190f35b34801561032e57600080fd5b50610337610a89565b60408051918252519081900360200190f35b6103e2600480360360e081101561035f57600080fd5b810190602081018135600160201b81111561037957600080fd5b82018360208201111561038b57600080fd5b803590602001918460018302840111600160201b831117156103ac57600080fd5b91935091508035906020810135906001600160a01b03604082013581169160608101359091169060808101359060a00135610aad565b005b3480156103f057600080fd5b506102c8610e38565b6103e26004803603606081101561040f57600080fd5b81359190810190604081016020820135600160201b81111561043057600080fd5b82018360208201111561044257600080fd5b803590602001918460018302840111600160201b8311171561046357600080fd5b919350915035610e5c565b34801561047a57600080fd5b50610337611114565b34801561048f57600080fd5b50610498611126565b6040805163ffffffff9092168252519081900360200190f35b3480156104bd57600080fd5b506102c861114a565b3480156104d257600080fd5b50610337600480360360208110156104e957600080fd5b5035611159565b3480156104fc57600080fd5b5061030e611202565b34801561051157600080fd5b506103e26004803603604081101561052857600080fd5b50803590602001356001600160a01b031661120b565b34801561054a57600080fd5b5061030e6004803603602081101561056157600080fd5b503561153f565b34801561057457600080fd5b506102c86115af565b34801561058957600080fd5b506103e26115d3565b34801561059e57600080fd5b506103e2600480360360208110156105b557600080fd5b50356001600160a01b0316611685565b3480156105d157600080fd5b506103e2600480360360208110156105e857600080fd5b50356001600160a01b0316611788565b34801561060457600080fd5b506102c861188b565b34801561061957600080fd5b506102c861189a565b34801561062e57600080fd5b506103376118a9565b34801561064357600080fd5b506103376004803603602081101561065a57600080fd5b50356118af565b34801561066d57600080fd5b5061030e6004803603602081101561068457600080fd5b50356118d0565b34801561069757600080fd5b506103e26118e5565b3480156106ac57600080fd5b5061030e611951565b3480156106c157600080fd5b506102c861195a565b3480156106d657600080fd5b5061033761197e565b3480156106eb57600080fd5b506102c86119a2565b34801561070057600080fd5b506103e26004803603602081101561071757600080fd5b50356001600160a01b03166119b6565b34801561073357600080fd5b506103376004803603606081101561074a57600080fd5b506001600160a01b038135169060208101359060400135611ab9565b34801561077257600080fd5b50610498611c85565b34801561078757600080fd5b506107f66004803603602081101561079e57600080fd5b810190602081018135600160201b8111156107b857600080fd5b8201836020820111156107ca57600080fd5b803590602001918460208302840111600160201b831117156107eb57600080fd5b509092509050611c91565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561083257818101518382015260200161081a565b505050509050019250505060405180910390f35b34801561085257600080fd5b50610337611d32565b34801561086757600080fd5b50610337611d56565b34801561087c57600080fd5b50610337611d5c565b34801561089157600080fd5b50610337600480360360208110156108a857600080fd5b5035611d77565b3480156108bb57600080fd5b506103e2600480360360208110156108d257600080fd5b50356001600160a01b0316611d89565b3480156108ee57600080fd5b506107f6611e8c565b34801561090357600080fd5b506103e26004803603602081101561091a57600080fd5b5035611ee4565b34801561092d57600080fd5b50610498611fce565b34801561094257600080fd5b506102c8611fd3565b34801561095757600080fd5b50610337611fe2565b34801561096c57600080fd5b5061030e6004803603602081101561098357600080fd5b5035611fe8565b34801561099657600080fd5b50610337600480360360208110156109ad57600080fd5b5035611ffd565b3480156109c057600080fd5b5061033761263c565b3480156109d557600080fd5b506102c8612660565b3480156109ea57600080fd5b5061033760048036036020811015610a0157600080fd5b5035612684565b348015610a1457600080fd5b506103e260048036036020811015610a2b57600080fd5b50356001600160a01b0316612696565b348015610a4757600080fd5b506102c86127a4565b348015610a5c57600080fd5b506104986127c8565b600c546001600160a01b031681565b60066020526000908152604090205460ff1681565b7f00000000000000000000000000000000000000000000001b1ae4d6e2ef50000090565b60026003541415610b05576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026003557f00000000000000000000000000000000000000000000001b1ae4d6e2ef500000821115610b7f576040805162461bcd60e51b815260206004820152601a60248201527f4665652065786365656473207472616e736665722076616c7565000000000000604482015290519081900360640190fd5b60008581526006602052604090205460ff1615610be3576040805162461bcd60e51b815260206004820152601f60248201527f546865206e6f746520686173206265656e20616c7265616479207370656e7400604482015290519081900360640190fd5b610bec8661153f565b610c3d576040805162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742066696e6420796f7572206d65726b6c6520726f6f7400000000604482015290519081900360640190fd5b7f000000000000000000000000cc76b5ea37a1beaae862d533b7795c4f2f9dbb7c6001600160a01b031663695ef6f989896040518060c001604052808b60001c81526020018a60001c8152602001896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152506040518463ffffffff1660e01b8152600401808060200183600660200280838360005b83811015610cee578181015183820152602001610cd6565b505050509050018281038252858582818152602001925080828437600081840152601f19601f820116905080830192505050945050505050602060405180830381600087803b158015610d4057600080fd5b505af1158015610d54573d6000803e3d6000fd5b505050506040513d6020811015610d6a57600080fd5b5051610db6576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103bb4ba34323930bb90383937b7b360511b604482015290519081900360640190fd5b6000858152600660205260409020805460ff19166001179055610ddb848484846127db565b604080516001600160a01b038681168252602082018890528183018590529151918516917fe9e508bad6d4c3227e881ca19068f099da81b5164dd6d62b2eaf1e8bc6c349319181900360600190a250506001600355505050505050565b7f000000000000000000000000cc76b5ea37a1beaae862d533b7795c4f2f9dbb7c81565b60026003541415610eb4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600355347f00000000000000000000000000000000000000000000000000b1a2bc2ec5000014610f2d576040805162461bcd60e51b815260206004820152601760248201527f496e636f7272656374206465706f7369742076616c7565000000000000000000604482015290519081900360640190fd5b60008481526007602052604090205460ff1615610f7b5760405162461bcd60e51b8152600401808060200182810382526021815260200180612f566021913960400191505060405180910390fd5b6000610f8685612a67565b6004805460018101825560008290527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018790556040516369dabc1360e11b81523391810182815260448201869052606060248301908152606483018890529394506001600160a01b037f0000000000000000000000008997f152a1da95fc7f966bddd64571c9ad11075e169363d3b578269392899289928992608401858580828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561106157600080fd5b505af1158015611075573d6000803e3d6000fd5b5050506000868152600760205260409020805460ff191660011790555061109a612c1a565b6040805163ffffffff8316815242602082015234818301527f00000000000000000000000000000000000000000000001b1ae4d6e2ef50000060608201529051339187917f2bbe99753c37b53c70399433c5f9bb95587299902df481e0cecc28c67776e9ba9181900360800190a350506001600355505050565b600080516020612f1683398151915281565b7f000000000000000000000000000000000000000000000000000000000000001481565b600d546001600160a01b031681565b60105460009060ff1661116d5750806111fd565b600954600e54600b546040805163096013cd60e11b8152600481018790526001600160a01b03938416602482015291831660448301525191909216916312c0279a916064808301926020929190829003018186803b1580156111ce57600080fd5b505afa1580156111e2573d6000803e3d6000fd5b505050506040513d60208110156111f857600080fd5b505190505b919050565b60085460ff1690565b611213611202565b15611258576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b817f0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd6001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112c657600080fd5b505afa1580156112da573d6000803e3d6000fd5b505050506040513d60208110156112f057600080fd5b5051101561133c576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600954600e54600b54600c546040805163d577657d60e01b8152600481018890526001600160a01b0394851660248201529284166044840152908316606483015251600093929092169163d577657d91608480820192602092909190829003018186803b1580156113ac57600080fd5b505afa1580156113c0573d6000803e3d6000fd5b505050506040513d60208110156113d657600080fd5b505160408051632770a7eb60e21b81523360048201526024810186905290519192506001600160a01b037f0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd1691639dc29fac9160448082019260009290919082900301818387803b15801561144a57600080fd5b505af115801561145e573d6000803e3d6000fd5b505050507f00000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae6001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156114d957600080fd5b505af11580156114ed573d6000803e3d6000fd5b5050604080518681526001600160a01b038616602082015280820185905290517f72d11832dc4cb9122101cf2e7e611497ab526bc7af438ba7bd89dde9517923939350908190036060019150a1505050565b60008161154e575060006111fd565b60025463ffffffff16805b63ffffffff8116600090815260016020526040902054841415611581576001925050506111fd565b63ffffffff81166115905750601e5b6000190163ffffffff8082169083161415611559575060009392505050565b7f0000000000000000000000008997f152a1da95fc7f966bddd64571c9ad11075e81565b6115db612dfa565b6001600160a01b03166115ec6119a2565b6001600160a01b031614611635576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b60085460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360088054610100600160a81b0319169055565b61168d612dfa565b6001600160a01b031661169e6119a2565b6001600160a01b0316146116e7576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6116ef611202565b15611734576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600c80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f67816c9262630d6052ccaada1732fda377aa9e9abb3bc91cfd887a016a18a43a9181900360200190a150565b611790612dfa565b6001600160a01b03166117a16119a2565b6001600160a01b0316146117ea576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6117f2611202565b15611837576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600980546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fd3b5d1e0ffaeff528910f3663f0adace7694ab8241d58e17a91351ced2e080319181900360200190a150565b600e546001600160a01b031681565b6009546001600160a01b031681565b600a5481565b600481815481106118bf57600080fd5b600091825260209091200154905081565b60076020526000908152604090205460ff1681565b6118ed612dfa565b6001600160a01b03166118fe6119a2565b6001600160a01b031614611947576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b61194f612dfe565b565b60105460ff1681565b7f00000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae81565b7f00000000000000000000000000000000000000000000001b1ae4d6e2ef50000081565b60085461010090046001600160a01b031690565b6119be612dfa565b6001600160a01b03166119cf6119a2565b6001600160a01b031614611a18576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611a20611202565b15611a65576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600e80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fb13eef744d54f8d44324b9b698a0e6ffca1c3f304cca39bd8c42ef9a948dccbe9181900360200190a150565b6000600080516020612f168339815191528310611b1d576040805162461bcd60e51b815260206004820181905260248201527f5f6c6566742073686f756c6420626520696e7369646520746865206669656c64604482015290519081900360640190fd5b600080516020612f168339815191528210611b695760405162461bcd60e51b8152600401808060200182810382526021815260200180612ef56021913960400191505060405180910390fd5b6040805163f47d33b560e01b8152600481018590526000602482018190528251869391926001600160a01b0389169263f47d33b592604480840193829003018186803b158015611bb857600080fd5b505afa158015611bcc573d6000803e3d6000fd5b505050506040513d6040811015611be257600080fd5b5080516020909101519092509050600080516020612f168339815191528483089150856001600160a01b031663f47d33b583836040518363ffffffff1660e01b81526004018083815260200182815260200192505050604080518083038186803b158015611c4f57600080fd5b505afa158015611c63573d6000803e3d6000fd5b505050506040513d6040811015611c7957600080fd5b50519695505050505050565b60025463ffffffff1681565b6060818067ffffffffffffffff81118015611cab57600080fd5b50604051908082528060200260200182016040528015611cd5578160200160208202803683370190505b50915060005b81811015611d2a57611cfe858583818110611cf257fe5b90506020020135611fe8565b15611d22576001838281518110611d1157fe5b911515602092830291909101909101525b600101611cdb565b505092915050565b7f00000000000000000000000000000000000000000000000000b1a2bc2ec5000081565b60055481565b60025463ffffffff1660009081526001602052604090205490565b60016020526000908152604090205481565b611d91612dfa565b6001600160a01b0316611da26119a2565b6001600160a01b031614611deb576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611df3611202565b15611e38576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600b80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f67816c9262630d6052ccaada1732fda377aa9e9abb3bc91cfd887a016a18a43a9181900360200190a150565b60606004805480602002602001604051908101604052809291908181526020018280548015611eda57602002820191906000526020600020905b815481526020019060010190808311611ec6575b5050505050905090565b611eec612dfa565b6001600160a01b0316611efd6119a2565b6001600160a01b031614611f46576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b611f4e611202565b15611f93576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600f8190556040805182815290517f55dcd7ccc8e8a64a6710ef7df032c7be305094fa356baeb1f626bfb0c53801a09181900360200190a150565b601e81565b600b546001600160a01b031681565b600f5481565b60009081526006602052604090205460ff1690565b60008161202b57507f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c6111fd565b816001141561205b57507f256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d6111fd565b816002141561208b57507f1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c2006111fd565b81600314156120bb57507f20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb6111fd565b81600414156120eb57507f0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c96111fd565b816005141561211b57507f24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb549596111fd565b816006141561214b57507f1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c6111fd565b816007141561217b57507f19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb46111fd565b81600814156121ab57507f261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff806111fd565b81600914156121da57507e58459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c0076111fd565b81600a141561220a57507f1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e306111fd565b81600b141561223a57507f1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e56111fd565b81600c141561226a57507f0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f6111fd565b81600d141561229a57507f1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd6111fd565b81600e14156122ca57507f133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb1086111fd565b81600f14156122fa57507f13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b66111fd565b816010141561232a57507f1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db618546111fd565b816011141561235a57507f0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea6111fd565b816012141561238a57507f24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d6111fd565b81601314156123ba57507f198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc056111fd565b81601414156123ea57507f29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d46111fd565b816015141561241a57507f19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b29676111fd565b816016141561244a57507f1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc34536111fd565b816017141561247a57507f10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c486111fd565b81601814156124aa57507f0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd16111fd565b81601914156124da57507f019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c6111fd565b81601a141561250a57507f2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce996111fd565b81601b141561253a57507f2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f3546111fd565b81601c141561256957507e2df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d6111fd565b81601d141561259957507f104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f4276111fd565b81601e14156125c957507f1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb6111fd565b81601f14156125f957507f2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc6111fd565b6040805162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b7f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c81565b7f000000000000000000000000484c0f23e30611b34f2fa503396a1a01c8951d3381565b60006020819052908152604090205481565b61269e612dfa565b6001600160a01b03166126af6119a2565b6001600160a01b0316146126f8576040805162461bcd60e51b81526020600482018190526024820152600080516020612f36833981519152604482015290519081900360640190fd5b6001600160a01b03811661273d5760405162461bcd60e51b8152600401808060200182810382526026815260200180612e9f6026913960400191505060405180910390fd5b6008546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd81565b600254600160201b900463ffffffff1681565b8034146128195760405162461bcd60e51b8152600401808060200182810382526030815260200180612ec56030913960400191505060405180910390fd5b7f0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd6001600160a01b03166340c10f1985847f00000000000000000000000000000000000000000000001b1ae4d6e2ef500000036040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156128b257600080fd5b505af11580156128c6573d6000803e3d6000fd5b505050506000821115612963577f0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd6001600160a01b03166340c10f1984846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561294a57600080fd5b505af115801561295e573d6000803e3d6000fd5b505050505b7f00000000000000000000000000000000000000000000000000b1a2bc2ec50000810115612a61576040516000906001600160a01b038616907f00000000000000000000000000000000000000000000000000b1a2bc2ec500008401908381818185875af1925050503d80600081146129f8576040519150601f19603f3d011682016040523d82523d6000602084013e6129fd565b606091505b5050905080612a5f576040516001600160a01b038516907f00000000000000000000000000000000000000000000000000b1a2bc2ec50000840180156108fc02916000818181858888f19350505050158015612a5d573d6000803e3d6000fd5b505b505b50505050565b6002805460009163ffffffff600160201b9092048216917f0000000000000000000000000000000000000000000000000000000000000014811690910a16811415612ae35760405162461bcd60e51b8152600401808060200182810382526030815260200180612f776030913960400191505060405180910390fd5b8083600080805b7f000000000000000000000000000000000000000000000000000000000000001463ffffffff168163ffffffff161015612bb45760018516612b5757839250612b388163ffffffff16611ffd565b63ffffffff821660009081526020819052604090208590559150612b73565b63ffffffff811660009081526020819052604090205492508391505b612b9e7f000000000000000000000000484c0f23e30611b34f2fa503396a1a01c8951d338484611ab9565b9350600263ffffffff8616049450600101612aea565b505060028054601e63ffffffff8083166001908101821692909206811663ffffffff199093168317845560009283526020829052604090922094909455815493860116600160201b0267ffffffff00000000199093169290921790915550909392505050565b612c22611202565b15612c67576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000612c927f00000000000000000000000000000000000000000000001b1ae4d6e2ef500000611159565b9050807f00000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae6001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d0257600080fd5b505afa158015612d16573d6000803e3d6000fd5b505050506040513d6020811015612d2c57600080fd5b50511015612d78576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b60408051632770a7eb60e21b81523360048201526024810183905290516001600160a01b037f00000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae1691639dc29fac91604480830192600092919082900301818387803b158015612de657600080fd5b505af1158015612a5f573d6000803e3d6000fd5b3390565b612e06611202565b15612e4b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e81612dfa565b604080516001600160a01b039092168252519081900360200190a156fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e636f727265637420726566756e6420616d6f756e742072656365697665642062792074686520636f6e74726163745f72696768742073686f756c6420626520696e7369646520746865206669656c6430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000014f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657254686520636f6d6d69746d656e7420686173206265656e207375626d69747465644d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c65617665732063616e206265206164646564a26469706673582212209f1f1d612d9548d3bd7f680e9e90253aef1e3db414f055677c2d7fd313f6b62764736f6c63430007060033

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

000000000000000000000000cc76b5ea37a1beaae862d533b7795c4f2f9dbb7c000000000000000000000000484c0f23e30611b34f2fa503396a1a01c8951d330000000000000000000000008997f152a1da95fc7f966bddd64571c9ad11075e00000000000000000000000000000000000000000000001b1ae4d6e2ef50000000000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd0000000000000000000000000993a120c265ac7305347190579db9a28bae5fd2000000000000000000000000701b319aff36311f720f0a1ebd6636dd84bb3e8b00000000000000000000000012ded3d75fae8b27cd7f2b1a469fe088a3711dde000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000d87e55590018000

-----Decoded View---------------
Arg [0] : _verifier (address): 0xCc76b5eA37A1beAAE862D533B7795c4F2F9DbB7C
Arg [1] : _hasher (address): 0x484C0f23E30611B34F2fa503396A1A01c8951d33
Arg [2] : _storage (address): 0x8997F152A1DA95Fc7f966bDdD64571c9ad11075e
Arg [3] : _denomination (uint256): 500000000000000000000
Arg [4] : _ethDenomination (uint256): 50000000000000000
Arg [5] : _merkleTreeHeight (uint32): 20
Arg [6] : _xft (address): 0x76BC677d444f1E9d57dAf5187ee2b7dC852745aE
Arg [7] : _token (address): 0x5a7E6C8204A1359DB9AAcab7bA5Fc309B7981eFd
Arg [8] : _oracle (address): 0x0993A120C265ac7305347190579Db9a28BAE5fD2
Arg [9] : _xftPool (address): 0x701B319AFF36311F720f0a1ebD6636Dd84Bb3E8B
Arg [10] : _tokenPool (address): 0x12DED3D75fAE8B27Cd7f2B1A469Fe088a3711DdE
Arg [11] : _weth9 (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [12] : _chainlinkFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [13] : _flexFeeThreshold (uint256): 975000000000000000

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 000000000000000000000000cc76b5ea37a1beaae862d533b7795c4f2f9dbb7c
Arg [1] : 000000000000000000000000484c0f23e30611b34f2fa503396a1a01c8951d33
Arg [2] : 0000000000000000000000008997f152a1da95fc7f966bddd64571c9ad11075e
Arg [3] : 00000000000000000000000000000000000000000000001b1ae4d6e2ef500000
Arg [4] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [6] : 00000000000000000000000076bc677d444f1e9d57daf5187ee2b7dc852745ae
Arg [7] : 0000000000000000000000005a7e6c8204a1359db9aacab7ba5fc309b7981efd
Arg [8] : 0000000000000000000000000993a120c265ac7305347190579db9a28bae5fd2
Arg [9] : 000000000000000000000000701b319aff36311f720f0a1ebd6636dd84bb3e8b
Arg [10] : 00000000000000000000000012ded3d75fae8b27cd7f2b1a469fe088a3711dde
Arg [11] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [12] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [13] : 0000000000000000000000000000000000000000000000000d87e55590018000


Deployed Bytecode Sourcemap

44720:3838:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44974:24;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;44974:24:0;;;;;;;;;;;;;;10826:47;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10826:47:0;;:::i;:::-;;;;;;;;;;;;;;;;;;47389:91;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13844:878;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13844:878:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13844:878:0;;;;;;;;;;;;-1:-1:-1;13844:878:0;-1:-1:-1;13844:878:0;;;;;;;;-1:-1:-1;;;;;13844:878:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10555:35;;;;;;;;;;;;;:::i;12706:621::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12706:621:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12706:621:0;;;;;;;;;;;;-1:-1:-1;12706:621:0;-1:-1:-1;12706:621:0;;:::i;636:114::-;;;;;;;;;;;;;:::i;949:30::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45003:20;;;;;;;;;;;;;:::i;47486:171::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47486:171:0;;:::i;41145:86::-;;;;;;;;;;;;;:::i;46981:404::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46981:404:0;;;;;;-1:-1:-1;;;;;46981:404:0;;:::i;3422:410::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3422:410:0;;:::i;10595:37::-;;;;;;;;;;;;;:::i;44091:148::-;;;;;;;;;;;;;:::i;46659:141::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46659:141:0;-1:-1:-1;;;;;46659:141:0;;:::i;46221:137::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46221:137:0;-1:-1:-1;;;;;46221:137:0;;:::i;45028:28::-;;;;;;;;;;;;;:::i;44891:21::-;;;;;;;;;;;;;:::i;44917:25::-;;;;;;;;;;;;;:::i;10724:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10724:31:0;;:::i;10970:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10970:43:0;;:::i;46160:57::-;;;;;;;;;;;;;:::i;45097:31::-;;;;;;;;;;;;;:::i;44811:34::-;;;;;;;;;;;;;:::i;10637:37::-;;;;;;;;;;;;;:::i;43440:87::-;;;;;;;;;;;;;:::i;46362:158::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46362:158:0;-1:-1:-1;;;;;46362:158:0;;:::i;1932:493::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1932:493:0;;;;;;;;;;;;;:::i;1429:34::-;;;;;;;;;;;;;:::i;15177:360::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15177:360:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15177:360:0;;;;;;;;;;-1:-1:-1;15177:360:0;;-1:-1:-1;15177:360:0;-1:-1:-1;15177:360:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10679:40;;;;;;;;;;;;;:::i;10760:59::-;;;;;;;;;;;;;:::i;3883:96::-;;;;;;;;;;;;;:::i;1334:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1334:40:0;;:::i;46524:131::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46524:131:0;-1:-1:-1;;;;;46524:131:0;;:::i;12188:99::-;;;;;;;;;;;;;:::i;46804:173::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46804:173:0;;:::i;1379:45::-;;;;;;;;;;;;;:::i;44947:22::-;;;;;;;;;;;;;:::i;45061:31::-;;;;;;;;;;;;;:::i;14994:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14994:119:0;;:::i;4067:3512::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4067:3512:0;;:::i;755:114::-;;;;;;;;;;;;;:::i;913:31::-;;;;;;;;;;;;;:::i;1280:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1280:49:0;;:::i;44394:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44394:244:0;-1:-1:-1;;;;;44394:244:0;;:::i;44850:36::-;;;;;;;;;;;;;:::i;1468:27::-;;;;;;;;;;;;;:::i;44974:24::-;;;-1:-1:-1;;;;;44974:24:0;;:::o;10826:47::-;;;;;;;;;;;;;;;:::o;47389:91::-;47462:12;47389:91;:::o;13844:878::-;9336:1;9942:7;;:19;;9934:63;;;;;-1:-1:-1;;;9934:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9336:1;10075:7;:18;14102:12:::1;14094:20:::0;::::1;;14086:59;;;::::0;;-1:-1:-1;;;14086:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;14161:31;::::0;;;:15:::1;:31;::::0;;;;;::::1;;14160:32;14152:76;;;::::0;;-1:-1:-1;;;14152:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;14243:18;14255:5;14243:11;:18::i;:::-;14235:59;;;::::0;;-1:-1:-1;;;14235:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;14350:8;-1:-1:-1::0;;;;;14350:20:0::1;;14381:6;;14350:153;;;;;;;;14407:5;14399:14;;14350:153;;;;14423:14;14415:23;;14350:153;;;;14448:10;-1:-1:-1::0;;;;;14440:19:0::1;14350:153;;;;14469:8;-1:-1:-1::0;;;;;14461:17:0::1;14350:153;;;;14480:4;14350:153;;;;14486:7;14350:153;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;14350:153:0;14334:209:::1;;;::::0;;-1:-1:-1;;;14334:209:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;14334:209:0;;;;;;;;;;;;;::::1;;14552:31;::::0;;;:15:::1;:31;::::0;;;;:38;;-1:-1:-1;;14552:38:0::1;14586:4;14552:38;::::0;;14597:53:::1;14614:10:::0;14626:8;14636:4;14642:7;14597:16:::1;:53::i;:::-;14662:54;::::0;;-1:-1:-1;;;;;14662:54:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;;9292:1:0;10254:7;:22;-1:-1:-1;;;;;;13844:878:0:o;10555:35::-;;;:::o;12706:621::-;9336:1;9942:7;;:19;;9934:63;;;;;-1:-1:-1;;;9934:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9336:1;10075:7;:18;12843:9:::1;12856:15;12843:28;12835:64;;;::::0;;-1:-1:-1;;;12835:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;12938:24;::::0;;;:11:::1;:24;::::0;;;;;::::1;;12937:25;12929:71;;;;-1:-1:-1::0;;;12929:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13007:20;13030;13038:11;13030:7;:20::i;:::-;13057:14;:32:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;13057:32:0;;;;::::1;::::0;;;13096:60:::1;::::0;-1:-1:-1;;;13096:60:0;;13114:10:::1;13096:60:::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;13007:43;;-1:-1:-1;;;;;;13096:11:0::1;:17;::::0;::::1;::::0;13114:10;13126:14;;;;13142:13;;13096:60;;13126:14;;;;13096:60;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;13163:24:0::1;::::0;;;:11:::1;:24;::::0;;;;:31;;-1:-1:-1;;13163:31:0::1;13190:4;13163:31;::::0;;-1:-1:-1;13201:17:0::1;:15;:17::i;:::-;13232:89;::::0;;::::1;::::0;::::1;::::0;;13268:15:::1;13232:89;::::0;::::1;::::0;13297:9:::1;13232:89:::0;;;;13308:12:::1;13232:89:::0;;;;;;13285:10:::1;::::0;13240:11;;13232:89:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;9292:1:0;10254:7;:22;-1:-1:-1;;;12706:621:0:o;636:114::-;-1:-1:-1;;;;;;;;;;;636:114:0;:::o;949:30::-;;;:::o;45003:20::-;;;-1:-1:-1;;;;;45003:20:0;;:::o;47486:171::-;47562:12;;47541:7;;47562:12;;47557:33;;-1:-1:-1;47583:7:0;47576:14;;47557:33;47604:6;;47628:13;;47643:7;;47604:47;;;-1:-1:-1;;;47604:47:0;;;;;;;;-1:-1:-1;;;;;47628:13:0;;;47604:47;;;;47643:7;;;47604:47;;;;;:6;;;;;:14;;:47;;;;;;;;;;;;;;:6;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47604:47:0;;-1:-1:-1;47486:171:0;;;;:::o;41145:86::-;41216:7;;;;41145:86;:::o;46981:404::-;41471:8;:6;:8::i;:::-;41470:9;41462:38;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;;;47110:7:::1;47079:5;-1:-1:-1::0;;;;;47079:15:0::1;;47095:10;47079:27;;;;;;;;;;;;;-1:-1:-1::0;;;;;47079:27:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47079:27:0;:38:::1;;47071:71;;;::::0;;-1:-1:-1;;;47071:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47071:71:0;;;;;;;;;;;;;::::1;;47171:6;::::0;47206:13:::1;::::0;47221:7:::1;::::0;47230:9:::1;::::0;47171:69:::1;::::0;;-1:-1:-1;;;47171:69:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;47206:13:0;;::::1;47171:69:::0;;;;47221:7;;::::1;47171:69:::0;;;;47230:9;;::::1;47171:69:::0;;;;;47153:15:::1;::::0;47171:6;;;::::1;::::0;:25:::1;::::0;:69;;;;;::::1;::::0;;;;;;;;;:6;:69;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47171:69:0;47251:31:::1;::::0;;-1:-1:-1;;;47251:31:0;;47262:10:::1;47251:31;::::0;::::1;::::0;;;;;;;;;47171:69;;-1:-1:-1;;;;;;47251:5:0::1;:10;::::0;::::1;::::0;:31;;;;;-1:-1:-1;;47251:31:0;;;;;;;;-1:-1:-1;47251:10:0;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47293:3;-1:-1:-1::0;;;;;47293:8:0::1;;47302:10;47314:7;47293:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;47293:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;47338:41:0::1;::::0;;;;;-1:-1:-1;;;;;47338:41:0;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;-1:-1:-1;47338:41:0;;;;;;;-1:-1:-1;47338:41:0::1;41511:1;46981:404:::0;;:::o;3422:410::-;3479:4;3496:10;3492:45;;-1:-1:-1;3524:5:0;3517:12;;3492:45;3570:16;;;;;3628:180;3653:8;;;;;;;:5;:8;;;;;;3644:17;;3640:55;;;3681:4;3674:11;;;;;;3640:55;3707:6;;;3703:54;;-1:-1:-1;1422:2:0;3703:54;-1:-1:-1;;3765:3:0;3784:22;;;;;;;;;3628:180;;-1:-1:-1;3821:5:0;;3422:410;-1:-1:-1;;;3422:410:0:o;10595:37::-;;;:::o;44091:148::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;44182:6:::1;::::0;44161:40:::1;::::0;44198:1:::1;::::0;44182:6:::1;::::0;::::1;-1:-1:-1::0;;;;;44182:6:0::1;::::0;44161:40:::1;::::0;44198:1;;44161:40:::1;44212:6;:19:::0;;-1:-1:-1;;;;;;44212:19:0::1;::::0;;44091:148::o;46659:141::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;41471:8:::1;:6;:8::i;:::-;41470:9;41462:38;;;::::0;;-1:-1:-1;;;41462:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;::::1;;46741:9:::2;:22:::0;;-1:-1:-1;;;;;46741:22:0;::::2;-1:-1:-1::0;;;;;;46741:22:0;;::::2;::::0;::::2;::::0;;;46775:19:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;46659:141:::0;:::o;46221:137::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;41471:8:::1;:6;:8::i;:::-;41470:9;41462:38;;;::::0;;-1:-1:-1;;;41462:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;::::1;;46297:6:::2;:16:::0;;-1:-1:-1;;;;;46297:16:0;::::2;-1:-1:-1::0;;;;;;46297:16:0;;::::2;::::0;::::2;::::0;;;46325:27:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;46221:137:::0;:::o;45028:28::-;;;-1:-1:-1;;;;;45028:28:0;;:::o;44891:21::-;;;-1:-1:-1;;;;;44891:21:0;;:::o;44917:25::-;;;;:::o;10724:31::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10724:31:0;:::o;10970:43::-;;;;;;;;;;;;;;;:::o;46160:57::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;46203:8:::1;:6;:8::i;:::-;46160:57::o:0;45097:31::-;;;;;;:::o;44811:34::-;;;:::o;10637:37::-;;;:::o;43440:87::-;43513:6;;;;;-1:-1:-1;;;;;43513:6:0;;43440:87::o;46362:158::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;41471:8:::1;:6;:8::i;:::-;41470:9;41462:38;;;::::0;;-1:-1:-1;;;41462:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;::::1;;46448:13:::2;:26:::0;;-1:-1:-1;;;;;46448:26:0;::::2;-1:-1:-1::0;;;;;;46448:26:0;;::::2;::::0;::::2;::::0;;;46486:28:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;46362:158:::0;:::o;1932:493::-;2044:7;-1:-1:-1;;;;;;;;;;;2068:27:0;;2060:72;;;;;-1:-1:-1;;;2060:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2147:28:0;;2139:74;;;;-1:-1:-1;;;2139:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2282:24;;;-1:-1:-1;;;2282:24:0;;;;;;;;2220:9;2282:24;;;;;;;;2240:5;;2220:9;;-1:-1:-1;;;;;2282:18:0;;;;;:24;;;;;;;;;;:18;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2282:24:0;;;;;;;;;-1:-1:-1;2282:24:0;-1:-1:-1;;;;;;;;;;;;2335:6:0;2324:1;2317:38;2313:42;;2371:7;-1:-1:-1;;;;;2371:18:0;;2390:1;2393;2371:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2371:24:0;;1932:493;-1:-1:-1;;;;;;1932:493:0:o;1429:34::-;;;;;;:::o;15177:360::-;15259:19;15319:16;;15357:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15357:33:0;;15349:41;;15402:9;15397:135;15417:21;15413:1;:25;15397:135;;;15458:28;15466:16;;15483:1;15466:19;;;;;;;;;;;;;15458:7;:28::i;:::-;15454:71;;;15511:4;15500:5;15506:1;15500:8;;;;;;;;:15;;;:8;;;;;;;;;;;:15;15454:71;15440:3;;15397:135;;;;15177:360;;;;;:::o;10679:40::-;;;:::o;10760:59::-;;;;:::o;3883:96::-;3956:16;;;;3927:7;3950:23;;;:5;:23;;;;;;3883:96;:::o;1334:40::-;;;;;;;;;;;;;:::o;46524:131::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;41471:8:::1;:6;:8::i;:::-;41470:9;41462:38;;;::::0;;-1:-1:-1;;;41462:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;::::1;;46602:7:::2;:18:::0;;-1:-1:-1;;;;;46602:18:0;::::2;-1:-1:-1::0;;;;;;46602:18:0;;::::2;::::0;::::2;::::0;;;46632:17:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;46524:131:::0;:::o;12188:99::-;12235:16;12267:14;12260:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12188:99;:::o;46804:173::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;41471:8:::1;:6;:8::i;:::-;41470:9;41462:38;;;::::0;;-1:-1:-1;;;41462:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;::::1;;46893:16:::2;:29:::0;;;46934:37:::2;::::0;;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;46804:173:::0;:::o;1379:45::-;1422:2;1379:45;:::o;44947:22::-;;;-1:-1:-1;;;;;44947:22:0;;:::o;45061:31::-;;;;:::o;14994:119::-;15056:4;15076:31;;;:15;:31;;;;;;;;;14994:119::o;4067:3512::-;4114:7;4134:6;4130:3443;;-1:-1:-1;4157:66:0;4142:82;;4130:3443;4240:1;4245;4240:6;4236:3337;;;-1:-1:-1;4263:66:0;4248:82;;4236:3337;4346:1;4351;4346:6;4342:3231;;;-1:-1:-1;4369:66:0;4354:82;;4342:3231;4452:1;4457;4452:6;4448:3125;;;-1:-1:-1;4475:66:0;4460:82;;4448:3125;4558:1;4563;4558:6;4554:3019;;;-1:-1:-1;4581:66:0;4566:82;;4554:3019;4664:1;4669;4664:6;4660:2913;;;-1:-1:-1;4687:66:0;4672:82;;4660:2913;4770:1;4775;4770:6;4766:2807;;;-1:-1:-1;4793:66:0;4778:82;;4766:2807;4876:1;4881;4876:6;4872:2701;;;-1:-1:-1;4899:66:0;4884:82;;4872:2701;4982:1;4987;4982:6;4978:2595;;;-1:-1:-1;5005:66:0;4990:82;;4978:2595;5088:1;5093;5088:6;5084:2489;;;-1:-1:-1;5111:66:0;5096:82;;5084:2489;5194:1;5199:2;5194:7;5190:2383;;;-1:-1:-1;5218:66:0;5203:82;;5190:2383;5301:1;5306:2;5301:7;5297:2276;;;-1:-1:-1;5325:66:0;5310:82;;5297:2276;5408:1;5413:2;5408:7;5404:2169;;;-1:-1:-1;5432:66:0;5417:82;;5404:2169;5515:1;5520:2;5515:7;5511:2062;;;-1:-1:-1;5539:66:0;5524:82;;5511:2062;5622:1;5627:2;5622:7;5618:1955;;;-1:-1:-1;5646:66:0;5631:82;;5618:1955;5729:1;5734:2;5729:7;5725:1848;;;-1:-1:-1;5753:66:0;5738:82;;5725:1848;5836:1;5841:2;5836:7;5832:1741;;;-1:-1:-1;5860:66:0;5845:82;;5832:1741;5943:1;5948:2;5943:7;5939:1634;;;-1:-1:-1;5967:66:0;5952:82;;5939:1634;6050:1;6055:2;6050:7;6046:1527;;;-1:-1:-1;6074:66:0;6059:82;;6046:1527;6157:1;6162:2;6157:7;6153:1420;;;-1:-1:-1;6181:66:0;6166:82;;6153:1420;6264:1;6269:2;6264:7;6260:1313;;;-1:-1:-1;6288:66:0;6273:82;;6260:1313;6371:1;6376:2;6371:7;6367:1206;;;-1:-1:-1;6395:66:0;6380:82;;6367:1206;6478:1;6483:2;6478:7;6474:1099;;;-1:-1:-1;6502:66:0;6487:82;;6474:1099;6585:1;6590:2;6585:7;6581:992;;;-1:-1:-1;6609:66:0;6594:82;;6581:992;6692:1;6697:2;6692:7;6688:885;;;-1:-1:-1;6716:66:0;6701:82;;6688:885;6799:1;6804:2;6799:7;6795:778;;;-1:-1:-1;6823:66:0;6808:82;;6795:778;6906:1;6911:2;6906:7;6902:671;;;-1:-1:-1;6930:66:0;6915:82;;6902:671;7013:1;7018:2;7013:7;7009:564;;;-1:-1:-1;7037:66:0;7022:82;;7009:564;7120:1;7125:2;7120:7;7116:457;;;-1:-1:-1;7144:66:0;7129:82;;7116:457;7227:1;7232:2;7227:7;7223:350;;;-1:-1:-1;7251:66:0;7236:82;;7223:350;7334:1;7339:2;7334:7;7330:243;;;-1:-1:-1;7358:66:0;7343:82;;7330:243;7441:1;7446:2;7441:7;7437:136;;;-1:-1:-1;7465:66:0;7450:82;;7437:136;7544:29;;;-1:-1:-1;;;7544:29:0;;;;;;;;;;;;-1:-1:-1;;;7544:29:0;;;;;;;;;;;;;;755:114;792:77;755:114;:::o;913:31::-;;;:::o;1280:49::-;;;;;;;;;;;;;;:::o;44394:244::-;43671:12;:10;:12::i;:::-;-1:-1:-1;;;;;43660:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43660:23:0;;43652:68;;;;;-1:-1:-1;;;43652:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43652:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44483:22:0;::::1;44475:73;;;;-1:-1:-1::0;;;44475:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44585:6;::::0;44564:38:::1;::::0;-1:-1:-1;;;;;44564:38:0;;::::1;::::0;44585:6:::1;::::0;::::1;;::::0;44564:38:::1;::::0;;;::::1;44613:6;:17:::0;;-1:-1:-1;;;;;44613:17:0;;::::1;;;-1:-1:-1::0;;;;;;44613:17:0;;::::1;::::0;;;::::1;::::0;;44394:244::o;44850:36::-;;;:::o;1468:27::-;;;-1:-1:-1;;;1468:27:0;;;;;:::o;47904:651::-;48104:7;48091:9;:20;48083:81;;;;-1:-1:-1;;;48083:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48171:5;-1:-1:-1;;;;;48171:10:0;;48182;48209:4;48194:12;:19;48171:43;;;;;;;;;;;;;-1:-1:-1;;;;;48171:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48232:1;48225:4;:8;48221:57;;;48244:5;-1:-1:-1;;;;;48244:10:0;;48255:8;48265:4;48244:26;;;;;;;;;;;;;-1:-1:-1;;;;;48244:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48221:57;48300:15;48290:25;;:29;48286:258;;48349:55;;48331:12;;-1:-1:-1;;;;;48349:15:0;;;48383;48373:25;;;48331:12;48349:55;48331:12;48349:55;48373:25;48349:15;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48330:74;;;48418:7;48413:124;;48483:44;;-1:-1:-1;;;;;48483:17:0;;;48511:15;48501:25;;48483:44;;;;;;;;;48501:25;48483:17;:44;;;;;;;;;;;;;;;;;;;;;48413:124;48286:258;;47904:651;;;;:::o;2431:914::-;2522:9;;;2481:12;;2522:9;-1:-1:-1;;;2522:9:0;;;;;;2571:6;2560:17;;;;;2546:31;;;;2538:92;;;;-1:-1:-1;;;2538:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2659:10;2703:5;2637:19;;;2756:371;2779:6;2775:10;;:1;:10;;;2756:371;;;2805:16;;;2801:231;;2846:16;2839:23;;2881:8;2887:1;2881:8;;:5;:8::i;:::-;2900:17;;;:14;:17;;;;;;;;;;:36;;;2873:16;-1:-1:-1;2801:231:0;;;2970:17;;;:14;:17;;;;;;;;;;;;-1:-1:-1;3006:16:0;;-1:-1:-1;2801:231:0;3059:34;3073:6;3081:4;3087:5;3059:13;:34::i;:::-;3040:53;-1:-1:-1;3118:1:0;3102:17;;;;;-1:-1:-1;2787:3:0;;2756:371;;;-1:-1:-1;;3158:16:0;;;1422:2;3157:42;3158:16;;;;:20;;;3157:42;;;;;;3206:31;;-1:-1:-1;;3206:31:0;;;;;;;-1:-1:-1;3244:19:0;;;;;;;;;;;:38;;;;3289:26;;3301:14;;;3289:26;-1:-1:-1;;;3289:26:0;-1:-1:-1;;3289:26:0;;;;;;;;;;-1:-1:-1;3301:14:0;;;-1:-1:-1;;;2431:914:0:o;47663:235::-;41471:8;:6;:8::i;:::-;41470:9;41462:38;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;;;47729:19:::1;47751:21;47759:12;47751:7;:21::i;:::-;47729:43;;47816:11;47787:3;-1:-1:-1::0;;;;;47787:13:0::1;;47801:10;47787:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;47787:25:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47787:25:0;:40:::1;;47779:73;;;::::0;;-1:-1:-1;;;47779:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47779:73:0;;;;;;;;;;;;;::::1;;47859:33;::::0;;-1:-1:-1;;;47859:33:0;;47868:10:::1;47859:33;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;47859:3:0::1;:8;::::0;::::1;::::0;:33;;;;;-1:-1:-1;;47859:33:0;;;;;;;-1:-1:-1;47859:8:0;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;39704:106:::0;39792:10;39704:106;:::o;41945:118::-;41471:8;:6;:8::i;:::-;41470:9;41462:38;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;-1:-1:-1;;;41462:38:0;;;;;;;;;;;;;;;42005:7:::1;:14:::0;;-1:-1:-1;;42005:14:0::1;42015:4;42005:14;::::0;;42035:20:::1;42042:12;:10;:12::i;:::-;42035:20;::::0;;-1:-1:-1;;;;;42035:20:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;41945:118::o:0

Swarm Source

ipfs://9f1f1d612d9548d3bd7f680e9e90253aef1e3db414f055677c2d7fd313f6b627

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Offshift Anon Shifter Contract: 500 anonUSD denomination

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.