{
  "address": "0x49A3Bb231f1e92C4F901B83B980f85da841E8080",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_ops",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "returnData",
          "type": "bytes"
        }
      ],
      "name": "ExecuteCall",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_targets",
          "type": "address[]"
        },
        {
          "internalType": "bytes[]",
          "name": "_datas",
          "type": "bytes[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_values",
          "type": "uint256[]"
        }
      ],
      "name": "batchExecuteCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "_value",
          "type": "uint256"
        }
      ],
      "name": "executeCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ops",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "version",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "transactionHash": "0x2d0be0b47da0c17f4c82bfe0756fceeae8fd02587c8c310c17aa5f93983b343e",
  "receipt": {
    "to": null,
    "from": "0xF1108379d71ff2A785899F4C36010f841F1Fea04",
    "contractAddress": "0x49A3Bb231f1e92C4F901B83B980f85da841E8080",
    "transactionIndex": 0,
    "gasUsed": "1040107",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x9e3c05a28bc7bce7b68071f4f0577c45e9bcfb81885e5332cbdb0b0947608d13",
    "transactionHash": "0x2d0be0b47da0c17f4c82bfe0756fceeae8fd02587c8c310c17aa5f93983b343e",
    "logs": [],
    "blockNumber": 72613781,
    "cumulativeGasUsed": "1040107",
    "status": 1,
    "byzantium": true
  },
  "args": ["0x2A6C106ae13B558BB9E2Ec64Bd2f1f7BEFF3A5E0"],
  "numDeployments": 1,
  "solcInputHash": "8bbf75e674a7470c3c5715f3b28e416b",
  "metadata": "{\"compiler\":{\"version\":\"0.8.14+commit.80d49f37\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ops\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecuteCall\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_targets\",\"type\":\"address[]\"},{\"internalType\":\"bytes[]\",\"name\":\"_datas\",\"type\":\"bytes[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_values\",\"type\":\"uint256[]\"}],\"name\":\"batchExecuteCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"executeCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ops\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"batchExecuteCall(address[],bytes[],uint256[])\":{\"params\":{\"datas\":\"Datas for each contract call.\",\"targets\":\"Addresses of contracts to be called.\",\"values\":\"Native token value for each contract call.\"}},\"executeCall(address,bytes,uint256)\":{\"params\":{\"data\":\"Data for contract call.\",\"target\":\"Address of contracts to be called.\",\"value\":\"Native token value for contract call.\"}},\"owner()\":{\"returns\":{\"_0\":\"address Owner of the proxy\"}}},\"stateVariables\":{\"ops\":{\"return\":\"address Ops smart contract address\",\"returns\":{\"_0\":\"address Ops smart contract address\"}},\"version\":{\"return\":\"uint256 version of OpsProxy.\",\"returns\":{\"_0\":\"uint256 version of OpsProxy.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"ExecuteCall(address,bytes,uint256,bytes)\":{\"notice\":\"Emitted when proxy calls a contract successfully in `executeCall`\"}},\"kind\":\"user\",\"methods\":{\"batchExecuteCall(address[],bytes[],uint256[])\":{\"notice\":\"Multicall to different contracts with different datas.\"},\"executeCall(address,bytes,uint256)\":{\"notice\":\"Call to a single contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/opsProxy/OpsProxy.sol\":\"OpsProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/functions/FExec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\n\\nimport {GelatoBytes} from \\\"../vendor/gelato/GelatoBytes.sol\\\";\\n\\n// solhint-disable private-vars-leading-underscore\\n// solhint-disable func-visibility\\n\\nfunction _call(\\n    address _add,\\n    bytes memory _data,\\n    uint256 _value,\\n    bool _revertOnFailure,\\n    string memory _tracingInfo\\n) returns (bool success, bytes memory returnData) {\\n    (success, returnData) = _add.call{value: _value}(_data);\\n\\n    if (!success && _revertOnFailure)\\n        GelatoBytes.revertWithError(returnData, _tracingInfo);\\n}\\n\\nfunction _delegateCall(\\n    address _add,\\n    bytes memory _data,\\n    string memory _tracingInfo\\n) returns (bool success, bytes memory returnData) {\\n    (success, returnData) = _add.delegatecall(_data);\\n\\n    if (!success) GelatoBytes.revertWithError(returnData, _tracingInfo);\\n}\\n\",\"keccak256\":\"0x48375d0645cf4dfe7d3f18dc727cbb2322a09233a2e9cce9352a73acc357bf07\",\"license\":\"MIT\"},\"contracts/interfaces/IOpsProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\n\\ninterface IOpsProxy {\\n    /**\\n     * @notice Emitted when proxy calls a contract successfully in `executeCall`\\n     *\\n     * @param target Address of contract that is called\\n     * @param data Data used in the call.\\n     * @param value Native token value used in the call.\\n     * @param returnData Data returned by the call.\\n     */\\n    event ExecuteCall(\\n        address indexed target,\\n        bytes data,\\n        uint256 value,\\n        bytes returnData\\n    );\\n\\n    /**\\n     * @notice Multicall to different contracts with different datas.\\n     *\\n     * @param targets Addresses of contracts to be called.\\n     * @param datas Datas for each contract call.\\n     * @param values Native token value for each contract call.\\n     */\\n    function batchExecuteCall(\\n        address[] calldata targets,\\n        bytes[] calldata datas,\\n        uint256[] calldata values\\n    ) external payable;\\n\\n    /**\\n     * @notice Call to a single contract.\\n     *\\n     * @param target Address of contracts to be called.\\n     * @param data Data for contract call.\\n     * @param value Native token value for contract call.\\n     */\\n    function executeCall(\\n        address target,\\n        bytes calldata data,\\n        uint256 value\\n    ) external payable;\\n\\n    /**\\n     * @return address Ops smart contract address\\n     */\\n    function ops() external view returns (address);\\n\\n    /**\\n     * @return address Owner of the proxy\\n     */\\n    function owner() external view returns (address);\\n\\n    /**\\n     * @return uint256 version of OpsProxy.\\n     */\\n    function version() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1b6e349287dfeb2735da8d3f7ae0aa5865996f7dd58622773b449a76bcaf881a\",\"license\":\"MIT\"},\"contracts/opsProxy/OpsProxy.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.12;\\n\\nimport {Proxied} from \\\"../vendor/proxy/EIP173/Proxied.sol\\\";\\nimport {_call} from \\\"../functions/FExec.sol\\\";\\nimport {IOpsProxy} from \\\"../interfaces/IOpsProxy.sol\\\";\\n\\ncontract OpsProxy is Proxied, IOpsProxy {\\n    // solhint-disable const-name-snakecase\\n    uint256 public constant override version = 1;\\n    address public immutable override ops;\\n\\n    modifier onlyAuth() {\\n        address proxyOwner = owner();\\n        if (msg.sender != proxyOwner) {\\n            require(msg.sender == ops, \\\"OpsProxy: Not authorised\\\");\\n            require(\\n                _getTaskCreator() == proxyOwner,\\n                \\\"OpsProxy: Only tasks created by owner\\\"\\n            );\\n        } // else msg.sender == proxyOwner\\n        _;\\n    }\\n\\n    // solhint-disable no-empty-blocks\\n    constructor(address _ops) {\\n        ops = _ops;\\n    }\\n\\n    receive() external payable {}\\n\\n    ///@inheritdoc IOpsProxy\\n    function batchExecuteCall(\\n        address[] calldata _targets,\\n        bytes[] calldata _datas,\\n        uint256[] calldata _values\\n    ) external payable override onlyAuth {\\n        uint256 length = _targets.length;\\n        require(\\n            length == _datas.length && length == _values.length,\\n            \\\"OpsProxy: Length mismatch\\\"\\n        );\\n\\n        for (uint256 i; i < length; i++)\\n            _executeCall(_targets[i], _datas[i], _values[i]);\\n    }\\n\\n    ///@inheritdoc IOpsProxy\\n    function executeCall(\\n        address _target,\\n        bytes calldata _data,\\n        uint256 _value\\n    ) external payable override onlyAuth {\\n        _executeCall(_target, _data, _value);\\n    }\\n\\n    function owner() public view returns (address) {\\n        return _proxyAdmin();\\n    }\\n\\n    function _executeCall(\\n        address _target,\\n        bytes calldata _data,\\n        uint256 _value\\n    ) private {\\n        (, bytes memory returnData) = _call(\\n            _target,\\n            _data,\\n            _value,\\n            true,\\n            \\\"OpsProxy.executeCall: \\\"\\n        );\\n\\n        emit ExecuteCall(_target, _data, _value, returnData);\\n    }\\n\\n    function _getTaskCreator() private pure returns (address taskCreator) {\\n        assembly {\\n            taskCreator := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe5a2a44ed1843680adaff1fb47d27c29557e40f66492fce669f1ee7813578701\",\"license\":\"UNLICENSED\"},\"contracts/vendor/gelato/GelatoBytes.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.12;\\n\\nlibrary GelatoBytes {\\n    function calldataSliceSelector(bytes calldata _bytes)\\n        internal\\n        pure\\n        returns (bytes4 selector)\\n    {\\n        selector =\\n            _bytes[0] |\\n            (bytes4(_bytes[1]) >> 8) |\\n            (bytes4(_bytes[2]) >> 16) |\\n            (bytes4(_bytes[3]) >> 24);\\n    }\\n\\n    function memorySliceSelector(bytes memory _bytes)\\n        internal\\n        pure\\n        returns (bytes4 selector)\\n    {\\n        selector =\\n            _bytes[0] |\\n            (bytes4(_bytes[1]) >> 8) |\\n            (bytes4(_bytes[2]) >> 16) |\\n            (bytes4(_bytes[3]) >> 24);\\n    }\\n\\n    function revertWithError(bytes memory _bytes, string memory _tracingInfo)\\n        internal\\n        pure\\n    {\\n        // 68: 32-location, 32-length, 4-ErrorSelector, UTF-8 err\\n        if (_bytes.length % 32 == 4) {\\n            bytes4 selector;\\n            assembly {\\n                selector := mload(add(0x20, _bytes))\\n            }\\n            if (selector == 0x08c379a0) {\\n                // Function selector for Error(string)\\n                assembly {\\n                    _bytes := add(_bytes, 68)\\n                }\\n                revert(string(abi.encodePacked(_tracingInfo, string(_bytes))));\\n            } else {\\n                revert(\\n                    string(abi.encodePacked(_tracingInfo, \\\"NoErrorSelector\\\"))\\n                );\\n            }\\n        } else {\\n            revert(\\n                string(abi.encodePacked(_tracingInfo, \\\"UnexpectedReturndata\\\"))\\n            );\\n        }\\n    }\\n\\n    function returnError(bytes memory _bytes, string memory _tracingInfo)\\n        internal\\n        pure\\n        returns (string memory)\\n    {\\n        // 68: 32-location, 32-length, 4-ErrorSelector, UTF-8 err\\n        if (_bytes.length % 32 == 4) {\\n            bytes4 selector;\\n            assembly {\\n                selector := mload(add(0x20, _bytes))\\n            }\\n            if (selector == 0x08c379a0) {\\n                // Function selector for Error(string)\\n                assembly {\\n                    _bytes := add(_bytes, 68)\\n                }\\n                return string(abi.encodePacked(_tracingInfo, string(_bytes)));\\n            } else {\\n                return\\n                    string(abi.encodePacked(_tracingInfo, \\\"NoErrorSelector\\\"));\\n            }\\n        } else {\\n            return\\n                string(abi.encodePacked(_tracingInfo, \\\"UnexpectedReturndata\\\"));\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6ec59b2c6f678f3bbe186677e5970e59e46a40d22881dc813c49ffb18e417951\",\"license\":\"UNLICENSED\"},\"contracts/vendor/proxy/EIP173/Proxied.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nabstract contract Proxied {\\n    /// @notice to be used by initialisation / postUpgrade function so that only the proxy's admin can execute them\\n    /// It also allows these functions to be called inside a contructor\\n    /// even if the contract is meant to be used without proxy\\n    modifier proxied() {\\n        address proxyAdminAddress = _proxyAdmin();\\n        // With hardhat-deploy proxies\\n        // the proxyAdminAddress is zero only for the implementation contract\\n        // if the implementation contract want to be used as a standalone/immutable contract\\n        // it simply has to execute the `proxied` function\\n        // This ensure the proxyAdminAddress is never zero post deployment\\n        // And allow you to keep the same code for both proxied contract and immutable contract\\n        if (proxyAdminAddress == address(0)) {\\n            // ensure can not be called twice when used outside of proxy : no admin\\n            // solhint-disable-next-line security/no-inline-assembly\\n            assembly {\\n                sstore(\\n                    0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103,\\n                    0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\\n                )\\n            }\\n        } else {\\n            require(msg.sender == proxyAdminAddress);\\n        }\\n        _;\\n    }\\n\\n    modifier onlyProxyAdmin() {\\n        require(msg.sender == _proxyAdmin(), \\\"NOT_AUTHORIZED\\\");\\n        _;\\n    }\\n\\n    function _proxyAdmin() internal view returns (address adminAddress) {\\n        // solhint-disable-next-line security/no-inline-assembly\\n        assembly {\\n            adminAddress := sload(\\n                0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103\\n            )\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x428ced1961d42c505a3e49d90498f92f4b0df8537e5ffa59f14ba375d99150a1\",\"license\":\"GPL-3.0\"}},\"version\":1}",
  "bytecode": "[encoded data, 9776 characters]",
  "deployedBytecode": "[encoded data, 9152 characters]",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "batchExecuteCall(address[],bytes[],uint256[])": {
        "params": {
          "datas": "Datas for each contract call.",
          "targets": "Addresses of contracts to be called.",
          "values": "Native token value for each contract call."
        }
      },
      "executeCall(address,bytes,uint256)": {
        "params": {
          "data": "Data for contract call.",
          "target": "Address of contracts to be called.",
          "value": "Native token value for contract call."
        }
      },
      "owner()": {
        "returns": {
          "_0": "address Owner of the proxy"
        }
      }
    },
    "stateVariables": {
      "ops": {
        "return": "address Ops smart contract address",
        "returns": {
          "_0": "address Ops smart contract address"
        }
      },
      "version": {
        "return": "uint256 version of OpsProxy.",
        "returns": {
          "_0": "uint256 version of OpsProxy."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "events": {
      "ExecuteCall(address,bytes,uint256,bytes)": {
        "notice": "Emitted when proxy calls a contract successfully in `executeCall`"
      }
    },
    "kind": "user",
    "methods": {
      "batchExecuteCall(address[],bytes[],uint256[])": {
        "notice": "Multicall to different contracts with different datas."
      },
      "executeCall(address,bytes,uint256)": {
        "notice": "Call to a single contract."
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [],
    "types": null
  }
}
