{
  "address": "0x36a69dE601381be7b0DcAc5D5dD058825505F8f6",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract ILayerZeroEndpoint",
          "name": "lzEndpoint_",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "accessControlManager_",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "ZeroAddressNotAllowed",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "proposalId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "executionHash",
          "type": "bytes32"
        }
      ],
      "name": "ClearPayload",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint16",
          "name": "remoteChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "proposalId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "payload",
          "type": "bytes"
        }
      ],
      "name": "ExecuteRemoteProposal",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "FallbackWithdraw",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldAccessControlManager",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newAccessControlManager",
          "type": "address"
        }
      ],
      "name": "NewAccessControlManager",
      "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"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Paused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint16",
          "name": "chainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "oldMaxLimit",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newMaxLimit",
          "type": "uint256"
        }
      ],
      "name": "SetMaxDailyLimit",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint16",
          "name": "remoteChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "oldRemoteAddress",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "newRemoteAddress",
          "type": "bytes"
        }
      ],
      "name": "SetTrustedRemoteAddress",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "proposalId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint16",
          "name": "remoteChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "payload",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "adapterParams",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "StorePayload",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint16",
          "name": "chainId",
          "type": "uint16"
        }
      ],
      "name": "TrustedRemoteRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Unpaused",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "LZ_ENDPOINT",
      "outputs": [
        {
          "internalType": "contract ILayerZeroEndpoint",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "accessControlManager",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "chainIdToLast24HourCommandsSent",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "chainIdToLast24HourWindowStart",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "chainIdToLastProposalSentTimestamp",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "chainIdToMaxDailyLimit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "remoteChainId_",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "payload_",
          "type": "bytes"
        },
        {
          "internalType": "bool",
          "name": "useZro_",
          "type": "bool"
        },
        {
          "internalType": "bytes",
          "name": "adapterParams_",
          "type": "bytes"
        }
      ],
      "name": "estimateFees",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "remoteChainId_",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "payload_",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "adapterParams_",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "zroPaymentAddress_",
          "type": "address"
        }
      ],
      "name": "execute",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to_",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "pId_",
          "type": "uint256"
        },
        {
          "internalType": "uint16",
          "name": "remoteChainId_",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "payload_",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "adapterParams_",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "originalValue_",
          "type": "uint256"
        }
      ],
      "name": "fallbackWithdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "version_",
          "type": "uint16"
        },
        {
          "internalType": "uint16",
          "name": "chainId_",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "configType_",
          "type": "uint256"
        }
      ],
      "name": "getConfig",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paused",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proposalCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "remoteChainId_",
          "type": "uint16"
        }
      ],
      "name": "removeTrustedRemote",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "pId_",
          "type": "uint256"
        },
        {
          "internalType": "uint16",
          "name": "remoteChainId_",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "payload_",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "adapterParams_",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "zroPaymentAddress_",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "originalValue_",
          "type": "uint256"
        }
      ],
      "name": "retryExecute",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "accessControlManager_",
          "type": "address"
        }
      ],
      "name": "setAccessControlManager",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "version_",
          "type": "uint16"
        },
        {
          "internalType": "uint16",
          "name": "chainId_",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "configType_",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "config_",
          "type": "bytes"
        }
      ],
      "name": "setConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "chainId_",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "limit_",
          "type": "uint256"
        }
      ],
      "name": "setMaxDailyLimit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "version_",
          "type": "uint16"
        }
      ],
      "name": "setSendVersion",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "remoteChainId_",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "newRemoteAddress_",
          "type": "bytes"
        }
      ],
      "name": "setTrustedRemoteAddress",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "storedExecutionHashes",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "trustedRemoteLookup",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unpause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x739c0eef59d21fc5e9d4ccdba24bfab647d484983e98430fee209b7cf72c95ab",
  "receipt": {
    "to": null,
    "from": "0x92054EdBb53eCC4f2A1787e92f479CE10392A658",
    "contractAddress": "0x36a69dE601381be7b0DcAc5D5dD058825505F8f6",
    "transactionIndex": 69,
    "gasUsed": "2925392",
    "logsBloom": "0x00000000000000000000000000000040000001000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000080000800000000000000000000000000000000400000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x7e67ba21af92ac024c9524456b0a94c5636ef1f2b8840ca83694738c1c2cc93b",
    "transactionHash": "0x739c0eef59d21fc5e9d4ccdba24bfab647d484983e98430fee209b7cf72c95ab",
    "logs": [
      {
        "transactionIndex": 69,
        "blockNumber": 39375361,
        "transactionHash": "0x739c0eef59d21fc5e9d4ccdba24bfab647d484983e98430fee209b7cf72c95ab",
        "address": "0x36a69dE601381be7b0DcAc5D5dD058825505F8f6",
        "topics": [
          "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x00000000000000000000000092054edbb53ecc4f2a1787e92f479ce10392a658"
        ],
        "data": "0x",
        "logIndex": 97,
        "blockHash": "0x7e67ba21af92ac024c9524456b0a94c5636ef1f2b8840ca83694738c1c2cc93b"
      }
    ],
    "blockNumber": 39375361,
    "cumulativeGasUsed": "7157259",
    "status": 1,
    "byzantium": true
  },
  "args": ["0x3c2269811836af69497E5F486A85D7316753cf62", "0x4788629abc6cfca10f9f969efdeaa1cf70c23555"],
  "numDeployments": 1,
  "solcInputHash": "836b1bc116f0f1cd99aeadbc34149dfb",
  "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ILayerZeroEndpoint\",\"name\":\"lzEndpoint_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"executionHash\",\"type\":\"bytes32\"}],\"name\":\"ClearPayload\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"remoteChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"ExecuteRemoteProposal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"FallbackWithdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldAccessControlManager\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAccessControlManager\",\"type\":\"address\"}],\"name\":\"NewAccessControlManager\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"chainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldMaxLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMaxLimit\",\"type\":\"uint256\"}],\"name\":\"SetMaxDailyLimit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"remoteChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"oldRemoteAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"newRemoteAddress\",\"type\":\"bytes\"}],\"name\":\"SetTrustedRemoteAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"remoteChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"adapterParams\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"StorePayload\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"chainId\",\"type\":\"uint16\"}],\"name\":\"TrustedRemoteRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LZ_ENDPOINT\",\"outputs\":[{\"internalType\":\"contract ILayerZeroEndpoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessControlManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"chainIdToLast24HourCommandsSent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"chainIdToLast24HourWindowStart\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"chainIdToLastProposalSentTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"chainIdToMaxDailyLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"remoteChainId_\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"payload_\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"useZro_\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"adapterParams_\",\"type\":\"bytes\"}],\"name\":\"estimateFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"remoteChainId_\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"payload_\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"adapterParams_\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"zroPaymentAddress_\",\"type\":\"address\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pId_\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"remoteChainId_\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"payload_\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"adapterParams_\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"originalValue_\",\"type\":\"uint256\"}],\"name\":\"fallbackWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"version_\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"chainId_\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"configType_\",\"type\":\"uint256\"}],\"name\":\"getConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"remoteChainId_\",\"type\":\"uint16\"}],\"name\":\"removeTrustedRemote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pId_\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"remoteChainId_\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"payload_\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"adapterParams_\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"zroPaymentAddress_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"originalValue_\",\"type\":\"uint256\"}],\"name\":\"retryExecute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"}],\"name\":\"setAccessControlManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"version_\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"chainId_\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"configType_\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"config_\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"chainId_\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"limit_\",\"type\":\"uint256\"}],\"name\":\"setMaxDailyLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"version_\",\"type\":\"uint16\"}],\"name\":\"setSendVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"remoteChainId_\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"newRemoteAddress_\",\"type\":\"bytes\"}],\"name\":\"setTrustedRemoteAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"storedExecutionHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"trustedRemoteLookup\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Venus\",\"custom:security-contact\":\"https://github.com/VenusProtocol/governance-contracts#discussion\",\"events\":{\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"}},\"kind\":\"dev\",\"methods\":{\"estimateFees(uint16,bytes,bool,bytes)\":{\"details\":\"The estimated fees are the minimum required; it's recommended to increase the fees amount when sending a message. The unused amount will be refunded\",\"params\":{\"adapterParams_\":\"The params used to specify the custom amount of gas required for the execution on the destination\",\"payload_\":\"The payload to be sent to the remote chain. It's computed as follows: payload = abi.encode(abi.encode(targets, values, signatures, calldatas, proposalType), pId)\",\"remoteChainId_\":\"The LayerZero id of a remote chain\",\"useZro_\":\"Bool that indicates whether to pay in ZRO tokens or not\"},\"returns\":{\"_0\":\"nativeFee The amount of fee in the native gas token (e.g. ETH)\",\"_1\":\"zroFee The amount of fee in ZRO token\"}},\"execute(uint16,bytes,bytes,address)\":{\"custom:access\":\"Controlled by Access Control Manager\",\"custom:event\":\"Emits ExecuteRemoteProposal with remote chain id, proposal ID and payload on successEmits StorePayload with last stored payload proposal ID ,remote chain id , payload, adapter params , values and reason for failure\",\"details\":\"Stores the hash of the execution parameters if sending fails (e.g., due to insufficient fees)\",\"params\":{\"adapterParams_\":\"The params used to specify the custom amount of gas required for the execution on the destination\",\"payload_\":\"The payload to be sent to the remote chain It's computed as follows: payload = abi.encode(targets, values, signatures, calldatas, proposalType)\",\"remoteChainId_\":\"The LayerZero id of the remote chain\",\"zroPaymentAddress_\":\"The address of the ZRO token holder who would pay for the transaction. This must be either address(this) or tx.origin\"}},\"fallbackWithdraw(address,uint256,uint16,bytes,bytes,uint256)\":{\"custom:access\":\"Only owner\",\"custom:event\":\"Emits ClearPayload with proposal ID and hashEmits FallbackWithdraw with receiver and amount\",\"params\":{\"adapterParams_\":\"The params used to specify the custom amount of gas required for the execution on the destination\",\"originalValue_\":\"The msg.value passed when execute() function was called\",\"pId_\":\"The proposal ID to identify a failed message\",\"payload_\":\"The payload to be sent to the remote chain It's computed as follows: payload = abi.encode(abi.encode(targets, values, signatures, calldatas, proposalType), pId)\",\"remoteChainId_\":\"The LayerZero id of the remote chain\",\"to_\":\"Address of the receiver\"}},\"getConfig(uint16,uint16,uint256)\":{\"params\":{\"chainId_\":\"The LayerZero chainId\",\"configType_\":\"Type of configuration. Every messaging library has its own convention\",\"version_\":\"Messaging library version\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pause()\":{\"custom:access\":\"Controlled by AccessControlManager\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"removeTrustedRemote(uint16)\":{\"custom:access\":\"Controlled by Access Control Manager\",\"custom:event\":\"Emit TrustedRemoteRemoved with remote chain id\",\"params\":{\"remoteChainId_\":\"The chain's id corresponds to setting the trusted remote to empty\"}},\"retryExecute(uint256,uint16,bytes,bytes,address,uint256)\":{\"custom:access\":\"Controlled by Access Control Manager\",\"custom:event\":\"Emits ClearPayload with proposal ID and hash\",\"details\":\"Allows providing more fees if needed. The extra fees will be refunded to the caller\",\"params\":{\"adapterParams_\":\"The params used to specify the custom amount of gas required for the execution on the destination\",\"originalValue_\":\"The msg.value passed when execute() function was called\",\"pId_\":\"The proposal ID to identify a failed message\",\"payload_\":\"The payload to be sent to the remote chain It's computed as follows: payload = abi.encode(abi.encode(targets, values, signatures, calldatas, proposalType), pId)\",\"remoteChainId_\":\"The LayerZero id of the remote chain\",\"zroPaymentAddress_\":\"The address of the ZRO token holder who would pay for the transaction.\"}},\"setAccessControlManager(address)\":{\"custom:access\":\"Only owner\",\"custom:event\":\"Emits NewAccessControlManager with old and new access control manager addresses\",\"params\":{\"accessControlManager_\":\"The new address of the Access Control Manager\"}},\"setConfig(uint16,uint16,uint256,bytes)\":{\"custom:access\":\"Controlled by AccessControlManager\",\"params\":{\"chainId_\":\"The LayerZero chainId for the pending config change\",\"configType_\":\"The type of configuration. Every messaging library has its own convention\",\"config_\":\"The configuration in bytes. It can encode arbitrary content\",\"version_\":\"Messaging library version\"}},\"setMaxDailyLimit(uint16,uint256)\":{\"custom:access\":\"Controlled by AccessControlManager\",\"custom:event\":\"Emits SetMaxDailyLimit with old and new limit and its corresponding chain id\",\"params\":{\"chainId_\":\"Destination chain id\",\"limit_\":\"Number of commands\"}},\"setSendVersion(uint16)\":{\"custom:access\":\"Controlled by AccessControlManager\",\"params\":{\"version_\":\"New messaging library version\"}},\"setTrustedRemoteAddress(uint16,bytes)\":{\"custom:access\":\"Controlled by AccessControlManager\",\"custom:event\":\"Emits SetTrustedRemoteAddress with remote chain Id and remote address\",\"params\":{\"newRemoteAddress_\":\"The address of the contract on the remote chain to receive messages sent by this contract\",\"remoteChainId_\":\"The LayerZero id of a remote chain\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"unpause()\":{\"custom:access\":\"Controlled by AccessControlManager\"}},\"stateVariables\":{\"storedExecutionHashes\":{\"details\":\"[proposalId] -> [executionHash]\"}},\"title\":\"OmnichainProposalSender\",\"version\":1},\"userdoc\":{\"errors\":{\"ZeroAddressNotAllowed()\":[{\"notice\":\"Thrown if the supplied address is a zero address where it is not allowed\"}]},\"events\":{\"ClearPayload(uint256,bytes32)\":{\"notice\":\"Emitted when a previously failed message is successfully sent to the remote chain\"},\"ExecuteRemoteProposal(uint16,uint256,bytes)\":{\"notice\":\"Emitted when a proposal execution request is sent to the remote chain\"},\"FallbackWithdraw(address,uint256)\":{\"notice\":\"Emitted while fallback withdraw\"},\"SetMaxDailyLimit(uint16,uint256,uint256)\":{\"notice\":\"Emitted when the maximum daily limit of commands from the local chain is modified\"},\"SetTrustedRemoteAddress(uint16,bytes,bytes)\":{\"notice\":\"Emitted when a remote message receiver is set for the remote chain\"},\"StorePayload(uint256,uint16,bytes,bytes,uint256,bytes)\":{\"notice\":\"Emitted when an execution hash of a failed message is saved\"},\"TrustedRemoteRemoved(uint16)\":{\"notice\":\"Event emitted when trusted remote sets to empty\"}},\"kind\":\"user\",\"methods\":{\"LZ_ENDPOINT()\":{\"notice\":\"LayerZero endpoint for sending messages to remote chains\"},\"accessControlManager()\":{\"notice\":\"ACM (Access Control Manager) contract address\"},\"chainIdToLast24HourCommandsSent(uint16)\":{\"notice\":\"Total commands transferred within the last 24-hour window from the local chain\"},\"chainIdToLast24HourWindowStart(uint16)\":{\"notice\":\"Timestamp when the last 24-hour window started from the local chain\"},\"chainIdToLastProposalSentTimestamp(uint16)\":{\"notice\":\"Timestamp when the last proposal sent from the local chain to dest chain\"},\"chainIdToMaxDailyLimit(uint16)\":{\"notice\":\"Maximum daily limit for commands from the local chain\"},\"estimateFees(uint16,bytes,bool,bytes)\":{\"notice\":\"Estimates LayerZero fees for cross-chain message delivery to the remote chain\"},\"execute(uint16,bytes,bytes,address)\":{\"notice\":\"Sends a message to execute a remote proposal\"},\"fallbackWithdraw(address,uint256,uint16,bytes,bytes,uint256)\":{\"notice\":\"Clear previously failed message\"},\"getConfig(uint16,uint16,uint256)\":{\"notice\":\"Gets the configuration of the LayerZero messaging library of the specified version\"},\"pause()\":{\"notice\":\"Triggers the paused state of the controller\"},\"proposalCount()\":{\"notice\":\"Stores the total number of remote proposals\"},\"removeTrustedRemote(uint16)\":{\"notice\":\"Remove trusted remote from storage\"},\"renounceOwnership()\":{\"notice\":\"Empty implementation of renounce ownership to avoid any mishap\"},\"retryExecute(uint256,uint16,bytes,bytes,address,uint256)\":{\"notice\":\"Resends a previously failed message\"},\"setAccessControlManager(address)\":{\"notice\":\"Sets the address of Access Control Manager (ACM)\"},\"setConfig(uint16,uint16,uint256,bytes)\":{\"notice\":\"Sets the configuration of the LayerZero messaging library of the specified version\"},\"setMaxDailyLimit(uint16,uint256)\":{\"notice\":\"Sets the limit of daily (24 Hour) command amount\"},\"setSendVersion(uint16)\":{\"notice\":\"Sets the configuration of the LayerZero messaging library of the specified version\"},\"setTrustedRemoteAddress(uint16,bytes)\":{\"notice\":\"Sets the remote message receiver address\"},\"storedExecutionHashes(uint256)\":{\"notice\":\"Execution hashes of failed messages\"},\"trustedRemoteLookup(uint16)\":{\"notice\":\"Specifies the allowed path for sending messages (remote chainId => remote app address + local app address)\"},\"unpause()\":{\"notice\":\"Triggers the resume state of the controller\"}},\"notice\":\"OmnichainProposalSender contract builds upon the functionality of its parent contract , BaseOmnichainControllerSrc It sends a proposal's data to remote chains for execution after the proposal passes on the main chain when used with GovernorBravo, the owner of this contract must be set to the Timelock contract\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Cross-chain/OmnichainProposalSender.sol\":\"OmnichainProposalSender\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@layerzerolabs/solidity-examples/contracts/lzApp/interfaces/ILayerZeroEndpoint.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.5.0;\\n\\nimport \\\"./ILayerZeroUserApplicationConfig.sol\\\";\\n\\ninterface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {\\n    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.\\n    // @param _dstChainId - the destination chain identifier\\n    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains\\n    // @param _payload - a custom bytes payload to send to the destination contract\\n    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address\\n    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction\\n    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination\\n    function send(\\n        uint16 _dstChainId,\\n        bytes calldata _destination,\\n        bytes calldata _payload,\\n        address payable _refundAddress,\\n        address _zroPaymentAddress,\\n        bytes calldata _adapterParams\\n    ) external payable;\\n\\n    // @notice used by the messaging library to publish verified payload\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source contract (as bytes) at the source chain\\n    // @param _dstAddress - the address on destination chain\\n    // @param _nonce - the unbound message ordering nonce\\n    // @param _gasLimit - the gas limit for external contract execution\\n    // @param _payload - verified payload to send to the destination contract\\n    function receivePayload(\\n        uint16 _srcChainId,\\n        bytes calldata _srcAddress,\\n        address _dstAddress,\\n        uint64 _nonce,\\n        uint _gasLimit,\\n        bytes calldata _payload\\n    ) external;\\n\\n    // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source chain contract address\\n    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);\\n\\n    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM\\n    // @param _srcAddress - the source chain contract address\\n    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);\\n\\n    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery\\n    // @param _dstChainId - the destination chain identifier\\n    // @param _userApplication - the user app address on this EVM chain\\n    // @param _payload - the custom message to send over LayerZero\\n    // @param _payInZRO - if false, user app pays the protocol fee in native token\\n    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain\\n    function estimateFees(\\n        uint16 _dstChainId,\\n        address _userApplication,\\n        bytes calldata _payload,\\n        bool _payInZRO,\\n        bytes calldata _adapterParam\\n    ) external view returns (uint nativeFee, uint zroFee);\\n\\n    // @notice get this Endpoint's immutable source identifier\\n    function getChainId() external view returns (uint16);\\n\\n    // @notice the interface to retry failed message on this Endpoint destination\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source chain contract address\\n    // @param _payload - the payload to be retried\\n    function retryPayload(\\n        uint16 _srcChainId,\\n        bytes calldata _srcAddress,\\n        bytes calldata _payload\\n    ) external;\\n\\n    // @notice query if any STORED payload (message blocking) at the endpoint.\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source chain contract address\\n    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);\\n\\n    // @notice query if the _libraryAddress is valid for sending msgs.\\n    // @param _userApplication - the user app address on this EVM chain\\n    function getSendLibraryAddress(address _userApplication) external view returns (address);\\n\\n    // @notice query if the _libraryAddress is valid for receiving msgs.\\n    // @param _userApplication - the user app address on this EVM chain\\n    function getReceiveLibraryAddress(address _userApplication) external view returns (address);\\n\\n    // @notice query if the non-reentrancy guard for send() is on\\n    // @return true if the guard is on. false otherwise\\n    function isSendingPayload() external view returns (bool);\\n\\n    // @notice query if the non-reentrancy guard for receive() is on\\n    // @return true if the guard is on. false otherwise\\n    function isReceivingPayload() external view returns (bool);\\n\\n    // @notice get the configuration of the LayerZero messaging library of the specified version\\n    // @param _version - messaging library version\\n    // @param _chainId - the chainId for the pending config change\\n    // @param _userApplication - the contract address of the user application\\n    // @param _configType - type of configuration. every messaging library has its own convention.\\n    function getConfig(\\n        uint16 _version,\\n        uint16 _chainId,\\n        address _userApplication,\\n        uint _configType\\n    ) external view returns (bytes memory);\\n\\n    // @notice get the send() LayerZero messaging library version\\n    // @param _userApplication - the contract address of the user application\\n    function getSendVersion(address _userApplication) external view returns (uint16);\\n\\n    // @notice get the lzReceive() LayerZero messaging library version\\n    // @param _userApplication - the contract address of the user application\\n    function getReceiveVersion(address _userApplication) external view returns (uint16);\\n}\\n\",\"keccak256\":\"0xab7fcacc672251c850f00c0abd4100df9afcc4ad70b8d331a2fd4cb07acab9f4\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/lzApp/interfaces/ILayerZeroUserApplicationConfig.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.5.0;\\n\\ninterface ILayerZeroUserApplicationConfig {\\n    // @notice set the configuration of the LayerZero messaging library of the specified version\\n    // @param _version - messaging library version\\n    // @param _chainId - the chainId for the pending config change\\n    // @param _configType - type of configuration. every messaging library has its own convention.\\n    // @param _config - configuration in the bytes. can encode arbitrary content.\\n    function setConfig(\\n        uint16 _version,\\n        uint16 _chainId,\\n        uint _configType,\\n        bytes calldata _config\\n    ) external;\\n\\n    // @notice set the send() LayerZero messaging library version to _version\\n    // @param _version - new messaging library version\\n    function setSendVersion(uint16 _version) external;\\n\\n    // @notice set the lzReceive() LayerZero messaging library version to _version\\n    // @param _version - new messaging library version\\n    function setReceiveVersion(uint16 _version) external;\\n\\n    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload\\n    // @param _srcChainId - the chainId of the source chain\\n    // @param _srcAddress - the contract address of the source contract at the source chain\\n    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;\\n}\\n\",\"keccak256\":\"0xb4df93aeb0fb46373a4fb728ad2603edc8b9a1577eee8d801768dc115bf96498\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n    /**\\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n     *\\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n     * {RoleAdminChanged} not being emitted signaling this.\\n     *\\n     * _Available since v3.1._\\n     */\\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n    /**\\n     * @dev Emitted when `account` is granted `role`.\\n     *\\n     * `sender` is the account that originated the contract call, an admin role\\n     * bearer except when using {AccessControl-_setupRole}.\\n     */\\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Emitted when `account` is revoked `role`.\\n     *\\n     * `sender` is the account that originated the contract call:\\n     *   - if using `revokeRole`, it is the admin role bearer\\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n     */\\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function grantRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function revokeRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `account`.\\n     */\\n    function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    constructor() {\\n        _transferOwnership(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        _checkOwner();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if the sender is not the owner.\\n     */\\n    function _checkOwner() internal view virtual {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/Pausable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract Pausable is Context {\\n    /**\\n     * @dev Emitted when the pause is triggered by `account`.\\n     */\\n    event Paused(address account);\\n\\n    /**\\n     * @dev Emitted when the pause is lifted by `account`.\\n     */\\n    event Unpaused(address account);\\n\\n    bool private _paused;\\n\\n    /**\\n     * @dev Initializes the contract in unpaused state.\\n     */\\n    constructor() {\\n        _paused = false;\\n    }\\n\\n    /**\\n     * @dev Modifier to make a function callable only when the contract is not paused.\\n     *\\n     * Requirements:\\n     *\\n     * - The contract must not be paused.\\n     */\\n    modifier whenNotPaused() {\\n        _requireNotPaused();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Modifier to make a function callable only when the contract is paused.\\n     *\\n     * Requirements:\\n     *\\n     * - The contract must be paused.\\n     */\\n    modifier whenPaused() {\\n        _requirePaused();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Returns true if the contract is paused, and false otherwise.\\n     */\\n    function paused() public view virtual returns (bool) {\\n        return _paused;\\n    }\\n\\n    /**\\n     * @dev Throws if the contract is paused.\\n     */\\n    function _requireNotPaused() internal view virtual {\\n        require(!paused(), \\\"Pausable: paused\\\");\\n    }\\n\\n    /**\\n     * @dev Throws if the contract is not paused.\\n     */\\n    function _requirePaused() internal view virtual {\\n        require(paused(), \\\"Pausable: not paused\\\");\\n    }\\n\\n    /**\\n     * @dev Triggers stopped state.\\n     *\\n     * Requirements:\\n     *\\n     * - The contract must not be paused.\\n     */\\n    function _pause() internal virtual whenNotPaused {\\n        _paused = true;\\n        emit Paused(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Returns to normal state.\\n     *\\n     * Requirements:\\n     *\\n     * - The contract must be paused.\\n     */\\n    function _unpause() internal virtual whenPaused {\\n        _paused = false;\\n        emit Unpaused(_msgSender());\\n    }\\n}\\n\",\"keccak256\":\"0x0849d93b16c9940beb286a7864ed02724b248b93e0d80ef6355af5ef15c64773\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    constructor() {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@venusprotocol/solidity-utilities/contracts/validators.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\n/// @notice Thrown if the supplied address is a zero address where it is not allowed\\nerror ZeroAddressNotAllowed();\\n\\n/// @notice Thrown if the supplied value is 0 where it is not allowed\\nerror ZeroValueNotAllowed();\\n\\n/// @notice Checks if the provided address is nonzero, reverts otherwise\\n/// @param address_ Address to check\\n/// @custom:error ZeroAddressNotAllowed is thrown if the provided address is a zero address\\nfunction ensureNonzeroAddress(address address_) pure {\\n    if (address_ == address(0)) {\\n        revert ZeroAddressNotAllowed();\\n    }\\n}\\n\\n/// @notice Checks if the provided value is nonzero, reverts otherwise\\n/// @param value_ Value to check\\n/// @custom:error ZeroValueNotAllowed is thrown if the provided value is 0\\nfunction ensureNonzeroValue(uint256 value_) pure {\\n    if (value_ == 0) {\\n        revert ZeroValueNotAllowed();\\n    }\\n}\\n\",\"keccak256\":\"0xdb88e14d50dd21889ca3329d755673d022c47e8da005b6a545c7f69c2c4b7b86\",\"license\":\"BSD-3-Clause\"},\"contracts/Cross-chain/BaseOmnichainControllerSrc.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\n\\npragma solidity 0.8.25;\\n\\nimport { Pausable } from \\\"@openzeppelin/contracts/security/Pausable.sol\\\";\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { ensureNonzeroAddress } from \\\"@venusprotocol/solidity-utilities/contracts/validators.sol\\\";\\nimport { IAccessControlManagerV8 } from \\\"./../Governance/IAccessControlManagerV8.sol\\\";\\n\\n/**\\n * @title BaseOmnichainControllerSrc\\n * @dev This contract is the base for the Omnichain controller source contracts.\\n * It provides functionality related to daily command limits and pausability.\\n * @custom:security-contact https://github.com/VenusProtocol/governance-contracts#discussion\\n */\\n\\ncontract BaseOmnichainControllerSrc is Ownable, Pausable {\\n    /**\\n     * @notice ACM (Access Control Manager) contract address\\n     */\\n    address public accessControlManager;\\n\\n    /**\\n     * @notice Maximum daily limit for commands from the local chain\\n     */\\n    mapping(uint16 => uint256) public chainIdToMaxDailyLimit;\\n\\n    /**\\n     * @notice Total commands transferred within the last 24-hour window from the local chain\\n     */\\n    mapping(uint16 => uint256) public chainIdToLast24HourCommandsSent;\\n\\n    /**\\n     * @notice Timestamp when the last 24-hour window started from the local chain\\n     */\\n    mapping(uint16 => uint256) public chainIdToLast24HourWindowStart;\\n    /**\\n     * @notice Timestamp when the last proposal sent from the local chain to dest chain\\n     */\\n    mapping(uint16 => uint256) public chainIdToLastProposalSentTimestamp;\\n\\n    /**\\n     * @notice Emitted when the maximum daily limit of commands from the local chain is modified\\n     */\\n    event SetMaxDailyLimit(uint16 indexed chainId, uint256 oldMaxLimit, uint256 newMaxLimit);\\n    /*\\n     * @notice Emitted when the address of ACM is updated\\n     */\\n    event NewAccessControlManager(address indexed oldAccessControlManager, address indexed newAccessControlManager);\\n\\n    constructor(address accessControlManager_) {\\n        ensureNonzeroAddress(accessControlManager_);\\n        accessControlManager = accessControlManager_;\\n    }\\n\\n    /**\\n     * @notice Sets the limit of daily (24 Hour) command amount\\n     * @param chainId_ Destination chain id\\n     * @param limit_ Number of commands\\n     * @custom:access Controlled by AccessControlManager\\n     * @custom:event Emits SetMaxDailyLimit with old and new limit and its corresponding chain id\\n     */\\n    function setMaxDailyLimit(uint16 chainId_, uint256 limit_) external {\\n        _ensureAllowed(\\\"setMaxDailyLimit(uint16,uint256)\\\");\\n        emit SetMaxDailyLimit(chainId_, chainIdToMaxDailyLimit[chainId_], limit_);\\n        chainIdToMaxDailyLimit[chainId_] = limit_;\\n    }\\n\\n    /**\\n     * @notice Triggers the paused state of the controller\\n     * @custom:access Controlled by AccessControlManager\\n     */\\n    function pause() external {\\n        _ensureAllowed(\\\"pause()\\\");\\n        _pause();\\n    }\\n\\n    /**\\n     * @notice Triggers the resume state of the controller\\n     * @custom:access Controlled by AccessControlManager\\n     */\\n    function unpause() external {\\n        _ensureAllowed(\\\"unpause()\\\");\\n        _unpause();\\n    }\\n\\n    /**\\n     * @notice Sets the address of Access Control Manager (ACM)\\n     * @param accessControlManager_ The new address of the Access Control Manager\\n     * @custom:access Only owner\\n     * @custom:event Emits NewAccessControlManager with old and new access control manager addresses\\n     */\\n    function setAccessControlManager(address accessControlManager_) external onlyOwner {\\n        ensureNonzeroAddress(accessControlManager_);\\n        emit NewAccessControlManager(accessControlManager, accessControlManager_);\\n        accessControlManager = accessControlManager_;\\n    }\\n\\n    /**\\n     * @notice Empty implementation of renounce ownership to avoid any mishap\\n     */\\n    function renounceOwnership() public override {}\\n\\n    /**\\n     * @notice Check eligibility to send commands\\n     * @param dstChainId_ Destination chain id\\n     * @param noOfCommands_ Number of commands to send\\n     */\\n    function _isEligibleToSend(uint16 dstChainId_, uint256 noOfCommands_) internal {\\n        // Load values for the 24-hour window checks\\n        uint256 currentBlockTimestamp = block.timestamp;\\n        uint256 lastDayWindowStart = chainIdToLast24HourWindowStart[dstChainId_];\\n        uint256 commandsSentInWindow = chainIdToLast24HourCommandsSent[dstChainId_];\\n        uint256 maxDailyLimit = chainIdToMaxDailyLimit[dstChainId_];\\n        uint256 lastProposalSentTimestamp = chainIdToLastProposalSentTimestamp[dstChainId_];\\n\\n        // Check if the time window has changed (more than 24 hours have passed)\\n        if (currentBlockTimestamp - lastDayWindowStart > 1 days) {\\n            commandsSentInWindow = noOfCommands_;\\n            chainIdToLast24HourWindowStart[dstChainId_] = currentBlockTimestamp;\\n        } else {\\n            commandsSentInWindow += noOfCommands_;\\n        }\\n\\n        // Revert if the amount exceeds the daily limit\\n        require(commandsSentInWindow <= maxDailyLimit, \\\"Daily Transaction Limit Exceeded\\\");\\n        // Revert if the last proposal is already sent in current block i.e multiple proposals cannot be sent within the same block.timestamp\\n        require(lastProposalSentTimestamp != currentBlockTimestamp, \\\"Multiple bridging in a proposal\\\");\\n\\n        // Update the amount for the 24-hour window\\n        chainIdToLast24HourCommandsSent[dstChainId_] = commandsSentInWindow;\\n        // Update the last sent proposal timestamp\\n        chainIdToLastProposalSentTimestamp[dstChainId_] = currentBlockTimestamp;\\n    }\\n\\n    /**\\n     * @notice Ensure that the caller has permission to execute a specific function\\n     * @param functionSig_ Function signature to be checked for permission\\n     */\\n    function _ensureAllowed(string memory functionSig_) internal view {\\n        require(\\n            IAccessControlManagerV8(accessControlManager).isAllowedToCall(msg.sender, functionSig_),\\n            \\\"access denied\\\"\\n        );\\n    }\\n}\\n\",\"keccak256\":\"0x6af3fad580da005d3c0f7485eb17c3a0a42ffea7e1c4b9062ae085db7b9bcba5\",\"license\":\"BSD-3-Clause\"},\"contracts/Cross-chain/OmnichainProposalSender.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.25;\\n\\nimport { ReentrancyGuard } from \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\nimport { ILayerZeroEndpoint } from \\\"@layerzerolabs/solidity-examples/contracts/lzApp/interfaces/ILayerZeroEndpoint.sol\\\";\\nimport { ensureNonzeroAddress } from \\\"@venusprotocol/solidity-utilities/contracts/validators.sol\\\";\\nimport { BaseOmnichainControllerSrc } from \\\"./BaseOmnichainControllerSrc.sol\\\";\\n\\n/**\\n * @title OmnichainProposalSender\\n * @author Venus\\n * @notice OmnichainProposalSender contract builds upon the functionality of its parent contract , BaseOmnichainControllerSrc\\n * It sends a proposal's data to remote chains for execution after the proposal passes on the main chain\\n * when used with GovernorBravo, the owner of this contract must be set to the Timelock contract\\n * @custom:security-contact https://github.com/VenusProtocol/governance-contracts#discussion\\n */\\n\\ncontract OmnichainProposalSender is ReentrancyGuard, BaseOmnichainControllerSrc {\\n    /**\\n     * @notice Stores the total number of remote proposals\\n     */\\n    uint256 public proposalCount;\\n\\n    /**\\n     * @notice Execution hashes of failed messages\\n     * @dev [proposalId] -> [executionHash]\\n     */\\n    mapping(uint256 => bytes32) public storedExecutionHashes;\\n\\n    /**\\n     * @notice LayerZero endpoint for sending messages to remote chains\\n     */\\n    ILayerZeroEndpoint public immutable LZ_ENDPOINT;\\n\\n    /**\\n     * @notice Specifies the allowed path for sending messages (remote chainId => remote app address + local app address)\\n     */\\n    mapping(uint16 => bytes) public trustedRemoteLookup;\\n\\n    /**\\n     * @notice Emitted when a remote message receiver is set for the remote chain\\n     */\\n    event SetTrustedRemoteAddress(uint16 indexed remoteChainId, bytes oldRemoteAddress, bytes newRemoteAddress);\\n\\n    /**\\n     * @notice Event emitted when trusted remote sets to empty\\n     */\\n    event TrustedRemoteRemoved(uint16 indexed chainId);\\n\\n    /**\\n     * @notice Emitted when a proposal execution request is sent to the remote chain\\n     */\\n    event ExecuteRemoteProposal(uint16 indexed remoteChainId, uint256 proposalId, bytes payload);\\n\\n    /**\\n     * @notice Emitted when a previously failed message is successfully sent to the remote chain\\n     */\\n    event ClearPayload(uint256 indexed proposalId, bytes32 executionHash);\\n\\n    /**\\n     * @notice Emitted when an execution hash of a failed message is saved\\n     */\\n    event StorePayload(\\n        uint256 indexed proposalId,\\n        uint16 indexed remoteChainId,\\n        bytes payload,\\n        bytes adapterParams,\\n        uint256 value,\\n        bytes reason\\n    );\\n    /**\\n     * @notice Emitted while fallback withdraw\\n     */\\n    event FallbackWithdraw(address indexed receiver, uint256 value);\\n\\n    constructor(\\n        ILayerZeroEndpoint lzEndpoint_,\\n        address accessControlManager_\\n    ) BaseOmnichainControllerSrc(accessControlManager_) {\\n        ensureNonzeroAddress(address(lzEndpoint_));\\n        LZ_ENDPOINT = lzEndpoint_;\\n    }\\n\\n    /**\\n     * @notice Estimates LayerZero fees for cross-chain message delivery to the remote chain\\n     * @dev The estimated fees are the minimum required; it's recommended to increase the fees amount when sending a message. The unused amount will be refunded\\n     * @param remoteChainId_ The LayerZero id of a remote chain\\n     * @param payload_ The payload to be sent to the remote chain. It's computed as follows:\\n     * payload = abi.encode(abi.encode(targets, values, signatures, calldatas, proposalType), pId)\\n     * @param useZro_ Bool that indicates whether to pay in ZRO tokens or not\\n     * @param adapterParams_ The params used to specify the custom amount of gas required for the execution on the destination\\n     * @return nativeFee The amount of fee in the native gas token (e.g. ETH)\\n     * @return zroFee The amount of fee in ZRO token\\n     */\\n    function estimateFees(\\n        uint16 remoteChainId_,\\n        bytes calldata payload_,\\n        bool useZro_,\\n        bytes calldata adapterParams_\\n    ) external view returns (uint256, uint256) {\\n        return LZ_ENDPOINT.estimateFees(remoteChainId_, address(this), payload_, useZro_, adapterParams_);\\n    }\\n\\n    /**\\n     * @notice Remove trusted remote from storage\\n     * @param remoteChainId_ The chain's id corresponds to setting the trusted remote to empty\\n     * @custom:access Controlled by Access Control Manager\\n     * @custom:event Emit TrustedRemoteRemoved with remote chain id\\n     */\\n    function removeTrustedRemote(uint16 remoteChainId_) external {\\n        _ensureAllowed(\\\"removeTrustedRemote(uint16)\\\");\\n        require(trustedRemoteLookup[remoteChainId_].length != 0, \\\"OmnichainProposalSender: trusted remote not found\\\");\\n        delete trustedRemoteLookup[remoteChainId_];\\n        emit TrustedRemoteRemoved(remoteChainId_);\\n    }\\n\\n    /**\\n     * @notice Sends a message to execute a remote proposal\\n     * @dev Stores the hash of the execution parameters if sending fails (e.g., due to insufficient fees)\\n     * @param remoteChainId_ The LayerZero id of the remote chain\\n     * @param payload_ The payload to be sent to the remote chain\\n     * It's computed as follows: payload = abi.encode(targets, values, signatures, calldatas, proposalType)\\n     * @param adapterParams_ The params used to specify the custom amount of gas required for the execution on the destination\\n     * @param zroPaymentAddress_ The address of the ZRO token holder who would pay for the transaction. This must be either address(this) or tx.origin\\n     * @custom:event Emits ExecuteRemoteProposal with remote chain id, proposal ID and payload on success\\n     * @custom:event Emits StorePayload with last stored payload proposal ID ,remote chain id , payload, adapter params , values and reason for failure\\n     * @custom:access Controlled by Access Control Manager\\n     */\\n    function execute(\\n        uint16 remoteChainId_,\\n        bytes calldata payload_,\\n        bytes calldata adapterParams_,\\n        address zroPaymentAddress_\\n    ) external payable whenNotPaused {\\n        _ensureAllowed(\\\"execute(uint16,bytes,bytes,address)\\\");\\n\\n        // A zero value will result in a failed message; therefore, a positive value is required to send a message across the chain.\\n        require(msg.value > 0, \\\"OmnichainProposalSender: value cannot be zero\\\");\\n        require(payload_.length != 0, \\\"OmnichainProposalSender: empty payload\\\");\\n\\n        bytes memory trustedRemote = trustedRemoteLookup[remoteChainId_];\\n        require(trustedRemote.length != 0, \\\"OmnichainProposalSender: destination chain is not a trusted source\\\");\\n        _validateProposal(remoteChainId_, payload_);\\n        uint256 _pId = ++proposalCount;\\n        bytes memory payload = abi.encode(payload_, _pId);\\n\\n        try\\n            LZ_ENDPOINT.send{ value: msg.value }(\\n                remoteChainId_,\\n                trustedRemote,\\n                payload,\\n                payable(msg.sender),\\n                zroPaymentAddress_,\\n                adapterParams_\\n            )\\n        {\\n            emit ExecuteRemoteProposal(remoteChainId_, _pId, payload);\\n        } catch (bytes memory reason) {\\n            storedExecutionHashes[_pId] = keccak256(abi.encode(remoteChainId_, payload, adapterParams_, msg.value));\\n            emit StorePayload(_pId, remoteChainId_, payload, adapterParams_, msg.value, reason);\\n        }\\n    }\\n\\n    /**\\n     * @notice Resends a previously failed message\\n     * @dev Allows providing more fees if needed. The extra fees will be refunded to the caller\\n     * @param pId_ The proposal ID to identify a failed message\\n     * @param remoteChainId_ The LayerZero id of the remote chain\\n     * @param payload_ The payload to be sent to the remote chain\\n     * It's computed as follows: payload = abi.encode(abi.encode(targets, values, signatures, calldatas, proposalType), pId)\\n     * @param adapterParams_ The params used to specify the custom amount of gas required for the execution on the destination\\n     * @param zroPaymentAddress_ The address of the ZRO token holder who would pay for the transaction.\\n     * @param originalValue_ The msg.value passed when execute() function was called\\n     * @custom:event Emits ClearPayload with proposal ID and hash\\n     * @custom:access Controlled by Access Control Manager\\n     */\\n    function retryExecute(\\n        uint256 pId_,\\n        uint16 remoteChainId_,\\n        bytes calldata payload_,\\n        bytes calldata adapterParams_,\\n        address zroPaymentAddress_,\\n        uint256 originalValue_\\n    ) external payable whenNotPaused nonReentrant {\\n        _ensureAllowed(\\\"retryExecute(uint256,uint16,bytes,bytes,address,uint256)\\\");\\n        bytes memory trustedRemote = trustedRemoteLookup[remoteChainId_];\\n        require(trustedRemote.length != 0, \\\"OmnichainProposalSender: destination chain is not a trusted source\\\");\\n        bytes32 hash = storedExecutionHashes[pId_];\\n        require(hash != bytes32(0), \\\"OmnichainProposalSender: no stored payload\\\");\\n        require(payload_.length != 0, \\\"OmnichainProposalSender: empty payload\\\");\\n        (bytes memory payload, ) = abi.decode(payload_, (bytes, uint256));\\n        _validateProposal(remoteChainId_, payload);\\n\\n        require(\\n            keccak256(abi.encode(remoteChainId_, payload_, adapterParams_, originalValue_)) == hash,\\n            \\\"OmnichainProposalSender: invalid execution params\\\"\\n        );\\n\\n        delete storedExecutionHashes[pId_];\\n\\n        emit ClearPayload(pId_, hash);\\n\\n        LZ_ENDPOINT.send{ value: originalValue_ + msg.value }(\\n            remoteChainId_,\\n            trustedRemote,\\n            payload_,\\n            payable(msg.sender),\\n            zroPaymentAddress_,\\n            adapterParams_\\n        );\\n    }\\n\\n    /**\\n     * @notice Clear previously failed message\\n     * @param to_ Address of the receiver\\n     * @param pId_ The proposal ID to identify a failed message\\n     * @param remoteChainId_ The LayerZero id of the remote chain\\n     * @param payload_ The payload to be sent to the remote chain\\n     * It's computed as follows: payload = abi.encode(abi.encode(targets, values, signatures, calldatas, proposalType), pId)\\n     * @param adapterParams_ The params used to specify the custom amount of gas required for the execution on the destination\\n     * @param originalValue_ The msg.value passed when execute() function was called\\n     * @custom:access Only owner\\n     * @custom:event Emits ClearPayload with proposal ID and hash\\n     * @custom:event Emits FallbackWithdraw with receiver and amount\\n     */\\n    function fallbackWithdraw(\\n        address to_,\\n        uint256 pId_,\\n        uint16 remoteChainId_,\\n        bytes calldata payload_,\\n        bytes calldata adapterParams_,\\n        uint256 originalValue_\\n    ) external onlyOwner nonReentrant {\\n        ensureNonzeroAddress(to_);\\n        require(originalValue_ > 0, \\\"OmnichainProposalSender: invalid native amount\\\");\\n        require(payload_.length != 0, \\\"OmnichainProposalSender: empty payload\\\");\\n\\n        bytes32 hash = storedExecutionHashes[pId_];\\n        require(hash != bytes32(0), \\\"OmnichainProposalSender: no stored payload\\\");\\n\\n        bytes memory execution = abi.encode(remoteChainId_, payload_, adapterParams_, originalValue_);\\n        require(keccak256(execution) == hash, \\\"OmnichainProposalSender: invalid execution params\\\");\\n\\n        delete storedExecutionHashes[pId_];\\n\\n        emit FallbackWithdraw(to_, originalValue_);\\n        emit ClearPayload(pId_, hash);\\n\\n        // Transfer the native to the `to_` address\\n        (bool sent, ) = to_.call{ value: originalValue_ }(\\\"\\\");\\n        require(sent, \\\"Call failed\\\");\\n    }\\n\\n    /**\\n     * @notice Sets the remote message receiver address\\n     * @param remoteChainId_ The LayerZero id of a remote chain\\n     * @param newRemoteAddress_ The address of the contract on the remote chain to receive messages sent by this contract\\n     * @custom:access Controlled by AccessControlManager\\n     * @custom:event Emits SetTrustedRemoteAddress with remote chain Id and remote address\\n     */\\n    function setTrustedRemoteAddress(uint16 remoteChainId_, bytes calldata newRemoteAddress_) external {\\n        _ensureAllowed(\\\"setTrustedRemoteAddress(uint16,bytes)\\\");\\n        require(remoteChainId_ != 0, \\\"OmnichainProposalSender: chainId must not be zero\\\");\\n        ensureNonzeroAddress(address(uint160(bytes20(newRemoteAddress_))));\\n        require(newRemoteAddress_.length == 20, \\\"OmnichainProposalSender: remote address must be 20 bytes long\\\");\\n        bytes memory oldRemoteAddress = trustedRemoteLookup[remoteChainId_];\\n        trustedRemoteLookup[remoteChainId_] = abi.encodePacked(newRemoteAddress_, address(this));\\n        emit SetTrustedRemoteAddress(remoteChainId_, oldRemoteAddress, trustedRemoteLookup[remoteChainId_]);\\n    }\\n\\n    /**\\n     * @notice Sets the configuration of the LayerZero messaging library of the specified version\\n     * @param version_ Messaging library version\\n     * @param chainId_ The LayerZero chainId for the pending config change\\n     * @param configType_ The type of configuration. Every messaging library has its own convention\\n     * @param config_ The configuration in bytes. It can encode arbitrary content\\n     * @custom:access Controlled by AccessControlManager\\n     */\\n    function setConfig(uint16 version_, uint16 chainId_, uint256 configType_, bytes calldata config_) external {\\n        _ensureAllowed(\\\"setConfig(uint16,uint16,uint256,bytes)\\\");\\n        LZ_ENDPOINT.setConfig(version_, chainId_, configType_, config_);\\n    }\\n\\n    /**\\n     * @notice Sets the configuration of the LayerZero messaging library of the specified version\\n     * @param version_ New messaging library version\\n     * @custom:access Controlled by AccessControlManager\\n     */\\n    function setSendVersion(uint16 version_) external {\\n        _ensureAllowed(\\\"setSendVersion(uint16)\\\");\\n        LZ_ENDPOINT.setSendVersion(version_);\\n    }\\n\\n    /**\\n     * @notice Gets the configuration of the LayerZero messaging library of the specified version\\n     * @param version_ Messaging library version\\n     * @param chainId_ The LayerZero chainId\\n     * @param configType_ Type of configuration. Every messaging library has its own convention\\n     */\\n    function getConfig(uint16 version_, uint16 chainId_, uint256 configType_) external view returns (bytes memory) {\\n        return LZ_ENDPOINT.getConfig(version_, chainId_, address(this), configType_);\\n    }\\n\\n    function _validateProposal(uint16 remoteChainId_, bytes memory payload_) internal {\\n        (\\n            address[] memory targets,\\n            uint256[] memory values,\\n            string[] memory signatures,\\n            bytes[] memory calldatas,\\n\\n        ) = abi.decode(payload_, (address[], uint[], string[], bytes[], uint8));\\n        require(\\n            targets.length == values.length &&\\n                targets.length == signatures.length &&\\n                targets.length == calldatas.length,\\n            \\\"OmnichainProposalSender: proposal function information arity mismatch\\\"\\n        );\\n        _isEligibleToSend(remoteChainId_, targets.length);\\n    }\\n}\\n\",\"keccak256\":\"0x23948e6cc55e49f5ebff6f5811c2073274eb34da87a9c62399bb602fcf8792da\",\"license\":\"MIT\"},\"contracts/Governance/IAccessControlManagerV8.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nimport \\\"@openzeppelin/contracts/access/IAccessControl.sol\\\";\\n\\n/**\\n * @title IAccessControlManagerV8\\n * @author Venus\\n * @notice Interface implemented by the `AccessControlManagerV8` contract.\\n */\\ninterface IAccessControlManagerV8 is IAccessControl {\\n    function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external;\\n\\n    function revokeCallPermission(\\n        address contractAddress,\\n        string calldata functionSig,\\n        address accountToRevoke\\n    ) external;\\n\\n    function isAllowedToCall(address account, string calldata functionSig) external view returns (bool);\\n\\n    function hasPermission(\\n        address account,\\n        address contractAddress,\\n        string calldata functionSig\\n    ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xaa29b098440d0b3a131c5ecdf25ce548790c1b5ac7bf9b5c0264b6af6f7a1e0b\",\"license\":\"BSD-3-Clause\"}},\"version\":1}",
  "bytecode": "0x60a060405234801561001057600080fd5b5060405161346c38038061346c83398101604081905261002f91610120565b60016000558061003e3361008f565b6001805460ff60a01b19169055610054816100e1565b600280546001600160a01b0319166001600160a01b039290921691909117905561007d826100e1565b506001600160a01b031660805261015a565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038116610108576040516342bcdf7f60e11b815260040160405180910390fd5b50565b6001600160a01b038116811461010857600080fd5b6000806040838503121561013357600080fd5b825161013e8161010b565b602084015190925061014f8161010b565b809150509250929050565b6080516132cd61019f600039600081816104e0015281816105e80152818161070001528181611067015281816112270152818161164b0152611a3f01526132cd6000f3fe6080604052600436106101a15760003560e01c80637533d788116100e1578063b4a0bdf31161008a578063da35c66411610064578063da35c66414610502578063e0354d7f14610518578063e2222b0e14610545578063f2fde38b1461055857600080fd5b8063b4a0bdf314610481578063cbed8b9c146104ae578063cd4d1c64146104ce57600080fd5b80638da5cb5b116100bb5780638da5cb5b146103e857806393a61d6c14610434578063a6c3d1651461046157600080fd5b80637533d788146103865780637dbb533c146103a65780638456cb59146103d357600080fd5b806330fd54a01161014e5780634f4ba0f4116101285780634f4ba0f4146102e55780635c975abb146103125780635f6716f71461034d578063715018a61461037a57600080fd5b806330fd54a01461029d5780633f4ba83a146102bd5780633fd9d7ef146102d257600080fd5b806321b4eaa11161017f57806321b4eaa1146102285780632488eec81461025d5780632dbbec081461027d57600080fd5b806307e0db17146101a65780630e32cb86146101c85780631183a3b2146101e8575b600080fd5b3480156101b257600080fd5b506101c66101c136600461222e565b610578565b005b3480156101d457600080fd5b506101c66101e336600461226b565b61065c565b3480156101f457600080fd5b5061021561020336600461222e565b60046020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023457600080fd5b506102486102433660046122df565b6106fb565b6040805192835260208301919091520161021f565b34801561026957600080fd5b506101c6610278366004612374565b6107b2565b34801561028957600080fd5b506101c661029836600461222e565b610855565b3480156102a957600080fd5b506101c66102b836600461239e565b61097b565b3480156102c957600080fd5b506101c6610d11565b6101c66102e0366004612442565b610d59565b3480156102f157600080fd5b5061021561030036600461222e565b60036020526000908152604090205481565b34801561031e57600080fd5b5060015474010000000000000000000000000000000000000000900460ff16604051901515815260200161021f565b34801561035957600080fd5b5061036d6103683660046124d5565b6111dd565b60405161021f9190612561565b3480156101c657600080fd5b34801561039257600080fd5b5061036d6103a136600461222e565b6112b5565b3480156103b257600080fd5b506102156103c1366004612574565b60086020526000908152604090205481565b3480156103df57600080fd5b506101c661134f565b3480156103f457600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b34801561044057600080fd5b5061021561044f36600461222e565b60056020526000908152604090205481565b34801561046d57600080fd5b506101c661047c36600461258d565b611395565b34801561048d57600080fd5b5060025461040f9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104ba57600080fd5b506101c66104c93660046125e0565b6115ed565b3480156104da57600080fd5b5061040f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561050e57600080fd5b5061021560075481565b34801561052457600080fd5b5061021561053336600461222e565b60066020526000908152604090205481565b6101c661055336600461264f565b6116b6565b34801561056457600080fd5b506101c661057336600461226b565b611ad8565b6105b66040518060400160405280601681526020017f73657453656e6456657273696f6e2875696e7431362900000000000000000000815250611b75565b6040517f07e0db1700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906307e0db1790602401600060405180830381600087803b15801561064157600080fd5b505af1158015610655573d6000803e3d6000fd5b5050505050565b610664611c5a565b61066d81611cc1565b60025460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa090600090a3600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340a7bb1089308a8a8a8a8a6040518863ffffffff1660e01b81526004016107639796959493929190612721565b6040805180830381865afa15801561077f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a39190612784565b91509150965096945050505050565b6107f06040518060400160405280602081526020017f7365744d61784461696c794c696d69742875696e7431362c75696e7432353629815250611b75565b61ffff82166000818152600360209081526040918290205482519081529081018490527f4dd31065e259d5284e44d1f9265710da72eafcf78dc925e3881189fc3b71f693910160405180910390a261ffff909116600090815260036020526040902055565b6108936040518060400160405280601b81526020017f72656d6f76655472757374656452656d6f74652875696e743136290000000000815250611b75565b61ffff8116600090815260096020526040902080546108b1906127a8565b905060000361092d5760405162461bcd60e51b815260206004820152603160248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a207472757374656460448201527f2072656d6f7465206e6f7420666f756e6400000000000000000000000000000060648201526084015b60405180910390fd5b61ffff81166000908152600960205260408120610949916121c9565b60405161ffff8216907f6d5075c81d4d9e75bec6052f4e44f58f8a8cf1327544addbbf015fb06f83bd3790600090a250565b610983611c5a565b61098b611d0e565b61099488611cc1565b60008111610a0a5760405162461bcd60e51b815260206004820152602e60248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20696e76616c696460448201527f206e617469766520616d6f756e740000000000000000000000000000000000006064820152608401610924565b6000849003610a815760405162461bcd60e51b815260206004820152602660248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20656d707479207060448201527f61796c6f616400000000000000000000000000000000000000000000000000006064820152608401610924565b60008781526008602052604090205480610b035760405162461bcd60e51b815260206004820152602a60248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a206e6f2073746f7260448201527f6564207061796c6f6164000000000000000000000000000000000000000000006064820152608401610924565b6000878787878787604051602001610b20969594939291906127fb565b604051602081830303815290604052905081818051906020012014610bad5760405162461bcd60e51b815260206004820152603160248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20696e76616c696460448201527f20657865637574696f6e20706172616d730000000000000000000000000000006064820152608401610924565b600089815260086020526040808220919091555173ffffffffffffffffffffffffffffffffffffffff8b16907f22fe8e8ead80ad0961d77107e806ba9bcf9ca3b175a9d446145646d39c36ab9690610c089086815260200190565b60405180910390a2887f2dc7ac5d08fd553243fc66b5f15262e3f3013e27abf660d7bb3fccf133322f6e83604051610c4291815260200190565b60405180910390a260008a73ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d8060008114610ca4576040519150601f19603f3d011682016040523d82523d6000602084013e610ca9565b606091505b5050905080610cfa5760405162461bcd60e51b815260206004820152600b60248201527f43616c6c206661696c65640000000000000000000000000000000000000000006044820152606401610924565b505050610d076001600055565b5050505050505050565b610d4f6040518060400160405280600981526020017f756e706175736528290000000000000000000000000000000000000000000000815250611b75565b610d57611d67565b565b610d61611de4565b610d826040518060600160405280602381526020016131f260239139611b75565b60003411610df85760405162461bcd60e51b815260206004820152602d60248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a2076616c7565206360448201527f616e6e6f74206265207a65726f000000000000000000000000000000000000006064820152608401610924565b6000849003610e6f5760405162461bcd60e51b815260206004820152602660248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20656d707479207060448201527f61796c6f616400000000000000000000000000000000000000000000000000006064820152608401610924565b61ffff861660009081526009602052604081208054610e8d906127a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb9906127a8565b8015610f065780601f10610edb57610100808354040283529160200191610f06565b820191906000526020600020905b815481529060010190602001808311610ee957829003601f168201915b505050505090508051600003610faa5760405162461bcd60e51b815260206004820152604260248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a2064657374696e6160448201527f74696f6e20636861696e206973206e6f742061207472757374656420736f757260648201527f6365000000000000000000000000000000000000000000000000000000000000608482015260a401610924565b610fea8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e4f92505050565b6000600760008154610ffb9061286f565b9190508190559050600087878360405160200161101a939291906128a7565b60408051601f19818403018152908290527fc5803100000000000000000000000000000000000000000000000000000000008252915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c58031009034906110aa908d908890879033908c908f908f906004016128cb565b6000604051808303818588803b1580156110c357600080fd5b505af1935050505080156110d5575060015b611193573d808015611103576040519150601f19603f3d011682016040523d82523d6000602084013e611108565b606091505b508982888834604051602001611122959493929190612933565b60408051601f198184030181528282528051602091820120600087815260089092529190205561ffff8b169084907f6d16111647e03d7f1cb2b71c02eafe3355b97dfc17af3de1b94ef39c8a9ee4d9906111859086908c908c9034908990612976565b60405180910390a3506111d2565b8861ffff167f95a4fcf4eb9be6f5cf2eb6830782870f8907bccc513f765388a9cb2dae2f325983836040516111c99291906129c2565b60405180910390a25b505050505050505050565b6040517ff5ecbdbc00000000000000000000000000000000000000000000000000000000815261ffff808516600483015283166024820152306044820152606481018290526060907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063f5ecbdbc90608401600060405180830381865afa158015611283573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112ab9190810190612ab8565b90505b9392505050565b600960205260009081526040902080546112ce906127a8565b80601f01602080910402602001604051908101604052809291908181526020018280546112fa906127a8565b80156113475780601f1061131c57610100808354040283529160200191611347565b820191906000526020600020905b81548152906001019060200180831161132a57829003601f168201915b505050505081565b61138d6040518060400160405280600781526020017f7061757365282900000000000000000000000000000000000000000000000000815250611b75565b610d57611f3c565b6113b660405180606001604052806025815260200161321560259139611b75565b8261ffff166000036114305760405162461bcd60e51b815260206004820152603160248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20636861696e496460448201527f206d757374206e6f74206265207a65726f0000000000000000000000000000006064820152608401610924565b61144561143d8284612af5565b60601c611cc1565b601481146114bb5760405162461bcd60e51b815260206004820152603d60248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a2072656d6f74652060448201527f61646472657373206d757374206265203230206279746573206c6f6e670000006064820152608401610924565b61ffff8316600090815260096020526040812080546114d9906127a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611505906127a8565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b5050505050905082823060405160200161156e93929190612b3d565b60408051601f1981840301815291815261ffff86166000908152600960205220906115999082612bc3565b5061ffff84166000818152600960205260409081902090517fe84e609c32d71c678382f7c65cc051810a41dcaf660e55c9f8fcffeba4621a32916115df91859190612cbf565b60405180910390a250505050565b61160e60405180606001604052806026815260200161323a60269139611b75565b6040517fcbed8b9c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c906116889088908890889088908890600401612d78565b600060405180830381600087803b1580156116a257600080fd5b505af11580156111d2573d6000803e3d6000fd5b6116be611de4565b6116c6611d0e565b6116e760405180606001604052806038815260200161326060389139611b75565b61ffff871660009081526009602052604081208054611705906127a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611731906127a8565b801561177e5780601f106117535761010080835404028352916020019161177e565b820191906000526020600020905b81548152906001019060200180831161176157829003601f168201915b5050505050905080516000036118225760405162461bcd60e51b815260206004820152604260248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a2064657374696e6160448201527f74696f6e20636861696e206973206e6f742061207472757374656420736f757260648201527f6365000000000000000000000000000000000000000000000000000000000000608482015260a401610924565b600089815260086020526040902054806118a45760405162461bcd60e51b815260206004820152602a60248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a206e6f2073746f7260448201527f6564207061796c6f6164000000000000000000000000000000000000000000006064820152608401610924565b600087900361191b5760405162461bcd60e51b815260206004820152602660248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20656d707479207060448201527f61796c6f616400000000000000000000000000000000000000000000000000006064820152608401610924565b6000611929888a018a612db1565b5090506119368a82611e4f565b818a8a8a8a8a89604051602001611952969594939291906127fb565b60405160208183030381529060405280519060200120146119db5760405162461bcd60e51b815260206004820152603160248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20696e76616c696460448201527f20657865637574696f6e20706172616d730000000000000000000000000000006064820152608401610924565b60008b81526008602052604080822091909155518b907f2dc7ac5d08fd553243fc66b5f15262e3f3013e27abf660d7bb3fccf133322f6e90611a209085815260200190565b60405180910390a273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c5803100611a6e3487612e2e565b8c868d8d338c8f8f6040518a63ffffffff1660e01b8152600401611a99989796959493929190612e47565b6000604051808303818588803b158015611ab257600080fd5b505af1158015611ac6573d6000803e3d6000fd5b5050505050505050610d076001600055565b611ae0611c5a565b73ffffffffffffffffffffffffffffffffffffffff8116611b695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610924565b611b7281611fab565b50565b6002546040517f18c5e8ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906318c5e8ab90611bcd9033908590600401612ebf565b602060405180830381865afa158015611bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0e9190612eee565b611b725760405162461bcd60e51b815260206004820152600d60248201527f6163636573732064656e696564000000000000000000000000000000000000006044820152606401610924565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d575760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610924565b73ffffffffffffffffffffffffffffffffffffffff8116611b72576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260005403611d605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610924565b6002600055565b611d6f612022565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60015474010000000000000000000000000000000000000000900460ff1615610d575760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610924565b60008060008084806020019051810190611e6991906130bf565b50935093509350935082518451148015611e84575081518451145b8015611e91575080518451145b611f295760405162461bcd60e51b815260206004820152604560248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a2070726f706f736160448201527f6c2066756e6374696f6e20696e666f726d6174696f6e206172697479206d697360648201527f6d61746368000000000000000000000000000000000000000000000000000000608482015260a401610924565b611f3486855161208c565b505050505050565b611f44611de4565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611dba3390565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60015474010000000000000000000000000000000000000000900460ff16610d575760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610924565b61ffff8216600090815260056020908152604080832054600483528184205460038452828520546006909452919093205442939290620151806120cf85876131de565b11156120f35761ffff87166000908152600560205260409020859055859250612100565b6120fd8684612e2e565b92505b818311156121505760405162461bcd60e51b815260206004820181905260248201527f4461696c79205472616e73616374696f6e204c696d69742045786365656465646044820152606401610924565b84810361219f5760405162461bcd60e51b815260206004820152601f60248201527f4d756c7469706c65206272696467696e6720696e20612070726f706f73616c006044820152606401610924565b505061ffff9094166000908152600460209081526040808320969096556006905293909320555050565b5080546121d5906127a8565b6000825580601f106121e5575050565b601f016020900490600052602060002090810190611b7291905b8082111561221357600081556001016121ff565b5090565b803561ffff8116811461222957600080fd5b919050565b60006020828403121561224057600080fd5b6112ae82612217565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7257600080fd5b60006020828403121561227d57600080fd5b81356112ae81612249565b60008083601f84011261229a57600080fd5b50813567ffffffffffffffff8111156122b257600080fd5b6020830191508360208285010111156122ca57600080fd5b9250929050565b8015158114611b7257600080fd5b600080600080600080608087890312156122f857600080fd5b61230187612217565b9550602087013567ffffffffffffffff8082111561231e57600080fd5b61232a8a838b01612288565b90975095506040890135915061233f826122d1565b9093506060880135908082111561235557600080fd5b5061236289828a01612288565b979a9699509497509295939492505050565b6000806040838503121561238757600080fd5b61239083612217565b946020939093013593505050565b60008060008060008060008060c0898b0312156123ba57600080fd5b88356123c581612249565b9750602089013596506123da60408a01612217565b9550606089013567ffffffffffffffff808211156123f757600080fd5b6124038c838d01612288565b909750955060808b013591508082111561241c57600080fd5b506124298b828c01612288565b999c989b50969995989497949560a00135949350505050565b6000806000806000806080878903121561245b57600080fd5b61246487612217565b9550602087013567ffffffffffffffff8082111561248157600080fd5b61248d8a838b01612288565b909750955060408901359150808211156124a657600080fd5b506124b389828a01612288565b90945092505060608701356124c781612249565b809150509295509295509295565b6000806000606084860312156124ea57600080fd5b6124f384612217565b925061250160208501612217565b9150604084013590509250925092565b60005b8381101561252c578181015183820152602001612514565b50506000910152565b6000815180845261254d816020860160208601612511565b601f01601f19169290920160200192915050565b6020815260006112ae6020830184612535565b60006020828403121561258657600080fd5b5035919050565b6000806000604084860312156125a257600080fd5b6125ab84612217565b9250602084013567ffffffffffffffff8111156125c757600080fd5b6125d386828701612288565b9497909650939450505050565b6000806000806000608086880312156125f857600080fd5b61260186612217565b945061260f60208701612217565b935060408601359250606086013567ffffffffffffffff81111561263257600080fd5b61263e88828901612288565b969995985093965092949392505050565b60008060008060008060008060c0898b03121561266b57600080fd5b8835975061267b60208a01612217565b9650604089013567ffffffffffffffff8082111561269857600080fd5b6126a48c838d01612288565b909850965060608b01359150808211156126bd57600080fd5b506126ca8b828c01612288565b90955093505060808901356126de81612249565b8092505060a089013590509295985092959890939650565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b61ffff8816815273ffffffffffffffffffffffffffffffffffffffff8716602082015260a06040820152600061275b60a0830187896126f6565b851515606084015282810360808401526127768185876126f6565b9a9950505050505050505050565b6000806040838503121561279757600080fd5b505080516020909101519092909150565b600181811c908216806127bc57607f821691505b6020821081036127f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b61ffff871681526080602082015260006128196080830187896126f6565b828103604084015261282c8186886126f6565b915050826060830152979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128a0576128a0612840565b5060010190565b6040815260006128bb6040830185876126f6565b9050826020830152949350505050565b61ffff8816815260c0602082015260006128e860c0830189612535565b82810360408401526128fa8189612535565b73ffffffffffffffffffffffffffffffffffffffff88811660608601528716608085015283810360a085015290506127768185876126f6565b61ffff861681526080602082015260006129506080830187612535565b82810360408401526129638186886126f6565b9150508260608301529695505050505050565b6080815260006129896080830188612535565b828103602084015261299c8187896126f6565b905084604084015282810360608401526129b68185612535565b98975050505050505050565b8281526040602082015260006112ab6040830184612535565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612a3357612a336129db565b604052919050565b600067ffffffffffffffff821115612a5557612a556129db565b50601f01601f191660200190565b6000612a76612a7184612a3b565b612a0a565b9050828152838383011115612a8a57600080fd5b6112ae836020830184612511565b600082601f830112612aa957600080fd5b6112ae83835160208501612a63565b600060208284031215612aca57600080fd5b815167ffffffffffffffff811115612ae157600080fd5b612aed84828501612a98565b949350505050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008135818116916014851015612b355780818660140360031b1b83161692505b505092915050565b8284823760609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169101908152601401919050565b601f821115612bbe576000816000526020600020601f850160051c81016020861015612b9f5750805b601f850160051c820191505b81811015611f3457828155600101612bab565b505050565b815167ffffffffffffffff811115612bdd57612bdd6129db565b612bf181612beb84546127a8565b84612b76565b602080601f831160018114612c445760008415612c0e5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611f34565b600085815260208120601f198616915b82811015612c7357888601518255948401946001909101908401612c54565b5085821015612caf57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b604081526000612cd26040830185612535565b60208382038185015260008554612ce8816127a8565b80855260018281168015612d035760018114612d3b57612d69565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416868801528583151560051b8801019450612d69565b896000528560002060005b84811015612d61578154898201890152908301908701612d46565b880187019550505b50929998505050505050505050565b600061ffff808816835280871660208401525084604083015260806060830152612da66080830184866126f6565b979650505050505050565b60008060408385031215612dc457600080fd5b823567ffffffffffffffff811115612ddb57600080fd5b8301601f81018513612dec57600080fd5b8035612dfa612a7182612a3b565b818152866020838501011115612e0f57600080fd5b8160208401602083013760006020928201830152969401359450505050565b80820180821115612e4157612e41612840565b92915050565b61ffff8916815260c060208201526000612e6460c083018a612535565b8281036040840152612e7781898b6126f6565b73ffffffffffffffffffffffffffffffffffffffff88811660608601528716608085015283810360a08501529050612eb08185876126f6565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260006112ab6040830184612535565b600060208284031215612f0057600080fd5b81516112ae816122d1565b600067ffffffffffffffff821115612f2557612f256129db565b5060051b60200190565b600082601f830112612f4057600080fd5b81516020612f50612a7183612f0b565b8083825260208201915060208460051b870101935086841115612f7257600080fd5b602086015b84811015612f8e5780518352918301918301612f77565b509695505050505050565b600082601f830112612faa57600080fd5b81516020612fba612a7183612f0b565b82815260059290921b84018101918181019086841115612fd957600080fd5b8286015b84811015612f8e57805167ffffffffffffffff811115612ffd5760008081fd5b8701603f8101891361300f5760008081fd5b613020898683015160408401612a63565b845250918301918301612fdd565b600082601f83011261303f57600080fd5b8151602061304f612a7183612f0b565b82815260059290921b8401810191818101908684111561306e57600080fd5b8286015b84811015612f8e57805167ffffffffffffffff8111156130925760008081fd5b6130a08986838b0101612a98565b845250918301918301613072565b805160ff8116811461222957600080fd5b600080600080600060a086880312156130d757600080fd5b855167ffffffffffffffff808211156130ef57600080fd5b818801915088601f83011261310357600080fd5b81516020613113612a7183612f0b565b82815260059290921b8401810191818101908c84111561313257600080fd5b948201945b8386101561315957855161314a81612249565b82529482019490820190613137565b918b015191995090935050508082111561317257600080fd5b61317e89838a01612f2f565b9550604088015191508082111561319457600080fd5b6131a089838a01612f99565b945060608801519150808211156131b657600080fd5b506131c38882890161302e565b9250506131d2608087016130ae565b90509295509295909350565b81810381811115612e4157612e4161284056fe657865637574652875696e7431362c62797465732c62797465732c61646472657373297365745472757374656452656d6f7465416464726573732875696e7431362c627974657329736574436f6e6669672875696e7431362c75696e7431362c75696e743235362c6279746573297265747279457865637574652875696e743235362c75696e7431362c62797465732c62797465732c616464726573732c75696e7432353629a26469706673582212207640aa01bf0fe0091e9a77ed4591e13da364297a13e8537adede0f95d517267664736f6c63430008190033",
  "deployedBytecode": "0x6080604052600436106101a15760003560e01c80637533d788116100e1578063b4a0bdf31161008a578063da35c66411610064578063da35c66414610502578063e0354d7f14610518578063e2222b0e14610545578063f2fde38b1461055857600080fd5b8063b4a0bdf314610481578063cbed8b9c146104ae578063cd4d1c64146104ce57600080fd5b80638da5cb5b116100bb5780638da5cb5b146103e857806393a61d6c14610434578063a6c3d1651461046157600080fd5b80637533d788146103865780637dbb533c146103a65780638456cb59146103d357600080fd5b806330fd54a01161014e5780634f4ba0f4116101285780634f4ba0f4146102e55780635c975abb146103125780635f6716f71461034d578063715018a61461037a57600080fd5b806330fd54a01461029d5780633f4ba83a146102bd5780633fd9d7ef146102d257600080fd5b806321b4eaa11161017f57806321b4eaa1146102285780632488eec81461025d5780632dbbec081461027d57600080fd5b806307e0db17146101a65780630e32cb86146101c85780631183a3b2146101e8575b600080fd5b3480156101b257600080fd5b506101c66101c136600461222e565b610578565b005b3480156101d457600080fd5b506101c66101e336600461226b565b61065c565b3480156101f457600080fd5b5061021561020336600461222e565b60046020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023457600080fd5b506102486102433660046122df565b6106fb565b6040805192835260208301919091520161021f565b34801561026957600080fd5b506101c6610278366004612374565b6107b2565b34801561028957600080fd5b506101c661029836600461222e565b610855565b3480156102a957600080fd5b506101c66102b836600461239e565b61097b565b3480156102c957600080fd5b506101c6610d11565b6101c66102e0366004612442565b610d59565b3480156102f157600080fd5b5061021561030036600461222e565b60036020526000908152604090205481565b34801561031e57600080fd5b5060015474010000000000000000000000000000000000000000900460ff16604051901515815260200161021f565b34801561035957600080fd5b5061036d6103683660046124d5565b6111dd565b60405161021f9190612561565b3480156101c657600080fd5b34801561039257600080fd5b5061036d6103a136600461222e565b6112b5565b3480156103b257600080fd5b506102156103c1366004612574565b60086020526000908152604090205481565b3480156103df57600080fd5b506101c661134f565b3480156103f457600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b34801561044057600080fd5b5061021561044f36600461222e565b60056020526000908152604090205481565b34801561046d57600080fd5b506101c661047c36600461258d565b611395565b34801561048d57600080fd5b5060025461040f9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104ba57600080fd5b506101c66104c93660046125e0565b6115ed565b3480156104da57600080fd5b5061040f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561050e57600080fd5b5061021560075481565b34801561052457600080fd5b5061021561053336600461222e565b60066020526000908152604090205481565b6101c661055336600461264f565b6116b6565b34801561056457600080fd5b506101c661057336600461226b565b611ad8565b6105b66040518060400160405280601681526020017f73657453656e6456657273696f6e2875696e7431362900000000000000000000815250611b75565b6040517f07e0db1700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906307e0db1790602401600060405180830381600087803b15801561064157600080fd5b505af1158015610655573d6000803e3d6000fd5b5050505050565b610664611c5a565b61066d81611cc1565b60025460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa090600090a3600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340a7bb1089308a8a8a8a8a6040518863ffffffff1660e01b81526004016107639796959493929190612721565b6040805180830381865afa15801561077f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a39190612784565b91509150965096945050505050565b6107f06040518060400160405280602081526020017f7365744d61784461696c794c696d69742875696e7431362c75696e7432353629815250611b75565b61ffff82166000818152600360209081526040918290205482519081529081018490527f4dd31065e259d5284e44d1f9265710da72eafcf78dc925e3881189fc3b71f693910160405180910390a261ffff909116600090815260036020526040902055565b6108936040518060400160405280601b81526020017f72656d6f76655472757374656452656d6f74652875696e743136290000000000815250611b75565b61ffff8116600090815260096020526040902080546108b1906127a8565b905060000361092d5760405162461bcd60e51b815260206004820152603160248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a207472757374656460448201527f2072656d6f7465206e6f7420666f756e6400000000000000000000000000000060648201526084015b60405180910390fd5b61ffff81166000908152600960205260408120610949916121c9565b60405161ffff8216907f6d5075c81d4d9e75bec6052f4e44f58f8a8cf1327544addbbf015fb06f83bd3790600090a250565b610983611c5a565b61098b611d0e565b61099488611cc1565b60008111610a0a5760405162461bcd60e51b815260206004820152602e60248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20696e76616c696460448201527f206e617469766520616d6f756e740000000000000000000000000000000000006064820152608401610924565b6000849003610a815760405162461bcd60e51b815260206004820152602660248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20656d707479207060448201527f61796c6f616400000000000000000000000000000000000000000000000000006064820152608401610924565b60008781526008602052604090205480610b035760405162461bcd60e51b815260206004820152602a60248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a206e6f2073746f7260448201527f6564207061796c6f6164000000000000000000000000000000000000000000006064820152608401610924565b6000878787878787604051602001610b20969594939291906127fb565b604051602081830303815290604052905081818051906020012014610bad5760405162461bcd60e51b815260206004820152603160248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20696e76616c696460448201527f20657865637574696f6e20706172616d730000000000000000000000000000006064820152608401610924565b600089815260086020526040808220919091555173ffffffffffffffffffffffffffffffffffffffff8b16907f22fe8e8ead80ad0961d77107e806ba9bcf9ca3b175a9d446145646d39c36ab9690610c089086815260200190565b60405180910390a2887f2dc7ac5d08fd553243fc66b5f15262e3f3013e27abf660d7bb3fccf133322f6e83604051610c4291815260200190565b60405180910390a260008a73ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d8060008114610ca4576040519150601f19603f3d011682016040523d82523d6000602084013e610ca9565b606091505b5050905080610cfa5760405162461bcd60e51b815260206004820152600b60248201527f43616c6c206661696c65640000000000000000000000000000000000000000006044820152606401610924565b505050610d076001600055565b5050505050505050565b610d4f6040518060400160405280600981526020017f756e706175736528290000000000000000000000000000000000000000000000815250611b75565b610d57611d67565b565b610d61611de4565b610d826040518060600160405280602381526020016131f260239139611b75565b60003411610df85760405162461bcd60e51b815260206004820152602d60248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a2076616c7565206360448201527f616e6e6f74206265207a65726f000000000000000000000000000000000000006064820152608401610924565b6000849003610e6f5760405162461bcd60e51b815260206004820152602660248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20656d707479207060448201527f61796c6f616400000000000000000000000000000000000000000000000000006064820152608401610924565b61ffff861660009081526009602052604081208054610e8d906127a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb9906127a8565b8015610f065780601f10610edb57610100808354040283529160200191610f06565b820191906000526020600020905b815481529060010190602001808311610ee957829003601f168201915b505050505090508051600003610faa5760405162461bcd60e51b815260206004820152604260248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a2064657374696e6160448201527f74696f6e20636861696e206973206e6f742061207472757374656420736f757260648201527f6365000000000000000000000000000000000000000000000000000000000000608482015260a401610924565b610fea8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e4f92505050565b6000600760008154610ffb9061286f565b9190508190559050600087878360405160200161101a939291906128a7565b60408051601f19818403018152908290527fc5803100000000000000000000000000000000000000000000000000000000008252915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c58031009034906110aa908d908890879033908c908f908f906004016128cb565b6000604051808303818588803b1580156110c357600080fd5b505af1935050505080156110d5575060015b611193573d808015611103576040519150601f19603f3d011682016040523d82523d6000602084013e611108565b606091505b508982888834604051602001611122959493929190612933565b60408051601f198184030181528282528051602091820120600087815260089092529190205561ffff8b169084907f6d16111647e03d7f1cb2b71c02eafe3355b97dfc17af3de1b94ef39c8a9ee4d9906111859086908c908c9034908990612976565b60405180910390a3506111d2565b8861ffff167f95a4fcf4eb9be6f5cf2eb6830782870f8907bccc513f765388a9cb2dae2f325983836040516111c99291906129c2565b60405180910390a25b505050505050505050565b6040517ff5ecbdbc00000000000000000000000000000000000000000000000000000000815261ffff808516600483015283166024820152306044820152606481018290526060907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063f5ecbdbc90608401600060405180830381865afa158015611283573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112ab9190810190612ab8565b90505b9392505050565b600960205260009081526040902080546112ce906127a8565b80601f01602080910402602001604051908101604052809291908181526020018280546112fa906127a8565b80156113475780601f1061131c57610100808354040283529160200191611347565b820191906000526020600020905b81548152906001019060200180831161132a57829003601f168201915b505050505081565b61138d6040518060400160405280600781526020017f7061757365282900000000000000000000000000000000000000000000000000815250611b75565b610d57611f3c565b6113b660405180606001604052806025815260200161321560259139611b75565b8261ffff166000036114305760405162461bcd60e51b815260206004820152603160248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20636861696e496460448201527f206d757374206e6f74206265207a65726f0000000000000000000000000000006064820152608401610924565b61144561143d8284612af5565b60601c611cc1565b601481146114bb5760405162461bcd60e51b815260206004820152603d60248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a2072656d6f74652060448201527f61646472657373206d757374206265203230206279746573206c6f6e670000006064820152608401610924565b61ffff8316600090815260096020526040812080546114d9906127a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611505906127a8565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b5050505050905082823060405160200161156e93929190612b3d565b60408051601f1981840301815291815261ffff86166000908152600960205220906115999082612bc3565b5061ffff84166000818152600960205260409081902090517fe84e609c32d71c678382f7c65cc051810a41dcaf660e55c9f8fcffeba4621a32916115df91859190612cbf565b60405180910390a250505050565b61160e60405180606001604052806026815260200161323a60269139611b75565b6040517fcbed8b9c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c906116889088908890889088908890600401612d78565b600060405180830381600087803b1580156116a257600080fd5b505af11580156111d2573d6000803e3d6000fd5b6116be611de4565b6116c6611d0e565b6116e760405180606001604052806038815260200161326060389139611b75565b61ffff871660009081526009602052604081208054611705906127a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611731906127a8565b801561177e5780601f106117535761010080835404028352916020019161177e565b820191906000526020600020905b81548152906001019060200180831161176157829003601f168201915b5050505050905080516000036118225760405162461bcd60e51b815260206004820152604260248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a2064657374696e6160448201527f74696f6e20636861696e206973206e6f742061207472757374656420736f757260648201527f6365000000000000000000000000000000000000000000000000000000000000608482015260a401610924565b600089815260086020526040902054806118a45760405162461bcd60e51b815260206004820152602a60248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a206e6f2073746f7260448201527f6564207061796c6f6164000000000000000000000000000000000000000000006064820152608401610924565b600087900361191b5760405162461bcd60e51b815260206004820152602660248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20656d707479207060448201527f61796c6f616400000000000000000000000000000000000000000000000000006064820152608401610924565b6000611929888a018a612db1565b5090506119368a82611e4f565b818a8a8a8a8a89604051602001611952969594939291906127fb565b60405160208183030381529060405280519060200120146119db5760405162461bcd60e51b815260206004820152603160248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a20696e76616c696460448201527f20657865637574696f6e20706172616d730000000000000000000000000000006064820152608401610924565b60008b81526008602052604080822091909155518b907f2dc7ac5d08fd553243fc66b5f15262e3f3013e27abf660d7bb3fccf133322f6e90611a209085815260200190565b60405180910390a273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c5803100611a6e3487612e2e565b8c868d8d338c8f8f6040518a63ffffffff1660e01b8152600401611a99989796959493929190612e47565b6000604051808303818588803b158015611ab257600080fd5b505af1158015611ac6573d6000803e3d6000fd5b5050505050505050610d076001600055565b611ae0611c5a565b73ffffffffffffffffffffffffffffffffffffffff8116611b695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610924565b611b7281611fab565b50565b6002546040517f18c5e8ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906318c5e8ab90611bcd9033908590600401612ebf565b602060405180830381865afa158015611bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0e9190612eee565b611b725760405162461bcd60e51b815260206004820152600d60248201527f6163636573732064656e696564000000000000000000000000000000000000006044820152606401610924565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d575760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610924565b73ffffffffffffffffffffffffffffffffffffffff8116611b72576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260005403611d605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610924565b6002600055565b611d6f612022565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60015474010000000000000000000000000000000000000000900460ff1615610d575760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610924565b60008060008084806020019051810190611e6991906130bf565b50935093509350935082518451148015611e84575081518451145b8015611e91575080518451145b611f295760405162461bcd60e51b815260206004820152604560248201527f4f6d6e69636861696e50726f706f73616c53656e6465723a2070726f706f736160448201527f6c2066756e6374696f6e20696e666f726d6174696f6e206172697479206d697360648201527f6d61746368000000000000000000000000000000000000000000000000000000608482015260a401610924565b611f3486855161208c565b505050505050565b611f44611de4565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611dba3390565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60015474010000000000000000000000000000000000000000900460ff16610d575760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610924565b61ffff8216600090815260056020908152604080832054600483528184205460038452828520546006909452919093205442939290620151806120cf85876131de565b11156120f35761ffff87166000908152600560205260409020859055859250612100565b6120fd8684612e2e565b92505b818311156121505760405162461bcd60e51b815260206004820181905260248201527f4461696c79205472616e73616374696f6e204c696d69742045786365656465646044820152606401610924565b84810361219f5760405162461bcd60e51b815260206004820152601f60248201527f4d756c7469706c65206272696467696e6720696e20612070726f706f73616c006044820152606401610924565b505061ffff9094166000908152600460209081526040808320969096556006905293909320555050565b5080546121d5906127a8565b6000825580601f106121e5575050565b601f016020900490600052602060002090810190611b7291905b8082111561221357600081556001016121ff565b5090565b803561ffff8116811461222957600080fd5b919050565b60006020828403121561224057600080fd5b6112ae82612217565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7257600080fd5b60006020828403121561227d57600080fd5b81356112ae81612249565b60008083601f84011261229a57600080fd5b50813567ffffffffffffffff8111156122b257600080fd5b6020830191508360208285010111156122ca57600080fd5b9250929050565b8015158114611b7257600080fd5b600080600080600080608087890312156122f857600080fd5b61230187612217565b9550602087013567ffffffffffffffff8082111561231e57600080fd5b61232a8a838b01612288565b90975095506040890135915061233f826122d1565b9093506060880135908082111561235557600080fd5b5061236289828a01612288565b979a9699509497509295939492505050565b6000806040838503121561238757600080fd5b61239083612217565b946020939093013593505050565b60008060008060008060008060c0898b0312156123ba57600080fd5b88356123c581612249565b9750602089013596506123da60408a01612217565b9550606089013567ffffffffffffffff808211156123f757600080fd5b6124038c838d01612288565b909750955060808b013591508082111561241c57600080fd5b506124298b828c01612288565b999c989b50969995989497949560a00135949350505050565b6000806000806000806080878903121561245b57600080fd5b61246487612217565b9550602087013567ffffffffffffffff8082111561248157600080fd5b61248d8a838b01612288565b909750955060408901359150808211156124a657600080fd5b506124b389828a01612288565b90945092505060608701356124c781612249565b809150509295509295509295565b6000806000606084860312156124ea57600080fd5b6124f384612217565b925061250160208501612217565b9150604084013590509250925092565b60005b8381101561252c578181015183820152602001612514565b50506000910152565b6000815180845261254d816020860160208601612511565b601f01601f19169290920160200192915050565b6020815260006112ae6020830184612535565b60006020828403121561258657600080fd5b5035919050565b6000806000604084860312156125a257600080fd5b6125ab84612217565b9250602084013567ffffffffffffffff8111156125c757600080fd5b6125d386828701612288565b9497909650939450505050565b6000806000806000608086880312156125f857600080fd5b61260186612217565b945061260f60208701612217565b935060408601359250606086013567ffffffffffffffff81111561263257600080fd5b61263e88828901612288565b969995985093965092949392505050565b60008060008060008060008060c0898b03121561266b57600080fd5b8835975061267b60208a01612217565b9650604089013567ffffffffffffffff8082111561269857600080fd5b6126a48c838d01612288565b909850965060608b01359150808211156126bd57600080fd5b506126ca8b828c01612288565b90955093505060808901356126de81612249565b8092505060a089013590509295985092959890939650565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b61ffff8816815273ffffffffffffffffffffffffffffffffffffffff8716602082015260a06040820152600061275b60a0830187896126f6565b851515606084015282810360808401526127768185876126f6565b9a9950505050505050505050565b6000806040838503121561279757600080fd5b505080516020909101519092909150565b600181811c908216806127bc57607f821691505b6020821081036127f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b61ffff871681526080602082015260006128196080830187896126f6565b828103604084015261282c8186886126f6565b915050826060830152979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128a0576128a0612840565b5060010190565b6040815260006128bb6040830185876126f6565b9050826020830152949350505050565b61ffff8816815260c0602082015260006128e860c0830189612535565b82810360408401526128fa8189612535565b73ffffffffffffffffffffffffffffffffffffffff88811660608601528716608085015283810360a085015290506127768185876126f6565b61ffff861681526080602082015260006129506080830187612535565b82810360408401526129638186886126f6565b9150508260608301529695505050505050565b6080815260006129896080830188612535565b828103602084015261299c8187896126f6565b905084604084015282810360608401526129b68185612535565b98975050505050505050565b8281526040602082015260006112ab6040830184612535565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612a3357612a336129db565b604052919050565b600067ffffffffffffffff821115612a5557612a556129db565b50601f01601f191660200190565b6000612a76612a7184612a3b565b612a0a565b9050828152838383011115612a8a57600080fd5b6112ae836020830184612511565b600082601f830112612aa957600080fd5b6112ae83835160208501612a63565b600060208284031215612aca57600080fd5b815167ffffffffffffffff811115612ae157600080fd5b612aed84828501612a98565b949350505050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008135818116916014851015612b355780818660140360031b1b83161692505b505092915050565b8284823760609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169101908152601401919050565b601f821115612bbe576000816000526020600020601f850160051c81016020861015612b9f5750805b601f850160051c820191505b81811015611f3457828155600101612bab565b505050565b815167ffffffffffffffff811115612bdd57612bdd6129db565b612bf181612beb84546127a8565b84612b76565b602080601f831160018114612c445760008415612c0e5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611f34565b600085815260208120601f198616915b82811015612c7357888601518255948401946001909101908401612c54565b5085821015612caf57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b604081526000612cd26040830185612535565b60208382038185015260008554612ce8816127a8565b80855260018281168015612d035760018114612d3b57612d69565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416868801528583151560051b8801019450612d69565b896000528560002060005b84811015612d61578154898201890152908301908701612d46565b880187019550505b50929998505050505050505050565b600061ffff808816835280871660208401525084604083015260806060830152612da66080830184866126f6565b979650505050505050565b60008060408385031215612dc457600080fd5b823567ffffffffffffffff811115612ddb57600080fd5b8301601f81018513612dec57600080fd5b8035612dfa612a7182612a3b565b818152866020838501011115612e0f57600080fd5b8160208401602083013760006020928201830152969401359450505050565b80820180821115612e4157612e41612840565b92915050565b61ffff8916815260c060208201526000612e6460c083018a612535565b8281036040840152612e7781898b6126f6565b73ffffffffffffffffffffffffffffffffffffffff88811660608601528716608085015283810360a08501529050612eb08185876126f6565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260006112ab6040830184612535565b600060208284031215612f0057600080fd5b81516112ae816122d1565b600067ffffffffffffffff821115612f2557612f256129db565b5060051b60200190565b600082601f830112612f4057600080fd5b81516020612f50612a7183612f0b565b8083825260208201915060208460051b870101935086841115612f7257600080fd5b602086015b84811015612f8e5780518352918301918301612f77565b509695505050505050565b600082601f830112612faa57600080fd5b81516020612fba612a7183612f0b565b82815260059290921b84018101918181019086841115612fd957600080fd5b8286015b84811015612f8e57805167ffffffffffffffff811115612ffd5760008081fd5b8701603f8101891361300f5760008081fd5b613020898683015160408401612a63565b845250918301918301612fdd565b600082601f83011261303f57600080fd5b8151602061304f612a7183612f0b565b82815260059290921b8401810191818101908684111561306e57600080fd5b8286015b84811015612f8e57805167ffffffffffffffff8111156130925760008081fd5b6130a08986838b0101612a98565b845250918301918301613072565b805160ff8116811461222957600080fd5b600080600080600060a086880312156130d757600080fd5b855167ffffffffffffffff808211156130ef57600080fd5b818801915088601f83011261310357600080fd5b81516020613113612a7183612f0b565b82815260059290921b8401810191818101908c84111561313257600080fd5b948201945b8386101561315957855161314a81612249565b82529482019490820190613137565b918b015191995090935050508082111561317257600080fd5b61317e89838a01612f2f565b9550604088015191508082111561319457600080fd5b6131a089838a01612f99565b945060608801519150808211156131b657600080fd5b506131c38882890161302e565b9250506131d2608087016130ae565b90509295509295909350565b81810381811115612e4157612e4161284056fe657865637574652875696e7431362c62797465732c62797465732c61646472657373297365745472757374656452656d6f7465416464726573732875696e7431362c627974657329736574436f6e6669672875696e7431362c75696e7431362c75696e743235362c6279746573297265747279457865637574652875696e743235362c75696e7431362c62797465732c62797465732c616464726573732c75696e7432353629a26469706673582212207640aa01bf0fe0091e9a77ed4591e13da364297a13e8537adede0f95d517267664736f6c63430008190033",
  "devdoc": {
    "author": "Venus",
    "custom:security-contact": "https://github.com/VenusProtocol/governance-contracts#discussion",
    "events": {
      "Paused(address)": {
        "details": "Emitted when the pause is triggered by `account`."
      },
      "Unpaused(address)": {
        "details": "Emitted when the pause is lifted by `account`."
      }
    },
    "kind": "dev",
    "methods": {
      "estimateFees(uint16,bytes,bool,bytes)": {
        "details": "The estimated fees are the minimum required; it's recommended to increase the fees amount when sending a message. The unused amount will be refunded",
        "params": {
          "adapterParams_": "The params used to specify the custom amount of gas required for the execution on the destination",
          "payload_": "The payload to be sent to the remote chain. It's computed as follows: payload = abi.encode(abi.encode(targets, values, signatures, calldatas, proposalType), pId)",
          "remoteChainId_": "The LayerZero id of a remote chain",
          "useZro_": "Bool that indicates whether to pay in ZRO tokens or not"
        },
        "returns": {
          "_0": "nativeFee The amount of fee in the native gas token (e.g. ETH)",
          "_1": "zroFee The amount of fee in ZRO token"
        }
      },
      "execute(uint16,bytes,bytes,address)": {
        "custom:access": "Controlled by Access Control Manager",
        "custom:event": "Emits ExecuteRemoteProposal with remote chain id, proposal ID and payload on successEmits StorePayload with last stored payload proposal ID ,remote chain id , payload, adapter params , values and reason for failure",
        "details": "Stores the hash of the execution parameters if sending fails (e.g., due to insufficient fees)",
        "params": {
          "adapterParams_": "The params used to specify the custom amount of gas required for the execution on the destination",
          "payload_": "The payload to be sent to the remote chain It's computed as follows: payload = abi.encode(targets, values, signatures, calldatas, proposalType)",
          "remoteChainId_": "The LayerZero id of the remote chain",
          "zroPaymentAddress_": "The address of the ZRO token holder who would pay for the transaction. This must be either address(this) or tx.origin"
        }
      },
      "fallbackWithdraw(address,uint256,uint16,bytes,bytes,uint256)": {
        "custom:access": "Only owner",
        "custom:event": "Emits ClearPayload with proposal ID and hashEmits FallbackWithdraw with receiver and amount",
        "params": {
          "adapterParams_": "The params used to specify the custom amount of gas required for the execution on the destination",
          "originalValue_": "The msg.value passed when execute() function was called",
          "pId_": "The proposal ID to identify a failed message",
          "payload_": "The payload to be sent to the remote chain It's computed as follows: payload = abi.encode(abi.encode(targets, values, signatures, calldatas, proposalType), pId)",
          "remoteChainId_": "The LayerZero id of the remote chain",
          "to_": "Address of the receiver"
        }
      },
      "getConfig(uint16,uint16,uint256)": {
        "params": {
          "chainId_": "The LayerZero chainId",
          "configType_": "Type of configuration. Every messaging library has its own convention",
          "version_": "Messaging library version"
        }
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "pause()": {
        "custom:access": "Controlled by AccessControlManager"
      },
      "paused()": {
        "details": "Returns true if the contract is paused, and false otherwise."
      },
      "removeTrustedRemote(uint16)": {
        "custom:access": "Controlled by Access Control Manager",
        "custom:event": "Emit TrustedRemoteRemoved with remote chain id",
        "params": {
          "remoteChainId_": "The chain's id corresponds to setting the trusted remote to empty"
        }
      },
      "retryExecute(uint256,uint16,bytes,bytes,address,uint256)": {
        "custom:access": "Controlled by Access Control Manager",
        "custom:event": "Emits ClearPayload with proposal ID and hash",
        "details": "Allows providing more fees if needed. The extra fees will be refunded to the caller",
        "params": {
          "adapterParams_": "The params used to specify the custom amount of gas required for the execution on the destination",
          "originalValue_": "The msg.value passed when execute() function was called",
          "pId_": "The proposal ID to identify a failed message",
          "payload_": "The payload to be sent to the remote chain It's computed as follows: payload = abi.encode(abi.encode(targets, values, signatures, calldatas, proposalType), pId)",
          "remoteChainId_": "The LayerZero id of the remote chain",
          "zroPaymentAddress_": "The address of the ZRO token holder who would pay for the transaction."
        }
      },
      "setAccessControlManager(address)": {
        "custom:access": "Only owner",
        "custom:event": "Emits NewAccessControlManager with old and new access control manager addresses",
        "params": {
          "accessControlManager_": "The new address of the Access Control Manager"
        }
      },
      "setConfig(uint16,uint16,uint256,bytes)": {
        "custom:access": "Controlled by AccessControlManager",
        "params": {
          "chainId_": "The LayerZero chainId for the pending config change",
          "configType_": "The type of configuration. Every messaging library has its own convention",
          "config_": "The configuration in bytes. It can encode arbitrary content",
          "version_": "Messaging library version"
        }
      },
      "setMaxDailyLimit(uint16,uint256)": {
        "custom:access": "Controlled by AccessControlManager",
        "custom:event": "Emits SetMaxDailyLimit with old and new limit and its corresponding chain id",
        "params": {
          "chainId_": "Destination chain id",
          "limit_": "Number of commands"
        }
      },
      "setSendVersion(uint16)": {
        "custom:access": "Controlled by AccessControlManager",
        "params": {
          "version_": "New messaging library version"
        }
      },
      "setTrustedRemoteAddress(uint16,bytes)": {
        "custom:access": "Controlled by AccessControlManager",
        "custom:event": "Emits SetTrustedRemoteAddress with remote chain Id and remote address",
        "params": {
          "newRemoteAddress_": "The address of the contract on the remote chain to receive messages sent by this contract",
          "remoteChainId_": "The LayerZero id of a remote chain"
        }
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      },
      "unpause()": {
        "custom:access": "Controlled by AccessControlManager"
      }
    },
    "stateVariables": {
      "storedExecutionHashes": {
        "details": "[proposalId] -> [executionHash]"
      }
    },
    "title": "OmnichainProposalSender",
    "version": 1
  },
  "userdoc": {
    "errors": {
      "ZeroAddressNotAllowed()": [
        {
          "notice": "Thrown if the supplied address is a zero address where it is not allowed"
        }
      ]
    },
    "events": {
      "ClearPayload(uint256,bytes32)": {
        "notice": "Emitted when a previously failed message is successfully sent to the remote chain"
      },
      "ExecuteRemoteProposal(uint16,uint256,bytes)": {
        "notice": "Emitted when a proposal execution request is sent to the remote chain"
      },
      "FallbackWithdraw(address,uint256)": {
        "notice": "Emitted while fallback withdraw"
      },
      "SetMaxDailyLimit(uint16,uint256,uint256)": {
        "notice": "Emitted when the maximum daily limit of commands from the local chain is modified"
      },
      "SetTrustedRemoteAddress(uint16,bytes,bytes)": {
        "notice": "Emitted when a remote message receiver is set for the remote chain"
      },
      "StorePayload(uint256,uint16,bytes,bytes,uint256,bytes)": {
        "notice": "Emitted when an execution hash of a failed message is saved"
      },
      "TrustedRemoteRemoved(uint16)": {
        "notice": "Event emitted when trusted remote sets to empty"
      }
    },
    "kind": "user",
    "methods": {
      "LZ_ENDPOINT()": {
        "notice": "LayerZero endpoint for sending messages to remote chains"
      },
      "accessControlManager()": {
        "notice": "ACM (Access Control Manager) contract address"
      },
      "chainIdToLast24HourCommandsSent(uint16)": {
        "notice": "Total commands transferred within the last 24-hour window from the local chain"
      },
      "chainIdToLast24HourWindowStart(uint16)": {
        "notice": "Timestamp when the last 24-hour window started from the local chain"
      },
      "chainIdToLastProposalSentTimestamp(uint16)": {
        "notice": "Timestamp when the last proposal sent from the local chain to dest chain"
      },
      "chainIdToMaxDailyLimit(uint16)": {
        "notice": "Maximum daily limit for commands from the local chain"
      },
      "estimateFees(uint16,bytes,bool,bytes)": {
        "notice": "Estimates LayerZero fees for cross-chain message delivery to the remote chain"
      },
      "execute(uint16,bytes,bytes,address)": {
        "notice": "Sends a message to execute a remote proposal"
      },
      "fallbackWithdraw(address,uint256,uint16,bytes,bytes,uint256)": {
        "notice": "Clear previously failed message"
      },
      "getConfig(uint16,uint16,uint256)": {
        "notice": "Gets the configuration of the LayerZero messaging library of the specified version"
      },
      "pause()": {
        "notice": "Triggers the paused state of the controller"
      },
      "proposalCount()": {
        "notice": "Stores the total number of remote proposals"
      },
      "removeTrustedRemote(uint16)": {
        "notice": "Remove trusted remote from storage"
      },
      "renounceOwnership()": {
        "notice": "Empty implementation of renounce ownership to avoid any mishap"
      },
      "retryExecute(uint256,uint16,bytes,bytes,address,uint256)": {
        "notice": "Resends a previously failed message"
      },
      "setAccessControlManager(address)": {
        "notice": "Sets the address of Access Control Manager (ACM)"
      },
      "setConfig(uint16,uint16,uint256,bytes)": {
        "notice": "Sets the configuration of the LayerZero messaging library of the specified version"
      },
      "setMaxDailyLimit(uint16,uint256)": {
        "notice": "Sets the limit of daily (24 Hour) command amount"
      },
      "setSendVersion(uint16)": {
        "notice": "Sets the configuration of the LayerZero messaging library of the specified version"
      },
      "setTrustedRemoteAddress(uint16,bytes)": {
        "notice": "Sets the remote message receiver address"
      },
      "storedExecutionHashes(uint256)": {
        "notice": "Execution hashes of failed messages"
      },
      "trustedRemoteLookup(uint16)": {
        "notice": "Specifies the allowed path for sending messages (remote chainId => remote app address + local app address)"
      },
      "unpause()": {
        "notice": "Triggers the resume state of the controller"
      }
    },
    "notice": "OmnichainProposalSender contract builds upon the functionality of its parent contract , BaseOmnichainControllerSrc It sends a proposal's data to remote chains for execution after the proposal passes on the main chain when used with GovernorBravo, the owner of this contract must be set to the Timelock contract",
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 3983,
        "contract": "contracts/Cross-chain/OmnichainProposalSender.sol:OmnichainProposalSender",
        "label": "_status",
        "offset": 0,
        "slot": "0",
        "type": "t_uint256"
      },
      {
        "astId": 3759,
        "contract": "contracts/Cross-chain/OmnichainProposalSender.sol:OmnichainProposalSender",
        "label": "_owner",
        "offset": 0,
        "slot": "1",
        "type": "t_address"
      },
      {
        "astId": 3882,
        "contract": "contracts/Cross-chain/OmnichainProposalSender.sol:OmnichainProposalSender",
        "label": "_paused",
        "offset": 20,
        "slot": "1",
        "type": "t_bool"
      },
      {
        "astId": 4241,
        "contract": "contracts/Cross-chain/OmnichainProposalSender.sol:OmnichainProposalSender",
        "label": "accessControlManager",
        "offset": 0,
        "slot": "2",
        "type": "t_address"
      },
      {
        "astId": 4246,
        "contract": "contracts/Cross-chain/OmnichainProposalSender.sol:OmnichainProposalSender",
        "label": "chainIdToMaxDailyLimit",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_uint16,t_uint256)"
      },
      {
        "astId": 4251,
        "contract": "contracts/Cross-chain/OmnichainProposalSender.sol:OmnichainProposalSender",
        "label": "chainIdToLast24HourCommandsSent",
        "offset": 0,
        "slot": "4",
        "type": "t_mapping(t_uint16,t_uint256)"
      },
      {
        "astId": 4256,
        "contract": "contracts/Cross-chain/OmnichainProposalSender.sol:OmnichainProposalSender",
        "label": "chainIdToLast24HourWindowStart",
        "offset": 0,
        "slot": "5",
        "type": "t_mapping(t_uint16,t_uint256)"
      },
      {
        "astId": 4261,
        "contract": "contracts/Cross-chain/OmnichainProposalSender.sol:OmnichainProposalSender",
        "label": "chainIdToLastProposalSentTimestamp",
        "offset": 0,
        "slot": "6",
        "type": "t_mapping(t_uint16,t_uint256)"
      },
      {
        "astId": 5818,
        "contract": "contracts/Cross-chain/OmnichainProposalSender.sol:OmnichainProposalSender",
        "label": "proposalCount",
        "offset": 0,
        "slot": "7",
        "type": "t_uint256"
      },
      {
        "astId": 5823,
        "contract": "contracts/Cross-chain/OmnichainProposalSender.sol:OmnichainProposalSender",
        "label": "storedExecutionHashes",
        "offset": 0,
        "slot": "8",
        "type": "t_mapping(t_uint256,t_bytes32)"
      },
      {
        "astId": 5832,
        "contract": "contracts/Cross-chain/OmnichainProposalSender.sol:OmnichainProposalSender",
        "label": "trustedRemoteLookup",
        "offset": 0,
        "slot": "9",
        "type": "t_mapping(t_uint16,t_bytes_storage)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_bytes_storage": {
        "encoding": "bytes",
        "label": "bytes",
        "numberOfBytes": "32"
      },
      "t_mapping(t_uint16,t_bytes_storage)": {
        "encoding": "mapping",
        "key": "t_uint16",
        "label": "mapping(uint16 => bytes)",
        "numberOfBytes": "32",
        "value": "t_bytes_storage"
      },
      "t_mapping(t_uint16,t_uint256)": {
        "encoding": "mapping",
        "key": "t_uint16",
        "label": "mapping(uint16 => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_uint256,t_bytes32)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => bytes32)",
        "numberOfBytes": "32",
        "value": "t_bytes32"
      },
      "t_uint16": {
        "encoding": "inplace",
        "label": "uint16",
        "numberOfBytes": "2"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}
