Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 6 internal transactions
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ETHMixshit
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
istanbul EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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");
}
}
}// 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");
}
}{
"remappings": [],
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "istanbul",
"libraries": {},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.