ETH Price: $2,078.39 (-1.05%)

Contract

0xcEEeF2Fc15B9A9e5Cc8549FcB238575B409D07E2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...190823112024-01-25 8:03:11779 days ago1706169791IN
0xcEEeF2Fc...B409D07E2
0 ETH0.0004018613.99632083
Update Fee Addre...190822912024-01-25 7:59:11779 days ago1706169551IN
0xcEEeF2Fc...B409D07E2
0 ETH0.000335911.58223078
Update Fee190822892024-01-25 7:58:47779 days ago1706169527IN
0xcEEeF2Fc...B409D07E2
0 ETH0.0006025912.50383117
Transfer Ownersh...190731912024-01-24 1:21:23780 days ago1706059283IN
0xcEEeF2Fc...B409D07E2
0 ETH0.0003353211.67897951

Latest 6 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer190825482024-01-25 8:50:35778 days ago1706172635
0xcEEeF2Fc...B409D07E2
0.00001 ETH
Transfer190825482024-01-25 8:50:35778 days ago1706172635
0xcEEeF2Fc...B409D07E2
0.09999 ETH
Deposit190825392024-01-25 8:48:47778 days ago1706172527
0xcEEeF2Fc...B409D07E2
0.1 ETH
Transfer190824702024-01-25 8:34:59778 days ago1706171699
0xcEEeF2Fc...B409D07E2
0.00001 ETH
Transfer190824702024-01-25 8:34:59778 days ago1706171699
0xcEEeF2Fc...B409D07E2
0.09999 ETH
Deposit190824572024-01-25 8:32:23779 days ago1706171543
0xcEEeF2Fc...B409D07E2
0.1 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ETHMixshit

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

import "./Mixshit.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract ETHMixshit is Mixshit, Ownable {
  uint256 public fee = 0;
  uint256 public feeDecimal = 10000;
  address public feeReceiveAddress;

  constructor(
    IVerifier _verifier,
    IHasher _hasher,
    uint256 _denomination,
    uint256 _fee,
    uint256 _feeDecimal,
    uint32 _merkleTreeHeight
  ) Mixshit(_verifier, _hasher, _denomination, _merkleTreeHeight) {
    feeReceiveAddress = msg.sender;
    fee = _fee;
    feeDecimal = _feeDecimal;
  }

  /** @dev update fee */
  function updateFee(uint256 _fee, uint256 _feeDecimal) external onlyOwner {
    fee = _fee;
    feeDecimal = _feeDecimal;
  }

  /** @dev update fee receive address */
  function updateFeeAddress(address _feeReceiveAddress) external onlyOwner {
    feeReceiveAddress = _feeReceiveAddress;
  }

  function _processDeposit() internal override {
    require(msg.value == denomination, "Please send `mixDenomination` ETH along with transaction");
  }

  function _processWithdraw(
    address payable _recipient,
    address payable _relayer,
    uint256 _fee,
    uint256 _refund
  ) internal override {
    // sanity checks
    require(msg.value == 0, "Message value is supposed to be zero for ETH instance");
    require(_refund == 0, "Refund value is supposed to be zero for ETH instance");

    uint256 _newFee = (denomination * fee) / feeDecimal;

    require(_newFee < denomination, "fee is supposed to be less than denomination");
    
    (bool success, ) = _recipient.call{ value: denomination - _newFee }("");
    require(success, "payment to _recipient did not go thru");
    if (_newFee > 0) {
      (success, ) = feeReceiveAddress.call{ value: _newFee }("");
      require(success, "payment to _relayer did not go thru");
    }
  }
}

File 2 of 6 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

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;
    }
}

// SPDX-License-Identifier: MIT

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;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () 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;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

import "./MerkleTreeWithHistory.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";

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

