ETH Price: $3,485.13 (+2.06%)

Contract

0x36fF475499E928590659D5b8aA3A34330a583FD9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...205196802024-08-13 12:23:59133 days ago1723551839IN
0x36fF4754...30a583FD9
0 ETH0.000069622.09180971
Update Executor ...204405302024-08-02 11:21:47144 days ago1722597707IN
0x36fF4754...30a583FD9
0 ETH0.000141492.83900869
Diamond Cut204405282024-08-02 11:21:23144 days ago1722597683IN
0x36fF4754...30a583FD9
0 ETH0.00157832.66414582

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
211211582024-11-05 11:29:5949 days ago1730806199
0x36fF4754...30a583FD9
0.18899004 ETH
211211582024-11-05 11:29:5949 days ago1730806199
0x36fF4754...30a583FD9
0.18899004 ETH
211210542024-11-05 11:08:5949 days ago1730804939
0x36fF4754...30a583FD9
0.13397417 ETH
211210542024-11-05 11:08:5949 days ago1730804939
0x36fF4754...30a583FD9
0.13397417 ETH
211205622024-11-05 9:30:2349 days ago1730799023
0x36fF4754...30a583FD9
35.5044648 ETH
211205622024-11-05 9:30:2349 days ago1730799023
0x36fF4754...30a583FD9
35.5044648 ETH
211203762024-11-05 8:52:5949 days ago1730796779
0x36fF4754...30a583FD9
24.8518593 ETH
211203762024-11-05 8:52:5949 days ago1730796779
0x36fF4754...30a583FD9
24.8518593 ETH
211201132024-11-05 7:59:5949 days ago1730793599
0x36fF4754...30a583FD9
0.00747754 ETH
211201132024-11-05 7:59:5949 days ago1730793599
0x36fF4754...30a583FD9
0.00747754 ETH
211200672024-11-05 7:50:4749 days ago1730793047
0x36fF4754...30a583FD9
0.1007634 ETH
211200672024-11-05 7:50:4749 days ago1730793047
0x36fF4754...30a583FD9
0.1007634 ETH
211200132024-11-05 7:39:4749 days ago1730792387
0x36fF4754...30a583FD9
0.06058365 ETH
211200132024-11-05 7:39:4749 days ago1730792387
0x36fF4754...30a583FD9
0.06058365 ETH
211199602024-11-05 7:29:1149 days ago1730791751
0x36fF4754...30a583FD9
0.31601326 ETH
211199602024-11-05 7:29:1149 days ago1730791751
0x36fF4754...30a583FD9
0.31601326 ETH
211195222024-11-05 6:01:2349 days ago1730786483
0x36fF4754...30a583FD9
0.60127752 ETH
211195222024-11-05 6:01:2349 days ago1730786483
0x36fF4754...30a583FD9
0.60127752 ETH
211192432024-11-05 5:05:1149 days ago1730783111
0x36fF4754...30a583FD9
0.01727722 ETH
211192432024-11-05 5:05:1149 days ago1730783111
0x36fF4754...30a583FD9
0.01727722 ETH
211192292024-11-05 5:02:2349 days ago1730782943
0x36fF4754...30a583FD9
0.00269372 ETH
211192292024-11-05 5:02:2349 days ago1730782943
0x36fF4754...30a583FD9
0.00269372 ETH
211192202024-11-05 5:00:3549 days ago1730782835
0x36fF4754...30a583FD9
40.944782 ETH
211192202024-11-05 5:00:3549 days ago1730782835
0x36fF4754...30a583FD9
40.944782 ETH
211183032024-11-05 1:55:2349 days ago1730771723
0x36fF4754...30a583FD9
0.0402871 ETH
View All Internal Transactions
Loading...
Loading

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
File 1 of 9 : PortikusV1.sol
// 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) { }
}

File 2 of 9 : Diamond.sol
// 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 { }
}

File 3 of 9 : ExecutorManager.sol
// 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];
    }
}

File 4 of 9 : LibDiamond.sol
// 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);
    }
}

File 5 of 9 : IDiamondCut.sol
// 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);
}

File 6 of 9 : IExecutorManager.sol
// 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);
}

File 7 of 9 : PortikusStorage.sol
// 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();
        _;
    }
}

File 8 of 9 : ReentrancyGuardTransient.sol
// 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();
    }
}

File 9 of 9 : StorageSlot.sol
// 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)
        }
    }
}

Settings
{
  "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

Contract ABI

[{"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"}]

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.