Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ProxyUtils
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Multiple files format)
/* Copyright 2019-2022 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // SPDX-License-Identifier: Apache-2.0. pragma solidity ^0.6.12; import "SubContractor.sol"; import "ProxyGovernance.sol"; import "ProxyStorage.sol"; import "StorageSlots.sol"; contract ProxyUtils is SubContractor, StorageSlots, ProxyGovernance, ProxyStorage { event ImplementationActivationRescheduled( address indexed implementation, uint256 updatedActivationTime ); function initialize( bytes calldata /* data */ ) external override { revert("NOT_IMPLEMENTED"); } function initializerSize() external view override returns (uint256) { return 0; } function storedActivationDelay() internal view returns (uint256 delay) { bytes32 slot = UPGRADE_DELAY_SLOT; assembly { delay := sload(slot) } return delay; } function updateImplementationActivationTime( address implementation, bytes calldata data, bool finalize ) external onlyGovernance { uint256 updatedActivationTime = block.timestamp + storedActivationDelay(); // We assume the Proxy is of the old format. bytes32 oldFormatInitHash = keccak256(abi.encode(data, finalize)); require( initializationHash_DEPRECATED[implementation] == oldFormatInitHash, "IMPLEMENTATION_NOT_PENDING" ); // Converting address to bytes32 to match the mapping key type. bytes32 implementationKey; assembly { implementationKey := implementation } uint256 pendingActivationTime = enabledTime[implementationKey]; require(pendingActivationTime > 0, "IMPLEMENTATION_NOT_PENDING"); // Current value is checked to be within a reasonable delay. If it's over 6 months from now, // it's assumed that the activation time is configured under a different set of rules. require( pendingActivationTime < block.timestamp + 180 days, "INVALID_PENDING_ACTIVATION_TIME" ); if (updatedActivationTime < pendingActivationTime) { enabledTime[implementationKey] = updatedActivationTime; emit ImplementationActivationRescheduled(implementation, updatedActivationTime); } } function validatedSelectors() external pure override returns (bytes4[] memory selectors) { // This sub-contract has no selectors to validate. selectors = new bytes4[](0); } function identify() external pure override returns (string memory) { return "StarkWare_ProxyUtils_2022_2"; } }
/* Copyright 2019-2022 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // SPDX-License-Identifier: Apache-2.0. pragma solidity ^0.6.12; import "MGovernance.sol"; /* Implements Generic Governance, applicable for both proxy and main contract, and possibly others. Notes: The use of the same function names by both the Proxy and a delegated implementation is not possible since calling the implementation functions is done via the default function of the Proxy. For this reason, for example, the implementation of MainContract (MainGovernance) exposes mainIsGovernor, which calls the internal _isGovernor method. */ abstract contract Governance is MGovernance { event LogNominatedGovernor(address nominatedGovernor); event LogNewGovernorAccepted(address acceptedGovernor); event LogRemovedGovernor(address removedGovernor); event LogNominationCancelled(); function getGovernanceInfo() internal view virtual returns (GovernanceInfoStruct storage); /* Current code intentionally prevents governance re-initialization. This may be a problem in an upgrade situation, in a case that the upgrade-to implementation performs an initialization (for real) and within that calls initGovernance(). Possible workarounds: 1. Clearing the governance info altogether by changing the MAIN_GOVERNANCE_INFO_TAG. This will remove existing main governance information. 2. Modify the require part in this function, so that it will exit quietly when trying to re-initialize (uncomment the lines below). */ function initGovernance() internal { GovernanceInfoStruct storage gub = getGovernanceInfo(); require(!gub.initialized, "ALREADY_INITIALIZED"); gub.initialized = true; // to ensure addGovernor() won't fail. // Add the initial governer. addGovernor(msg.sender); } function _isGovernor(address testGovernor) internal view override returns (bool) { GovernanceInfoStruct storage gub = getGovernanceInfo(); return gub.effectiveGovernors[testGovernor]; } /* Cancels the nomination of a governor candidate. */ function _cancelNomination() internal onlyGovernance { GovernanceInfoStruct storage gub = getGovernanceInfo(); gub.candidateGovernor = address(0x0); emit LogNominationCancelled(); } function _nominateNewGovernor(address newGovernor) internal onlyGovernance { GovernanceInfoStruct storage gub = getGovernanceInfo(); require(!_isGovernor(newGovernor), "ALREADY_GOVERNOR"); gub.candidateGovernor = newGovernor; emit LogNominatedGovernor(newGovernor); } /* The addGovernor is called in two cases: 1. by _acceptGovernance when a new governor accepts its role. 2. by initGovernance to add the initial governor. The difference is that the init path skips the nominate step that would fail because of the onlyGovernance modifier. */ function addGovernor(address newGovernor) private { require(!_isGovernor(newGovernor), "ALREADY_GOVERNOR"); GovernanceInfoStruct storage gub = getGovernanceInfo(); gub.effectiveGovernors[newGovernor] = true; } function _acceptGovernance() internal { // The new governor was proposed as a candidate by the current governor. GovernanceInfoStruct storage gub = getGovernanceInfo(); require(msg.sender == gub.candidateGovernor, "ONLY_CANDIDATE_GOVERNOR"); // Update state. addGovernor(gub.candidateGovernor); gub.candidateGovernor = address(0x0); // Send a notification about the change of governor. emit LogNewGovernorAccepted(msg.sender); } /* Remove a governor from office. */ function _removeGovernor(address governorForRemoval) internal onlyGovernance { require(msg.sender != governorForRemoval, "GOVERNOR_SELF_REMOVE"); GovernanceInfoStruct storage gub = getGovernanceInfo(); require(_isGovernor(governorForRemoval), "NOT_GOVERNOR"); gub.effectiveGovernors[governorForRemoval] = false; emit LogRemovedGovernor(governorForRemoval); } }
/* Copyright 2019-2022 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // SPDX-License-Identifier: Apache-2.0. pragma solidity ^0.6.12; import "MGovernance.sol"; /* Holds the governance slots for ALL entities, including proxy and the main contract. */ contract GovernanceStorage { // A map from a Governor tag to its own GovernanceInfoStruct. mapping(string => GovernanceInfoStruct) internal governanceInfo; //NOLINT uninitialized-state. }
/* Copyright 2019-2022 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // SPDX-License-Identifier: Apache-2.0. pragma solidity ^0.6.12; interface Identity { /* Allows a caller, typically another contract, to ensure that the provided address is of the expected type and version. */ function identify() external pure returns (string memory); }
/* Copyright 2019-2022 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // SPDX-License-Identifier: Apache-2.0. pragma solidity ^0.6.12; struct GovernanceInfoStruct { mapping(address => bool) effectiveGovernors; address candidateGovernor; bool initialized; } abstract contract MGovernance { function _isGovernor(address testGovernor) internal view virtual returns (bool); /* Allows calling the function only by a Governor. */ modifier onlyGovernance() { require(_isGovernor(msg.sender), "ONLY_GOVERNANCE"); _; } }
/* Copyright 2019-2022 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // SPDX-License-Identifier: Apache-2.0. pragma solidity ^0.6.12; import "Governance.sol"; import "GovernanceStorage.sol"; /** The Proxy contract is governed by one or more Governors of which the initial one is the deployer of the contract. A governor has the sole authority to perform the following operations: 1. Nominate additional governors (:sol:func:`proxyNominateNewGovernor`) 2. Remove other governors (:sol:func:`proxyRemoveGovernor`) 3. Add new `implementations` (proxied contracts) 4. Remove (new or old) `implementations` 5. Update `implementations` after a timelock allows it Adding governors is performed in a two step procedure: 1. First, an existing governor nominates a new governor (:sol:func:`proxyNominateNewGovernor`) 2. Then, the new governor must accept governance to become a governor (:sol:func:`proxyAcceptGovernance`) This two step procedure ensures that a governor public key cannot be nominated unless there is an entity that has the corresponding private key. This is intended to prevent errors in the addition process. The governor private key should typically be held in a secure cold wallet or managed via a multi-sig contract. */ /* Implements Governance for the proxy contract. It is a thin wrapper to the Governance contract, which is needed so that it can have non-colliding function names, and a specific tag (key) to allow unique state storage. */ contract ProxyGovernance is GovernanceStorage, Governance { // The tag is the string key that is used in the Governance storage mapping. string public constant PROXY_GOVERNANCE_TAG = "StarkEx.Proxy.2019.GovernorsInformation"; /* Returns the GovernanceInfoStruct associated with the governance tag. */ function getGovernanceInfo() internal view override returns (GovernanceInfoStruct storage) { return governanceInfo[PROXY_GOVERNANCE_TAG]; } function proxyIsGovernor(address testGovernor) external view returns (bool) { return _isGovernor(testGovernor); } function proxyNominateNewGovernor(address newGovernor) external { _nominateNewGovernor(newGovernor); } function proxyRemoveGovernor(address governorForRemoval) external { _removeGovernor(governorForRemoval); } function proxyAcceptGovernance() external { _acceptGovernance(); } function proxyCancelNomination() external { _cancelNomination(); } }
/* Copyright 2019-2022 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // SPDX-License-Identifier: Apache-2.0. pragma solidity ^0.6.12; import "GovernanceStorage.sol"; /* Holds the Proxy-specific state variables. This contract is inherited by the GovernanceStorage (and indirectly by MainStorage) to prevent collision hazard. */ contract ProxyStorage is GovernanceStorage { // NOLINTNEXTLINE: naming-convention uninitialized-state. mapping(address => bytes32) internal initializationHash_DEPRECATED; // The time after which we can switch to the implementation. // Hash(implementation, data, finalize) => time. mapping(bytes32 => uint256) internal enabledTime; // A central storage of the flags whether implementation has been initialized. // Note - it can be used flexibly enough to accommodate multiple levels of initialization // (i.e. using different key salting schemes for different initialization levels). mapping(bytes32 => bool) internal initialized; }
/* Copyright 2019-2022 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // SPDX-License-Identifier: Apache-2.0. pragma solidity ^0.6.12; /** StorageSlots holds the arbitrary storage slots used throughout the Proxy pattern. Storage address slots are a mechanism to define an arbitrary location, that will not be overlapped by the logical contracts. */ contract StorageSlots { // Storage slot with the address of the current implementation. // The address of the slot is keccak256("StarkWare2019.implemntation-slot"). // We need to keep this variable stored outside of the commonly used space, // so that it's not overrun by the logical implementation (the proxied contract). bytes32 internal constant IMPLEMENTATION_SLOT = 0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24; // Storage slot with the address of the call-proxy current implementation. // The address of the slot is keccak256("'StarkWare2020.CallProxy.Implemntation.Slot'"). // We need to keep this variable stored outside of the commonly used space. // so that it's not overrun by the logical implementation (the proxied contract). bytes32 internal constant CALL_PROXY_IMPL_SLOT = 0x7184681641399eb4ad2fdb92114857ee6ff239f94ad635a1779978947b8843be; // This storage slot stores the finalization flag. // Once the value stored in this slot is set to non-zero // the proxy blocks implementation upgrades. // The current implementation is then referred to as Finalized. // Web3.solidityKeccak(['string'], ["StarkWare2019.finalization-flag-slot"]). bytes32 internal constant FINALIZED_STATE_SLOT = 0x7d433c6f837e8f93009937c466c82efbb5ba621fae36886d0cac433c5d0aa7d2; // Storage slot to hold the upgrade delay (time-lock). // The intention of this slot is to allow modification using an EIC. // Web3.solidityKeccak(['string'], ['StarkWare.Upgradibility.Delay.Slot']). bytes32 public constant UPGRADE_DELAY_SLOT = 0xc21dbb3089fcb2c4f4c6a67854ab4db2b0f233ea4b21b21f912d52d18fc5db1f; }
/* Copyright 2019-2022 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // SPDX-License-Identifier: Apache-2.0. pragma solidity ^0.6.12; import "Identity.sol"; interface SubContractor is Identity { function initialize(bytes calldata data) external; function initializerSize() external view returns (uint256); /* Returns an array with selectors for validation. These selectors are the critical ones for maintaining self custody and anti censorship. During the upgrade process, as part of the sub-contract validation, the MainDispatcher validates that the selectos are mapped to the correct sub-contract. */ function validatedSelectors() external pure returns (bytes4[] memory); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"},{"indexed":false,"internalType":"uint256","name":"updatedActivationTime","type":"uint256"}],"name":"ImplementationActivationRescheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"acceptedGovernor","type":"address"}],"name":"LogNewGovernorAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nominatedGovernor","type":"address"}],"name":"LogNominatedGovernor","type":"event"},{"anonymous":false,"inputs":[],"name":"LogNominationCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"removedGovernor","type":"address"}],"name":"LogRemovedGovernor","type":"event"},{"inputs":[],"name":"PROXY_GOVERNANCE_TAG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_DELAY_SLOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"identify","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializerSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyAcceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxyCancelNomination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"testGovernor","type":"address"}],"name":"proxyIsGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernor","type":"address"}],"name":"proxyNominateNewGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governorForRemoval","type":"address"}],"name":"proxyRemoveGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"finalize","type":"bool"}],"name":"updateImplementationActivationTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validatedSelectors","outputs":[{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50610be6806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806356f36dbf1161007157806356f36dbf146102495780636684b1d6146102c65780638757653f146102ce578063b449ea5d146102f4578063eeb728661461032e578063f9bcdde414610336576100b4565b806302a93fae146100b95780630ebdac031461013b57806312f16e6d1461019357806320cea94d146101b95780633cc660ad146101d3578063439fab91146101db575b600080fd5b610139600480360360608110156100cf57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156100f957600080fd5b82018360208201111561010b57600080fd5b803590602001918460018302840111600160201b8311171561012c57600080fd5b919350915035151561033e565b005b61014361058b565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561017f578181015183820152602001610167565b505050509050019250505060405180910390f35b610139600480360360208110156101a957600080fd5b50356001600160a01b031661059d565b6101c16105a9565b60408051918252519081900360200190f35b6101c16105cd565b610139600480360360208110156101f157600080fd5b810190602081018135600160201b81111561020b57600080fd5b82018360208201111561021d57600080fd5b803590602001918460018302840111600160201b8311171561023e57600080fd5b5090925090506105d2565b610251610611565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028b578181015183820152602001610273565b50505050905090810190601f1680156102b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013961062d565b610139600480360360208110156102e457600080fd5b50356001600160a01b0316610637565b61031a6004803603602081101561030a57600080fd5b50356001600160a01b0316610640565b604080519115158252519081900360200190f35b610251610651565b610139610688565b61034733610690565b61038a576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b60006103946106bf565b420190506000848484604051602001808060200183151581526020018281038252858582818152602001925080828437600081840152601f19601f8201169050808301925050509450505050506040516020818303038152906040528051906020012090508060016000886001600160a01b03166001600160a01b03168152602001908152602001600020541461046f576040805162461bcd60e51b815260206004820152601a602482015279494d504c454d454e544154494f4e5f4e4f545f50454e44494e4760301b604482015290519081900360640190fd5b6000868152600260205260409020548690806104cf576040805162461bcd60e51b815260206004820152601a602482015279494d504c454d454e544154494f4e5f4e4f545f50454e44494e4760301b604482015290519081900360640190fd5b4262ed4e00018110610528576040805162461bcd60e51b815260206004820152601f60248201527f494e56414c49445f50454e44494e475f41435449564154494f4e5f54494d4500604482015290519081900360640190fd5b8084101561058157600082815260026020908152604091829020869055815186815291516001600160a01b038b16927fdda7b7d1f8141bd98b4378ee60e6231f89598ca02949a9d0550904dc96efeeb792908290030190a25b5050505050505050565b60408051600081526020810190915290565b6105a6816106e4565b50565b7fc21dbb3089fcb2c4f4c6a67854ab4db2b0f233ea4b21b21f912d52d18fc5db1f81565b600090565b6040805162461bcd60e51b815260206004820152600f60248201526e1393d517d253541311535153951151608a1b604482015290519081900360640190fd5b604051806060016040528060278152602001610b8a6027913981565b610635610831565b565b6105a6816108f8565b600061064b82610690565b92915050565b60408051808201909152601b81527f537461726b576172655f50726f78795574696c735f323032325f320000000000602082015290565b6106356109f5565b60008061069b610a8c565b6001600160a01b039390931660009081526020939093525050604090205460ff1690565b7fc21dbb3089fcb2c4f4c6a67854ab4db2b0f233ea4b21b21f912d52d18fc5db1f5490565b6106ed33610690565b610730576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b336001600160a01b0382161415610785576040805162461bcd60e51b8152602060048201526014602482015273474f5645524e4f525f53454c465f52454d4f564560601b604482015290519081900360640190fd5b600061078f610a8c565b905061079a82610690565b6107da576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa3a7ab22a92727a960a11b604482015290519081900360640190fd5b6001600160a01b03821660008181526020838152604091829020805460ff19169055815192835290517fd75f94825e770b8b512be8e74759e252ad00e102e38f50cce2f7c6f868a295999281900390910190a15050565b600061083b610a8c565b60018101549091506001600160a01b03163314610899576040805162461bcd60e51b815260206004820152601760248201527627a7262cafa1a0a72224a220aa22afa3a7ab22a92727a960491b604482015290519081900360640190fd5b60018101546108b0906001600160a01b0316610b09565b6001810180546001600160a01b03191690556040805133815290517fcfb473e6c03f9a29ddaf990e736fa3de5188a0bd85d684f5b6e164ebfbfff5d29181900360200190a150565b61090133610690565b610944576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b600061094e610a8c565b905061095982610690565b1561099e576040805162461bcd60e51b815260206004820152601060248201526f20a62922a0a22cafa3a7ab22a92727a960811b604482015290519081900360640190fd5b6001810180546001600160a01b0384166001600160a01b0319909116811790915560408051918252517f6166272c8d3f5f579082f2827532732f97195007983bb5b83ac12c56700b01a69181900360200190a15050565b6109fe33610690565b610a41576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b6000610a4b610a8c565b6001810180546001600160a01b03191690556040519091507f7a8dc7dd7fffb43c4807438fa62729225156941e641fd877938f4edade3429f590600090a150565b600080604051806060016040528060278152602001610b8a602791396040518082805190602001908083835b60208310610ad75780518252601f199092019160209182019101610ab8565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092209392505050565b610b1281610690565b15610b57576040805162461bcd60e51b815260206004820152601060248201526f20a62922a0a22cafa3a7ab22a92727a960811b604482015290519081900360640190fd5b6000610b61610a8c565b6001600160a01b0390921660009081526020929092525060409020805460ff1916600117905556fe537461726b45782e50726f78792e323031392e476f7665726e6f7273496e666f726d6174696f6ea2646970667358221220a3ea44cbf93f3ab8080b841385f407cdd37ba459922ce3c8f9cfb3b1a4a18c1464736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806356f36dbf1161007157806356f36dbf146102495780636684b1d6146102c65780638757653f146102ce578063b449ea5d146102f4578063eeb728661461032e578063f9bcdde414610336576100b4565b806302a93fae146100b95780630ebdac031461013b57806312f16e6d1461019357806320cea94d146101b95780633cc660ad146101d3578063439fab91146101db575b600080fd5b610139600480360360608110156100cf57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156100f957600080fd5b82018360208201111561010b57600080fd5b803590602001918460018302840111600160201b8311171561012c57600080fd5b919350915035151561033e565b005b61014361058b565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561017f578181015183820152602001610167565b505050509050019250505060405180910390f35b610139600480360360208110156101a957600080fd5b50356001600160a01b031661059d565b6101c16105a9565b60408051918252519081900360200190f35b6101c16105cd565b610139600480360360208110156101f157600080fd5b810190602081018135600160201b81111561020b57600080fd5b82018360208201111561021d57600080fd5b803590602001918460018302840111600160201b8311171561023e57600080fd5b5090925090506105d2565b610251610611565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028b578181015183820152602001610273565b50505050905090810190601f1680156102b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013961062d565b610139600480360360208110156102e457600080fd5b50356001600160a01b0316610637565b61031a6004803603602081101561030a57600080fd5b50356001600160a01b0316610640565b604080519115158252519081900360200190f35b610251610651565b610139610688565b61034733610690565b61038a576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b60006103946106bf565b420190506000848484604051602001808060200183151581526020018281038252858582818152602001925080828437600081840152601f19601f8201169050808301925050509450505050506040516020818303038152906040528051906020012090508060016000886001600160a01b03166001600160a01b03168152602001908152602001600020541461046f576040805162461bcd60e51b815260206004820152601a602482015279494d504c454d454e544154494f4e5f4e4f545f50454e44494e4760301b604482015290519081900360640190fd5b6000868152600260205260409020548690806104cf576040805162461bcd60e51b815260206004820152601a602482015279494d504c454d454e544154494f4e5f4e4f545f50454e44494e4760301b604482015290519081900360640190fd5b4262ed4e00018110610528576040805162461bcd60e51b815260206004820152601f60248201527f494e56414c49445f50454e44494e475f41435449564154494f4e5f54494d4500604482015290519081900360640190fd5b8084101561058157600082815260026020908152604091829020869055815186815291516001600160a01b038b16927fdda7b7d1f8141bd98b4378ee60e6231f89598ca02949a9d0550904dc96efeeb792908290030190a25b5050505050505050565b60408051600081526020810190915290565b6105a6816106e4565b50565b7fc21dbb3089fcb2c4f4c6a67854ab4db2b0f233ea4b21b21f912d52d18fc5db1f81565b600090565b6040805162461bcd60e51b815260206004820152600f60248201526e1393d517d253541311535153951151608a1b604482015290519081900360640190fd5b604051806060016040528060278152602001610b8a6027913981565b610635610831565b565b6105a6816108f8565b600061064b82610690565b92915050565b60408051808201909152601b81527f537461726b576172655f50726f78795574696c735f323032325f320000000000602082015290565b6106356109f5565b60008061069b610a8c565b6001600160a01b039390931660009081526020939093525050604090205460ff1690565b7fc21dbb3089fcb2c4f4c6a67854ab4db2b0f233ea4b21b21f912d52d18fc5db1f5490565b6106ed33610690565b610730576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b336001600160a01b0382161415610785576040805162461bcd60e51b8152602060048201526014602482015273474f5645524e4f525f53454c465f52454d4f564560601b604482015290519081900360640190fd5b600061078f610a8c565b905061079a82610690565b6107da576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa3a7ab22a92727a960a11b604482015290519081900360640190fd5b6001600160a01b03821660008181526020838152604091829020805460ff19169055815192835290517fd75f94825e770b8b512be8e74759e252ad00e102e38f50cce2f7c6f868a295999281900390910190a15050565b600061083b610a8c565b60018101549091506001600160a01b03163314610899576040805162461bcd60e51b815260206004820152601760248201527627a7262cafa1a0a72224a220aa22afa3a7ab22a92727a960491b604482015290519081900360640190fd5b60018101546108b0906001600160a01b0316610b09565b6001810180546001600160a01b03191690556040805133815290517fcfb473e6c03f9a29ddaf990e736fa3de5188a0bd85d684f5b6e164ebfbfff5d29181900360200190a150565b61090133610690565b610944576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b600061094e610a8c565b905061095982610690565b1561099e576040805162461bcd60e51b815260206004820152601060248201526f20a62922a0a22cafa3a7ab22a92727a960811b604482015290519081900360640190fd5b6001810180546001600160a01b0384166001600160a01b0319909116811790915560408051918252517f6166272c8d3f5f579082f2827532732f97195007983bb5b83ac12c56700b01a69181900360200190a15050565b6109fe33610690565b610a41576040805162461bcd60e51b815260206004820152600f60248201526e4f4e4c595f474f5645524e414e434560881b604482015290519081900360640190fd5b6000610a4b610a8c565b6001810180546001600160a01b03191690556040519091507f7a8dc7dd7fffb43c4807438fa62729225156941e641fd877938f4edade3429f590600090a150565b600080604051806060016040528060278152602001610b8a602791396040518082805190602001908083835b60208310610ad75780518252601f199092019160209182019101610ab8565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092209392505050565b610b1281610690565b15610b57576040805162461bcd60e51b815260206004820152601060248201526f20a62922a0a22cafa3a7ab22a92727a960811b604482015290519081900360640190fd5b6000610b61610a8c565b6001600160a01b0390921660009081526020929092525060409020805460ff1916600117905556fe537461726b45782e50726f78792e323031392e476f7665726e6f7273496e666f726d6174696f6ea2646970667358221220a3ea44cbf93f3ab8080b841385f407cdd37ba459922ce3c8f9cfb3b1a4a18c1464736f6c634300060c0033
Deployed Bytecode Sourcemap
775:2410:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1433:1426;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1433:1426:6;;;;;;;;;;;;;;;-1:-1:-1;;;1433:1426:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1433:1426:6;;;;;;;;;;;;-1:-1:-1;1433:1426:6;-1:-1:-1;1433:1426:6;;;;:::i;:::-;;2865:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2766:118:4;;;;;;;;;;;;;;;;-1:-1:-1;2766:118:4;-1:-1:-1;;;;;2766:118:4;;:::i;2479:119:7:-;;;:::i;:::-;;;;;;;;;;;;;;;;1123:93:6;;;:::i;996:121::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;996:121:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;996:121:6;;;;;;;;;;-1:-1:-1;996:121:6;;-1:-1:-1;996:121:6;-1:-1:-1;996:121:6;:::i;2175:87:4:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2890:78;;;:::i;2646:114::-;;;;;;;;;;;;;;;;-1:-1:-1;2646:114:4;-1:-1:-1;;;;;2646:114:4;;:::i;2515:125::-;;;;;;;;;;;;;;;;-1:-1:-1;2515:125:4;-1:-1:-1;;;;;2515:125:4;;:::i;:::-;;;;;;;;;;;;;;;;;;3063:120:6;;;:::i;2974:78:4:-;;;:::i;1433:1426:6:-;1031:23:3;1043:10;1031:11;:23::i;:::-;1023:51;;;;;-1:-1:-1;;;1023:51:3;;;;;;;;;;;;-1:-1:-1;;;1023:51:3;;;;;;;;;;;;;;;1601:29:6::1;1651:23;:21;:23::i;:::-;1633:15;:41;1601:73;;1738:25;1787:4;;1793:8;1776:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1766:37;;;;;;1738:65;;1883:17;1834:29;:45;1864:14;-1:-1:-1::0;;;;;1834:45:6::1;-1:-1:-1::0;;;;;1834:45:6::1;;;;;;;;;;;;;:66;1813:139;;;::::0;;-1:-1:-1;;;1813:139:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;1813:139:6;;;;;;;;;;;;;::::1;;2035:25;2179:30:::0;;;:11:::1;:30;::::0;;;;;2114:14;;2228:25;2220:64:::1;;;::::0;;-1:-1:-1;;;2220:64:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;2220:64:6;;;;;;;;;;;;;::::1;;2536:15;2554:8;2536:26;2512:21;:50;2491:128;;;::::0;;-1:-1:-1;;;2491:128:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;2658:21;2634;:45;2630:223;;;2695:30;::::0;;;:11:::1;:30;::::0;;;;;;;;:54;;;2768:74;;;;;;;-1:-1:-1;;;;;2768:74:6;::::1;::::0;::::1;::::0;;;;;;;::::1;2630:223;1084:1:3;;;;1433:1426:6::0;;;;:::o;2865:192::-;3035:15;;;3048:1;3035:15;;;;;;;;;2865:192::o;2766:118:4:-;2842:35;2858:18;2842:15;:35::i;:::-;2766:118;:::o;2479:119:7:-;2532:66;2479:119;:::o;1123:93:6:-;1182:7;1123:93;:::o;996:121::-;1085:25;;;-1:-1:-1;;;1085:25:6;;;;;;;;;;;;-1:-1:-1;;;1085:25:6;;;;;;;;;;;;;;2175:87:4;;;;;;;;;;;;;;;;;;;:::o;2890:78::-;2942:19;:17;:19::i;:::-;2890:78::o;2646:114::-;2720:33;2741:11;2720:20;:33::i;2515:125::-;2585:4;2608:25;2620:12;2608:11;:25::i;:::-;2601:32;2515:125;-1:-1:-1;;2515:125:4:o;3063:120:6:-;3140:36;;;;;;;;;;;;;;;;;3063:120;:::o;2974:78:4:-;3026:19;:17;:19::i;2423:205:0:-;2498:4;2514:32;2549:19;:17;:19::i;:::-;-1:-1:-1;;;;;2585:36:0;;;;:22;:36;;;;;;;;-1:-1:-1;;2585:36:0;;;;;;;2423:205::o;1222::6:-;2532:66:7;1378:11:6;1222:205;:::o;4337:402:0:-;1031:23:3;1043:10;1031:11;:23::i;:::-;1023:51;;;;;-1:-1:-1;;;1023:51:3;;;;;;;;;;;;-1:-1:-1;;;1023:51:3;;;;;;;;;;;;;;;4432:10:0::1;-1:-1:-1::0;;;;;4432:32:0;::::1;;;4424:65;;;::::0;;-1:-1:-1;;;4424:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;4424:65:0;;;;;;;;;;;;;::::1;;4499:32;4534:19;:17;:19::i;:::-;4499:54;;4571:31;4583:18;4571:11;:31::i;:::-;4563:56;;;::::0;;-1:-1:-1;;;4563:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;4563:56:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;4629:42:0;::::1;4674:5;4629:42:::0;;;::::1;::::0;;;;;;;;:50;;-1:-1:-1;;4629:50:0::1;::::0;;4694:38;;;;;;;::::1;::::0;;;;;;;;::::1;1084:1:3;4337:402:0::0;:::o;3782:498::-;3911:32;3946:19;:17;:19::i;:::-;3997:21;;;;;;-1:-1:-1;;;;;;3997:21:0;3983:10;:35;3975:71;;;;;-1:-1:-1;;;3975:71:0;;;;;;;;;;;;-1:-1:-1;;;3975:71:0;;;;;;;;;;;;;;;4094:21;;;;4082:34;;-1:-1:-1;;;;;4094:21:0;4082:11;:34::i;:::-;4126:21;;;:36;;-1:-1:-1;;;;;;4126:36:0;;;4239:34;;;4262:10;4239:34;;;;;;;;;;;;;3782:498;:::o;2917:303::-;1031:23:3;1043:10;1031:11;:23::i;:::-;1023:51;;;;;-1:-1:-1;;;1023:51:3;;;;;;;;;;;;-1:-1:-1;;;1023:51:3;;;;;;;;;;;;;;;3002:32:0::1;3037:19;:17;:19::i;:::-;3002:54;;3075:24;3087:11;3075;:24::i;:::-;3074:25;3066:54;;;::::0;;-1:-1:-1;;;3066:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;3066:54:0;;;;;;;;;;;;;::::1;;3130:21;::::0;::::1;:35:::0;;-1:-1:-1;;;;;3130:35:0;::::1;-1:-1:-1::0;;;;;;3130:35:0;;::::1;::::0;::::1;::::0;;;3180:33:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;1084:1:3;2917:303:0::0;:::o;2702:209::-;1031:23:3;1043:10;1031:11;:23::i;:::-;1023:51;;;;;-1:-1:-1;;;1023:51:3;;;;;;;;;;;;-1:-1:-1;;;1023:51:3;;;;;;;;;;;;;;;2765:32:0::1;2800:19;:17;:19::i;:::-;2829:21;::::0;::::1;:36:::0;;-1:-1:-1;;;;;;2829:36:0::1;::::0;;2880:24:::1;::::0;2765:54;;-1:-1:-1;2880:24:0::1;::::0;2861:3:::1;::::0;2880:24:::1;1084:1:3;2702:209:0:o:0;2358:151:4:-;2419:28;2466:14;2481:20;;;;;;;;;;;;;;;;;2466:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2466:36:4;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2466:36:4;;;;;;;;;;;;;;;;-1:-1:-1;2466:36:4;;;;;;;;;;;2358:151;-1:-1:-1;;;2358:151:4:o;3539:237:0:-;3608:24;3620:11;3608;:24::i;:::-;3607:25;3599:54;;;;;-1:-1:-1;;;3599:54:0;;;;;;;;;;;;-1:-1:-1;;;3599:54:0;;;;;;;;;;;;;;;3663:32;3698:19;:17;:19::i;:::-;-1:-1:-1;;;;;3727:35:0;;;:22;:35;;;;;;;;-1:-1:-1;3727:35:0;;;:42;;-1:-1:-1;;3727:42:0;3765:4;3727:42;;;3539:237::o
Swarm Source
ipfs://a3ea44cbf93f3ab8080b841385f407cdd37ba459922ce3c8f9cfb3b1a4a18c14
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.