abstract contract Mixshit is MerkleTreeWithHistory, ReentrancyGuard {
  IVerifier public immutable verifier;
  uint256 public denomination;
  
  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);
  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 _denomination transfer amount for each deposit
    @param _merkleTreeHeight the height of deposits' Merkle Tree
  */
  constructor(
    IVerifier _verifier,
    IHasher _hasher,
    uint256 _denomination,
    uint32 _merkleTreeHeight
  ) MerkleTreeWithHistory(_merkleTreeHeight, _hasher) {
    require(_denomination > 0, "denomination should be greater than 0");
    verifier = _verifier;
    denomination = _denomination;
  }

  /**
    @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)
  */
  function deposit(bytes32 _commitment) external payable nonReentrant {
    require(!commitments[_commitment], "The commitment has been submitted");

    uint32 insertedIndex = _insert(_commitment);
    commitments[_commitment] = true;
    _processDeposit();

    emit Deposit(_commitment, insertedIndex, block.timestamp);
  }

  /** @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) {
    spent = new bool[](_nullifierHashes.length);
    for (uint256 i = 0; i < _nullifierHashes.length; i++) {
      if (isSpent(_nullifierHashes[i])) {
        spent[i] = true;
      }
    }
  }
}

// SPDX-License-Identifier: MIT
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;
  IHasher public immutable hasher;

  uint32 public 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");
  }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IVerifier","name":"_verifier","type":"address"},{"internalType":"contract IHasher","name":"_hasher","type":"address"},{"internalType":"uint256","name":"_denomination","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_feeDecimal","type":"uint256"},{"internalType":"uint32","name":"_merkleTreeHeight","type":"uint32"}],"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"}],"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":"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":"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"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDecimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceiveAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"filledSubtrees","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"nullifierHashes","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":"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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_feeDecimal","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeReceiveAddress","type":"address"}],"name":"updateFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifier","outputs":[{"internalType":"contract IVerifier","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":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"zeros","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"}]

60c0604052600380546001600160401b03191690556000600955612710600a553480156200002c57600080fd5b506040516200282038038062002820833981810160405260c08110156200005257600080fd5b508051602082015160408301516060840151608085015160a090950151939492939192909185858583808363ffffffff8216620000c15760405162461bcd60e51b8152600401808060200182810382526023815260200180620027fd6023913960400191505060405180910390fd5b60208263ffffffff16106200011d576040805162461bcd60e51b815260206004820152601e60248201527f5f6c6576656c732073686f756c64206265206c657373207468616e2033320000604482015290519081900360640190fd5b6000805463ffffffff191663ffffffff8416178155606082901b6001600160601b0319166080525b8263ffffffff168163ffffffff1610156200018e576200016b63ffffffff8216620002ac565b63ffffffff82166000908152600160208190526040909120919091550162000145565b50620001a463ffffffff600019840116620002ac565b6000805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b555050600160045581620002145760405162461bcd60e51b8152600401808060200182810382526025815260200180620027d86025913960400191505060405180910390fd5b5060609290921b6001600160601b03191660a052506005556000620002386200093a565b600880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050600b80546001600160a01b03191633179055600991909155600a55506200093e915050565b600081620002dc57507f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c62000935565b81600114156200030e57507f256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d62000935565b81600214156200034057507f1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c20062000935565b81600314156200037257507f20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb62000935565b8160041415620003a457507f0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c962000935565b8160051415620003d657507f24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb5495962000935565b81600614156200040857507f1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c62000935565b81600714156200043a57507f19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb462000935565b81600814156200046c57507f261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff8062000935565b81600914156200049d57507e58459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c00762000935565b81600a1415620004cf57507f1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e3062000935565b81600b14156200050157507f1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e562000935565b81600c14156200053357507f0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f62000935565b81600d14156200056557507f1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd62000935565b81600e14156200059757507f133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb10862000935565b81600f1415620005c957507f13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b662000935565b8160101415620005fb57507f1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db6185462000935565b81601114156200062d57507f0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea62000935565b81601214156200065f57507f24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d62000935565b81601314156200069157507f198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc0562000935565b8160141415620006c357507f29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d462000935565b8160151415620006f557507f19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b296762000935565b81601614156200072757507f1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc345362000935565b81601714156200075957507f10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c4862000935565b81601814156200078b57507f0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd162000935565b8160191415620007bd57507f019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c62000935565b81601a1415620007ef57507f2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce9962000935565b81601b14156200082157507f2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f35462000935565b81601c14156200085257507e2df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d62000935565b81601d14156200088457507f104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f42762000935565b81601e1415620008b657507f1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb62000935565b81601f1415620008e857507f2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc62000935565b6040805162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f6620626f756e647300000000000000000000000000604482015290519081900360640190fd5b919050565b3390565b60805160601c60a05160601c611e6662000972600039806108645280610acc5250806117375280611b5f5250611e666000f3fe6080604052600436106101c25760003560e01c806390eeb02b116100f7578063ddca3f4311610095578063ed33639f11610064578063ed33639f14610654578063f178e47c14610669578063f2fde38b14610693578063fc7e9c6f146106c6576101c2565b8063ddca3f43146105d6578063e5285dcc146105eb578063e829558814610615578063ec7329591461063f576101c2565b8063ba70f757116100d1578063ba70f7571461054f578063bbcaac3814610564578063c2b40ae414610597578063cd87a3b4146105c1576101c2565b806390eeb02b146104525780639fa12d0b14610467578063b214faa514610532576101c2565b80636d9833e311610164578063839df9451161013e578063839df945146103bf5780638bca6d16146103e95780638da5cb5b146103fe5780638ea3099e14610413576101c2565b80636d9833e31461036b578063715018a6146103955780637e11b31f146103aa576101c2565b80632b7ac3f3116101a05780632b7ac3f3146102d0578063414a37ba146103015780634ecf518b146103285780634f14cd6114610356576101c2565b806317cc915c146101c757806321a0adb6146102055780632740c197146102a0575b600080fd5b3480156101d357600080fd5b506101f1600480360360208110156101ea57600080fd5b50356106db565b604080519115158252519081900360200190f35b61029e600480360360e081101561021b57600080fd5b810190602081018135600160201b81111561023557600080fd5b82018360208201111561024757600080fd5b803590602001918460018302840111600160201b8311171561026857600080fd5b91935091508035906020810135906001600160a01b03604082013581169160608101359091169060808101359060a001356106f0565b005b3480156102ac57600080fd5b5061029e600480360360408110156102c357600080fd5b5080359060200135610a5d565b3480156102dc57600080fd5b506102e5610aca565b604080516001600160a01b039092168252519081900360200190f35b34801561030d57600080fd5b50610316610aee565b60408051918252519081900360200190f35b34801561033457600080fd5b5061033d610b00565b6040805163ffffffff9092168252519081900360200190f35b34801561036257600080fd5b506102e5610b0c565b34801561037757600080fd5b506101f16004803603602081101561038e57600080fd5b5035610b1b565b3480156103a157600080fd5b5061029e610b8d565b3480156103b657600080fd5b50610316610c39565b3480156103cb57600080fd5b506101f1600480360360208110156103e257600080fd5b5035610c3f565b3480156103f557600080fd5b50610316610c54565b34801561040a57600080fd5b506102e5610c5a565b34801561041f57600080fd5b506103166004803603606081101561043657600080fd5b506001600160a01b038135169060208101359060400135610c69565b34801561045e57600080fd5b5061033d610e35565b34801561047357600080fd5b506104e26004803603602081101561048a57600080fd5b810190602081018135600160201b8111156104a457600080fd5b8201836020820111156104b657600080fd5b803590602001918460208302840111600160201b831117156104d757600080fd5b509092509050610e41565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561051e578181015183820152602001610506565b505050509050019250505060405180910390f35b61029e6004803603602081101561054857600080fd5b5035610ee0565b34801561055b57600080fd5b50610316611001565b34801561057057600080fd5b5061029e6004803603602081101561058757600080fd5b50356001600160a01b031661101c565b3480156105a357600080fd5b50610316600480360360208110156105ba57600080fd5b50356110a0565b3480156105cd57600080fd5b5061033d6110b2565b3480156105e257600080fd5b506103166110b7565b3480156105f757600080fd5b506101f16004803603602081101561060e57600080fd5b50356110bd565b34801561062157600080fd5b506103166004803603602081101561063857600080fd5b50356110d2565b34801561064b57600080fd5b50610316611711565b34801561066057600080fd5b506102e5611735565b34801561067557600080fd5b506103166004803603602081101561068c57600080fd5b5035611759565b34801561069f57600080fd5b5061029e600480360360208110156106b657600080fd5b50356001600160a01b031661176b565b3480156106d257600080fd5b5061033d61186e565b60066020526000908152604090205460ff1681565b60026004541415610748576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026004556005548211156107a4576040805162461bcd60e51b815260206004820152601a60248201527f4665652065786365656473207472616e736665722076616c7565000000000000604482015290519081900360640190fd5b60008581526006602052604090205460ff1615610808576040805162461bcd60e51b815260206004820152601f60248201527f546865206e6f746520686173206265656e20616c7265616479207370656e7400604482015290519081900360640190fd5b61081186610b1b565b610862576040805162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742066696e6420796f7572206d65726b6c6520726f6f7400000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663695ef6f989896040518060c001604052808b60001c81526020018a60001c8152602001896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152506040518463ffffffff1660e01b8152600401808060200183600660200280838360005b838110156109135781810151838201526020016108fb565b505050509050018281038252858582818152602001925080828437600081840152601f19601f820116905080830192505050945050505050602060405180830381600087803b15801561096557600080fd5b505af1158015610979573d6000803e3d6000fd5b505050506040513d602081101561098f57600080fd5b50516109db576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103bb4ba34323930bb90383937b7b360511b604482015290519081900360640190fd5b6000858152600660205260409020805460ff19166001179055610a0084848484611881565b604080516001600160a01b038681168252602082018890528183018590529151918516917fe9e508bad6d4c3227e881ca19068f099da81b5164dd6d62b2eaf1e8bc6c349319181900360600190a250506001600455505050505050565b610a65611a89565b6001600160a01b0316610a76610c5a565b6001600160a01b031614610abf576040805162461bcd60e51b81526020600482018190526024820152600080516020611d17833981519152604482015290519081900360640190fd5b600991909155600a55565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080516020611cf783398151915281565b60005463ffffffff1681565b600b546001600160a01b031681565b600081610b2a57506000610b88565b60035463ffffffff16805b63ffffffff8116600090815260026020526040902054841415610b5d57600192505050610b88565b63ffffffff8116610b6c5750601e5b6000190163ffffffff8082169083161415610b35576000925050505b919050565b610b95611a89565b6001600160a01b0316610ba6610c5a565b6001600160a01b031614610bef576040805162461bcd60e51b81526020600482018190526024820152600080516020611d17833981519152604482015290519081900360640190fd5b6008546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600880546001600160a01b0319169055565b600a5481565b60076020526000908152604090205460ff1681565b60055481565b6008546001600160a01b031690565b6000600080516020611cf78339815191528310610ccd576040805162461bcd60e51b815260206004820181905260248201527f5f6c6566742073686f756c6420626520696e7369646520746865206669656c64604482015290519081900360640190fd5b600080516020611cf78339815191528210610d195760405162461bcd60e51b8152600401808060200182810382526021815260200180611ca26021913960400191505060405180910390fd5b6040805163f47d33b560e01b8152600481018590526000602482018190528251869391926001600160a01b0389169263f47d33b592604480840193829003018186803b158015610d6857600080fd5b505afa158015610d7c573d6000803e3d6000fd5b505050506040513d6040811015610d9257600080fd5b5080516020909101519092509050600080516020611cf78339815191528483089150856001600160a01b031663f47d33b583836040518363ffffffff1660e01b81526004018083815260200182815260200192505050604080518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6040811015610e2957600080fd5b50519695505050505050565b60035463ffffffff1681565b60608167ffffffffffffffff81118015610e5a57600080fd5b50604051908082528060200260200182016040528015610e84578160200160208202803683370190505b50905060005b82811015610ed957610ead848483818110610ea157fe5b905060200201356110bd565b15610ed1576001828281518110610ec057fe5b911515602092830291909101909101525b600101610e8a565b5092915050565b60026004541415610f38576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260045560008181526007602052604090205460ff1615610f8b5760405162461bcd60e51b8152600401808060200182810382526021815260200180611d376021913960400191505060405180910390fd5b6000610f9682611a8d565b6000838152600760205260409020805460ff191660011790559050610fb9611c01565b6040805163ffffffff83168152426020820152815184927fa945e51eec50ab98c161376f0db4cf2aeba3ec92755fe2fcd388bdbbb80ff196928290030190a250506001600455565b60035463ffffffff1660009081526002602052604090205490565b611024611a89565b6001600160a01b0316611035610c5a565b6001600160a01b03161461107e576040805162461bcd60e51b81526020600482018190526024820152600080516020611d17833981519152604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60026020526000908152604090205481565b601e81565b60095481565b60009081526006602052604090205460ff1690565b60008161110057507f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c610b88565b816001141561113057507f256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d610b88565b816002141561116057507f1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c200610b88565b816003141561119057507f20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb610b88565b81600414156111c057507f0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c9610b88565b81600514156111f057507f24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb54959610b88565b816006141561122057507f1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c610b88565b816007141561125057507f19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb4610b88565b816008141561128057507f261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff80610b88565b81600914156112af57507e58459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c007610b88565b81600a14156112df57507f1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e30610b88565b81600b141561130f57507f1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e5610b88565b81600c141561133f57507f0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f610b88565b81600d141561136f57507f1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd610b88565b81600e141561139f57507f133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb108610b88565b81600f14156113cf57507f13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b6610b88565b81601014156113ff57507f1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db61854610b88565b816011141561142f57507f0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea610b88565b816012141561145f57507f24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d610b88565b816013141561148f57507f198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc05610b88565b81601414156114bf57507f29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d4610b88565b81601514156114ef57507f19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b2967610b88565b816016141561151f57507f1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc3453610b88565b816017141561154f57507f10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c48610b88565b816018141561157f57507f0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd1610b88565b81601914156115af57507f019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c610b88565b81601a14156115df57507f2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce99610b88565b81601b141561160f57507f2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f354610b88565b81601c141561163e57507e2df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d610b88565b81601d141561166e57507f104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f427610b88565b81601e141561169e57507f1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb610b88565b81601f14156116ce57507f2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc610b88565b6040805162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b7f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c81565b7f000000000000000000000000000000000000000000000000000000000000000081565b60016020526000908152604090205481565b611773611a89565b6001600160a01b0316611784610c5a565b6001600160a01b0316146117cd576040805162461bcd60e51b81526020600482018190526024820152600080516020611d17833981519152604482015290519081900360640190fd5b6001600160a01b0381166118125760405162461bcd60e51b8152600401808060200182810382526026815260200180611c446026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b600354600160201b900463ffffffff1681565b34156118be5760405162461bcd60e51b8152600401808060200182810382526035815260200180611dfc6035913960400191505060405180910390fd5b80156118fb5760405162461bcd60e51b8152600401808060200182810382526034815260200180611cc36034913960400191505060405180910390fd5b6000600a54600954600554028161190e57fe5b04905060055481106119515760405162461bcd60e51b815260040180806020018281038252602c815260200180611dd0602c913960400191505060405180910390fd5b6005546040516000916001600160a01b0388169190849003908381818185875af1925050503d80600081146119a2576040519150601f19603f3d011682016040523d82523d6000602084013e6119a7565b606091505b50509050806119e75760405162461bcd60e51b8152600401808060200182810382526025815260200180611d586025913960400191505060405180910390fd5b8115611a8157600b546040516001600160a01b03909116908390600081818185875af1925050503d8060008114611a3a576040519150601f19603f3d011682016040523d82523d6000602084013e611a3f565b606091505b50508091505080611a815760405162461bcd60e51b8152600401808060200182810382526023815260200180611d7d6023913960400191505060405180910390fd5b505050505050565b3390565b60035460008054909163ffffffff600160201b909104811691811660020a16811415611aea5760405162461bcd60e51b8152600401808060200182810382526030815260200180611da06030913960400191505060405180910390fd5b8083600080805b60005463ffffffff9081169082161015611b9b5760018516611b3e57839250611b1f8163ffffffff166110d2565b63ffffffff821660009081526001602052604090208590559150611b5a565b63ffffffff811660009081526001602052604090205492508391505b611b857f00000000000000000000000000000000000000000000000000000000000000008484610c69565b9350600263ffffffff8616049450600101611af1565b505060038054601e63ffffffff8083166001908101821692909206811663ffffffff199093168317845560009283526002602052604090922094909455815493860116600160201b0267ffffffff00000000199093169290921790915550909392505050565b6005543414611c415760405162461bcd60e51b8152600401808060200182810382526038815260200180611c6a6038913960400191505060405180910390fd5b56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373506c656173652073656e6420606d697844656e6f6d696e6174696f6e602045544820616c6f6e672077697468207472616e73616374696f6e5f72696768742073686f756c6420626520696e7369646520746865206669656c64526566756e642076616c756520697320737570706f73656420746f206265207a65726f20666f722045544820696e7374616e636530644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000014f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657254686520636f6d6d69746d656e7420686173206265656e207375626d69747465647061796d656e7420746f205f726563697069656e7420646964206e6f7420676f20746872757061796d656e7420746f205f72656c6179657220646964206e6f7420676f20746872754d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c65617665732063616e20626520616464656466656520697320737570706f73656420746f206265206c657373207468616e2064656e6f6d696e6174696f6e4d6573736167652076616c756520697320737570706f73656420746f206265207a65726f20666f722045544820696e7374616e6365a264697066735822122030981d774dade977dafdde39173648c4004072eca2dc82ac32941abca129dd1464736f6c6343000706003364656e6f6d696e6174696f6e2073686f756c642062652067726561746572207468616e20305f6c6576656c732073686f756c642062652067726561746572207468616e207a65726f000000000000000000000000fc172a63c66b0474e64bb6a2a7b66eb071b229490000000000000000000000005fd50db4675d107ca40145f4620df4552dfd601a000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000014

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806390eeb02b116100f7578063ddca3f4311610095578063ed33639f11610064578063ed33639f14610654578063f178e47c14610669578063f2fde38b14610693578063fc7e9c6f146106c6576101c2565b8063ddca3f43146105d6578063e5285dcc146105eb578063e829558814610615578063ec7329591461063f576101c2565b8063ba70f757116100d1578063ba70f7571461054f578063bbcaac3814610564578063c2b40ae414610597578063cd87a3b4146105c1576101c2565b806390eeb02b146104525780639fa12d0b14610467578063b214faa514610532576101c2565b80636d9833e311610164578063839df9451161013e578063839df945146103bf5780638bca6d16146103e95780638da5cb5b146103fe5780638ea3099e14610413576101c2565b80636d9833e31461036b578063715018a6146103955780637e11b31f146103aa576101c2565b80632b7ac3f3116101a05780632b7ac3f3146102d0578063414a37ba146103015780634ecf518b146103285780634f14cd6114610356576101c2565b806317cc915c146101c757806321a0adb6146102055780632740c197146102a0575b600080fd5b3480156101d357600080fd5b506101f1600480360360208110156101ea57600080fd5b50356106db565b604080519115158252519081900360200190f35b61029e600480360360e081101561021b57600080fd5b810190602081018135600160201b81111561023557600080fd5b82018360208201111561024757600080fd5b803590602001918460018302840111600160201b8311171561026857600080fd5b91935091508035906020810135906001600160a01b03604082013581169160608101359091169060808101359060a001356106f0565b005b3480156102ac57600080fd5b5061029e600480360360408110156102c357600080fd5b5080359060200135610a5d565b3480156102dc57600080fd5b506102e5610aca565b604080516001600160a01b039092168252519081900360200190f35b34801561030d57600080fd5b50610316610aee565b60408051918252519081900360200190f35b34801561033457600080fd5b5061033d610b00565b6040805163ffffffff9092168252519081900360200190f35b34801561036257600080fd5b506102e5610b0c565b34801561037757600080fd5b506101f16004803603602081101561038e57600080fd5b5035610b1b565b3480156103a157600080fd5b5061029e610b8d565b3480156103b657600080fd5b50610316610c39565b3480156103cb57600080fd5b506101f1600480360360208110156103e257600080fd5b5035610c3f565b3480156103f557600080fd5b50610316610c54565b34801561040a57600080fd5b506102e5610c5a565b34801561041f57600080fd5b506103166004803603606081101561043657600080fd5b506001600160a01b038135169060208101359060400135610c69565b34801561045e57600080fd5b5061033d610e35565b34801561047357600080fd5b506104e26004803603602081101561048a57600080fd5b810190602081018135600160201b8111156104a457600080fd5b8201836020820111156104b657600080fd5b803590602001918460208302840111600160201b831117156104d757600080fd5b509092509050610e41565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561051e578181015183820152602001610506565b505050509050019250505060405180910390f35b61029e6004803603602081101561054857600080fd5b5035610ee0565b34801561055b57600080fd5b50610316611001565b34801561057057600080fd5b5061029e6004803603602081101561058757600080fd5b50356001600160a01b031661101c565b3480156105a357600080fd5b50610316600480360360208110156105ba57600080fd5b50356110a0565b3480156105cd57600080fd5b5061033d6110b2565b3480156105e257600080fd5b506103166110b7565b3480156105f757600080fd5b506101f16004803603602081101561060e57600080fd5b50356110bd565b34801561062157600080fd5b506103166004803603602081101561063857600080fd5b50356110d2565b34801561064b57600080fd5b50610316611711565b34801561066057600080fd5b506102e5611735565b34801561067557600080fd5b506103166004803603602081101561068c57600080fd5b5035611759565b34801561069f57600080fd5b5061029e600480360360208110156106b657600080fd5b50356001600160a01b031661176b565b3480156106d257600080fd5b5061033d61186e565b60066020526000908152604090205460ff1681565b60026004541415610748576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026004556005548211156107a4576040805162461bcd60e51b815260206004820152601a60248201527f4665652065786365656473207472616e736665722076616c7565000000000000604482015290519081900360640190fd5b60008581526006602052604090205460ff1615610808576040805162461bcd60e51b815260206004820152601f60248201527f546865206e6f746520686173206265656e20616c7265616479207370656e7400604482015290519081900360640190fd5b61081186610b1b565b610862576040805162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742066696e6420796f7572206d65726b6c6520726f6f7400000000604482015290519081900360640190fd5b7f000000000000000000000000fc172a63c66b0474e64bb6a2a7b66eb071b229496001600160a01b031663695ef6f989896040518060c001604052808b60001c81526020018a60001c8152602001896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152506040518463ffffffff1660e01b8152600401808060200183600660200280838360005b838110156109135781810151838201526020016108fb565b505050509050018281038252858582818152602001925080828437600081840152601f19601f820116905080830192505050945050505050602060405180830381600087803b15801561096557600080fd5b505af1158015610979573d6000803e3d6000fd5b505050506040513d602081101561098f57600080fd5b50516109db576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103bb4ba34323930bb90383937b7b360511b604482015290519081900360640190fd5b6000858152600660205260409020805460ff19166001179055610a0084848484611881565b604080516001600160a01b038681168252602082018890528183018590529151918516917fe9e508bad6d4c3227e881ca19068f099da81b5164dd6d62b2eaf1e8bc6c349319181900360600190a250506001600455505050505050565b610a65611a89565b6001600160a01b0316610a76610c5a565b6001600160a01b031614610abf576040805162461bcd60e51b81526020600482018190526024820152600080516020611d17833981519152604482015290519081900360640190fd5b600991909155600a55565b7f000000000000000000000000fc172a63c66b0474e64bb6a2a7b66eb071b2294981565b600080516020611cf783398151915281565b60005463ffffffff1681565b600b546001600160a01b031681565b600081610b2a57506000610b88565b60035463ffffffff16805b63ffffffff8116600090815260026020526040902054841415610b5d57600192505050610b88565b63ffffffff8116610b6c5750601e5b6000190163ffffffff8082169083161415610b35576000925050505b919050565b610b95611a89565b6001600160a01b0316610ba6610c5a565b6001600160a01b031614610bef576040805162461bcd60e51b81526020600482018190526024820152600080516020611d17833981519152604482015290519081900360640190fd5b6008546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600880546001600160a01b0319169055565b600a5481565b60076020526000908152604090205460ff1681565b60055481565b6008546001600160a01b031690565b6000600080516020611cf78339815191528310610ccd576040805162461bcd60e51b815260206004820181905260248201527f5f6c6566742073686f756c6420626520696e7369646520746865206669656c64604482015290519081900360640190fd5b600080516020611cf78339815191528210610d195760405162461bcd60e51b8152600401808060200182810382526021815260200180611ca26021913960400191505060405180910390fd5b6040805163f47d33b560e01b8152600481018590526000602482018190528251869391926001600160a01b0389169263f47d33b592604480840193829003018186803b158015610d6857600080fd5b505afa158015610d7c573d6000803e3d6000fd5b505050506040513d6040811015610d9257600080fd5b5080516020909101519092509050600080516020611cf78339815191528483089150856001600160a01b031663f47d33b583836040518363ffffffff1660e01b81526004018083815260200182815260200192505050604080518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6040811015610e2957600080fd5b50519695505050505050565b60035463ffffffff1681565b60608167ffffffffffffffff81118015610e5a57600080fd5b50604051908082528060200260200182016040528015610e84578160200160208202803683370190505b50905060005b82811015610ed957610ead848483818110610ea157fe5b905060200201356110bd565b15610ed1576001828281518110610ec057fe5b911515602092830291909101909101525b600101610e8a565b5092915050565b60026004541415610f38576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260045560008181526007602052604090205460ff1615610f8b5760405162461bcd60e51b8152600401808060200182810382526021815260200180611d376021913960400191505060405180910390fd5b6000610f9682611a8d565b6000838152600760205260409020805460ff191660011790559050610fb9611c01565b6040805163ffffffff83168152426020820152815184927fa945e51eec50ab98c161376f0db4cf2aeba3ec92755fe2fcd388bdbbb80ff196928290030190a250506001600455565b60035463ffffffff1660009081526002602052604090205490565b611024611a89565b6001600160a01b0316611035610c5a565b6001600160a01b03161461107e576040805162461bcd60e51b81526020600482018190526024820152600080516020611d17833981519152604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60026020526000908152604090205481565b601e81565b60095481565b60009081526006602052604090205460ff1690565b60008161110057507f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c610b88565b816001141561113057507f256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d610b88565b816002141561116057507f1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c200610b88565b816003141561119057507f20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb610b88565b81600414156111c057507f0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c9610b88565b81600514156111f057507f24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb54959610b88565b816006141561122057507f1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c610b88565b816007141561125057507f19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb4610b88565b816008141561128057507f261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff80610b88565b81600914156112af57507e58459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c007610b88565b81600a14156112df57507f1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e30610b88565b81600b141561130f57507f1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e5610b88565b81600c141561133f57507f0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f610b88565b81600d141561136f57507f1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd610b88565b81600e141561139f57507f133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb108610b88565b81600f14156113cf57507f13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b6610b88565b81601014156113ff57507f1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db61854610b88565b816011141561142f57507f0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea610b88565b816012141561145f57507f24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d610b88565b816013141561148f57507f198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc05610b88565b81601414156114bf57507f29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d4610b88565b81601514156114ef57507f19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b2967610b88565b816016141561151f57507f1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc3453610b88565b816017141561154f57507f10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c48610b88565b816018141561157f57507f0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd1610b88565b81601914156115af57507f019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c610b88565b81601a14156115df57507f2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce99610b88565b81601b141561160f57507f2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f354610b88565b81601c141561163e57507e2df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d610b88565b81601d141561166e57507f104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f427610b88565b81601e141561169e57507f1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb610b88565b81601f14156116ce57507f2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc610b88565b6040805162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b7f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c81565b7f0000000000000000000000005fd50db4675d107ca40145f4620df4552dfd601a81565b60016020526000908152604090205481565b611773611a89565b6001600160a01b0316611784610c5a565b6001600160a01b0316146117cd576040805162461bcd60e51b81526020600482018190526024820152600080516020611d17833981519152604482015290519081900360640190fd5b6001600160a01b0381166118125760405162461bcd60e51b8152600401808060200182810382526026815260200180611c446026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b600354600160201b900463ffffffff1681565b34156118be5760405162461bcd60e51b8152600401808060200182810382526035815260200180611dfc6035913960400191505060405180910390fd5b80156118fb5760405162461bcd60e51b8152600401808060200182810382526034815260200180611cc36034913960400191505060405180910390fd5b6000600a54600954600554028161190e57fe5b04905060055481106119515760405162461bcd60e51b815260040180806020018281038252602c815260200180611dd0602c913960400191505060405180910390fd5b6005546040516000916001600160a01b0388169190849003908381818185875af1925050503d80600081146119a2576040519150601f19603f3d011682016040523d82523d6000602084013e6119a7565b606091505b50509050806119e75760405162461bcd60e51b8152600401808060200182810382526025815260200180611d586025913960400191505060405180910390fd5b8115611a8157600b546040516001600160a01b03909116908390600081818185875af1925050503d8060008114611a3a576040519150601f19603f3d011682016040523d82523d6000602084013e611a3f565b606091505b50508091505080611a815760405162461bcd60e51b8152600401808060200182810382526023815260200180611d7d6023913960400191505060405180910390fd5b505050505050565b3390565b60035460008054909163ffffffff600160201b909104811691811660020a16811415611aea5760405162461bcd60e51b8152600401808060200182810382526030815260200180611da06030913960400191505060405180910390fd5b8083600080805b60005463ffffffff9081169082161015611b9b5760018516611b3e57839250611b1f8163ffffffff166110d2565b63ffffffff821660009081526001602052604090208590559150611b5a565b63ffffffff811660009081526001602052604090205492508391505b611b857f0000000000000000000000005fd50db4675d107ca40145f4620df4552dfd601a8484610c69565b9350600263ffffffff8616049450600101611af1565b505060038054601e63ffffffff8083166001908101821692909206811663ffffffff199093168317845560009283526002602052604090922094909455815493860116600160201b0267ffffffff00000000199093169290921790915550909392505050565b6005543414611c415760405162461bcd60e51b8152600401808060200182810382526038815260200180611c6a6038913960400191505060405180910390fd5b56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373506c656173652073656e6420606d697844656e6f6d696e6174696f6e602045544820616c6f6e672077697468207472616e73616374696f6e5f72696768742073686f756c6420626520696e7369646520746865206669656c64526566756e642076616c756520697320737570706f73656420746f206265207a65726f20666f722045544820696e7374616e636530644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000014f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657254686520636f6d6d69746d656e7420686173206265656e207375626d69747465647061796d656e7420746f205f726563697069656e7420646964206e6f7420676f20746872757061796d656e7420746f205f72656c6179657220646964206e6f7420676f20746872754d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c65617665732063616e20626520616464656466656520697320737570706f73656420746f206265206c657373207468616e2064656e6f6d696e6174696f6e4d6573736167652076616c756520697320737570706f73656420746f206265207a65726f20666f722045544820696e7374616e6365a264697066735822122030981d774dade977dafdde39173648c4004072eca2dc82ac32941abca129dd1464736f6c63430007060033

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

000000000000000000000000fc172a63c66b0474e64bb6a2a7b66eb071b229490000000000000000000000005fd50db4675d107ca40145f4620df4552dfd601a000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000014

-----Decoded View---------------
Arg [0] : _verifier (address): 0xfc172a63C66B0474E64bB6A2A7b66EB071B22949
Arg [1] : _hasher (address): 0x5fD50dB4675D107cA40145F4620dF4552DFd601a
Arg [2] : _denomination (uint256): 100000000000000000
Arg [3] : _fee (uint256): 0
Arg [4] : _feeDecimal (uint256): 10000
Arg [5] : _merkleTreeHeight (uint32): 20

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000fc172a63c66b0474e64bb6a2a7b66eb071b22949
Arg [1] : 0000000000000000000000005fd50db4675d107ca40145f4620df4552dfd601a
Arg [2] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000014


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.