ETH Price: $2,338.39 (-1.42%)

Contract

0x24496D746Fd003397790E41d0d1Ce61F4F7fd61f
 

Overview

ETH Balance

0.008202212066560414 ETH

Eth Value

$19.18 (@ $2,338.39/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Perform Delegate...207375652024-09-12 22:38:5920 days ago1726180739IN
ENS Nameopenmesh-network.eth
0 ETH0.000064981.97572656
Multicall207328502024-09-12 6:49:4721 days ago1726123787IN
ENS Nameopenmesh-network.eth
0 ETH0.000132811.86634427
Multicall207265012024-09-11 9:33:1122 days ago1726047191IN
ENS Nameopenmesh-network.eth
0 ETH0.000081641.44978616
Multicall207259712024-09-11 7:46:2322 days ago1726040783IN
ENS Nameopenmesh-network.eth
0 ETH0.000118581.61534667
Multicall207166582024-09-10 0:32:4723 days ago1725928367IN
ENS Nameopenmesh-network.eth
0 ETH0.000362411.99391351
Multicall207003282024-09-07 17:50:2326 days ago1725731423IN
ENS Nameopenmesh-network.eth
0 ETH0.000055430.98446156
Multicall206881752024-09-06 1:09:1127 days ago1725584951IN
ENS Nameopenmesh-network.eth
0 ETH0.000152440.96395821
Transfer206830842024-09-05 8:06:4728 days ago1725523607IN
ENS Nameopenmesh-network.eth
0.00414079 ETH0.00005172.45549025
Transfer206619712024-09-02 9:24:2331 days ago1725269063IN
ENS Nameopenmesh-network.eth
0.00406141 ETH0.000064363.05639984
Multicall202611922024-07-08 10:27:2387 days ago1720434443IN
ENS Nameopenmesh-network.eth
0 ETH0.000650393.12334782
Perform Call202611142024-07-08 10:11:4787 days ago1720433507IN
ENS Nameopenmesh-network.eth
0 ETH0.000169542.90169505
Multicall200499372024-06-08 21:56:47116 days ago1717883807IN
ENS Nameopenmesh-network.eth
0 ETH0.000488814.95743085
Perform Call198925342024-05-17 22:01:47138 days ago1715983307IN
ENS Nameopenmesh-network.eth
0 ETH0.000172132.94596378
Multicall197280332024-04-24 21:52:59161 days ago1713995579IN
ENS Nameopenmesh-network.eth
0 ETH0.00339317.97061867
Multicall197280332024-04-24 21:52:59161 days ago1713995579IN
ENS Nameopenmesh-network.eth
0 ETH0.001243937.97061867

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
197280332024-04-24 21:52:59161 days ago1713995579  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OpenmeshAdmin

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion, MIT license
File 1 of 14 : OpenmeshAdmin.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {SmartAccount} from "../lib/smart-account/src/SmartAccount.sol";
import {SmartAccountBaseInstaller} from "../lib/smart-account/src/SmartAccountBaseInstaller.sol";

address constant installer = 0x4811864B715C0F1B0f9790a8ee6F11dC25b7F258;

contract OpenmeshAdmin is SmartAccount {
    constructor()
        SmartAccount(
            installer,
            abi.encodeWithSelector(SmartAccountBaseInstaller.install.selector, 0x6b221aA392146E31743E1beB5827e88284B09753)
        )
    {}
}

File 2 of 14 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)

pragma solidity ^0.8.20;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {FailedInnerCall} error.
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

File 3 of 14 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 4 of 14 : Multicall.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Multicall.sol)

pragma solidity ^0.8.20;

import {Address} from "./Address.sol";
import {Context} from "./Context.sol";

/**
 * @dev Provides a function to batch together multiple calls in a single external call.
 *
 * Consider any assumption about calldata validation performed by the sender may be violated if it's not especially
 * careful about sending transactions invoking {multicall}. For example, a relay address that filters function
 * selectors won't filter calls nested within a {multicall} operation.
 *
 * NOTE: Since 5.0.1 and 4.9.4, this contract identifies non-canonical contexts (i.e. `msg.sender` is not {_msgSender}).
 * If a non-canonical context is identified, the following self `delegatecall` appends the last bytes of `msg.data`
 * to the subcall. This makes it safe to use with {ERC2771Context}. Contexts that don't affect the resolution of
 * {_msgSender} are not propagated to subcalls.
 */
