Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 12143762 | 1789 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TornadoTrees
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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;
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.