Source Code
Latest 25 from a total of 3,736 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| 0xc280c905 | 25705771 | 52 mins ago | IN | 0 HYPE | 0.00004483 | ||||
| 0xc280c905 | 25691410 | 4 hrs ago | IN | 0 HYPE | 0.00004846 | ||||
| 0xc280c905 | 25680761 | 7 hrs ago | IN | 0 HYPE | 0.00004483 | ||||
| 0xc280c905 | 25662183 | 12 hrs ago | IN | 0 HYPE | 0.00022523 | ||||
| 0xc280c905 | 25658221 | 13 hrs ago | IN | 0 HYPE | 0.00031075 | ||||
| 0xc280c905 | 25655227 | 14 hrs ago | IN | 0 HYPE | 0.00018711 | ||||
| 0xc280c905 | 25640739 | 18 hrs ago | IN | 0 HYPE | 0.00004483 | ||||
| 0xc280c905 | 25628636 | 21 hrs ago | IN | 0 HYPE | 0.00004483 | ||||
| 0xc280c905 | 25614814 | 25 hrs ago | IN | 0 HYPE | 0.00373541 | ||||
| 0xc280c905 | 25610209 | 26 hrs ago | IN | 0 HYPE | 0.00018505 | ||||
| 0xc280c905 | 25606311 | 28 hrs ago | IN | 0 HYPE | 0.00039344 | ||||
| 0xc280c905 | 25604206 | 28 hrs ago | IN | 0 HYPE | 0.00004781 | ||||
| 0xc280c905 | 25581723 | 34 hrs ago | IN | 0 HYPE | 0.00004443 | ||||
| 0xc280c905 | 25580142 | 35 hrs ago | IN | 0 HYPE | 0.00004483 | ||||
| 0xc280c905 | 25576965 | 36 hrs ago | IN | 0 HYPE | 0.00004823 | ||||
| 0xc280c905 | 25575501 | 36 hrs ago | IN | 0 HYPE | 0.00004443 | ||||
| 0xc280c905 | 25554674 | 42 hrs ago | IN | 0 HYPE | 0.00051306 | ||||
| 0xc280c905 | 25540614 | 46 hrs ago | IN | 0 HYPE | 0.00004483 | ||||
| 0xc280c905 | 25533258 | 2 days ago | IN | 0 HYPE | 0.00004433 | ||||
| 0xc280c905 | 25519503 | 2 days ago | IN | 0 HYPE | 0.00004483 | ||||
| 0xc280c905 | 25499800 | 2 days ago | IN | 0 HYPE | 0.00004589 | ||||
| 0xc280c905 | 25484616 | 2 days ago | IN | 0 HYPE | 0.00004483 | ||||
| 0xc280c905 | 25477687 | 2 days ago | IN | 0 HYPE | 0.00004629 | ||||
| 0xc280c905 | 25458228 | 2 days ago | IN | 0 HYPE | 0.00004482 | ||||
| 0xc280c905 | 25452250 | 2 days ago | IN | 0 HYPE | 0.00003342 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 25708599 | 6 mins ago | 0 HYPE | |||||
| 25708599 | 6 mins ago | 0.05 HYPE | |||||
| 25708599 | 6 mins ago | 0.05 HYPE | |||||
| 25708599 | 6 mins ago | 0.05 HYPE | |||||
| 25708549 | 7 mins ago | 0 HYPE | |||||
| 25708549 | 7 mins ago | 0.05 HYPE | |||||
| 25708549 | 7 mins ago | 0.05 HYPE | |||||
| 25708549 | 7 mins ago | 0.05 HYPE | |||||
| 25708549 | 7 mins ago | 0 HYPE | |||||
| 25708549 | 7 mins ago | 0 HYPE | |||||
| 25708549 | 7 mins ago | 0 HYPE | |||||
| 25708549 | 7 mins ago | 0 HYPE | |||||
| 25705926 | 50 mins ago | 0 HYPE | |||||
| 25705926 | 50 mins ago | 0.05 HYPE | |||||
| 25705926 | 50 mins ago | 0.05 HYPE | |||||
| 25705926 | 50 mins ago | 0.05 HYPE | |||||
| 25705771 | 52 mins ago | 0 HYPE | |||||
| 25705771 | 52 mins ago | 0 HYPE | |||||
| 25705771 | 52 mins ago | 0 HYPE | |||||
| 25705771 | 52 mins ago | 0 HYPE | |||||
| 25705771 | 52 mins ago | 0 HYPE | |||||
| 25705771 | 52 mins ago | 0 HYPE | |||||
| 25702724 | 1 hr ago | 0 HYPE | |||||
| 25702724 | 1 hr ago | 0.05 HYPE | |||||
| 25702724 | 1 hr ago | 0.05 HYPE |
Cross-Chain Transactions
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:
TransparentUpgradeableProxy
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/transparent/TransparentUpgradeableProxy.sol)
pragma solidity ^0.8.20;
import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol";
import {ERC1967Proxy} from "../ERC1967/ERC1967Proxy.sol";
import {IERC1967} from "../../interfaces/IERC1967.sol";
import {ProxyAdmin} from "./ProxyAdmin.sol";
/**
* @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}
* does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch
* mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not
* include them in the ABI so this interface must be used to interact with it.
*/
interface ITransparentUpgradeableProxy is IERC1967 {
function upgradeToAndCall(address, bytes calldata) external payable;
}
/**
* @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.
*
* To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector
* clashing], which can potentially be used in an attack, this contract uses the
* https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
* things that go hand in hand:
*
* 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if
* that call matches the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.
* 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to
* the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating
* the proxy admin cannot fallback to the target implementation.
*
* These properties mean that the admin account can only be used for upgrading the proxy, so it's best if it's a
* dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to
* call a function from the proxy implementation. For this reason, the proxy deploys an instance of {ProxyAdmin} and
* allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative
* interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.
*
* NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not
* inherit from that interface, and instead `upgradeToAndCall` is implicitly implemented using a custom dispatch
* mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to
* fully implement transparency without decoding reverts caused by selector clashes between the proxy and the
* implementation.
*
* NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a
* meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.
*
* IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an
* immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be
* overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an
* undesirable state where the admin slot is different from the actual admin.
*
* WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the
* compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new
* function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This
* could render the `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.
*/
contract TransparentUpgradeableProxy is ERC1967Proxy {
// An immutable address for the admin to avoid unnecessary SLOADs before each call
// at the expense of removing the ability to change the admin once it's set.
// This is acceptable if the admin is always a ProxyAdmin instance or similar contract
// with its own ability to transfer the permissions to another account.
address private immutable _admin;
/**
* @dev The proxy caller is the current admin, and can't fallback to the proxy target.
*/
error ProxyDeniedAdminAccess();
/**
* @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,
* backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in
* {ERC1967Proxy-constructor}.
*/
constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {
_admin = address(new ProxyAdmin(initialOwner));
// Set the storage value and emit an event for ERC-1967 compatibility
ERC1967Utils.changeAdmin(_proxyAdmin());
}
/**
* @dev Returns the admin of this proxy.
*/
function _proxyAdmin() internal virtual returns (address) {
return _admin;
}
/**
* @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior.
*/
function _fallback() internal virtual override {
if (msg.sender == _proxyAdmin()) {
if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {
revert ProxyDeniedAdminAccess();
} else {
_dispatchUpgradeToAndCall();
}
} else {
super._fallback();
}
}
/**
* @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.
*
* Requirements:
*
* - If `data` is empty, `msg.value` must be zero.
*/
function _dispatchUpgradeToAndCall() private {
(address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));
ERC1967Utils.upgradeToAndCall(newImplementation, data);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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 Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_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);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)
pragma solidity ^0.8.20;
/**
* @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.
*/
interface IERC1967 {
/**
* @dev Emitted when the implementation is upgraded.
*/
event Upgraded(address indexed implementation);
/**
* @dev Emitted when the admin account has changed.
*/
event AdminChanged(address previousAdmin, address newAdmin);
/**
* @dev Emitted when the beacon is changed.
*/
event BeaconUpgraded(address indexed beacon);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Proxy.sol)
pragma solidity ^0.8.20;
import {Proxy} from "../Proxy.sol";
import {ERC1967Utils} from "./ERC1967Utils.sol";
/**
* @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
* implementation address that can be changed. This address is stored in storage in the location specified by
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
* implementation behind the proxy.
*/
contract ERC1967Proxy is Proxy {
/**
* @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.
*
* If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an
* encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.
*
* Requirements:
*
* - If `data` is empty, `msg.value` must be zero.
*/
constructor(address implementation, bytes memory _data) payable {
ERC1967Utils.upgradeToAndCall(implementation, _data);
}
/**
* @dev Returns the current implementation address.
*
* TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using
* the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
* `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
*/
function _implementation() internal view virtual override returns (address) {
return ERC1967Utils.getImplementation();
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol)
pragma solidity ^0.8.20;
import {IBeacon} from "../beacon/IBeacon.sol";
import {Address} from "../../utils/Address.sol";
import {StorageSlot} from "../../utils/StorageSlot.sol";
/**
* @dev This abstract contract provides getters and event emitting update functions for
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
*/
library ERC1967Utils {
// We re-declare ERC-1967 events here because they can't be used directly from IERC1967.
// This will be fixed in Solidity 0.8.21. At that point we should remove these events.
/**
* @dev Emitted when the implementation is upgraded.
*/
event Upgraded(address indexed implementation);
/**
* @dev Emitted when the admin account has changed.
*/
event AdminChanged(address previousAdmin, address newAdmin);
/**
* @dev Emitted when the beacon is changed.
*/
event BeaconUpgraded(address indexed beacon);
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1.
*/
// solhint-disable-next-line private-vars-leading-underscore
bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @dev The `implementation` of the proxy is invalid.
*/
error ERC1967InvalidImplementation(address implementation);
/**
* @dev The `admin` of the proxy is invalid.
*/
error ERC1967InvalidAdmin(address admin);
/**
* @dev The `beacon` of the proxy is invalid.
*/
error ERC1967InvalidBeacon(address beacon);
/**
* @dev An upgrade function sees `msg.value > 0` that may be lost.
*/
error ERC1967NonPayable();
/**
* @dev Returns the current implementation address.
*/
function getImplementation() internal view returns (address) {
return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/
function _setImplementation(address newImplementation) private {
if (newImplementation.code.length == 0) {
revert ERC1967InvalidImplementation(newImplementation);
}
StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;
}
/**
* @dev Performs implementation upgrade with additional setup call if data is nonempty.
* This function is payable only if the setup call is performed, otherwise `msg.value` is rejected
* to avoid stuck value in the contract.
*
* Emits an {IERC1967-Upgraded} event.
*/
function upgradeToAndCall(address newImplementation, bytes memory data) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
if (data.length > 0) {
Address.functionDelegateCall(newImplementation, data);
} else {
_checkNonPayable();
}
}
/**
* @dev Storage slot with the admin of the contract.
* This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1.
*/
// solhint-disable-next-line private-vars-leading-underscore
bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
/**
* @dev Returns the current admin.
*
* TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using
* the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
* `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
*/
function getAdmin() internal view returns (address) {
return StorageSlot.getAddressSlot(ADMIN_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 admin slot.
*/
function _setAdmin(address newAdmin) private {
if (newAdmin == address(0)) {
revert ERC1967InvalidAdmin(address(0));
}
StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;
}
/**
* @dev Changes the admin of the proxy.
*
* Emits an {IERC1967-AdminChanged} event.
*/
function changeAdmin(address newAdmin) internal {
emit AdminChanged(getAdmin(), newAdmin);
_setAdmin(newAdmin);
}
/**
* @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
* This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1.
*/
// solhint-disable-next-line private-vars-leading-underscore
bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
/**
* @dev Returns the current beacon.
*/
function getBeacon() internal view returns (address) {
return StorageSlot.getAddressSlot(BEACON_SLOT).value;
}
/**
* @dev Stores a new beacon in the EIP1967 beacon slot.
*/
function _setBeacon(address newBeacon) private {
if (newBeacon.code.length == 0) {
revert ERC1967InvalidBeacon(newBeacon);
}
StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;
address beaconImplementation = IBeacon(newBeacon).implementation();
if (beaconImplementation.code.length == 0) {
revert ERC1967InvalidImplementation(beaconImplementation);
}
}
/**
* @dev Change the beacon and trigger a setup call if data is nonempty.
* This function is payable only if the setup call is performed, otherwise `msg.value` is rejected
* to avoid stuck value in the contract.
*
* Emits an {IERC1967-BeaconUpgraded} event.
*
* CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since
* it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for
* efficiency.
*/
function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {
_setBeacon(newBeacon);
emit BeaconUpgraded(newBeacon);
if (data.length > 0) {
Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
} else {
_checkNonPayable();
}
}
/**
* @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract
* if an upgrade doesn't perform an initialization call.
*/
function _checkNonPayable() private {
if (msg.value > 0) {
revert ERC1967NonPayable();
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)
pragma solidity ^0.8.20;
/**
* @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
* instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
* be specified by overriding the virtual {_implementation} function.
*
* Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
* different contract through the {_delegate} function.
*
* The success and return data of the delegated call will be returned back to the caller of the proxy.
*/
abstract contract Proxy {
/**
* @dev Delegates the current call to `implementation`.
*
* This function does not return to its internal call site, it will return directly to the external caller.
*/
function _delegate(address implementation) internal virtual {
assembly {
// Copy msg.data. We take full control of memory in this inline assembly
// block because it will not return to Solidity code. We overwrite the
// Solidity scratch pad at memory position 0.
calldatacopy(0, 0, calldatasize())
// Call the implementation.
// out and outsize are 0 because we don't know the size yet.
let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
// Copy the returned data.
returndatacopy(0, 0, returndatasize())
switch result
// delegatecall returns 0 on error.
case 0 {
revert(0, returndatasize())
}
default {
return(0, returndatasize())
}
}
}
/**
* @dev This is a virtual function that should be overridden so it returns the address to which the fallback
* function and {_fallback} should delegate.
*/
function _implementation() internal view virtual returns (address);
/**
* @dev Delegates the current call to the address returned by `_implementation()`.
*
* This function does not return to its internal call site, it will return directly to the external caller.
*/
function _fallback() internal virtual {
_delegate(_implementation());
}
/**
* @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
* function in the contract matches the call data.
*/
fallback() external payable virtual {
_fallback();
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/BeaconProxy.sol)
pragma solidity ^0.8.20;
import {IBeacon} from "./IBeacon.sol";
import {Proxy} from "../Proxy.sol";
import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol";
/**
* @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}.
*
* The beacon address can only be set once during construction, and cannot be changed afterwards. It is stored in an
* immutable variable to avoid unnecessary storage reads, and also in the beacon storage slot specified by
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] so that it can be accessed externally.
*
* CAUTION: Since the beacon address can never be changed, you must ensure that you either control the beacon, or trust
* the beacon to not upgrade the implementation maliciously.
*
* IMPORTANT: Do not use the implementation logic to modify the beacon storage slot. Doing so would leave the proxy in
* an inconsistent state where the beacon storage slot does not match the beacon address.
*/
contract BeaconProxy is Proxy {
// An immutable address for the beacon to avoid unnecessary SLOADs before each delegate call.
address private immutable _beacon;
/**
* @dev Initializes the proxy with `beacon`.
*
* If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This
* will typically be an encoded function call, and allows initializing the storage of the proxy like a Solidity
* constructor.
*
* Requirements:
*
* - `beacon` must be a contract with the interface {IBeacon}.
* - If `data` is empty, `msg.value` must be zero.
*/
constructor(address beacon, bytes memory data) payable {
ERC1967Utils.upgradeBeaconToAndCall(beacon, data);
_beacon = beacon;
}
/**
* @dev Returns the current implementation address of the associated beacon.
*/
function _implementation() internal view virtual override returns (address) {
return IBeacon(_getBeacon()).implementation();
}
/**
* @dev Returns the beacon.
*/
function _getBeacon() internal view virtual returns (address) {
return _beacon;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)
pragma solidity ^0.8.20;
/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/
interface IBeacon {
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {UpgradeableBeacon} will check that this address is a contract.
*/
function implementation() external view returns (address);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/UpgradeableBeacon.sol)
pragma solidity ^0.8.20;
import {IBeacon} from "./IBeacon.sol";
import {Ownable} from "../../access/Ownable.sol";
/**
* @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their
* implementation contract, which is where they will delegate all function calls.
*
* An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon.
*/
contract UpgradeableBeacon is IBeacon, Ownable {
address private _implementation;
/**
* @dev The `implementation` of the beacon is invalid.
*/
error BeaconInvalidImplementation(address implementation);
/**
* @dev Emitted when the implementation returned by the beacon is changed.
*/
event Upgraded(address indexed implementation);
/**
* @dev Sets the address of the initial implementation, and the initial owner who can upgrade the beacon.
*/
constructor(address implementation_, address initialOwner) Ownable(initialOwner) {
_setImplementation(implementation_);
}
/**
* @dev Returns the current implementation address.
*/
function implementation() public view virtual returns (address) {
return _implementation;
}
/**
* @dev Upgrades the beacon to a new implementation.
*
* Emits an {Upgraded} event.
*
* Requirements:
*
* - msg.sender must be the owner of the contract.
* - `newImplementation` must be a contract.
*/
function upgradeTo(address newImplementation) public virtual onlyOwner {
_setImplementation(newImplementation);
}
/**
* @dev Sets the implementation contract address for this beacon
*
* Requirements:
*
* - `newImplementation` must be a contract.
*/
function _setImplementation(address newImplementation) private {
if (newImplementation.code.length == 0) {
revert BeaconInvalidImplementation(newImplementation);
}
_implementation = newImplementation;
emit Upgraded(newImplementation);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/transparent/ProxyAdmin.sol)
pragma solidity ^0.8.20;
import {ITransparentUpgradeableProxy} from "./TransparentUpgradeableProxy.sol";
import {Ownable} from "../../access/Ownable.sol";
/**
* @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an
* explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.
*/
contract ProxyAdmin is Ownable {
/**
* @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address)`
* and `upgradeAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,
* while `upgradeAndCall` will invoke the `receive` function if the second argument is the empty byte string.
* If the getter returns `"5.0.0"`, only `upgradeAndCall(address,bytes)` is present, and the second argument must
* be the empty byte string if no function should be called, making it impossible to invoke the `receive` function
* during an upgrade.
*/
string public constant UPGRADE_INTERFACE_VERSION = "5.0.0";
/**
* @dev Sets the initial owner who can perform upgrades.
*/
constructor(address initialOwner) Ownable(initialOwner) {}
/**
* @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.
* See {TransparentUpgradeableProxy-_dispatchUpgradeToAndCall}.
*
* Requirements:
*
* - This contract must be the admin of `proxy`.
* - If `data` is empty, `msg.value` must be zero.
*/
function upgradeAndCall(
ITransparentUpgradeableProxy proxy,
address implementation,
bytes memory data
) public payable virtual onlyOwner {
proxy.upgradeToAndCall{value: msg.value}(implementation, data);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error AddressInsufficientBalance(address account);
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedInnerCall();
/**
* @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
/**
* @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 or custom error, it is bubbled
* up by this function (like regular Solidity function calls). However, if
* the call reverted with no returned reason, this function reverts with a
* {FailedInnerCall} error.
*
* 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.
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @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`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
* was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
* unsuccessful call.
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
/**
* @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
* revert reason or with a default {FailedInnerCall} error.
*/
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
/**
* @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
*/
function _revert(bytes memory returndata) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert FailedInnerCall();
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
pragma solidity ^0.8.20;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```solidity
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(newImplementation.code.length > 0);
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*/
library StorageSlot {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
struct StringSlot {
string value;
}
struct BytesSlot {
bytes value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` with member `value` located at `slot`.
*/
function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` representation of the string storage pointer `store`.
*/
function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
/**
* @dev Returns an `BytesSlot` with member `value` located at `slot`.
*/
function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
*/
function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
}{
"evmVersion": "paris",
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_logic","type":"address"},{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"ERC1967InvalidAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ProxyDeniedAdminAccess","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"}]Contract Creation Code
60a060405260405162000eb138038062000eb18339810160408190526200002691620003cd565b82816200003482826200009c565b505081604051620000459062000366565b6001600160a01b039091168152602001604051809103906000f08015801562000072573d6000803e3d6000fd5b506001600160a01b0316608052620000936200008d60805190565b62000102565b505050620004cb565b620000a78262000174565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000f457620000ef8282620001f4565b505050565b620000fe62000271565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200014460008051602062000e91833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001718162000293565b50565b806001600160a01b03163b600003620001b057604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620002139190620004ad565b600060405180830381855af49150503d806000811462000250576040519150601f19603f3d011682016040523d82523d6000602084013e62000255565b606091505b50909250905062000268858383620002d6565b95945050505050565b3415620002915760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002bf57604051633173bdd160e11b815260006004820152602401620001a7565b8060008051602062000e91833981519152620001d3565b606082620002ef57620002e9826200033c565b62000335565b81511580156200030757506001600160a01b0384163b155b156200033257604051639996b31560e01b81526001600160a01b0385166004820152602401620001a7565b50805b9392505050565b8051156200034d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b610524806200096d83390190565b80516001600160a01b03811681146200038c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620003c4578181015183820152602001620003aa565b50506000910152565b600080600060608486031215620003e357600080fd5b620003ee8462000374565b9250620003fe6020850162000374565b60408501519092506001600160401b03808211156200041c57600080fd5b818601915086601f8301126200043157600080fd5b81518181111562000446576200044662000391565b604051601f8201601f19908116603f0116810190838211818310171562000471576200047162000391565b816040528281528960208487010111156200048b57600080fd5b6200049e836020830160208801620003a7565b80955050505050509250925092565b60008251620004c1818460208701620003a7565b9190910192915050565b608051610487620004e66000396000601001526104876000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610312565b8101906100a09190610352565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f5565b505050565b6100ae61026b565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101b457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516102129190610422565b600060405180830381855af49150503d806000811461024d576040519150601f19603f3d011682016040523d82523d6000602084013e610252565b606091505b509150915061026285838361028a565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029f5761029a826102e9565b6102e2565b81511580156102b657506001600160a01b0384163b155b156102df57604051639996b31560e01b81526001600160a01b03851660048201526024016101ab565b50805b9392505050565b8051156102f95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561032257600080fd5b8386111561032f57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561036557600080fd5b82356001600160a01b038116811461037c57600080fd5b9150602083013567ffffffffffffffff8082111561039957600080fd5b818501915085601f8301126103ad57600080fd5b8135818111156103bf576103bf61033c565b604051601f8201601f19908116603f011681019083821181831017156103e7576103e761033c565b8160405282815288602084870101111561040057600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b818110156104435760208186018101518583015201610429565b50600092019182525091905056fea264697066735822122027f80176059c85af4ee8751015dd9e5db167736b2eedc4be4d13ffc86fde444964736f6c63430008140033608060405234801561001057600080fd5b5060405161052438038061052483398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610427806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610093578063ad3cb1cc146100a6578063f2fde38b146100e4575b600080fd5b34801561005b57600080fd5b50610064610104565b005b34801561007257600080fd5b506000546040516001600160a01b0390911681526020015b60405180910390f35b6100646100a1366004610272565b610118565b3480156100b257600080fd5b506100d7604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008a919061038e565b3480156100f057600080fd5b506100646100ff3660046103a8565b610187565b61010c6101ca565b61011660006101f7565b565b6101206101ca565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015090869086906004016103c5565b6000604051808303818588803b15801561016957600080fd5b505af115801561017d573d6000803e3d6000fd5b5050505050505050565b61018f6101ca565b6001600160a01b0381166101be57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6101c7816101f7565b50565b6000546001600160a01b031633146101165760405163118cdaa760e01b81523360048201526024016101b5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101c757600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561028757600080fd5b833561029281610247565b925060208401356102a281610247565b9150604084013567ffffffffffffffff808211156102bf57600080fd5b818601915086601f8301126102d357600080fd5b8135818111156102e5576102e561025c565b604051601f8201601f19908116603f0116810190838211818310171561030d5761030d61025c565b8160405282815289602084870101111561032657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000815180845260005b8181101561036e57602081850181015186830182015201610352565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103a16020830184610348565b9392505050565b6000602082840312156103ba57600080fd5b81356103a181610247565b6001600160a01b03831681526040602082018190526000906103e990830184610348565b94935050505056fea2646970667358221220fd80254c134f0d940049c003947ece1f55b46d2e9ca1fdf64aa8803c026723b364736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000b1a20d1c885fd775df97396397d6f8f07abdd20d000000000000000000000000d6f0dabbbccd143f7d526a82ca176b5395ccc844000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000645e02af2a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000055555555555555555555555555555555555555550000000000000000000000000000000000000000000000000000000005f5e11600000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405261000c61000e565b005b7f000000000000000000000000150f6ce7301022d50285d0445c8941f60783a0e06001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610312565b8101906100a09190610352565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f5565b505050565b6100ae61026b565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101b457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516102129190610422565b600060405180830381855af49150503d806000811461024d576040519150601f19603f3d011682016040523d82523d6000602084013e610252565b606091505b509150915061026285838361028a565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029f5761029a826102e9565b6102e2565b81511580156102b657506001600160a01b0384163b155b156102df57604051639996b31560e01b81526001600160a01b03851660048201526024016101ab565b50805b9392505050565b8051156102f95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561032257600080fd5b8386111561032f57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561036557600080fd5b82356001600160a01b038116811461037c57600080fd5b9150602083013567ffffffffffffffff8082111561039957600080fd5b818501915085601f8301126103ad57600080fd5b8135818111156103bf576103bf61033c565b604051601f8201601f19908116603f011681019083821181831017156103e7576103e761033c565b8160405282815288602084870101111561040057600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b818110156104435760208186018101518583015201610429565b50600092019182525091905056fea264697066735822122027f80176059c85af4ee8751015dd9e5db167736b2eedc4be4d13ffc86fde444964736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b1a20d1c885fd775df97396397d6f8f07abdd20d000000000000000000000000d6f0dabbbccd143f7d526a82ca176b5395ccc844000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000645e02af2a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000055555555555555555555555555555555555555550000000000000000000000000000000000000000000000000000000005f5e11600000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _logic (address): 0xB1A20D1c885fd775df97396397d6f8F07Abdd20D
Arg [1] : initialOwner (address): 0xd6F0DabbBccd143f7d526a82Ca176b5395cCc844
Arg [2] : _data (bytes): 0x5e02af2a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000055555555555555555555555555555555555555550000000000000000000000000000000000000000000000000000000005f5e116
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000b1a20d1c885fd775df97396397d6f8f07abdd20d
Arg [1] : 000000000000000000000000d6f0dabbbccd143f7d526a82ca176b5395ccc844
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [4] : 5e02af2a00000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000800000000000000000000000055555555555555555555555555555555
Arg [6] : 5555555500000000000000000000000000000000000000000000000000000000
Arg [7] : 05f5e11600000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$47,797,047.53
Net Worth in HYPE
Token Allocations
YELD
94.27%
TAIKO
1.18%
LLD
0.76%
Others
3.78%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| POL | 94.27% | $0.028833 | 1,562,786,802.6898 | $45,060,597.65 | |
| POL | 0.02% | $0.999614 | 8,479.0951 | $8,475.82 | |
| POL | <0.01% | $0.998544 | 3,377.8808 | $3,372.96 | |
| POL | <0.01% | $0.117502 | 21,667.2867 | $2,545.95 | |
| POL | <0.01% | $0.998685 | 1,878.3424 | $1,875.87 | |
| POL | <0.01% | $2,974.16 | 0.3403 | $1,012.24 | |
| POL | <0.01% | $0.999614 | 332.9254 | $332.8 | |
| POL | <0.01% | $87,945 | 0.003654 | $321.35 | |
| POL | <0.01% | $0.005316 | 11,449.4569 | $60.86 | |
| POL | <0.01% | $125.42 | 0.2397 | $30.06 | |
| POL | <0.01% | $0.11859 | 121 | $14.35 | |
| POL | <0.01% | $88,648 | 0.00006005 | $5.32 | |
| POL | <0.01% | $11.81 | 0.3625 | $4.28 | |
| POL | <0.01% | $0.046678 | 68.5332 | $3.2 | |
| POL | <0.01% | $1.27 | 1.3885 | $1.76 | |
| POL | <0.01% | $0.064005 | 25.5016 | $1.63 | |
| POL | <0.01% | $155.33 | 0.009696 | $1.51 | |
| POL | <0.01% | $0.14749 | 10 | $1.47 | |
| POL | <0.01% | $0.001471 | 900.1 | $1.32 | |
| POL | <0.01% | <$0.000001 | 100,000,000 | $1.31 | |
| POL | <0.01% | $1 | 1.0515 | $1.05 | |
| POL | <0.01% | $0.999431 | 1 | $0.9994 | |
| POL | <0.01% | $0.000018 | 46,470.0168 | $0.8401 | |
| POL | <0.01% | <$0.000001 | 150,623,127.4371 | $0.5723 | |
| POL | <0.01% | $0.009917 | 18.6759 | $0.1852 | |
| POL | <0.01% | $0.000009 | 12,403.454 | $0.1144 | |
| POL | <0.01% | $11.36 | 0.01 | $0.1136 | |
| POL | <0.01% | $0.063718 | 1.7783 | $0.1133 | |
| POL | <0.01% | $0.000057 | 1,900 | $0.1075 | |
| ETH | 1.16% | $0.18681 | 2,970,414.3117 | $554,901.9 | |
| ETH | 0.76% | $0.901688 | 405,364.1964 | $365,512.03 | |
| ETH | 0.74% | $0.046675 | 7,604,426.5967 | $354,937.52 | |
| ETH | 0.58% | $0.002466 | 112,011,396.2133 | $276,206.26 | |
| ETH | 0.49% | $0.999604 | 232,037.0218 | $231,945.14 | |
| ETH | 0.37% | $0.011509 | 15,189,986.6233 | $174,821.42 | |
| ETH | 0.23% | $0.000021 | 5,130,261,224.2216 | $109,941.5 | |
| ETH | 0.17% | $0.000068 | 1,228,428,783.37 | $83,385.75 | |
| ETH | 0.11% | $2,972.28 | 17.7111 | $52,642.36 | |
| ETH | 0.09% | $0.420218 | 103,556.7678 | $43,516.42 | |
| ETH | 0.07% | <$0.000001 | 172,335,011,463,103.72 | $34,511.12 | |
| ETH | 0.07% | $0.013114 | 2,535,709.5891 | $33,252.94 | |
| ETH | 0.04% | $0.00011 | 154,745,304.7707 | $17,014.25 | |
| ETH | 0.03% | $0.000047 | 337,830,518.0434 | $15,938.68 | |
| ETH | 0.02% | $0.22897 | 37,600.3184 | $8,609.34 | |
| ETH | 0.02% | $0.998731 | 7,765.118 | $7,755.26 | |
| ETH | 0.02% | <$0.000001 | 30,070,111,234.3491 | $7,268.4 | |
| ETH | <0.01% | $0.992408 | 4,457.0677 | $4,423.23 | |
| ETH | <0.01% | $0.000003 | 1,611,918,118.6537 | $4,218.32 | |
| ETH | <0.01% | $2,972.28 | 1.194 | $3,548.9 | |
| ETH | <0.01% | $0.000479 | 3,780,227.2168 | $1,809.97 | |
| ETH | <0.01% | $0.000136 | 10,043,422.2535 | $1,362.49 | |
| ETH | <0.01% | $87,830 | 0.0145 | $1,271.78 | |
| ETH | <0.01% | <$0.000001 | 2,804,247,849.0783 | $880.33 | |
| ETH | <0.01% | $0.000674 | 1,106,918.5984 | $746.13 | |
| ETH | <0.01% | $0.025425 | 24,393.1722 | $620.2 | |
| ETH | <0.01% | $0.0006 | 695,033.7377 | $417.1 | |
| ETH | <0.01% | $125.62 | 2.5832 | $324.5 | |
| ETH | <0.01% | $0.048367 | 5,025 | $243.05 | |
| ETH | <0.01% | $0.79218 | 300 | $237.65 | |
| ETH | <0.01% | $0.007242 | 24,861.3941 | $180.06 | |
| ETH | <0.01% | $87,510 | 0.001984 | $173.62 | |
| ETH | <0.01% | <$0.000001 | 2,437,575,696,289.7 | $139.73 | |
| ETH | <0.01% | $0.094184 | 1,000 | $94.18 | |
| ETH | <0.01% | $0.383274 | 223.3594 | $85.61 | |
| ETH | <0.01% | $0.054819 | 1,544.8704 | $84.69 | |
| ETH | <0.01% | $0.001657 | 36,310.9417 | $60.17 | |
| ETH | <0.01% | $891.74 | 0.05 | $44.59 | |
| ETH | <0.01% | $0.032677 | 1,207.4666 | $39.46 | |
| ETH | <0.01% | $0.266998 | 115 | $30.7 | |
| ETH | <0.01% | $5,095.14 | 0.00523606 | $26.68 | |
| ETH | <0.01% | $3.38 | 7 | $23.66 | |
| ETH | <0.01% | $0.874745 | 23.9055 | $20.91 | |
| ETH | <0.01% | $0.999315 | 19.8414 | $19.83 | |
| ETH | <0.01% | $0.791217 | 22 | $17.41 | |
| ETH | <0.01% | $0.999496 | 14.9823 | $14.97 | |
| ETH | <0.01% | <$0.000001 | 164,267,956.7655 | $14.69 | |
| ETH | <0.01% | $0.997683 | 11.5666 | $11.54 | |
| ETH | <0.01% | $0.046194 | 238.5028 | $11.02 | |
| ETH | <0.01% | $1.01 | 10.0001 | $10.05 | |
| ETH | <0.01% | $0.999984 | 10 | $10 | |
| ETH | <0.01% | $0.999326 | 10 | $9.99 | |
| ETH | <0.01% | $0.00641 | 1,508.6583 | $9.67 | |
| ETH | <0.01% | $0.989114 | 9.5 | $9.4 | |
| ETH | <0.01% | <$0.000001 | 416,403,211.3551 | $8.52 | |
| ETH | <0.01% | <$0.000001 | 3,531,405,644.502 | $7.77 | |
| ETH | <0.01% | $0.009504 | 733.747 | $6.97 | |
| ETH | <0.01% | $0.000008 | 792,987.154 | $6.15 | |
| ETH | <0.01% | $0.000116 | 52,412 | $6.06 | |
| ETH | <0.01% | $0.02605 | 215.971 | $5.63 | |
| ETH | <0.01% | $0.000005 | 1,009,660.6766 | $5.01 | |
| ETH | <0.01% | $0.000315 | 9,008.9017 | $2.83 | |
| ETH | <0.01% | $3.22 | 0.6529 | $2.1 | |
| ETH | <0.01% | <$0.000001 | 200,000,000 | $2.1 | |
| ETH | <0.01% | $0.005489 | 300 | $1.65 | |
| ETH | <0.01% | $0.020882 | 76.6898 | $1.6 | |
| ETH | <0.01% | $0.00392 | 260.9933 | $1.02 | |
| ETH | <0.01% | $0.046707 | 20.7839 | $0.9707 | |
| ETH | <0.01% | $0.004078 | 188 | $0.7667 | |
| ETH | <0.01% | $0.000042 | 17,259.4776 | $0.7207 | |
| ETH | <0.01% | <$0.000001 | 1,000,000,000 | $0.7185 | |
| ETH | <0.01% | $0.011493 | 59.97 | $0.6892 | |
| ETH | <0.01% | $0.002767 | 227.9786 | $0.6308 | |
| ETH | <0.01% | $0.036153 | 11.8143 | $0.4271 | |
| ETH | <0.01% | $0.008054 | 49.3819 | $0.3977 | |
| ETH | <0.01% | $0.413755 | 0.8121 | $0.336 | |
| ETH | <0.01% | $0.00968 | 29.9375 | $0.2897 | |
| ETH | <0.01% | $0.000053 | 5,000 | $0.2632 | |
| ETH | <0.01% | $0.000037 | 6,856.369 | $0.2519 | |
| ETH | <0.01% | <$0.000001 | 1,648,635.9197 | $0.1995 | |
| ETH | <0.01% | $0.183178 | 1.0446 | $0.1913 | |
| ETH | <0.01% | <$0.000001 | 8,492,435.1567 | $0.1866 | |
| ETH | <0.01% | $0.063993 | 2.0935 | $0.1339 | |
| ETH | <0.01% | $0.163328 | 0.7063 | $0.1153 | |
| ETH | <0.01% | $0.001523 | 71.4138 | $0.1087 | |
| BSC | 0.11% | $881.61 | 60.7168 | $53,528.27 | |
| BSC | 0.10% | $5.23 | 9,400 | $49,162 | |
| BSC | 0.06% | $0.001723 | 16,313,988.2883 | $28,113.82 | |
| BSC | 0.05% | $0.121626 | 213,002.7672 | $25,906.62 | |
| BSC | 0.02% | $0.182794 | 40,933.1652 | $7,482.34 | |
| BSC | <0.01% | $883.81 | 4.09 | $3,614.8 | |
| BSC | <0.01% | $0.99952 | 3,072.0469 | $3,070.57 | |
| BSC | <0.01% | $0.998725 | 2,566.8017 | $2,563.53 | |
| BSC | <0.01% | $0.039863 | 59,843.7084 | $2,385.57 | |
| BSC | <0.01% | $0.999559 | 835.0609 | $834.69 | |
| BSC | <0.01% | $0.195099 | 2,100 | $409.71 | |
| BSC | <0.01% | $2,913.74 | 0.0993 | $289.32 | |
| BSC | <0.01% | $1.06 | 101.38 | $107.87 | |
| BSC | <0.01% | $0.645269 | 113.9983 | $73.56 | |
| BSC | <0.01% | $0.011364 | 4,613.8408 | $52.43 | |
| BSC | <0.01% | $0.026659 | 1,904.6454 | $50.78 | |
| BSC | <0.01% | <$0.000001 | 289,626,507,346.725 | $48.82 | |
| BSC | <0.01% | $0.00247 | 12,543.6994 | $30.98 | |
| BSC | <0.01% | $0.414025 | 42.9289 | $17.77 | |
| BSC | <0.01% | $40.88 | 0.2439 | $9.97 | |
| BSC | <0.01% | <$0.000001 | 10,063,640,822.1516 | $7.04 | |
| BSC | <0.01% | $0.005744 | 935.6797 | $5.37 | |
| BSC | <0.01% | $0.010341 | 500 | $5.17 | |
| BSC | <0.01% | $123.59 | 0.0353 | $4.36 | |
| BSC | <0.01% | $1.88 | 2 | $3.75 | |
| BSC | <0.01% | $0.000033 | 109,398.561 | $3.64 | |
| BSC | <0.01% | $11.63 | 0.279 | $3.25 | |
| BSC | <0.01% | $0.16424 | 12.7544 | $2.09 | |
| BSC | <0.01% | $0.012173 | 160 | $1.95 | |
| BSC | <0.01% | $0.001596 | 1,039.7093 | $1.66 | |
| BSC | <0.01% | $1.09 | 1.4481 | $1.58 | |
| BSC | <0.01% | $0.9997 | 0.8949 | $0.8946 | |
| BSC | <0.01% | $0.000547 | 1,383.5602 | $0.7571 | |
| BSC | <0.01% | $1.3 | 0.5 | $0.6513 | |
| BSC | <0.01% | $1.89 | 0.2425 | $0.4582 | |
| BSC | <0.01% | $0.008358 | 50 | $0.4178 | |
| BSC | <0.01% | $0.007606 | 50.1242 | $0.3812 | |
| BSC | <0.01% | $0.355319 | 1 | $0.3553 | |
| BSC | <0.01% | <$0.000001 | 12,345,487,968 | $0.3456 | |
| BSC | <0.01% | $0.117765 | 2 | $0.2355 | |
| BSC | <0.01% | $0.001032 | 219 | $0.226 | |
| BSC | <0.01% | $0.836983 | 0.237 | $0.1983 | |
| BSC | <0.01% | $0.000739 | 210.9356 | $0.1558 | |
| BSC | <0.01% | $0.001509 | 100 | $0.1508 | |
| BSC | <0.01% | $0.049715 | 3 | $0.1491 | |
| BSC | <0.01% | $0.0007 | 199.4878 | $0.1397 | |
| BSC | <0.01% | <$0.000001 | 17,081,669.4414 | $0.1137 | |
| ARB | 0.08% | $2,972.26 | 12.673 | $37,667.53 | |
| ARB | 0.01% | $0.002741 | 2,000,000 | $5,481.05 | |
| ARB | 0.01% | $0.999601 | 5,334.9388 | $5,332.81 | |
| ARB | 0.01% | $0.000315 | 16,606,866.8815 | $5,225.18 | |
| ARB | <0.01% | $0.169209 | 23,788.6562 | $4,025.25 | |
| ARB | <0.01% | $0.097004 | 39,292.8002 | $3,811.56 | |
| ARB | <0.01% | $0.999601 | 288.8284 | $288.71 | |
| ARB | <0.01% | $2,974.18 | 0.095 | $282.55 | |
| ARB | <0.01% | $0.998778 | 255.0239 | $254.71 | |
| ARB | <0.01% | $87,973 | 0.0019868 | $174.78 | |
| ARB | <0.01% | $1 | 15.565 | $15.58 | |
| ARB | <0.01% | $0.999222 | 13.6693 | $13.66 | |
| ARB | <0.01% | $0.089445 | 113.2344 | $10.13 | |
| ARB | <0.01% | $0.968833 | 10 | $9.69 | |
| ARB | <0.01% | $0.020198 | 200 | $4.04 | |
| ARB | <0.01% | $3.22 | 1 | $3.22 | |
| ARB | <0.01% | $3.12 | 1 | $3.12 | |
| ARB | <0.01% | $0.020922 | 114.4105 | $2.39 | |
| ARB | <0.01% | $0.518061 | 3.3735 | $1.75 | |
| ARB | <0.01% | $0.171226 | 5 | $0.8561 | |
| ARB | <0.01% | $0.00024 | 3,210.7771 | $0.7701 | |
| ARB | <0.01% | $0.067739 | 10.7501 | $0.7282 | |
| ARB | <0.01% | $0.018181 | 28.6874 | $0.5215 | |
| ARB | <0.01% | $0.000385 | 1,200 | $0.4614 | |
| OP | 0.08% | $2,969.78 | 12.1763 | $36,160.98 | |
| OP | <0.01% | $0.295966 | 6,134.4541 | $1,815.59 | |
| OP | <0.01% | $2,972.57 | 0.027 | $80.31 | |
| OP | <0.01% | $0.998727 | 10.4166 | $10.4 | |
| OP | <0.01% | $0.999553 | 9.1031 | $9.1 | |
| OP | <0.01% | $0.999553 | 4.7199 | $4.72 | |
| HYPEREVM | 0.04% | $28.53 | 677.51 | $19,329.36 | |
| HYPEREVM | <0.01% | $0.995895 | 435.01 | $433.22 | |
| HYPEREVM | <0.01% | $28.57 | 3.65 | $104.29 | |
| HYPEREVM | <0.01% | $0.998835 | 58.4563 | $58.39 | |
| HYPEREVM | <0.01% | $0.000257 | 999.5 | $0.2571 | |
| LINEA | 0.04% | $2,964.86 | 6.3374 | $18,789.65 | |
| LINEA | <0.01% | $2,972.28 | 0.041 | $121.86 | |
| LINEA | <0.01% | $0.999615 | 12.0097 | $12.01 | |
| LINEA | <0.01% | $0.006382 | 1,799 | $11.48 | |
| GNO | <0.01% | $0.99956 | 2,988.7736 | $2,987.46 | |
| GNO | <0.01% | $0.999614 | 108.5994 | $108.56 | |
| GNO | <0.01% | $0.99956 | 9 | $9 | |
| GNO | <0.01% | $0.998764 | 1.7511 | $1.75 | |
| GNO | <0.01% | $0.012058 | 10 | $0.1205 | |
| AVAX | <0.01% | $11.81 | 212.5356 | $2,510.17 | |
| AVAX | <0.01% | $0.99969 | 223.7672 | $223.7 | |
| AVAX | <0.01% | $0.99969 | 66.037 | $66.02 | |
| AVAX | <0.01% | $0.998633 | 43.4291 | $43.37 | |
| AVAX | <0.01% | $11.84 | 3.43 | $40.62 | |
| AVAX | <0.01% | $2,971.95 | 0.0104 | $31 | |
| AVAX | <0.01% | $0.998208 | 26.2914 | $26.24 | |
| AVAX | <0.01% | $0.998633 | 14.4146 | $14.39 | |
| AVAX | <0.01% | $0.999447 | 4.2302 | $4.23 | |
| AVAX | <0.01% | $0.002535 | 1,393.7511 | $3.53 | |
| AVAX | <0.01% | $0.00024 | 1,000 | $0.2399 | |
| AVAX | <0.01% | $0.999906 | 0.1447 | $0.1446 | |
| SONIC | <0.01% | $0.066846 | 9,137.9637 | $610.84 | |
| SONIC | <0.01% | $0.999601 | 60.5484 | $60.52 | |
| SONIC | <0.01% | $0.066944 | 718 | $48.07 | |
| SONIC | <0.01% | $1.06 | 0.1 | $0.1064 | |
| MANTLE | <0.01% | $0.885913 | 704.7884 | $624.38 | |
| MANTLE | <0.01% | $0.886416 | 4 | $3.55 | |
| MANTLE | <0.01% | $0.99935 | 0.6 | $0.5996 | |
| BERA | <0.01% | $0.638979 | 164.36 | $105.02 | |
| BERA | <0.01% | $1.01 | 22.801 | $22.96 | |
| BERA | <0.01% | $0.998645 | 1 | $0.9986 | |
| BERA | <0.01% | $4,175.51 | 0.00012394 | $0.5175 | |
| BERA | <0.01% | $0.646786 | 0.26 | $0.168164 | |
| BASE | <0.01% | <$0.000001 | 295,774,647 | $3.46 | |
| BASE | <0.01% | $0.000739 | 3,000 | $2.22 | |
| BASE | <0.01% | $0.001747 | 110 | $0.1921 | |
| SEI | <0.01% | $0.99969 | 1.4019 | $1.4 | |
| SEI | <0.01% | $0.106024 | 12 | $1.27 | |
| PLASMA | <0.01% | $0.998544 | 1.1 | $1.1 | |
| PLASMA | <0.01% | $0.132027 | 0.03 | $0.003961 | |
| MONAD | <0.01% | $0.02119 | 36 | $0.762842 | |
| MONAD | <0.01% | $0.999615 | 0.1007 | $0.1006 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.