ETH Price: $2,423.80 (-0.01%)
Gas: 5.84 Gwei
 

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:5983 days ago1723551839IN
0x36fF4754...30a583FD9
0 ETH0.000069622.09180971
Update Executor ...204405302024-08-02 11:21:4794 days ago1722597707IN
0x36fF4754...30a583FD9
0 ETH0.000141492.83900869
Diamond Cut204405282024-08-02 11:21:2394 days ago1722597683IN
0x36fF4754...30a583FD9
0 ETH0.00157832.66414582
0x60803461204405242024-08-02 11:20:3594 days ago1722597635IN
 Create: PortikusV1
0 ETH0.002464232.50581211

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
211155032024-11-04 16:33:111 hr ago1730737991
0x36fF4754...30a583FD9
0.03705507 ETH
211155032024-11-04 16:33:111 hr ago1730737991
0x36fF4754...30a583FD9
0.03705507 ETH
211153702024-11-04 16:06:112 hrs ago1730736371
0x36fF4754...30a583FD9
0.09896062 ETH
211153702024-11-04 16:06:112 hrs ago1730736371
0x36fF4754...30a583FD9
0.09896062 ETH
211149502024-11-04 14:41:593 hrs ago1730731319
0x36fF4754...30a583FD9
0.08284174 ETH
211149502024-11-04 14:41:593 hrs ago1730731319
0x36fF4754...30a583FD9
0.08284174 ETH
211146692024-11-04 13:45:354 hrs ago1730727935
0x36fF4754...30a583FD9
0.36940047 ETH
211146692024-11-04 13:45:354 hrs ago1730727935
0x36fF4754...30a583FD9
0.36940047 ETH
211145022024-11-04 13:12:115 hrs ago1730725931
0x36fF4754...30a583FD9
0.0016532 ETH
211145022024-11-04 13:12:115 hrs ago1730725931
0x36fF4754...30a583FD9
0.0016532 ETH
211144972024-11-04 13:11:115 hrs ago1730725871
0x36fF4754...30a583FD9
0.01065158 ETH
211144972024-11-04 13:11:115 hrs ago1730725871
0x36fF4754...30a583FD9
0.01065158 ETH
211144932024-11-04 13:10:235 hrs ago1730725823
0x36fF4754...30a583FD9
0.00699847 ETH
211144932024-11-04 13:10:235 hrs ago1730725823
0x36fF4754...30a583FD9
0.00699847 ETH
211144682024-11-04 13:05:235 hrs ago1730725523
0x36fF4754...30a583FD9
0.0500691 ETH
211144682024-11-04 13:05:235 hrs ago1730725523
0x36fF4754...30a583FD9
0.0500691 ETH
211143992024-11-04 12:51:355 hrs ago1730724695
0x36fF4754...30a583FD9
0.29932784 ETH
211143992024-11-04 12:51:355 hrs ago1730724695
0x36fF4754...30a583FD9
0.29932784 ETH
211143192024-11-04 12:35:235 hrs ago1730723723
0x36fF4754...30a583FD9
0.00189215 ETH
211143192024-11-04 12:35:235 hrs ago1730723723
0x36fF4754...30a583FD9
0.00189215 ETH
211142262024-11-04 12:16:475 hrs ago1730722607
0x36fF4754...30a583FD9
0.15890982 ETH
211142262024-11-04 12:16:475 hrs ago1730722607
0x36fF4754...30a583FD9
0.15890982 ETH
211138642024-11-04 11:03:477 hrs ago1730718227
0x36fF4754...30a583FD9
0.12273075 ETH
211138642024-11-04 11:03:477 hrs ago1730718227
0x36fF4754...30a583FD9
0.12273075 ETH
211136162024-11-04 10:14:117 hrs ago1730715251
0x36fF4754...30a583FD9
0.10144385 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.