abstract contract Multicall is Context {
    /**
     * @dev Receives and executes a batch of function calls on this contract.
     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall
     */
    function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) {
        bytes memory context = msg.sender == _msgSender()
            ? new bytes(0)
            : msg.data[msg.data.length - _contextSuffixLength():];

        results = new bytes[](data.length);
        for (uint256 i = 0; i < data.length; i++) {
            results[i] = Address.functionDelegateCall(address(this), bytes.concat(data[i], context));
        }
        return results;
    }
}

File 5 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 6 of 14 : ISmartAccount.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ISmartAccount {
    /// @notice Executes an arbitrary blockchain call.
    function performCall(address to, uint256 value, bytes calldata data) external returns (bytes memory returnValue);

    /// @notice Executes an arbitrary blockchain call with delegateCall. This allows advanced code execution inside the account itself.
    function performDelegateCall(address to, bytes calldata data) external returns (bytes memory returnValue);

    /// @notice Receives and executes a batch of function calls on this contract.
    function multicall(bytes[] calldata data) external returns (bytes[] memory results);
}

File 7 of 14 : SmartAccount.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {Address} from "../lib/openzeppelin-contracts/contracts/utils/Multicall.sol";

import {SmartAccountModulesLib} from "./modules/SmartAccountModulesLib.sol";
import {SmartAccountOwnableLib} from "./modules/ownable/SmartAccountOwnableLib.sol";
import {ISmartAccount} from "./ISmartAccount.sol";

contract SmartAccount is ISmartAccount {
    constructor(address installer, bytes memory installData) {
        Address.functionDelegateCall(installer, installData);
    }

    /// @inheritdoc ISmartAccount
    function performCall(address to, uint256 value, bytes calldata data) external returns (bytes memory returnValue) {
        SmartAccountOwnableLib.ensureIsOwner(msg.sender);
        return Address.functionCallWithValue(to, data, value);
    }

    /// @inheritdoc ISmartAccount
    function performDelegateCall(address to, bytes calldata data) external returns (bytes memory returnValue) {
        SmartAccountOwnableLib.ensureIsOwner(msg.sender);
        return Address.functionDelegateCall(to, data);
    }

    /// @inheritdoc ISmartAccount
    function multicall(bytes[] calldata data) external returns (bytes[] memory results) {
        results = new bytes[](data.length);
        for (uint256 i; i < data.length;) {
            results[i] = Address.functionDelegateCall(address(this), data[i]);
            unchecked {
                ++i;
            }
        }
        return results;
    }

    /// @notice Calls smart account module if any is registered for this function call.
    fallback() external payable {
        SmartAccountModulesLib.callModule();
    }

    receive() external payable {}
}

File 8 of 14 : SmartAccountBaseInstaller.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {ISmartAccount} from "./ISmartAccount.sol";
import {SmartAccountModulesLib, ISmartAccountModules} from "./modules/SmartAccountModulesLib.sol";

import {SmartAccountOwnableLib, ISmartAccountOwnable} from "./modules/ownable/SmartAccountOwnableLib.sol";
import {SmartAccountERC165Lib, ISmartAccountERC165} from "./modules/erc165/SmartAccountERC165Lib.sol";

interface ISmartAccountBase is ISmartAccount, ISmartAccountModules, ISmartAccountOwnable, ISmartAccountERC165 {}

