Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ContractManager
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-only
/*
ContractManager.sol - SKALE Manager
Copyright (C) 2018-Present SKALE Labs
@author Artem Payvin
SKALE Manager is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
SKALE Manager is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with SKALE Manager. If not, see <https://www.gnu.org/licenses/>.
*/
pragma solidity 0.8.11;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
import "@skalenetwork/skale-manager-interfaces/IContractManager.sol";
import "./utils/StringUtils.sol";
import "./thirdparty/openzeppelin/InitializableWithGap.sol";
/**
* @title ContractManager
* @dev Contract contains the actual current mapping from contract IDs
* (in the form of human-readable strings) to addresses.
*/
contract ContractManager is InitializableWithGap, OwnableUpgradeable, IContractManager {
using StringUtils for string;
using AddressUpgradeable for address;
string public constant BOUNTY = "Bounty";
string public constant CONSTANTS_HOLDER = "ConstantsHolder";
string public constant DELEGATION_PERIOD_MANAGER = "DelegationPeriodManager";
string public constant PUNISHER = "Punisher";
string public constant SKALE_TOKEN = "SkaleToken";
string public constant TIME_HELPERS = "TimeHelpers";
string public constant TOKEN_STATE = "TokenState";
string public constant VALIDATOR_SERVICE = "ValidatorService";
// mapping of actual smart contracts addresses
mapping (bytes32 => address) public override contracts;
function initialize() external override initializer {
OwnableUpgradeable.__Ownable_init();
}
/**
* @dev Allows the Owner to add contract to mapping of contract addresses.
*
* Emits a {ContractUpgraded} event.
*
* Requirements:
*
* - New address is non-zero.
* - Contract is not already added.
* - Contract address contains code.
*/
function setContractsAddress(
string calldata contractsName,
address newContractsAddress
)
external
override
onlyOwner
{
// check newContractsAddress is not equal to zero
require(newContractsAddress != address(0), "New address is equal zero");
// create hash of contractsName
bytes32 contractId = keccak256(abi.encodePacked(contractsName));
// check newContractsAddress is not equal the previous contract's address
require(contracts[contractId] != newContractsAddress, "Contract is already added");
require(newContractsAddress.isContract(), "Given contract address does not contain code");
// add newContractsAddress to mapping of actual contract addresses
contracts[contractId] = newContractsAddress;
emit ContractUpgraded(contractsName, newContractsAddress);
}
/**
* @dev Returns contract address.
*
* Requirements:
*
* - Contract must exist.
*/
function getDelegationPeriodManager() external view override returns (address) {
return getContract(DELEGATION_PERIOD_MANAGER);
}
function getBounty() external view override returns (address) {
return getContract(BOUNTY);
}
function getValidatorService() external view override returns (address) {
return getContract(VALIDATOR_SERVICE);
}
function getTimeHelpers() external view override returns (address) {
return getContract(TIME_HELPERS);
}
function getConstantsHolder() external view override returns (address) {
return getContract(CONSTANTS_HOLDER);
}
function getSkaleToken() external view override returns (address) {
return getContract(SKALE_TOKEN);
}
function getTokenState() external view override returns (address) {
return getContract(TOKEN_STATE);
}
function getPunisher() external view override returns (address) {
return getContract(PUNISHER);
}
function getContract(string memory name) public view override returns (address contractAddress) {
contractAddress = contracts[keccak256(abi.encodePacked(name))];
if (contractAddress == address(0)) {
revert(name.strConcat(" contract has not been found"));
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Context_init_unchained();
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_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 {
_transferOwnership(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");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @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;
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");
(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");
(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");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal 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
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: AGPL-3.0-only
/*
IContractManager.sol - SKALE Manager Interfaces
Copyright (C) 2021-Present SKALE Labs
@author Dmytro Stebaeiv
SKALE Manager Interfaces is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
SKALE Manager Interfaces is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with SKALE Manager Interfaces. If not, see <https://www.gnu.org/licenses/>.
*/
pragma solidity >=0.6.10 <0.9.0;
interface IContractManager {
/**
* @dev Emitted when contract is upgraded.
*/
event ContractUpgraded(string contractsName, address contractsAddress);
function initialize() external;
function setContractsAddress(string calldata contractsName, address newContractsAddress) external;
function contracts(bytes32 nameHash) external view returns (address);
function getDelegationPeriodManager() external view returns (address);
function getBounty() external view returns (address);
function getValidatorService() external view returns (address);
function getTimeHelpers() external view returns (address);
function getConstantsHolder() external view returns (address);
function getSkaleToken() external view returns (address);
function getTokenState() external view returns (address);
function getPunisher() external view returns (address);
function getContract(string calldata name) external view returns (address);
}// SPDX-License-Identifier: AGPL-3.0-only
/*
StringUtils.sol - SKALE Manager
Copyright (C) 2018-Present SKALE Labs
@author Vadim Yavorsky
SKALE Manager is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
SKALE Manager is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with SKALE Manager. If not, see <https://www.gnu.org/licenses/>.
*/
pragma solidity 0.8.11;
library StringUtils {
function strConcat(string memory a, string memory b) internal pure returns (string memory) {
bytes memory _ba = bytes(a);
bytes memory _bb = bytes(b);
string memory ab = new string(_ba.length + _bb.length);
bytes memory strBytes = bytes(ab);
uint k = 0;
uint i = 0;
for (i = 0; i < _ba.length; i++) {
strBytes[k++] = _ba[i];
}
for (i = 0; i < _bb.length; i++) {
strBytes[k++] = _bb[i];
}
return string(strBytes);
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.7;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
contract InitializableWithGap is Initializable {
uint256[50] private ______gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @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 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 ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
__Context_init_unchained();
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)
pragma solidity ^0.8.0;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
* initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() initializer {}
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
// If the contract is initializing we ignore whether _initialized is set in order to support multiple
// inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
// contract may have been reentered.
require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} modifier, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
function _isConstructor() private view returns (bool) {
return !AddressUpgradeable.isContract(address(this));
}
}{
"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
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"contractsName","type":"string"},{"indexed":false,"internalType":"address","name":"contractsAddress","type":"address"}],"name":"ContractUpgraded","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"},{"inputs":[],"name":"BOUNTY","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONSTANTS_HOLDER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATION_PERIOD_MANAGER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUNISHER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SKALE_TOKEN","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_HELPERS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_STATE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_SERVICE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"contracts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBounty","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConstantsHolder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"getContract","outputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDelegationPeriodManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPunisher","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSkaleToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeHelpers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenState","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getValidatorService","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractsName","type":"string"},{"internalType":"address","name":"newContractsAddress","type":"address"}],"name":"setContractsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50610f01806100206000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80638da5cb5b116100c3578063dd9e29401161007c578063dd9e294014610339578063ebd2665f1461034c578063ec56a37314610354578063f2fde38b1461037d578063f49bff7b14610390578063fcaa57a41461039857600080fd5b80638da5cb5b146102c4578063954b385d146102d55780639b391a46146102dd5780639cb83f57146102e5578063d081f2b8146102ed578063da71479f1461031257600080fd5b806342e23cfa1161011557806342e23cfa1461024f57806347f3c1b2146102795780636020ef9c146102815780636f72c4ab146102aa578063715018a6146102b25780638129fc1c146102bc57600080fd5b806307f130f4146101525780631995730e146101965780632e9fa66e146101bf57806335817773146101f55780633741e00514610220575b600080fd5b6101806040518060400160405280600f81526020016e21b7b739ba30b73a39a437b63232b960891b81525081565b60405161018d9190610bb2565b60405180910390f35b6101806040518060400160405280600a815260200169546f6b656e537461746560b01b81525081565b610180604051806040016040528060178152602001762232b632b3b0ba34b7b72832b934b7b226b0b730b3b2b960491b81525081565b610208610203366004610bfb565b6103a0565b6040516001600160a01b03909116815260200161018d565b6101806040518060400160405280601081526020016f56616c696461746f725365727669636560801b81525081565b6101806040518060400160405280600b81526020016a54696d6548656c7065727360a81b81525081565b610208610453565b6101806040518060400160405280600a81526020016929b5b0b632aa37b5b2b760b11b81525081565b610208610492565b6102ba6104bd565b005b6102ba6104f3565b6065546001600160a01b0316610208565b6102086105b4565b6102086105e2565b61020861060f565b61018060405180604001604052806006815260200165426f756e747960d01b81525081565b61018060405180604001604052806008815260200167283ab734b9b432b960c11b81525081565b6102ba610347366004610cc3565b610642565b61020861082f565b610208610362366004610d44565b6097602052600090815260409020546001600160a01b031681565b6102ba61038b366004610d5d565b61085c565b6102086108f4565b61020861091d565b600060976000836040516020016103b79190610d7f565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690508061044e5760408051808201909152601c81527f20636f6e747261637420686173206e6f74206265656e20666f756e6400000000602082015261042c90839061094f565b60405162461bcd60e51b81526004016104459190610bb2565b60405180910390fd5b919050565b600061048d604051806040016040528060178152602001762232b632b3b0ba34b7b72832b934b7b226b0b730b3b2b960491b8152506103a0565b905090565b600061048d60405180604001604052806008815260200167283ab734b9b432b960c11b8152506103a0565b6065546001600160a01b031633146104e75760405162461bcd60e51b815260040161044590610d9b565b6104f16000610aa2565b565b600054610100900460ff1661050e5760005460ff1615610512565b303b155b6105755760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610445565b600054610100900460ff16158015610597576000805461ffff19166101011790555b61059f610af4565b80156105b1576000805461ff00191690555b50565b600061048d6040518060400160405280600b81526020016a54696d6548656c7065727360a81b8152506103a0565b600061048d6040518060400160405280600a81526020016929b5b0b632aa37b5b2b760b11b8152506103a0565b600061048d6040518060400160405280601081526020016f56616c696461746f725365727669636560801b8152506103a0565b6065546001600160a01b0316331461066c5760405162461bcd60e51b815260040161044590610d9b565b6001600160a01b0381166106c25760405162461bcd60e51b815260206004820152601960248201527f4e6577206164647265737320697320657175616c207a65726f000000000000006044820152606401610445565b600083836040516020016106d7929190610dd0565b60408051808303601f190181529181528151602092830120600081815260979093529120549091506001600160a01b038381169116141561075a5760405162461bcd60e51b815260206004820152601960248201527f436f6e747261637420697320616c7265616479206164646564000000000000006044820152606401610445565b6001600160a01b0382163b6107c65760405162461bcd60e51b815260206004820152602c60248201527f476976656e20636f6e7472616374206164647265737320646f6573206e6f742060448201526b636f6e7461696e20636f646560a01b6064820152608401610445565b6000818152609760205260409081902080546001600160a01b0319166001600160a01b038516179055517f2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c39061082190869086908690610de0565b60405180910390a150505050565b600061048d6040518060400160405280600a815260200169546f6b656e537461746560b01b8152506103a0565b6065546001600160a01b031633146108865760405162461bcd60e51b815260040161044590610d9b565b6001600160a01b0381166108eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610445565b6105b181610aa2565b600061048d60405180604001604052806006815260200165426f756e747960d01b8152506103a0565b600061048d6040518060400160405280600f81526020016e21b7b739ba30b73a39a437b63232b960891b8152506103a0565b80518251606091849184916000916109679190610e37565b67ffffffffffffffff81111561097f5761097f610be5565b6040519080825280601f01601f1916602001820160405280156109a9576020820181803683370190505b509050806000805b8551811015610a21578581815181106109cc576109cc610e4f565b01602001516001600160f81b03191683836109e681610e65565b9450815181106109f8576109f8610e4f565b60200101906001600160f81b031916908160001a90535080610a1981610e65565b9150506109b1565b5060005b8451811015610a9557848181518110610a4057610a40610e4f565b01602001516001600160f81b0319168383610a5a81610e65565b945081518110610a6c57610a6c610e4f565b60200101906001600160f81b031916908160001a90535080610a8d81610e65565b915050610a25565b5090979650505050505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610b1b5760405162461bcd60e51b815260040161044590610e80565b610b23610b2b565b6104f1610b52565b600054610100900460ff166104f15760405162461bcd60e51b815260040161044590610e80565b600054610100900460ff16610b795760405162461bcd60e51b815260040161044590610e80565b6104f133610aa2565b60005b83811015610b9d578181015183820152602001610b85565b83811115610bac576000848401525b50505050565b6020815260008251806020840152610bd1816040850160208701610b82565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610c0d57600080fd5b813567ffffffffffffffff80821115610c2557600080fd5b818401915084601f830112610c3957600080fd5b813581811115610c4b57610c4b610be5565b604051601f8201601f19908116603f01168101908382118183101715610c7357610c73610be5565b81604052828152876020848701011115610c8c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b80356001600160a01b038116811461044e57600080fd5b600080600060408486031215610cd857600080fd5b833567ffffffffffffffff80821115610cf057600080fd5b818601915086601f830112610d0457600080fd5b813581811115610d1357600080fd5b876020828501011115610d2557600080fd5b602092830195509350610d3b9186019050610cac565b90509250925092565b600060208284031215610d5657600080fd5b5035919050565b600060208284031215610d6f57600080fd5b610d7882610cac565b9392505050565b60008251610d91818460208701610b82565b9190910192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8183823760009101908152919050565b6040815282604082015282846060830137600060608483018101919091526001600160a01b03929092166020820152601f909201601f191690910101919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115610e4a57610e4a610e21565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415610e7957610e79610e21565b5060010190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220b4a1f18702a3a350d3b204542ee489c32d249e34092befb89dd7a2db081a961764736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80638da5cb5b116100c3578063dd9e29401161007c578063dd9e294014610339578063ebd2665f1461034c578063ec56a37314610354578063f2fde38b1461037d578063f49bff7b14610390578063fcaa57a41461039857600080fd5b80638da5cb5b146102c4578063954b385d146102d55780639b391a46146102dd5780639cb83f57146102e5578063d081f2b8146102ed578063da71479f1461031257600080fd5b806342e23cfa1161011557806342e23cfa1461024f57806347f3c1b2146102795780636020ef9c146102815780636f72c4ab146102aa578063715018a6146102b25780638129fc1c146102bc57600080fd5b806307f130f4146101525780631995730e146101965780632e9fa66e146101bf57806335817773146101f55780633741e00514610220575b600080fd5b6101806040518060400160405280600f81526020016e21b7b739ba30b73a39a437b63232b960891b81525081565b60405161018d9190610bb2565b60405180910390f35b6101806040518060400160405280600a815260200169546f6b656e537461746560b01b81525081565b610180604051806040016040528060178152602001762232b632b3b0ba34b7b72832b934b7b226b0b730b3b2b960491b81525081565b610208610203366004610bfb565b6103a0565b6040516001600160a01b03909116815260200161018d565b6101806040518060400160405280601081526020016f56616c696461746f725365727669636560801b81525081565b6101806040518060400160405280600b81526020016a54696d6548656c7065727360a81b81525081565b610208610453565b6101806040518060400160405280600a81526020016929b5b0b632aa37b5b2b760b11b81525081565b610208610492565b6102ba6104bd565b005b6102ba6104f3565b6065546001600160a01b0316610208565b6102086105b4565b6102086105e2565b61020861060f565b61018060405180604001604052806006815260200165426f756e747960d01b81525081565b61018060405180604001604052806008815260200167283ab734b9b432b960c11b81525081565b6102ba610347366004610cc3565b610642565b61020861082f565b610208610362366004610d44565b6097602052600090815260409020546001600160a01b031681565b6102ba61038b366004610d5d565b61085c565b6102086108f4565b61020861091d565b600060976000836040516020016103b79190610d7f565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690508061044e5760408051808201909152601c81527f20636f6e747261637420686173206e6f74206265656e20666f756e6400000000602082015261042c90839061094f565b60405162461bcd60e51b81526004016104459190610bb2565b60405180910390fd5b919050565b600061048d604051806040016040528060178152602001762232b632b3b0ba34b7b72832b934b7b226b0b730b3b2b960491b8152506103a0565b905090565b600061048d60405180604001604052806008815260200167283ab734b9b432b960c11b8152506103a0565b6065546001600160a01b031633146104e75760405162461bcd60e51b815260040161044590610d9b565b6104f16000610aa2565b565b600054610100900460ff1661050e5760005460ff1615610512565b303b155b6105755760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610445565b600054610100900460ff16158015610597576000805461ffff19166101011790555b61059f610af4565b80156105b1576000805461ff00191690555b50565b600061048d6040518060400160405280600b81526020016a54696d6548656c7065727360a81b8152506103a0565b600061048d6040518060400160405280600a81526020016929b5b0b632aa37b5b2b760b11b8152506103a0565b600061048d6040518060400160405280601081526020016f56616c696461746f725365727669636560801b8152506103a0565b6065546001600160a01b0316331461066c5760405162461bcd60e51b815260040161044590610d9b565b6001600160a01b0381166106c25760405162461bcd60e51b815260206004820152601960248201527f4e6577206164647265737320697320657175616c207a65726f000000000000006044820152606401610445565b600083836040516020016106d7929190610dd0565b60408051808303601f190181529181528151602092830120600081815260979093529120549091506001600160a01b038381169116141561075a5760405162461bcd60e51b815260206004820152601960248201527f436f6e747261637420697320616c7265616479206164646564000000000000006044820152606401610445565b6001600160a01b0382163b6107c65760405162461bcd60e51b815260206004820152602c60248201527f476976656e20636f6e7472616374206164647265737320646f6573206e6f742060448201526b636f6e7461696e20636f646560a01b6064820152608401610445565b6000818152609760205260409081902080546001600160a01b0319166001600160a01b038516179055517f2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c39061082190869086908690610de0565b60405180910390a150505050565b600061048d6040518060400160405280600a815260200169546f6b656e537461746560b01b8152506103a0565b6065546001600160a01b031633146108865760405162461bcd60e51b815260040161044590610d9b565b6001600160a01b0381166108eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610445565b6105b181610aa2565b600061048d60405180604001604052806006815260200165426f756e747960d01b8152506103a0565b600061048d6040518060400160405280600f81526020016e21b7b739ba30b73a39a437b63232b960891b8152506103a0565b80518251606091849184916000916109679190610e37565b67ffffffffffffffff81111561097f5761097f610be5565b6040519080825280601f01601f1916602001820160405280156109a9576020820181803683370190505b509050806000805b8551811015610a21578581815181106109cc576109cc610e4f565b01602001516001600160f81b03191683836109e681610e65565b9450815181106109f8576109f8610e4f565b60200101906001600160f81b031916908160001a90535080610a1981610e65565b9150506109b1565b5060005b8451811015610a9557848181518110610a4057610a40610e4f565b01602001516001600160f81b0319168383610a5a81610e65565b945081518110610a6c57610a6c610e4f565b60200101906001600160f81b031916908160001a90535080610a8d81610e65565b915050610a25565b5090979650505050505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610b1b5760405162461bcd60e51b815260040161044590610e80565b610b23610b2b565b6104f1610b52565b600054610100900460ff166104f15760405162461bcd60e51b815260040161044590610e80565b600054610100900460ff16610b795760405162461bcd60e51b815260040161044590610e80565b6104f133610aa2565b60005b83811015610b9d578181015183820152602001610b85565b83811115610bac576000848401525b50505050565b6020815260008251806020840152610bd1816040850160208701610b82565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610c0d57600080fd5b813567ffffffffffffffff80821115610c2557600080fd5b818401915084601f830112610c3957600080fd5b813581811115610c4b57610c4b610be5565b604051601f8201601f19908116603f01168101908382118183101715610c7357610c73610be5565b81604052828152876020848701011115610c8c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b80356001600160a01b038116811461044e57600080fd5b600080600060408486031215610cd857600080fd5b833567ffffffffffffffff80821115610cf057600080fd5b818601915086601f830112610d0457600080fd5b813581811115610d1357600080fd5b876020828501011115610d2557600080fd5b602092830195509350610d3b9186019050610cac565b90509250925092565b600060208284031215610d5657600080fd5b5035919050565b600060208284031215610d6f57600080fd5b610d7882610cac565b9392505050565b60008251610d91818460208701610b82565b9190910192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8183823760009101908152919050565b6040815282604082015282846060830137600060608483018101919091526001600160a01b03929092166020820152601f909201601f191690910101919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115610e4a57610e4a610e21565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415610e7957610e79610e21565b5060010190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220b4a1f18702a3a350d3b204542ee489c32d249e34092befb89dd7a2db081a961764736f6c634300080b0033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.