Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
160594 | 28 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
DexManagerFacet
Compiler Version
v0.8.26+commit.8a97fa7a
ZkSolc Version
v1.5.3
Optimization Enabled:
Yes with Mode 3
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import { LibDiamond } from "../Libraries/LibDiamond.sol"; import { LibAccess } from "../Libraries/LibAccess.sol"; import { LibAllowList } from "../Libraries/LibAllowList.sol"; import { CannotAuthoriseSelf } from "../Errors/GenericErrors.sol"; /// @title Dex Manager Facet /// @author LI.FI (https://li.fi) /// @notice Facet contract for managing approved DEXs to be used in swaps. /// @custom:version 1.0.1 contract DexManagerFacet { /// Events /// event DexAdded(address indexed dexAddress); event DexRemoved(address indexed dexAddress); event FunctionSignatureApprovalChanged( bytes4 indexed functionSignature, bool indexed approved ); /// External Methods /// /// @notice Register the address of a DEX contract to be approved for swapping. /// @param _dex The address of the DEX contract to be approved. function addDex(address _dex) external { if (msg.sender != LibDiamond.contractOwner()) { LibAccess.enforceAccessControl(); } LibAllowList.addAllowedContract(_dex); emit DexAdded(_dex); } /// @notice Batch register the address of DEX contracts to be approved for swapping. /// @param _dexs The addresses of the DEX contracts to be approved. function batchAddDex(address[] calldata _dexs) external { if (msg.sender != LibDiamond.contractOwner()) { LibAccess.enforceAccessControl(); } uint256 length = _dexs.length; for (uint256 i = 0; i < length; ) { address dex = _dexs[i]; if (dex == address(this)) { revert CannotAuthoriseSelf(); } if (LibAllowList.contractIsAllowed(dex)) continue; LibAllowList.addAllowedContract(dex); emit DexAdded(dex); unchecked { ++i; } } } /// @notice Unregister the address of a DEX contract approved for swapping. /// @param _dex The address of the DEX contract to be unregistered. function removeDex(address _dex) external { if (msg.sender != LibDiamond.contractOwner()) { LibAccess.enforceAccessControl(); } LibAllowList.removeAllowedContract(_dex); emit DexRemoved(_dex); } /// @notice Batch unregister the addresses of DEX contracts approved for swapping. /// @param _dexs The addresses of the DEX contracts to be unregistered. function batchRemoveDex(address[] calldata _dexs) external { if (msg.sender != LibDiamond.contractOwner()) { LibAccess.enforceAccessControl(); } uint256 length = _dexs.length; for (uint256 i = 0; i < length; ) { LibAllowList.removeAllowedContract(_dexs[i]); emit DexRemoved(_dexs[i]); unchecked { ++i; } } } /// @notice Adds/removes a specific function signature to/from the allowlist /// @param _signature the function signature to allow/disallow /// @param _approval whether the function signature should be allowed function setFunctionApprovalBySignature( bytes4 _signature, bool _approval ) external { if (msg.sender != LibDiamond.contractOwner()) { LibAccess.enforceAccessControl(); } if (_approval) { LibAllowList.addAllowedSelector(_signature); } else { LibAllowList.removeAllowedSelector(_signature); } emit FunctionSignatureApprovalChanged(_signature, _approval); } /// @notice Batch Adds/removes a specific function signature to/from the allowlist /// @param _signatures the function signatures to allow/disallow /// @param _approval whether the function signatures should be allowed function batchSetFunctionApprovalBySignature( bytes4[] calldata _signatures, bool _approval ) external { if (msg.sender != LibDiamond.contractOwner()) { LibAccess.enforceAccessControl(); } uint256 length = _signatures.length; for (uint256 i = 0; i < length; ) { bytes4 _signature = _signatures[i]; if (_approval) { LibAllowList.addAllowedSelector(_signature); } else { LibAllowList.removeAllowedSelector(_signature); } emit FunctionSignatureApprovalChanged(_signature, _approval); unchecked { ++i; } } } /// @notice Returns whether a function signature is approved /// @param _signature the function signature to query /// @return approved Approved or not function isFunctionApproved( bytes4 _signature ) public view returns (bool approved) { return LibAllowList.selectorIsAllowed(_signature); } /// @notice Returns a list of all approved DEX addresses. /// @return addresses List of approved DEX addresses function approvedDexs() external view returns (address[] memory addresses) { return LibAllowList.getAllowedContracts(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // import { IDiamondCut } from "../Interfaces/LibDiamond.sol"; import { LibDiamond } from "../Libraries/LibDiamond.sol"; import { LibUtil } from "../Libraries/LibUtil.sol"; import { OnlyContractOwner } from "../Errors/GenericErrors.sol"; /// Implementation of EIP-2535 Diamond Standard /// https://eips.ethereum.org/EIPS/eip-2535 library LibDiamond { bytes32 internal constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); // Diamond specific errors error IncorrectFacetCutAction(); error NoSelectorsInFace(); error FunctionAlreadyExists(); error FacetAddressIsZero(); error FacetAddressIsNotZero(); error FacetContainsNoCode(); error FunctionDoesNotExist(); error FunctionIsImmutable(); error InitZeroButCalldataNotEmpty(); error CalldataEmptyButInitNotZero(); error InitReverted(); // ---------------- 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; // owner of the contract address contractOwner; } enum FacetCutAction { Add, Replace, Remove } // Add=0, Replace=1, Remove=2 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; } function diamondStorage() internal pure returns (DiamondStorage storage ds) { bytes32 position = DIAMOND_STORAGE_POSITION; // solhint-disable-next-line no-inline-assembly assembly { ds.slot := position } } event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); function setContractOwner(address _newOwner) internal { DiamondStorage storage ds = diamondStorage(); address previousOwner = ds.contractOwner; ds.contractOwner = _newOwner; emit OwnershipTransferred(previousOwner, _newOwner); } function contractOwner() internal view returns (address contractOwner_) { contractOwner_ = diamondStorage().contractOwner; } function enforceIsContractOwner() internal view { if (msg.sender != diamondStorage().contractOwner) revert OnlyContractOwner(); } // Internal function version of diamondCut function diamondCut( FacetCut[] memory _diamondCut, address _init, bytes memory _calldata ) internal { for (uint256 facetIndex; facetIndex < _diamondCut.length; ) { LibDiamond.FacetCutAction action = _diamondCut[facetIndex].action; if (action == LibDiamond.FacetCutAction.Add) { addFunctions( _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors ); } else if (action == LibDiamond.FacetCutAction.Replace) { replaceFunctions( _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors ); } else if (action == LibDiamond.FacetCutAction.Remove) { removeFunctions( _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors ); } else { revert IncorrectFacetCutAction(); } unchecked { ++facetIndex; } } emit DiamondCut(_diamondCut, _init, _calldata); initializeDiamondCut(_init, _calldata); } function addFunctions( address _facetAddress, bytes4[] memory _functionSelectors ) internal { if (_functionSelectors.length == 0) { revert NoSelectorsInFace(); } DiamondStorage storage ds = diamondStorage(); if (LibUtil.isZeroAddress(_facetAddress)) { revert FacetAddressIsZero(); } 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; if (!LibUtil.isZeroAddress(oldFacetAddress)) { revert FunctionAlreadyExists(); } addFunction(ds, selector, selectorPosition, _facetAddress); unchecked { ++selectorPosition; ++selectorIndex; } } } function replaceFunctions( address _facetAddress, bytes4[] memory _functionSelectors ) internal { if (_functionSelectors.length == 0) { revert NoSelectorsInFace(); } DiamondStorage storage ds = diamondStorage(); if (LibUtil.isZeroAddress(_facetAddress)) { revert FacetAddressIsZero(); } 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; if (oldFacetAddress == _facetAddress) { revert FunctionAlreadyExists(); } removeFunction(ds, oldFacetAddress, selector); addFunction(ds, selector, selectorPosition, _facetAddress); unchecked { ++selectorPosition; ++selectorIndex; } } } function removeFunctions( address _facetAddress, bytes4[] memory _functionSelectors ) internal { if (_functionSelectors.length == 0) { revert NoSelectorsInFace(); } DiamondStorage storage ds = diamondStorage(); // if function does not exist then do nothing and return if (!LibUtil.isZeroAddress(_facetAddress)) { revert FacetAddressIsNotZero(); } 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); 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 { if (LibUtil.isZeroAddress(_facetAddress)) { revert FunctionDoesNotExist(); } // an immutable function is a function defined directly in a diamond if (_facetAddress == address(this)) { revert FunctionIsImmutable(); } // 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 (LibUtil.isZeroAddress(_init)) { if (_calldata.length != 0) { revert InitZeroButCalldataNotEmpty(); } } else { if (_calldata.length == 0) { revert CalldataEmptyButInitNotZero(); } if (_init != address(this)) { enforceHasContractCode(_init); } // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory error) = _init.delegatecall(_calldata); if (!success) { if (error.length > 0) { // bubble up the error revert(string(error)); } else { revert InitReverted(); } } } } function enforceHasContractCode(address _contract) internal view { uint256 contractSize; // solhint-disable-next-line no-inline-assembly assembly { contractSize := extcodesize(_contract) } if (contractSize == 0) { revert FacetContainsNoCode(); } } }
// SPDX-License-Identifier: MIT /// @custom:version 1.0.0 pragma solidity ^0.8.17; import { CannotAuthoriseSelf, UnAuthorized } from "../Errors/GenericErrors.sol"; /// @title Access Library /// @author LI.FI (https://li.fi) /// @notice Provides functionality for managing method level access control library LibAccess { /// Types /// bytes32 internal constant NAMESPACE = keccak256("com.lifi.library.access.management"); /// Storage /// struct AccessStorage { mapping(bytes4 => mapping(address => bool)) execAccess; } /// Events /// event AccessGranted(address indexed account, bytes4 indexed method); event AccessRevoked(address indexed account, bytes4 indexed method); /// @dev Fetch local storage function accessStorage() internal pure returns (AccessStorage storage accStor) { bytes32 position = NAMESPACE; // solhint-disable-next-line no-inline-assembly assembly { accStor.slot := position } } /// @notice Gives an address permission to execute a method /// @param selector The method selector to execute /// @param executor The address to grant permission to function addAccess(bytes4 selector, address executor) internal { if (executor == address(this)) { revert CannotAuthoriseSelf(); } AccessStorage storage accStor = accessStorage(); accStor.execAccess[selector][executor] = true; emit AccessGranted(executor, selector); } /// @notice Revokes permission to execute a method /// @param selector The method selector to execute /// @param executor The address to revoke permission from function removeAccess(bytes4 selector, address executor) internal { AccessStorage storage accStor = accessStorage(); accStor.execAccess[selector][executor] = false; emit AccessRevoked(executor, selector); } /// @notice Enforces access control by reverting if `msg.sender` /// has not been given permission to execute `msg.sig` function enforceAccessControl() internal view { AccessStorage storage accStor = accessStorage(); if (accStor.execAccess[msg.sig][msg.sender] != true) revert UnAuthorized(); } }
// SPDX-License-Identifier: MIT /// @custom:version 1.0.0 pragma solidity ^0.8.17; import { InvalidContract } from "../Errors/GenericErrors.sol"; /// @title Lib Allow List /// @author LI.FI (https://li.fi) /// @notice Library for managing and accessing the conract address allow list library LibAllowList { /// Storage /// bytes32 internal constant NAMESPACE = keccak256("com.lifi.library.allow.list"); struct AllowListStorage { mapping(address => bool) allowlist; mapping(bytes4 => bool) selectorAllowList; address[] contracts; } /// @dev Adds a contract address to the allow list /// @param _contract the contract address to add function addAllowedContract(address _contract) internal { _checkAddress(_contract); AllowListStorage storage als = _getStorage(); if (als.allowlist[_contract]) return; als.allowlist[_contract] = true; als.contracts.push(_contract); } /// @dev Checks whether a contract address has been added to the allow list /// @param _contract the contract address to check function contractIsAllowed( address _contract ) internal view returns (bool) { return _getStorage().allowlist[_contract]; } /// @dev Remove a contract address from the allow list /// @param _contract the contract address to remove function removeAllowedContract(address _contract) internal { AllowListStorage storage als = _getStorage(); if (!als.allowlist[_contract]) { return; } als.allowlist[_contract] = false; uint256 length = als.contracts.length; // Find the contract in the list for (uint256 i = 0; i < length; i++) { if (als.contracts[i] == _contract) { // Move the last element into the place to delete als.contracts[i] = als.contracts[length - 1]; // Remove the last element als.contracts.pop(); break; } } } /// @dev Fetch contract addresses from the allow list function getAllowedContracts() internal view returns (address[] memory) { return _getStorage().contracts; } /// @dev Add a selector to the allow list /// @param _selector the selector to add function addAllowedSelector(bytes4 _selector) internal { _getStorage().selectorAllowList[_selector] = true; } /// @dev Removes a selector from the allow list /// @param _selector the selector to remove function removeAllowedSelector(bytes4 _selector) internal { _getStorage().selectorAllowList[_selector] = false; } /// @dev Returns if selector has been added to the allow list /// @param _selector the selector to check function selectorIsAllowed(bytes4 _selector) internal view returns (bool) { return _getStorage().selectorAllowList[_selector]; } /// @dev Fetch local storage struct function _getStorage() internal pure returns (AllowListStorage storage als) { bytes32 position = NAMESPACE; // solhint-disable-next-line no-inline-assembly assembly { als.slot := position } } /// @dev Contains business logic for validating a contract address. /// @param _contract address of the dex to check function _checkAddress(address _contract) private view { if (_contract == address(0)) revert InvalidContract(); if (_contract.code.length == 0) revert InvalidContract(); } }
// SPDX-License-Identifier: MIT /// @custom:version 1.0.0 pragma solidity ^0.8.17; error AlreadyInitialized(); error CannotAuthoriseSelf(); error CannotBridgeToSameNetwork(); error ContractCallNotAllowed(); error CumulativeSlippageTooHigh(uint256 minAmount, uint256 receivedAmount); error DiamondIsPaused(); error ExternalCallFailed(); error FunctionDoesNotExist(); error InformationMismatch(); error InsufficientBalance(uint256 required, uint256 balance); error InvalidAmount(); error InvalidCallData(); error InvalidConfig(); error InvalidContract(); error InvalidDestinationChain(); error InvalidFallbackAddress(); error InvalidReceiver(); error InvalidSendingToken(); error NativeAssetNotSupported(); error NativeAssetTransferFailed(); error NoSwapDataProvided(); error NoSwapFromZeroBalance(); error NotAContract(); error NotInitialized(); error NoTransferToNullAddress(); error NullAddrIsNotAnERC20Token(); error NullAddrIsNotAValidSpender(); error OnlyContractOwner(); error RecoveryAddressCannotBeZero(); error ReentrancyError(); error TokenNotSupported(); error UnAuthorized(); error UnsupportedChainId(uint256 chainId); error WithdrawFailed(); error ZeroAmount();
// SPDX-License-Identifier: MIT /// @custom:version 1.0.0 pragma solidity ^0.8.17; import "./LibBytes.sol"; library LibUtil { using LibBytes for bytes; function getRevertMsg( bytes memory _res ) internal pure returns (string memory) { // If the _res length is less than 68, then the transaction failed silently (without a revert message) if (_res.length < 68) return "Transaction reverted silently"; bytes memory revertData = _res.slice(4, _res.length - 4); // Remove the selector which is the first 4 bytes return abi.decode(revertData, (string)); // All that remains is the revert string } /// @notice Determines whether the given address is the zero address /// @param addr The address to verify /// @return Boolean indicating if the address is the zero address function isZeroAddress(address addr) internal pure returns (bool) { return addr == address(0); } function revertWith(bytes memory data) internal pure { assembly { let dataSize := mload(data) // Load the size of the data let dataPtr := add(data, 0x20) // Advance data pointer to the next word revert(dataPtr, dataSize) // Revert with the given data } } }
// SPDX-License-Identifier: MIT /// @custom:version 1.0.0 pragma solidity ^0.8.17; library LibBytes { // solhint-disable no-inline-assembly // LibBytes specific errors error SliceOverflow(); error SliceOutOfBounds(); error AddressOutOfBounds(); bytes16 private constant _SYMBOLS = "0123456789abcdef"; // ------------------------- function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { if (_length + 31 < _length) revert SliceOverflow(); if (_bytes.length < _start + _length) revert SliceOutOfBounds(); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add( add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)) ) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add( add( add(_bytes, lengthmod), mul(0x20, iszero(lengthmod)) ), _start ) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress( bytes memory _bytes, uint256 _start ) internal pure returns (address) { if (_bytes.length < _start + 20) { revert AddressOutOfBounds(); } address tempAddress; assembly { tempAddress := div( mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000 ) } return tempAddress; } /// Copied from OpenZeppelin's `Strings.sol` utility library. /// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8335676b0e99944eef6a742e16dcd9ff6e68e609/contracts/utils/Strings.sol 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); } }
{ "viaIR": false, "remappings": [ "@eth-optimism/=node_modules/@hop-protocol/sdk/node_modules/@eth-optimism/", "@uniswap/=node_modules/@uniswap/", "eth-gas-reporter/=node_modules/eth-gas-reporter/", "hardhat/=node_modules/hardhat/", "hardhat-deploy/=node_modules/hardhat-deploy/", "@openzeppelin/=lib/openzeppelin-contracts/", "celer-network/=lib/sgn-v2-contracts/", "create3-factory/=lib/create3-factory/src/", "solmate/=lib/solmate/src/", "solady/=lib/solady/src/", "permit2/=lib/Permit2/src/", "ds-test/=lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "lifi/=src/", "test/=test/", "Permit2/=lib/Permit2/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-gas-snapshot/=lib/Permit2/lib/forge-gas-snapshot/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin/=lib/openzeppelin-contracts/contracts/", "sgn-v2-contracts/=lib/sgn-v2-contracts/contracts/" ], "evmVersion": "shanghai", "outputSelection": { "*": { "*": [ "abi" ] } }, "optimizer": { "enabled": true, "mode": "3", "fallback_to_optimizing_for_size": false, "disable_system_request_memoization": true }, "metadata": {}, "libraries": {}, "detectMissingLibraries": false, "enableEraVMExtensions": false, "forceEVMLA": false }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"CannotAuthoriseSelf","type":"error"},{"inputs":[],"name":"InvalidContract","type":"error"},{"inputs":[],"name":"UnAuthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dexAddress","type":"address"}],"name":"DexAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dexAddress","type":"address"}],"name":"DexRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"functionSignature","type":"bytes4"},{"indexed":true,"internalType":"bool","name":"approved","type":"bool"}],"name":"FunctionSignatureApprovalChanged","type":"event"},{"inputs":[{"internalType":"address","name":"_dex","type":"address"}],"name":"addDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approvedDexs","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_dexs","type":"address[]"}],"name":"batchAddDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_dexs","type":"address[]"}],"name":"batchRemoveDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4[]","name":"_signatures","type":"bytes4[]"},{"internalType":"bool","name":"_approval","type":"bool"}],"name":"batchSetFunctionApprovalBySignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_signature","type":"bytes4"}],"name":"isFunctionApproved","outputs":[{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dex","type":"address"}],"name":"removeDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_signature","type":"bytes4"},{"internalType":"bool","name":"_approval","type":"bool"}],"name":"setFunctionApprovalBySignature","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
3cda33518dae013a0523eb5cf2c58748033466bfce120c5331b55b7e0700da5c4012e44b0100012d441ef6beab27714ee7ea8d459d07d9b6bc6e9faba2cc3d2cdaf7395a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0001000000000002000500000000000200000000000103550000008003000039000000400030043f00000001002001900000002c0000c13d000000000201001900000060022002700000010003200197000000040030008c000003690000413d000000000201043b000000e004200270000001020040009c000000340000213d000001080040009c000000670000213d0000010b0040009c0000011b0000613d0000010c0040009c000003690000c13d000000240030008c000003690000413d0000000001000416000000000001004b000003690000c13d03fc038c0000040f0000011001100197000000000010043f0000012301000041000000200010043f03fc03e50000040f000000000101041a000000ff001001900000000001000039000000010100c039000000400200043d0000000000120435000001000020009c0000010002008041000000400120021000000127011001c7000003fd0001042e0000000001000416000000000001004b000003690000c13d0000002001000039000001000010044300000120000004430000010101000041000003fd0001042e000001030040009c000000870000213d000001060040009c0000014c0000613d000001070040009c000003690000c13d000000440030008c000003690000413d0000000003000416000000000003004b000003690000c13d0000000403100370000000000303043b000500000003001d0000012200300198000003690000c13d0000002401100370000000000301043b000000000003004b0000000001000039000000010100c039000400000003001d000000000013004b000003690000c13d0000010e01000041000000000101041a0000010f011001970000000003000411000000000013004b000002ad0000c13d00000005010000290000011001100197000500000001001d000000000010043f0000012301000041000000200010043f000000040000006b000002cc0000c13d0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b000000000201041a0000012902200197000002d90000013d000001090040009c000001ce0000613d0000010a0040009c000003690000c13d000000240030008c000003690000413d0000000003000416000000000003004b000003690000c13d0000000401100370000000000101043b000500000001001d0000010f0010009c000003690000213d0000010e01000041000000000101041a0000010f011001970000000003000411000000000013004b000002550000c13d00000005010000290004010f0010019b03fc03940000040f0000000001000414000001000010009c0000010001008041000000c00110021000000119011001c70000800d0200003900000002030000390000011a04000041000001460000013d000001040040009c000002330000613d000001050040009c000003690000c13d000000240030008c000003690000413d0000000004000416000000000004004b000003690000c13d0000000404100370000000000404043b0000010d0040009c000003690000213d0000002305400039000000000035004b000003690000813d0000000405400039000000000151034f000000000101043b000300000001001d0000010d0010009c000003690000213d000200240040003d000000030100002900000005011002100000000201100029000000000031004b000003690000213d0000010e01000041000000000101041a0000010f011001970000000003000411000000000013004b000003090000c13d000000030000006b0000014a0000613d0000000003000019000000af0000013d000000030030006c0000014a0000813d000000050130021000000002011000290000000001100367000000000401043b0000010f0040009c000003690000213d000400000003001d0000000001000410000000000014004b0000037b0000613d000000000040043f0000011301000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c70000801002000039000500000004001d03fc03f70000040f000000050400002900000001002001900000000403000029000003690000613d000000000101043b000000000101041a000000ff00100190000000ad0000c13d000000000004004b0000037f0000613d0000011401000041000000000010044300000004004004430000000001000414000001000010009c0000010001008041000000c00110021000000115011001c7000080020200003903fc03f70000040f00000001002001900000038b0000613d000000000101043b000000000001004b00000005010000290000037f0000613d000000000010043f0000011301000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f00000005050000290000000100200190000003690000613d000000000101043b000000000101041a000000ff001001900000010d0000c13d000000000050043f0000011301000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f00000005050000290000000100200190000003690000613d000000000101043b000000000201041a000001290220019700000001022001bf000000000021041b0000011603000041000000000103041a0000010d0010009c0000024f0000213d0000000102100039000000000023041b000000000030043f000001170110009a000000000201041a0000011802200197000000000252019f000000000021041b0000000001000414000001000010009c0000010001008041000000c00110021000000119011001c70000800d0200003900000002030000390000011a0400004103fc03f20000040f00000001002001900000000403000029000003690000613d0000000103300039000000ad0000013d000000240030008c000003690000413d0000000003000416000000000003004b000003690000c13d0000000401100370000000000101043b000500000001001d0000010f0010009c000003690000213d0000010e01000041000000000101041a0000010f011001970000000003000411000000000013004b000002740000c13d00000005010000290000010f01100197000400000001001d000000000010043f0000011301000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b000000000101041a000000ff00100190000002e80000c13d0000000001000414000001000010009c0000010001008041000000c00110021000000119011001c70000800d0200003900000002030000390000012604000041000000040500002903fc03f20000040f0000000100200190000003690000613d0000000001000019000003fd0001042e000000240030008c000003690000413d0000000004000416000000000004004b000003690000c13d0000000404100370000000000404043b0000010d0040009c000003690000213d0000002305400039000000000035004b000003690000813d0000000405400039000000000151034f000000000101043b000200000001001d0000010d0010009c000003690000213d000100240040003d000000020100002900000005011002100000000101100029000000000031004b000003690000213d0000010e01000041000000000101041a0000010f011001970000000003000411000000000013004b000003280000c13d000000020000006b0000014a0000613d000500000000001d000000050100002900000005011002100000000101100029000300000001001d0000000001100367000000000301043b0000010f0030009c000003690000213d000000000030043f0000011301000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c70000801002000039000400000003001d03fc03f70000040f00000004030000290000000100200190000003690000613d000000000101043b000000000101041a000000ff00100190000001b80000613d000000000030043f0000011301000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f00000004060000290000000100200190000003690000613d000000000101043b000000000201041a0000012902200197000000000021041b0000011601000041000000000101041a000000000001004b000001b80000613d0000011602000041000000000020043f0000000002000019000001170320009a000000000403041a000000000564013f0000010f00500198000001a80000613d0000000102200039000000000012004b0000019f0000413d000001b80000013d0000011802400197000001250110009a000000000101041a0000010f01100197000000000121019f000000000013041b0000011604000041000000000104041a000000000001004b000003750000613d000001250210009a000000000302041a0000011803300197000000000032041b000000010110008a000000000014041b00000003010000290000000001100367000000000501043b0000010f0050009c000003690000213d0000000001000414000001000010009c0000010001008041000000c00110021000000119011001c70000800d020000390000000203000039000001260400004103fc03f20000040f0000000100200190000003690000613d00000005020000290000000102200039000500000002001d000000020020006c0000016d0000413d0000014a0000013d000000440030008c000003690000413d0000000004000416000000000004004b000003690000c13d0000000404100370000000000404043b0000010d0040009c000003690000213d0000002305400039000000000035004b000003690000813d0000000405400039000000000551034f000000000505043b000200000005001d0000010d0050009c000003690000213d000100240040003d000000020400002900000005044002100000000104400029000000000034004b000003690000213d0000002401100370000000000301043b000000000003004b0000000001000039000000010100c039000400000003001d000000000013004b000003690000c13d0000010e01000041000000000101041a0000010f011001970000000003000411000000000013004b000003470000c13d000000020000006b0000014a0000613d000500000000001d0000000501000029000000050110021000000001011000290000000001100367000000000101043b0000012200100198000003690000c13d000300000001001d000000000010043f0000012301000041000000200010043f000000040000006b000002130000613d0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f00000001002001900000000305000029000003690000613d000000000101043b000000000201041a000001290220019700000001022001bf000002200000013d0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f00000001002001900000000305000029000003690000613d000000000101043b000000000201041a0000012902200197000000000021041b0000000001000414000001000010009c0000010001008041000000c00110021000000119011001c70000800d0200003900000003030000390000012404000041000000040600002903fc03f20000040f0000000100200190000003690000613d00000005020000290000000102200039000500000002001d000000020020006c000001f70000413d0000014a0000013d0000000001000416000000000001004b000003690000c13d0000011602000041000000000102041a000000800010043f000000000020043f0000002002000039000000000001004b000002400000c13d000000a0010000390000000004020019000002940000013d000000a0050000390000011e0300004100000000040000190000000006050019000000000503041a0000010f05500197000000000556043600000001033000390000000104400039000000000014004b000002430000413d000000410160008a0000012a041001970000011f0040009c000002930000413d0000012001000041000000000010043f0000004101000039000000040010043f0000012101000041000003fe000104300000011001200197000000000010043f0000011101000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b000000000101041a000000ff001001900000007b0000c13d000003650000013d0000011001200197000000000010043f0000011101000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b000000000101041a000000ff001001900000012b0000c13d000003650000013d0000008001400039000000400010043f0000000000210435000000a002400039000000800300043d0000000000320435000000c002400039000000000003004b000002a40000613d000000a004000039000000000500001900000000460404340000010f0660019700000000026204360000000105500039000000000035004b0000029e0000413d0000000002120049000001000020009c00000100020080410000006002200210000001000010009c00000100010080410000004001100210000000000112019f000003fd0001042e0000011001200197000000000010043f0000011101000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b000000000101041a000000ff00100190000000520000c13d000003650000013d0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b000000000201041a000001290220019700000001022001bf000000000021041b0000000001000414000001000010009c0000010001008041000000c00110021000000119011001c70000800d02000039000000030300003900000124040000410000000505000029000000040600002903fc03f20000040f00000001002001900000014a0000c13d000003690000013d0000000401000029000000000010043f0000011301000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b000000000201041a0000012902200197000000000021041b0000011602000041000000000102041a000000000001004b00000005060000290000013e0000613d000000000020043f0000000002000019000001170320009a000000000403041a000000000564013f0000010f005001980000036b0000613d0000000102200039000000000012004b000003000000413d0000013e0000013d0000011001200197000000000010043f0000011101000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b000000000101041a000000ff00100190000000a90000c13d000003650000013d0000011001200197000000000010043f0000011101000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b000000000101041a000000ff001001900000016a0000c13d000003650000013d0000011001200197000000000010043f0000011101000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003690000613d000000000101043b000000000101041a000000ff00100190000001f40000c13d0000012801000041000000000010043f0000011c01000041000003fe000104300000000001000019000003fe000104300000011802400197000001250110009a000000000101041a0000010f01100197000000000121019f000000000013041b0000011601000041000000000201041a000000000002004b000003830000c13d0000012001000041000000000010043f0000003101000039000000040010043f0000012101000041000003fe000104300000011d01000041000000000010043f0000011c01000041000003fe000104300000011b01000041000000000010043f0000011c01000041000003fe00010430000000000010043f000001250320009a000000000403041a0000011804400197000000000043041b000000010220008a000000000021041b0000013e0000013d000000000001042f00000004010000390000000001100367000000000101043b0000012200100198000003920000c13d000000000001042d0000000001000019000003fe0001043000010000000000020001010f0010019c000003d70000613d0000011402000041000000000020044300000004001004430000000001000414000001000010009c0000010001008041000000c00110021000000115011001c7000080020200003903fc03f70000040f0000000100200190000003dd0000613d000000000101043b000000000001004b000003d70000613d0000000101000029000000000010043f0000011301000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003db0000613d000000000101043b000000000101041a000000ff00100190000003b80000613d000000000001042d0000000101000029000000000010043f0000011301000041000000200010043f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003db0000613d000000000101043b000000000201041a000001290220019700000001022001bf000000000021041b0000011602000041000000000102041a0000012b0010009c000003de0000813d0000000103100039000000000032041b000000000020043f000001170110009a000000000201041a000001180220019700000001022001af000000000021041b000000000001042d0000011b01000041000000000010043f0000011c01000041000003fe000104300000000001000019000003fe00010430000000000001042f0000012001000041000000000010043f0000004101000039000000040010043f0000012101000041000003fe00010430000000000001042f0000000001000414000001000010009c0000010001008041000000c00110021000000112011001c7000080100200003903fc03f70000040f0000000100200190000003f00000613d000000000101043b000000000001042d0000000001000019000003fe00010430000003f5002104210000000102000039000000000001042d0000000002000019000000000001042d000003fa002104230000000102000039000000000001042d0000000002000019000000000001042d000003fc00000432000003fd0001042e000003fe00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000009afc19c600000000000000000000000000000000000000000000000000000000fbb2d38000000000000000000000000000000000000000000000000000000000fbb2d38100000000000000000000000000000000000000000000000000000000fcd8e49e000000000000000000000000000000000000000000000000000000009afc19c700000000000000000000000000000000000000000000000000000000c3a6a96b0000000000000000000000000000000000000000000000000000000044e2b18b0000000000000000000000000000000000000000000000000000000044e2b18c00000000000000000000000000000000000000000000000000000000536db26600000000000000000000000000000000000000000000000000000000124f1ead000000000000000000000000000000000000000000000000000000002d2506a9000000000000000000000000000000000000000000000000ffffffffffffffffc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c1320000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000df05114fe8fad5d7cd2d71c5651effc2a4c21f13ee8b4a462e2a3bd4e140c73e02000000000000000000000000000000000000400000000000000000000000007a8ac5d3b7183f220a0602439da45ea337311d699902d1ed11a3725a714e7f1e1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000007a8ac5d3b7183f220a0602439da45ea337311d699902d1ed11a3725a714e7f20e89739d8045976b8d648e0266e6079b34d4ca9857cac9b1caebb532517bbdcb2ffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000007e0058dd0cbc0a8b7beaa013a4825655d8e9e81a5e2cc6582818deded0a41b996eefed20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000a9cefcae000000000000000000000000000000000000000000000000000000001768c627fba6894729b71fd9919f864cb2b3567a835364e35144acdae844234e000000000000000000000000000000000000000000000000ffffffffffffff804e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7a8ac5d3b7183f220a0602439da45ea337311d699902d1ed11a3725a714e7f1f9167f6a23d52a4522e9211205d62ce63f02d928227ae0fe00326f51e152a3c45e89739d8045976b8d648e0266e6079b34d4ca9857cac9b1caebb532517bbdcb378e0a2ffcdfbbb49ba5c8050d8630fab2176d825e8360809db049cd98f462a780000000000000000000000000000000000000020000000000000000000000000be24598300000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000100000000000000003224dbf793571e945fd2a1920e57f00e02b6245760afda29c7dc154c1ab48b01
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.