contract SmartAccountBaseInstaller {
    ISmartAccountModules public immutable SMART_ACCOUNT_MODULES;
    ISmartAccountOwnable public immutable SMART_ACCOUNT_OWNABLE;
    ISmartAccountERC165 public immutable SMART_ACCOUNT_ERC165;

    constructor(
        ISmartAccountModules smartAccountModules,
        ISmartAccountOwnable smartAccountOwnable,
        ISmartAccountERC165 smartAccountERC165
    ) {
        SMART_ACCOUNT_MODULES = smartAccountModules;
        SMART_ACCOUNT_OWNABLE = smartAccountOwnable;
        SMART_ACCOUNT_ERC165 = smartAccountERC165;
    }

    /// @notice Installs the base modules into a smart account.
    /// @param owner The initial owner of the smart account.
    function install(address owner) public virtual {
        SmartAccountERC165Lib.setInterfaceSupport(type(ISmartAccount).interfaceId, true);
        SmartAccountModulesLib.fullInstall(address(SMART_ACCOUNT_MODULES));
        SmartAccountOwnableLib.fullInstall(address(SMART_ACCOUNT_OWNABLE), owner);
        SmartAccountERC165Lib.fullInstall(address(SMART_ACCOUNT_ERC165));
    }

    /// @notice Uninstalls the base modules of a smart account.
    /// @dev This will not remove any storage (except interfaces). This means that owner stays active for the base smart account functionality. Any uninstalled modules will also stay active (even though the module manager is uninstalled).
    function uninstall() public virtual {
        SmartAccountModulesLib.fullUninstall();
        SmartAccountOwnableLib.fullUninstall();
        SmartAccountERC165Lib.fullUninstall();
    }

    /// @notice Set the currently registered module for function.
    /// @param functionSelector Function of the module to register.
    /// @param module Address of the module to forward the call to.
    /// @dev Set to zero address to remove.
    /// @dev Will override any existing module registered for this function without warning.
    /// @dev In case of an uninstall of a module containing this function, the function will be removed, no matter if the uninstalled module is the current module for this function.
    function setModule(bytes4 functionSelector, address module) external {
        SmartAccountOwnableLib.ensureIsOwner(msg.sender);
        SmartAccountModulesLib.setModule(functionSelector, module);
    }

    //// @notice Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.
    function transferOwnership(address newOwner) external {
        SmartAccountOwnableLib.ensureIsOwner(msg.sender);
        SmartAccountOwnableLib.setOwner(newOwner);
    }
}

File 9 of 14 : ISmartAccountModules.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ISmartAccountModules {
    /// @notice When no function exists for function called
    error FunctionNotFound(bytes4 functionSelector);

    /// @notice Module is added/updated/removed.
    event ModuleSet(bytes4 functionSelector, address module);

    /// @notice Set the currently registered module for function.
    /// @dev Zero address means no module is registered.
    function getModule(bytes4 functionSelector) external view returns (address module);
}

File 10 of 14 : SmartAccountModulesLib.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {SmartAccountERC165Lib} from "./erc165/SmartAccountERC165Lib.sol";

import {ISmartAccountModules} from "./ISmartAccountModules.sol";

// Inspired by ERC-2535
library SmartAccountModulesLib {
    bytes32 constant STORAGE_POSITION = keccak256("modules.smartaccount.plopmenz");

    struct Storage {
        mapping(bytes4 functionSelector => address module) getFunction;
    }

    function getStorage() internal pure returns (Storage storage s) {
        bytes32 position = STORAGE_POSITION;
        assembly {
            s.slot := position
        }
    }

    /// @notice Sets the interfaces implemented by this contract to (un)supported.
    function setInterfaces(bool supported) internal {
        SmartAccountERC165Lib.setInterfaceSupport(type(ISmartAccountModules).interfaceId, supported);
    }

    /// @notice Installs all functions, interfaces, and performs storage initialization of this module.
    function fullInstall(address module) internal {
        setModule(ISmartAccountModules.getModule.selector, module);
        setInterfaces(true);
    }

    /// @notice Uninstalls all functions and interfaces of this module.
    function fullUninstall() internal {
        setModule(ISmartAccountModules.getModule.selector, address(0));
        setInterfaces(false);
    }

    /// @notice Get the currently registered module for function.
    function getModule(bytes4 functionSelector) internal view returns (address module) {
        return getStorage().getFunction[functionSelector];
    }

    /// @notice Set the currently registered module for function.
    /// @dev Set to zero address to remove.
    function setModule(bytes4 functionSelector, address module) internal {
        getStorage().getFunction[functionSelector] = module;
        emit ISmartAccountModules.ModuleSet(functionSelector, module);
    }

    /// @notice Delegates the current msg call to a module, if one is registered for that function.
    function callModule() internal {
        // Get module from function selector
        address module = getModule(msg.sig);
        if (module == address(0)) {
            revert ISmartAccountModules.FunctionNotFound(msg.sig);
        }
        // Execute external function from module using delegatecall and return any value.
        assembly {
            // Copy function selector and any arguments
            calldatacopy(0, 0, calldatasize())
            // Execute function call using the module
            let result := delegatecall(gas(), module, 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()) }
        }
    }
}

