This nametag was submitted by Kleros Curate.
APX V2: Trading
Source Code (Proxy)
Latest 25 from a total of 502,826 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Close Trade | 425225180 | 26 mins ago | IN | 0 ETH | 0.00000059 | ||||
| Execute Tp Sl Or... | 425225175 | 26 mins ago | IN | 0.001 ETH | 0.00001482 | ||||
| Batch Request Pr... | 425225007 | 27 mins ago | IN | 0 ETH | 0.00001699 | ||||
| Open Market Trad... | 425224988 | 27 mins ago | IN | 0.00015 ETH | 0.00000953 | ||||
| Execute Tp Sl Or... | 425223677 | 32 mins ago | IN | 0.001 ETH | 0.0000148 | ||||
| Update Trade Tp | 425221979 | 39 mins ago | IN | 0 ETH | 0.00000209 | ||||
| Batch Request Pr... | 425221916 | 40 mins ago | IN | 0 ETH | 0.00001664 | ||||
| Open Market Trad... | 425221900 | 40 mins ago | IN | 0.058 ETH | 0.00000962 | ||||
| Execute Tp Sl Or... | 425221900 | 40 mins ago | IN | 0.001 ETH | 0.00001518 | ||||
| Batch Request Pr... | 425221837 | 40 mins ago | IN | 0 ETH | 0.00001668 | ||||
| Open Market Trad... | 425221820 | 40 mins ago | IN | 0.00015 ETH | 0.00000952 | ||||
| Execute Tp Sl Or... | 425220964 | 44 mins ago | IN | 0.001 ETH | 0.00001363 | ||||
| Batch Request Pr... | 425220930 | 44 mins ago | IN | 0 ETH | 0.00001501 | ||||
| Close Trade | 425220916 | 44 mins ago | IN | 0 ETH | 0.00000413 | ||||
| Batch Request Pr... | 425220905 | 44 mins ago | IN | 0 ETH | 0.0000167 | ||||
| Open Market Trad... | 425220886 | 44 mins ago | IN | 0.00015 ETH | 0.00000959 | ||||
| Execute Tp Sl Or... | 425215746 | 1 hr ago | IN | 0.001 ETH | 0.00001359 | ||||
| Batch Request Pr... | 425215136 | 1 hr ago | IN | 0 ETH | 0.00001912 | ||||
| Open Market Trad... | 425215119 | 1 hr ago | IN | 0.01 ETH | 0.00000919 | ||||
| Update Trade Tp | 425214177 | 1 hr ago | IN | 0 ETH | 0.00000203 | ||||
| Update Trade Tp | 425213910 | 1 hr ago | IN | 0 ETH | 0.00000204 | ||||
| Update Trade Tp | 425213261 | 1 hr ago | IN | 0 ETH | 0.00000208 | ||||
| Update Trade Tp | 425212968 | 1 hr ago | IN | 0 ETH | 0.00000203 | ||||
| Update Trade Tp | 425212915 | 1 hr ago | IN | 0 ETH | 0.00000203 | ||||
| Update Trade Tp | 425211922 | 1 hr ago | IN | 0 ETH | 0.00000203 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 425225175 | 26 mins ago | 0.00012802 ETH | ||||
| 425225175 | 26 mins ago | 0.00012802 ETH | ||||
| 425225175 | 26 mins ago | 0.00099999 ETH | ||||
| 425225175 | 26 mins ago | 1 wei | ||||
| 425225007 | 27 mins ago | 0.00007153 ETH | ||||
| 425225007 | 27 mins ago | 0.00007153 ETH | ||||
| 425225007 | 27 mins ago | 999 wei | ||||
| 425225007 | 27 mins ago | 1 wei | ||||
| 425224988 | 27 mins ago | 0.00015 ETH | ||||
| 425223677 | 32 mins ago | 0.00099999 ETH | ||||
| 425223677 | 32 mins ago | 1 wei | ||||
| 425221916 | 40 mins ago | 0.00007139 ETH | ||||
| 425221916 | 40 mins ago | 0.00007139 ETH | ||||
| 425221916 | 40 mins ago | 999 wei | ||||
| 425221916 | 40 mins ago | 1 wei | ||||
| 425221900 | 40 mins ago | 0.058 ETH | ||||
| 425221900 | 40 mins ago | 0.00012939 ETH | ||||
| 425221900 | 40 mins ago | 0.00012939 ETH | ||||
| 425221900 | 40 mins ago | 0.00099999 ETH | ||||
| 425221900 | 40 mins ago | 1 wei | ||||
| 425221837 | 40 mins ago | 0.00007139 ETH | ||||
| 425221837 | 40 mins ago | 0.00007139 ETH | ||||
| 425221837 | 40 mins ago | 999 wei | ||||
| 425221837 | 40 mins ago | 1 wei | ||||
| 425221820 | 40 mins ago | 0.00015 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ApolloX
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 1000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "../utils/Constants.sol";
import "./libraries/LibDiamond.sol";
import "./interfaces/IDiamondCut.sol";
import "./interfaces/IDiamondLoupe.sol";
import "./libraries/LibAccessControlEnumerable.sol";
contract ApolloX {
constructor(address admin, address deployer, address _diamondCutFacet, address _diamondLoupeFacet, address _init) payable {
LibAccessControlEnumerable.grantRole(Constants.DEFAULT_ADMIN_ROLE, admin);
LibAccessControlEnumerable.grantRole(Constants.DEPLOYER_ROLE, deployer);
// Add the diamondCut external function from the diamondCutFacet
IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](2);
bytes4[] memory functionSelectors = new bytes4[](1);
functionSelectors[0] = IDiamondCut.diamondCut.selector;
cut[0] = IDiamondCut.FacetCut({
facetAddress : _diamondCutFacet,
action : IDiamondCut.FacetCutAction.Add,
functionSelectors : functionSelectors
});
bytes4[] memory loupeFunctionSelectors = new bytes4[](4);
loupeFunctionSelectors[0] = IDiamondLoupe.facets.selector;
loupeFunctionSelectors[1] = IDiamondLoupe.facetAddresses.selector;
loupeFunctionSelectors[2] = IDiamondLoupe.facetAddress.selector;
loupeFunctionSelectors[3] = IDiamondLoupe.facetFunctionSelectors.selector;
cut[1] = IDiamondCut.FacetCut({
facetAddress : _diamondLoupeFacet,
action : IDiamondCut.FacetCutAction.Add,
functionSelectors : loupeFunctionSelectors
});
LibDiamond.diamondCut(cut, _init, abi.encodeWithSignature("init()"));
}
// Find facet for function that is called and execute the
// function if a facet is found and return any value.
fallback() external payable {
LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage();
// get facet from function selector
address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress;
require(facet != address(0), "Diamond: Function does not exist");
// Execute external function from facet using delegatecall and return any value.
assembly {
// copy function selector and any arguments
calldatacopy(0, 0, calldatasize())
// execute function call using the facet
let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)
// get any return value
returndatacopy(0, 0, returndatasize())
// return any return value or error back to the caller
switch result
case 0 {
revert(0, returndatasize())
}
default {
return (0, returndatasize())
}
}
}
receive() external payable {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "../dependencies/ArbSys.sol";
type Price8 is uint64;
type Qty10 is uint80;
type Usd18 is uint96;
library Constants {
ArbSys constant public arbSys = ArbSys(address(100));
/*-------------------------------- Role --------------------------------*/
// 0x0000000000000000000000000000000000000000000000000000000000000000
bytes32 constant DEFAULT_ADMIN_ROLE = 0x00;
// 0xa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775
bytes32 constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
// 0xfc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c
bytes32 constant DEPLOYER_ROLE = keccak256("DEPLOYER_ROLE");
// 0x62150a51582c26f4255242a3c4ca35fb04250e7315069523d650676aed01a56a
bytes32 constant TOKEN_OPERATOR_ROLE = keccak256("TOKEN_OPERATOR_ROLE");
// 0xa6fbd0d4ef0ac50b4de984ab8f303863596293cce6d67dd6111979bcf56abe74
bytes32 constant STAKE_OPERATOR_ROLE = keccak256("STAKE_OPERATOR_ROLE");
// 0xc24d2c87036c9189cc45e221d5dff8eaffb4966ee49ea36b4ffc88a2d85bf890
bytes32 constant PRICE_FEED_OPERATOR_ROLE = keccak256("PRICE_FEED_OPERATOR_ROLE");
// 0x04fcf77d802b9769438bfcbfc6eae4865484c9853501897657f1d28c3f3c603e
bytes32 constant PAIR_OPERATOR_ROLE = keccak256("PAIR_OPERATOR_ROLE");
// 0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab
bytes32 constant KEEPER_ROLE = keccak256("KEEPER_ROLE");
// 0x7d867aa9d791a9a4be418f90a2f248aa2c5f1348317792a6f6412f94df9819f7
bytes32 constant PRICE_FEEDER_ROLE = keccak256("PRICE_FEEDER_ROLE");
// 0x8227712ef8ad39d0f26f06731ef0df8665eb7ada7f41b1ee089adf3c238862a2
bytes32 constant MONITOR_ROLE = keccak256("MONITOR_ROLE");
/*-------------------------------- Decimals --------------------------------*/
uint8 constant public PRICE_DECIMALS = 8;
uint8 constant public QTY_DECIMALS = 10;
uint8 constant public USD_DECIMALS = 18;
uint16 constant public BASIS_POINTS_DIVISOR = 1e4;
uint16 constant public MAX_LEVERAGE = 1e3;
int256 constant public FUNDING_FEE_RATE_DIVISOR = 1e18;
uint16 constant public MAX_DAO_SHARE_P = 2000;
uint16 constant public MAX_COMMISSION_P = 8000;
uint8 constant public FEED_DELAY_BLOCK = 100;
uint8 constant public MAX_REQUESTS_PER_PAIR_IN_BLOCK = 100;
uint256 constant public TIME_LOCK_DELAY = 2 hours;
uint256 constant public TIME_LOCK_GRACE_PERIOD = 12 hours;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "../interfaces/IDiamondCut.sol";
error InitializationFunctionReverted(address _initializationContractAddress, bytes _calldata);
library LibDiamond {
bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage");
struct FacetAddressAndPosition {
address facetAddress;
uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
}
struct FacetFunctionSelectors {
bytes4[] functionSelectors;
uint256 facetAddressPosition; // position of facetAddress in facetAddresses array
}
struct DiamondStorage {
// maps function selector to the facet address and
// the position of the selector in the facetFunctionSelectors.selectors array
mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
// maps facet addresses to function selectors
mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
// facet addresses
address[] facetAddresses;
// Used to query if a contract implements an interface.
// Used to implement ERC-165.
mapping(bytes4 => bool) supportedInterfaces;
// Used in ReentrancyGuard
uint256 status;
bool paused;
}
function diamondStorage() internal pure returns (DiamondStorage storage ds) {
bytes32 position = DIAMOND_STORAGE_POSITION;
assembly {
ds.slot := position
}
}
event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata);
// Internal function version of diamondCut
function diamondCut(IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) internal {
for (uint256 facetIndex; facetIndex < _diamondCut.length;) {
IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;
bytes4[] memory _functionSelectors = _diamondCut[facetIndex].functionSelectors;
require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut");
if (action == IDiamondCut.FacetCutAction.Add) {
addFunctions(_diamondCut[facetIndex].facetAddress, _functionSelectors);
} else if (action == IDiamondCut.FacetCutAction.Replace) {
replaceFunctions(_diamondCut[facetIndex].facetAddress, _functionSelectors);
} else if (action == IDiamondCut.FacetCutAction.Remove) {
removeFunctions(_diamondCut[facetIndex].facetAddress, _functionSelectors);
} else {
revert("LibDiamondCut: Incorrect FacetCutAction");
}
unchecked {
facetIndex++;
}
}
emit DiamondCut(_diamondCut, _init, _calldata);
initializeDiamondCut(_init, _calldata);
}
function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
DiamondStorage storage ds = diamondStorage();
require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)");
uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);
// add new facet address if it does not exist
if (selectorPosition == 0) {
addFacet(ds, _facetAddress);
}
for (uint256 selectorIndex; selectorIndex < _functionSelectors.length;) {
bytes4 selector = _functionSelectors[selectorIndex];
address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists");
addFunction(ds, selector, selectorPosition, _facetAddress);
selectorPosition++;
unchecked {
selectorIndex++;
}
}
}
function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
DiamondStorage storage ds = diamondStorage();
require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)");
uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);
// add new facet address if it does not exist
if (selectorPosition == 0) {
addFacet(ds, _facetAddress);
}
for (uint256 selectorIndex; selectorIndex < _functionSelectors.length;) {
bytes4 selector = _functionSelectors[selectorIndex];
address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function");
removeFunction(ds, oldFacetAddress, selector);
addFunction(ds, selector, selectorPosition, _facetAddress);
selectorPosition++;
unchecked {
selectorIndex++;
}
}
}
function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
DiamondStorage storage ds = diamondStorage();
// if function does not exist then do nothing and return
require(_facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)");
for (uint256 selectorIndex; selectorIndex < _functionSelectors.length;) {
bytes4 selector = _functionSelectors[selectorIndex];
address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
removeFunction(ds, oldFacetAddress, selector);
unchecked {
selectorIndex++;
}
}
}
function addFacet(DiamondStorage storage ds, address _facetAddress) internal {
enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code");
ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length;
ds.facetAddresses.push(_facetAddress);
}
function addFunction(DiamondStorage storage ds, bytes4 _selector, uint96 _selectorPosition, address _facetAddress) internal {
ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition;
ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);
ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
}
function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal {
require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist");
// an immutable function is a function defined directly in a diamond
require(_facetAddress != address(this), "LibDiamondCut: Can't remove immutable function");
// replace selector with last selector, then delete last selector
uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition;
uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1;
// if not the same then replace _selector with lastSelector
if (selectorPosition != lastSelectorPosition) {
bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition];
ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector;
ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition);
}
// delete the last selector
ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();
delete ds.selectorToFacetAndPosition[_selector];
// if no more selectors for facet address then delete the facet address
if (lastSelectorPosition == 0) {
// replace facet address with last facet address and delete last facet address
uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;
uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
if (facetAddressPosition != lastFacetAddressPosition) {
address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];
ds.facetAddresses[facetAddressPosition] = lastFacetAddress;
ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition;
}
ds.facetAddresses.pop();
delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
}
}
function initializeDiamondCut(address _init, bytes memory _calldata) internal {
if (_init == address(0)) {
return;
}
enforceHasContractCode(_init, "LibDiamondCut: _init address has no code");
(bool success, bytes memory error) = _init.delegatecall(_calldata);
if (!success) {
if (error.length > 0) {
// bubble up error
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(error)
revert(add(32, error), returndata_size)
}
} else {
revert InitializationFunctionReverted(_init, _calldata);
}
}
}
function enforceHasContractCode(address _contract, string memory _errorMessage) internal view {
uint256 contractSize;
assembly {
contractSize := extcodesize(_contract)
}
require(contractSize > 0, _errorMessage);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
library LibAccessControlEnumerable {
using EnumerableSet for EnumerableSet.AddressSet;
bytes32 constant ACCESS_CONTROL_STORAGE_POSITION = keccak256("apollox.access.control.storage");
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
struct AccessControlStorage {
mapping(bytes32 => RoleData) roles;
mapping(bytes32 => EnumerableSet.AddressSet) roleMembers;
mapping(bytes4 => bool) supportedInterfaces;
}
function accessControlStorage() internal pure returns (AccessControlStorage storage acs) {
bytes32 position = ACCESS_CONTROL_STORAGE_POSITION;
assembly {
acs.slot := position
}
}
function checkRole(bytes32 role) internal view {
checkRole(role, msg.sender);
}
function checkRole(bytes32 role, address account) internal view {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(account),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
function hasRole(bytes32 role, address account) internal view returns (bool) {
AccessControlStorage storage acs = accessControlStorage();
return acs.roles[role].members[account];
}
function grantRole(bytes32 role, address account) internal {
AccessControlStorage storage acs = accessControlStorage();
if (!hasRole(role, account)) {
acs.roles[role].members[account] = true;
emit RoleGranted(role, account, msg.sender);
acs.roleMembers[role].add(account);
}
}
function revokeRole(bytes32 role, address account) internal {
AccessControlStorage storage acs = accessControlStorage();
if (hasRole(role, account)) {
acs.roles[role].members[account] = false;
emit RoleRevoked(role, account, msg.sender);
acs.roleMembers[role].remove(account);
}
}
function setRoleAdmin(bytes32 role, bytes32 adminRole) internal {
AccessControlStorage storage acs = accessControlStorage();
bytes32 previousAdminRole = acs.roles[role].adminRole;
acs.roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
interface IDiamondLoupe {
struct Facet {
address facetAddress;
bytes4[] functionSelectors;
}
function facets() external view returns (Facet[] memory facets_);
function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_);
function facetAddresses() external view returns (address[] memory facetAddresses_);
function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
interface IDiamondCut {
event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
// Add=0, Replace=1, Remove=2
enum FacetCutAction {Add, Replace, Remove}
struct FacetCut {
address facetAddress;
FacetCutAction action;
bytes4[] functionSelectors;
}
function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
interface ArbSys {
/**
* @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)
* @return block number as int
*/
function arbBlockNumber() external view returns (uint);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastValue;
// Update the index for the moved value
set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return 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 {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return 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 up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev 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^256 and mod 2^256 - 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^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
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^256. Also prevents denominator == 0.
require(denominator > prod1, "Math: mulDiv 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.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
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^256 / 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^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
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^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// 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^256. Since the preconditions guarantee that the outcome is
// less than 2^256, 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;
}
}
/**
* @notice 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) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice 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 + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 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 + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* 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 + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* 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;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 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 + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
import "./math/SignedMath.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @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), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toString(int256 value) internal pure returns (string memory) {
return string(abi.encodePacked(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) {
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] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
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 Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return keccak256(bytes(a)) == keccak256(bytes(b));
}
}{
"remappings": [],
"optimizer": {
"enabled": true,
"runs": 1000
},
"evmVersion": "paris",
"libraries": {},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"deployer","type":"address"},{"internalType":"address","name":"_diamondCutFacet","type":"address"},{"internalType":"address","name":"_diamondLoupeFacet","type":"address"},{"internalType":"address","name":"_init","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_initializationContractAddress","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"InitializationFunctionReverted","type":"error"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405260405161153f38038061153f8339810160408190526100229161109d565b61002d6000866102c4565b6100577ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c856102c4565b60408051600280825260608201909252600091816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161006f5750506040805160018082528183019092529192506000919060208083019080368337019050509050631f931c1c60e01b816000815181106100de576100de611102565b6001600160e01b031990921660209283029190910182015260408051606081019091526001600160a01b038716815290810160008152602001828152508260008151811061012e5761012e611102565b602090810291909101015260408051600480825260a08201909252600091816020016020820280368337019050509050637a0ed62760e01b8160008151811061017957610179611102565b6001600160e01b03199092166020928302919091019091015280516314bbdacb60e21b90829060019081106101b0576101b0611102565b6001600160e01b03199092166020928302919091019091015280516366ffd66360e11b90829060029081106101e7576101e7611102565b6001600160e01b03199092166020928302919091019091015280516356fe50af60e11b908290600390811061021e5761021e611102565b6001600160e01b031990921660209283029190910182015260408051606081019091526001600160a01b038716815290810160008152602001828152508360018151811061026e5761026e611102565b60209081029190910181019190915260408051600481526024810190915290810180516001600160e01b039081166370e39c9560e11b179091526102b791859187919061035716565b5050505050505050611346565b60008051602061151f8339815191526102dd8383610590565b610352576000838152602082815260408083206001600160a01b0386168085529252808320805460ff1916600117905551339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a46000838152600182016020526040902061035090836105ca565b505b505050565b60005b835181101561054a57600084828151811061037757610377611102565b6020026020010151602001519050600085838151811061039957610399611102565b602002602001015160400151905060008151116104115760405162461bcd60e51b815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201526a1858d95d081d1bc818dd5d60aa1b60648201526084015b60405180910390fd5b600082600281111561042557610425611118565b0361045c5761045786848151811061043f5761043f611102565b602002602001015160000151826105e660201b60201c565b610540565b600182600281111561047057610470611118565b036104a25761045786848151811061048a5761048a611102565b6020026020010151600001518261080460201b60201c565b60028260028111156104b6576104b6611118565b036104e8576104578684815181106104d0576104d0611102565b60200260200101516000015182610a2b60201b60201c565b60405162461bcd60e51b815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f727265637420466163657443756044820152663a20b1ba34b7b760c91b6064820152608401610408565b505060010161035a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161057e9392919061117e565b60405180910390a16103528282610b1e565b600082815260008051602061151f833981519152602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b60006105df836001600160a01b038416610be4565b9392505050565b6000805160206114938339815191526001600160a01b03831661064e5760405162461bcd60e51b815260206004820152602c60248201526000805160206114db83398151915260448201526b65206164647265737328302960a01b6064820152608401610408565b6001600160a01b0383166000908152600182016020526040812054906001600160601b0382169003610684576106848285610c33565b60005b83518110156107fd5760008482815181106106a4576106a4611102565b6020908102919091018101516001600160e01b031981166000908152918690526040909120549091506001600160a01b0316801561074a5760405162461bcd60e51b815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c72656164792065786973747300000000000000000000006064820152608401610408565b6001600160e01b0319821660008181526020878152604080832080546001600160a01b03908116600160a01b6001600160601b038c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b031916179055836107ec81611294565b945050600190920191506106879050565b5050505050565b6000805160206114938339815191526001600160a01b03831661086c5760405162461bcd60e51b815260206004820152602c60248201526000805160206114db83398151915260448201526b65206164647265737328302960a01b6064820152608401610408565b6001600160a01b0383166000908152600182016020526040812054906001600160601b03821690036108a2576108a28285610c33565b60005b83518110156107fd5760008482815181106108c2576108c2611102565b6020908102919091018101516001600160e01b031981166000908152918690526040909120549091506001600160a01b03908116908716810361096d5760405162461bcd60e51b815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e00000000000000006064820152608401610408565b610978858284610c9d565b6001600160e01b0319821660008181526020878152604080832080546001600160a01b03908116600160a01b6001600160601b038c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b03191617905583610a1a81611294565b945050600190920191506108a59050565b6000805160206114938339815191526001600160a01b03831615610ab75760405162461bcd60e51b815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d7573742062652061646472657373283029000000000000000000006064820152608401610408565b60005b8251811015610350576000838281518110610ad757610ad7611102565b6020908102919091018101516001600160e01b031981166000908152918590526040909120549091506001600160a01b0316610b14848284610c9d565b5050600101610aba565b6001600160a01b038216610b30575050565b610b52826040518060600160405280602881526020016114b360289139611060565b600080836001600160a01b031683604051610b6d91906112c2565b600060405180830381855af49150503d8060008114610ba8576040519150601f19603f3d011682016040523d82523d6000602084013e610bad565b606091505b50915091508161035057805115610bc75780518082602001fd5b838360405163192105d760e01b81526004016104089291906112de565b6000818152600183016020526040812054610c2b575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105c4565b5060006105c4565b610c55816040518060600160405280602481526020016114fb60249139611060565b6002820180546001600160a01b0390921660008181526001948501602090815260408220860185905594840183559182529290200180546001600160a01b0319169091179055565b6001600160a01b038216610d195760405162461bcd60e51b815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e27742065786973740000000000000000006064820152608401610408565b306001600160a01b03831603610d885760405162461bcd60e51b815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201526d3a30b1363290333ab731ba34b7b760911b6064820152608401610408565b6001600160e01b03198116600090815260208481526040808320546001600160a01b0386168452600180880190935290832054600160a01b9091046001600160601b03169291610dd79161130a565b9050808214610ec9576001600160a01b03841660009081526001860160205260408120805483908110610e0c57610e0c611102565b600091825260208083206008830401546001600160a01b038916845260018a019091526040909220805460079092166004026101000a90920460e01b925082919085908110610e5d57610e5d611102565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790556001600160e01b03199290921682528690526040902080546001600160a01b0316600160a01b6001600160601b038516021790555b6001600160a01b03841660009081526001860160205260409020805480610ef257610ef261131d565b60008281526020808220600860001990940193840401805463ffffffff600460078716026101000a0219169055919092556001600160e01b031985168252869052604081208190558190036107fd576002850154600090610f559060019061130a565b6001600160a01b0386166000908152600180890160205260409091200154909150808214611004576000876002018381548110610f9457610f94611102565b6000918252602090912001546002890180546001600160a01b039092169250829184908110610fc557610fc5611102565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055929091168152600189810190925260409020018190555b866002018054806110175761101761131d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0388168252600189810190915260408220015550505050505050565b813b81816103505760405162461bcd60e51b81526004016104089190611333565b80516001600160a01b038116811461109857600080fd5b919050565b600080600080600060a086880312156110b557600080fd5b6110be86611081565b94506110cc60208701611081565b93506110da60408701611081565b92506110e860608701611081565b91506110f660808701611081565b90509295509295909350565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60005b83811015611149578181015183820152602001611131565b50506000910152565b6000815180845261116a81602086016020860161112e565b601f01601f19169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b8481101561124e57898403607f19018652815180516001600160a01b031685528381015189860190600381106111ed57634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b808310156112395783516001600160e01b031916825292860192600192909201919086019061120f565b509785019795505050908201906001016111a7565b50506001600160a01b038a169088015286810360408801526112708189611152565b9a9950505050505050505050565b634e487b7160e01b600052601160045260246000fd5b60006001600160601b038281166002600160601b031981016112b8576112b861127e565b6001019392505050565b600082516112d481846020870161112e565b9190910192915050565b6001600160a01b038316815260406020820181905260009061130290830184611152565b949350505050565b818103818111156105c4576105c461127e565b634e487b7160e01b600052603160045260246000fd5b6020815260006105df6020830184611152565b61013e806113556000396000f3fe60806040523661000b57005b60007fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c600080357fffffffff000000000000000000000000000000000000000000000000000000001681526020829052604090205490915073ffffffffffffffffffffffffffffffffffffffff16806100e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f74206578697374604482015260640160405180910390fd5b3660008037600080366000845af43d6000803e808015610103573d6000f35b3d6000fdfea2646970667358221220239e7d19b708553af3bb8fe3283335be948248748072bea88835db09fae18f7e64736f6c63430008130033c8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204164642066616365742063616e277420624c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465268e1f3c545d1602750d0c31485576ea291f28e5f3f3c57bf490ae4b6bbe126c000000000000000000000000f5506183269d8e1274019097b9c1eda86ab606bd000000000000000000000000f5506183269d8e1274019097b9c1eda86ab606bd0000000000000000000000005a5454a6030fb50ceb3eb78977d140198a27be5e0000000000000000000000005292c9b2be74fbf89429a566ed2e4ddb1e9d0a72000000000000000000000000c45fa4880864ad93b52c579b08e73ccd7e80c43e
Deployed Bytecode
0x60806040523661000b57005b60007fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c600080357fffffffff000000000000000000000000000000000000000000000000000000001681526020829052604090205490915073ffffffffffffffffffffffffffffffffffffffff16806100e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f74206578697374604482015260640160405180910390fd5b3660008037600080366000845af43d6000803e808015610103573d6000f35b3d6000fdfea2646970667358221220239e7d19b708553af3bb8fe3283335be948248748072bea88835db09fae18f7e64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f5506183269d8e1274019097b9c1eda86ab606bd000000000000000000000000f5506183269d8e1274019097b9c1eda86ab606bd0000000000000000000000005a5454a6030fb50ceb3eb78977d140198a27be5e0000000000000000000000005292c9b2be74fbf89429a566ed2e4ddb1e9d0a72000000000000000000000000c45fa4880864ad93b52c579b08e73ccd7e80c43e
-----Decoded View---------------
Arg [0] : admin (address): 0xf5506183269D8e1274019097B9c1edA86aB606bD
Arg [1] : deployer (address): 0xf5506183269D8e1274019097B9c1edA86aB606bD
Arg [2] : _diamondCutFacet (address): 0x5A5454A6030FB50ceb3eb78977D140198A27be5e
Arg [3] : _diamondLoupeFacet (address): 0x5292c9b2Be74fbf89429A566ed2E4Ddb1E9D0A72
Arg [4] : _init (address): 0xC45Fa4880864aD93b52c579B08E73cCD7e80c43e
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000f5506183269d8e1274019097b9c1eda86ab606bd
Arg [1] : 000000000000000000000000f5506183269d8e1274019097b9c1eda86ab606bd
Arg [2] : 0000000000000000000000005a5454a6030fb50ceb3eb78977d140198a27be5e
Arg [3] : 0000000000000000000000005292c9b2be74fbf89429a566ed2e4ddb1e9d0a72
Arg [4] : 000000000000000000000000c45fa4880864ad93b52c579b08e73ccd7e80c43e
Loading...
Loading
Loading...
Loading
OVERVIEW
TradingLoading...
Loading
Net Worth in USD
$1,905,286.81
Net Worth in ETH
680.060981
Token Allocations
USD₮0
39.09%
USDC.E
26.79%
DAI
24.04%
Others
10.08%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ARB | 39.09% | $0.998761 | 745,662.1685 | $744,738.29 | |
| ARB | 26.79% | $0.999704 | 510,616.6555 | $510,465.51 | |
| ARB | 24.04% | $0.999374 | 458,239.4918 | $457,952.63 | |
| ARB | 5.99% | $2,798.43 | 40.7838 | $114,130.66 | |
| ARB | 3.80% | $86,032 | 0.8417 | $72,410.83 | |
| ARB | 0.29% | $0.00 | 2,000,000 | $0.00 | |
| ARB | <0.01% | $34.13 | 0.8284 | $28.27 | |
| ARB | <0.01% | $2,801.64 | 0.00017612 | $0.493416 | |
| ETH | <0.01% | $2,802.89 | 0.0282 | $79.07 | |
| BSC | <0.01% | $863.22 | 0.000000000005 | <$0.000001 |
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.