Source Code
Overview
S Balance
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
InitialProxyImplementationWithOwner
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 200 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import { UUPSImplementation } from "src/proxy/UUPSImplementation.sol"; import { Ownable } from "src/ownership/Ownable.sol"; /** * @dev The below contract is only used as an intermediary implementation contract * when initializing the proxy to make sure that, when deployed using CREATE2, * we always get the same contract address since the bytecode is deterministic. */ contract InitialProxyImplementationWithOwner is UUPSImplementation, Ownable { constructor() Ownable(address(this)) { } function upgradeTo(address newImplementation) public override { _onlyOwner(); // If the current implementation is the same as the new one, we return blank to avoid the NoChange Error event. // This is helpful when trying to build the package for the first time, so that we can smoothly upgrade the proxy impl if (newImplementation == this.getImplementation()) { emit Upgraded(address(this), newImplementation); return; } _upgradeTo(newImplementation); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.21; library AddressUtil { function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.21; /** * @title Contract for facilitating ownership by a single address, using the Openzeppelin ownable upgradable storage slot. * @dev Implementation is a modified version of Openzeppelin and Synthetix Ownable implementations. */ interface IOwnable { /*/////////////////////////////////////////////////////////////// ERRORS ///////////////////////////////////////////////////////////////*/ /** * @notice Thrown when an address tries to accept ownership but has not been nominated. * @param addr The address that is trying to accept ownership. */ error NotNominated(address addr); /** * @notice Thrown when an address tries to renounce pending ownership but not owner or pending owner. * @param addr The address that is trying to renounce pending ownership. */ error NotNominatedOrOwner(address addr); /** * @notice Thrown when an address is zero. */ error ZeroAddress(); /** * @notice Thrown when no change is made. */ error NoChange(); /** * @notice Thrown when an address is not the owner. */ error Unauthorized(address addr); /*/////////////////////////////////////////////////////////////// EVENTS ///////////////////////////////////////////////////////////////*/ /** * @notice Emitted when an address has been nominated. * @param newOwner The address that has been nominated. */ event OwnerNominated(address newOwner); /** * @notice Emitted when the owner of the contract has changed. * @param oldOwner The previous owner of the contract. * @param newOwner The new owner of the contract. */ event OwnerChanged(address oldOwner, address newOwner); /** * @notice Emitted when the nominated pending owner renounces themselves as nominated. * @param pendingOwner The pending owner that is renounced. */ event PendingOwnerRenounced(address pendingOwner); /*/////////////////////////////////////////////////////////////// VIEW FUNCTIONS ///////////////////////////////////////////////////////////////*/ /** * @notice Returns the current owner of the contract. */ function owner() external view returns (address); /** * @notice Returns the current pending owner of the contract. * @dev Only one address can be pending at a time. */ function pendingOwner() external view returns (address); /*/////////////////////////////////////////////////////////////// MUTATIVE FUNCTIONS ///////////////////////////////////////////////////////////////*/ /** * @notice Allows a pending owner address to accept ownership of the contract. * @dev Reverts if the caller has not been nominated. */ function acceptOwnership() external; /** * @notice Allows the current owner to nominate a new owner. * @dev The pending owner will have to call `acceptOwnership` in a separate transaction in order to finalize the action and become the new contract owner. * @param newOwner The address that is to become nominated. */ function transferOwnership(address newOwner) external; /** * @notice Allows a pending owner to reject the nomination. */ function renouncePendingOwnership() external; /** * @notice Allows the current owner of the contract to renounce the ownership and pending ownership completely. */ function renounceOwnership() external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import { IOwnable } from "src/ownership/IOwnable.sol"; import { OwnableStorage } from "src/ownership/OwnableStorage.sol"; /** * @title Contract for facilitating ownership by a single address, using the Openzeppelin ownable upgradable storage slot. * @dev Implementation is a modified version of Openzeppelin and Synthetix Ownable implementations. */ abstract contract Ownable is IOwnable { /*/////////////////////////////////////////////////////////////// CONSTRUCTOR ///////////////////////////////////////////////////////////////*/ constructor(address initialOwner) { if (initialOwner == address(0)) revert ZeroAddress(); OwnableStorage._setOwner(initialOwner); } /*/////////////////////////////////////////////////////////////// MODIFIERS ///////////////////////////////////////////////////////////////*/ /** * @notice Reverts if the caller is not the owner. */ modifier onlyOwner() { _onlyOwner(); _; } /*/////////////////////////////////////////////////////////////// VIEW FUNCTIONS ///////////////////////////////////////////////////////////////*/ /** * @notice Returns the current owner of the contract. */ function owner() external view virtual returns (address) { return _owner(); } /** * @notice Returns the current pending owner of the contract. * @dev Only one address can be pending at a time. */ function pendingOwner() external view virtual returns (address) { return _pendingOwner(); } /*/////////////////////////////////////////////////////////////// INTERNAL FUNCTIONS ///////////////////////////////////////////////////////////////*/ /** * @notice Returns the current owner of the contract. */ function _owner() internal view virtual returns (address) { return OwnableStorage._getOwner(); } /** * @notice Returns the current pending owner of the contract. * @dev Only one address can be nominated at a time. */ function _pendingOwner() internal view virtual returns (address) { return OwnableStorage._getPendingOwner(); } /** * @notice Reverts if the caller is not the owner. */ function _onlyOwner() internal view virtual { if (msg.sender != _owner()) { revert Unauthorized(msg.sender); } } /*/////////////////////////////////////////////////////////////// MUTATIVE FUNCTIONS ///////////////////////////////////////////////////////////////*/ /** * @notice Allows a pending owner to accept ownership of the contract. * @dev Reverts if the caller is not pending owner. */ function acceptOwnership() public virtual { address currentPendingOwner = _pendingOwner(); if (msg.sender != currentPendingOwner) { revert NotNominated(msg.sender); } emit OwnerChanged(_owner(), currentPendingOwner); OwnableStorage._setOwner(currentPendingOwner); OwnableStorage._setPendingOwner(address(0)); } /** * @notice Allows the current owner to nominate a new owner. * @dev The pending owner will have to call `acceptOwnership` in a separate transaction in order to finalize the action and become the new contract owner. * @param newOwner The address that is to become nominated. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert ZeroAddress(); } if (newOwner == _pendingOwner()) { revert NoChange(); } emit OwnerNominated(newOwner); OwnableStorage._setPendingOwner(newOwner); } /** * @notice Allows a pending owner or owner to reject the nomination. */ function renouncePendingOwnership() external virtual { address pendingOwner = _pendingOwner(); if (pendingOwner != msg.sender && msg.sender != _owner()) { revert NotNominatedOrOwner(msg.sender); } emit PendingOwnerRenounced(pendingOwner); OwnableStorage._setPendingOwner(address(0)); } /** * @notice Allows the current owner of the contract to renounce the ownership and pending ownership completely. */ function renounceOwnership() public virtual onlyOwner { emit PendingOwnerRenounced(_pendingOwner()); OwnableStorage._setPendingOwner(address(0)); emit OwnerChanged(_owner(), address(0)); OwnableStorage._setOwner(address(0)); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.21; /** * @title Ownable Storage * @dev This library provides storage and functions for managing the ownership of a contract, using the Openzeppelin ownable upgradable storage slot. * Implementation is a modified version of Openzeppelin and Synthetix Ownable implementations. */ library OwnableStorage { // Storage slot copied from the Openzeppelin ownable upgradable contract. // https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/master/contracts/access/OwnableUpgradeable.sol // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant _SLOT_OWNABLE_STORAGE = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; //#gitleaks:allow struct Storage { address _owner; address _pendingOwner; } /** * @notice Loads the storage data for the Ownable contract * @return store The storage data for the Ownable contract */ function getStorage() internal pure returns (Storage storage store) { bytes32 s = _SLOT_OWNABLE_STORAGE; assembly { store.slot := s } } /** * @notice Returns the current owner of the contract * @return The address of the owner */ function _getOwner() internal view returns (address) { return getStorage()._owner; } /** * @notice Returns the pending owner of the contract. * @return The address of the pending owner. */ function _getPendingOwner() internal view returns (address) { return getStorage()._pendingOwner; } /** * @notice Sets the owner in ownable storage. * @param _newOwner The new owner of the contract. */ function _setOwner(address _newOwner) internal { getStorage()._owner = _newOwner; } /** * @notice Sets the pending owner. * @param _newOwner The new pending owner of the contract. */ function _setPendingOwner(address _newOwner) internal { getStorage()._pendingOwner = _newOwner; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.21; /** * @title Contract to be used as the implementation of a Universal Upgradeable Proxy Standard (UUPS) proxy. * Important: A UUPS proxy requires its upgradeability functions to be in the implementation as opposed to the proxy. * This means that if the proxy is upgraded to an implementation that does not support this interface, it will no longer be upgradeable. * Copied from Synthetix * https://github.com/Synthetixio/synthetix-v3/blob/main/utils/core-contracts/contracts/interfaces/IUUPSImplementation.sol */ interface IUUPSImplementation { /** * @notice Thrown when an incoming implementation will not be able to receive future upgrades. */ error ImplementationIsSterile(address implementation); /** * @notice Thrown intentionally when testing future upgradeability of an implementation. */ error UpgradeSimulationFailed(); /** * @notice Thrown when the address is zero. */ error NullAddress(); /** * @notice Thrown when the address is not a contract. */ error NotAContract(address implementation); /** * @notice Thrown when the implementation is the same as the current implementation. */ error SameImplementation(); /** * @notice Emitted when the implementation of the proxy has been upgraded. * @param self The address of the proxy whose implementation was upgraded. * @param implementation The address of the proxy's new implementation. */ event Upgraded(address indexed self, address implementation); /** * @notice Allows the proxy to be upgraded to a new implementation. * @param newImplementation The address of the proxy's new implementation. * @dev Will revert if `newImplementation` is not upgradeable. * @dev The implementation of this function needs to be protected by some sort of access control such as `onlyOwner`. */ function upgradeTo(address newImplementation) external; /** * @notice Function used to determine if a new implementation will be able to receive future upgrades in `upgradeTo`. * @param newImplementation The address of the new implementation being tested for future upgradeability. * @dev This function will always revert, but will revert with different error messages. The function `upgradeTo` uses this error to determine the future upgradeability of the implementation in question. */ function simulateUpgradeTo(address newImplementation) external; /** * @notice Retrieves the current implementation of the proxy. * @return The address of the current implementation. */ function getImplementation() external view returns (address); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.21; /** * @dev Modified Synthetix proxy storage contract. * https://github.com/Synthetixio/synthetix-v3/blob/main/utils/core-contracts/contracts/proxy/ProxyStorage.sol */ contract ProxyStorage { // keccak256(abi.encode("io.synthetix.core-contracts.Proxy")); bytes32 private constant _SLOT_PROXY_STORAGE = 0x5a648c35a2f5512218b4683cf10e03f5b7c9dc7346e1bf77d304ae97f60f592b; //#gitleaks:allow struct ProxyStore { address implementation; bool simulatingUpgrade; } function _proxyStore() internal pure returns (ProxyStore storage store) { bytes32 s = _SLOT_PROXY_STORAGE; assembly { store.slot := s } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import { IUUPSImplementation } from "src/proxy/IUUPSImplementation.sol"; import { AddressUtil } from "src/libraries/AddressUtil.sol"; import { ProxyStorage } from "src/proxy/ProxyStorage.sol"; /** * @dev Modified Synthetix UUPS Implementation contract * https://github.com/Synthetixio/synthetix-v3/blob/main/utils/core-contracts/contracts/proxy/UUPSImplementation.sol */ abstract contract UUPSImplementation is IUUPSImplementation, ProxyStorage { /** * @notice Function used to determine if a new implementation will be able to receive future upgrades in `upgradeTo`. * @param newImplementation The address of the new implementation being tested for future upgradeability. * @dev This function will always revert, but will revert with different error messages. The function `upgradeTo` uses this error to determine the future upgradeability of the implementation in question. */ function simulateUpgradeTo(address newImplementation) public override { if (newImplementation == address(0)) { revert NullAddress(); } ProxyStore storage store = _proxyStore(); store.simulatingUpgrade = true; address currentImplementation = store.implementation; store.implementation = newImplementation; // slither-disable-start controlled-delegatecall // solhint-disable-next-line avoid-low-level-calls (bool rollbackSuccessful,) = newImplementation.delegatecall(abi.encodeCall(this.upgradeTo, (currentImplementation))); // slither-disable-end controlled-delegatecall if (!rollbackSuccessful || _proxyStore().implementation != currentImplementation) { revert UpgradeSimulationFailed(); } store.simulatingUpgrade = false; // solhint-disable-next-line reason-string,gas-custom-errors revert(); } /** * @notice Retrieves the current implementation of the proxy. * @return The address of the current implementation. */ function getImplementation() external view override returns (address) { return _proxyStore().implementation; } /** * @notice Allows the proxy to be upgraded to a new implementation. * @param newImplementation The address of the new implementation. * @dev Will revert if `newImplementation` is not upgradeable. * @dev The implementation of this function needs to be protected by some sort of access control such as `onlyOwner`. */ function _upgradeTo(address newImplementation) internal virtual { if (newImplementation == address(0)) { revert NullAddress(); } if (!AddressUtil.isContract(newImplementation)) { revert NotAContract(newImplementation); } ProxyStore storage store = _proxyStore(); if (newImplementation == store.implementation) { revert SameImplementation(); } if (!store.simulatingUpgrade && _implementationIsSterile(newImplementation)) { revert ImplementationIsSterile(newImplementation); } store.implementation = newImplementation; emit Upgraded(address(this), newImplementation); } /** * @notice Checks if the candidate implementation is sterile. * @param candidateImplementation The address of the candidate implementation. * @return True if the candidate implementation is sterile, false otherwise. */ function _implementationIsSterile(address candidateImplementation) internal virtual returns (bool) { (bool simulationReverted, bytes memory simulationResponse) = // solhint-disable-next-line avoid-low-level-calls address(this).delegatecall(abi.encodeCall(this.simulateUpgradeTo, (candidateImplementation))); return !simulationReverted && keccak256(abi.encodePacked(simulationResponse)) == keccak256(abi.encodePacked(UpgradeSimulationFailed.selector)); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "shanghai", "remappings": [ "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "@pythnetwork/entropy-sdk-solidity/=node_modules/@pythnetwork/entropy-sdk-solidity/", "@synthetixio/core-contracts/=node_modules/@synthetixio/core-contracts/", "@synthetixio/core-modules/=node_modules/@synthetixio/core-modules/", "@synthetixio/main/=node_modules/@synthetixio/main/", "@synthetixio/oracle-manager/=node_modules/@synthetixio/oracle-manager/", "@synthetixio/perps-market/=node_modules/@synthetixio/perps-market/", "@synthetixio/spot-market/=node_modules/@synthetixio/spot-market/", "ERC721A/=lib/ERC721A/contracts/", "cannon-std/=lib/cannon-std/src/", "ds-test/=lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "wormhole-circle-integration/=lib/wormhole-circle-integration/evm/src/", "wormhole-solidity-sdk/=lib/wormhole-solidity-sdk/src/", "wormhole/=lib/wormhole-circle-integration/evm/src/" ], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ImplementationIsSterile","type":"error"},{"inputs":[],"name":"NoChange","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"NotAContract","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"NotNominated","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"NotNominatedOrOwner","type":"error"},{"inputs":[],"name":"NullAddress","type":"error"},{"inputs":[],"name":"SameImplementation","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UpgradeSimulationFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"PendingOwnerRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"self","type":"address"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePendingOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"simulateUpgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b50308061002f5760405163d92e233d60e01b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b0319166001600160a01b038316179055506109fd806100775f395ff3fe608060405234801561000f575f80fd5b5060043610610090575f3560e01c80639ced959c116100635780639ced959c146100dd578063aaf10f42146100e5578063c7f62cda146100ed578063e30c397814610100578063f2fde38b14610108575f80fd5b80633659cfe614610094578063715018a6146100a957806379ba5097146100b15780638da5cb5b146100b9575b5f80fd5b6100a76100a236600461093e565b61011b565b005b6100a76101e8565b6100a7610291565b6100c1610329565b6040516001600160a01b03909116815260200160405180910390f35b6100a7610337565b6100c16103d9565b6100a76100fb36600461093e565b6103f8565b6100c1610533565b6100a761011636600461093e565b61053c565b6101236105e9565b306001600160a01b031663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa15801561015f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101839190610960565b6001600160a01b0316816001600160a01b0316036101dc576040516001600160a01b038216815230907f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c79060200160405180910390a250565b6101e581610624565b50565b6101f06105e9565b7ff4907248db93a98ecbc4159d3185003476dd4e957f364d6a150074c34778cae061021961074b565b6040516001600160a01b03909116815260200160405180910390a161023d5f61077d565b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6102666107be565b604080516001600160a01b0390921682525f60208301520160405180910390a161028f5f6107c7565b565b5f61029a61074b565b9050336001600160a01b038216146102cc5760405163a0e5a0d760e01b81523360048201526024015b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6102f56107be565b604080516001600160a01b03928316815291841660208301520160405180910390a1610320816107c7565b6101e55f61077d565b5f6103326107be565b905090565b5f61034061074b565b90506001600160a01b0381163314801590610374575061035e6107be565b6001600160a01b0316336001600160a01b031614155b1561039457604051637bce25d560e11b81523360048201526024016102c3565b6040516001600160a01b03821681527ff4907248db93a98ecbc4159d3185003476dd4e957f364d6a150074c34778cae09060200160405180910390a16101e55f61077d565b5f5f805160206109a88339815191525b546001600160a01b0316919050565b6001600160a01b03811661041f5760405163e99d5ac560e01b815260040160405180910390fd5b5f805160206109a883398151915280546001600160a01b038381166001600160a81b031983168117600160a01b1784556040805192909316602480840182905284518085039091018152604490930184526020830180516001600160e01b0316631b2ce7f360e11b17905292515f926104979161097b565b5f60405180830381855af49150503d805f81146104cf576040519150601f19603f3d011682016040523d82523d5f602084013e6104d4565b606091505b5050905080158061050557506001600160a01b0382165f805160206109a8833981519152546001600160a01b031614155b1561052357604051631439f4b560e31b815260040160405180910390fd5b825460ff60a01b191683555f8080fd5b5f61033261074b565b6105446105e9565b6001600160a01b03811661056b5760405163d92e233d60e01b815260040160405180910390fd5b61057361074b565b6001600160a01b0316816001600160a01b0316036105a45760405163a88ee57760e01b815260040160405180910390fd5b6040516001600160a01b03821681527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a16101e58161077d565b6105f16107be565b6001600160a01b0316336001600160a01b03161461028f5760405163472511eb60e11b81523360048201526024016102c3565b6001600160a01b03811661064b5760405163e99d5ac560e01b815260040160405180910390fd5b803b610675576040516322a2d07b60e21b81526001600160a01b03821660048201526024016102c3565b5f805160206109a883398151915280546001600160a01b03908116908316036106b157604051634c3b76bf60e01b815260040160405180910390fd5b8054600160a01b900460ff161580156106ce57506106ce82610808565b156106f757604051631550430160e01b81526001600160a01b03831660048201526024016102c3565b80546001600160a01b0319166001600160a01b038316908117825560405190815230907f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c79060200160405180910390a25050565b5f6103327f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199301546001600160a01b031690565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930180546001600160a01b0319166001600160a01b0392909216919091179055565b5f610332610903565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b03831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166363fb166d60e11b17905290515f9182918291309161085e919061097b565b5f60405180830381855af49150503d805f8114610896576040519150601f19603f3d011682016040523d82523d5f602084013e61089b565b606091505b5091509150811580156108fb5750604051631439f4b560e31b602082015260240160405160208183030381529060405280519060200120816040516020016108e3919061097b565b60405160208183030381529060405280519060200120145b949350505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993006103e9565b6001600160a01b03811681146101e5575f80fd5b5f6020828403121561094e575f80fd5b81356109598161092a565b9392505050565b5f60208284031215610970575f80fd5b81516109598161092a565b5f82515f5b8181101561099a5760208186018101518583015201610980565b505f92019182525091905056fe5a648c35a2f5512218b4683cf10e03f5b7c9dc7346e1bf77d304ae97f60f592ba264697066735822122008290d04104f33834f57eb14ff1fe78bd45ce36f93fba32187f5d605ac13bbbc64736f6c63430008150033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610090575f3560e01c80639ced959c116100635780639ced959c146100dd578063aaf10f42146100e5578063c7f62cda146100ed578063e30c397814610100578063f2fde38b14610108575f80fd5b80633659cfe614610094578063715018a6146100a957806379ba5097146100b15780638da5cb5b146100b9575b5f80fd5b6100a76100a236600461093e565b61011b565b005b6100a76101e8565b6100a7610291565b6100c1610329565b6040516001600160a01b03909116815260200160405180910390f35b6100a7610337565b6100c16103d9565b6100a76100fb36600461093e565b6103f8565b6100c1610533565b6100a761011636600461093e565b61053c565b6101236105e9565b306001600160a01b031663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa15801561015f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101839190610960565b6001600160a01b0316816001600160a01b0316036101dc576040516001600160a01b038216815230907f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c79060200160405180910390a250565b6101e581610624565b50565b6101f06105e9565b7ff4907248db93a98ecbc4159d3185003476dd4e957f364d6a150074c34778cae061021961074b565b6040516001600160a01b03909116815260200160405180910390a161023d5f61077d565b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6102666107be565b604080516001600160a01b0390921682525f60208301520160405180910390a161028f5f6107c7565b565b5f61029a61074b565b9050336001600160a01b038216146102cc5760405163a0e5a0d760e01b81523360048201526024015b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6102f56107be565b604080516001600160a01b03928316815291841660208301520160405180910390a1610320816107c7565b6101e55f61077d565b5f6103326107be565b905090565b5f61034061074b565b90506001600160a01b0381163314801590610374575061035e6107be565b6001600160a01b0316336001600160a01b031614155b1561039457604051637bce25d560e11b81523360048201526024016102c3565b6040516001600160a01b03821681527ff4907248db93a98ecbc4159d3185003476dd4e957f364d6a150074c34778cae09060200160405180910390a16101e55f61077d565b5f5f805160206109a88339815191525b546001600160a01b0316919050565b6001600160a01b03811661041f5760405163e99d5ac560e01b815260040160405180910390fd5b5f805160206109a883398151915280546001600160a01b038381166001600160a81b031983168117600160a01b1784556040805192909316602480840182905284518085039091018152604490930184526020830180516001600160e01b0316631b2ce7f360e11b17905292515f926104979161097b565b5f60405180830381855af49150503d805f81146104cf576040519150601f19603f3d011682016040523d82523d5f602084013e6104d4565b606091505b5050905080158061050557506001600160a01b0382165f805160206109a8833981519152546001600160a01b031614155b1561052357604051631439f4b560e31b815260040160405180910390fd5b825460ff60a01b191683555f8080fd5b5f61033261074b565b6105446105e9565b6001600160a01b03811661056b5760405163d92e233d60e01b815260040160405180910390fd5b61057361074b565b6001600160a01b0316816001600160a01b0316036105a45760405163a88ee57760e01b815260040160405180910390fd5b6040516001600160a01b03821681527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a16101e58161077d565b6105f16107be565b6001600160a01b0316336001600160a01b03161461028f5760405163472511eb60e11b81523360048201526024016102c3565b6001600160a01b03811661064b5760405163e99d5ac560e01b815260040160405180910390fd5b803b610675576040516322a2d07b60e21b81526001600160a01b03821660048201526024016102c3565b5f805160206109a883398151915280546001600160a01b03908116908316036106b157604051634c3b76bf60e01b815260040160405180910390fd5b8054600160a01b900460ff161580156106ce57506106ce82610808565b156106f757604051631550430160e01b81526001600160a01b03831660048201526024016102c3565b80546001600160a01b0319166001600160a01b038316908117825560405190815230907f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c79060200160405180910390a25050565b5f6103327f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199301546001600160a01b031690565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930180546001600160a01b0319166001600160a01b0392909216919091179055565b5f610332610903565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b03831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166363fb166d60e11b17905290515f9182918291309161085e919061097b565b5f60405180830381855af49150503d805f8114610896576040519150601f19603f3d011682016040523d82523d5f602084013e61089b565b606091505b5091509150811580156108fb5750604051631439f4b560e31b602082015260240160405160208183030381529060405280519060200120816040516020016108e3919061097b565b60405160208183030381529060405280519060200120145b949350505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993006103e9565b6001600160a01b03811681146101e5575f80fd5b5f6020828403121561094e575f80fd5b81356109598161092a565b9392505050565b5f60208284031215610970575f80fd5b81516109598161092a565b5f82515f5b8181101561099a5760208186018101518583015201610980565b505f92019182525091905056fe5a648c35a2f5512218b4683cf10e03f5b7c9dc7346e1bf77d304ae97f60f592ba264697066735822122008290d04104f33834f57eb14ff1fe78bd45ce36f93fba32187f5d605ac13bbbc64736f6c63430008150033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 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.