File 11 of 14 : ISmartAccountERC165.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IERC165} from "../../../lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol";

interface ISmartAccountERC165 is IERC165 {
    /// @notice Interface support changed.
    event InterfaceSupportedChanged(bytes4 indexed interfaceId, bool supported);
}

File 12 of 14 : SmartAccountERC165Lib.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {SmartAccountModulesLib} from "../SmartAccountModulesLib.sol";

import {ISmartAccountERC165, IERC165} from "./ISmartAccountERC165.sol";

library SmartAccountERC165Lib {
    bytes32 constant STORAGE_POSITION = keccak256("erc165.modules.smartaccount.plopmenz");

    struct Storage {
        mapping(bytes4 interfaceId => bool supported) getSupported;
    }

    function getStorage() internal pure returns (Storage storage s) {
        bytes32 position = STORAGE_POSITION;
        assembly {
            s.slot := position
        }
    }

    /// @notice Installs all functions, interfaces, and performs storage initialization of this module.
    function fullInstall(address module) internal {
        SmartAccountModulesLib.setModule(IERC165.supportsInterface.selector, module);
    }

    /// @notice Uninstalls all functions and interfaces of this module.
    function fullUninstall() internal {
        SmartAccountModulesLib.setModule(IERC165.supportsInterface.selector, address(0));
    }

    /// @notice Gets the interfaces supported by the Smart Account.
    function supportsInterface(bytes4 interfaceId) internal view returns (bool supported) {
        return getStorage().getSupported[interfaceId];
    }

    /// @notice Updates the interfaces supported by the Smart Account.
    function setInterfaceSupport(bytes4 interfaceId, bool supported) internal {
        getStorage().getSupported[interfaceId] = supported;
        emit ISmartAccountERC165.InterfaceSupportedChanged(interfaceId, supported);
    }
}

File 13 of 14 : ISmartAccountOwnable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ISmartAccountOwnable {
    /// @notice The caller account is not authorized to perform an operation.
    error NotOwner(address account, address owner);

    /// @notice A (new) account has become the owner of this contract.
    event NewOwner(address account);

    /// @notice Returns the address of the current owner.
    function owner() external view returns (address);
}

File 14 of 14 : SmartAccountOwnableLib.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {SmartAccountERC165Lib} from "../erc165/SmartAccountERC165Lib.sol";
import {SmartAccountModulesLib} from "../SmartAccountModulesLib.sol";

import {ISmartAccountOwnable} from "./ISmartAccountOwnable.sol";

