Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21115503 | 1 hr ago | 0.03705507 ETH | ||||
21115503 | 1 hr ago | 0.03705507 ETH | ||||
21115370 | 2 hrs ago | 0.09896062 ETH | ||||
21115370 | 2 hrs ago | 0.09896062 ETH | ||||
21114950 | 3 hrs ago | 0.08284174 ETH | ||||
21114950 | 3 hrs ago | 0.08284174 ETH | ||||
21114669 | 4 hrs ago | 0.36940047 ETH | ||||
21114669 | 4 hrs ago | 0.36940047 ETH | ||||
21114502 | 5 hrs ago | 0.0016532 ETH | ||||
21114502 | 5 hrs ago | 0.0016532 ETH | ||||
21114497 | 5 hrs ago | 0.01065158 ETH | ||||
21114497 | 5 hrs ago | 0.01065158 ETH | ||||
21114493 | 5 hrs ago | 0.00699847 ETH | ||||
21114493 | 5 hrs ago | 0.00699847 ETH | ||||
21114468 | 5 hrs ago | 0.0500691 ETH | ||||
21114468 | 5 hrs ago | 0.0500691 ETH | ||||
21114399 | 5 hrs ago | 0.29932784 ETH | ||||
21114399 | 5 hrs ago | 0.29932784 ETH | ||||
21114319 | 5 hrs ago | 0.00189215 ETH | ||||
21114319 | 5 hrs ago | 0.00189215 ETH | ||||
21114226 | 5 hrs ago | 0.15890982 ETH | ||||
21114226 | 5 hrs ago | 0.15890982 ETH | ||||
21113864 | 7 hrs ago | 0.12273075 ETH | ||||
21113864 | 7 hrs ago | 0.12273075 ETH | ||||
21113616 | 7 hrs ago | 0.10144385 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:
PortikusV1
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; // Contracts import { Diamond } from "@diamond/Diamond.sol"; import { ExecutorManager } from "@admin/ExecutorManager.sol"; // _____ _____ // ( ___ )----------------------------------------------------------------( ___ ) // | | | | // | | | | // | | | | // | | '||''|. . || '|| | | // | | || || ... ... .. .||. ... || .. ... ... .... | | // | | ||...|' .| '|. ||' '' || || || .' || || ||. ' | | // | | || || || || || || ||'|. || || . '|.. | | // | | .||. '|..|' .||. '|.' .||. .||. ||. '|..'|. |'..|' | | // | | | | // | | | | // |___| |___| // (_____)----------------------------------------------------------------(_____) /// @title Portikus V1 /// @notice The V1 implementation of the onchain settlment protocol /// allowing agents to execute swaps on behalf of signed orders /// @author Paraswap contract PortikusV1 is Diamond, ExecutorManager { /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(address _owner, address _diamondCutFacet) Diamond(_owner, _diamondCutFacet) { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * \ * Author: Nick Mudge (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 * * Implementation of a diamond. * /***************************************************************************** */ import { LibDiamond } from "./libraries/LibDiamond.sol"; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; contract Diamond { constructor(address _contractOwner, address _diamondCutFacet) payable { LibDiamond.setContractOwner(_contractOwner); // Add the diamondCut external function from the diamondCutFacet IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](1); bytes4[] memory functionSelectors = new bytes4[](1); functionSelectors[0] = IDiamondCut.diamondCut.selector; cut[0] = IDiamondCut.FacetCut({ facetAddress: _diamondCutFacet, action: IDiamondCut.FacetCutAction.Add, functionSelectors: functionSelectors }); LibDiamond.diamondCut(cut, address(0), ""); } // 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; bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION; // get diamond storage assembly { ds.slot := position } // 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 virtual { } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; // Interfaces import { IExecutorManager } from "@interfaces/admin/IExecutorManager.sol"; // Storage import { PortikusStorage } from "@storage/PortikusStorage.sol"; /// @title Executor Manager /// @notice A contract to manage authorized executors for the Portikus protocol contract ExecutorManager is PortikusStorage, IExecutorManager { /*////////////////////////////////////////////////////////////// OWNER //////////////////////////////////////////////////////////////*/ /// @inheritdoc IExecutorManager function updateExecutorAuthorization(address _executor, bool authorized) external onlyOwner { // Check if the executor already has the authorized agents if (executorAgentsList[_executor].length != 0) { // If the executor is being unauthorized, remove all authorized agents if (!authorized) { for (uint256 i = 0; i < executorAgentsList[_executor].length; i++) { delete executorAgents[_executor][executorAgentsList[_executor][i]]; } delete executorAgentsList[_executor]; delete executors[_executor]; } } else { // Update the executor authorization status executors[_executor] = authorized; } emit ExecutorAuthorizationUpdated(_executor, authorized); } /*////////////////////////////////////////////////////////////// EXTERNAL //////////////////////////////////////////////////////////////*/ /// @inheritdoc IExecutorManager function updateAgentAuthorization(address _agent, bool authorized) external { // Check if the executor is authorized, and revert if not if (!executors[msg.sender]) { revert ExecutorNotAuthorized(); } // Check if the executor is already authorized for the agent, if so, do nothing if (executorAgents[msg.sender][_agent] == authorized) { return; } // Update the agent authorization status executorAgents[msg.sender][_agent] = authorized; // Update the list of authorized agents if (authorized) { // Add the agent to the list of authorized agents executorAgentsList[msg.sender].push(_agent); } else { // Remove the agent from the list of authorized agents for (uint256 i = 0; i < executorAgentsList[msg.sender].length; i++) { if (executorAgentsList[msg.sender][i] == _agent) { executorAgentsList[msg.sender][i] = executorAgentsList[msg.sender][executorAgentsList[msg.sender].length - 1]; executorAgentsList[msg.sender].pop(); break; } } } emit AgentAuthorizationUpdated(msg.sender, _agent, authorized); } /*////////////////////////////////////////////////////////////// GETTERS //////////////////////////////////////////////////////////////*/ /// @inheritdoc IExecutorManager function getAuthorizedAgents(address _executor) external view returns (address[] memory) { return executorAgentsList[_executor]; } /// @inheritdoc IExecutorManager function isAgentAuthorized(address _executor, address _agent) external view returns (bool) { return executorAgents[_executor][_agent]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * \ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 * /***************************************************************************** */ import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; // Remember to add the loupe functions from DiamondLoupeFacet to the diamond. // The loupe functions are required by the EIP2535 Diamonds standard error InitializationFunctionReverted(address _initializationContractAddress, bytes _calldata); library LibDiamond { // 32 bytes keccak hash of a string to use as a diamond storage location. 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; // owner of the contract address contractOwner; } function diamondStorage() internal pure returns (DiamondStorage storage ds) { bytes32 position = DIAMOND_STORAGE_POSITION; // assigns struct storage slot to the storage position assembly { ds.slot := position } } event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); 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 { require(msg.sender == diamondStorage().contractOwner, "LibDiamond: Must be contract owner"); } 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; facetIndex++) { IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; if (action == IDiamondCut.FacetCutAction.Add) { addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); } else if (action == IDiamondCut.FacetCutAction.Replace) { replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); } else if (action == IDiamondCut.FacetCutAction.Remove) { removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); } else { revert("LibDiamondCut: Incorrect FacetCutAction"); } } emit DiamondCut(_diamondCut, _init, _calldata); initializeDiamondCut(_init, _calldata); } function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); 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; selectorIndex++) { 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++; } } function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); 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; selectorIndex++) { 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++; } } function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); 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; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; removeFunction(ds, oldFacetAddress, selector); } } 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.0; /** * \ * Author: Nick Mudge (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 * /***************************************************************************** */ interface IDiamondCut { enum FacetCutAction { Add, Replace, Remove } // Add=0, Replace=1, Remove=2 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; } /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors /// @param _init The address of the contract or facet to execute _calldata /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external; event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; /// @notice Interface for admin functions of the Portikus protocol interface IExecutorManager { /*////////////////////////////////////////////////////////////// ERRORS //////////////////////////////////////////////////////////////*/ /// @notice Error when an executor is not authorized error ExecutorNotAuthorized(); /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ /// @notice Emitted when the authorization of an executor is updated event ExecutorAuthorizationUpdated(address indexed executor, bool authorized); /// @notice Emitted when an agent's authorization is updated event AgentAuthorizationUpdated(address indexed executor, address indexed agent, bool authorized); /*////////////////////////////////////////////////////////////// EXTERNAL //////////////////////////////////////////////////////////////*/ /// @notice Update the authorization of an executor function updateExecutorAuthorization(address _executor, bool authorized) external; /// @notice Update the authorization status of an agent for an executor function updateAgentAuthorization(address _agent, bool authorized) external; /*////////////////////////////////////////////////////////////// GETTERS //////////////////////////////////////////////////////////////*/ /// @notice Get all authorized agents for an executor function getAuthorizedAgents(address _executor) external view returns (address[] memory); /// @notice Get the authorization status of an agent for an executor function isAgentAuthorized(address _executor, address _agent) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; // Dependencies import { ReentrancyGuardTransient as ReentrancyGuard } from "@openzeppelin/utils/ReentrancyGuardTransient.sol"; // Libraries import { LibDiamond } from "@diamond/libraries/LibDiamond.sol"; /// @title PortikusStorage /// @notice Defines the storage layout for the Portikus contract and /// modifiers that interact with the storage contract PortikusStorage is ReentrancyGuard { /*////////////////////////////////////////////////////////////// ERRORS //////////////////////////////////////////////////////////////*/ /// @notice Error emitted when the caller is not an authorized executor error UnauthorizedExecutor(); /*////////////////////////////////////////////////////////////// NONCES //////////////////////////////////////////////////////////////*/ /// @dev Mapping of nonces for each user to an indexed bitmap, where each bit represents a nonce. /// A bitmap is used to allow unordered nonce compsumtion, and reduces the gas cost of managing nonces. /// - owner: This represents the user for whom we are managing nonces. /// Each user (address) has its own separate set of nonces. /// - index: The index of the nonce bitmap, each index corresponds to a batch of 256 nonces. /// The index is calculated by dividing the nonce by 256 (nonce / 256). /// - nonce: Each bit in the 256-bit word represents a single nonce. /// A bit value of 1 means the nonce is used, and 0 means it is unused. mapping(address owner => mapping(uint256 index => uint256 nonce)) public nonces; /*////////////////////////////////////////////////////////////// EXECUTORS //////////////////////////////////////////////////////////////*/ /// @dev Mapping of authorized executors to authorized agents mapping(address executor => mapping(address agent => bool authorized)) public executorAgents; /// @dev Mapping of authorized executors to list of authorized agents mapping(address executor => address[] agents) public executorAgentsList; /// @dev Mapping of authorized executors mapping(address executor => bool authorized) public executors; /*////////////////////////////////////////////////////////////// MODIFIERS //////////////////////////////////////////////////////////////*/ /// @notice Ensure the caller is using an authorized agent and executor pair modifier onlyAuthorizedExecutor() { // solhint-disable-next-line avoid-tx-origin if (!executorAgents[msg.sender][tx.origin]) revert UnauthorizedExecutor(); _; } /// @notice Enforce that the caller is the contract owner modifier onlyOwner() { LibDiamond.enforceIsContractOwner(); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {StorageSlot} from "./StorageSlot.sol"; /** * @dev Variant of {ReentrancyGuard} that uses transient storage. * * NOTE: This variant only works on networks where EIP-1153 is available. */ abstract contract ReentrancyGuardTransient { using StorageSlot for *; // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant REENTRANCY_GUARD_STORAGE = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_reentrancyGuardEntered()) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail REENTRANCY_GUARD_STORAGE.asBoolean().tstore(true); } function _nonReentrantAfter() private { REENTRANCY_GUARD_STORAGE.asBoolean().tstore(false); } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return REENTRANCY_GUARD_STORAGE.asBoolean().tload(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.24; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC-1967 implementation slot: * ```solidity * contract ERC1967 { * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot. * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(newImplementation.code.length > 0); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * Since version 5.1, this library also support writing and reading value types to and from transient storage. * * * Example using transient storage: * ```solidity * contract Lock { * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot. * bytes32 internal constant _LOCK_SLOT = 0xf4678858b2b588224636b8522b729e7722d32fc491da849ed75b3fdf3c84f542; * * modifier locked() { * require(!_LOCK_SLOT.asBoolean().tload()); * * _LOCK_SLOT.asBoolean().tstore(true); * _; * _LOCK_SLOT.asBoolean().tstore(false); * } * } * ``` * * TIP: Consider using this library along with {SlotDerivation}. */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct Int256Slot { int256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Int256Slot` with member `value` located at `slot`. */ function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev UDVT that represent a slot holding a address. */ type AddressSlotType is bytes32; /** * @dev Cast an arbitrary slot to a AddressSlotType. */ function asAddress(bytes32 slot) internal pure returns (AddressSlotType) { return AddressSlotType.wrap(slot); } /** * @dev UDVT that represent a slot holding a bool. */ type BooleanSlotType is bytes32; /** * @dev Cast an arbitrary slot to a BooleanSlotType. */ function asBoolean(bytes32 slot) internal pure returns (BooleanSlotType) { return BooleanSlotType.wrap(slot); } /** * @dev UDVT that represent a slot holding a bytes32. */ type Bytes32SlotType is bytes32; /** * @dev Cast an arbitrary slot to a Bytes32SlotType. */ function asBytes32(bytes32 slot) internal pure returns (Bytes32SlotType) { return Bytes32SlotType.wrap(slot); } /** * @dev UDVT that represent a slot holding a uint256. */ type Uint256SlotType is bytes32; /** * @dev Cast an arbitrary slot to a Uint256SlotType. */ function asUint256(bytes32 slot) internal pure returns (Uint256SlotType) { return Uint256SlotType.wrap(slot); } /** * @dev UDVT that represent a slot holding a int256. */ type Int256SlotType is bytes32; /** * @dev Cast an arbitrary slot to a Int256SlotType. */ function asInt256(bytes32 slot) internal pure returns (Int256SlotType) { return Int256SlotType.wrap(slot); } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(AddressSlotType slot) internal view returns (address value) { /// @solidity memory-safe-assembly assembly { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(AddressSlotType slot, address value) internal { /// @solidity memory-safe-assembly assembly { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(BooleanSlotType slot) internal view returns (bool value) { /// @solidity memory-safe-assembly assembly { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(BooleanSlotType slot, bool value) internal { /// @solidity memory-safe-assembly assembly { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(Bytes32SlotType slot) internal view returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(Bytes32SlotType slot, bytes32 value) internal { /// @solidity memory-safe-assembly assembly { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(Uint256SlotType slot) internal view returns (uint256 value) { /// @solidity memory-safe-assembly assembly { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(Uint256SlotType slot, uint256 value) internal { /// @solidity memory-safe-assembly assembly { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(Int256SlotType slot) internal view returns (int256 value) { /// @solidity memory-safe-assembly assembly { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(Int256SlotType slot, int256 value) internal { /// @solidity memory-safe-assembly assembly { tstore(slot, value) } } }
{ "remappings": [ "@forge-std/=lib/forge-std/src/", "@interfaces/=src/interfaces/", "@types/=src/types/", "@libraries/=src/libraries/", "@solady/=lib/solady/src/", "@prb-test/=lib/prb-test/src/", "@openzeppelin/=lib/openzeppelin-contracts/contracts/", "@admin/=src/admin/", "@executors/=src/executors/", "@diamond/=src/diamond/", "@storage/=src/storage/", "@facets/=src/facets/", "@mocks/=test/mocks/", "@util/=src/util/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=node_modules/forge-std/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "prb-test/=lib/prb-test/src/", "solady/=lib/solady/src/" ], "optimizer": { "enabled": true, "runs": 1000000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_diamondCutFacet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ExecutorNotAuthorized","type":"error"},{"inputs":[{"internalType":"address","name":"_initializationContractAddress","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"InitializationFunctionReverted","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"UnauthorizedExecutor","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":true,"internalType":"address","name":"agent","type":"address"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"}],"name":"AgentAuthorizationUpdated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"_init","type":"address"},{"indexed":false,"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"DiamondCut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"}],"name":"ExecutorAuthorizationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"executor","type":"address"},{"internalType":"address","name":"agent","type":"address"}],"name":"executorAgents","outputs":[{"internalType":"bool","name":"authorized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"executorAgentsList","outputs":[{"internalType":"address","name":"agents","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"}],"name":"executors","outputs":[{"internalType":"bool","name":"authorized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_executor","type":"address"}],"name":"getAuthorizedAgents","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_executor","type":"address"},{"internalType":"address","name":"_agent","type":"address"}],"name":"isAgentAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_agent","type":"address"},{"internalType":"bool","name":"authorized","type":"bool"}],"name":"updateAgentAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_executor","type":"address"},{"internalType":"bool","name":"authorized","type":"bool"}],"name":"updateExecutorAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080346106fd57611ad86001600160401b03601f38839003908101601f1916840190828211858310176106c557808591604095869485528339810103126106fd576100498361073f565b90610057602080950161073f565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132080546001600160a01b039485166001600160a01b03198216811790925591929184167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36100c6610720565b91600190818452865f5b8181106106d95750506100e1610720565b8281528736818301376307e4c70760e21b6100fb82610753565b5285610105610701565b921682525f888301528682015261011b84610753565b5261012583610753565b50845191868301908111838210176106c55785525f808352909390845b610268575b50845193606091606086019060608752855180925260809060808801908a60808560051b8b01019801955f935b8585106101c5575f8d8c01528a8a038b8d01528b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738c806101b58e8e610788565b0390a151610d309081610d488239f35b9091929394959698607f198b82030185528c8a51848301918682511684528101516003811015610254578f8f918588848f9798968a9486809901520151948201528351809752019101935f905b808210610231575050819293509b019501950193969594929190610174565b928091949263ffffffff60e01b87511681520194019201928f91938b9394610212565b634e487b7160e01b5f52602160045260245ffd5b83949194518110156106bd578661027f8286610774565b510151600381101561025457806103f557508461029c8286610774565b51511682876102ab8488610774565b510151916102bb835115156107ac565b6102c681151561080c565b6001600160a01b0381165f9081525f80516020611ab883398151915260205260409020546001600160601b03169283156103e7575b82935f935b610315575b5050505080915b01909491610142565b9091929382518510156103e157506001600160e01b03196103368584610774565b5116805f525f80516020611a788339815191528c52898b5f2054166103775761036d82610368868a9796958895610c97565b61086d565b9401929384610300565b8a5162461bcd60e51b8152600481018d9052603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c72656164792065786973747300000000000000000000006064820152608490fd5b93610305565b6103f082610bc7565b6102fb565b8083036105645750846104088286610774565b51511682876104178488610774565b51015191610427835115156107ac565b61043281151561080c565b6001600160a01b0381165f9081525f80516020611ab883398151915260205260409020546001600160601b0316928315610556575b82935f935b61047c575b50505050809161030c565b90919293825185101561055057506001600160e01b031961049d8584610774565b5116805f525f80516020611a788339815191528c52898b5f2054168481146104e65782610368868a979695856104d78a976104dc976108dd565b610c97565b940192938461046c565b8b5162461bcd60e51b8152600481018e9052603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e00000000000000006064820152608490fd5b93610471565b61055f82610bc7565b610467565b60020361066957846105768286610774565b515116866105848387610774565b51015190610594825115156107ac565b6105ff5782905f825b6105ab575b5050809161030c565b819291518110156105f75781906105ee6001600160e01b03196105ce8387610774565b5116805f525f80516020611a788339815191528d528a8c5f2054166108dd565b0181929161059d565b8192506105a2565b865162461bcd60e51b815260048101899052603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d7573742062652061646472657373283029000000000000000000006064820152608490fd5b855162461bcd60e51b815260048101889052602760248201527f4c69624469616d6f6e644375743a20496e636f727265637420466163657443756044820152663a20b1ba34b7b760c91b6064820152608490fd5b939093610147565b634e487b7160e01b5f52604160045260245ffd5b6106e1610701565b5f81525f838201526060898201528282880101520187906100d0565b5f80fd5b60405190606082016001600160401b038111838210176106c557604052565b60408051919082016001600160401b038111838210176106c557604052565b51906001600160a01b03821682036106fd57565b8051156107605760200190565b634e487b7160e01b5f52603260045260245ffd5b80518210156107605760209160051b010190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b156107b357565b60405162461bcd60e51b815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201526a1858d95d081d1bc818dd5d60aa1b6064820152608490fd5b1561081357565b60405162461bcd60e51b815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201526b65206164647265737328302960a01b6064820152608490fd5b6001600160601b039081169081146108855760010190565b634e487b7160e01b5f52601160045260245ffd5b9190918054831015610760575f52601c60205f208360031c019260021b1690565b5f80516020611a988339815191528054821015610760575f5260205f2001905f90565b6001600160a01b03908116918215610b5c57308314610b005763ffffffff60e01b809116805f525f80516020611a7883398151915293602090858252604093845f205460a01c96825f525f80516020611ab883398151915294858552865f2054925f19998a8501948511610885578891878988888503610a75575b9450505050505f52858552865f2080548015610a11578a019061097b8282610899565b63ffffffff82549160031b1b19169055555f5283525f85812055156109a3575b505050505050565b5f80516020611a9883398151915294855487810190811161088557825f52848452816001875f20015491808303610a25575b5050508554958615610a11575f9760019701916109f1836108ba565b909182549160031b1b1916905555855252822001555f808080808061099b565b634e487b7160e01b5f52603160045260245ffd5b610a2e906108ba565b90549060031b1c16610a6181610a43846108ba565b90919060018060a01b038084549260031b9316831b921b1916179055565b5f528484526001865f2001555f81816109d5565b610aaa85610af597610ac794845f52808752610a938d835f20610899565b90549060031b1c60e01b9687955f52525f20610899565b90919063ffffffff83549160031b9260e01c831b921b1916179055565b165f90815284885289902080546001600160a01b031660a09290921b6001600160a01b031916919091179055565b865f80878988610958565b60405162461bcd60e51b815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201526d3a30b1363290333ab731ba34b7b760911b6064820152608490fd5b60405162461bcd60e51b815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e27742065786973740000000000000000006064820152608490fd5b610bcf610701565b602481527f4c69624469616d6f6e644375743a204e657720666163657420686173206e6f20602082015263636f646560e01b6040820152813b15610c6f57505f80516020611a9883398151915280546001600160a01b0383165f9081525f80516020611ab8833981519152602052604090206001018190559190680100000000000000008310156106c55782610a43916001610c6d950190556108ba565b565b60405162461bcd60e51b815260206004820152908190610c93906024830190610788565b0390fd5b6001600160e01b031981165f8181525f80516020611a788339815191526020819052604090912080546001600160a01b031660a09590951b6001600160a01b0319169490941790935590926001600160a01b03165f8181525f80516020611ab8833981519152602052604090208054919490680100000000000000008310156106c55782610aaa916001610d2d95018155610899565b5f5260205260405f209060018060a01b031982541617905556fe60806040526004361015610015575b36610c3d57005b5f3560e01c806329f09f18146100905780632de769a61461008b578063502e1a16146100865780635b9e74e4146100815780636099fbc1146100725780638a8194011461007c5780639ac2a011146100775763d84937fc0361000e575b6106ce565b610785565b61076c565b6105e0565b61054b565b6101fb565b346100e75761009e3661010e565b9073ffffffffffffffffffffffffffffffffffffffff8091165f52600260205260405f2080548310156100e7576020926100d79161015f565b9190546040519260031b1c168152f35b5f80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100e757565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126100e75760043573ffffffffffffffffffffffffffffffffffffffff811681036100e7579060243590565b8054821015610174575f5260205f2001905f90565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126100e75760043573ffffffffffffffffffffffffffffffffffffffff811681036100e7579060243580151581036100e75790565b346100e757610209366101a1565b9073ffffffffffffffffffffffffffffffffffffffff90817fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c1320541633036104c7576102728173ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b54156104435782156102b3575b907fe34eed5dca2bffd35c4fb52c2af0521e39e6586c7c638d1540f494578c6b5608915b60405193151584521691602090a2005b915f5b6102de8473ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b548110156103bb576001906103b561038d6103178773ffffffffffffffffffffffffffffffffffffffff165f52600160205260405f2090565b61036b61034b856103468b73ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b61015f565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008154169055565b016102b6565b5091907fe34eed5dca2bffd35c4fb52c2af0521e39e6586c7c638d1540f494578c6b56089161041061040b8273ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b61081a565b61043b61038d8273ffffffffffffffffffffffffffffffffffffffff165f52600360205260405f2090565b90915061027f565b90816104c2846104927fe34eed5dca2bffd35c4fb52c2af0521e39e6586c7c638d1540f494578c6b56089573ffffffffffffffffffffffffffffffffffffffff165f52600360205260405f2090565b9060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b6102a3565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4c69624469616d6f6e643a204d75737420626520636f6e7472616374206f776e60448201527f65720000000000000000000000000000000000000000000000000000000000006064820152fd5b346100e75773ffffffffffffffffffffffffffffffffffffffff61056e3661010e565b91165f525f60205260405f20905f52602052602060405f2054604051908152f35b60209060206040818301928281528551809452019301915f5b8281106105b6575050505090565b835173ffffffffffffffffffffffffffffffffffffffff16855293810193928101926001016105a8565b346100e7576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e75773ffffffffffffffffffffffffffffffffffffffff8061062e6100eb565b165f52600260205260405f2060405192838493602084549283815201935f5260205f20925f915b8383106106b257868603601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01687018767ffffffffffffffff8211818310176106ad576106a98291826040528261058f565b0390f35b6107ed565b8454811686528796509481019460019485019490920191610655565b346100e75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e7576107056100eb565b6024359073ffffffffffffffffffffffffffffffffffffffff9081831683036100e75760209260ff9261076092165f526001845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b346100e75761078361077d366101a1565b9061097f565b005b346100e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e75773ffffffffffffffffffffffffffffffffffffffff6107d16100eb565b165f526003602052602060ff60405f2054166040519015158152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8054905f815581610829575050565b5f5260205f20908101905b81811061083f575050565b5f8155600101610834565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161087757565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b805480156108fc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906108d9828261015f565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b90815491680100000000000000008310156106ad578261095191600161097d9501815561015f565b90919073ffffffffffffffffffffffffffffffffffffffff8084549260031b9316831b921b1916179055565b565b906109b96109b56109ae3373ffffffffffffffffffffffffffffffffffffffff165f52600360205260405f2090565b5460ff1690565b1590565b610c1357610a0f6109ae836109ec3373ffffffffffffffffffffffffffffffffffffffff165f52600160205260405f2090565b9073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b151581151514610c0f57610a4981610492846109ec3373ffffffffffffffffffffffffffffffffffffffff165f52600160205260405f2090565b8015610acc57610a8082610a7b3373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b610929565b604051901515815273ffffffffffffffffffffffffffffffffffffffff919091169033907fec93ee534fe48c73852d939b6c512aeb2ba1e9b9361c48acddb8f3f5dbe36f6d90602090a3565b905f5b335f90815260026020526040902054811015610c0857610b1461034b826103463373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b73ffffffffffffffffffffffffffffffffffffffff808416911614610b3b57600101610acf565b610bd390610951610baa61034b610b739695963373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b610ba4610b9e3373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b5461084a565b9061015f565b916103463373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b610c03610bfe3373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b6108a4565b610a80565b5090610a80565b5050565b60046040517fc5ee852a000000000000000000000000000000000000000000000000000000008152fd5b7fffffffff000000000000000000000000000000000000000000000000000000005f35165f527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c60205273ffffffffffffffffffffffffffffffffffffffff60405f2054168015610cc5575f8091368280378136915af43d5f803e15610cc1573d5ff35b3d5ffd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f742065786973746044820152fdfea164736f6c6343000819000ac8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131cc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131ec8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131d00000000000000000000000072e218c6ef451339684b299ae4bbf1f2ab671a71000000000000000000000000ddbbf6630298859b3ff802207a9e0ac38af19643
Deployed Bytecode
0x60806040526004361015610015575b36610c3d57005b5f3560e01c806329f09f18146100905780632de769a61461008b578063502e1a16146100865780635b9e74e4146100815780636099fbc1146100725780638a8194011461007c5780639ac2a011146100775763d84937fc0361000e575b6106ce565b610785565b61076c565b6105e0565b61054b565b6101fb565b346100e75761009e3661010e565b9073ffffffffffffffffffffffffffffffffffffffff8091165f52600260205260405f2080548310156100e7576020926100d79161015f565b9190546040519260031b1c168152f35b5f80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100e757565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126100e75760043573ffffffffffffffffffffffffffffffffffffffff811681036100e7579060243590565b8054821015610174575f5260205f2001905f90565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126100e75760043573ffffffffffffffffffffffffffffffffffffffff811681036100e7579060243580151581036100e75790565b346100e757610209366101a1565b9073ffffffffffffffffffffffffffffffffffffffff90817fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c1320541633036104c7576102728173ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b54156104435782156102b3575b907fe34eed5dca2bffd35c4fb52c2af0521e39e6586c7c638d1540f494578c6b5608915b60405193151584521691602090a2005b915f5b6102de8473ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b548110156103bb576001906103b561038d6103178773ffffffffffffffffffffffffffffffffffffffff165f52600160205260405f2090565b61036b61034b856103468b73ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b61015f565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008154169055565b016102b6565b5091907fe34eed5dca2bffd35c4fb52c2af0521e39e6586c7c638d1540f494578c6b56089161041061040b8273ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b61081a565b61043b61038d8273ffffffffffffffffffffffffffffffffffffffff165f52600360205260405f2090565b90915061027f565b90816104c2846104927fe34eed5dca2bffd35c4fb52c2af0521e39e6586c7c638d1540f494578c6b56089573ffffffffffffffffffffffffffffffffffffffff165f52600360205260405f2090565b9060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b6102a3565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4c69624469616d6f6e643a204d75737420626520636f6e7472616374206f776e60448201527f65720000000000000000000000000000000000000000000000000000000000006064820152fd5b346100e75773ffffffffffffffffffffffffffffffffffffffff61056e3661010e565b91165f525f60205260405f20905f52602052602060405f2054604051908152f35b60209060206040818301928281528551809452019301915f5b8281106105b6575050505090565b835173ffffffffffffffffffffffffffffffffffffffff16855293810193928101926001016105a8565b346100e7576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e75773ffffffffffffffffffffffffffffffffffffffff8061062e6100eb565b165f52600260205260405f2060405192838493602084549283815201935f5260205f20925f915b8383106106b257868603601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01687018767ffffffffffffffff8211818310176106ad576106a98291826040528261058f565b0390f35b6107ed565b8454811686528796509481019460019485019490920191610655565b346100e75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e7576107056100eb565b6024359073ffffffffffffffffffffffffffffffffffffffff9081831683036100e75760209260ff9261076092165f526001845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b346100e75761078361077d366101a1565b9061097f565b005b346100e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e75773ffffffffffffffffffffffffffffffffffffffff6107d16100eb565b165f526003602052602060ff60405f2054166040519015158152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8054905f815581610829575050565b5f5260205f20908101905b81811061083f575050565b5f8155600101610834565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161087757565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b805480156108fc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906108d9828261015f565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b90815491680100000000000000008310156106ad578261095191600161097d9501815561015f565b90919073ffffffffffffffffffffffffffffffffffffffff8084549260031b9316831b921b1916179055565b565b906109b96109b56109ae3373ffffffffffffffffffffffffffffffffffffffff165f52600360205260405f2090565b5460ff1690565b1590565b610c1357610a0f6109ae836109ec3373ffffffffffffffffffffffffffffffffffffffff165f52600160205260405f2090565b9073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b151581151514610c0f57610a4981610492846109ec3373ffffffffffffffffffffffffffffffffffffffff165f52600160205260405f2090565b8015610acc57610a8082610a7b3373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b610929565b604051901515815273ffffffffffffffffffffffffffffffffffffffff919091169033907fec93ee534fe48c73852d939b6c512aeb2ba1e9b9361c48acddb8f3f5dbe36f6d90602090a3565b905f5b335f90815260026020526040902054811015610c0857610b1461034b826103463373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b73ffffffffffffffffffffffffffffffffffffffff808416911614610b3b57600101610acf565b610bd390610951610baa61034b610b739695963373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b610ba4610b9e3373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b5461084a565b9061015f565b916103463373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b610c03610bfe3373ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2090565b6108a4565b610a80565b5090610a80565b5050565b60046040517fc5ee852a000000000000000000000000000000000000000000000000000000008152fd5b7fffffffff000000000000000000000000000000000000000000000000000000005f35165f527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c60205273ffffffffffffffffffffffffffffffffffffffff60405f2054168015610cc5575f8091368280378136915af43d5f803e15610cc1573d5ff35b3d5ffd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f742065786973746044820152fdfea164736f6c6343000819000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000072e218c6ef451339684b299ae4bbf1f2ab671a71000000000000000000000000ddbbf6630298859b3ff802207a9e0ac38af19643
-----Decoded View---------------
Arg [0] : _owner (address): 0x72E218c6EF451339684B299AE4Bbf1F2ab671A71
Arg [1] : _diamondCutFacet (address): 0xddBbf6630298859B3ff802207A9e0aC38af19643
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000072e218c6ef451339684b299ae4bbf1f2ab671a71
Arg [1] : 000000000000000000000000ddbbf6630298859b3ff802207a9e0ac38af19643
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.