Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Update Reward Ad... | 16030203 | 491 days ago | IN | 0 ETH | 0.00038999 | ||||
Update Deposit L... | 16026639 | 492 days ago | IN | 0 ETH | 0.00060263 | ||||
Add Keys | 16025345 | 492 days ago | IN | 0 ETH | 0.01406489 | ||||
Update Deposit L... | 15985402 | 498 days ago | IN | 0 ETH | 0.00070816 | ||||
Add Keys | 15985398 | 498 days ago | IN | 0 ETH | 0.02782963 | ||||
Transfer Ownersh... | 15874020 | 513 days ago | IN | 0 ETH | 0.00028804 | ||||
0x60a06040 | 15874012 | 513 days ago | IN | Create: NodeOperatorRegistry | 0 ETH | 0.02140658 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NodeOperatorRegistry
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)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.10 <0.8.0; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/access/Ownable.sol"; import "./IWithdrawalManager.sol"; import "./WithdrawalManagerFactory.sol"; contract NodeOperatorRegistry is Ownable { event OperatorAdded(uint256 indexed id, string name, address operatorOwner); event OperatorOwnerUpdated(uint256 indexed id, address newOperatorOwner); event RewardAddressUpdated(uint256 indexed id, address newRewardAddress); event VerifiedCountUpdated(uint256 indexed id, uint256 newVerifiedCount); event DepositLimitUpdated(uint256 indexed id, uint256 newDepositLimit); event KeyAdded(uint256 indexed id, bytes pubkey, uint256 index); event KeyUsed(uint256 indexed id, uint256 count); event KeyTruncated(uint256 indexed id, uint256 newTotalCount); event StrategyUpdated(address newStrategy); /// @notice Statistics of validator pubkeys from a node operator. /// @param totalCount Total number of validator pubkeys uploaded to this contract /// @param usedCount Number of validator pubkeys that are already used /// @param verifiedCount Number of validator pubkeys that are verified by the contract owner /// @param depositLimit Maximum number of usable validator pubkeys, set by the node operator struct KeyStat { uint64 totalCount; uint64 usedCount; uint64 verifiedCount; uint64 depositLimit; } /// @notice Node operator parameters and internal state /// @param operatorOwner Admin address of the node operator /// @param name Human-readable name /// @param withdrawalAddress Address receiving withdrawals and execution layer rewards /// @param rewardAddress Address receiving performance rewards struct Operator { address operatorOwner; string name; address rewardAddress; address withdrawalAddress; KeyStat keyStat; } struct Key { bytes32 pubkey0; bytes32 pubkey1; // Only the higher 16 bytes of the second slot are used bytes32 signature0; bytes32 signature1; bytes32 signature2; } uint256 private constant PUBKEY_LENGTH = 48; uint256 private constant SIGNATURE_LENGTH = 96; WithdrawalManagerFactory public immutable factory; address public strategy; /// @notice Number of node operators. uint256 public operatorCount; /// @dev Mapping of node operator ID => node operator. mapping(uint256 => Operator) private _operators; /// @dev Mapping of node operator ID => index => validator pubkey and deposit signature. mapping(uint256 => mapping(uint256 => Key)) private _keys; constructor(address strategy_, address withdrawalManagerFactory_) public { _updateStrategy(strategy_); factory = WithdrawalManagerFactory(withdrawalManagerFactory_); } function getOperator(uint256 id) external view returns (Operator memory) { return _operators[id]; } function getOperators() external view returns (Operator[] memory operators) { uint256 count = operatorCount; operators = new Operator[](count); for (uint256 i = 0; i < count; i++) { operators[i] = _operators[i]; } } function getRewardAddress(uint256 id) external view returns (address) { return _operators[id].rewardAddress; } function getRewardAddresses() external view returns (address[] memory addresses) { uint256 count = operatorCount; addresses = new address[](count); for (uint256 i = 0; i < count; i++) { addresses[i] = _operators[i].rewardAddress; } } function getWithdrawalAddress(uint256 id) external view returns (address) { return _operators[id].withdrawalAddress; } function getWithdrawalAddresses() external view returns (address[] memory addresses) { uint256 count = operatorCount; addresses = new address[](count); for (uint256 i = 0; i < count; i++) { addresses[i] = _operators[i].withdrawalAddress; } } function getWithdrawalCredential(uint256 id) external view returns (bytes32) { return IWithdrawalManager(_operators[id].withdrawalAddress).getWithdrawalCredential(); } function getKeyStat(uint256 id) external view returns (KeyStat memory) { return _operators[id].keyStat; } function getKeyStats() external view returns (KeyStat[] memory keyStats) { uint256 count = operatorCount; keyStats = new KeyStat[](count); for (uint256 i = 0; i < count; i++) { keyStats[i] = _operators[i].keyStat; } } function getKey(uint256 id, uint256 index) external view returns (Key memory) { return _keys[id][index]; } function getKeys( uint256 id, uint256 start, uint256 count ) external view returns (Key[] memory keys) { keys = new Key[](count); mapping(uint256 => Key) storage operatorKeys = _keys[id]; for (uint256 i = 0; i < count; i++) { keys[i] = operatorKeys[start + i]; } } function getPubkeys( uint256 id, uint256 start, uint256 count ) external view returns (bytes[] memory pubkeys) { pubkeys = new bytes[](count); mapping(uint256 => Key) storage operatorKeys = _keys[id]; for (uint256 i = 0; i < count; i++) { Key storage key = operatorKeys[start + i]; pubkeys[i] = abi.encodePacked(key.pubkey0, bytes16(key.pubkey1)); } } function getSignatures( uint256 id, uint256 start, uint256 count ) external view returns (bytes[] memory signatures) { signatures = new bytes[](count); mapping(uint256 => Key) storage operatorKeys = _keys[id]; for (uint256 i = 0; i < count; i++) { Key storage key = operatorKeys[start + i]; signatures[i] = abi.encode(key.signature0, key.signature1, key.signature2); } } function addKeys( uint256 id, bytes calldata pubkeys, bytes calldata signatures ) external onlyOperatorOwner(id) { uint256 count = pubkeys.length / PUBKEY_LENGTH; require( pubkeys.length == count * PUBKEY_LENGTH && signatures.length == count * SIGNATURE_LENGTH, "Invalid param length" ); mapping(uint256 => Key) storage operatorKeys = _keys[id]; Operator storage operator = _operators[id]; KeyStat memory stat = operator.keyStat; for (uint256 i = 0; i < count; ++i) { Key memory key; key.pubkey0 = abi.decode(pubkeys[i * PUBKEY_LENGTH:i * PUBKEY_LENGTH + 32], (bytes32)); key.pubkey1 = abi.decode( pubkeys[i * PUBKEY_LENGTH + 16:i * PUBKEY_LENGTH + 48], (bytes32) ); key.pubkey1 = bytes32(uint256(key.pubkey1) << 128); (key.signature0, key.signature1, key.signature2) = abi.decode( signatures[i * SIGNATURE_LENGTH:(i + 1) * SIGNATURE_LENGTH], (bytes32, bytes32, bytes32) ); require( key.pubkey0 | key.pubkey1 != 0 && key.signature0 | key.signature1 | key.signature2 != 0, "Empty pubkey or signature" ); operatorKeys[stat.totalCount + i] = key; emit KeyAdded( id, abi.encodePacked(key.pubkey0, bytes16(key.pubkey1)), stat.totalCount + i ); } stat.totalCount += uint64(count); operator.keyStat = stat; } function truncateUnusedKeys(uint256 id) external onlyOperatorOwner(id) { _truncateUnusedKeys(id); } function updateRewardAddress(uint256 id, address newRewardAddress) external onlyOperatorOwner(id) { _operators[id].rewardAddress = newRewardAddress; emit RewardAddressUpdated(id, newRewardAddress); } function updateDepositLimit(uint256 id, uint64 newDepositLimit) external onlyOperatorOwner(id) { _operators[id].keyStat.depositLimit = newDepositLimit; emit DepositLimitUpdated(id, newDepositLimit); } function useKeys(uint256 id, uint256 count) external onlyStrategy returns (Key[] memory keys, bytes32 withdrawalCredential) { Operator storage operator = _operators[id]; KeyStat memory stat = operator.keyStat; mapping(uint256 => Key) storage operatorKeys = _keys[id]; uint256 usedCount = stat.usedCount; uint256 newUsedCount = usedCount + count; require( newUsedCount <= stat.totalCount && newUsedCount <= stat.depositLimit && newUsedCount <= stat.verifiedCount, "No enough pubkeys" ); keys = new Key[](count); for (uint256 i = 0; i < count; i++) { Key storage k = operatorKeys[usedCount + i]; keys[i] = k; // Clear storage for gas refund k.signature0 = 0; k.signature1 = 0; k.signature2 = 0; } stat.usedCount = uint64(newUsedCount); operator.keyStat = stat; withdrawalCredential = IWithdrawalManager(operator.withdrawalAddress) .getWithdrawalCredential(); emit KeyUsed(id, count); } function addOperator(string calldata name, address operatorOwner) external onlyOwner returns (uint256 id, address withdrawalAddress) { id = operatorCount++; withdrawalAddress = factory.deployContract(id); Operator storage operator = _operators[id]; operator.operatorOwner = operatorOwner; operator.name = name; operator.withdrawalAddress = withdrawalAddress; operator.rewardAddress = operatorOwner; emit OperatorAdded(id, name, operatorOwner); } function updateOperatorOwner(uint256 id, address newOperatorOwner) external onlyOwner { require(id < operatorCount, "Invalid operator ID"); _operators[id].operatorOwner = newOperatorOwner; emit OperatorOwnerUpdated(id, newOperatorOwner); } function updateVerifiedCount(uint256 id, uint64 newVerifiedCount) external onlyOwner { _operators[id].keyStat.verifiedCount = newVerifiedCount; emit VerifiedCountUpdated(id, newVerifiedCount); } function truncateAllUnusedKeys() external onlyOwner { uint256 count = operatorCount; for (uint256 i = 0; i < count; i++) { _truncateUnusedKeys(i); } } function _truncateUnusedKeys(uint256 id) private { Operator storage operator = _operators[id]; KeyStat memory stat = operator.keyStat; stat.totalCount = stat.usedCount; stat.verifiedCount = stat.usedCount; operator.keyStat = stat; emit KeyTruncated(id, stat.totalCount); } function updateStrategy(address newStrategy) external onlyOwner { _updateStrategy(newStrategy); } function _updateStrategy(address newStrategy) private { strategy = newStrategy; emit StrategyUpdated(newStrategy); } modifier onlyOperatorOwner(uint256 id) { require(msg.sender == _operators[id].operatorOwner, "Only operator owner"); _; } modifier onlyStrategy() { require(msg.sender == strategy, "Only strategy"); _; } }
// 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: GPL-3.0-or-later pragma solidity >=0.6.10 <0.8.0; interface IWithdrawalManager { function getWithdrawalCredential() external view returns (bytes32); function transferToStrategy(uint256 amount) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.10 <0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "./WithdrawalManagerProxy.sol"; contract WithdrawalManagerFactory is Ownable { event ImplementationUpdated(address indexed newImplementation); address public implementation; constructor(address implementation_) public { _updateImplementation(implementation_); } function deployContract(uint256 id) external returns (address) { WithdrawalManagerProxy proxy = new WithdrawalManagerProxy(this, id); return address(proxy); } function updateImplementation(address newImplementation) external onlyOwner { _updateImplementation(newImplementation); } function _updateImplementation(address newImplementation) private { implementation = newImplementation; emit ImplementationUpdated(newImplementation); } }
// 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: GPL-3.0-or-later pragma solidity >=0.6.10 <0.8.0; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/proxy/Proxy.sol"; import "./WithdrawalManagerFactory.sol"; // An individual withdraw maanger for a node operator contract WithdrawalManagerProxy is Proxy { using Address for address; WithdrawalManagerFactory internal immutable withdrawalManagerFactory; constructor(WithdrawalManagerFactory withdrawalManagerFactory_, uint256 operatorID_) public { // Initialize withdrawalManagerFactory require(address(withdrawalManagerFactory_) != address(0x0), "Invalid factory address"); withdrawalManagerFactory = withdrawalManagerFactory_; // Check for contract existence address implAddress = withdrawalManagerFactory_.implementation(); require(implAddress.isContract(), "Delegate contract does not exist"); // Call Initialize on delegate (bool success, ) = implAddress.delegatecall(abi.encodeWithSignature("initialize(uint256)", operatorID_)); if (!success) { revert("Failed delegatecall"); } } function _implementation() internal view override returns (address) { return withdrawalManagerFactory.implementation(); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to * be specified by overriding the virtual {_implementation} function. * * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a * different contract through the {_delegate} function. * * The success and return data of the delegated call will be returned back to the caller of the proxy. */ abstract contract Proxy { /** * @dev Delegates the current call to `implementation`. * * This function does not return to its internall call site, it will return directly to the external caller. */ function _delegate(address implementation) internal virtual { // solhint-disable-next-line no-inline-assembly assembly { // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0. calldatacopy(0, 0, calldatasize()) // Call the implementation. // out and outsize are 0 because we don't know the size yet. let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) // Copy the returned data. returndatacopy(0, 0, returndatasize()) switch result // delegatecall returns 0 on error. case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } /** * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function * and {_fallback} should delegate. */ function _implementation() internal view virtual returns (address); /** * @dev Delegates the current call to the address returned by `_implementation()`. * * This function does not return to its internall call site, it will return directly to the external caller. */ function _fallback() internal virtual { _beforeFallback(); _delegate(_implementation()); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other * function in the contract matches the call data. */ fallback () external payable virtual { _fallback(); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data * is empty. */ receive () external payable virtual { _fallback(); } /** * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback` * call, or as part of the Solidity `fallback` or `receive` functions. * * If overriden should call `super._beforeFallback()`. */ function _beforeFallback() internal virtual { } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"strategy_","type":"address"},{"internalType":"address","name":"withdrawalManagerFactory_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDepositLimit","type":"uint256"}],"name":"DepositLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"KeyAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalCount","type":"uint256"}],"name":"KeyTruncated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"KeyUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"operatorOwner","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"newOperatorOwner","type":"address"}],"name":"OperatorOwnerUpdated","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":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"newRewardAddress","type":"address"}],"name":"RewardAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategy","type":"address"}],"name":"StrategyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newVerifiedCount","type":"uint256"}],"name":"VerifiedCountUpdated","type":"event"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"pubkeys","type":"bytes"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"addKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"operatorOwner","type":"address"}],"name":"addOperator","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"withdrawalAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract WithdrawalManagerFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getKey","outputs":[{"components":[{"internalType":"bytes32","name":"pubkey0","type":"bytes32"},{"internalType":"bytes32","name":"pubkey1","type":"bytes32"},{"internalType":"bytes32","name":"signature0","type":"bytes32"},{"internalType":"bytes32","name":"signature1","type":"bytes32"},{"internalType":"bytes32","name":"signature2","type":"bytes32"}],"internalType":"struct NodeOperatorRegistry.Key","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getKeyStat","outputs":[{"components":[{"internalType":"uint64","name":"totalCount","type":"uint64"},{"internalType":"uint64","name":"usedCount","type":"uint64"},{"internalType":"uint64","name":"verifiedCount","type":"uint64"},{"internalType":"uint64","name":"depositLimit","type":"uint64"}],"internalType":"struct NodeOperatorRegistry.KeyStat","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getKeyStats","outputs":[{"components":[{"internalType":"uint64","name":"totalCount","type":"uint64"},{"internalType":"uint64","name":"usedCount","type":"uint64"},{"internalType":"uint64","name":"verifiedCount","type":"uint64"},{"internalType":"uint64","name":"depositLimit","type":"uint64"}],"internalType":"struct NodeOperatorRegistry.KeyStat[]","name":"keyStats","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getKeys","outputs":[{"components":[{"internalType":"bytes32","name":"pubkey0","type":"bytes32"},{"internalType":"bytes32","name":"pubkey1","type":"bytes32"},{"internalType":"bytes32","name":"signature0","type":"bytes32"},{"internalType":"bytes32","name":"signature1","type":"bytes32"},{"internalType":"bytes32","name":"signature2","type":"bytes32"}],"internalType":"struct NodeOperatorRegistry.Key[]","name":"keys","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getOperator","outputs":[{"components":[{"internalType":"address","name":"operatorOwner","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"rewardAddress","type":"address"},{"internalType":"address","name":"withdrawalAddress","type":"address"},{"components":[{"internalType":"uint64","name":"totalCount","type":"uint64"},{"internalType":"uint64","name":"usedCount","type":"uint64"},{"internalType":"uint64","name":"verifiedCount","type":"uint64"},{"internalType":"uint64","name":"depositLimit","type":"uint64"}],"internalType":"struct NodeOperatorRegistry.KeyStat","name":"keyStat","type":"tuple"}],"internalType":"struct NodeOperatorRegistry.Operator","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperators","outputs":[{"components":[{"internalType":"address","name":"operatorOwner","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"rewardAddress","type":"address"},{"internalType":"address","name":"withdrawalAddress","type":"address"},{"components":[{"internalType":"uint64","name":"totalCount","type":"uint64"},{"internalType":"uint64","name":"usedCount","type":"uint64"},{"internalType":"uint64","name":"verifiedCount","type":"uint64"},{"internalType":"uint64","name":"depositLimit","type":"uint64"}],"internalType":"struct NodeOperatorRegistry.KeyStat","name":"keyStat","type":"tuple"}],"internalType":"struct NodeOperatorRegistry.Operator[]","name":"operators","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getPubkeys","outputs":[{"internalType":"bytes[]","name":"pubkeys","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRewardAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardAddresses","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getSignatures","outputs":[{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getWithdrawalAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawalAddresses","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getWithdrawalCredential","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"strategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"truncateAllUnusedKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"truncateUnusedKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint64","name":"newDepositLimit","type":"uint64"}],"name":"updateDepositLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"newOperatorOwner","type":"address"}],"name":"updateOperatorOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"newRewardAddress","type":"address"}],"name":"updateRewardAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newStrategy","type":"address"}],"name":"updateStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint64","name":"newVerifiedCount","type":"uint64"}],"name":"updateVerifiedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"useKeys","outputs":[{"components":[{"internalType":"bytes32","name":"pubkey0","type":"bytes32"},{"internalType":"bytes32","name":"pubkey1","type":"bytes32"},{"internalType":"bytes32","name":"signature0","type":"bytes32"},{"internalType":"bytes32","name":"signature1","type":"bytes32"},{"internalType":"bytes32","name":"signature2","type":"bytes32"}],"internalType":"struct NodeOperatorRegistry.Key[]","name":"keys","type":"tuple[]"},{"internalType":"bytes32","name":"withdrawalCredential","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200265e3803806200265e833981016040819052620000349162000108565b600062000040620000ac565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200009582620000b0565b60601b6001600160601b0319166080525062000173565b3390565b600180546001600160a01b0319166001600160a01b0383161790556040517f4da9c22c924692646a21cf1f423781ae3285198dc22e8a6912835d3272b90b3c90620000fd90839062000146565b60405180910390a150565b600080604083850312156200011b578182fd5b825162000128816200015a565b60208401519092506200013b816200015a565b809150509250929050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146200017057600080fd5b50565b60805160601c6124c86200019660003980610c6c52806115a752506124c86000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063a271519511610104578063c8fcf4d6116100a2578063daccaf6311610071578063daccaf63146103f5578063eb5e8c6f14610408578063f2fde38b14610410578063fbc60ded14610423576101cf565b8063c8fcf4d6146103b4578063cb418d8c146103c7578063d3ee4b13146103cf578063d9422fcd146103e2576101cf565b8063a92d07a9116100de578063a92d07a914610359578063aadc672b14610379578063b0db196414610399578063c45a0155146103ac576101cf565b8063a27151951461032b578063a681c80c1461033e578063a8c62e7614610351576101cf565b80636c81f035116101715780637c6f31581161014b5780637c6f3158146102d95780638d5ff7dd146102ee5780638da5cb5b14610301578063980fd8ab14610316576101cf565b80636c81f03514610290578063715018a6146102b157806377f43a05146102b9576101cf565b80632e5c5ebc116101ad5780632e5c5ebc146102275780634a00fcbe1461023c57806350545d2f1461025c57806354e5e4fa1461027d576101cf565b806305f63c8a146101d45780630dc9b607146101fd57806327a099d814610212575b600080fd5b6101e76101e2366004611d47565b610436565b6040516101f49190612417565b60405180910390f35b61020561057c565b6040516101f49190612132565b61021a610661565b6040516101f491906121a9565b61023a610235366004611e25565b61081e565b005b61024f61024a366004611ebc565b610b1f565b6040516101f49190612174565b61026f61026a366004611da2565b610c05565b6040516101f492919061242a565b61023a61028b366004611df6565b610da7565b6102a361029e366004611e9b565b610e6c565b6040516101f4929190612187565b61023a61119a565b6102cc6102c7366004611d47565b611223565b6040516101f491906123fb565b6102e161128a565b6040516101f491906121fc565b61023a6102fc366004611ed0565b611290565b610309611335565b6040516101f49190612071565b61031e611344565b6040516101f49190612085565b610309610339366004611d47565b6113e5565b61023a61034c366004611d47565b611404565b610309611449565b61036c610367366004611ebc565b611458565b6040516101f491906120d2565b61038c610387366004611e9b565b611527565b6040516101f49190612409565b6103096103a7366004611d47565b611587565b6103096115a5565b61023a6103c2366004611df6565b6115c9565b61031e61166a565b6102e16103dd366004611d47565b61170a565b61036c6103f0366004611ebc565b611793565b61023a610403366004611d08565b611855565b61023a6118a0565b61023a61041e366004611d08565b6118fe565b61023a610431366004611ed0565b6119be565b61043e611b8b565b600082815260036020908152604091829020825160a08101845281546001600160a01b03168152600180830180548651600261010094831615949094026000190190911692909204601f81018690048602830186019096528582529194929385810193919291908301828280156104f65780601f106104cb576101008083540402835291602001916104f6565b820191906000526020600020905b8154815290600101906020018083116104d957829003601f168201915b505050918352505060028201546001600160a01b03908116602080840191909152600384015490911660408084019190915280516080810182526004909401546001600160401b038082168652600160401b8204811693860193909352600160801b8104831691850191909152600160c01b900416606080840191909152015292915050565b600254606090806001600160401b038111801561059857600080fd5b506040519080825280602002602001820160405280156105d257816020015b6105bf611bda565b8152602001906001900390816105b75790505b50915060005b8181101561065c5760008181526003602090815260409182902082516080810184526004909101546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b909204166060820152835184908390811061064957fe5b60209081029190910101526001016105d8565b505090565b600254606090806001600160401b038111801561067d57600080fd5b506040519080825280602002602001820160405280156106b757816020015b6106a4611b8b565b81526020019060019003908161069c5790505b50915060005b8181101561065c57600081815260036020908152604091829020825160a08101845281546001600160a01b03168152600180830180548651600261010094831615949094026000190190911692909204601f810186900486028301860190965285825291949293858101939192919083018282801561077d5780601f106107525761010080835404028352916020019161077d565b820191906000526020600020905b81548152906001019060200180831161076057829003601f168201915b505050918352505060028201546001600160a01b03908116602080840191909152600384015490911660408084019190915280516080810182526004909401546001600160401b038082168652600160401b8204811693860193909352600160801b8104831691850191909152600160c01b9004166060838101919091520152835184908390811061080b57fe5b60209081029190910101526001016106bd565b60008581526003602052604090205485906001600160a01b0316331461085f5760405162461bcd60e51b815260040161085690612310565b60405180910390fd5b60308085049081028514801561087757506060810283145b6108935760405162461bcd60e51b81526004016108569061226f565b600087815260046020908152604080832060039092529091206108b4611bda565b506040805160808101825260048301546001600160401b038082168352600160401b820481166020840152600160801b8204811693830193909352600160c01b9004909116606082015260005b84811015610a8b57610911611c01565b6109246030830260208101908c8e612455565b8101906109319190611d47565b81526109496030838102908101906010018c8e612455565b8101906109569190611d47565b60801b602082015261097360606001840181029084028a8c612455565b8101906109809190611d77565b6080840152606083015260408201526020810151815117158015906109b45750608081015160608201516040830151171715155b6109d05760405162461bcd60e51b815260040161085690612399565b82516001600160401b03168201600090815260208681526040918290208351808255828501516001830181905584860151600284015560608601516003840155608086015160049093019290925592518f937fb56fb5426d4c9d04c3e9192f4a565931612ac78a7dc339e471744ba6f5cb5af393610a5093919201612050565b60408051601f19818403018152908290528651610a7a926001600160401b0390911687019061221b565b60405180910390a250600101610901565b5080516001600160401b039401841680825260049092018054602083015160408401516060909401518716600160c01b026001600160c01b03948816600160801b0267ffffffffffffffff60801b1992909816600160401b0267ffffffffffffffff60401b1967ffffffffffffffff1990941690961792909216949094179390931694909417161790915550505050505050565b6060816001600160401b0381118015610b3757600080fd5b50604051908082528060200260200182016040528015610b7157816020015b610b5e611c01565b815260200190600190039081610b565790505b5060008581526004602052604081209192505b83811015610bfc5781600082870181526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050838281518110610be957fe5b6020908102919091010152600101610b84565b50509392505050565b600080610c10611a57565b6001600160a01b0316610c21611335565b6001600160a01b031614610c475760405162461bcd60e51b815260040161085690612364565b6002805460018101909155604051631cf41a8160e01b81529092506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631cf41a8190610ca19085906004016121fc565b602060405180830381600087803b158015610cbb57600080fd5b505af1158015610ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf39190611d2b565b600083815260036020526040902080546001600160a01b0319166001600160a01b038616178155909150610d2b600182018787611c2f565b506003810180546001600160a01b038085166001600160a01b0319928316179092556002830180549287169290911691909117905560405183907fc22ec753a623c56bd5943299a8993578abc8f26b9d4edb8dcf5765f21de93e2190610d969089908990899061222e565b60405180910390a250935093915050565b610daf611a57565b6001600160a01b0316610dc0611335565b6001600160a01b031614610de65760405162461bcd60e51b815260040161085690612364565b6002548210610e075760405162461bcd60e51b8152600401610856906122e3565b6000828152600360205260409081902080546001600160a01b0319166001600160a01b0384161790555182907f7415c19516e416f2bb44b7808912c3c83f37782a5f943753be2a91f02234f62c90610e60908490612071565b60405180910390a25050565b6001546060906000906001600160a01b03163314610e9c5760405162461bcd60e51b81526004016108569061233d565b6000848152600360205260409020610eb2611bda565b50604080516080810182526004808401546001600160401b038082168452600160401b820481166020808601918252600160801b8404831686880152600160c01b9093048216606086015260008b8152939092529390912090518251929391929082169188830191168111801590610f37575083606001516001600160401b03168111155b8015610f50575083604001516001600160401b03168111155b610f6c5760405162461bcd60e51b8152600401610856906123d0565b876001600160401b0381118015610f8257600080fd5b50604051908082528060200260200182016040528015610fbc57816020015b610fa9611c01565b815260200190600190039081610fa15790505b50965060005b8881101561104c5782810160009081526020858152604091829020825160a08101845281548152600182015492810192909252600281015492820192909252600382015460608201526004820154608082015289518a908490811061102357fe5b602090810291909101015260006002820181905560038201819055600490910155600101610fc2565b506001600160401b03808216602080870182905286516004808a0180546040808c015160608d01518916600160c01b026001600160c01b03918a16600160801b0267ffffffffffffffff60801b19600160401b909a0267ffffffffffffffff60401b1998909b1667ffffffffffffffff199095169490941796909616989098179690961617959095169190911790935560038801548251634231265760e01b815292516001600160a01b039091169363423126579380820193929190829003018186803b15801561111c57600080fd5b505afa158015611130573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111549190611d5f565b9550887ffc637b06d6fb827fa062d63fa3a907eacae3b7b56ff08382f07c089c85e431bc8960405161118691906121fc565b60405180910390a250505050509250929050565b6111a2611a57565b6001600160a01b03166111b3611335565b6001600160a01b0316146111d95760405162461bcd60e51b815260040161085690612364565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61122b611bda565b5060009081526003602090815260409182902082516080810184526004909101546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b90920416606082015290565b60025481565b611298611a57565b6001600160a01b03166112a9611335565b6001600160a01b0316146112cf5760405162461bcd60e51b815260040161085690612364565b60008281526003602052604090819020600401805467ffffffffffffffff60801b1916600160801b6001600160401b038516021790555182907f2a2a71b13711c4016bd62546912290b4716738240386fecd7b224f8e2b8a27dc90610e60908490612441565b6000546001600160a01b031690565b600254606090806001600160401b038111801561136057600080fd5b5060405190808252806020026020018201604052801561138a578160200160208202803683370190505b50915060005b8181101561065c576000818152600360208190526040909120015483516001600160a01b03909116908490839081106113c557fe5b6001600160a01b0390921660209283029190910190910152600101611390565b600090815260036020819052604090912001546001600160a01b031690565b60008181526003602052604090205481906001600160a01b0316331461143c5760405162461bcd60e51b815260040161085690612310565b61144582611a5b565b5050565b6001546001600160a01b031681565b6060816001600160401b038111801561147057600080fd5b506040519080825280602002602001820160405280156114a457816020015b606081526020019060019003908161148f5790505b5060008581526004602052604081209192505b83811015610bfc576000826000838801815260200190815260200160002090508060020154816003015482600401546040516020016114f893929190612205565b60405160208183030381529060405284838151811061151357fe5b6020908102919091010152506001016114b7565b61152f611c01565b506000828152600460208181526040808420858552825292839020835160a081018552815481526001820154928101929092526002810154938201939093526003830154606082015291015460808201525b92915050565b6000908152600360205260409020600201546001600160a01b031690565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008281526003602052604090205482906001600160a01b031633146116015760405162461bcd60e51b815260040161085690612310565b6000838152600360205260409081902060020180546001600160a01b0319166001600160a01b0385161790555183907f0fd52a84c7f1d881bfae9637fce57846ea9d3b91d2558ebc4295cb8b54a1b8759061165d908590612071565b60405180910390a2505050565b600254606090806001600160401b038111801561168657600080fd5b506040519080825280602002602001820160405280156116b0578160200160208202803683370190505b50915060005b8181101561065c5760008181526003602052604090206002015483516001600160a01b03909116908490839081106116ea57fe5b6001600160a01b03909216602092830291909101909101526001016116b6565b6000818152600360208181526040808420909201548251634231265760e01b815292516001600160a01b03909116926342312657926004808301939192829003018186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115819190611d5f565b6060816001600160401b03811180156117ab57600080fd5b506040519080825280602002602001820160405280156117df57816020015b60608152602001906001900390816117ca5790505b5060008581526004602052604081209192505b83811015610bfc57848101600090815260208381526040918290208054600182015493519193611826939192909101612050565b60405160208183030381529060405284838151811061184157fe5b6020908102919091010152506001016117f2565b61185d611a57565b6001600160a01b031661186e611335565b6001600160a01b0316146118945760405162461bcd60e51b815260040161085690612364565b61189d81611b35565b50565b6118a8611a57565b6001600160a01b03166118b9611335565b6001600160a01b0316146118df5760405162461bcd60e51b815260040161085690612364565b60025460005b81811015611445576118f681611a5b565b6001016118e5565b611906611a57565b6001600160a01b0316611917611335565b6001600160a01b03161461193d5760405162461bcd60e51b815260040161085690612364565b6001600160a01b0381166119635760405162461bcd60e51b81526004016108569061229d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526003602052604090205482906001600160a01b031633146119f65760405162461bcd60e51b815260040161085690612310565b6000838152600360205260409081902060040180546001600160c01b0316600160c01b6001600160401b038616021790555183907f88d01455e50f0b0da01a455a4547346410a2fd66ffdc7241a4c280d6089c42579061165d908590612441565b3390565b6000818152600360205260409020611a71611bda565b50604080516080810182526004830180546001600160401b03600160401b808304821660208601819052600160c01b8085049093166060870181905281875286880182905267ffffffffffffffff19909416811767ffffffffffffffff60401b19169181029190911767ffffffffffffffff60801b1916600160801b8202176001600160c01b031692909102919091179091559151909184917fc25c241ebd25b7adbc10a6e20feaba2b2ad0fabcff3df0e8c217eb01238e38b29161165d91612441565b600180546001600160a01b0319166001600160a01b0383161790556040517f4da9c22c924692646a21cf1f423781ae3285198dc22e8a6912835d3272b90b3c90611b80908390612071565b60405180910390a150565b6040518060a0016040528060006001600160a01b031681526020016060815260200160006001600160a01b0316815260200160006001600160a01b03168152602001611bd5611bda565b905290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611c705782800160ff19823516178555611c9d565b82800160010185558215611c9d579182015b82811115611c9d578235825591602001919060010190611c82565b50611ca9929150611cad565b5090565b5b80821115611ca95760008155600101611cae565b60008083601f840112611cd3578182fd5b5081356001600160401b03811115611ce9578182fd5b602083019150836020828501011115611d0157600080fd5b9250929050565b600060208284031215611d19578081fd5b8135611d248161247d565b9392505050565b600060208284031215611d3c578081fd5b8151611d248161247d565b600060208284031215611d58578081fd5b5035919050565b600060208284031215611d70578081fd5b5051919050565b600080600060608486031215611d8b578182fd5b505081359360208301359350604090920135919050565b600080600060408486031215611db6578283fd5b83356001600160401b03811115611dcb578384fd5b611dd786828701611cc2565b9094509250506020840135611deb8161247d565b809150509250925092565b60008060408385031215611e08578182fd5b823591506020830135611e1a8161247d565b809150509250929050565b600080600080600060608688031215611e3c578081fd5b8535945060208601356001600160401b0380821115611e59578283fd5b611e6589838a01611cc2565b90965094506040880135915080821115611e7d578283fd5b50611e8a88828901611cc2565b969995985093965092949392505050565b60008060408385031215611ead578182fd5b50508035926020909101359150565b600080600060608486031215611d8b578283fd5b60008060408385031215611ee2578182fd5b8235915060208301356001600160401b0381168114611e1a578182fd5b6000815180845260208085019450808401835b83811015611f3857611f25878351611fc1565b60a0969096019590820190600101611f12565b509495945050505050565b60008151808452815b81811015611f6857602081850181015186830182015201611f4c565b81811115611f795782602083870101525b50601f01601f19169290920160200192915050565b80516001600160401b03908116835260208083015182169084015260408083015182169084015260609182015116910152565b80518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b600061010060018060a01b03808451168552602084015182602087015261201a83870182611f43565b9250508060408501511660408601528060608501511660608601525060808301516120486080860182611f8e565b509392505050565b9182526fffffffffffffffffffffffffffffffff1916602082015260300190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b818110156120c65783516001600160a01b0316835292840192918401916001016120a1565b50909695505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561212557603f19888603018452612113858351611f43565b945092850192908501906001016120f7565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156120c657612161838551611f8e565b928401926080929092019160010161214e565b600060208252611d246020830184611eff565b60006040825261219a6040830185611eff565b90508260208301529392505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561212557603f198886030184526121ea858351611ff1565b945092850192908501906001016121ce565b90815260200190565b9283526020830191909152604082015260600190565b60006040825261219a6040830185611f43565b6000604082528360408301528385606084013760608483018101919091526001600160a01b03929092166020820152601f909201601f191690910101919050565b602080825260149082015273092dcecc2d8d2c840e0c2e4c2da40d8cadccee8d60631b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b602080825260139082015272125b9d985b1a59081bdc195c985d1bdc881251606a1b604082015260600190565b60208082526013908201527227b7363c9037b832b930ba37b91037bbb732b960691b604082015260600190565b6020808252600d908201526c4f6e6c7920737472617465677960981b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526019908201527f456d707479207075626b6579206f72207369676e617475726500000000000000604082015260600190565b6020808252601190820152704e6f20656e6f756768207075626b65797360781b604082015260600190565b608081016115818284611f8e565b60a081016115818284611fc1565b600060208252611d246020830184611ff1565b9182526001600160a01b0316602082015260400190565b6001600160401b0391909116815260200190565b60008085851115612464578182fd5b83861115612470578182fd5b5050820193919092039150565b6001600160a01b038116811461189d57600080fdfea26469706673582212208cbc8cb83b6199ff37b37b4b1ab77e708ca712a7cf708e214a81a5e9d1406f1364736f6c634300060c003300000000000000000000000066453f68d6dbcf7859e08f0c43df74e6da06ef8c00000000000000000000000016d0ff163e6430b99c3e23b8eecbf840a029dd88
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063a271519511610104578063c8fcf4d6116100a2578063daccaf6311610071578063daccaf63146103f5578063eb5e8c6f14610408578063f2fde38b14610410578063fbc60ded14610423576101cf565b8063c8fcf4d6146103b4578063cb418d8c146103c7578063d3ee4b13146103cf578063d9422fcd146103e2576101cf565b8063a92d07a9116100de578063a92d07a914610359578063aadc672b14610379578063b0db196414610399578063c45a0155146103ac576101cf565b8063a27151951461032b578063a681c80c1461033e578063a8c62e7614610351576101cf565b80636c81f035116101715780637c6f31581161014b5780637c6f3158146102d95780638d5ff7dd146102ee5780638da5cb5b14610301578063980fd8ab14610316576101cf565b80636c81f03514610290578063715018a6146102b157806377f43a05146102b9576101cf565b80632e5c5ebc116101ad5780632e5c5ebc146102275780634a00fcbe1461023c57806350545d2f1461025c57806354e5e4fa1461027d576101cf565b806305f63c8a146101d45780630dc9b607146101fd57806327a099d814610212575b600080fd5b6101e76101e2366004611d47565b610436565b6040516101f49190612417565b60405180910390f35b61020561057c565b6040516101f49190612132565b61021a610661565b6040516101f491906121a9565b61023a610235366004611e25565b61081e565b005b61024f61024a366004611ebc565b610b1f565b6040516101f49190612174565b61026f61026a366004611da2565b610c05565b6040516101f492919061242a565b61023a61028b366004611df6565b610da7565b6102a361029e366004611e9b565b610e6c565b6040516101f4929190612187565b61023a61119a565b6102cc6102c7366004611d47565b611223565b6040516101f491906123fb565b6102e161128a565b6040516101f491906121fc565b61023a6102fc366004611ed0565b611290565b610309611335565b6040516101f49190612071565b61031e611344565b6040516101f49190612085565b610309610339366004611d47565b6113e5565b61023a61034c366004611d47565b611404565b610309611449565b61036c610367366004611ebc565b611458565b6040516101f491906120d2565b61038c610387366004611e9b565b611527565b6040516101f49190612409565b6103096103a7366004611d47565b611587565b6103096115a5565b61023a6103c2366004611df6565b6115c9565b61031e61166a565b6102e16103dd366004611d47565b61170a565b61036c6103f0366004611ebc565b611793565b61023a610403366004611d08565b611855565b61023a6118a0565b61023a61041e366004611d08565b6118fe565b61023a610431366004611ed0565b6119be565b61043e611b8b565b600082815260036020908152604091829020825160a08101845281546001600160a01b03168152600180830180548651600261010094831615949094026000190190911692909204601f81018690048602830186019096528582529194929385810193919291908301828280156104f65780601f106104cb576101008083540402835291602001916104f6565b820191906000526020600020905b8154815290600101906020018083116104d957829003601f168201915b505050918352505060028201546001600160a01b03908116602080840191909152600384015490911660408084019190915280516080810182526004909401546001600160401b038082168652600160401b8204811693860193909352600160801b8104831691850191909152600160c01b900416606080840191909152015292915050565b600254606090806001600160401b038111801561059857600080fd5b506040519080825280602002602001820160405280156105d257816020015b6105bf611bda565b8152602001906001900390816105b75790505b50915060005b8181101561065c5760008181526003602090815260409182902082516080810184526004909101546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b909204166060820152835184908390811061064957fe5b60209081029190910101526001016105d8565b505090565b600254606090806001600160401b038111801561067d57600080fd5b506040519080825280602002602001820160405280156106b757816020015b6106a4611b8b565b81526020019060019003908161069c5790505b50915060005b8181101561065c57600081815260036020908152604091829020825160a08101845281546001600160a01b03168152600180830180548651600261010094831615949094026000190190911692909204601f810186900486028301860190965285825291949293858101939192919083018282801561077d5780601f106107525761010080835404028352916020019161077d565b820191906000526020600020905b81548152906001019060200180831161076057829003601f168201915b505050918352505060028201546001600160a01b03908116602080840191909152600384015490911660408084019190915280516080810182526004909401546001600160401b038082168652600160401b8204811693860193909352600160801b8104831691850191909152600160c01b9004166060838101919091520152835184908390811061080b57fe5b60209081029190910101526001016106bd565b60008581526003602052604090205485906001600160a01b0316331461085f5760405162461bcd60e51b815260040161085690612310565b60405180910390fd5b60308085049081028514801561087757506060810283145b6108935760405162461bcd60e51b81526004016108569061226f565b600087815260046020908152604080832060039092529091206108b4611bda565b506040805160808101825260048301546001600160401b038082168352600160401b820481166020840152600160801b8204811693830193909352600160c01b9004909116606082015260005b84811015610a8b57610911611c01565b6109246030830260208101908c8e612455565b8101906109319190611d47565b81526109496030838102908101906010018c8e612455565b8101906109569190611d47565b60801b602082015261097360606001840181029084028a8c612455565b8101906109809190611d77565b6080840152606083015260408201526020810151815117158015906109b45750608081015160608201516040830151171715155b6109d05760405162461bcd60e51b815260040161085690612399565b82516001600160401b03168201600090815260208681526040918290208351808255828501516001830181905584860151600284015560608601516003840155608086015160049093019290925592518f937fb56fb5426d4c9d04c3e9192f4a565931612ac78a7dc339e471744ba6f5cb5af393610a5093919201612050565b60408051601f19818403018152908290528651610a7a926001600160401b0390911687019061221b565b60405180910390a250600101610901565b5080516001600160401b039401841680825260049092018054602083015160408401516060909401518716600160c01b026001600160c01b03948816600160801b0267ffffffffffffffff60801b1992909816600160401b0267ffffffffffffffff60401b1967ffffffffffffffff1990941690961792909216949094179390931694909417161790915550505050505050565b6060816001600160401b0381118015610b3757600080fd5b50604051908082528060200260200182016040528015610b7157816020015b610b5e611c01565b815260200190600190039081610b565790505b5060008581526004602052604081209192505b83811015610bfc5781600082870181526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050838281518110610be957fe5b6020908102919091010152600101610b84565b50509392505050565b600080610c10611a57565b6001600160a01b0316610c21611335565b6001600160a01b031614610c475760405162461bcd60e51b815260040161085690612364565b6002805460018101909155604051631cf41a8160e01b81529092506001600160a01b037f00000000000000000000000016d0ff163e6430b99c3e23b8eecbf840a029dd881690631cf41a8190610ca19085906004016121fc565b602060405180830381600087803b158015610cbb57600080fd5b505af1158015610ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf39190611d2b565b600083815260036020526040902080546001600160a01b0319166001600160a01b038616178155909150610d2b600182018787611c2f565b506003810180546001600160a01b038085166001600160a01b0319928316179092556002830180549287169290911691909117905560405183907fc22ec753a623c56bd5943299a8993578abc8f26b9d4edb8dcf5765f21de93e2190610d969089908990899061222e565b60405180910390a250935093915050565b610daf611a57565b6001600160a01b0316610dc0611335565b6001600160a01b031614610de65760405162461bcd60e51b815260040161085690612364565b6002548210610e075760405162461bcd60e51b8152600401610856906122e3565b6000828152600360205260409081902080546001600160a01b0319166001600160a01b0384161790555182907f7415c19516e416f2bb44b7808912c3c83f37782a5f943753be2a91f02234f62c90610e60908490612071565b60405180910390a25050565b6001546060906000906001600160a01b03163314610e9c5760405162461bcd60e51b81526004016108569061233d565b6000848152600360205260409020610eb2611bda565b50604080516080810182526004808401546001600160401b038082168452600160401b820481166020808601918252600160801b8404831686880152600160c01b9093048216606086015260008b8152939092529390912090518251929391929082169188830191168111801590610f37575083606001516001600160401b03168111155b8015610f50575083604001516001600160401b03168111155b610f6c5760405162461bcd60e51b8152600401610856906123d0565b876001600160401b0381118015610f8257600080fd5b50604051908082528060200260200182016040528015610fbc57816020015b610fa9611c01565b815260200190600190039081610fa15790505b50965060005b8881101561104c5782810160009081526020858152604091829020825160a08101845281548152600182015492810192909252600281015492820192909252600382015460608201526004820154608082015289518a908490811061102357fe5b602090810291909101015260006002820181905560038201819055600490910155600101610fc2565b506001600160401b03808216602080870182905286516004808a0180546040808c015160608d01518916600160c01b026001600160c01b03918a16600160801b0267ffffffffffffffff60801b19600160401b909a0267ffffffffffffffff60401b1998909b1667ffffffffffffffff199095169490941796909616989098179690961617959095169190911790935560038801548251634231265760e01b815292516001600160a01b039091169363423126579380820193929190829003018186803b15801561111c57600080fd5b505afa158015611130573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111549190611d5f565b9550887ffc637b06d6fb827fa062d63fa3a907eacae3b7b56ff08382f07c089c85e431bc8960405161118691906121fc565b60405180910390a250505050509250929050565b6111a2611a57565b6001600160a01b03166111b3611335565b6001600160a01b0316146111d95760405162461bcd60e51b815260040161085690612364565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61122b611bda565b5060009081526003602090815260409182902082516080810184526004909101546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b90920416606082015290565b60025481565b611298611a57565b6001600160a01b03166112a9611335565b6001600160a01b0316146112cf5760405162461bcd60e51b815260040161085690612364565b60008281526003602052604090819020600401805467ffffffffffffffff60801b1916600160801b6001600160401b038516021790555182907f2a2a71b13711c4016bd62546912290b4716738240386fecd7b224f8e2b8a27dc90610e60908490612441565b6000546001600160a01b031690565b600254606090806001600160401b038111801561136057600080fd5b5060405190808252806020026020018201604052801561138a578160200160208202803683370190505b50915060005b8181101561065c576000818152600360208190526040909120015483516001600160a01b03909116908490839081106113c557fe5b6001600160a01b0390921660209283029190910190910152600101611390565b600090815260036020819052604090912001546001600160a01b031690565b60008181526003602052604090205481906001600160a01b0316331461143c5760405162461bcd60e51b815260040161085690612310565b61144582611a5b565b5050565b6001546001600160a01b031681565b6060816001600160401b038111801561147057600080fd5b506040519080825280602002602001820160405280156114a457816020015b606081526020019060019003908161148f5790505b5060008581526004602052604081209192505b83811015610bfc576000826000838801815260200190815260200160002090508060020154816003015482600401546040516020016114f893929190612205565b60405160208183030381529060405284838151811061151357fe5b6020908102919091010152506001016114b7565b61152f611c01565b506000828152600460208181526040808420858552825292839020835160a081018552815481526001820154928101929092526002810154938201939093526003830154606082015291015460808201525b92915050565b6000908152600360205260409020600201546001600160a01b031690565b7f00000000000000000000000016d0ff163e6430b99c3e23b8eecbf840a029dd8881565b60008281526003602052604090205482906001600160a01b031633146116015760405162461bcd60e51b815260040161085690612310565b6000838152600360205260409081902060020180546001600160a01b0319166001600160a01b0385161790555183907f0fd52a84c7f1d881bfae9637fce57846ea9d3b91d2558ebc4295cb8b54a1b8759061165d908590612071565b60405180910390a2505050565b600254606090806001600160401b038111801561168657600080fd5b506040519080825280602002602001820160405280156116b0578160200160208202803683370190505b50915060005b8181101561065c5760008181526003602052604090206002015483516001600160a01b03909116908490839081106116ea57fe5b6001600160a01b03909216602092830291909101909101526001016116b6565b6000818152600360208181526040808420909201548251634231265760e01b815292516001600160a01b03909116926342312657926004808301939192829003018186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115819190611d5f565b6060816001600160401b03811180156117ab57600080fd5b506040519080825280602002602001820160405280156117df57816020015b60608152602001906001900390816117ca5790505b5060008581526004602052604081209192505b83811015610bfc57848101600090815260208381526040918290208054600182015493519193611826939192909101612050565b60405160208183030381529060405284838151811061184157fe5b6020908102919091010152506001016117f2565b61185d611a57565b6001600160a01b031661186e611335565b6001600160a01b0316146118945760405162461bcd60e51b815260040161085690612364565b61189d81611b35565b50565b6118a8611a57565b6001600160a01b03166118b9611335565b6001600160a01b0316146118df5760405162461bcd60e51b815260040161085690612364565b60025460005b81811015611445576118f681611a5b565b6001016118e5565b611906611a57565b6001600160a01b0316611917611335565b6001600160a01b03161461193d5760405162461bcd60e51b815260040161085690612364565b6001600160a01b0381166119635760405162461bcd60e51b81526004016108569061229d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526003602052604090205482906001600160a01b031633146119f65760405162461bcd60e51b815260040161085690612310565b6000838152600360205260409081902060040180546001600160c01b0316600160c01b6001600160401b038616021790555183907f88d01455e50f0b0da01a455a4547346410a2fd66ffdc7241a4c280d6089c42579061165d908590612441565b3390565b6000818152600360205260409020611a71611bda565b50604080516080810182526004830180546001600160401b03600160401b808304821660208601819052600160c01b8085049093166060870181905281875286880182905267ffffffffffffffff19909416811767ffffffffffffffff60401b19169181029190911767ffffffffffffffff60801b1916600160801b8202176001600160c01b031692909102919091179091559151909184917fc25c241ebd25b7adbc10a6e20feaba2b2ad0fabcff3df0e8c217eb01238e38b29161165d91612441565b600180546001600160a01b0319166001600160a01b0383161790556040517f4da9c22c924692646a21cf1f423781ae3285198dc22e8a6912835d3272b90b3c90611b80908390612071565b60405180910390a150565b6040518060a0016040528060006001600160a01b031681526020016060815260200160006001600160a01b0316815260200160006001600160a01b03168152602001611bd5611bda565b905290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611c705782800160ff19823516178555611c9d565b82800160010185558215611c9d579182015b82811115611c9d578235825591602001919060010190611c82565b50611ca9929150611cad565b5090565b5b80821115611ca95760008155600101611cae565b60008083601f840112611cd3578182fd5b5081356001600160401b03811115611ce9578182fd5b602083019150836020828501011115611d0157600080fd5b9250929050565b600060208284031215611d19578081fd5b8135611d248161247d565b9392505050565b600060208284031215611d3c578081fd5b8151611d248161247d565b600060208284031215611d58578081fd5b5035919050565b600060208284031215611d70578081fd5b5051919050565b600080600060608486031215611d8b578182fd5b505081359360208301359350604090920135919050565b600080600060408486031215611db6578283fd5b83356001600160401b03811115611dcb578384fd5b611dd786828701611cc2565b9094509250506020840135611deb8161247d565b809150509250925092565b60008060408385031215611e08578182fd5b823591506020830135611e1a8161247d565b809150509250929050565b600080600080600060608688031215611e3c578081fd5b8535945060208601356001600160401b0380821115611e59578283fd5b611e6589838a01611cc2565b90965094506040880135915080821115611e7d578283fd5b50611e8a88828901611cc2565b969995985093965092949392505050565b60008060408385031215611ead578182fd5b50508035926020909101359150565b600080600060608486031215611d8b578283fd5b60008060408385031215611ee2578182fd5b8235915060208301356001600160401b0381168114611e1a578182fd5b6000815180845260208085019450808401835b83811015611f3857611f25878351611fc1565b60a0969096019590820190600101611f12565b509495945050505050565b60008151808452815b81811015611f6857602081850181015186830182015201611f4c565b81811115611f795782602083870101525b50601f01601f19169290920160200192915050565b80516001600160401b03908116835260208083015182169084015260408083015182169084015260609182015116910152565b80518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b600061010060018060a01b03808451168552602084015182602087015261201a83870182611f43565b9250508060408501511660408601528060608501511660608601525060808301516120486080860182611f8e565b509392505050565b9182526fffffffffffffffffffffffffffffffff1916602082015260300190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b818110156120c65783516001600160a01b0316835292840192918401916001016120a1565b50909695505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561212557603f19888603018452612113858351611f43565b945092850192908501906001016120f7565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156120c657612161838551611f8e565b928401926080929092019160010161214e565b600060208252611d246020830184611eff565b60006040825261219a6040830185611eff565b90508260208301529392505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561212557603f198886030184526121ea858351611ff1565b945092850192908501906001016121ce565b90815260200190565b9283526020830191909152604082015260600190565b60006040825261219a6040830185611f43565b6000604082528360408301528385606084013760608483018101919091526001600160a01b03929092166020820152601f909201601f191690910101919050565b602080825260149082015273092dcecc2d8d2c840e0c2e4c2da40d8cadccee8d60631b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b602080825260139082015272125b9d985b1a59081bdc195c985d1bdc881251606a1b604082015260600190565b60208082526013908201527227b7363c9037b832b930ba37b91037bbb732b960691b604082015260600190565b6020808252600d908201526c4f6e6c7920737472617465677960981b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526019908201527f456d707479207075626b6579206f72207369676e617475726500000000000000604082015260600190565b6020808252601190820152704e6f20656e6f756768207075626b65797360781b604082015260600190565b608081016115818284611f8e565b60a081016115818284611fc1565b600060208252611d246020830184611ff1565b9182526001600160a01b0316602082015260400190565b6001600160401b0391909116815260200190565b60008085851115612464578182fd5b83861115612470578182fd5b5050820193919092039150565b6001600160a01b038116811461189d57600080fdfea26469706673582212208cbc8cb83b6199ff37b37b4b1ab77e708ca712a7cf708e214a81a5e9d1406f1364736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000066453f68d6dbcf7859e08f0c43df74e6da06ef8c00000000000000000000000016d0ff163e6430b99c3e23b8eecbf840a029dd88
-----Decoded View---------------
Arg [0] : strategy_ (address): 0x66453f68D6DBcF7859e08f0C43DF74e6Da06eF8C
Arg [1] : withdrawalManagerFactory_ (address): 0x16d0fF163E6430b99c3E23b8EeCbF840A029dd88
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000066453f68d6dbcf7859e08f0c43df74e6da06ef8c
Arg [1] : 00000000000000000000000016d0ff163e6430b99c3e23b8eecbf840a029dd88
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.