ETH Price: $1,976.38 (+0.13%)
 

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

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
-121437622021-03-30 23:53:081789 days ago1617148388  Contract Creation0 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:
TornadoTrees

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// https://tornado.cash
/*
* d888888P                                           dP              a88888b.                   dP
*    88                                              88             d8'   `88                   88
*    88    .d8888b. 88d888b. 88d888b. .d8888b. .d888b88 .d8888b.    88        .d8888b. .d8888b. 88d888b.
*    88    88'  `88 88'  `88 88'  `88 88'  `88 88'  `88 88'  `88    88        88'  `88 Y8ooooo. 88'  `88
*    88    88.  .88 88       88    88 88.  .88 88.  .88 88.  .88 dP Y8.   .88 88.  .88       88 88    88
*    dP    `88888P' dP       dP    dP `88888P8 `88888P8 `88888P' 88  Y88888P' `88888P8 `88888P' dP    dP
* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

import "./interfaces/ITornadoTreesV1.sol";
import "./interfaces/IBatchTreeUpdateVerifier.sol";
import "@openzeppelin/upgrades-core/contracts/Initializable.sol";

/// @dev This contract holds a merkle tree of all tornado cash deposit and withdrawal events
contract TornadoTrees is Initializable {
  address public immutable governance;
  bytes32 public depositRoot;
  bytes32 public previousDepositRoot;
  bytes32 public withdrawalRoot;
  bytes32 public previousWithdrawalRoot;
  address public tornadoProxy;
  IBatchTreeUpdateVerifier public treeUpdateVerifier;
  ITornadoTreesV1 public immutable tornadoTreesV1;

  uint256 public constant CHUNK_TREE_HEIGHT = 8;
  uint256 public constant CHUNK_SIZE = 2**CHUNK_TREE_HEIGHT;
  uint256 public constant ITEM_SIZE = 32 + 20 + 4;
  uint256 public constant BYTES_SIZE = 32 + 32 + 4 + CHUNK_SIZE * ITEM_SIZE;
  uint256 public constant SNARK_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;

  mapping(uint256 => bytes32) public deposits;
  uint256 public depositsLength;
  uint256 public lastProcessedDepositLeaf;
  uint256 public immutable depositsV1Length;

  mapping(uint256 => bytes32) public withdrawals;
  uint256 public withdrawalsLength;
  uint256 public lastProcessedWithdrawalLeaf;
  uint256 public immutable withdrawalsV1Length;

  event DepositData(address instance, bytes32 indexed hash, uint256 block, uint256 index);
  event WithdrawalData(address instance, bytes32 indexed hash, uint256 block, uint256 index);
  event VerifierUpdated(address newVerifier);
  event ProxyUpdated(address newProxy);

  struct TreeLeaf {
    bytes32 hash;
    address instance;
    uint32 block;
  }

  modifier onlyTornadoProxy {
    require(msg.sender == tornadoProxy, "Not authorized");
    _;
  }

  modifier onlyGovernance() {
    require(msg.sender == governance, "Only governance can perform this action");
    _;
  }

  struct SearchParams {
    uint256 depositsFrom;
    uint256 depositsStep;
    uint256 withdrawalsFrom;
    uint256 withdrawalsStep;
  }

  constructor(
    address _governance,
    ITornadoTreesV1 _tornadoTreesV1,
    SearchParams memory _searchParams
  ) public {
    governance = _governance;
    tornadoTreesV1 = _tornadoTreesV1;

    depositsV1Length = findArrayLength(
      _tornadoTreesV1,
      "deposits(uint256)",
      _searchParams.depositsFrom,
      _searchParams.depositsStep
    );

    withdrawalsV1Length = findArrayLength(
      _tornadoTreesV1,
      "withdrawals(uint256)",
      _searchParams.withdrawalsFrom,
      _searchParams.withdrawalsStep
    );
  }

  function initialize(address _tornadoProxy, IBatchTreeUpdateVerifier _treeUpdateVerifier) public initializer onlyGovernance {
    tornadoProxy = _tornadoProxy;
    treeUpdateVerifier = _treeUpdateVerifier;

    depositRoot = tornadoTreesV1.depositRoot();
    uint256 lastDepositLeaf = tornadoTreesV1.lastProcessedDepositLeaf();
    require(lastDepositLeaf % CHUNK_SIZE == 0, "Incorrect TornadoTrees state");
    lastProcessedDepositLeaf = lastDepositLeaf;
    depositsLength = depositsV1Length;

    withdrawalRoot = tornadoTreesV1.withdrawalRoot();
    uint256 lastWithdrawalLeaf = tornadoTreesV1.lastProcessedWithdrawalLeaf();
    require(lastWithdrawalLeaf % CHUNK_SIZE == 0, "Incorrect TornadoTrees state");
    lastProcessedWithdrawalLeaf = lastWithdrawalLeaf;
    withdrawalsLength = withdrawalsV1Length;
  }

  /// @dev Queue a new deposit data to be inserted into a merkle tree
  function registerDeposit(address _instance, bytes32 _commitment) public onlyTornadoProxy {
    uint256 _depositsLength = depositsLength;
    deposits[_depositsLength] = keccak256(abi.encode(_instance, _commitment, blockNumber()));
    emit DepositData(_instance, _commitment, blockNumber(), _depositsLength);
    depositsLength = _depositsLength + 1;
  }

  /// @dev Queue a new withdrawal data to be inserted into a merkle tree
  function registerWithdrawal(address _instance, bytes32 _nullifierHash) public onlyTornadoProxy {
    uint256 _withdrawalsLength = withdrawalsLength;
    withdrawals[_withdrawalsLength] = keccak256(abi.encode(_instance, _nullifierHash, blockNumber()));
    emit WithdrawalData(_instance, _nullifierHash, blockNumber(), _withdrawalsLength);
    withdrawalsLength = _withdrawalsLength + 1;
  }

  /// @dev Insert a full batch of queued deposits into a merkle tree
  /// @param _proof A snark proof that elements were inserted correctly
  /// @param _argsHash A hash of snark inputs
  /// @param _argsHash Current merkle tree root
  /// @param _newRoot Updated merkle tree root
  /// @param _pathIndices Merkle path to inserted batch
  /// @param _events A batch of inserted events (leaves)
  function updateDepositTree(
    bytes calldata _proof,
    bytes32 _argsHash,
    bytes32 _currentRoot,
    bytes32 _newRoot,
    uint32 _pathIndices,
    TreeLeaf[CHUNK_SIZE] calldata _events
  ) public {
    uint256 offset = lastProcessedDepositLeaf;
    require(_currentRoot == depositRoot, "Proposed deposit root is invalid");
    require(_pathIndices == offset >> CHUNK_TREE_HEIGHT, "Incorrect deposit insert index");

    bytes memory data = new bytes(BYTES_SIZE);
    assembly {
      mstore(add(data, 0x44), _pathIndices)
      mstore(add(data, 0x40), _newRoot)
      mstore(add(data, 0x20), _currentRoot)
    }
    for (uint256 i = 0; i < CHUNK_SIZE; i++) {
      (bytes32 hash, address instance, uint32 blockNumber) = (_events[i].hash, _events[i].instance, _events[i].block);
      bytes32 leafHash = keccak256(abi.encode(instance, hash, blockNumber));
      bytes32 deposit = offset + i >= depositsV1Length ? deposits[offset + i] : tornadoTreesV1.deposits(offset + i);
      require(leafHash == deposit, "Incorrect deposit");
      assembly {
        let itemOffset := add(data, mul(ITEM_SIZE, i))
        mstore(add(itemOffset, 0x7c), blockNumber)
        mstore(add(itemOffset, 0x78), instance)
        mstore(add(itemOffset, 0x64), hash)
      }
      if (offset + i >= depositsV1Length) {
        delete deposits[offset + i];
      } else {
        emit DepositData(instance, hash, blockNumber, offset + i);
      }
    }

    uint256 argsHash = uint256(sha256(data)) % SNARK_FIELD;
    require(argsHash == uint256(_argsHash), "Invalid args hash");
    require(treeUpdateVerifier.verifyProof(_proof, [argsHash]), "Invalid deposit tree update proof");

    previousDepositRoot = _currentRoot;
    depositRoot = _newRoot;
    lastProcessedDepositLeaf = offset + CHUNK_SIZE;
  }

  /// @dev Insert a full batch of queued withdrawals into a merkle tree
  /// @param _proof A snark proof that elements were inserted correctly
  /// @param _argsHash A hash of snark inputs
  /// @param _argsHash Current merkle tree root
  /// @param _newRoot Updated merkle tree root
  /// @param _pathIndices Merkle path to inserted batch
  /// @param _events A batch of inserted events (leaves)
  function updateWithdrawalTree(
    bytes calldata _proof,
    bytes32 _argsHash,
    bytes32 _currentRoot,
    bytes32 _newRoot,
    uint32 _pathIndices,
    TreeLeaf[CHUNK_SIZE] calldata _events
  ) public {
    uint256 offset = lastProcessedWithdrawalLeaf;
    require(_currentRoot == withdrawalRoot, "Proposed withdrawal root is invalid");
    require(_pathIndices == offset >> CHUNK_TREE_HEIGHT, "Incorrect withdrawal insert index");

    bytes memory data = new bytes(BYTES_SIZE);
    assembly {
      mstore(add(data, 0x44), _pathIndices)
      mstore(add(data, 0x40), _newRoot)
      mstore(add(data, 0x20), _currentRoot)
    }
    for (uint256 i = 0; i < CHUNK_SIZE; i++) {
      (bytes32 hash, address instance, uint32 blockNumber) = (_events[i].hash, _events[i].instance, _events[i].block);
      bytes32 leafHash = keccak256(abi.encode(instance, hash, blockNumber));
      bytes32 withdrawal = offset + i >= withdrawalsV1Length ? withdrawals[offset + i] : tornadoTreesV1.withdrawals(offset + i);
      require(leafHash == withdrawal, "Incorrect withdrawal");
      assembly {
        let itemOffset := add(data, mul(ITEM_SIZE, i))
        mstore(add(itemOffset, 0x7c), blockNumber)
        mstore(add(itemOffset, 0x78), instance)
        mstore(add(itemOffset, 0x64), hash)
      }
      if (offset + i >= withdrawalsV1Length) {
        delete withdrawals[offset + i];
      } else {
        emit WithdrawalData(instance, hash, blockNumber, offset + i);
      }
    }

    uint256 argsHash = uint256(sha256(data)) % SNARK_FIELD;
    require(argsHash == uint256(_argsHash), "Invalid args hash");
    require(treeUpdateVerifier.verifyProof(_proof, [argsHash]), "Invalid withdrawal tree update proof");

    previousWithdrawalRoot = _currentRoot;
    withdrawalRoot = _newRoot;
    lastProcessedWithdrawalLeaf = offset + CHUNK_SIZE;
  }

  function validateRoots(bytes32 _depositRoot, bytes32 _withdrawalRoot) public view {
    require(_depositRoot == depositRoot || _depositRoot == previousDepositRoot, "Incorrect deposit tree root");
    require(_withdrawalRoot == withdrawalRoot || _withdrawalRoot == previousWithdrawalRoot, "Incorrect withdrawal tree root");
  }

  /// @dev There is no array length getter for deposit and withdrawal arrays
  /// in the previous contract, so we have to find them length manually.
  /// Used only during deployment
  function findArrayLength(
    ITornadoTreesV1 _tornadoTreesV1,
    string memory _type,
    uint256 _from, // most likely array length after the proposal has passed
    uint256 _step // optimal step size to find first match, approximately equals dispersion
  ) internal view virtual returns (uint256) {
    // Find the segment with correct array length
    bool direction = elementExists(_tornadoTreesV1, _type, _from);
    do {
      _from = direction ? _from + _step : _from - _step;
    } while (direction == elementExists(_tornadoTreesV1, _type, _from));
    uint256 high = direction ? _from : _from + _step;
    uint256 low = direction ? _from - _step : _from;
    uint256 mid = (high + low) / 2;

    // Perform a binary search in this segment
    while (low < mid) {
      if (elementExists(_tornadoTreesV1, _type, mid)) {
        low = mid;
      } else {
        high = mid;
      }
      mid = (low + high) / 2;
    }
    return mid + 1;
  }

  function elementExists(
    ITornadoTreesV1 _tornadoTreesV1,
    string memory _type,
    uint256 index
  ) public view returns (bool success) {
    // Try to get the element. If it succeeds the array length is higher, it it reverts the length is equal or lower
    (success, ) = address(_tornadoTreesV1).staticcall{ gas: 2500 }(abi.encodeWithSignature(_type, index));
  }

  function setTornadoProxyContract(address _tornadoProxy) external onlyGovernance {
    tornadoProxy = _tornadoProxy;
    emit ProxyUpdated(_tornadoProxy);
  }

  function setVerifierContract(IBatchTreeUpdateVerifier _treeUpdateVerifier) external onlyGovernance {
    treeUpdateVerifier = _treeUpdateVerifier;
    emit VerifierUpdated(address(_treeUpdateVerifier));
  }

  function blockNumber() public view virtual returns (uint256) {
    return block.number;
  }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

interface ITornadoTreesV1 {
  function lastProcessedDepositLeaf() external view returns (uint256);

  function lastProcessedWithdrawalLeaf() external view returns (uint256);

  function depositRoot() external view returns (bytes32);

  function withdrawalRoot() external view returns (bytes32);

  function deposits(uint256 i) external view returns (bytes32);

  function withdrawals(uint256 i) external view returns (bytes32);

  function registerDeposit(address instance, bytes32 commitment) external;

  function registerWithdrawal(address instance, bytes32 nullifier) external;
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

interface IBatchTreeUpdateVerifier {
  function verifyProof(bytes calldata proof, uint256[1] calldata input) external view returns (bool);
}

// SPDX-License-Identifier: MIT

pragma solidity >=0.4.24 <0.7.0;


/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"contract ITornadoTreesV1","name":"_tornadoTreesV1","type":"address"},{"components":[{"internalType":"uint256","name":"depositsFrom","type":"uint256"},{"internalType":"uint256","name":"depositsStep","type":"uint256"},{"internalType":"uint256","name":"withdrawalsFrom","type":"uint256"},{"internalType":"uint256","name":"withdrawalsStep","type":"uint256"}],"internalType":"struct TornadoTrees.SearchParams","name":"_searchParams","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"instance","type":"address"},{"indexed":true,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"DepositData","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newProxy","type":"address"}],"name":"ProxyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newVerifier","type":"address"}],"name":"VerifierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"instance","type":"address"},{"indexed":true,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"WithdrawalData","type":"event"},{"inputs":[],"name":"BYTES_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHUNK_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHUNK_TREE_HEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ITEM_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SNARK_FIELD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deposits","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositsV1Length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ITornadoTreesV1","name":"_tornadoTreesV1","type":"address"},{"internalType":"string","name":"_type","type":"string"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"elementExists","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tornadoProxy","type":"address"},{"internalType":"contract IBatchTreeUpdateVerifier","name":"_treeUpdateVerifier","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastProcessedDepositLeaf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProcessedWithdrawalLeaf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousDepositRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousWithdrawalRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_instance","type":"address"},{"internalType":"bytes32","name":"_commitment","type":"bytes32"}],"name":"registerDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_instance","type":"address"},{"internalType":"bytes32","name":"_nullifierHash","type":"bytes32"}],"name":"registerWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tornadoProxy","type":"address"}],"name":"setTornadoProxyContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IBatchTreeUpdateVerifier","name":"_treeUpdateVerifier","type":"address"}],"name":"setVerifierContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tornadoProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tornadoTreesV1","outputs":[{"internalType":"contract ITornadoTreesV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treeUpdateVerifier","outputs":[{"internalType":"contract IBatchTreeUpdateVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"internalType":"bytes32","name":"_argsHash","type":"bytes32"},{"internalType":"bytes32","name":"_currentRoot","type":"bytes32"},{"internalType":"bytes32","name":"_newRoot","type":"bytes32"},{"internalType":"uint32","name":"_pathIndices","type":"uint32"},{"components":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"address","name":"instance","type":"address"},{"internalType":"uint32","name":"block","type":"uint32"}],"internalType":"struct TornadoTrees.TreeLeaf[256]","name":"_events","type":"tuple[256]"}],"name":"updateDepositTree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"internalType":"bytes32","name":"_argsHash","type":"bytes32"},{"internalType":"bytes32","name":"_currentRoot","type":"bytes32"},{"internalType":"bytes32","name":"_newRoot","type":"bytes32"},{"internalType":"uint32","name":"_pathIndices","type":"uint32"},{"components":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"address","name":"instance","type":"address"},{"internalType":"uint32","name":"block","type":"uint32"}],"internalType":"struct TornadoTrees.TreeLeaf[256]","name":"_events","type":"tuple[256]"}],"name":"updateWithdrawalTree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_depositRoot","type":"bytes32"},{"internalType":"bytes32","name":"_withdrawalRoot","type":"bytes32"}],"name":"validateRoots","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawals","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalsV1Length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6101006040523480156200001257600080fd5b506040516200207c3803806200207c833981016040819052620000359162000268565b6001600160601b0319606084811b821660805283901b1660a0526040805180820190915260118152706465706f736974732875696e743235362960781b602080830191909152825190830151620000909285929091620000eb565b60c052604080518082018252601481527f7769746864726177616c732875696e74323536290000000000000000000000006020820152908201516060830151620000de9285929091620000eb565b60e052506200037a915050565b600080620000fb868686620001a1565b90505b806200010d5782840362000111565b8284015b935062000120868686620001a1565b151581151514620000fe576000816200013c578385016200013e565b845b90506000826200014f578562000153565b8486035b90506002828201045b80821015620001925762000172898983620001a1565b15620001815780915062000185565b8092505b506002828201046200015c565b60010198975050505050505050565b6000836001600160a01b03166109c48484604051602401620001c4919062000325565b60408051601f198184030181529082905291620001e19162000307565b60408051918290039091206020830180516001600160e01b03166001600160e01b0319909216919091179052516200021a919062000307565b6000604051808303818686fa925050503d806000811462000258576040519150601f19603f3d011682016040523d82523d6000602084013e6200025d565b606091505b509095945050505050565b600080600083850360c08112156200027e578384fd5b84516200028b8162000361565b60208601519094506200029e8162000361565b92506080603f1982011215620002b2578182fd5b50604051608081016001600160401b0381118282101715620002d2578283fd5b806040525060408501518152606085015160208201526080850151604082015260a08501516060820152809150509250925092565b600082516200031b8184602087016200032e565b9190910192915050565b90815260200190565b60005b838110156200034b57818101518382015260200162000331565b838111156200035b576000848401525b50505050565b6001600160a01b03811681146200037757600080fd5b50565b60805160601c60a05160601c60c05160e051611c7b62000401600039806104b052806108ac52806111cb52806112e55250806104d452806107335280610a0b5280610b2552508061046852806105ec5280610677528061075a52806107f35280610a4a528061120a52508061056f5280610d285280610e365280610ed45250611c7b6000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80638895b8ef1161010f578063b4a6359e116100a2578063ca3628dc11610071578063ca3628dc14610362578063e91e13a914610375578063f154240a1461037d578063fe8137e214610385576101e5565b8063b4a6359e1461032c578063c11b968114610334578063c34c788214610347578063c6758d6b1461034f576101e5565b8063a2b28fe6116100de578063a2b28fe614610301578063adc13d3c14610309578063b02c43d014610311578063b3a4184b14610324576101e5565b80638895b8ef146102cb5780638955fe8a146102d35780639e2fc73b146102db578063a25da83c146102ee576101e5565b8063485cc955116101875780635aa6e675116101565780635aa6e675146102885780635cc0707614610290578063710daf4d146102a3578063715d3a43146102ab576101e5565b8063485cc955146102525780634929afc9146102655780634a20de581461027857806357e871e714610280576101e5565b8063206eb63c116101c3578063206eb63c14610232578063218df2e31461023a5780632fb7749d1461024257806344c8db391461024a576101e5565b806301ae1920146101ea57806302709f67146101ff5780631c100fa61461021d575b600080fd5b6101fd6101f836600461153a565b61038d565b005b610207610451565b604051610214919061183d565b60405180910390f35b610225610457565b60405161021491906117af565b610225610466565b61020761048a565b6102076104ae565b6102076104d2565b6101fd610260366004611565565b6104f6565b6101fd6102733660046115f6565b6108e5565b610225610d13565b610207610d22565b610225610d26565b61020761029e366004611757565b610d4a565b610207610d5c565b6102be6102b93660046116a1565b610d61565b6040516102149190611832565b610207610e20565b610207610e25565b6101fd6102e9366004611517565b610e2b565b6101fd6102fc366004611517565b610ec9565b610207610f5c565b610207610f62565b61020761031f366004611757565b610f68565b610207610f7a565b610207610f80565b6101fd6103423660046115d5565b610f86565b610207610fe4565b6101fd61035d36600461153a565b610fea565b6101fd6103703660046115f6565b6110a5565b6102076114d3565b6102076114d9565b6102076114df565b6037546001600160a01b031633146103c05760405162461bcd60e51b81526004016103b790611bd5565b60405180910390fd5b603d5482826103cd610d22565b6040516020016103df939291906117c3565b60408051601f1981840301815291815281516020928301206000848152603c909352912055817f5d3e96213d4520bdc95a25d628a39768f1a90a2b939894355479596910d179df8461042f610d22565b8460405161043f939291906117c3565b60405180910390a2600101603d555050565b603d5481565b6037546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600054610100900460ff168061050f575061050f6114e5565b8061051d575060005460ff16155b6105395760405162461bcd60e51b81526004016103b790611a73565b600054610100900460ff16158015610564576000805460ff1961ff0019909116610100171660011790555b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105ac5760405162461bcd60e51b81526004016103b7906119be565b603780546001600160a01b038086166001600160a01b031992831617909255603880548584169216919091179055604080516344aaff4560e11b815290517f000000000000000000000000000000000000000000000000000000000000000090921691638955fe8a91600480820192602092909190829003018186803b15801561063557600080fd5b505afa158015610649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066d91906115bd565b60338190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b4a6359e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ce57600080fd5b505afa1580156106e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070691906115bd565b905061010081061561072a5760405162461bcd60e51b81526004016103b790611b9e565b80603b819055507f0000000000000000000000000000000000000000000000000000000000000000603a819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c34c78826040518163ffffffff1660e01b815260040160206040518083038186803b1580156107b157600080fd5b505afa1580156107c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e991906115bd565b60358190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a2b28fe66040518163ffffffff1660e01b815260040160206040518083038186803b15801561084a57600080fd5b505afa15801561085e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088291906115bd565b90506101008106156108a65760405162461bcd60e51b81526004016103b790611b9e565b603e55507f0000000000000000000000000000000000000000000000000000000000000000603d5580156108e0576000805461ff00191690555b505050565b603b5460335485146109095760405162461bcd60e51b81526004016103b790611b32565b600881901c8363ffffffff16146109325760405162461bcd60e51b81526004016103b790611b67565b60408051613844808252613880820190925260609160208201818036833701905050905083604482015284604082015285602082015260005b610100811015610bb35760008060008684610100811061098757fe5b60600201358785610100811061099957fe5b6060020160200160208101906109af9190611517565b888661010081106109bc57fe5b6060020160400160208101906109d2919061176f565b92509250925060008284836040516020016109ef939291906117e4565b60405160208183030381529060405280519060200120905060007f00000000000000000000000000000000000000000000000000000000000000008689011015610ad657604051630b02c43d60e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b02c43d090610a81908b8a019060040161183d565b60206040518083038186803b158015610a9957600080fd5b505afa158015610aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad191906115bd565b610ae9565b8786016000908152603960205260409020545b9050808214610b0a5760405162461bcd60e51b81526004016103b790611993565b85603802870183607c820152846078820152856064820152507f000000000000000000000000000000000000000000000000000000000000000086890110610b6357878601600090815260396020526040812055610ba2565b847fc711bd1d2cdd9c8978324cc83ce34c17f6ada898f8273efeb9585c1312d4ef678585898c01604051610b999392919061180b565b60405180910390a25b50506001909301925061096b915050565b5060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051610be79190611793565b602060405180830381855afa158015610c04573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610c2791906115bd565b81610c2e57fe5b069050878114610c505760405162461bcd60e51b81526004016103b7906118a2565b603854604080516020810182528381529051632363e29760e21b81526001600160a01b0390921691638d8f8a5c91610c8e918e918e91600401611846565b60206040518083038186803b158015610ca657600080fd5b505afa158015610cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cde919061159d565b610cfa5760405162461bcd60e51b81526004016103b7906118cd565b5050603494909455505060335561010001603b55505050565b6038546001600160a01b031681565b4390565b7f000000000000000000000000000000000000000000000000000000000000000081565b603c6020526000908152604090205481565b603881565b6000836001600160a01b03166109c48484604051602401610d82919061183d565b60408051601f198184030181529082905291610d9d91611793565b60408051918290039091206020830180516001600160e01b03166001600160e01b031990921691909117905251610dd49190611793565b6000604051808303818686fa925050503d8060008114610e10576040519150601f19603f3d011682016040523d82523d6000602084013e610e15565b606091505b509095945050505050565b600881565b60335481565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e735760405162461bcd60e51b81526004016103b7906119be565b603780546001600160a01b0319166001600160a01b0383161790556040517ffc80377ca9c49cc11ae6982f390a42db976d5530af7c43889264b13fbbd7c57e90610ebe9083906117af565b60405180910390a150565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f115760405162461bcd60e51b81526004016103b7906119be565b603880546001600160a01b0319166001600160a01b0383161790556040517fd24015cc99cc1700cafca3042840a1d8ac1e3964fd2e0e37ea29c654056ee32790610ebe9083906117af565b603e5481565b61384481565b60396020526000908152604090205481565b60365481565b603b5481565b603354821480610f97575060345482145b610fb35760405162461bcd60e51b81526004016103b790611a3c565b603554811480610fc4575060365481145b610fe05760405162461bcd60e51b81526004016103b790611a05565b5050565b60355481565b6037546001600160a01b031633146110145760405162461bcd60e51b81526004016103b790611bd5565b603a548282611021610d22565b604051602001611033939291906117c3565b60408051601f19818403018152918152815160209283012060008481526039909352912055817fc711bd1d2cdd9c8978324cc83ce34c17f6ada898f8273efeb9585c1312d4ef6784611083610d22565b84604051611093939291906117c3565b60405180910390a2600101603a555050565b603e5460355485146110c95760405162461bcd60e51b81526004016103b790611ac1565b600881901c8363ffffffff16146110f25760405162461bcd60e51b81526004016103b79061190e565b60408051613844808252613880820190925260609160208201818036833701905050905083604482015284604082015285602082015260005b6101008110156113735760008060008684610100811061114757fe5b60600201358785610100811061115957fe5b60600201602001602081019061116f9190611517565b8886610100811061117c57fe5b606002016040016020810190611192919061176f565b92509250925060008284836040516020016111af939291906117e4565b60405160208183030381529060405280519060200120905060007f0000000000000000000000000000000000000000000000000000000000000000868901101561129657604051632e60383b60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635cc0707690611241908b8a019060040161183d565b60206040518083038186803b15801561125957600080fd5b505afa15801561126d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129191906115bd565b6112a9565b8786016000908152603c60205260409020545b90508082146112ca5760405162461bcd60e51b81526004016103b790611b04565b85603802870183607c820152846078820152856064820152507f000000000000000000000000000000000000000000000000000000000000000086890110611323578786016000908152603c6020526040812055611362565b847f5d3e96213d4520bdc95a25d628a39768f1a90a2b939894355479596910d179df8585898c016040516113599392919061180b565b60405180910390a25b50506001909301925061112b915050565b5060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516113a79190611793565b602060405180830381855afa1580156113c4573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906113e791906115bd565b816113ee57fe5b0690508781146114105760405162461bcd60e51b81526004016103b7906118a2565b603854604080516020810182528381529051632363e29760e21b81526001600160a01b0390921691638d8f8a5c9161144e918e918e91600401611846565b60206040518083038186803b15801561146657600080fd5b505afa15801561147a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149e919061159d565b6114ba5760405162461bcd60e51b81526004016103b79061194f565b5050603694909455505060355561010001603e55505050565b61010081565b603a5481565b60345481565b303b1590565b8061600081018310156114fd57600080fd5b92915050565b803563ffffffff811681146114fd57600080fd5b600060208284031215611528578081fd5b813561153381611c2d565b9392505050565b6000806040838503121561154c578081fd5b823561155781611c2d565b946020939093013593505050565b60008060408385031215611577578182fd5b823561158281611c2d565b9150602083013561159281611c2d565b809150509250929050565b6000602082840312156115ae578081fd5b81518015158114611533578182fd5b6000602082840312156115ce578081fd5b5051919050565b600080604083850312156115e7578182fd5b50508035926020909101359150565b60008060008060008060006160a0888a031215611611578283fd5b873567ffffffffffffffff80821115611628578485fd5b818a0191508a601f83011261163b578485fd5b813581811115611649578586fd5b8b602082850101111561165a578586fd5b60209283019950975050880135945060408801359350606088013592506116848960808a01611503565b91506116938960a08a016114eb565b905092959891949750929550565b6000806000606084860312156116b5578283fd5b83356116c081611c2d565b925060208481013567ffffffffffffffff808211156116dd578485fd5b818701915087601f8301126116f0578485fd5b8135818111156116fe578586fd5b604051601f8201601f191681018501838111828210171561171d578788fd5b60405281815283820185018a1015611733578687fd5b81858501868301379081019093019490945250929592945050506040919091013590565b600060208284031215611768578081fd5b5035919050565b600060208284031215611780578081fd5b813563ffffffff81168114611533578182fd5b600082516117a5818460208701611bfd565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03939093168352602083019190915263ffffffff16604082015260600190565b6001600160a01b0393909316835263ffffffff919091166020830152604082015260600190565b901515815260200190565b90815260200190565b6000604082528360408301528385606084013780606085840101526060601f19601f860116830101905060208083018460005b600181101561189657815183529183019190830190600101611879565b50505050949350505050565b602080825260119082015270092dcecc2d8d2c840c2e4cee640d0c2e6d607b1b604082015260600190565b60208082526021908201527f496e76616c6964206465706f7369742074726565207570646174652070726f6f6040820152603360f91b606082015260800190565b60208082526021908201527f496e636f7272656374207769746864726177616c20696e7365727420696e64656040820152600f60fb1b606082015260800190565b60208082526024908201527f496e76616c6964207769746864726177616c20747265652075706461746520706040820152633937b7b360e11b606082015260800190565b602080825260119082015270125b98dbdc9c9958dd0819195c1bdcda5d607a1b604082015260600190565b60208082526027908201527f4f6e6c7920676f7665726e616e63652063616e20706572666f726d20746869736040820152661030b1ba34b7b760c91b606082015260800190565b6020808252601e908201527f496e636f7272656374207769746864726177616c207472656520726f6f740000604082015260600190565b6020808252601b908201527f496e636f7272656374206465706f736974207472656520726f6f740000000000604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526023908201527f50726f706f736564207769746864726177616c20726f6f7420697320696e76616040820152621b1a5960ea1b606082015260800190565b602080825260149082015273125b98dbdc9c9958dd081dda5d1a191c985dd85b60621b604082015260600190565b6020808252818101527f50726f706f736564206465706f73697420726f6f7420697320696e76616c6964604082015260600190565b6020808252601e908201527f496e636f7272656374206465706f73697420696e7365727420696e6465780000604082015260600190565b6020808252601c908201527f496e636f727265637420546f726e61646f547265657320737461746500000000604082015260600190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b60005b83811015611c18578181015183820152602001611c00565b83811115611c27576000848401525b50505050565b6001600160a01b0381168114611c4257600080fd5b5056fea264697066735822122023f99839131de8b3c05f2ea062bdcaa12e75cdfed90c0ef3ad5add6c484e19ae64736f6c634300060c00330000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce00000000000000000000000043a3be4ae954d9869836702afd10393d3a7ea4170000000000000000000000000000000000000000000000000000000000005382000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000035770000000000000000000000000000000000000000000000000000000000000019

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80638895b8ef1161010f578063b4a6359e116100a2578063ca3628dc11610071578063ca3628dc14610362578063e91e13a914610375578063f154240a1461037d578063fe8137e214610385576101e5565b8063b4a6359e1461032c578063c11b968114610334578063c34c788214610347578063c6758d6b1461034f576101e5565b8063a2b28fe6116100de578063a2b28fe614610301578063adc13d3c14610309578063b02c43d014610311578063b3a4184b14610324576101e5565b80638895b8ef146102cb5780638955fe8a146102d35780639e2fc73b146102db578063a25da83c146102ee576101e5565b8063485cc955116101875780635aa6e675116101565780635aa6e675146102885780635cc0707614610290578063710daf4d146102a3578063715d3a43146102ab576101e5565b8063485cc955146102525780634929afc9146102655780634a20de581461027857806357e871e714610280576101e5565b8063206eb63c116101c3578063206eb63c14610232578063218df2e31461023a5780632fb7749d1461024257806344c8db391461024a576101e5565b806301ae1920146101ea57806302709f67146101ff5780631c100fa61461021d575b600080fd5b6101fd6101f836600461153a565b61038d565b005b610207610451565b604051610214919061183d565b60405180910390f35b610225610457565b60405161021491906117af565b610225610466565b61020761048a565b6102076104ae565b6102076104d2565b6101fd610260366004611565565b6104f6565b6101fd6102733660046115f6565b6108e5565b610225610d13565b610207610d22565b610225610d26565b61020761029e366004611757565b610d4a565b610207610d5c565b6102be6102b93660046116a1565b610d61565b6040516102149190611832565b610207610e20565b610207610e25565b6101fd6102e9366004611517565b610e2b565b6101fd6102fc366004611517565b610ec9565b610207610f5c565b610207610f62565b61020761031f366004611757565b610f68565b610207610f7a565b610207610f80565b6101fd6103423660046115d5565b610f86565b610207610fe4565b6101fd61035d36600461153a565b610fea565b6101fd6103703660046115f6565b6110a5565b6102076114d3565b6102076114d9565b6102076114df565b6037546001600160a01b031633146103c05760405162461bcd60e51b81526004016103b790611bd5565b60405180910390fd5b603d5482826103cd610d22565b6040516020016103df939291906117c3565b60408051601f1981840301815291815281516020928301206000848152603c909352912055817f5d3e96213d4520bdc95a25d628a39768f1a90a2b939894355479596910d179df8461042f610d22565b8460405161043f939291906117c3565b60405180910390a2600101603d555050565b603d5481565b6037546001600160a01b031681565b7f00000000000000000000000043a3be4ae954d9869836702afd10393d3a7ea41781565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181565b7f0000000000000000000000000000000000000000000000000000000000003a2481565b7f00000000000000000000000000000000000000000000000000000000000055f881565b600054610100900460ff168061050f575061050f6114e5565b8061051d575060005460ff16155b6105395760405162461bcd60e51b81526004016103b790611a73565b600054610100900460ff16158015610564576000805460ff1961ff0019909116610100171660011790555b336001600160a01b037f0000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce16146105ac5760405162461bcd60e51b81526004016103b7906119be565b603780546001600160a01b038086166001600160a01b031992831617909255603880548584169216919091179055604080516344aaff4560e11b815290517f00000000000000000000000043a3be4ae954d9869836702afd10393d3a7ea41790921691638955fe8a91600480820192602092909190829003018186803b15801561063557600080fd5b505afa158015610649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066d91906115bd565b60338190555060007f00000000000000000000000043a3be4ae954d9869836702afd10393d3a7ea4176001600160a01b031663b4a6359e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ce57600080fd5b505afa1580156106e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070691906115bd565b905061010081061561072a5760405162461bcd60e51b81526004016103b790611b9e565b80603b819055507f00000000000000000000000000000000000000000000000000000000000055f8603a819055507f00000000000000000000000043a3be4ae954d9869836702afd10393d3a7ea4176001600160a01b031663c34c78826040518163ffffffff1660e01b815260040160206040518083038186803b1580156107b157600080fd5b505afa1580156107c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e991906115bd565b60358190555060007f00000000000000000000000043a3be4ae954d9869836702afd10393d3a7ea4176001600160a01b031663a2b28fe66040518163ffffffff1660e01b815260040160206040518083038186803b15801561084a57600080fd5b505afa15801561085e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088291906115bd565b90506101008106156108a65760405162461bcd60e51b81526004016103b790611b9e565b603e55507f0000000000000000000000000000000000000000000000000000000000003a24603d5580156108e0576000805461ff00191690555b505050565b603b5460335485146109095760405162461bcd60e51b81526004016103b790611b32565b600881901c8363ffffffff16146109325760405162461bcd60e51b81526004016103b790611b67565b60408051613844808252613880820190925260609160208201818036833701905050905083604482015284604082015285602082015260005b610100811015610bb35760008060008684610100811061098757fe5b60600201358785610100811061099957fe5b6060020160200160208101906109af9190611517565b888661010081106109bc57fe5b6060020160400160208101906109d2919061176f565b92509250925060008284836040516020016109ef939291906117e4565b60405160208183030381529060405280519060200120905060007f00000000000000000000000000000000000000000000000000000000000055f88689011015610ad657604051630b02c43d60e41b81526001600160a01b037f00000000000000000000000043a3be4ae954d9869836702afd10393d3a7ea417169063b02c43d090610a81908b8a019060040161183d565b60206040518083038186803b158015610a9957600080fd5b505afa158015610aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad191906115bd565b610ae9565b8786016000908152603960205260409020545b9050808214610b0a5760405162461bcd60e51b81526004016103b790611993565b85603802870183607c820152846078820152856064820152507f00000000000000000000000000000000000000000000000000000000000055f886890110610b6357878601600090815260396020526040812055610ba2565b847fc711bd1d2cdd9c8978324cc83ce34c17f6ada898f8273efeb9585c1312d4ef678585898c01604051610b999392919061180b565b60405180910390a25b50506001909301925061096b915050565b5060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051610be79190611793565b602060405180830381855afa158015610c04573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610c2791906115bd565b81610c2e57fe5b069050878114610c505760405162461bcd60e51b81526004016103b7906118a2565b603854604080516020810182528381529051632363e29760e21b81526001600160a01b0390921691638d8f8a5c91610c8e918e918e91600401611846565b60206040518083038186803b158015610ca657600080fd5b505afa158015610cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cde919061159d565b610cfa5760405162461bcd60e51b81526004016103b7906118cd565b5050603494909455505060335561010001603b55505050565b6038546001600160a01b031681565b4390565b7f0000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce81565b603c6020526000908152604090205481565b603881565b6000836001600160a01b03166109c48484604051602401610d82919061183d565b60408051601f198184030181529082905291610d9d91611793565b60408051918290039091206020830180516001600160e01b03166001600160e01b031990921691909117905251610dd49190611793565b6000604051808303818686fa925050503d8060008114610e10576040519150601f19603f3d011682016040523d82523d6000602084013e610e15565b606091505b509095945050505050565b600881565b60335481565b336001600160a01b037f0000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce1614610e735760405162461bcd60e51b81526004016103b7906119be565b603780546001600160a01b0319166001600160a01b0383161790556040517ffc80377ca9c49cc11ae6982f390a42db976d5530af7c43889264b13fbbd7c57e90610ebe9083906117af565b60405180910390a150565b336001600160a01b037f0000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce1614610f115760405162461bcd60e51b81526004016103b7906119be565b603880546001600160a01b0319166001600160a01b0383161790556040517fd24015cc99cc1700cafca3042840a1d8ac1e3964fd2e0e37ea29c654056ee32790610ebe9083906117af565b603e5481565b61384481565b60396020526000908152604090205481565b60365481565b603b5481565b603354821480610f97575060345482145b610fb35760405162461bcd60e51b81526004016103b790611a3c565b603554811480610fc4575060365481145b610fe05760405162461bcd60e51b81526004016103b790611a05565b5050565b60355481565b6037546001600160a01b031633146110145760405162461bcd60e51b81526004016103b790611bd5565b603a548282611021610d22565b604051602001611033939291906117c3565b60408051601f19818403018152918152815160209283012060008481526039909352912055817fc711bd1d2cdd9c8978324cc83ce34c17f6ada898f8273efeb9585c1312d4ef6784611083610d22565b84604051611093939291906117c3565b60405180910390a2600101603a555050565b603e5460355485146110c95760405162461bcd60e51b81526004016103b790611ac1565b600881901c8363ffffffff16146110f25760405162461bcd60e51b81526004016103b79061190e565b60408051613844808252613880820190925260609160208201818036833701905050905083604482015284604082015285602082015260005b6101008110156113735760008060008684610100811061114757fe5b60600201358785610100811061115957fe5b60600201602001602081019061116f9190611517565b8886610100811061117c57fe5b606002016040016020810190611192919061176f565b92509250925060008284836040516020016111af939291906117e4565b60405160208183030381529060405280519060200120905060007f0000000000000000000000000000000000000000000000000000000000003a24868901101561129657604051632e60383b60e11b81526001600160a01b037f00000000000000000000000043a3be4ae954d9869836702afd10393d3a7ea4171690635cc0707690611241908b8a019060040161183d565b60206040518083038186803b15801561125957600080fd5b505afa15801561126d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129191906115bd565b6112a9565b8786016000908152603c60205260409020545b90508082146112ca5760405162461bcd60e51b81526004016103b790611b04565b85603802870183607c820152846078820152856064820152507f0000000000000000000000000000000000000000000000000000000000003a2486890110611323578786016000908152603c6020526040812055611362565b847f5d3e96213d4520bdc95a25d628a39768f1a90a2b939894355479596910d179df8585898c016040516113599392919061180b565b60405180910390a25b50506001909301925061112b915050565b5060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516113a79190611793565b602060405180830381855afa1580156113c4573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906113e791906115bd565b816113ee57fe5b0690508781146114105760405162461bcd60e51b81526004016103b7906118a2565b603854604080516020810182528381529051632363e29760e21b81526001600160a01b0390921691638d8f8a5c9161144e918e918e91600401611846565b60206040518083038186803b15801561146657600080fd5b505afa15801561147a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149e919061159d565b6114ba5760405162461bcd60e51b81526004016103b79061194f565b5050603694909455505060355561010001603e55505050565b61010081565b603a5481565b60345481565b303b1590565b8061600081018310156114fd57600080fd5b92915050565b803563ffffffff811681146114fd57600080fd5b600060208284031215611528578081fd5b813561153381611c2d565b9392505050565b6000806040838503121561154c578081fd5b823561155781611c2d565b946020939093013593505050565b60008060408385031215611577578182fd5b823561158281611c2d565b9150602083013561159281611c2d565b809150509250929050565b6000602082840312156115ae578081fd5b81518015158114611533578182fd5b6000602082840312156115ce578081fd5b5051919050565b600080604083850312156115e7578182fd5b50508035926020909101359150565b60008060008060008060006160a0888a031215611611578283fd5b873567ffffffffffffffff80821115611628578485fd5b818a0191508a601f83011261163b578485fd5b813581811115611649578586fd5b8b602082850101111561165a578586fd5b60209283019950975050880135945060408801359350606088013592506116848960808a01611503565b91506116938960a08a016114eb565b905092959891949750929550565b6000806000606084860312156116b5578283fd5b83356116c081611c2d565b925060208481013567ffffffffffffffff808211156116dd578485fd5b818701915087601f8301126116f0578485fd5b8135818111156116fe578586fd5b604051601f8201601f191681018501838111828210171561171d578788fd5b60405281815283820185018a1015611733578687fd5b81858501868301379081019093019490945250929592945050506040919091013590565b600060208284031215611768578081fd5b5035919050565b600060208284031215611780578081fd5b813563ffffffff81168114611533578182fd5b600082516117a5818460208701611bfd565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03939093168352602083019190915263ffffffff16604082015260600190565b6001600160a01b0393909316835263ffffffff919091166020830152604082015260600190565b901515815260200190565b90815260200190565b6000604082528360408301528385606084013780606085840101526060601f19601f860116830101905060208083018460005b600181101561189657815183529183019190830190600101611879565b50505050949350505050565b602080825260119082015270092dcecc2d8d2c840c2e4cee640d0c2e6d607b1b604082015260600190565b60208082526021908201527f496e76616c6964206465706f7369742074726565207570646174652070726f6f6040820152603360f91b606082015260800190565b60208082526021908201527f496e636f7272656374207769746864726177616c20696e7365727420696e64656040820152600f60fb1b606082015260800190565b60208082526024908201527f496e76616c6964207769746864726177616c20747265652075706461746520706040820152633937b7b360e11b606082015260800190565b602080825260119082015270125b98dbdc9c9958dd0819195c1bdcda5d607a1b604082015260600190565b60208082526027908201527f4f6e6c7920676f7665726e616e63652063616e20706572666f726d20746869736040820152661030b1ba34b7b760c91b606082015260800190565b6020808252601e908201527f496e636f7272656374207769746864726177616c207472656520726f6f740000604082015260600190565b6020808252601b908201527f496e636f7272656374206465706f736974207472656520726f6f740000000000604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526023908201527f50726f706f736564207769746864726177616c20726f6f7420697320696e76616040820152621b1a5960ea1b606082015260800190565b602080825260149082015273125b98dbdc9c9958dd081dda5d1a191c985dd85b60621b604082015260600190565b6020808252818101527f50726f706f736564206465706f73697420726f6f7420697320696e76616c6964604082015260600190565b6020808252601e908201527f496e636f7272656374206465706f73697420696e7365727420696e6465780000604082015260600190565b6020808252601c908201527f496e636f727265637420546f726e61646f547265657320737461746500000000604082015260600190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b60005b83811015611c18578181015183820152602001611c00565b83811115611c27576000848401525b50505050565b6001600160a01b0381168114611c4257600080fd5b5056fea264697066735822122023f99839131de8b3c05f2ea062bdcaa12e75cdfed90c0ef3ad5add6c484e19ae64736f6c634300060c0033

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

0000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce00000000000000000000000043a3be4ae954d9869836702afd10393d3a7ea4170000000000000000000000000000000000000000000000000000000000005382000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000035770000000000000000000000000000000000000000000000000000000000000019

-----Decoded View---------------
Arg [0] : _governance (address): 0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce
Arg [1] : _tornadoTreesV1 (address): 0x43a3bE4Ae954d9869836702AFd10393D3a7Ea417
Arg [2] : _searchParams (tuple):
Arg [1] : depositsFrom (uint256): 21378
Arg [2] : depositsStep (uint256): 32
Arg [3] : withdrawalsFrom (uint256): 13687
Arg [4] : withdrawalsStep (uint256): 25


-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000005efda50f22d34f262c29268506c5fa42cb56a1ce
Arg [1] : 00000000000000000000000043a3be4ae954d9869836702afd10393d3a7ea417
Arg [2] : 0000000000000000000000000000000000000000000000000000000000005382
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [4] : 0000000000000000000000000000000000000000000000000000000000003577
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000019


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