More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21450921 | 2 days ago | 1.96052065 ETH | ||||
21443764 | 3 days ago | 3.16069896 ETH | ||||
21436600 | 4 days ago | 5.19991003 ETH | ||||
21429448 | 5 days ago | 9.92969504 ETH | ||||
21422304 | 6 days ago | 680.62355183 ETH | ||||
21379306 | 12 days ago | 4.370956 ETH | ||||
21372133 | 13 days ago | 3.69567982 ETH | ||||
21364976 | 14 days ago | 8.26288208 ETH | ||||
21357811 | 15 days ago | 8.77119616 ETH | ||||
21350656 | 16 days ago | 3.52155014 ETH | ||||
21314856 | 21 days ago | 1.89416518 ETH | ||||
21307694 | 22 days ago | 3.28485347 ETH | ||||
21300526 | 23 days ago | 6.92045343 ETH | ||||
21293387 | 24 days ago | 9.75762366 ETH | ||||
21286234 | 25 days ago | 294.46645458 ETH | ||||
21250475 | 30 days ago | 0.11470231 ETH | ||||
21243306 | 31 days ago | 3.33658193 ETH | ||||
21236136 | 32 days ago | 5.1065855 ETH | ||||
21228989 | 33 days ago | 9.50231224 ETH | ||||
21221809 | 34 days ago | 9.57745769 ETH | ||||
21214641 | 35 days ago | 640.56445883 ETH | ||||
21178800 | 40 days ago | 1.51720497 ETH | ||||
21171636 | 41 days ago | 3.07300219 ETH | ||||
21164476 | 42 days ago | 7.43930467 ETH | ||||
21157303 | 43 days ago | 8.61973315 ETH |
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.
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x00a0BE1B...93c1e3bB9 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Cub
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
london EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 // SPDX-FileCopyrightText: 2023 Kiln <[email protected]> // // ██╗ ██╗██╗██╗ ███╗ ██╗ // ██║ ██╔╝██║██║ ████╗ ██║ // █████╔╝ ██║██║ ██╔██╗ ██║ // ██╔═██╗ ██║██║ ██║╚██╗██║ // ██║ ██╗██║███████╗██║ ╚████║ // ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ // pragma solidity >=0.8.17; import "openzeppelin-contracts/proxy/beacon/BeaconProxy.sol"; import "./interfaces/IFixer.sol"; import "./interfaces/IHatcher.sol"; import "./interfaces/ICub.sol"; /// @title Cub /// @author mortimr @ Kiln /// @dev Unstructured Storage Friendly /// @notice The cub is controlled by a Hatcher in charge of providing its status details and implementation address. contract Cub is Proxy, ERC1967Upgrade, ICub { /// @notice Initializer to not rely on the constructor. /// @param beacon The address of the beacon to pull its info from /// @param data The calldata to add to the initial call, if any // slither-disable-next-line naming-convention function ___initializeCub(address beacon, bytes memory data) external { if (_getBeacon() != address(0)) { revert CubAlreadyInitialized(); } _upgradeBeaconToAndCall(beacon, data, false); } /// @dev Internal utility to retrieve the implementation from the beacon. /// @return The implementation address // slither-disable-next-line dead-code function _implementation() internal view virtual override returns (address) { return IBeacon(_getBeacon()).implementation(); } /// @dev Prevents unauthorized calls. /// @dev This will make the method transparent, forcing unauthorized callers into the fallback. modifier onlyBeacon() { if (msg.sender != _getBeacon()) { _fallback(); } else { _; } } /// @dev Prevents unauthorized calls. /// @dev This will make the method transparent, forcing unauthorized callers into the fallback. modifier onlyMe() { if (msg.sender != address(this)) { _fallback(); } else { _; } } /// @inheritdoc ICub // slither-disable-next-line reentrancy-events function appliedFixes(address[] memory fixers) public onlyMe { emit AppliedFixes(fixers); } /// @inheritdoc ICub function applyFix(address fixer) external onlyBeacon { _applyFix(fixer); } /// @dev Retrieve the list of fixes for this cub from the hatcher. /// @param beacon Address of the hatcher acting as a beacon /// @return List of fixes to apply function _fixes(address beacon) internal view returns (address[] memory) { return IHatcher(beacon).fixes(address(this)); } /// @dev Retrieve the status for this cub from the hatcher. /// @param beacon Address of the hatcher acting as a beacon /// @return First value is true if fixes are pending, second value is true if cub is paused function _status(address beacon) internal view returns (address, bool, bool) { return IHatcher(beacon).status(address(this)); } /// @dev Commits fixes to the hatcher. /// @param beacon Address of the hatcher acting as a beacon function _commit(address beacon) internal { IHatcher(beacon).commitFixes(); } /// @dev Fetches the current cub status and acts accordingly. /// @param beacon Address of the hatcher acting as a beacon function _fix(address beacon) internal returns (address) { (address implementation, bool hasFixes, bool isPaused) = _status(beacon); if (isPaused && msg.sender != address(0)) { revert CalledWhenPaused(msg.sender); } if (hasFixes) { bool isStaticCall = false; address[] memory fixes = _fixes(beacon); // This is a trick to check if the current execution context // allows state modifications try this.appliedFixes(fixes) {} catch { isStaticCall = true; } // if we properly emitted AppliedFixes, we are not in a view or pure call // we can then apply fixes if (!isStaticCall) { for (uint256 idx = 0; idx < fixes.length;) { if (fixes[idx] != address(0)) { _applyFix(fixes[idx]); } unchecked { ++idx; } } _commit(beacon); } } return implementation; } /// @dev Applies the given fix, and reverts in case of error. /// @param fixer Address that implements the fix // slither-disable-next-line controlled-delegatecall,delegatecall-loop,low-level-calls function _applyFix(address fixer) internal { (bool success, bytes memory rdata) = fixer.delegatecall(abi.encodeCall(IFixer.fix, ())); if (!success) { revert FixDelegateCallError(fixer, rdata); } (success) = abi.decode(rdata, (bool)); if (!success) { revert FixCallError(fixer); } } /// @dev Fallback method that ends up forwarding calls as delegatecalls to the implementation. function _fallback() internal override(Proxy) { _beforeFallback(); address beacon = _getBeacon(); address implementation = _fix(beacon); _delegate(implementation); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/beacon/BeaconProxy.sol) pragma solidity ^0.8.0; import "./IBeacon.sol"; import "../Proxy.sol"; import "../ERC1967/ERC1967Upgrade.sol"; /** * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}. * * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't * conflict with the storage layout of the implementation behind the proxy. * * _Available since v3.4._ */ contract BeaconProxy is Proxy, ERC1967Upgrade { /** * @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}. */ constructor(address beacon, bytes memory data) payable { _upgradeBeaconToAndCall(beacon, data, false); } /** * @dev Returns the current beacon address. */ function _beacon() internal view virtual returns (address) { return _getBeacon(); } /** * @dev Returns the current implementation address of the associated beacon. */ function _implementation() internal view virtual override returns (address) { return IBeacon(_getBeacon()).implementation(); } /** * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}. * * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. * * Requirements: * * - `beacon` must be a contract. * - The implementation returned by `beacon` must be a contract. */ function _setBeacon(address beacon, bytes memory data) internal virtual { _upgradeBeaconToAndCall(beacon, data, false); } }
// SPDX-License-Identifier: MIT // SPDX-FileCopyrightText: 2023 Kiln <[email protected]> // // ██╗ ██╗██╗██╗ ███╗ ██╗ // ██║ ██╔╝██║██║ ████╗ ██║ // █████╔╝ ██║██║ ██╔██╗ ██║ // ██╔═██╗ ██║██║ ██║╚██╗██║ // ██║ ██╗██║███████╗██║ ╚████║ // ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ // pragma solidity >=0.8.17; /// @title Fixer /// @author mortimr @ Kiln /// @dev Unstructured Storage Friendly /// @notice The Hatcher can deploy, upgrade, fix and pause a set of instances called cubs. /// All cubs point to the same common implementation. interface IFixer { /// @notice Interface to implement on a Fixer contract. /// @return isFixed True if fix was properly applied function fix() external returns (bool isFixed); }
// SPDX-License-Identifier: MIT // SPDX-FileCopyrightText: 2023 Kiln <[email protected]> // // ██╗ ██╗██╗██╗ ███╗ ██╗ // ██║ ██╔╝██║██║ ████╗ ██║ // █████╔╝ ██║██║ ██╔██╗ ██║ // ██╔═██╗ ██║██║ ██║╚██╗██║ // ██║ ██╗██║███████╗██║ ╚████║ // ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ // pragma solidity >=0.8.17; import "openzeppelin-contracts/proxy/beacon/IBeacon.sol"; /// @title Hatcher Interface /// @author mortimr @ Kiln /// @dev Unstructured Storage Friendly /// @notice The Hatcher can deploy, upgrade, fix and pause a set of instances called cubs. /// All cubs point to the same coomon implementation. interface IHatcher is IBeacon { /// @notice Emitted when the system is globally paused. event GlobalPause(); /// @notice Emitted when the system is globally unpaused. event GlobalUnpause(); /// @notice Emitted when a specific cub is paused. /// @param cub Address of the cub being paused event Pause(address cub); /// @notice Emitted when a specific cub is unpaused. /// @param cub Address of the cub being unpaused event Unpause(address cub); /// @notice Emitted when a global fix is removed. /// @param index Index of the global fix being removed event DeletedGlobalFix(uint256 index); /// @notice Emitted when a cub has properly applied a fix. /// @param cub Address of the cub that applied the fix /// @param fix Address of the fix was applied event AppliedFix(address cub, address fix); /// @notice Emitted the common implementation is updated. /// @param implementation New common implementation address event Upgraded(address indexed implementation); /// @notice Emitted a new cub is hatched. /// @param cub Address of the new instance /// @param cdata Calldata used to perform the atomic first call event Hatched(address indexed cub, bytes cdata); /// @notice Emitted a the initial progress has been changed. /// @param initialProgress New initial progress value event SetInitialProgress(uint256 initialProgress); /// @notice Emitted a new pauser is set. /// @param pauser Address of the new pauser event SetPauser(address pauser); /// @notice Emitted a cub committed some global fixes. /// @param cub Address of the cub that applied the global fixes /// @param progress New cub progress event CommittedFixes(address cub, uint256 progress); /// @notice Emitted a global fix is registered. /// @param fix Address of the new global fix /// @param index Index of the new global fix in the global fix array event RegisteredGlobalFix(address fix, uint256 index); /// @notice The provided implementation is not a smart contract. /// @param implementation The provided implementation error ImplementationNotAContract(address implementation); /// @notice Retrieve the common implementation. /// @return implementationAddress Address of the common implementation function implementation() external view returns (address implementationAddress); /// @notice Retrieve cub status details. /// @param cub The address of the cub to fetch the status of /// @return implementationAddress The current implementation address to use /// @return hasFixes True if there are fixes to apply /// @return isPaused True if the system is paused globally or the calling cub is paused function status(address cub) external view returns (address implementationAddress, bool hasFixes, bool isPaused); /// @notice Retrieve the initial progress. /// @dev This value is the starting progress value for all new cubs /// @return currentInitialProgress The initial progress function initialProgress() external view returns (uint256 currentInitialProgress); /// @notice Retrieve the current progress of a specific cub. /// @param cub Address of the cub /// @return currentProgress The current progress of the cub function progress(address cub) external view returns (uint256 currentProgress); /// @notice Retrieve the global pause status. /// @return isGlobalPaused True if globally paused function globalPaused() external view returns (bool isGlobalPaused); /// @notice Retrieve a cub pause status. /// @param cub Address of the cub /// @return isPaused True if paused function paused(address cub) external view returns (bool isPaused); /// @notice Retrieve the address of the pauser. function pauser() external view returns (address); /// @notice Retrieve a cub's global fixes that need to be applied, taking its progress into account. /// @param cub Address of the cub /// @return fixesAddresses An array of addresses that implement fixes function fixes(address cub) external view returns (address[] memory fixesAddresses); /// @notice Retrieve the raw list of global fixes. /// @return globalFixesAddresses An array of addresses that implement the global fixes function globalFixes() external view returns (address[] memory globalFixesAddresses); /// @notice Retrieve the address of the next hatched cub. /// @return nextHatchedCub The address of the next cub function nextHatch() external view returns (address nextHatchedCub); /// @notice Retrieve the freeze status. /// @return True if frozen function frozen() external view returns (bool); /// @notice Retrieve the timestamp when the freeze happens. /// @return The freeze timestamp function freezeTime() external view returns (uint256); /// @notice Creates a new cub. /// @param cdata The calldata to use for the initial atomic call /// @return cubAddress The address of the new cub function hatch(bytes calldata cdata) external returns (address cubAddress); /// @notice Creates a new cub, without calldata. /// @return cubAddress The address of the new cub function hatch() external returns (address cubAddress); /// @notice Sets the progress of the caller to the current global fixes array length. function commitFixes() external; /// @notice Sets the address of the pauser. /// @param newPauser Address of the new pauser function setPauser(address newPauser) external; /// @notice Apply a fix to several cubs. /// @param fixer Fixer contract implementing the fix /// @param cubs List of cubs to apply the fix on function applyFixToCubs(address fixer, address[] calldata cubs) external; /// @notice Apply several fixes to one cub. /// @param cub The cub to apply the fixes on /// @param fixers List of fixer contracts implementing the fixes function applyFixesToCub(address cub, address[] calldata fixers) external; /// @notice Register a new global fix for cubs to call asynchronously. /// @param fixer Address of the fixer implementing the fix function registerGlobalFix(address fixer) external; /// @notice Deletes a global fix from the array. /// @param index Index of the global fix to remove function deleteGlobalFix(uint256 index) external; /// @notice Upgrades the common implementation address. /// @param newImplementation Address of the new common implementation function upgradeTo(address newImplementation) external; /// @notice Upgrades the common implementation address and the initial progress value. /// @param newImplementation Address of the new common implementation /// @param initialProgress_ The new initial progress value function upgradeToAndChangeInitialProgress(address newImplementation, uint256 initialProgress_) external; /// @notice Sets the initial progress value. /// @param initialProgress_ The new initial progress value function setInitialProgress(uint256 initialProgress_) external; /// @notice Sets the progress of a cub. /// @param cub Address of the cub /// @param newProgress New progress value function setCubProgress(address cub, uint256 newProgress) external; /// @notice Pauses a set of cubs. /// @param cubs List of cubs to pause function pauseCubs(address[] calldata cubs) external; /// @notice Unpauses a set of cubs. /// @param cubs List of cubs to unpause function unpauseCubs(address[] calldata cubs) external; /// @notice Pauses all the cubs of the system. function globalPause() external; /// @notice Unpauses all the cubs of the system. /// @dev If a cub was specifically paused, this method won't unpause it function globalUnpause() external; /// @notice Sets the freeze timestamp. /// @param freezeTimeout The timeout to add to current timestamp before freeze happens function freeze(uint256 freezeTimeout) external; /// @notice Cancels the freezing procedure. function cancelFreeze() external; }
// SPDX-License-Identifier: MIT // SPDX-FileCopyrightText: 2023 Kiln <[email protected]> // // ██╗ ██╗██╗██╗ ███╗ ██╗ // ██║ ██╔╝██║██║ ████╗ ██║ // █████╔╝ ██║██║ ██╔██╗ ██║ // ██╔═██╗ ██║██║ ██║╚██╗██║ // ██║ ██╗██║███████╗██║ ╚████║ // ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ // pragma solidity >=0.8.17; /// @title Cub /// @author mortimr @ Kiln /// @dev Unstructured Storage Friendly /// @notice The cub is controlled by a Hatcher in charge of providing its status details and implementation address. interface ICub { /// @notice An error occured when performing the delegatecall to the fix. /// @param fixer Address implementing the fix /// @param err The return data from the call error error FixDelegateCallError(address fixer, bytes err); /// @notice The fix method failed by returning false. /// @param fixer Added implementing the fix error FixCallError(address fixer); /// @notice A call was made while the cub was paused. /// @param caller The address that performed the call error CalledWhenPaused(address caller); error CubAlreadyInitialized(); /// @notice Emitted when several fixes have been applied. /// @param fixes List of fixes to apply event AppliedFixes(address[] fixes); /// @notice Public method that emits the AppliedFixes event. /// @dev Transparent to all callers except the cub itself /// @dev Only callable by the cub itself as a regular call /// @dev This method is used to detect the execution context (view/non-view) /// @param _fixers List of applied fixes function appliedFixes(address[] memory _fixers) external; /// @notice Applies the provided fix. /// @dev Transparent to all callers except the hatcher /// @param _fixer The address of the contract implementing the fix to apply function applyFix(address _fixer) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @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. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol) pragma solidity ^0.8.0; /** * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to * be specified by overriding the virtual {_implementation} function. * * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a * different contract through the {_delegate} function. * * The success and return data of the delegated call will be returned back to the caller of the proxy. */ abstract contract Proxy { /** * @dev Delegates the current call to `implementation`. * * This function does not return to its 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 { _beforeFallback(); _delegate(_implementation()); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other * function in the contract matches the call data. */ fallback() external payable virtual { _fallback(); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data * is empty. */ receive() external payable virtual { _fallback(); } /** * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback` * call, or as part of the Solidity `fallback` or `receive` functions. * * If overridden should call `super._beforeFallback()`. */ function _beforeFallback() internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; import "../beacon/IBeacon.sol"; import "../../interfaces/draft-IERC1822.sol"; import "../../utils/Address.sol"; import "../../utils/StorageSlot.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967Upgrade { // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @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 { require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { Address.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ 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 { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {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 bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @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 { require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( Address.isContract(IBeacon(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822Proxiable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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://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.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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @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(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 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 } } }
{ "remappings": [ "deploy.sol/=lib/deploy.sol/src/", "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-gas-snapshot/=lib/forge-gas-snapshot/src/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/", "prb-math/=lib/utils.sol/lib/prb-math/contracts/", "solmate/=lib/deploy.sol/lib/solmate/src/", "utils.sol.test/=lib/utils.sol/test/", "utils.sol/=lib/utils.sol/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "vulcan/=lib/vulcan/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"CalledWhenPaused","type":"error"},{"inputs":[],"name":"CubAlreadyInitialized","type":"error"},{"inputs":[{"internalType":"address","name":"fixer","type":"address"}],"name":"FixCallError","type":"error"},{"inputs":[{"internalType":"address","name":"fixer","type":"address"},{"internalType":"bytes","name":"err","type":"bytes"}],"name":"FixDelegateCallError","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":false,"internalType":"address[]","name":"fixes","type":"address[]"}],"name":"AppliedFixes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"beacon","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"___initializeCub","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"fixers","type":"address[]"}],"name":"appliedFixes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fixer","type":"address"}],"name":"applyFix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Deployed Bytecode
0x6080604052600436106100385760003560e01c80630fc5bd3b1461004f5780638f3006241461006f578063f5194bcc1461008f57610047565b36610047576100456100af565b005b6100456100af565b34801561005b57600080fd5b5061004561006a3660046108ef565b6100d5565b34801561007b57600080fd5b5061004561008a366004610977565b610109565b34801561009b57600080fd5b506100456100aa366004610a16565b610152565b60006100b961018f565b905060006100c6826101bd565b90506100d1816102f3565b5050565b6100dd61018f565b6001600160a01b0316336001600160a01b031614610100576100fd6100af565b50565b6100fd8161031c565b333014610118576100fd6100af565b7f068f5763814dd924221a093a33c8516e9b05b882bb7e5fa1534d9e454db87402816040516101479190610abe565b60405180910390a150565b600061015c61018f565b6001600160a01b03161461018357604051633bfe06fb60e01b815260040160405180910390fd5b6100d182826000610405565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6000806000806101cc856104c5565b9250925092508080156101de57503315155b156102035760405163beab20b960e01b81523360048201526024015b60405180910390fd5b81156102ea5760008061021587610541565b6040516323cc018960e21b81529091503090638f3006249061023b908490600401610abe565b600060405180830381600087803b15801561025557600080fd5b505af1925050508015610266575060015b61026f57600191505b816102e75760005b81518110156102dd5760006001600160a01b031682828151811061029d5761029d610b0b565b60200260200101516001600160a01b0316146102d5576102d58282815181106102c8576102c8610b0b565b602002602001015161031c565b600101610277565b506102e7876105b6565b50505b50909392505050565b3660008037600080366000845af43d6000803e808015610312573d6000f35b3d6000fd5b505050565b60408051600481526024810182526020810180516001600160e01b03166352a8c3c760e11b179052905160009182916001600160a01b0385169161035f91610b45565b600060405180830381855af49150503d806000811461039a576040519150601f19603f3d011682016040523d82523d6000602084013e61039f565b606091505b5091509150816103c6578281604051636b45476360e01b81526004016101fa929190610b8d565b808060200190518101906103da9190610bc6565b9150816103175760405163f930393360e01b81526001600160a01b03841660048201526024016101fa565b61040e8361060c565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061044f5750805b15610317576104bf836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b99190610be1565b8361078b565b50505050565b60405163645b8b1b60e01b8152306004820152600090819081906001600160a01b0385169063645b8b1b90602401606060405180830381865afa158015610510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105349190610bfe565b9250925092509193909250565b604051630162910360e11b81523060048201526060906001600160a01b038316906302c5220690602401600060405180830381865afa158015610588573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105b09190810190610c43565b92915050565b806001600160a01b03166365413a4d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105f157600080fd5b505af1158015610605573d6000803e3d6000fd5b5050505050565b6001600160a01b0381163b6106715760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084016101fa565b6106e5816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d69190610be1565b6001600160a01b03163b151590565b61074a5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b60648201526084016101fa565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b60606107b08383604051806060016040528060278152602001610ce6602791396107b7565b9392505050565b6060600080856001600160a01b0316856040516107d49190610b45565b600060405180830381855af49150503d806000811461080f576040519150601f19603f3d011682016040523d82523d6000602084013e610814565b606091505b50915091506108258683838761082f565b9695505050505050565b6060831561089e578251600003610897576001600160a01b0385163b6108975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101fa565b50816108a8565b6108a883836108b0565b949350505050565b8151156108c05781518083602001fd5b8060405162461bcd60e51b81526004016101fa9190610cd2565b6001600160a01b03811681146100fd57600080fd5b60006020828403121561090157600080fd5b81356107b0816108da565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561094b5761094b61090c565b604052919050565b600067ffffffffffffffff82111561096d5761096d61090c565b5060051b60200190565b6000602080838503121561098a57600080fd5b823567ffffffffffffffff8111156109a157600080fd5b8301601f810185136109b257600080fd5b80356109c56109c082610953565b610922565b81815260059190911b820183019083810190878311156109e457600080fd5b928401925b82841015610a0b5783356109fc816108da565b825292840192908401906109e9565b979650505050505050565b60008060408385031215610a2957600080fd5b8235610a34816108da565b915060208381013567ffffffffffffffff80821115610a5257600080fd5b818601915086601f830112610a6657600080fd5b813581811115610a7857610a7861090c565b610a8a601f8201601f19168501610922565b91508082528784828501011115610aa057600080fd5b80848401858401376000848284010152508093505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015610aff5783516001600160a01b031683529284019291840191600101610ada565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60005b83811015610b3c578181015183820152602001610b24565b50506000910152565b60008251610b57818460208701610b21565b9190910192915050565b60008151808452610b79816020860160208601610b21565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190526000906108a890830184610b61565b80518015158114610bc157600080fd5b919050565b600060208284031215610bd857600080fd5b6107b082610bb1565b600060208284031215610bf357600080fd5b81516107b0816108da565b600080600060608486031215610c1357600080fd5b8351610c1e816108da565b9250610c2c60208501610bb1565b9150610c3a60408501610bb1565b90509250925092565b60006020808385031215610c5657600080fd5b825167ffffffffffffffff811115610c6d57600080fd5b8301601f81018513610c7e57600080fd5b8051610c8c6109c082610953565b81815260059190911b82018301908381019087831115610cab57600080fd5b928401925b82841015610a0b578351610cc3816108da565b82529284019290840190610cb0565b6020815260006107b06020830184610b6156fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202dfd1c538b20e58fb6e36306c60db90fc84bfe0acde5b4a2f0ad93bca1b0e36564736f6c63430008110033
Loading...
Loading
Loading...
Loading
Latest 25 from a total of 37253 withdrawals (5,575.874213807 ETH withdrawn)
Validator Index | Block | Amount | |
---|---|---|---|
1701787 | 21445846 | 2 days ago | 0.013661409 ETH |
1701786 | 21445846 | 2 days ago | 0.013636779 ETH |
1701785 | 21445846 | 2 days ago | 0.013649126 ETH |
1701784 | 21445846 | 2 days ago | 0.013660116 ETH |
1701783 | 21445846 | 2 days ago | 0.013705469 ETH |
1701782 | 21445846 | 2 days ago | 0.013640912 ETH |
1699209 | 21445711 | 2 days ago | 0.017715071 ETH |
1699208 | 21445710 | 2 days ago | 0.017731991 ETH |
1698472 | 21445665 | 2 days ago | 0.019235833 ETH |
1698471 | 21445665 | 2 days ago | 0.064938372 ETH |
1698470 | 21445665 | 2 days ago | 0.019193648 ETH |
1698469 | 21445664 | 2 days ago | 0.019215545 ETH |
1698468 | 21445664 | 2 days ago | 0.065171029 ETH |
1698467 | 21445664 | 2 days ago | 0.019197054 ETH |
1698466 | 21445664 | 2 days ago | 0.019213588 ETH |
1698465 | 21445664 | 2 days ago | 0.019134047 ETH |
1698464 | 21445664 | 2 days ago | 0.019250259 ETH |
1698463 | 21445664 | 2 days ago | 0.019114956 ETH |
1698462 | 21445664 | 2 days ago | 0.019218173 ETH |
1696869 | 21445566 | 2 days ago | 0.019291556 ETH |
1695418 | 21445475 | 2 days ago | 0.019252151 ETH |
1695417 | 21445475 | 2 days ago | 0.019216892 ETH |
1695416 | 21445475 | 2 days ago | 0.019221498 ETH |
1695415 | 21445475 | 2 days ago | 0.019234198 ETH |
1695414 | 21445475 | 2 days ago | 0.019167145 ETH |
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.