library SmartAccountOwnableLib {
    bytes32 constant STORAGE_POSITION = keccak256("ownable.modules.smartaccount.plopmenz");

    struct Storage {
        address owner;
    }

    function getStorage() internal pure returns (Storage storage s) {
        bytes32 position = STORAGE_POSITION;
        assembly {
            s.slot := position
        }
    }

    /// @notice Sets the interfaces implemented by this contract to (un)supported.
    function setInterfaces(bool supported) internal {
        SmartAccountERC165Lib.setInterfaceSupport(type(ISmartAccountOwnable).interfaceId, supported);
    }

    /// @notice Installs all functions, interfaces, and performs storage initialization of this module.
    function fullInstall(address module, address initialOwner) internal {
        SmartAccountOwnableLib.setOwner(initialOwner);
        SmartAccountModulesLib.setModule(ISmartAccountOwnable.owner.selector, module);
        setInterfaces(true);
    }

    /// @notice Uninstalls all functions and interfaces of this module.
    function fullUninstall() internal {
        SmartAccountModulesLib.setModule(ISmartAccountOwnable.owner.selector, address(0));
        setInterfaces(false);
    }

    /// @notice Returns the address of the current owner.
    function owner() internal view returns (address) {
        return getStorage().owner;
    }

    /// @notice Reverts if `account` is not the current owner.
    function ensureIsOwner(address account) internal view {
        if (account != owner()) {
            revert ISmartAccountOwnable.NotOwner(account, owner());
        }
    }

    /// @notice Sets the address of the current owner.
    function setOwner(address account) internal {
        getStorage().owner = account;
        emit ISmartAccountOwnable.NewOwner(account);
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/smart-account/lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/smart-account/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
    "ens-reverse-claimable/=lib/ens-reverse-claimable/src/",
    "erc4626-tests/=lib/smart-account/lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/smart-account/lib/openzeppelin-contracts/",
    "smart-account/=lib/smart-account/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "shanghai",
  "viaIR": true,
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"bytes4","name":"functionSelector","type":"bytes4"}],"name":"FunctionNotFound","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"NotOwner","type":"error"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"performCall","outputs":[{"internalType":"bytes","name":"returnValue","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"performDelegateCall","outputs":[{"internalType":"bytes","name":"returnValue","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080346100e557632a1b8f9b60e01b60208201908152736b221aa392146e31743e1beb5827e88284b0975360248084019190915282526001600160401b0391906060820190838211838310176100c4575f9283926040525190734811864b715c0f1b0f9790a8ee6f11dc25b7f2585af43d156100d8573d908282116100c457601f199160405192603f81601f8401160116830193838510908511176100c4576100b4936040528252815f60203d92013e6100e9565b506040516105ce908161016d8239f35b634e487b7160e01b5f52604160045260245ffd5b6100b491506060906100e9565b5f80fd5b909190610112575080511561010057805190602001fd5b604051630a12f52160e11b8152600490fd5b908051158061014f575b6101235790565b604051639996b31560e01b8152734811864b715c0f1b0f9790a8ee6f11dc25b7f2586004820152602490fd5b50734811864b715c0f1b0f9790a8ee6f11dc25b7f2583b1561011c56fe60806040526004361015610015575b366104b657005b5f3560e01c8063306b4d6c146100445780638babb23b1461003f5763ac9650d80361000e5761023f565b61017f565b346100e55760603660031901126100e55761005d6100e9565b60243560443567ffffffffffffffff81116100e5576100836100939136906004016100ff565b61008c33610422565b3691610300565b918147106100cd575f80846100bd9460206100c99751920190855af16100b761047a565b91610535565b6040519182918261016b565b0390f35b60405163cd78605960e01b8152306004820152602490fd5b5f80fd5b600435906001600160a01b03821682036100e557565b9181601f840112156100e55782359167ffffffffffffffff83116100e557602083818601950101116100e557565b91908251928382525f5b848110610157575050825f602080949584010152601f8019910116010190565b602081830181015184830182015201610137565b90602061017c92818152019061012d565b90565b346100e55760403660031901126100e5576101986100e9565b60243567ffffffffffffffff81116100e5576100c9916101c26100836101c89336906004016100ff565b9061049f565b60405191829160208352602083019061012d565b6020808201906020835283518092526040830192602060408460051b8301019501935f915b8483106102115750505050505090565b909192939495848061022f600193603f198682030187528a5161012d565b9801930193019194939290610201565b346100e55760203660031901126100e55767ffffffffffffffff6004358181116100e557366023820112156100e55780600401359182116100e5573660248360051b830101116100e5576100c99160246102999201610370565b604051918291826101dc565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff8111838210176102df57604052565b6102a5565b67ffffffffffffffff81116102df57601f01601f191660200190565b92919261031461030f836102e4565b6102b9565b93828552828201116100e557815f926020928387013784010152565b67ffffffffffffffff81116102df5760051b60200190565b805182101561035c5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b9061037d61030f82610330565b81815291601f1961038d83610330565b015f5b8181106104115750505f5b8281106103a85750505090565b8060051b820135601e19833603018112156100e55782019081359167ffffffffffffffff83116100e55760200182360381136100e5576103ef6103f5916001943691610300565b3061049f565b6103ff8287610348565b5261040a8186610348565b500161039b565b806060602080938801015201610390565b7f7da6c9ab90b7db6fcaf21a446db7bbaed4e66d04f1d85c8b0a55dc8af596b030546001600160a01b03918216911680820361045c575050565b6044925060405191631194af8760e11b835260048301526024820152fd5b3d1561049a573d9061048e61030f836102e4565b9182523d5f602084013e565b606090565b5f8061017c93602081519101845af46100b761047a565b5f80356001600160e01b0319168082527f56a2f102f06100e6e9193cce9cca60c6a83719df4146213240bdd4963e5931ba6020526040909120546001600160a01b031690811561051d575f8083368280378136915af43d5f803e15610519573d5ff35b3d5ffd5b60249060405190630a82dd7360e31b82526004820152fd5b9061055c575080511561054a57805190602001fd5b604051630a12f52160e11b8152600490fd5b8151158061058f575b61056d575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561056556fea264697066735822122089219459cae4a82cff166225e4073bb13499910fc6d07f8cc28525ad12006f7964736f6c63430008170033

Deployed Bytecode

0x60806040526004361015610015575b366104b657005b5f3560e01c8063306b4d6c146100445780638babb23b1461003f5763ac9650d80361000e5761023f565b61017f565b346100e55760603660031901126100e55761005d6100e9565b60243560443567ffffffffffffffff81116100e5576100836100939136906004016100ff565b61008c33610422565b3691610300565b918147106100cd575f80846100bd9460206100c99751920190855af16100b761047a565b91610535565b6040519182918261016b565b0390f35b60405163cd78605960e01b8152306004820152602490fd5b5f80fd5b600435906001600160a01b03821682036100e557565b9181601f840112156100e55782359167ffffffffffffffff83116100e557602083818601950101116100e557565b91908251928382525f5b848110610157575050825f602080949584010152601f8019910116010190565b602081830181015184830182015201610137565b90602061017c92818152019061012d565b90565b346100e55760403660031901126100e5576101986100e9565b60243567ffffffffffffffff81116100e5576100c9916101c26100836101c89336906004016100ff565b9061049f565b60405191829160208352602083019061012d565b6020808201906020835283518092526040830192602060408460051b8301019501935f915b8483106102115750505050505090565b909192939495848061022f600193603f198682030187528a5161012d565b9801930193019194939290610201565b346100e55760203660031901126100e55767ffffffffffffffff6004358181116100e557366023820112156100e55780600401359182116100e5573660248360051b830101116100e5576100c99160246102999201610370565b604051918291826101dc565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff8111838210176102df57604052565b6102a5565b67ffffffffffffffff81116102df57601f01601f191660200190565b92919261031461030f836102e4565b6102b9565b93828552828201116100e557815f926020928387013784010152565b67ffffffffffffffff81116102df5760051b60200190565b805182101561035c5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b9061037d61030f82610330565b81815291601f1961038d83610330565b015f5b8181106104115750505f5b8281106103a85750505090565b8060051b820135601e19833603018112156100e55782019081359167ffffffffffffffff83116100e55760200182360381136100e5576103ef6103f5916001943691610300565b3061049f565b6103ff8287610348565b5261040a8186610348565b500161039b565b806060602080938801015201610390565b7f7da6c9ab90b7db6fcaf21a446db7bbaed4e66d04f1d85c8b0a55dc8af596b030546001600160a01b03918216911680820361045c575050565b6044925060405191631194af8760e11b835260048301526024820152fd5b3d1561049a573d9061048e61030f836102e4565b9182523d5f602084013e565b606090565b5f8061017c93602081519101845af46100b761047a565b5f80356001600160e01b0319168082527f56a2f102f06100e6e9193cce9cca60c6a83719df4146213240bdd4963e5931ba6020526040909120546001600160a01b031690811561051d575f8083368280378136915af43d5f803e15610519573d5ff35b3d5ffd5b60249060405190630a82dd7360e31b82526004820152fd5b9061055c575080511561054a57805190602001fd5b604051630a12f52160e11b8152600490fd5b8151158061058f575b61056d575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561056556fea264697066735822122089219459cae4a82cff166225e4073bb13499910fc6d07f8cc28525ad12006f7964736f6c63430008170033

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.