Latest 25 from a total of 2,510 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Settle | 42148736 | 56 mins ago | IN | 0 ETH | 0.00000153 | ||||
| Swap Settle | 42147645 | 1 hr ago | IN | 0 ETH | 0.00000168 | ||||
| Swap Settle | 42147170 | 1 hr ago | IN | 0 ETH | 0.00000104 | ||||
| Swap Settle | 42147086 | 1 hr ago | IN | 0 ETH | 0.00000111 | ||||
| Swap Settle | 42146612 | 2 hrs ago | IN | 0 ETH | 0.00000114 | ||||
| Swap Settle | 42142185 | 4 hrs ago | IN | 0 ETH | 0.00000312 | ||||
| Swap Settle | 42137311 | 7 hrs ago | IN | 0 ETH | 0.00000203 | ||||
| Swap Settle | 42114912 | 19 hrs ago | IN | 0 ETH | 0.00000085 | ||||
| Swap Settle | 42114817 | 19 hrs ago | IN | 0 ETH | 0.00000106 | ||||
| Swap Settle | 42107700 | 23 hrs ago | IN | 0 ETH | 0.00000296 | ||||
| Swap Settle | 42107665 | 23 hrs ago | IN | 0 ETH | 0.00000414 | ||||
| Swap Settle | 42105955 | 24 hrs ago | IN | 0 ETH | 0.00000727 | ||||
| Swap Settle | 42103788 | 25 hrs ago | IN | 0 ETH | 0.00000599 | ||||
| Swap Settle | 42103440 | 26 hrs ago | IN | 0 ETH | 0.00000642 | ||||
| Swap Settle | 42103344 | 26 hrs ago | IN | 0 ETH | 0.0000057 | ||||
| Swap Settle | 42098502 | 28 hrs ago | IN | 0 ETH | 0.00000245 | ||||
| Swap Settle | 42098395 | 28 hrs ago | IN | 0 ETH | 0.00000274 | ||||
| Swap Settle | 42093375 | 31 hrs ago | IN | 0 ETH | 0.00000117 | ||||
| Swap Settle | 42088900 | 34 hrs ago | IN | 0 ETH | 0.00000533 | ||||
| Swap Settle | 42069123 | 45 hrs ago | IN | 0 ETH | 0.00000243 | ||||
| Swap Settle | 42068261 | 45 hrs ago | IN | 0 ETH | 0.00000695 | ||||
| Swap Settle | 42067592 | 46 hrs ago | IN | 0 ETH | 0.00000142 | ||||
| Swap Settle | 42065715 | 47 hrs ago | IN | 0 ETH | 0.00000208 | ||||
| Swap Settle | 42064385 | 47 hrs ago | IN | 0 ETH | 0.00001039 | ||||
| Swap Settle | 42064114 | 47 hrs ago | IN | 0 ETH | 0.00000783 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 42146612 | 2 hrs ago | 0.00001053 ETH | ||||
| 42146612 | 2 hrs ago | 0.00001057 ETH | ||||
| 42107700 | 23 hrs ago | 0.00057082 ETH | ||||
| 42107700 | 23 hrs ago | 0.00057298 ETH | ||||
| 42049988 | 2 days ago | 0.00505636 ETH | ||||
| 42049988 | 2 days ago | 0.00506512 ETH | ||||
| 42026636 | 2 days ago | 0.02637349 ETH | ||||
| 42026636 | 2 days ago | 0.02641311 ETH | ||||
| 42024626 | 2 days ago | 0.00686097 ETH | ||||
| 42024626 | 2 days ago | 0.00687257 ETH | ||||
| 42020480 | 3 days ago | 0.0736501 ETH | ||||
| 42020480 | 3 days ago | 0.07379996 ETH | ||||
| 42015184 | 3 days ago | 0.001 ETH | ||||
| 42000474 | 3 days ago | 0.00156403 ETH | ||||
| 41999940 | 3 days ago | 0.63924623 ETH | ||||
| 41999940 | 3 days ago | 0.64020654 ETH | ||||
| 41999845 | 3 days ago | 0.25256417 ETH | ||||
| 41999845 | 3 days ago | 0.25294359 ETH | ||||
| 41976819 | 4 days ago | 0.14931565 ETH | ||||
| 41976819 | 4 days ago | 0.14965545 ETH | ||||
| 41975162 | 4 days ago | 0.00098086 ETH | ||||
| 41975162 | 4 days ago | 0.00098204 ETH | ||||
| 41975132 | 4 days ago | 0.00087367 ETH | ||||
| 41975132 | 4 days ago | 0.00087479 ETH | ||||
| 41975115 | 4 days ago | 0.00119116 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Adapter
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
// Contracts
import { EIP712 } from "@modules/util/EIP712.sol";
// Interfaces
import { IRegistry } from "@interfaces/portikus/IRegistry.sol";
import { IAdapter } from "@adapter/interfaces/IAdapter.sol";
import { IERC173 } from "@adapter/interfaces/IERC173.sol";
// Libraries
import { ModuleManagerLib } from "@modules/libraries/ModuleManagerLib.sol";
//
// ____ ____ ____ ____________ ____ _______ ___ ____ ___ ____ ________________
// / __ \/ __ \/ __ \/_ __/ _/ //_/ / / / ___/ / | / __ \/ | / __ \/_ __/ ____/ __ \
// / /_/ / / / / /_/ / / / / // ,< / / / /\__ \ / /| | / / / / /| | / /_/ / / / / __/ / /_/ /
// / ____/ /_/ / _, _/ / / _/ // /| / /_/ /___/ / / ___ |/ /_/ / ___ |/ ____/ / / / /___/ _, _/
// /_/ \____/_/ |_| /_/ /___/_/ |_\____//____/ /_/ |_/_____/_/ |_/_/ /_/ /_____/_/ |_|
//
//
/// @title Adapter
/// @notice The base PortikusV2 adapter contract containing core functionality for managing modules,
/// executing module functions and implementing the EIP712 standard for typed structured data hashing
/// @author Laita Labs
contract Adapter is IAdapter, EIP712 {
/*//////////////////////////////////////////////////////////////
LIBRARIES
//////////////////////////////////////////////////////////////*/
using ModuleManagerLib for address;
/*//////////////////////////////////////////////////////////////
CONSTANTS
//////////////////////////////////////////////////////////////*/
/// @notice The address of the PortikusV2 contract
address internal immutable PORTIKUS_V2;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
/// @param _owner The owner of the adapter, an owner has the ability to install
/// and uninstall modules to the adapter contract
constructor(address _owner) {
/// The PortikusV2 address is the factory contract that deploys this adapter
PORTIKUS_V2 = msg.sender;
/// Set the owner of the adapter
_owner.setOwner();
}
/*//////////////////////////////////////////////////////////////
MODIFIERS
//////////////////////////////////////////////////////////////*/
/// @notice Verifies that the caller is the owner of the adapter,
/// reverts if the caller is not the owner with UnauthorizedAccount(msg.sender)
modifier onlyOwner() {
ModuleManagerLib.isOwner();
_;
}
/*//////////////////////////////////////////////////////////////
OWNERSHIP
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IERC173
function owner() external view override returns (address) {
return ModuleManagerLib.owner();
}
/// @inheritdoc IERC173
function transferOwnership(address _newOwner) external override onlyOwner {
// Transfer ownership of the adapter
_newOwner.setOwner();
}
/*//////////////////////////////////////////////////////////////
INSTALL MODULES
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IAdapter
function install(address module) external onlyOwner {
// Make sure the module is registered in the Portikus V2 registry
if (!IRegistry(PORTIKUS_V2).isModuleRegistered(address(module))) {
revert ModuleNotRegistered();
}
// Add the module and all of its function selectors to the adapter
module.install();
}
/*//////////////////////////////////////////////////////////////
UNINSTALL MODULES
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IAdapter
function uninstall(address module) external onlyOwner {
// Remove the module and all of its function selectors from the adapter
module.uninstall();
}
/*//////////////////////////////////////////////////////////////
GET INSTALLED MODULES
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IAdapter
function getModules() external view returns (Module[] memory) {
return ModuleManagerLib.getModules();
}
/*//////////////////////////////////////////////////////////////
FALLBACK
//////////////////////////////////////////////////////////////*/
/// @notice Loads a module for the given function selector:
/// 1. Load the module address from the ModuleManagerLib storage
/// 2. If the module address is not set, revert
/// 3. If the module is not registered, revert
/// 4. If the module address is set and registered, delegatecall the module address with the given calldata
fallback() external payable {
ModuleManagerLib.ModuleStorage storage ms = ModuleManagerLib.modulesStorage();
// Get the module address from the selector
address module = ms.selectorToModule[msg.sig].moduleAddress;
address portikus = PORTIKUS_V2; // inline assembly cannot access immutable constants
assembly {
// If the module address is not set, revert
if iszero(module) {
mstore(0, 0x7252c08c) // error ModuleNotFound()
revert(0x1c, 0x04)
}
// Load free memory pointer
let x := mload(0x40)
// Copy signature
mstore(x, 0x1c5ebe2f) // `isModuleRegistered(address)`
// Copy module address
mstore(add(x, 0x20), module)
// Read the registry, reverting upon module being not registered
if iszero(
and( // The arguments of `and` are evaluated from right to left
eq(mload(x), 0x01), // Returned `true`
staticcall(gas(), portikus, add(x, 0x1c), 0x24, x, 0x20)
)
) {
mstore(0x00, 0x9c4aee9e) // `ModuleNotRegistered()`
revert(0x1c, 0x04)
}
// Copy calldata to free memory
calldatacopy(x, 0x00, calldatasize())
// Delegatecall to the module address with the given calldata
let result := delegatecall(gas(), module, x, calldatasize(), 0x00, 0x00)
// Get the size of the returned data
let size := returndatasize()
// Copy the returned data to free memory
returndatacopy(x, 0x00, size)
// If the delegatecall was not successful, revert with the returned data
if iszero(result) { revert(x, size) }
// Return the returned data
return(x, size)
}
}
/// @notice Allows the adapter to receive ether
receive() external payable { }
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
// Dependencies
import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
// Interfaces
import { IEIP712 } from "@interfaces/util/IEIP712.sol";
/// @title EIP712
/// @notice Implements EIP712 domain separator and hashing functionality
/// @dev This contract is a modified version of the OpenZeppelin EIP712 contract
/// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/EIP712.sol
contract EIP712 is IEIP712 {
/*//////////////////////////////////////////////////////////////
CONSTANTS
//////////////////////////////////////////////////////////////*/
// The raw EIP712 domain separator type string
bytes private constant TYPE_HASH_RAW =
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)";
// Raw name
string private constant NAME_RAW = "Portikus";
// Raw version
string private constant VERSION_RAW = "2.0.0";
/*//////////////////////////////////////////////////////////////
IMMUTABLE
//////////////////////////////////////////////////////////////*/
// Hash of the EIP712 Domain Separator data
bytes32 private immutable HASHED_NAME;
bytes32 private immutable HASHED_VERSION;
bytes32 private immutable TYPE_HASH;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
/// @notice Initializes the EIP712 domain separator fields
constructor() {
HASHED_NAME = keccak256(bytes(NAME_RAW));
HASHED_VERSION = keccak256(bytes(VERSION_RAW));
TYPE_HASH = keccak256(abi.encodePacked(TYPE_HASH_RAW));
}
/*//////////////////////////////////////////////////////////////
INTERNAL
//////////////////////////////////////////////////////////////*/
/// @notice Returns the domain separator for the current chain
function _domainSeparatorV4() internal view returns (bytes32) {
// Uses address(this) as the verifyingContract is the adapter that installed a module
return keccak256(abi.encode(TYPE_HASH, HASHED_NAME, HASHED_VERSION, block.chainid, address(this)));
}
/// @notice Hashes the EIP712 Domain Separator and the struct hash
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);
}
/*//////////////////////////////////////////////////////////////
EXTERNAL
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IEIP712
function DOMAIN_SEPARATOR() external view override returns (bytes32) {
return _domainSeparatorV4();
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
/// @notice Interface for the Portikus V2 registry
interface IRegistry {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
/// @notice Emitted when a new agent is registered
event AgentRegistered(address agent);
/// @notice Emitted when a new module is registered
event ModuleRegistered(address module);
/// @notice Emitted when an agent is unregistered
event AgentUnregistered(address agent);
/// @notice Emitted when a module is unregistered
event ModuleUnregistered(address module);
/*//////////////////////////////////////////////////////////////
REGISTER
//////////////////////////////////////////////////////////////*/
/// @notice Register new agents
/// @param _agents The list of agents to register
function registerAgent(address[] calldata _agents) external;
/// @notice Register new modules
/// @param _modules The list of modules to register
function registerModule(address[] calldata _modules) external;
/*//////////////////////////////////////////////////////////////
UNREGISTER
//////////////////////////////////////////////////////////////*/
/// @notice Unregister agents
/// @param _agents The list of agents to unregister
function unregisterAgent(address[] calldata _agents) external;
/// @notice Unregister modules
/// @param _modules The list of modules to unregister
function unregisterModule(address[] calldata _modules) external;
/*//////////////////////////////////////////////////////////////
GETTERS
//////////////////////////////////////////////////////////////*/
/// @notice Get the list of registered agents
function getAgents() external returns (address[] memory);
/// @notice Get the list of registered modules
function getModules() external returns (address[] memory);
/// @notice Check if an agent is registered
function isAgentRegistered(address agent) external returns (bool);
/// @notice Check if a module is registered
function isModuleRegistered(address module) external returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
// Interfaces
import { IErrors } from "./IErrors.sol";
import { IERC173 } from "./IERC173.sol";
/// @notice Interface for Portikus V2 adapters
interface IAdapter is IErrors, IERC173 {
/*//////////////////////////////////////////////////////////////
STRUCTS
//////////////////////////////////////////////////////////////*/
/// @notice The module struct contains the address of the module and its selectors
struct Module {
address module;
bytes4[] selectors;
}
/*//////////////////////////////////////////////////////////////
INSTALL
//////////////////////////////////////////////////////////////*/
/// @notice Add a new module to the adapter, the module must be registered in the Portikus registry
/// @param module The address of the module to install
function install(address module) external;
/*//////////////////////////////////////////////////////////////
UNINSTALL
//////////////////////////////////////////////////////////////*/
/// @notice Remove a previously installed module from the adapter
/// @param module The address of the module to uninstall
function uninstall(address module) external;
/*//////////////////////////////////////////////////////////////
GETTERS
//////////////////////////////////////////////////////////////*/
/// @notice Gets all installed modules and their selectors
/// @return modules The installed modules and their selectors
function getModules() external view returns (Module[] memory modules);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;
/// @title ERC-173 Contract Ownership Standard
interface IERC173 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
/// @dev This emits when ownership of a contract changes.
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/*//////////////////////////////////////////////////////////////
GETTERS
//////////////////////////////////////////////////////////////*/
/// @notice Get the address of the current contract owner
/// @return owner_ The address of the owner.
function owner() external view returns (address owner_);
/*//////////////////////////////////////////////////////////////
SETTERS
//////////////////////////////////////////////////////////////*/
/// @notice Set the address of the new owner of the contract
/// @dev Set _newOwner to address(0) to renounce any ownership.
/// @param _newOwner The address of the new owner of the contract
function transferOwnership(address _newOwner) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
// Interfaces
import { IModule } from "@modules/interfaces/IModule.sol";
import { IAdapter } from "@adapter/interfaces/IAdapter.sol";
/// @title Module Manager Library
/// @notice A library for managing modules in an adapter contract, heavily inspired by the Diamond Proxy (ERC-2535)
/// @author Laita Labs
library ModuleManagerLib {
/*//////////////////////////////////////////////////////////////
ERRORS
//////////////////////////////////////////////////////////////*/
/// @notice Emitted when a selector from a module is already set
error SelectorAlreadySet(bytes4 selector, address oldModule);
/// @notice Emitted when trying to uninstall a module that is not installed
error ModuleNotInstalled(address module);
/// @notice Emitted when caller is not the owner
error UnauthorizedAccount(address account);
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
/// @notice Emitted when a module is installed
event ModuleInstalled(address indexed module);
/// @notice Emitted when a module is uninstalled
event ModuleUninstalled(address indexed module);
/// @notice Emitted when the adapter ownership is transferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/*//////////////////////////////////////////////////////////////
STORAGE
//////////////////////////////////////////////////////////////*/
/// @notice keccak256(abi.encode(uint256(keccak256("ModuleManagerLib.modules")) - 1)) & ~bytes32(uint256(0xff));
bytes32 internal constant MODULES_SLOT = 0xcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b57200;
/// @dev A struct to store a module's address data
/// @param moduleAddress The address of the module
/// @param functionSelectorPosition The position of the module's function selectors in the
/// ModuleToSelectors.selectors array
struct ModuleToFacet {
address moduleAddress;
uint32 functionSelectorPosition;
}
/// @dev A struct to store a module's function selectors data
/// @param selectors The function selectors of the module
/// @param moduleAddressPosition The position of the module in the ModuleStorage.modules array
struct ModuleToSelectors {
bytes4[] selectors;
uint32 moduleAddressPosition;
}
/// @custom:storage-location erc7201:ModuleManagerLib.modules
/// @notice The structure that defines the storage layout containing all module data, storage collisions are avoided
/// following the ERC-7201 standard
/// @param moduleToSelectors A mapping of module addresses to their function selectors
/// @param selectorToModule A mapping of function selectors to their module addresses
/// @param modules An array of all module addresses
/// @param owner The adapter owner
struct ModuleStorage {
mapping(address => ModuleToSelectors) moduleToSelectors;
mapping(bytes4 => ModuleToFacet) selectorToModule;
address[] modules;
address owner;
}
/// @notice Get the storage slot for the ModuleStorage struct
/// @return ms The ModuleStorage struct storage pointer
function modulesStorage() internal pure returns (ModuleStorage storage ms) {
bytes32 storagePointer = MODULES_SLOT;
assembly {
ms.slot := storagePointer
}
}
/*//////////////////////////////////////////////////////////////
INSTALL
//////////////////////////////////////////////////////////////*/
/// @notice Install a module in the adapter, adding all of its function selectors
/// @param module The address of the module to install
function install(address module) internal {
// Get adapter module storage
ModuleStorage storage ms = modulesStorage();
// Get module function selectors
bytes4[] memory selectors = IModule(module).selectors();
// Add module to modules
ms.modules.push(module);
// Set selectors in moduleToSelectors
ms.moduleToSelectors[module].selectors = selectors;
// Set module address position in moduleToSelectors
ms.moduleToSelectors[module].moduleAddressPosition = uint32(ms.modules.length - 1);
// Set module in selectorToModule
for (uint32 i = 0; i < selectors.length; i++) {
address oldModule = ms.selectorToModule[selectors[i]].moduleAddress;
// If a selector is already set, revert as it would cause a conflict
if (oldModule != address(0)) {
// If a selector is already set the owner should uninstall the old module first
revert SelectorAlreadySet(selectors[i], oldModule);
}
ms.selectorToModule[selectors[i]].functionSelectorPosition = i;
ms.selectorToModule[selectors[i]].moduleAddress = module;
}
// emit the module installed event
emit ModuleInstalled(module);
}
/*//////////////////////////////////////////////////////////////
UNINSTALL
//////////////////////////////////////////////////////////////*/
/// @notice Remove a module from the adapter, removing all of its function selectors
/// @param module The address of the module to uninstall
function uninstall(address module) internal {
// Get adapter module storage
ModuleStorage storage ms = modulesStorage();
// Get module function selectors
bytes4[] memory selectors = ms.moduleToSelectors[module].selectors;
// Check if the module is actually installed
if (selectors.length == 0) {
revert ModuleNotInstalled(module);
}
// Get the module position in modules
uint32 modulePosition = ms.moduleToSelectors[module].moduleAddressPosition;
// Get the last module position in modules
uint32 lastModulePosition = uint32(ms.modules.length - 1);
// If the module is not the last module, swap the module with the last module
if (modulePosition != lastModulePosition) {
address lastModule = ms.modules[lastModulePosition];
ms.modules[modulePosition] = lastModule;
ms.moduleToSelectors[lastModule].moduleAddressPosition = modulePosition;
}
// Remove the last module
ms.modules.pop();
// Remove module from moduleToSelectors
delete ms.moduleToSelectors[module];
// Remove module from selectorToModule
for (uint256 i = 0; i < selectors.length; i++) {
delete ms.selectorToModule[selectors[i]];
}
// emit the module uninstalled event
emit ModuleUninstalled(module);
}
/*//////////////////////////////////////////////////////////////
GETTERS
//////////////////////////////////////////////////////////////*/
/// @notice Get all installed modules and their selectors
/// @return modules The installed modules and their selectors
function getModules() external view returns (IAdapter.Module[] memory modules) {
// Get adapter module storage
ModuleStorage storage ms = modulesStorage();
uint256 length = ms.modules.length;
modules = new IAdapter.Module[](length);
for (uint256 i = 0; i < length; i++) {
address module = ms.modules[i];
bytes4[] memory selectors = ms.moduleToSelectors[module].selectors;
modules[i] = IAdapter.Module(module, selectors);
}
}
/*//////////////////////////////////////////////////////////////
OWNER
//////////////////////////////////////////////////////////////*/
/// @notice Get the owner of the adapter
/// @return owner The owner of the adapter
function owner() internal view returns (address) {
// Get adapter module storage
ModuleStorage storage ms = modulesStorage();
return ms.owner;
}
/// @notice Set the owner of the adapter
/// @param _owner The new owner of the adapter
function setOwner(address _owner) internal {
// Get adapter module storage
ModuleStorage storage ms = modulesStorage();
// Cache the old owner
address oldOwner = ms.owner;
// Set the new owner
ms.owner = _owner;
// Emit the OwnershipTransferred event
emit OwnershipTransferred(oldOwner, _owner);
}
/// @notice Check if the caller is the owner of the adapter, revert if not
function isOwner() internal view {
// Get adapter module storage
ModuleStorage storage ms = modulesStorage();
if (msg.sender != ms.owner) {
revert UnauthorizedAccount(msg.sender);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MessageHashUtils.sol)
pragma solidity ^0.8.20;
import {Strings} from "../Strings.sol";
/**
* @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.
*
* The library provides methods for generating a hash of a message that conforms to the
* https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]
* specifications.
*/
library MessageHashUtils {
/**
* @dev Returns the keccak256 digest of an ERC-191 signed data with version
* `0x45` (`personal_sign` messages).
*
* The digest is calculated by prefixing a bytes32 `messageHash` with
* `"\x19Ethereum Signed Message:\n32"` and hashing the result. It corresponds with the
* hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
*
* NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with
* keccak256, although any bytes32 value can be safely used because the final digest will
* be re-hashed.
*
* See {ECDSA-recover}.
*/
function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, "\x19Ethereum Signed Message:\n32") // 32 is the bytes-length of messageHash
mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix
digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)
}
}
/**
* @dev Returns the keccak256 digest of an ERC-191 signed data with version
* `0x45` (`personal_sign` messages).
*
* The digest is calculated by prefixing an arbitrary `message` with
* `"\x19Ethereum Signed Message:\n" + len(message)` and hashing the result. It corresponds with the
* hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
*
* See {ECDSA-recover}.
*/
function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {
return
keccak256(bytes.concat("\x19Ethereum Signed Message:\n", bytes(Strings.toString(message.length)), message));
}
/**
* @dev Returns the keccak256 digest of an ERC-191 signed data with version
* `0x00` (data with intended validator).
*
* The digest is calculated by prefixing an arbitrary `data` with `"\x19\x00"` and the intended
* `validator` address. Then hashing the result.
*
* See {ECDSA-recover}.
*/
function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(hex"19_00", validator, data));
}
/**
* @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).
*
* The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with
* `\x19\x01` and hashing the result. It corresponds to the hash signed by the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.
*
* See {ECDSA-recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {
/// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
mstore(ptr, hex"19_01")
mstore(add(ptr, 0x02), domainSeparator)
mstore(add(ptr, 0x22), structHash)
digest := keccak256(ptr, 0x42)
}
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
/// @title IEIP712
/// @notice Interface for the fetching the EIP-712 domain separator
interface IEIP712 {
/*//////////////////////////////////////////////////////////////
EXTERNAL
//////////////////////////////////////////////////////////////*/
/// @notice Returns the domain separator for the EIP-712 signature
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
/// @notice Interface for errors emitted by Portikus adapters
interface IErrors {
/*//////////////////////////////////////////////////////////////
ERRORS
//////////////////////////////////////////////////////////////*/
/// @notice Emitted when a module is not found for the provided selector
error ModuleNotFound();
/// @notice Emitted when trying to install a module that is not registered in the Portikus registry
error ModuleNotRegistered();
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
/// @title IModule
/// @notice Core interfaces that all modules must implement to be compatible with the Portikus protocol
interface IModule {
/*//////////////////////////////////////////////////////////////
METADATA
//////////////////////////////////////////////////////////////*/
/// @notice Returns the name of the module
function name() external view returns (string memory);
/// @notice Returns the version of the module
function version() external view returns (string memory);
/*//////////////////////////////////////////////////////////////
SELECTORS
//////////////////////////////////////////////////////////////*/
/// @notice Used by the executor to determine which functions should be installed
/// @dev The implementation should not include any of the function selectors defined in the IModule interface itself
/// @return moduleSelectors An array of function selectors that the module implements
function selectors() external pure returns (bytes4[] memory moduleSelectors);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)
pragma solidity ^0.8.20;
import {Math} from "./math/Math.sol";
import {SignedMath} from "./math/SignedMath.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
uint8 private constant ADDRESS_LENGTH = 20;
/**
* @dev The `value` string doesn't fit in the specified `length`.
*/
error StringsInsufficientHexLength(uint256 value, uint256 length);
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toStringSigned(int256 value) internal pure returns (string memory) {
return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
uint256 localValue = value;
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = HEX_DIGITS[localValue & 0xf];
localValue >>= 4;
}
if (localValue != 0) {
revert StringsInsufficientHexLength(value, length);
}
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
* representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal
* representation, according to EIP-55.
*/
function toChecksumHexString(address addr) internal pure returns (string memory) {
bytes memory buffer = bytes(toHexString(addr));
// hash the hex part of buffer (skip length + 2 bytes, length 40)
uint256 hashValue;
assembly ("memory-safe") {
hashValue := shr(96, keccak256(add(buffer, 0x22), 40))
}
for (uint256 i = 41; i > 1; --i) {
// possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)
if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {
// case shift by xoring with 0x20
buffer[i] ^= 0x20;
}
hashValue >>= 4;
}
return string(buffer);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)
pragma solidity ^0.8.20;
import {Panic} from "../Panic.sol";
import {SafeCast} from "./SafeCast.sol";
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Floor, // Toward negative infinity
Ceil, // Toward positive infinity
Trunc, // Toward zero
Expand // Away from zero
}
/**
* @dev Returns the addition of two unsigned integers, with an success flag (no overflow).
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an success flag (no overflow).
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an success flag (no overflow).
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a success flag (no division by zero).
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.
*
* IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.
* However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute
* one branch when needed, making this function more expensive.
*/
function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {
unchecked {
// branchless ternary works because:
// b ^ (a ^ b) == a
// b ^ 0 == b
return b ^ ((a ^ b) * SafeCast.toUint(condition));
}
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return ternary(a > b, a, b);
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return ternary(a < b, a, b);
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds towards infinity instead
* of rounding towards zero.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
// Guarantee the same behavior as in a regular Solidity division.
Panic.panic(Panic.DIVISION_BY_ZERO);
}
// The following calculation ensures accurate ceiling division without overflow.
// Since a is non-zero, (a - 1) / b will not overflow.
// The largest possible result occurs when (a - 1) / b is type(uint256).max,
// but the largest value we can obtain is type(uint256).max - 1, which happens
// when a = type(uint256).max and b = 1.
unchecked {
return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);
}
}
/**
* @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
* denominator == 0.
*
* Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
* Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2²⁵⁶ + prod0.
uint256 prod0 = x * y; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.
if (denominator <= prod1) {
Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));
}
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator.
// Always >= 1. See https://cs.stackexchange.com/q/138556/92363.
uint256 twos = denominator & (0 - denominator);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such
// that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv ≡ 1 mod 2⁴.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
// works in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2⁸
inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶
inverse *= 2 - denominator * inverse; // inverse mod 2³²
inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴
inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸
inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is
// less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @dev Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);
}
/**
* @dev Calculate the modular multiplicative inverse of a number in Z/nZ.
*
* If n is a prime, then Z/nZ is a field. In that case all elements are inversible, expect 0.
* If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.
*
* If the input value is not inversible, 0 is returned.
*
* NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the
* inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.
*/
function invMod(uint256 a, uint256 n) internal pure returns (uint256) {
unchecked {
if (n == 0) return 0;
// The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)
// Used to compute integers x and y such that: ax + ny = gcd(a, n).
// When the gcd is 1, then the inverse of a modulo n exists and it's x.
// ax + ny = 1
// ax = 1 + (-y)n
// ax ≡ 1 (mod n) # x is the inverse of a modulo n
// If the remainder is 0 the gcd is n right away.
uint256 remainder = a % n;
uint256 gcd = n;
// Therefore the initial coefficients are:
// ax + ny = gcd(a, n) = n
// 0a + 1n = n
int256 x = 0;
int256 y = 1;
while (remainder != 0) {
uint256 quotient = gcd / remainder;
(gcd, remainder) = (
// The old remainder is the next gcd to try.
remainder,
// Compute the next remainder.
// Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd
// where gcd is at most n (capped to type(uint256).max)
gcd - remainder * quotient
);
(x, y) = (
// Increment the coefficient of a.
y,
// Decrement the coefficient of n.
// Can overflow, but the result is casted to uint256 so that the
// next value of y is "wrapped around" to a value between 0 and n - 1.
x - y * int256(quotient)
);
}
if (gcd != 1) return 0; // No inverse exists.
return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.
}
}
/**
* @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.
*
* From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is
* prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that
* `a**(p-2)` is the modular multiplicative inverse of a in Fp.
*
* NOTE: this function does NOT check that `p` is a prime greater than `2`.
*/
function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {
unchecked {
return Math.modExp(a, p - 2, p);
}
}
/**
* @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)
*
* Requirements:
* - modulus can't be zero
* - underlying staticcall to precompile must succeed
*
* IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make
* sure the chain you're using it on supports the precompiled contract for modular exponentiation
* at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,
* the underlying function will succeed given the lack of a revert, but the result may be incorrectly
* interpreted as 0.
*/
function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {
(bool success, uint256 result) = tryModExp(b, e, m);
if (!success) {
Panic.panic(Panic.DIVISION_BY_ZERO);
}
return result;
}
/**
* @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).
* It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying
* to operate modulo 0 or if the underlying precompile reverted.
*
* IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain
* you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in
* https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack
* of a revert, but the result may be incorrectly interpreted as 0.
*/
function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {
if (m == 0) return (false, 0);
/// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
// | Offset | Content | Content (Hex) |
// |-----------|------------|--------------------------------------------------------------------|
// | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |
// | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |
// | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |
// | 0x60:0x7f | value of b | 0x<.............................................................b> |
// | 0x80:0x9f | value of e | 0x<.............................................................e> |
// | 0xa0:0xbf | value of m | 0x<.............................................................m> |
mstore(ptr, 0x20)
mstore(add(ptr, 0x20), 0x20)
mstore(add(ptr, 0x40), 0x20)
mstore(add(ptr, 0x60), b)
mstore(add(ptr, 0x80), e)
mstore(add(ptr, 0xa0), m)
// Given the result < m, it's guaranteed to fit in 32 bytes,
// so we can use the memory scratch space located at offset 0.
success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)
result := mload(0x00)
}
}
/**
* @dev Variant of {modExp} that supports inputs of arbitrary length.
*/
function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {
(bool success, bytes memory result) = tryModExp(b, e, m);
if (!success) {
Panic.panic(Panic.DIVISION_BY_ZERO);
}
return result;
}
/**
* @dev Variant of {tryModExp} that supports inputs of arbitrary length.
*/
function tryModExp(
bytes memory b,
bytes memory e,
bytes memory m
) internal view returns (bool success, bytes memory result) {
if (_zeroBytes(m)) return (false, new bytes(0));
uint256 mLen = m.length;
// Encode call args in result and move the free memory pointer
result = abi.encodePacked(b.length, e.length, mLen, b, e, m);
/// @solidity memory-safe-assembly
assembly {
let dataPtr := add(result, 0x20)
// Write result on top of args to avoid allocating extra memory.
success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)
// Overwrite the length.
// result.length > returndatasize() is guaranteed because returndatasize() == m.length
mstore(result, mLen)
// Set the memory pointer after the returned data.
mstore(0x40, add(dataPtr, mLen))
}
}
/**
* @dev Returns whether the provided byte array is zero.
*/
function _zeroBytes(bytes memory byteArray) private pure returns (bool) {
for (uint256 i = 0; i < byteArray.length; ++i) {
if (byteArray[i] != 0) {
return false;
}
}
return true;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
* towards zero.
*
* This method is based on Newton's method for computing square roots; the algorithm is restricted to only
* using integer operations.
*/
function sqrt(uint256 a) internal pure returns (uint256) {
unchecked {
// Take care of easy edge cases when a == 0 or a == 1
if (a <= 1) {
return a;
}
// In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a
// sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between
// the current value as `ε_n = | x_n - sqrt(a) |`.
//
// For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root
// of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is
// bigger than any uint256.
//
// By noticing that
// `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`
// we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar
// to the msb function.
uint256 aa = a;
uint256 xn = 1;
if (aa >= (1 << 128)) {
aa >>= 128;
xn <<= 64;
}
if (aa >= (1 << 64)) {
aa >>= 64;
xn <<= 32;
}
if (aa >= (1 << 32)) {
aa >>= 32;
xn <<= 16;
}
if (aa >= (1 << 16)) {
aa >>= 16;
xn <<= 8;
}
if (aa >= (1 << 8)) {
aa >>= 8;
xn <<= 4;
}
if (aa >= (1 << 4)) {
aa >>= 4;
xn <<= 2;
}
if (aa >= (1 << 2)) {
xn <<= 1;
}
// We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).
//
// We can refine our estimation by noticing that the middle of that interval minimizes the error.
// If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).
// This is going to be our x_0 (and ε_0)
xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)
// From here, Newton's method give us:
// x_{n+1} = (x_n + a / x_n) / 2
//
// One should note that:
// x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a
// = ((x_n² + a) / (2 * x_n))² - a
// = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a
// = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)
// = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)
// = (x_n² - a)² / (2 * x_n)²
// = ((x_n² - a) / (2 * x_n))²
// ≥ 0
// Which proves that for all n ≥ 1, sqrt(a) ≤ x_n
//
// This gives us the proof of quadratic convergence of the sequence:
// ε_{n+1} = | x_{n+1} - sqrt(a) |
// = | (x_n + a / x_n) / 2 - sqrt(a) |
// = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |
// = | (x_n - sqrt(a))² / (2 * x_n) |
// = | ε_n² / (2 * x_n) |
// = ε_n² / | (2 * x_n) |
//
// For the first iteration, we have a special case where x_0 is known:
// ε_1 = ε_0² / | (2 * x_0) |
// ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))
// ≤ 2**(2*e-4) / (3 * 2**(e-1))
// ≤ 2**(e-3) / 3
// ≤ 2**(e-3-log2(3))
// ≤ 2**(e-4.5)
//
// For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:
// ε_{n+1} = ε_n² / | (2 * x_n) |
// ≤ (2**(e-k))² / (2 * 2**(e-1))
// ≤ 2**(2*e-2*k) / 2**e
// ≤ 2**(e-2*k)
xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above
xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5
xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9
xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18
xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36
xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72
// Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision
// ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either
// sqrt(a) or sqrt(a) + 1.
return xn - SafeCast.toUint(xn > a / xn);
}
}
/**
* @dev Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);
}
}
/**
* @dev Return the log in base 2 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
uint256 exp;
unchecked {
exp = 128 * SafeCast.toUint(value > (1 << 128) - 1);
value >>= exp;
result += exp;
exp = 64 * SafeCast.toUint(value > (1 << 64) - 1);
value >>= exp;
result += exp;
exp = 32 * SafeCast.toUint(value > (1 << 32) - 1);
value >>= exp;
result += exp;
exp = 16 * SafeCast.toUint(value > (1 << 16) - 1);
value >>= exp;
result += exp;
exp = 8 * SafeCast.toUint(value > (1 << 8) - 1);
value >>= exp;
result += exp;
exp = 4 * SafeCast.toUint(value > (1 << 4) - 1);
value >>= exp;
result += exp;
exp = 2 * SafeCast.toUint(value > (1 << 2) - 1);
value >>= exp;
result += exp;
result += SafeCast.toUint(value > 1);
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);
}
}
/**
* @dev Return the log in base 10 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);
}
}
/**
* @dev Return the log in base 256 of a positive value rounded towards zero.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
uint256 isGt;
unchecked {
isGt = SafeCast.toUint(value > (1 << 128) - 1);
value >>= isGt * 128;
result += isGt * 16;
isGt = SafeCast.toUint(value > (1 << 64) - 1);
value >>= isGt * 64;
result += isGt * 8;
isGt = SafeCast.toUint(value > (1 << 32) - 1);
value >>= isGt * 32;
result += isGt * 4;
isGt = SafeCast.toUint(value > (1 << 16) - 1);
value >>= isGt * 16;
result += isGt * 2;
result += SafeCast.toUint(value > (1 << 8) - 1);
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);
}
}
/**
* @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
*/
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.20;
import {SafeCast} from "./SafeCast.sol";
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.
*
* IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.
* However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute
* one branch when needed, making this function more expensive.
*/
function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {
unchecked {
// branchless ternary works because:
// b ^ (a ^ b) == a
// b ^ 0 == b
return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));
}
}
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return ternary(a > b, a, b);
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return ternary(a < b, a, b);
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// Formula from the "Bit Twiddling Hacks" by Sean Eron Anderson.
// Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,
// taking advantage of the most significant (or "sign" bit) in two's complement representation.
// This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,
// the mask will either be `bytes(0)` (if n is positive) or `~bytes32(0)` (if n is negative).
int256 mask = n >> 255;
// A `bytes(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.
return uint256((n + mask) ^ mask);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @dev Helper library for emitting standardized panic codes.
*
* ```solidity
* contract Example {
* using Panic for uint256;
*
* // Use any of the declared internal constants
* function foo() { Panic.GENERIC.panic(); }
*
* // Alternatively
* function foo() { Panic.panic(Panic.GENERIC); }
* }
* ```
*
* Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].
*/
// slither-disable-next-line unused-state
library Panic {
/// @dev generic / unspecified error
uint256 internal constant GENERIC = 0x00;
/// @dev used by the assert() builtin
uint256 internal constant ASSERT = 0x01;
/// @dev arithmetic underflow or overflow
uint256 internal constant UNDER_OVERFLOW = 0x11;
/// @dev division or modulo by zero
uint256 internal constant DIVISION_BY_ZERO = 0x12;
/// @dev enum conversion error
uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;
/// @dev invalid encoding in storage
uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;
/// @dev empty array pop
uint256 internal constant EMPTY_ARRAY_POP = 0x31;
/// @dev array out of bounds access
uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;
/// @dev resource error (too large allocation or too large array)
uint256 internal constant RESOURCE_ERROR = 0x41;
/// @dev calling invalid internal function
uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;
/// @dev Reverts with a panic code. Recommended to use with
/// the internal constants with predefined codes.
function panic(uint256 code) internal pure {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, 0x4e487b71)
mstore(0x20, code)
revert(0x1c, 0x24)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SafeCast.sol)
// This file was procedurally generated from scripts/generate/templates/SafeCast.js.
pragma solidity ^0.8.20;
/**
* @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow
* checks.
*
* Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
* easily result in undesired exploitation or bugs, since developers usually
* assume that overflows raise errors. `SafeCast` restores this intuition by
* reverting the transaction when such an operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeCast {
/**
* @dev Value doesn't fit in an uint of `bits` size.
*/
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);
/**
* @dev An int value doesn't fit in an uint of `bits` size.
*/
error SafeCastOverflowedIntToUint(int256 value);
/**
* @dev Value doesn't fit in an int of `bits` size.
*/
error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);
/**
* @dev An uint value doesn't fit in an int of `bits` size.
*/
error SafeCastOverflowedUintToInt(uint256 value);
/**
* @dev Returns the downcasted uint248 from uint256, reverting on
* overflow (when the input is greater than largest uint248).
*
* Counterpart to Solidity's `uint248` operator.
*
* Requirements:
*
* - input must fit into 248 bits
*/
function toUint248(uint256 value) internal pure returns (uint248) {
if (value > type(uint248).max) {
revert SafeCastOverflowedUintDowncast(248, value);
}
return uint248(value);
}
/**
* @dev Returns the downcasted uint240 from uint256, reverting on
* overflow (when the input is greater than largest uint240).
*
* Counterpart to Solidity's `uint240` operator.
*
* Requirements:
*
* - input must fit into 240 bits
*/
function toUint240(uint256 value) internal pure returns (uint240) {
if (value > type(uint240).max) {
revert SafeCastOverflowedUintDowncast(240, value);
}
return uint240(value);
}
/**
* @dev Returns the downcasted uint232 from uint256, reverting on
* overflow (when the input is greater than largest uint232).
*
* Counterpart to Solidity's `uint232` operator.
*
* Requirements:
*
* - input must fit into 232 bits
*/
function toUint232(uint256 value) internal pure returns (uint232) {
if (value > type(uint232).max) {
revert SafeCastOverflowedUintDowncast(232, value);
}
return uint232(value);
}
/**
* @dev Returns the downcasted uint224 from uint256, reverting on
* overflow (when the input is greater than largest uint224).
*
* Counterpart to Solidity's `uint224` operator.
*
* Requirements:
*
* - input must fit into 224 bits
*/
function toUint224(uint256 value) internal pure returns (uint224) {
if (value > type(uint224).max) {
revert SafeCastOverflowedUintDowncast(224, value);
}
return uint224(value);
}
/**
* @dev Returns the downcasted uint216 from uint256, reverting on
* overflow (when the input is greater than largest uint216).
*
* Counterpart to Solidity's `uint216` operator.
*
* Requirements:
*
* - input must fit into 216 bits
*/
function toUint216(uint256 value) internal pure returns (uint216) {
if (value > type(uint216).max) {
revert SafeCastOverflowedUintDowncast(216, value);
}
return uint216(value);
}
/**
* @dev Returns the downcasted uint208 from uint256, reverting on
* overflow (when the input is greater than largest uint208).
*
* Counterpart to Solidity's `uint208` operator.
*
* Requirements:
*
* - input must fit into 208 bits
*/
function toUint208(uint256 value) internal pure returns (uint208) {
if (value > type(uint208).max) {
revert SafeCastOverflowedUintDowncast(208, value);
}
return uint208(value);
}
/**
* @dev Returns the downcasted uint200 from uint256, reverting on
* overflow (when the input is greater than largest uint200).
*
* Counterpart to Solidity's `uint200` operator.
*
* Requirements:
*
* - input must fit into 200 bits
*/
function toUint200(uint256 value) internal pure returns (uint200) {
if (value > type(uint200).max) {
revert SafeCastOverflowedUintDowncast(200, value);
}
return uint200(value);
}
/**
* @dev Returns the downcasted uint192 from uint256, reverting on
* overflow (when the input is greater than largest uint192).
*
* Counterpart to Solidity's `uint192` operator.
*
* Requirements:
*
* - input must fit into 192 bits
*/
function toUint192(uint256 value) internal pure returns (uint192) {
if (value > type(uint192).max) {
revert SafeCastOverflowedUintDowncast(192, value);
}
return uint192(value);
}
/**
* @dev Returns the downcasted uint184 from uint256, reverting on
* overflow (when the input is greater than largest uint184).
*
* Counterpart to Solidity's `uint184` operator.
*
* Requirements:
*
* - input must fit into 184 bits
*/
function toUint184(uint256 value) internal pure returns (uint184) {
if (value > type(uint184).max) {
revert SafeCastOverflowedUintDowncast(184, value);
}
return uint184(value);
}
/**
* @dev Returns the downcasted uint176 from uint256, reverting on
* overflow (when the input is greater than largest uint176).
*
* Counterpart to Solidity's `uint176` operator.
*
* Requirements:
*
* - input must fit into 176 bits
*/
function toUint176(uint256 value) internal pure returns (uint176) {
if (value > type(uint176).max) {
revert SafeCastOverflowedUintDowncast(176, value);
}
return uint176(value);
}
/**
* @dev Returns the downcasted uint168 from uint256, reverting on
* overflow (when the input is greater than largest uint168).
*
* Counterpart to Solidity's `uint168` operator.
*
* Requirements:
*
* - input must fit into 168 bits
*/
function toUint168(uint256 value) internal pure returns (uint168) {
if (value > type(uint168).max) {
revert SafeCastOverflowedUintDowncast(168, value);
}
return uint168(value);
}
/**
* @dev Returns the downcasted uint160 from uint256, reverting on
* overflow (when the input is greater than largest uint160).
*
* Counterpart to Solidity's `uint160` operator.
*
* Requirements:
*
* - input must fit into 160 bits
*/
function toUint160(uint256 value) internal pure returns (uint160) {
if (value > type(uint160).max) {
revert SafeCastOverflowedUintDowncast(160, value);
}
return uint160(value);
}
/**
* @dev Returns the downcasted uint152 from uint256, reverting on
* overflow (when the input is greater than largest uint152).
*
* Counterpart to Solidity's `uint152` operator.
*
* Requirements:
*
* - input must fit into 152 bits
*/
function toUint152(uint256 value) internal pure returns (uint152) {
if (value > type(uint152).max) {
revert SafeCastOverflowedUintDowncast(152, value);
}
return uint152(value);
}
/**
* @dev Returns the downcasted uint144 from uint256, reverting on
* overflow (when the input is greater than largest uint144).
*
* Counterpart to Solidity's `uint144` operator.
*
* Requirements:
*
* - input must fit into 144 bits
*/
function toUint144(uint256 value) internal pure returns (uint144) {
if (value > type(uint144).max) {
revert SafeCastOverflowedUintDowncast(144, value);
}
return uint144(value);
}
/**
* @dev Returns the downcasted uint136 from uint256, reverting on
* overflow (when the input is greater than largest uint136).
*
* Counterpart to Solidity's `uint136` operator.
*
* Requirements:
*
* - input must fit into 136 bits
*/
function toUint136(uint256 value) internal pure returns (uint136) {
if (value > type(uint136).max) {
revert SafeCastOverflowedUintDowncast(136, value);
}
return uint136(value);
}
/**
* @dev Returns the downcasted uint128 from uint256, reverting on
* overflow (when the input is greater than largest uint128).
*
* Counterpart to Solidity's `uint128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*/
function toUint128(uint256 value) internal pure returns (uint128) {
if (value > type(uint128).max) {
revert SafeCastOverflowedUintDowncast(128, value);
}
return uint128(value);
}
/**
* @dev Returns the downcasted uint120 from uint256, reverting on
* overflow (when the input is greater than largest uint120).
*
* Counterpart to Solidity's `uint120` operator.
*
* Requirements:
*
* - input must fit into 120 bits
*/
function toUint120(uint256 value) internal pure returns (uint120) {
if (value > type(uint120).max) {
revert SafeCastOverflowedUintDowncast(120, value);
}
return uint120(value);
}
/**
* @dev Returns the downcasted uint112 from uint256, reverting on
* overflow (when the input is greater than largest uint112).
*
* Counterpart to Solidity's `uint112` operator.
*
* Requirements:
*
* - input must fit into 112 bits
*/
function toUint112(uint256 value) internal pure returns (uint112) {
if (value > type(uint112).max) {
revert SafeCastOverflowedUintDowncast(112, value);
}
return uint112(value);
}
/**
* @dev Returns the downcasted uint104 from uint256, reverting on
* overflow (when the input is greater than largest uint104).
*
* Counterpart to Solidity's `uint104` operator.
*
* Requirements:
*
* - input must fit into 104 bits
*/
function toUint104(uint256 value) internal pure returns (uint104) {
if (value > type(uint104).max) {
revert SafeCastOverflowedUintDowncast(104, value);
}
return uint104(value);
}
/**
* @dev Returns the downcasted uint96 from uint256, reverting on
* overflow (when the input is greater than largest uint96).
*
* Counterpart to Solidity's `uint96` operator.
*
* Requirements:
*
* - input must fit into 96 bits
*/
function toUint96(uint256 value) internal pure returns (uint96) {
if (value > type(uint96).max) {
revert SafeCastOverflowedUintDowncast(96, value);
}
return uint96(value);
}
/**
* @dev Returns the downcasted uint88 from uint256, reverting on
* overflow (when the input is greater than largest uint88).
*
* Counterpart to Solidity's `uint88` operator.
*
* Requirements:
*
* - input must fit into 88 bits
*/
function toUint88(uint256 value) internal pure returns (uint88) {
if (value > type(uint88).max) {
revert SafeCastOverflowedUintDowncast(88, value);
}
return uint88(value);
}
/**
* @dev Returns the downcasted uint80 from uint256, reverting on
* overflow (when the input is greater than largest uint80).
*
* Counterpart to Solidity's `uint80` operator.
*
* Requirements:
*
* - input must fit into 80 bits
*/
function toUint80(uint256 value) internal pure returns (uint80) {
if (value > type(uint80).max) {
revert SafeCastOverflowedUintDowncast(80, value);
}
return uint80(value);
}
/**
* @dev Returns the downcasted uint72 from uint256, reverting on
* overflow (when the input is greater than largest uint72).
*
* Counterpart to Solidity's `uint72` operator.
*
* Requirements:
*
* - input must fit into 72 bits
*/
function toUint72(uint256 value) internal pure returns (uint72) {
if (value > type(uint72).max) {
revert SafeCastOverflowedUintDowncast(72, value);
}
return uint72(value);
}
/**
* @dev Returns the downcasted uint64 from uint256, reverting on
* overflow (when the input is greater than largest uint64).
*
* Counterpart to Solidity's `uint64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*/
function toUint64(uint256 value) internal pure returns (uint64) {
if (value > type(uint64).max) {
revert SafeCastOverflowedUintDowncast(64, value);
}
return uint64(value);
}
/**
* @dev Returns the downcasted uint56 from uint256, reverting on
* overflow (when the input is greater than largest uint56).
*
* Counterpart to Solidity's `uint56` operator.
*
* Requirements:
*
* - input must fit into 56 bits
*/
function toUint56(uint256 value) internal pure returns (uint56) {
if (value > type(uint56).max) {
revert SafeCastOverflowedUintDowncast(56, value);
}
return uint56(value);
}
/**
* @dev Returns the downcasted uint48 from uint256, reverting on
* overflow (when the input is greater than largest uint48).
*
* Counterpart to Solidity's `uint48` operator.
*
* Requirements:
*
* - input must fit into 48 bits
*/
function toUint48(uint256 value) internal pure returns (uint48) {
if (value > type(uint48).max) {
revert SafeCastOverflowedUintDowncast(48, value);
}
return uint48(value);
}
/**
* @dev Returns the downcasted uint40 from uint256, reverting on
* overflow (when the input is greater than largest uint40).
*
* Counterpart to Solidity's `uint40` operator.
*
* Requirements:
*
* - input must fit into 40 bits
*/
function toUint40(uint256 value) internal pure returns (uint40) {
if (value > type(uint40).max) {
revert SafeCastOverflowedUintDowncast(40, value);
}
return uint40(value);
}
/**
* @dev Returns the downcasted uint32 from uint256, reverting on
* overflow (when the input is greater than largest uint32).
*
* Counterpart to Solidity's `uint32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*/
function toUint32(uint256 value) internal pure returns (uint32) {
if (value > type(uint32).max) {
revert SafeCastOverflowedUintDowncast(32, value);
}
return uint32(value);
}
/**
* @dev Returns the downcasted uint24 from uint256, reverting on
* overflow (when the input is greater than largest uint24).
*
* Counterpart to Solidity's `uint24` operator.
*
* Requirements:
*
* - input must fit into 24 bits
*/
function toUint24(uint256 value) internal pure returns (uint24) {
if (value > type(uint24).max) {
revert SafeCastOverflowedUintDowncast(24, value);
}
return uint24(value);
}
/**
* @dev Returns the downcasted uint16 from uint256, reverting on
* overflow (when the input is greater than largest uint16).
*
* Counterpart to Solidity's `uint16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*/
function toUint16(uint256 value) internal pure returns (uint16) {
if (value > type(uint16).max) {
revert SafeCastOverflowedUintDowncast(16, value);
}
return uint16(value);
}
/**
* @dev Returns the downcasted uint8 from uint256, reverting on
* overflow (when the input is greater than largest uint8).
*
* Counterpart to Solidity's `uint8` operator.
*
* Requirements:
*
* - input must fit into 8 bits
*/
function toUint8(uint256 value) internal pure returns (uint8) {
if (value > type(uint8).max) {
revert SafeCastOverflowedUintDowncast(8, value);
}
return uint8(value);
}
/**
* @dev Converts a signed int256 into an unsigned uint256.
*
* Requirements:
*
* - input must be greater than or equal to 0.
*/
function toUint256(int256 value) internal pure returns (uint256) {
if (value < 0) {
revert SafeCastOverflowedIntToUint(value);
}
return uint256(value);
}
/**
* @dev Returns the downcasted int248 from int256, reverting on
* overflow (when the input is less than smallest int248 or
* greater than largest int248).
*
* Counterpart to Solidity's `int248` operator.
*
* Requirements:
*
* - input must fit into 248 bits
*/
function toInt248(int256 value) internal pure returns (int248 downcasted) {
downcasted = int248(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(248, value);
}
}
/**
* @dev Returns the downcasted int240 from int256, reverting on
* overflow (when the input is less than smallest int240 or
* greater than largest int240).
*
* Counterpart to Solidity's `int240` operator.
*
* Requirements:
*
* - input must fit into 240 bits
*/
function toInt240(int256 value) internal pure returns (int240 downcasted) {
downcasted = int240(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(240, value);
}
}
/**
* @dev Returns the downcasted int232 from int256, reverting on
* overflow (when the input is less than smallest int232 or
* greater than largest int232).
*
* Counterpart to Solidity's `int232` operator.
*
* Requirements:
*
* - input must fit into 232 bits
*/
function toInt232(int256 value) internal pure returns (int232 downcasted) {
downcasted = int232(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(232, value);
}
}
/**
* @dev Returns the downcasted int224 from int256, reverting on
* overflow (when the input is less than smallest int224 or
* greater than largest int224).
*
* Counterpart to Solidity's `int224` operator.
*
* Requirements:
*
* - input must fit into 224 bits
*/
function toInt224(int256 value) internal pure returns (int224 downcasted) {
downcasted = int224(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(224, value);
}
}
/**
* @dev Returns the downcasted int216 from int256, reverting on
* overflow (when the input is less than smallest int216 or
* greater than largest int216).
*
* Counterpart to Solidity's `int216` operator.
*
* Requirements:
*
* - input must fit into 216 bits
*/
function toInt216(int256 value) internal pure returns (int216 downcasted) {
downcasted = int216(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(216, value);
}
}
/**
* @dev Returns the downcasted int208 from int256, reverting on
* overflow (when the input is less than smallest int208 or
* greater than largest int208).
*
* Counterpart to Solidity's `int208` operator.
*
* Requirements:
*
* - input must fit into 208 bits
*/
function toInt208(int256 value) internal pure returns (int208 downcasted) {
downcasted = int208(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(208, value);
}
}
/**
* @dev Returns the downcasted int200 from int256, reverting on
* overflow (when the input is less than smallest int200 or
* greater than largest int200).
*
* Counterpart to Solidity's `int200` operator.
*
* Requirements:
*
* - input must fit into 200 bits
*/
function toInt200(int256 value) internal pure returns (int200 downcasted) {
downcasted = int200(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(200, value);
}
}
/**
* @dev Returns the downcasted int192 from int256, reverting on
* overflow (when the input is less than smallest int192 or
* greater than largest int192).
*
* Counterpart to Solidity's `int192` operator.
*
* Requirements:
*
* - input must fit into 192 bits
*/
function toInt192(int256 value) internal pure returns (int192 downcasted) {
downcasted = int192(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(192, value);
}
}
/**
* @dev Returns the downcasted int184 from int256, reverting on
* overflow (when the input is less than smallest int184 or
* greater than largest int184).
*
* Counterpart to Solidity's `int184` operator.
*
* Requirements:
*
* - input must fit into 184 bits
*/
function toInt184(int256 value) internal pure returns (int184 downcasted) {
downcasted = int184(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(184, value);
}
}
/**
* @dev Returns the downcasted int176 from int256, reverting on
* overflow (when the input is less than smallest int176 or
* greater than largest int176).
*
* Counterpart to Solidity's `int176` operator.
*
* Requirements:
*
* - input must fit into 176 bits
*/
function toInt176(int256 value) internal pure returns (int176 downcasted) {
downcasted = int176(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(176, value);
}
}
/**
* @dev Returns the downcasted int168 from int256, reverting on
* overflow (when the input is less than smallest int168 or
* greater than largest int168).
*
* Counterpart to Solidity's `int168` operator.
*
* Requirements:
*
* - input must fit into 168 bits
*/
function toInt168(int256 value) internal pure returns (int168 downcasted) {
downcasted = int168(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(168, value);
}
}
/**
* @dev Returns the downcasted int160 from int256, reverting on
* overflow (when the input is less than smallest int160 or
* greater than largest int160).
*
* Counterpart to Solidity's `int160` operator.
*
* Requirements:
*
* - input must fit into 160 bits
*/
function toInt160(int256 value) internal pure returns (int160 downcasted) {
downcasted = int160(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(160, value);
}
}
/**
* @dev Returns the downcasted int152 from int256, reverting on
* overflow (when the input is less than smallest int152 or
* greater than largest int152).
*
* Counterpart to Solidity's `int152` operator.
*
* Requirements:
*
* - input must fit into 152 bits
*/
function toInt152(int256 value) internal pure returns (int152 downcasted) {
downcasted = int152(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(152, value);
}
}
/**
* @dev Returns the downcasted int144 from int256, reverting on
* overflow (when the input is less than smallest int144 or
* greater than largest int144).
*
* Counterpart to Solidity's `int144` operator.
*
* Requirements:
*
* - input must fit into 144 bits
*/
function toInt144(int256 value) internal pure returns (int144 downcasted) {
downcasted = int144(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(144, value);
}
}
/**
* @dev Returns the downcasted int136 from int256, reverting on
* overflow (when the input is less than smallest int136 or
* greater than largest int136).
*
* Counterpart to Solidity's `int136` operator.
*
* Requirements:
*
* - input must fit into 136 bits
*/
function toInt136(int256 value) internal pure returns (int136 downcasted) {
downcasted = int136(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(136, value);
}
}
/**
* @dev Returns the downcasted int128 from int256, reverting on
* overflow (when the input is less than smallest int128 or
* greater than largest int128).
*
* Counterpart to Solidity's `int128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*/
function toInt128(int256 value) internal pure returns (int128 downcasted) {
downcasted = int128(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(128, value);
}
}
/**
* @dev Returns the downcasted int120 from int256, reverting on
* overflow (when the input is less than smallest int120 or
* greater than largest int120).
*
* Counterpart to Solidity's `int120` operator.
*
* Requirements:
*
* - input must fit into 120 bits
*/
function toInt120(int256 value) internal pure returns (int120 downcasted) {
downcasted = int120(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(120, value);
}
}
/**
* @dev Returns the downcasted int112 from int256, reverting on
* overflow (when the input is less than smallest int112 or
* greater than largest int112).
*
* Counterpart to Solidity's `int112` operator.
*
* Requirements:
*
* - input must fit into 112 bits
*/
function toInt112(int256 value) internal pure returns (int112 downcasted) {
downcasted = int112(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(112, value);
}
}
/**
* @dev Returns the downcasted int104 from int256, reverting on
* overflow (when the input is less than smallest int104 or
* greater than largest int104).
*
* Counterpart to Solidity's `int104` operator.
*
* Requirements:
*
* - input must fit into 104 bits
*/
function toInt104(int256 value) internal pure returns (int104 downcasted) {
downcasted = int104(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(104, value);
}
}
/**
* @dev Returns the downcasted int96 from int256, reverting on
* overflow (when the input is less than smallest int96 or
* greater than largest int96).
*
* Counterpart to Solidity's `int96` operator.
*
* Requirements:
*
* - input must fit into 96 bits
*/
function toInt96(int256 value) internal pure returns (int96 downcasted) {
downcasted = int96(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(96, value);
}
}
/**
* @dev Returns the downcasted int88 from int256, reverting on
* overflow (when the input is less than smallest int88 or
* greater than largest int88).
*
* Counterpart to Solidity's `int88` operator.
*
* Requirements:
*
* - input must fit into 88 bits
*/
function toInt88(int256 value) internal pure returns (int88 downcasted) {
downcasted = int88(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(88, value);
}
}
/**
* @dev Returns the downcasted int80 from int256, reverting on
* overflow (when the input is less than smallest int80 or
* greater than largest int80).
*
* Counterpart to Solidity's `int80` operator.
*
* Requirements:
*
* - input must fit into 80 bits
*/
function toInt80(int256 value) internal pure returns (int80 downcasted) {
downcasted = int80(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(80, value);
}
}
/**
* @dev Returns the downcasted int72 from int256, reverting on
* overflow (when the input is less than smallest int72 or
* greater than largest int72).
*
* Counterpart to Solidity's `int72` operator.
*
* Requirements:
*
* - input must fit into 72 bits
*/
function toInt72(int256 value) internal pure returns (int72 downcasted) {
downcasted = int72(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(72, value);
}
}
/**
* @dev Returns the downcasted int64 from int256, reverting on
* overflow (when the input is less than smallest int64 or
* greater than largest int64).
*
* Counterpart to Solidity's `int64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*/
function toInt64(int256 value) internal pure returns (int64 downcasted) {
downcasted = int64(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(64, value);
}
}
/**
* @dev Returns the downcasted int56 from int256, reverting on
* overflow (when the input is less than smallest int56 or
* greater than largest int56).
*
* Counterpart to Solidity's `int56` operator.
*
* Requirements:
*
* - input must fit into 56 bits
*/
function toInt56(int256 value) internal pure returns (int56 downcasted) {
downcasted = int56(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(56, value);
}
}
/**
* @dev Returns the downcasted int48 from int256, reverting on
* overflow (when the input is less than smallest int48 or
* greater than largest int48).
*
* Counterpart to Solidity's `int48` operator.
*
* Requirements:
*
* - input must fit into 48 bits
*/
function toInt48(int256 value) internal pure returns (int48 downcasted) {
downcasted = int48(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(48, value);
}
}
/**
* @dev Returns the downcasted int40 from int256, reverting on
* overflow (when the input is less than smallest int40 or
* greater than largest int40).
*
* Counterpart to Solidity's `int40` operator.
*
* Requirements:
*
* - input must fit into 40 bits
*/
function toInt40(int256 value) internal pure returns (int40 downcasted) {
downcasted = int40(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(40, value);
}
}
/**
* @dev Returns the downcasted int32 from int256, reverting on
* overflow (when the input is less than smallest int32 or
* greater than largest int32).
*
* Counterpart to Solidity's `int32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*/
function toInt32(int256 value) internal pure returns (int32 downcasted) {
downcasted = int32(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(32, value);
}
}
/**
* @dev Returns the downcasted int24 from int256, reverting on
* overflow (when the input is less than smallest int24 or
* greater than largest int24).
*
* Counterpart to Solidity's `int24` operator.
*
* Requirements:
*
* - input must fit into 24 bits
*/
function toInt24(int256 value) internal pure returns (int24 downcasted) {
downcasted = int24(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(24, value);
}
}
/**
* @dev Returns the downcasted int16 from int256, reverting on
* overflow (when the input is less than smallest int16 or
* greater than largest int16).
*
* Counterpart to Solidity's `int16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*/
function toInt16(int256 value) internal pure returns (int16 downcasted) {
downcasted = int16(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(16, value);
}
}
/**
* @dev Returns the downcasted int8 from int256, reverting on
* overflow (when the input is less than smallest int8 or
* greater than largest int8).
*
* Counterpart to Solidity's `int8` operator.
*
* Requirements:
*
* - input must fit into 8 bits
*/
function toInt8(int256 value) internal pure returns (int8 downcasted) {
downcasted = int8(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(8, value);
}
}
/**
* @dev Converts an unsigned uint256 into a signed int256.
*
* Requirements:
*
* - input must be less than or equal to maxInt256.
*/
function toInt256(uint256 value) internal pure returns (int256) {
// Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
if (value > uint256(type(int256).max)) {
revert SafeCastOverflowedUintToInt(value);
}
return int256(value);
}
/**
* @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.
*/
function toUint(bool b) internal pure returns (uint256 u) {
/// @solidity memory-safe-assembly
assembly {
u := iszero(iszero(b))
}
}
}{
"remappings": [
"@forge-std/=lib/forge-std/src/",
"@interfaces/=src/interfaces/",
"@types/=src/types/",
"@libraries/=src/libraries/",
"@solady/=lib/solady/src/",
"@prb-test/=lib/prb-test/src/",
"@openzeppelin/=lib/openzeppelin-contracts/contracts/",
"@admin/=src/admin/",
"@executors/=src/executors/",
"@mocks/=test/mocks/",
"@factory/=src/factory/",
"@registry/=src/registry/",
"@modules/=src/modules/",
"@adapter/=src/adapter/",
"@test/=test/",
"@create3/=lib/create3-factory/src/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"create3-factory/=lib/create3-factory/",
"ds-test/=lib/create3-factory/lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"prb-test/=lib/prb-test/src/",
"solady/=lib/solady/src/",
"solmate/=lib/create3-factory/lib/solmate/src/"
],
"optimizer": {
"enabled": true,
"runs": 1000000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false,
"libraries": {
"src/modules/libraries/ModuleManagerLib.sol": {
"ModuleManagerLib": "0xee217191e4bdf5e5Bd7b9f8B17592BaF33dC7715"
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ModuleNotFound","type":"error"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"ModuleNotInstalled","type":"error"},{"inputs":[],"name":"ModuleNotRegistered","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"address","name":"oldModule","type":"address"}],"name":"SelectorAlreadySet","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"UnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"module","type":"address"}],"name":"ModuleInstalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"module","type":"address"}],"name":"ModuleUninstalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getModules","outputs":[{"components":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct IAdapter.Module[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"install","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"uninstall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
610100604052348015610010575f80fd5b506040516116cd3803806116cd83398101604081905261002f916101a0565b6040805180820182526008815267506f7274696b757360c01b6020918201527ff0ad1de82e0eb024a6da385106f0bbff7da8aaec15457f8c4d79413072d81d6b60809081528251808401845260058152640322e302e360dc1b908301527fb4bcb154e38601c389396fa918314da42d4626f13ef6d0ceb07e5f5d26b2fbc360a052825190810190925260528083529061167b908301396040516020016100d591906101cd565b60408051601f19818403018152919052805160209091012060c0523360e0526101066001600160a01b03821661010c565b506101e3565b7fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b5720380546001600160a01b031981166001600160a01b038481169182179093556040517fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b57200939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f602082840312156101b0575f80fd5b81516001600160a01b03811681146101c6575f80fd5b9392505050565b5f82518060208501845e5f920191825250919050565b60805160a05160c05160e05161145f61021c5f395f818160f901526102a701525f61037301525f6103c101525f610399015261145f5ff3fe608060405260043610610068575f3560e01c80638da5cb5b116100425780638da5cb5b146101e1578063b2494df31461021a578063f2fde38b1461023b5761006f565b80632a1b8f9b1461017a5780633644e5151461019b57806359bc2249146101c25761006f565b3661006f57005b5f80357fffffffff000000000000000000000000000000000000000000000000000000001681527fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b5720160205260409020547fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b572009073ffffffffffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000008161012a57637252c08c5f526004601cfd5b604051631c5ebe2f81528260208201526020816024601c8401855afa60018251141661015d57639c4aee9e5f526004601cfd5b365f82375f803683865af43d805f843e81610176578083fd5b8083f35b348015610185575f80fd5b50610199610194366004610fb5565b61025a565b005b3480156101a6575f80fd5b506101af610369565b6040519081526020015b60405180910390f35b3480156101cd575f80fd5b506101996101dc366004610fb5565b610416565b3480156101ec575f80fd5b506101f561043d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b9565b348015610225575f80fd5b5061022e61047c565b6040516101b99190610fd7565b348015610246575f80fd5b50610199610255366004610fb5565b610509565b610262610530565b6040517f1c5ebe2f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f00000000000000000000000000000000000000000000000000000000000000001690631c5ebe2f906024016020604051808303815f875af11580156102ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031191906110cb565b610347576040517f9c4aee9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103668173ffffffffffffffffffffffffffffffffffffffff166105c9565b50565b5f610411604080517f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b61041e610530565b6103668173ffffffffffffffffffffffffffffffffffffffff16610a02565b5f6104117fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b572035473ffffffffffffffffffffffffffffffffffffffff1690565b606073ee217191e4bdf5e5bd7b9f8b17592baf33dc771563b2494df36040518163ffffffff1660e01b81526004015f60405180830381865af41580156104c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610411919081019061124b565b610511610530565b6103668173ffffffffffffffffffffffffffffffffffffffff16610e00565b7fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b57203547fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b572009073ffffffffffffffffffffffffffffffffffffffff163314610366576040517f32b2baa30000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b5f7fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b5720090505f8273ffffffffffffffffffffffffffffffffffffffff16636e25b9786040518163ffffffff1660e01b81526004015f60405180830381865afa158015610636573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261067b9190810190611356565b6002830180546001810182555f918252602080832090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88169081179091558252848152604090912082519293506106f1929091840190610eb9565b506002820154610703906001906113bd565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260208490526040812060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff93909316929092179091555b81518163ffffffff1610156109bc575f836001015f848463ffffffff168151811061078c5761078c6113d6565b6020908102919091018101517fffffffff000000000000000000000000000000000000000000000000000000001682528101919091526040015f205473ffffffffffffffffffffffffffffffffffffffff169050801561087c57828263ffffffff16815181106107fe576107fe6113d6565b60209081029190910101516040517f184fc20d0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000909116600482015273ffffffffffffffffffffffffffffffffffffffff821660248201526044016105c0565b81846001015f858563ffffffff168151811061089a5761089a6113d6565b60200260200101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f0160146101000a81548163ffffffff021916908363ffffffff16021790555084846001015f858563ffffffff168151811061092b5761092b6113d6565b6020908102919091018101517fffffffff000000000000000000000000000000000000000000000000000000001682528101919091526040015f2080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550806109b481611403565b91505061075f565b5060405173ffffffffffffffffffffffffffffffffffffffff8416907fb4a437488482177b2d124ce7c50e57d8f8d42a9896b525c9c497ee0d533a95de905f90a2505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b572006020818152604080842080548251818502810185019093528083529394939192909190830182828015610acf57602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411610a7c5790505b5050505050905080515f03610b28576040517f026d963900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016105c0565b73ffffffffffffffffffffffffffffffffffffffff83165f908152602083905260408120600190810154600285015463ffffffff9091169291610b6a916113bd565b90508063ffffffff168263ffffffff1614610c6a575f846002018263ffffffff1681548110610b9b57610b9b6113d6565b5f9182526020909120015460028601805473ffffffffffffffffffffffffffffffffffffffff9092169250829163ffffffff8616908110610bde57610bde6113d6565b5f91825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055929091168152908590526040902060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff84161790555b83600201805480610c7d57610c7d611425565b5f828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff871682528590526040812090610d038282610f62565b5060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001690555f5b8351811015610db857846001015f858381518110610d4f57610d4f6113d6565b6020908102919091018101517fffffffff000000000000000000000000000000000000000000000000000000001682528101919091526040015f2080547fffffffffffffffff000000000000000000000000000000000000000000000000169055600101610d2f565b5060405173ffffffffffffffffffffffffffffffffffffffff8616907f8542f07efccd0c3cda31b784e4230bb229a0fd4c566cc725db514300e2f6df88905f90a25050505050565b7fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b5720380547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b57200939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b828054828255905f5260205f2090600701600890048101928215610f52579160200282015f5b83821115610f2057835183826101000a81548163ffffffff021916908360e01c02179055509260200192600401602081600301049283019260010302610edf565b8015610f505782816101000a81549063ffffffff0219169055600401602081600301049283019260010302610f20565b505b50610f5e929150610f80565b5090565b5080545f825560070160089004905f5260205f209081019061036691905b5b80821115610f5e575f8155600101610f81565b73ffffffffffffffffffffffffffffffffffffffff81168114610366575f80fd5b5f60208284031215610fc5575f80fd5b8135610fd081610f94565b9392505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156110bd578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805173ffffffffffffffffffffffffffffffffffffffff1684528701518784018790528051878501819052908801905f9060608601905b808310156110a85783517fffffffff00000000000000000000000000000000000000000000000000000000168252928a019260019290920191908a0190611066565b50968901969450505090860190600101610ffe565b509098975050505050505050565b5f602082840312156110db575f80fd5b81518015158114610fd0575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561113a5761113a6110ea565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611187576111876110ea565b604052919050565b5f67ffffffffffffffff8211156111a8576111a86110ea565b5060051b60200190565b5f82601f8301126111c1575f80fd5b815160206111d66111d18361118f565b611140565b8083825260208201915060208460051b8701019350868411156111f7575f80fd5b602086015b848110156112405780517fffffffff0000000000000000000000000000000000000000000000000000000081168114611233575f80fd5b83529183019183016111fc565b509695505050505050565b5f602080838503121561125c575f80fd5b825167ffffffffffffffff80821115611273575f80fd5b818501915085601f830112611286575f80fd5b81516112946111d18261118f565b81815260059190911b830184019084810190888311156112b2575f80fd5b8585015b83811015611349578051858111156112cc575f80fd5b86016040818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001811315611300575f80fd5b611308611117565b8983015161131581610f94565b8152908201519087821115611328575f80fd5b6113368d8b848601016111b2565b818b0152855250509186019186016112b6565b5098975050505050505050565b5f60208284031215611366575f80fd5b815167ffffffffffffffff81111561137c575f80fd5b611388848285016111b2565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156113d0576113d0611390565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f63ffffffff80831681810361141b5761141b611390565b6001019392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000819000a454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429000000000000000000000000d7e24a49944f7972ceb826c7557580658f9c3303
Deployed Bytecode
0x608060405260043610610068575f3560e01c80638da5cb5b116100425780638da5cb5b146101e1578063b2494df31461021a578063f2fde38b1461023b5761006f565b80632a1b8f9b1461017a5780633644e5151461019b57806359bc2249146101c25761006f565b3661006f57005b5f80357fffffffff000000000000000000000000000000000000000000000000000000001681527fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b5720160205260409020547fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b572009073ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000000007005729e310000c6003402d8a0fb700da0c008161012a57637252c08c5f526004601cfd5b604051631c5ebe2f81528260208201526020816024601c8401855afa60018251141661015d57639c4aee9e5f526004601cfd5b365f82375f803683865af43d805f843e81610176578083fd5b8083f35b348015610185575f80fd5b50610199610194366004610fb5565b61025a565b005b3480156101a6575f80fd5b506101af610369565b6040519081526020015b60405180910390f35b3480156101cd575f80fd5b506101996101dc366004610fb5565b610416565b3480156101ec575f80fd5b506101f561043d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b9565b348015610225575f80fd5b5061022e61047c565b6040516101b99190610fd7565b348015610246575f80fd5b50610199610255366004610fb5565b610509565b610262610530565b6040517f1c5ebe2f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000007005729e310000c6003402d8a0fb700da0c001690631c5ebe2f906024016020604051808303815f875af11580156102ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031191906110cb565b610347576040517f9c4aee9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103668173ffffffffffffffffffffffffffffffffffffffff166105c9565b50565b5f610411604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527ff0ad1de82e0eb024a6da385106f0bbff7da8aaec15457f8c4d79413072d81d6b918101919091527fb4bcb154e38601c389396fa918314da42d4626f13ef6d0ceb07e5f5d26b2fbc360608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b61041e610530565b6103668173ffffffffffffffffffffffffffffffffffffffff16610a02565b5f6104117fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b572035473ffffffffffffffffffffffffffffffffffffffff1690565b606073ee217191e4bdf5e5bd7b9f8b17592baf33dc771563b2494df36040518163ffffffff1660e01b81526004015f60405180830381865af41580156104c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610411919081019061124b565b610511610530565b6103668173ffffffffffffffffffffffffffffffffffffffff16610e00565b7fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b57203547fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b572009073ffffffffffffffffffffffffffffffffffffffff163314610366576040517f32b2baa30000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b5f7fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b5720090505f8273ffffffffffffffffffffffffffffffffffffffff16636e25b9786040518163ffffffff1660e01b81526004015f60405180830381865afa158015610636573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261067b9190810190611356565b6002830180546001810182555f918252602080832090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88169081179091558252848152604090912082519293506106f1929091840190610eb9565b506002820154610703906001906113bd565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260208490526040812060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff93909316929092179091555b81518163ffffffff1610156109bc575f836001015f848463ffffffff168151811061078c5761078c6113d6565b6020908102919091018101517fffffffff000000000000000000000000000000000000000000000000000000001682528101919091526040015f205473ffffffffffffffffffffffffffffffffffffffff169050801561087c57828263ffffffff16815181106107fe576107fe6113d6565b60209081029190910101516040517f184fc20d0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000909116600482015273ffffffffffffffffffffffffffffffffffffffff821660248201526044016105c0565b81846001015f858563ffffffff168151811061089a5761089a6113d6565b60200260200101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f0160146101000a81548163ffffffff021916908363ffffffff16021790555084846001015f858563ffffffff168151811061092b5761092b6113d6565b6020908102919091018101517fffffffff000000000000000000000000000000000000000000000000000000001682528101919091526040015f2080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550806109b481611403565b91505061075f565b5060405173ffffffffffffffffffffffffffffffffffffffff8416907fb4a437488482177b2d124ce7c50e57d8f8d42a9896b525c9c497ee0d533a95de905f90a2505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b572006020818152604080842080548251818502810185019093528083529394939192909190830182828015610acf57602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411610a7c5790505b5050505050905080515f03610b28576040517f026d963900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016105c0565b73ffffffffffffffffffffffffffffffffffffffff83165f908152602083905260408120600190810154600285015463ffffffff9091169291610b6a916113bd565b90508063ffffffff168263ffffffff1614610c6a575f846002018263ffffffff1681548110610b9b57610b9b6113d6565b5f9182526020909120015460028601805473ffffffffffffffffffffffffffffffffffffffff9092169250829163ffffffff8616908110610bde57610bde6113d6565b5f91825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055929091168152908590526040902060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff84161790555b83600201805480610c7d57610c7d611425565b5f828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff871682528590526040812090610d038282610f62565b5060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001690555f5b8351811015610db857846001015f858381518110610d4f57610d4f6113d6565b6020908102919091018101517fffffffff000000000000000000000000000000000000000000000000000000001682528101919091526040015f2080547fffffffffffffffff000000000000000000000000000000000000000000000000169055600101610d2f565b5060405173ffffffffffffffffffffffffffffffffffffffff8616907f8542f07efccd0c3cda31b784e4230bb229a0fd4c566cc725db514300e2f6df88905f90a25050505050565b7fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b5720380547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517fcd83f9e468adb540d21d5a132f84948f7344c9d0a65c67a05f93f89a07b57200939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b828054828255905f5260205f2090600701600890048101928215610f52579160200282015f5b83821115610f2057835183826101000a81548163ffffffff021916908360e01c02179055509260200192600401602081600301049283019260010302610edf565b8015610f505782816101000a81549063ffffffff0219169055600401602081600301049283019260010302610f20565b505b50610f5e929150610f80565b5090565b5080545f825560070160089004905f5260205f209081019061036691905b5b80821115610f5e575f8155600101610f81565b73ffffffffffffffffffffffffffffffffffffffff81168114610366575f80fd5b5f60208284031215610fc5575f80fd5b8135610fd081610f94565b9392505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156110bd578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805173ffffffffffffffffffffffffffffffffffffffff1684528701518784018790528051878501819052908801905f9060608601905b808310156110a85783517fffffffff00000000000000000000000000000000000000000000000000000000168252928a019260019290920191908a0190611066565b50968901969450505090860190600101610ffe565b509098975050505050505050565b5f602082840312156110db575f80fd5b81518015158114610fd0575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561113a5761113a6110ea565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611187576111876110ea565b604052919050565b5f67ffffffffffffffff8211156111a8576111a86110ea565b5060051b60200190565b5f82601f8301126111c1575f80fd5b815160206111d66111d18361118f565b611140565b8083825260208201915060208460051b8701019350868411156111f7575f80fd5b602086015b848110156112405780517fffffffff0000000000000000000000000000000000000000000000000000000081168114611233575f80fd5b83529183019183016111fc565b509695505050505050565b5f602080838503121561125c575f80fd5b825167ffffffffffffffff80821115611273575f80fd5b818501915085601f830112611286575f80fd5b81516112946111d18261118f565b81815260059190911b830184019084810190888311156112b2575f80fd5b8585015b83811015611349578051858111156112cc575f80fd5b86016040818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001811315611300575f80fd5b611308611117565b8983015161131581610f94565b8152908201519087821115611328575f80fd5b6113368d8b848601016111b2565b818b0152855250509186019186016112b6565b5098975050505050505050565b5f60208284031215611366575f80fd5b815167ffffffffffffffff81111561137c575f80fd5b611388848285016111b2565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156113d0576113d0611390565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f63ffffffff80831681810361141b5761141b611390565b6001019392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000819000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d7e24a49944f7972ceb826c7557580658f9c3303
-----Decoded View---------------
Arg [0] : _owner (address): 0xD7e24A49944F7972cEb826C7557580658F9C3303
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d7e24a49944f7972ceb826c7557580658f9c3303
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$14,938.36
Net Worth in ETH
7.16403
Token Allocations
USDC
29.65%
BSC-USD
19.81%
ETH
11.38%
Others
39.16%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ARB | 19.01% | $0.999847 | 2,839.6156 | $2,839.18 | |
| ARB | 9.24% | $2,084.12 | 0.6625 | $1,380.76 | |
| ARB | 7.76% | $76,177 | 0.0152 | $1,158.89 | |
| ARB | 2.14% | $0.998438 | 320.7118 | $320.21 | |
| ARB | 2.01% | $2,767.96 | 0.1083 | $299.66 | |
| ARB | 1.67% | $2,258.88 | 0.1104 | $249.4 | |
| ARB | 1.11% | $2,416.57 | 0.0685 | $165.62 | |
| ARB | 0.73% | $0.999847 | 109.1789 | $109.16 | |
| ARB | 0.29% | $0.99931 | 43.0071 | $42.98 | |
| ARB | 0.26% | $2,085.57 | 0.0186 | $38.76 | |
| ARB | 0.24% | $1.19 | 30.6968 | $36.53 | |
| ARB | 0.24% | $0.053066 | 686.5522 | $36.43 | |
| ARB | 0.23% | $76,390 | 0.00045656 | $34.88 | |
| ARB | 0.21% | $0.210646 | 150.2442 | $31.65 | |
| ARB | 0.20% | $130.31 | 0.2311 | $30.12 | |
| ARB | 0.18% | $1 | 26.8865 | $26.91 | |
| ARB | 0.18% | $0.120658 | 217.8284 | $26.28 | |
| ARB | 0.16% | $9.1 | 2.7054 | $24.62 | |
| ARB | 0.09% | $0.999907 | 12.8963 | $12.9 | |
| ARB | 0.06% | $0.999002 | 8.9771 | $8.97 | |
| ARB | 0.05% | $1.2 | 6.5199 | $7.82 | |
| ARB | 0.05% | $0.999902 | 6.9454 | $6.94 | |
| ARB | 0.04% | $2,317.13 | 0.00230366 | $5.34 | |
| ARB | 0.03% | $76,284 | 0.00005986 | $4.57 | |
| ARB | 0.03% | $6.7 | 0.6408 | $4.29 | |
| ARB | 0.01% | $70,983 | 0.00002811 | $2 | |
| ARB | 0.01% | $1.15 | 1.3411 | $1.54 | |
| ARB | 0.01% | $0.994846 | 1.5299 | $1.52 | |
| ARB | <0.01% | $3.7 | 0.2896 | $1.07 | |
| ARB | <0.01% | $0.26564 | 3.5614 | $0.946 | |
| ARB | <0.01% | $1.01 | 0.9072 | $0.9144 | |
| ARB | <0.01% | $1.32 | 0.6544 | $0.8638 | |
| ARB | <0.01% | $0.009946 | 66.2883 | $0.6593 | |
| ARB | <0.01% | $0.902694 | 0.7287 | $0.6577 | |
| ARB | <0.01% | $0.00018 | 2,907.7104 | $0.5235 | |
| ARB | <0.01% | $64,957 | 0.00000776 | $0.504 | |
| ARB | <0.01% | $0.141569 | 3.3116 | $0.4688 | |
| ARB | <0.01% | $0.486448 | 0.8886 | $0.4322 | |
| ARB | <0.01% | $0.520132 | 0.8223 | $0.4276 | |
| ARB | <0.01% | $0.99791 | 0.3926 | $0.3917 | |
| ARB | <0.01% | $70.09 | 0.00418304 | $0.2931 | |
| ARB | <0.01% | $1 | 0.2656 | $0.2655 | |
| ARB | <0.01% | $2,314.06 | 0.0000826 | $0.1911 | |
| ARB | <0.01% | $0.001605 | 103.6533 | $0.1663 | |
| ARB | <0.01% | $0.00048 | 327.5596 | $0.1571 | |
| ARB | <0.01% | $1.09 | 0.1386 | $0.1506 | |
| ARB | <0.01% | $0.028472 | 4.5744 | $0.1302 | |
| ARB | <0.01% | $2,533.28 | 0.00004934 | $0.1249 | |
| ARB | <0.01% | $2.42 | 0.049 | $0.1185 | |
| BSC | 19.81% | $0.999672 | 2,959.9975 | $2,959.03 | |
| BSC | 2.81% | $0.999912 | 419.5719 | $419.53 | |
| BSC | 0.84% | $633.19 | 0.1971 | $124.77 | |
| BSC | 0.81% | $0.999933 | 120.5623 | $120.55 | |
| BSC | 0.71% | $2,086.2 | 0.0507 | $105.75 | |
| BSC | 0.59% | $76,114 | 0.00114999 | $87.53 | |
| BSC | 0.36% | $69,779.2 | 0.00076716 | $53.53 | |
| BSC | 0.21% | $633.51 | 0.05 | $31.65 | |
| BSC | 0.12% | $0.291277 | 62.5215 | $18.21 | |
| BSC | 0.10% | $0.041151 | 365.508 | $15.04 | |
| BSC | 0.10% | $33.55 | 0.4475 | $15.02 | |
| BSC | 0.09% | $0.004064 | 3,269.3998 | $13.29 | |
| BSC | 0.08% | $689.31 | 0.0163 | $11.22 | |
| BSC | 0.07% | $0.101441 | 110.0525 | $11.16 | |
| BSC | 0.05% | $1.08 | 6.7617 | $7.3 | |
| BSC | 0.04% | $0.01559 | 358.6745 | $5.59 | |
| BSC | 0.04% | $0.999619 | 5.5788 | $5.58 | |
| BSC | 0.02% | $0.99802 | 3.161 | $3.15 | |
| BSC | 0.02% | $565.21 | 0.00547427 | $3.09 | |
| BSC | 0.02% | $4,962.39 | 0.00052034 | $2.58 | |
| BSC | 0.02% | $0.00039 | 6,221.8954 | $2.43 | |
| BSC | 0.01% | $99 | 0.0213 | $2.11 | |
| BSC | 0.01% | $1.47 | 1.1081 | $1.63 | |
| BSC | <0.01% | $3.7 | 0.3321 | $1.23 | |
| BSC | <0.01% | $0.105515 | 9.7254 | $1.03 | |
| BSC | <0.01% | $0.01035 | 83.4423 | $0.8636 | |
| BSC | <0.01% | $285.25 | 0.0020046 | $0.5718 | |
| BSC | <0.01% | $0.001544 | 353.8298 | $0.5463 | |
| BSC | <0.01% | $0.110664 | 4.9014 | $0.5424 | |
| BSC | <0.01% | $0.109408 | 4.5704 | $0.50 | |
| BSC | <0.01% | $0.005907 | 59.6923 | $0.3526 | |
| BSC | <0.01% | $0.100457 | 2.7729 | $0.2785 | |
| BSC | <0.01% | $9.1 | 0.0222 | $0.2019 | |
| BSC | <0.01% | $0.001045 | 152.1937 | $0.159 | |
| BSC | <0.01% | <$0.000001 | 9,455,242.8743 | $0.1348 | |
| POL | 6.43% | $0.999847 | 960.7176 | $960.57 | |
| POL | 3.68% | $0.998295 | 550.7641 | $549.83 | |
| POL | 1.64% | $0.791615 | 308.5751 | $244.27 | |
| POL | 0.88% | $0.999847 | 130.7464 | $130.73 | |
| POL | 0.71% | $2,078.9 | 0.051 | $105.96 | |
| POL | 0.66% | $76,114 | 0.00130181 | $99.09 | |
| POL | 0.45% | $0.002921 | 22,790.78 | $66.57 | |
| POL | 0.24% | $0.115535 | 306.3669 | $35.4 | |
| POL | 0.12% | $9.07 | 2.0409 | $18.51 | |
| POL | 0.10% | $130.15 | 0.11 | $14.32 | |
| POL | 0.07% | $1.19 | 9.1408 | $10.88 | |
| POL | 0.07% | $1.19 | 9.1408 | $10.88 | |
| POL | 0.04% | $2,773.1 | 0.00220275 | $6.11 | |
| POL | 0.02% | $0.507238 | 6.5093 | $3.3 | |
| POL | 0.01% | $0.000007 | 222,435.7549 | $1.53 | |
| POL | <0.01% | $0.190623 | 4.6543 | $0.8872 | |
| POL | <0.01% | $0.022129 | 34.588 | $0.7653 | |
| POL | <0.01% | $0.190573 | 3.0008 | $0.5718 | |
| POL | <0.01% | $0.307001 | 1.3773 | $0.4228 | |
| POL | <0.01% | $0.008688 | 42.8651 | $0.3723 | |
| POL | <0.01% | $0.999905 | 0.3055 | $0.3055 | |
| POL | <0.01% | $0.111672 | 2.3076 | $0.2576 | |
| POL | <0.01% | $0.010077 | 22.1883 | $0.2236 | |
| POL | <0.01% | $87.99 | 0.00229228 | $0.2016 | |
| POL | <0.01% | $0.012687 | 15.006 | $0.1903 | |
| POL | <0.01% | $2,085.57 | 0.00008368 | $0.1745 | |
| POL | <0.01% | $3.66 | 0.0345 | $0.1261 | |
| POL | <0.01% | $0.115801 | 0.9032 | $0.1045 | |
| ETH | 1.33% | $0.999931 | 198.6588 | $198.65 | |
| ETH | 1.19% | $2,083.97 | 0.085 | $177.16 | |
| ETH | 0.34% | $2,767.01 | 0.0184 | $50.78 | |
| ETH | 0.28% | $0.00 | 627.4992 | $0.00 | |
| ETH | 0.21% | $76,149 | 0.00040406 | $30.77 | |
| ETH | 0.20% | $2,257.37 | 0.0131 | $29.63 | |
| ETH | 0.20% | $0.9999 | 29.3267 | $29.32 | |
| ETH | 0.12% | $5,026.25 | 0.00351017 | $17.64 | |
| ETH | 0.12% | $0.065758 | 262.3254 | $17.25 | |
| ETH | 0.12% | $0.999677 | 17.2496 | $17.24 | |
| ETH | 0.11% | $0.997855 | 15.79 | $15.76 | |
| ETH | 0.10% | $1 | 15.3355 | $15.35 | |
| ETH | 0.10% | $0.000987 | 14,509.4134 | $14.33 | |
| ETH | 0.09% | $2,459.09 | 0.00539742 | $13.27 | |
| ETH | 0.09% | $0.998895 | 12.9733 | $12.96 | |
| ETH | 0.08% | $0.99981 | 12.5516 | $12.55 | |
| ETH | 0.08% | $1.18 | 10.0172 | $11.87 | |
| ETH | 0.08% | $1.18 | 9.9724 | $11.81 | |
| ETH | 0.08% | $2,083.97 | 0.00543816 | $11.33 | |
| ETH | 0.07% | $0.031372 | 353.4127 | $11.09 | |
| ETH | 0.07% | $0.999843 | 10.8198 | $10.82 | |
| ETH | 0.07% | $9.08 | 1.1834 | $10.74 | |
| ETH | 0.07% | $0.791098 | 13.1059 | $10.37 | |
| ETH | 0.07% | $0.006037 | 1,688.7557 | $10.19 | |
| ETH | 0.07% | $0.000392 | 25,824.9053 | $10.13 | |
| ETH | 0.07% | $0.99791 | 10.1485 | $10.13 | |
| ETH | 0.07% | $0.357154 | 27.7421 | $9.91 | |
| ETH | 0.06% | $1.09 | 8.7044 | $9.45 | |
| ETH | 0.06% | $0.011798 | 797.672 | $9.41 | |
| ETH | 0.06% | $0.008407 | 1,085.7204 | $9.13 | |
| ETH | 0.06% | $0.999499 | 9.0066 | $9 | |
| ETH | 0.06% | $0.004898 | 1,754.4476 | $8.59 | |
| ETH | 0.06% | $1.32 | 6.4058 | $8.46 | |
| ETH | 0.06% | $0.951451 | 8.7779 | $8.35 | |
| ETH | 0.05% | $0.006465 | 1,265.2663 | $8.18 | |
| ETH | 0.05% | $125.49 | 0.0644 | $8.08 | |
| ETH | 0.05% | $2,407.24 | 0.00334329 | $8.05 | |
| ETH | 0.05% | $0.069123 | 116.078 | $8.02 | |
| ETH | 0.05% | $133.18 | 0.0601 | $8 | |
| ETH | 0.05% | $0.52968 | 15.0994 | $8 | |
| ETH | 0.05% | $16.94 | 0.4549 | $7.71 | |
| ETH | 0.05% | $0.00 | 7.3177 | $0.00 | |
| ETH | 0.05% | $0.9941 | 7.4828 | $7.44 | |
| ETH | 0.05% | $0.065196 | 112.8371 | $7.36 | |
| ETH | 0.05% | $0.999828 | 7.2762 | $7.27 | |
| ETH | 0.05% | $76,732 | 0.00009181 | $7.04 | |
| ETH | 0.05% | $17.27 | 0.4045 | $6.99 | |
| ETH | 0.05% | $2,777.07 | 0.00247463 | $6.87 | |
| ETH | 0.04% | $0.815499 | 8.1425 | $6.64 | |
| ETH | 0.04% | $0.071123 | 92.9144 | $6.61 | |
| ETH | 0.04% | $8.12 | 0.7985 | $6.48 | |
| ETH | 0.04% | $0.673456 | 9.5825 | $6.45 | |
| ETH | 0.04% | $194.74 | 0.0331 | $6.44 | |
| ETH | 0.04% | $0.112112 | 57.2826 | $6.42 | |
| ETH | 0.04% | $0.000034 | 187,897.6757 | $6.32 | |
| ETH | 0.04% | $0.00 | 314.2933 | $0.00 | |
| ETH | 0.04% | $759.71 | 0.00791676 | $6.01 | |
| ETH | 0.04% | $0.192232 | 31.2617 | $6.01 | |
| ETH | 0.04% | $8.83 | 0.6753 | $5.96 | |
| ETH | 0.04% | $0.022617 | 259.5466 | $5.87 | |
| ETH | 0.04% | $0.001046 | 5,572.0082 | $5.83 | |
| ETH | 0.04% | $0.001643 | 3,521.1816 | $5.79 | |
| ETH | 0.04% | $99.44 | 0.0565 | $5.62 | |
| ETH | 0.04% | $2,624.38 | 0.00211324 | $5.55 | |
| ETH | 0.04% | $76,331 | 0.00007043 | $5.38 | |
| ETH | 0.04% | $0.351391 | 14.9699 | $5.26 | |
| ETH | 0.03% | $0.00 | 0.6902 | $0.00 | |
| ETH | 0.03% | $1.58 | 3.2775 | $5.18 | |
| ETH | 0.03% | $0.863696 | 5.9123 | $5.11 | |
| ETH | 0.03% | $0.006686 | 759.9705 | $5.08 | |
| ETH | 0.03% | $0.286721 | 17.5561 | $5.03 | |
| ETH | 0.03% | $0.001281 | 3,787.9472 | $4.85 | |
| ETH | 0.03% | $1.18 | 4.0657 | $4.8 | |
| ETH | 0.03% | $0.116965 | 38.4048 | $4.49 | |
| ETH | 0.03% | $0.017271 | 256.9286 | $4.44 | |
| ETH | 0.03% | $0.112116 | 39.4451 | $4.42 | |
| ETH | 0.03% | $0.358321 | 12.2404 | $4.39 | |
| ETH | 0.03% | $0.997395 | 4.3217 | $4.31 | |
| ETH | 0.03% | $0.187774 | 21.8885 | $4.11 | |
| ETH | 0.03% | $0.229117 | 17.7376 | $4.06 | |
| ETH | 0.03% | $2,453.13 | 0.0016075 | $3.94 | |
| ETH | 0.03% | $1 | 3.8043 | $3.82 | |
| ETH | 0.03% | $0.001843 | 2,067.2531 | $3.81 | |
| ETH | 0.03% | $1.49 | 2.5567 | $3.81 | |
| ETH | 0.02% | $0.100404 | 36.7568 | $3.69 | |
| ETH | 0.02% | $1.27 | 2.9 | $3.68 | |
| ETH | 0.02% | $0.177682 | 20.6046 | $3.66 | |
| ETH | 0.02% | $0.280445 | 13.0197 | $3.65 | |
| ETH | 0.02% | $2,074.82 | 0.00175656 | $3.64 | |
| ETH | 0.02% | $0.264314 | 13.7227 | $3.63 | |
| ETH | 0.02% | $0.088183 | 40.3519 | $3.56 | |
| ETH | 0.02% | $76,298 | 0.00004635 | $3.54 | |
| ETH | 0.02% | $0.002491 | 1,410.9567 | $3.51 | |
| ETH | 0.02% | $0.00 | 3.4963 | $0.00 | |
| ETH | 0.02% | $0.005595 | 616.8797 | $3.45 | |
| ETH | 0.02% | $0.004673 | 727.9132 | $3.4 | |
| ETH | 0.02% | $0.006313 | 538.4823 | $3.4 | |
| ETH | 0.02% | $0.126457 | 26.6651 | $3.37 | |
| ETH | 0.02% | $0.000511 | 6,543.5231 | $3.34 | |
| ETH | 0.02% | $0.999836 | 3.3331 | $3.33 | |
| ETH | 0.02% | $0.082348 | 40.324 | $3.32 | |
| ETH | 0.02% | $0.009409 | 340.4377 | $3.2 | |
| ETH | 0.02% | $0.004273 | 749.4449 | $3.2 | |
| ETH | 0.02% | $0.428656 | 7.451 | $3.19 | |
| ETH | 0.02% | $0.226577 | 13.9711 | $3.17 | |
| ETH | 0.02% | $0.016262 | 187.3267 | $3.05 | |
| ETH | 0.02% | $1.01 | 3.021 | $3.04 | |
| ETH | 0.02% | $0.006434 | 471.5191 | $3.03 | |
| ETH | 0.02% | $0.001398 | 2,170.2149 | $3.03 | |
| ETH | 0.02% | <$0.000001 | 16,740,283.5583 | $3.01 | |
| ETH | 0.02% | $0.999518 | 2.9028 | $2.9 | |
| ETH | 0.02% | $0.126968 | 22.1576 | $2.81 | |
| ETH | 0.02% | $0.041583 | 67.2484 | $2.8 | |
| ETH | 0.02% | $0.126232 | 22.0635 | $2.79 | |
| ETH | 0.02% | $1.28 | 2.1562 | $2.76 | |
| ETH | 0.02% | $0.080869 | 34.0565 | $2.75 | |
| ETH | 0.02% | $0.000758 | 3,623.7792 | $2.75 | |
| ETH | 0.02% | $0.58834 | 4.6454 | $2.73 | |
| ETH | 0.02% | $0.997643 | 2.725 | $2.72 | |
| ETH | 0.02% | $2.41 | 1.1265 | $2.71 | |
| ETH | 0.02% | $0.000004 | 647,861.4101 | $2.7 | |
| ETH | 0.02% | $2,019.46 | 0.00133558 | $2.7 | |
| ETH | 0.02% | $0.017599 | 150.1519 | $2.64 | |
| ETH | 0.02% | $0.131882 | 19.6964 | $2.6 | |
| ETH | 0.02% | $1.64 | 1.5681 | $2.57 | |
| ETH | 0.02% | $1.22 | 2.0958 | $2.56 | |
| ETH | 0.02% | $0.009394 | 270.6885 | $2.54 | |
| ETH | 0.02% | $2,323.98 | 0.00106822 | $2.48 | |
| ETH | 0.02% | $0.219722 | 11.2638 | $2.47 | |
| ETH | 0.02% | $1.5 | 1.6257 | $2.44 | |
| ETH | 0.02% | $0.000494 | 4,894.1655 | $2.42 | |
| ETH | 0.02% | $0.025226 | 95.1282 | $2.4 | |
| ETH | 0.02% | $2,192.15 | 0.00107722 | $2.36 | |
| ETH | 0.02% | $0.065641 | 35.9292 | $2.36 | |
| ETH | 0.02% | $0.577865 | 3.9619 | $2.29 | |
| ETH | 0.02% | $4,996.92 | 0.000457 | $2.28 | |
| ETH | 0.02% | $0.526872 | 4.2548 | $2.24 | |
| ETH | 0.01% | $0.285438 | 7.8377 | $2.24 | |
| ETH | 0.01% | $0.195847 | 11.3506 | $2.22 | |
| ETH | 0.01% | $0.002897 | 766.5087 | $2.22 | |
| ETH | 0.01% | $1.17 | 1.8865 | $2.21 | |
| ETH | 0.01% | $2,533.88 | 0.00087076 | $2.21 | |
| ETH | 0.01% | $2,320.58 | 0.00094749 | $2.2 | |
| ETH | 0.01% | $0.999151 | 2.1072 | $2.11 | |
| ETH | 0.01% | $0.000004 | 488,097.4045 | $2.09 | |
| ETH | 0.01% | $0.001699 | 1,227.7982 | $2.09 | |
| ETH | 0.01% | $2,257.29 | 0.00091848 | $2.07 | |
| ETH | 0.01% | $0.000002 | 1,111,067.3001 | $2.04 | |
| ETH | 0.01% | $0.091571 | 22.3012 | $2.04 | |
| ETH | 0.01% | $76,043 | 0.00002681 | $2.04 | |
| ETH | 0.01% | $1.27 | 1.6009 | $2.03 | |
| ETH | 0.01% | $0.000006 | 321,592.7388 | $2.03 | |
| ETH | 0.01% | $1 | 2.0095 | $2.01 | |
| ETH | 0.01% | $0.008667 | 228.8701 | $1.98 | |
| ETH | 0.01% | $0.000034 | 58,088.5383 | $1.96 | |
| ETH | 0.01% | $1.72 | 1.1358 | $1.95 | |
| ETH | 0.01% | $0.039033 | 49.3665 | $1.93 | |
| ETH | 0.01% | $0.654832 | 2.9017 | $1.9 | |
| ETH | 0.01% | <$0.000001 | 900,871,969.5973 | $1.87 | |
| ETH | 0.01% | $0.078169 | 23.5718 | $1.84 | |
| ETH | 0.01% | $0.033515 | 54.7772 | $1.84 | |
| ETH | 0.01% | $0.015343 | 114.717 | $1.76 | |
| ETH | 0.01% | $58,411 | 0.00002968 | $1.73 | |
| ETH | 0.01% | $0.004331 | 398.5125 | $1.73 | |
| ETH | 0.01% | $0.069178 | 24.8915 | $1.72 | |
| ETH | 0.01% | $0.011748 | 146.5182 | $1.72 | |
| ETH | 0.01% | $0.007674 | 224.3115 | $1.72 | |
| ETH | 0.01% | $0.000413 | 4,159.3201 | $1.72 | |
| ETH | 0.01% | $0.017292 | 99.2529 | $1.72 | |
| ETH | 0.01% | $3.68 | 0.4635 | $1.71 | |
| ETH | 0.01% | $0.009071 | 187.731 | $1.7 | |
| ETH | 0.01% | $0.000607 | 2,803.2041 | $1.7 | |
| ETH | 0.01% | $1.39 | 1.2215 | $1.7 | |
| ETH | 0.01% | $0.004353 | 389.7623 | $1.7 | |
| ETH | 0.01% | $0.021609 | 76.5873 | $1.65 | |
| ETH | 0.01% | $130.4 | 0.0126 | $1.64 | |
| ETH | 0.01% | $0.00249 | 642.8508 | $1.6 | |
| ETH | 0.01% | $0.007673 | 205.8714 | $1.58 | |
| ETH | 0.01% | <$0.000001 | 45,253,255.2503 | $1.58 | |
| ETH | 0.01% | $1,629.54 | 0.00096089 | $1.57 | |
| ETH | 0.01% | <$0.000001 | 3,252,712,853.4842 | $1.56 | |
| ETH | 0.01% | $0.004881 | 319.6707 | $1.56 | |
| ETH | 0.01% | $0.000007 | 229,543.0592 | $1.56 | |
| ETH | 0.01% | $0.135034 | 11.5277 | $1.56 | |
| ETH | 0.01% | $0.000081 | 19,025.0775 | $1.55 | |
| ETH | 0.01% | $0.002749 | 558.268 | $1.53 | |
| ETH | 0.01% | $0.000726 | 2,095.2312 | $1.52 | |
| ETH | <0.01% | $0.078316 | 18.8454 | $1.48 | |
| ETH | <0.01% | $0.015806 | 92.1133 | $1.46 | |
| ETH | <0.01% | $75.55 | 0.0191 | $1.44 | |
| ETH | <0.01% | $3.26 | 0.4428 | $1.44 | |
| ETH | <0.01% | $0.002985 | 481.4325 | $1.44 | |
| ETH | <0.01% | $0.011639 | 121.3083 | $1.41 | |
| ETH | <0.01% | $0.005787 | 242.9883 | $1.41 | |
| ETH | <0.01% | <$0.000001 | 830,226,494.5198 | $1.4 | |
| ETH | <0.01% | $0.000004 | 374,758.0849 | $1.39 | |
| ETH | <0.01% | $0.025685 | 53.5906 | $1.38 | |
| ETH | <0.01% | $20.6 | 0.0654 | $1.35 | |
| ETH | <0.01% | $1 | 1.3342 | $1.33 | |
| ETH | <0.01% | $0.044482 | 29.9638 | $1.33 | |
| ETH | <0.01% | $0.005319 | 249.9421 | $1.33 | |
| ETH | <0.01% | $0.000226 | 5,814.8948 | $1.31 | |
| ETH | <0.01% | $0.025078 | 51.8631 | $1.3 | |
| ETH | <0.01% | <$0.000001 | 4,334,783,549.8398 | $1.29 | |
| ETH | <0.01% | $103.18 | 0.0125 | $1.29 | |
| ETH | <0.01% | $0.000004 | 288,024.3508 | $1.29 | |
| ETH | <0.01% | $0.65649 | 1.9252 | $1.26 | |
| ETH | <0.01% | $0.463307 | 2.7271 | $1.26 | |
| ETH | <0.01% | $0.00079 | 1,595.8977 | $1.26 | |
| ETH | <0.01% | $0.00 | 297.4814 | $0.00 | |
| ETH | <0.01% | $0.141222 | 8.7596 | $1.24 | |
| ETH | <0.01% | $0.010364 | 115.4766 | $1.2 | |
| ETH | <0.01% | $0.000397 | 3,009.8509 | $1.2 | |
| ETH | <0.01% | $0.027503 | 42.6384 | $1.17 | |
| ETH | <0.01% | $2.72 | 0.4305 | $1.17 | |
| ETH | <0.01% | $16.11 | 0.0726 | $1.17 | |
| ETH | <0.01% | $0.011718 | 98.8283 | $1.16 | |
| ETH | <0.01% | $0.118872 | 9.7065 | $1.15 | |
| ETH | <0.01% | $71,099 | 0.0000161 | $1.14 | |
| ETH | <0.01% | $0.005494 | 206.8189 | $1.14 | |
| ETH | <0.01% | $1.3 | 0.8716 | $1.13 | |
| ETH | <0.01% | $0.032578 | 34.7605 | $1.13 | |
| ETH | <0.01% | $0.084539 | 13.2598 | $1.12 | |
| ETH | <0.01% | $0.00 | 12.7431 | $0.00 | |
| ETH | <0.01% | $0.120274 | 9.166 | $1.1 | |
| ETH | <0.01% | $0.13757 | 7.9497 | $1.09 | |
| ETH | <0.01% | $1.09 | 0.9831 | $1.07 | |
| ETH | <0.01% | $0.000005 | 229,735.2478 | $1.06 | |
| ETH | <0.01% | $0.346561 | 3.0451 | $1.06 | |
| ETH | <0.01% | $0.016725 | 62.0293 | $1.04 | |
| ETH | <0.01% | $633.19 | 0.00160849 | $1.02 | |
| ETH | <0.01% | $1.7 | 0.5968 | $1.01 | |
| ETH | <0.01% | $0.00112 | 905.5697 | $1.01 | |
| ETH | <0.01% | $0.000012 | 85,275.7223 | $1.01 | |
| ETH | <0.01% | $0.987575 | 1.0114 | $0.9988 | |
| ETH | <0.01% | $0.063594 | 15.2716 | $0.9711 | |
| ETH | <0.01% | $0.05577 | 17.3355 | $0.9668 | |
| ETH | <0.01% | <$0.000001 | 3,268,861.1918 | $0.9667 | |
| ETH | <0.01% | $0.002104 | 459.2943 | $0.9663 | |
| ETH | <0.01% | $0.49103 | 1.9637 | $0.9642 | |
| ETH | <0.01% | $0.120429 | 7.9878 | $0.9619 | |
| ETH | <0.01% | $0.018445 | 51.4421 | $0.9488 | |
| ETH | <0.01% | $0.001576 | 596.4761 | $0.9403 | |
| ETH | <0.01% | $0.078116 | 11.8482 | $0.9255 | |
| ETH | <0.01% | $0.147029 | 6.2332 | $0.9164 | |
| ETH | <0.01% | $0.00189 | 483.8816 | $0.9143 | |
| ETH | <0.01% | $13.01 | 0.0699 | $0.9091 | |
| ETH | <0.01% | <$0.000001 | 17,088,802,944.9303 | $0.9006 | |
| ETH | <0.01% | $76,317 | 0.00001173 | $0.8948 | |
| ETH | <0.01% | $10.06 | 0.0889 | $0.894 | |
| ETH | <0.01% | $0.002447 | 363.298 | $0.8889 | |
| ETH | <0.01% | $0.001799 | 493.6536 | $0.8881 | |
| ETH | <0.01% | $0.068851 | 12.8674 | $0.8859 | |
| ETH | <0.01% | $1.27 | 0.6765 | $0.859 | |
| ETH | <0.01% | $0.042165 | 20.1849 | $0.851 | |
| ETH | <0.01% | $0.028807 | 29.5231 | $0.8504 | |
| ETH | <0.01% | $0.00947 | 89.7314 | $0.8497 | |
| ETH | <0.01% | $130.4 | 0.00651025 | $0.8489 | |
| ETH | <0.01% | $3.68 | 0.2303 | $0.8476 | |
| ETH | <0.01% | $1.34 | 0.631 | $0.8455 | |
| ETH | <0.01% | $0.005074 | 164.9523 | $0.8369 | |
| ETH | <0.01% | $0.000001 | 808,933.0152 | $0.8332 | |
| ETH | <0.01% | <$0.000001 | 8,254,770.3524 | $0.8306 | |
| ETH | <0.01% | $0.002585 | 316.3111 | $0.8175 | |
| ETH | <0.01% | $6.95 | 0.1163 | $0.8083 | |
| ETH | <0.01% | $0.002586 | 307.9326 | $0.7963 | |
| ETH | <0.01% | $0.025503 | 30.8308 | $0.7862 | |
| ETH | <0.01% | $1.06 | 0.7368 | $0.7832 | |
| ETH | <0.01% | $0.000236 | 3,311.7352 | $0.7815 | |
| ETH | <0.01% | $0.00 | 1.7706 | $0.00 | |
| ETH | <0.01% | $0.001452 | 534.8034 | $0.7762 | |
| ETH | <0.01% | $0.003001 | 258.2447 | $0.7749 | |
| ETH | <0.01% | $2,639.96 | 0.00029338 | $0.7745 | |
| ETH | <0.01% | $0.645201 | 1.1943 | $0.7705 | |
| ETH | <0.01% | $0.039357 | 19.3639 | $0.762 | |
| ETH | <0.01% | <$0.000001 | 1,919,642.4287 | $0.7608 | |
| ETH | <0.01% | $0.116235 | 6.488 | $0.7541 | |
| ETH | <0.01% | $0.001163 | 645.6715 | $0.7511 | |
| ETH | <0.01% | $0.040081 | 18.7145 | $0.75 | |
| ETH | <0.01% | $0.022211 | 32.9396 | $0.7316 | |
| ETH | <0.01% | $0.006905 | 105.3169 | $0.7272 | |
| ETH | <0.01% | <$0.000001 | 36,339,346.4125 | $0.7242 | |
| ETH | <0.01% | $0.022139 | 32.0023 | $0.7084 | |
| ETH | <0.01% | $0.001331 | 524.045 | $0.6976 | |
| ETH | <0.01% | $0.256966 | 2.7134 | $0.6972 | |
| ETH | <0.01% | $0.00047 | 1,476.5198 | $0.6939 | |
| ETH | <0.01% | $0.018509 | 36.341 | $0.6726 | |
| ETH | <0.01% | $8.66 | 0.0773 | $0.6694 | |
| ETH | <0.01% | $2,449.67 | 0.00027321 | $0.6692 | |
| ETH | <0.01% | $0.016481 | 40.3149 | $0.6644 | |
| ETH | <0.01% | $4.54 | 0.1461 | $0.6631 | |
| ETH | <0.01% | $2,070.02 | 0.00031835 | $0.6589 | |
| ETH | <0.01% | $0.017463 | 37.0976 | $0.6478 | |
| ETH | <0.01% | $0.003468 | 184.7129 | $0.6406 | |
| ETH | <0.01% | $0.000009 | 70,452.5508 | $0.6319 | |
| ETH | <0.01% | $0.010296 | 61.2979 | $0.6311 | |
| ETH | <0.01% | $0.023739 | 26.421 | $0.6272 | |
| ETH | <0.01% | $0.022126 | 27.6426 | $0.6116 | |
| ETH | <0.01% | $0.004291 | 139.3788 | $0.598 | |
| ETH | <0.01% | <$0.000001 | 2,071,156.8227 | $0.5934 | |
| ETH | <0.01% | $8.42 | 0.07 | $0.5891 | |
| ETH | <0.01% | $0.000249 | 2,280.9611 | $0.5679 | |
| ETH | <0.01% | $0.005335 | 106.2072 | $0.5666 | |
| ETH | <0.01% | $0.008142 | 69.4213 | $0.5652 | |
| ETH | <0.01% | $0.000043 | 12,994.057 | $0.5645 | |
| ETH | <0.01% | $0.059602 | 9.3894 | $0.5596 | |
| ETH | <0.01% | $0.04705 | 11.8775 | $0.5588 | |
| ETH | <0.01% | $0.000472 | 1,172.4076 | $0.5538 | |
| ETH | <0.01% | $0.166238 | 3.323 | $0.5524 | |
| ETH | <0.01% | $0.001542 | 357.9274 | $0.5519 | |
| ETH | <0.01% | $0.022341 | 24.598 | $0.5495 | |
| ETH | <0.01% | $0.000012 | 43,768.2681 | $0.5422 | |
| ETH | <0.01% | $2,159.48 | 0.00024879 | $0.5372 | |
| ETH | <0.01% | $1.92 | 0.2796 | $0.5367 | |
| ETH | <0.01% | $0.001322 | 397.4208 | $0.5255 | |
| ETH | <0.01% | $0.081034 | 6.3369 | $0.5135 | |
| ETH | <0.01% | $0.063466 | 8.082 | $0.5129 | |
| ETH | <0.01% | $0.277138 | 1.8428 | $0.5107 | |
| ETH | <0.01% | <$0.000001 | 63,178,444.2137 | $0.4995 | |
| ETH | <0.01% | $0.240726 | 2.0722 | $0.4988 | |
| ETH | <0.01% | $0.107284 | 4.6366 | $0.4974 | |
| ETH | <0.01% | $0.00 | 0.194 | $0.00 | |
| ETH | <0.01% | $0.15289 | 3.182 | $0.4864 | |
| ETH | <0.01% | $0.229836 | 2.1083 | $0.4845 | |
| ETH | <0.01% | $0.022396 | 21.6337 | $0.4845 | |
| ETH | <0.01% | $4.05 | 0.1165 | $0.4718 | |
| ETH | <0.01% | $0.000016 | 28,974.3285 | $0.469 | |
| ETH | <0.01% | $0.00153 | 304.0581 | $0.4652 | |
| ETH | <0.01% | $0.000687 | 671.1744 | $0.4612 | |
| ETH | <0.01% | $0.004175 | 109.5698 | $0.4574 | |
| ETH | <0.01% | $0.116039 | 3.9211 | $0.4549 | |
| ETH | <0.01% | $3.46 | 0.1314 | $0.4544 | |
| ETH | <0.01% | $0.004898 | 92.5985 | $0.4535 | |
| ETH | <0.01% | $0.010644 | 42.4689 | $0.452 | |
| ETH | <0.01% | $0.999705 | 0.4499 | $0.4497 | |
| ETH | <0.01% | $0.000001 | 545,937.1766 | $0.4456 | |
| ETH | <0.01% | $0.206805 | 2.1369 | $0.4419 | |
| ETH | <0.01% | $1.18 | 0.3732 | $0.4403 | |
| ETH | <0.01% | $0.023442 | 18.6639 | $0.4375 | |
| ETH | <0.01% | $0.010013 | 43.0276 | $0.4308 | |
| ETH | <0.01% | $0.004968 | 86.0011 | $0.4272 | |
| ETH | <0.01% | $0.028509 | 14.7069 | $0.4192 | |
| ETH | <0.01% | $0.000565 | 738.6003 | $0.4171 | |
| ETH | <0.01% | $0.000043 | 9,626.8253 | $0.4158 | |
| ETH | <0.01% | $0.010462 | 39.5485 | $0.4137 | |
| ETH | <0.01% | $0.022692 | 17.8139 | $0.4042 | |
| ETH | <0.01% | $0.000149 | 2,717.8443 | $0.404 | |
| ETH | <0.01% | $0.00088 | 456.2702 | $0.4016 | |
| ETH | <0.01% | $0.038217 | 10.4824 | $0.4006 | |
| ETH | <0.01% | $0.000271 | 1,460.8258 | $0.3964 | |
| ETH | <0.01% | $0.010324 | 38.0053 | $0.3923 | |
| ETH | <0.01% | $0.00 | 23.649 | $0.00 | |
| ETH | <0.01% | $1.18 | 0.3313 | $0.3908 | |
| ETH | <0.01% | $0.075955 | 5.1371 | $0.3901 | |
| ETH | <0.01% | $0.005877 | 66.3101 | $0.3897 | |
| ETH | <0.01% | $0.000391 | 989.2539 | $0.3868 | |
| ETH | <0.01% | $1.07 | 0.3536 | $0.3765 | |
| ETH | <0.01% | $0.007686 | 47.5477 | $0.3654 | |
| ETH | <0.01% | <$0.000001 | 1,847,683.8861 | $0.3564 | |
| ETH | <0.01% | <$0.000001 | 3,213,163.125 | $0.3562 | |
| ETH | <0.01% | $0.033303 | 10.5488 | $0.3513 | |
| ETH | <0.01% | $0.000021 | 17,043.3707 | $0.3499 | |
| ETH | <0.01% | $0.301371 | 1.1566 | $0.3485 | |
| ETH | <0.01% | $1 | 0.3477 | $0.3479 | |
| ETH | <0.01% | $1.11 | 0.3108 | $0.345 | |
| ETH | <0.01% | $0.00926 | 36.716 | $0.34 | |
| ETH | <0.01% | $0.000085 | 3,901.5389 | $0.333 | |
| ETH | <0.01% | $0.000695 | 473.4722 | $0.3289 | |
| ETH | <0.01% | $0.202993 | 1.6157 | $0.3279 | |
| ETH | <0.01% | $0.002229 | 146.6913 | $0.327 | |
| ETH | <0.01% | $198.48 | 0.00163047 | $0.3236 | |
| ETH | <0.01% | <$0.000001 | 1,893,802,615.6313 | $0.3219 | |
| ETH | <0.01% | $0.066807 | 4.796 | $0.3204 | |
| ETH | <0.01% | $0.002184 | 146.1178 | $0.3191 | |
| ETH | <0.01% | $0.007255 | 42.3917 | $0.3075 | |
| ETH | <0.01% | $0.999492 | 0.3051 | $0.3049 | |
| ETH | <0.01% | $0.23027 | 1.3167 | $0.3031 | |
| ETH | <0.01% | $2,027.17 | 0.00014938 | $0.3028 | |
| ETH | <0.01% | $0.000196 | 1,535.0823 | $0.3002 | |
| ETH | <0.01% | $0.006491 | 46.0048 | $0.2986 | |
| ETH | <0.01% | $0.018086 | 16.474 | $0.2979 | |
| ETH | <0.01% | $0.003628 | 82.0368 | $0.2976 | |
| ETH | <0.01% | $0.083105 | 3.5731 | $0.2969 | |
| ETH | <0.01% | $257.32 | 0.0011462 | $0.2949 | |
| ETH | <0.01% | $0.000081 | 3,611.9411 | $0.2929 | |
| ETH | <0.01% | $0.252058 | 1.1387 | $0.287 | |
| ETH | <0.01% | <$0.000001 | 1,084,228.322 | $0.2848 | |
| ETH | <0.01% | $0.308551 | 0.921 | $0.2841 | |
| ETH | <0.01% | $1 | 0.2829 | $0.284 | |
| ETH | <0.01% | $76,077 | 0.00000371 | $0.2822 | |
| ETH | <0.01% | $0.999736 | 0.28 | $0.2799 | |
| ETH | <0.01% | $0.005634 | 49.4865 | $0.2788 | |
| ETH | <0.01% | $0.101862 | 2.7029 | $0.2753 | |
| ETH | <0.01% | $0.000061 | 4,324.3905 | $0.2653 | |
| ETH | <0.01% | $0.053067 | 4.9645 | $0.2634 | |
| ETH | <0.01% | $0.000001 | 241,633.6391 | $0.2609 | |
| ETH | <0.01% | $0.00025 | 1,043.423 | $0.2604 | |
| ETH | <0.01% | $0.003093 | 84.131 | $0.2602 | |
| ETH | <0.01% | $2,407.09 | 0.00010628 | $0.2558 | |
| ETH | <0.01% | $0.062218 | 4.0112 | $0.2495 | |
| ETH | <0.01% | $0.002612 | 94.3666 | $0.2465 | |
| ETH | <0.01% | $0.00 | 0.7361 | $0.00 | |
| ETH | <0.01% | $0.000206 | 1,186.6228 | $0.2448 | |
| ETH | <0.01% | $0.040277 | 6.0135 | $0.2422 | |
| ETH | <0.01% | $0.005824 | 41.5546 | $0.242 | |
| ETH | <0.01% | $0.999213 | 0.2402 | $0.24 | |
| ETH | <0.01% | $0.001228 | 193.7992 | $0.238 | |
| ETH | <0.01% | $0.002301 | 103.4328 | $0.2379 | |
| ETH | <0.01% | $0.99195 | 0.2367 | $0.2348 | |
| ETH | <0.01% | $0.00 | 0.2326 | $0.00 | |
| ETH | <0.01% | $0.012539 | 18.4521 | $0.2313 | |
| ETH | <0.01% | $0.174625 | 1.3209 | $0.2306 | |
| ETH | <0.01% | $0.000183 | 1,252.4211 | $0.2295 | |
| ETH | <0.01% | $0.004187 | 54.7087 | $0.229 | |
| ETH | <0.01% | <$0.000001 | 512,774,337.321 | $0.2287 | |
| ETH | <0.01% | $0.000075 | 3,035.867 | $0.2279 | |
| ETH | <0.01% | $0.034559 | 6.5519 | $0.2264 | |
| ETH | <0.01% | <$0.000001 | 504,009.1289 | $0.2253 | |
| ETH | <0.01% | $0.008049 | 27.905 | $0.2246 | |
| ETH | <0.01% | $0.00131 | 171.0234 | $0.224 | |
| ETH | <0.01% | $0.991851 | 0.2251 | $0.2232 | |
| ETH | <0.01% | $0.003274 | 67.8102 | $0.222 | |
| ETH | <0.01% | $0.00444 | 49.7661 | $0.2209 | |
| ETH | <0.01% | $0.000081 | 2,715.4108 | $0.2207 | |
| ETH | <0.01% | $0.125509 | 1.7501 | $0.2196 | |
| ETH | <0.01% | $0.000001 | 291,967.1474 | $0.2169 | |
| ETH | <0.01% | $0.099175 | 2.146 | $0.2128 | |
| ETH | <0.01% | <$0.000001 | 3,295,116.7655 | $0.2112 | |
| ETH | <0.01% | <$0.000001 | 4,350,374.2136 | $0.1952 | |
| ETH | <0.01% | <$0.000001 | 4,490,111.4711 | $0.1925 | |
| ETH | <0.01% | $0.017245 | 11.1399 | $0.1921 | |
| ETH | <0.01% | $0.002052 | 93.294 | $0.1914 | |
| ETH | <0.01% | $0.094603 | 2.0088 | $0.19 | |
| ETH | <0.01% | $0.000011 | 16,452.0617 | $0.1839 | |
| ETH | <0.01% | $0.000334 | 538.0173 | $0.1799 | |
| ETH | <0.01% | $0.003547 | 50.5701 | $0.1793 | |
| ETH | <0.01% | $0.028795 | 6.1713 | $0.1777 | |
| ETH | <0.01% | $0.076512 | 2.2926 | $0.1754 | |
| ETH | <0.01% | $0.153418 | 1.1324 | $0.1737 | |
| ETH | <0.01% | $2.41 | 0.0711 | $0.1712 | |
| ETH | <0.01% | $0.000017 | 10,013.5173 | $0.1703 | |
| ETH | <0.01% | $0.010929 | 15.5398 | $0.1698 | |
| ETH | <0.01% | $0.000154 | 1,099.0009 | $0.1695 | |
| ETH | <0.01% | $1.52 | 0.1113 | $0.1691 | |
| ETH | <0.01% | <$0.000001 | 1,523,952.9859 | $0.1688 | |
| ETH | <0.01% | $0.005181 | 32.4811 | $0.1682 | |
| ETH | <0.01% | $0.007293 | 22.7946 | $0.1662 | |
| ETH | <0.01% | $2,415.91 | 0.0000682 | $0.1647 | |
| ETH | <0.01% | $0.043384 | 3.7655 | $0.1633 | |
| ETH | <0.01% | $0.034904 | 4.647 | $0.1621 | |
| ETH | <0.01% | $0.000064 | 2,532.393 | $0.1609 | |
| ETH | <0.01% | <$0.000001 | 1,926,114.0111 | $0.1602 | |
| ETH | <0.01% | $0.170748 | 0.9145 | $0.1561 | |
| ETH | <0.01% | $0.001577 | 98.864 | $0.1559 | |
| ETH | <0.01% | $0.003882 | 40.0664 | $0.1555 | |
| ETH | <0.01% | $0.120128 | 1.2871 | $0.1546 | |
| ETH | <0.01% | <$0.000001 | 395,375.8681 | $0.1541 | |
| ETH | <0.01% | $0.00 | 1.7264 | $0.00 | |
| ETH | <0.01% | $0.203985 | 0.728 | $0.1484 | |
| ETH | <0.01% | $0.018221 | 8.1223 | $0.1479 | |
| ETH | <0.01% | $0.000697 | 209.235 | $0.1457 | |
| ETH | <0.01% | $0.005721 | 24.6662 | $0.1411 | |
| ETH | <0.01% | $0.012239 | 11.4176 | $0.1397 | |
| ETH | <0.01% | $0.000929 | 149.6616 | $0.1389 | |
| ETH | <0.01% | $0.286534 | 0.4767 | $0.1365 | |
| ETH | <0.01% | $0.000015 | 9,066.2809 | $0.135 | |
| ETH | <0.01% | $0.000004 | 33,663.5419 | $0.1343 | |
| ETH | <0.01% | <$0.000001 | 1,053,209.6972 | $0.1337 | |
| ETH | <0.01% | <$0.000001 | 2,088,342,798.8958 | $0.1311 | |
| ETH | <0.01% | $0.000016 | 8,394.4536 | $0.1307 | |
| ETH | <0.01% | $0.007097 | 18.2945 | $0.1298 | |
| ETH | <0.01% | $0.001138 | 113.8509 | $0.1296 | |
| ETH | <0.01% | $0.000002 | 59,995.084 | $0.1277 | |
| ETH | <0.01% | $0.005154 | 24.742 | $0.1275 | |
| ETH | <0.01% | $0.038591 | 3.2868 | $0.1268 | |
| ETH | <0.01% | $0.334114 | 0.3693 | $0.1233 | |
| ETH | <0.01% | $0.042259 | 2.8659 | $0.1211 | |
| ETH | <0.01% | <$0.000001 | 1,824,841,896.8463 | $0.1192 | |
| ETH | <0.01% | $0.016993 | 7.0032 | $0.119 | |
| ETH | <0.01% | $0.000007 | 16,361.3517 | $0.1173 | |
| ETH | <0.01% | $0.004289 | 27.2811 | $0.117 | |
| ETH | <0.01% | $0.000166 | 704.4191 | $0.1167 | |
| ETH | <0.01% | <$0.000001 | 5,826,154.6877 | $0.1154 | |
| ETH | <0.01% | $0.001952 | 58.9324 | $0.115 | |
| ETH | <0.01% | $1.35 | 0.085 | $0.1147 | |
| ETH | <0.01% | $0.001712 | 66.2328 | $0.1133 | |
| ETH | <0.01% | $0.000082 | 1,382.9608 | $0.1132 | |
| ETH | <0.01% | $0.0003 | 355.7013 | $0.1065 | |
| ETH | <0.01% | $0.002796 | 37.8184 | $0.1057 | |
| ETH | <0.01% | <$0.000001 | 14,813,812.586 | $0.1041 | |
| ETH | <0.01% | $0.105481 | 0.9563 | $0.1008 | |
| BASE | 0.11% | $0.998334 | 16.4867 | $16.46 | |
| BASE | 0.11% | $0.019895 | 800 | $15.92 | |
| BASE | 0.10% | $2,084.12 | 0.00687142 | $14.32 | |
| BASE | 0.05% | $0.999931 | 7.5889 | $7.59 | |
| BASE | 0.02% | $0.096387 | 26.6429 | $2.57 | |
| BASE | 0.01% | $0.000699 | 2,713.2169 | $1.9 | |
| BASE | 0.01% | $2.86 | 0.5494 | $1.57 | |
| BASE | <0.01% | $0.998376 | 1.3887 | $1.39 | |
| BASE | <0.01% | $2,334.81 | 0.00057274 | $1.34 | |
| BASE | <0.01% | $130.4 | 0.0102 | $1.33 | |
| BASE | <0.01% | $2,263.38 | 0.00051441 | $1.16 | |
| BASE | <0.01% | $1.04 | 1.058 | $1.1 | |
| BASE | <0.01% | $0.999828 | 1.0521 | $1.05 | |
| BASE | <0.01% | $1.32 | 0.6833 | $0.9018 | |
| BASE | <0.01% | $0.001227 | 639.3655 | $0.7847 | |
| BASE | <0.01% | $0.138584 | 5.2402 | $0.7262 | |
| BASE | <0.01% | $1.34 | 0.4745 | $0.6358 | |
| BASE | <0.01% | $0.01661 | 34.8416 | $0.5787 | |
| BASE | <0.01% | $0.284884 | 2.0305 | $0.5784 | |
| BASE | <0.01% | $76,331 | 0.00000694 | $0.5297 | |
| BASE | <0.01% | $0.033209 | 15.6083 | $0.5183 | |
| BASE | <0.01% | $0.001046 | 491.4602 | $0.5141 | |
| BASE | <0.01% | <$0.000001 | 3,558,878.2682 | $0.4829 | |
| BASE | <0.01% | $0.000401 | 1,165.4763 | $0.4677 | |
| BASE | <0.01% | $0.787815 | 0.5816 | $0.4581 | |
| BASE | <0.01% | $0.000001 | 743,500 | $0.4475 | |
| BASE | <0.01% | $143.92 | 0.00291875 | $0.42 | |
| BASE | <0.01% | $2,150.72 | 0.00018797 | $0.4042 | |
| BASE | <0.01% | <$0.000001 | 2,132,025.7236 | $0.3933 | |
| BASE | <0.01% | $1 | 0.3745 | $0.3748 | |
| BASE | <0.01% | $0.000043 | 8,340.9486 | $0.3625 | |
| BASE | <0.01% | $0.025595 | 12.7057 | $0.3252 | |
| BASE | <0.01% | $0.324107 | 0.9931 | $0.3218 | |
| BASE | <0.01% | $0.999835 | 0.3035 | $0.3034 | |
| BASE | <0.01% | $0.000244 | 1,199.1053 | $0.2919 | |
| BASE | <0.01% | <$0.000001 | 1,570,790.7245 | $0.2821 | |
| BASE | <0.01% | $1.07 | 0.2635 | $0.2811 | |
| BASE | <0.01% | $0.000004 | 67,748.6395 | $0.281 | |
| BASE | <0.01% | $1.92 | 0.1405 | $0.2698 | |
| BASE | <0.01% | $0.000003 | 85,620.0437 | $0.2662 | |
| BASE | <0.01% | $1.18 | 0.2185 | $0.2577 | |
| BASE | <0.01% | $0.008655 | 28.6692 | $0.2481 | |
| BASE | <0.01% | <$0.000001 | 4,380,983.3049 | $0.2392 | |
| BASE | <0.01% | $0.044482 | 5.3103 | $0.2362 | |
| BASE | <0.01% | $0.008506 | 27.3916 | $0.2329 | |
| BASE | <0.01% | $0.090348 | 2.5256 | $0.2281 | |
| BASE | <0.01% | $2,404.18 | 0.00009482 | $0.2279 | |
| BASE | <0.01% | $1.09 | 0.2076 | $0.2252 | |
| BASE | <0.01% | $0.028455 | 7.3438 | $0.2089 | |
| BASE | <0.01% | $0.532513 | 0.383 | $0.2039 | |
| BASE | <0.01% | $0.00349 | 55.4954 | $0.1936 | |
| BASE | <0.01% | $0.020246 | 9.5591 | $0.1935 | |
| BASE | <0.01% | $6.49 | 0.0297 | $0.1927 | |
| BASE | <0.01% | $0.264911 | 0.7224 | $0.1913 | |
| BASE | <0.01% | $0.999151 | 0.1866 | $0.1864 | |
| BASE | <0.01% | $0.001456 | 125.0665 | $0.182 | |
| BASE | <0.01% | $1.59 | 0.1022 | $0.1625 | |
| BASE | <0.01% | $0.494696 | 0.3132 | $0.1549 | |
| BASE | <0.01% | $0.681078 | 0.2269 | $0.1545 | |
| BASE | <0.01% | $0.043526 | 3.5138 | $0.1529 | |
| BASE | <0.01% | $0.040081 | 3.7663 | $0.1509 | |
| BASE | <0.01% | <$0.000001 | 18,905,656.4307 | $0.1455 | |
| BASE | <0.01% | $0.004979 | 28.6984 | $0.1428 | |
| BASE | <0.01% | $0.00308 | 45.3441 | $0.1396 | |
| BASE | <0.01% | $0.10775 | 1.183 | $0.1274 | |
| BASE | <0.01% | $1.12 | 0.1132 | $0.1267 | |
| BASE | <0.01% | $0.126968 | 0.9854 | $0.1251 | |
| BASE | <0.01% | $2.58 | 0.0484 | $0.1247 | |
| BASE | <0.01% | <$0.000001 | 2,723,568.9972 | $0.1236 | |
| BASE | <0.01% | $0.021652 | 5.6949 | $0.1233 | |
| BASE | <0.01% | $0.025898 | 4.7599 | $0.1232 | |
| BASE | <0.01% | $0.330846 | 0.3655 | $0.1209 | |
| BASE | <0.01% | $0.015104 | 7.9981 | $0.1208 | |
| BASE | <0.01% | $0.999739 | 0.1197 | $0.1197 | |
| BASE | <0.01% | $0.109295 | 1.0071 | $0.11 | |
| BASE | <0.01% | $1.18 | 0.0909 | $0.1072 | |
| BASE | <0.01% | $0.106739 | 0.9997 | $0.1067 | |
| BASE | <0.01% | $0.017245 | 6.1562 | $0.1061 | |
| BASE | <0.01% | $0.006209 | 16.8138 | $0.1044 | |
| BASE | <0.01% | $0.079306 | 1.2786 | $0.1014 | |
| BASE | <0.01% | $0.099164 | 1.0215 | $0.1012 | |
| UNI | 0.20% | $0.998295 | 30.31 | $30.26 | |
| UNI | 0.07% | $2,084.04 | 0.00468926 | $9.77 | |
| UNI | 0.02% | $0.99993 | 3.676 | $3.68 | |
| OP | 0.03% | $2,084.12 | 0.00183762 | $3.83 | |
| OP | <0.01% | $0.9999 | 1.0532 | $1.05 | |
| OP | <0.01% | $0.197924 | 4.6661 | $0.9235 | |
| OP | <0.01% | $130.4 | 0.00540274 | $0.7045 | |
| OP | <0.01% | $0.00 | 7.8707 | $0.00 | |
| OP | <0.01% | $0.999931 | 0.6525 | $0.6524 | |
| OP | <0.01% | $0.015028 | 43.0253 | $0.6465 | |
| OP | <0.01% | $0.00 | 0.4589 | $0.00 | |
| OP | <0.01% | $2,263.38 | 0.00026888 | $0.6085 | |
| OP | <0.01% | $0.999677 | 0.6047 | $0.6045 | |
| OP | <0.01% | $76,114 | 0.00000759 | $0.5777 | |
| OP | <0.01% | $125.49 | 0.00425096 | $0.5334 | |
| OP | <0.01% | $0.999617 | 0.4614 | $0.4612 | |
| OP | <0.01% | $9.08 | 0.0461 | $0.4185 | |
| OP | <0.01% | $3.68 | 0.1047 | $0.3854 | |
| OP | <0.01% | $110,933 | 0.00000347 | $0.3849 | |
| OP | <0.01% | $0.999931 | 0.3417 | $0.3416 | |
| OP | <0.01% | $0.358321 | 0.8314 | $0.2979 | |
| OP | <0.01% | $0.001046 | 282.2401 | $0.2952 | |
| OP | <0.01% | $0.308019 | 0.8514 | $0.2622 | |
| OP | <0.01% | $0.780178 | 0.3256 | $0.254 | |
| OP | <0.01% | $0.99981 | 0.2261 | $0.226 | |
| OP | <0.01% | $2,188.23 | 0.00009834 | $0.2151 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.