{
  "address": "0x225D2c0cf62d46f7FA69a8E8fdD379304C5500fF",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "endpoint_",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "layerZeroEid_",
          "type": "uint32"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "ConfigNotActive",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ConfigStatusUnchanged",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ExecutorStatusUnchanged",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidDebounce",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidDelegate",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidEndpointCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidLayerZeroEid",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidRemoteDelay",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidUpdateType",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        }
      ],
      "name": "NoPeer",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotAnExecutor",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "addr",
          "type": "address"
        }
      ],
      "name": "OnlyEndpoint",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "sender",
          "type": "bytes32"
        }
      ],
      "name": "OnlyPeer",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "RemoteDelayUnchanged",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "RenounceOwnershipNotAllowed",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "calledContract",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "methodSignature",
          "type": "string"
        }
      ],
      "name": "Unauthorized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnsupportedUpdateType",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UpdateIsExpired",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UpdateNotFound",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UpdateNotUnlocked",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UpdateTooFrequent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddressNotAllowed",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "updateTypeHash",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "updateType",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "previousActive",
          "type": "bool"
        },
        {
          "indexed": true,
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        }
      ],
      "name": "ConfigActiveUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "updateId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "arrivalTime",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "string",
          "name": "updateType",
          "type": "string"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "market",
          "type": "address"
        }
      ],
      "name": "DuplicateUpdateReceived",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "executor",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "previousApproved",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "ExecutorStatusUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "oldAccessControlManager",
          "type": "address"
        },
        {
          "indexed": false,
          "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": "OwnershipTransferStarted",
      "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": "uint32",
          "name": "eid",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "peer",
          "type": "bytes32"
        }
      ],
      "name": "PeerSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "updateId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "arrivalTime",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "string",
          "name": "updateType",
          "type": "string"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "market",
          "type": "address"
        }
      ],
      "name": "RegisteredPendingUpdateExist",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "remoteDelay",
          "type": "uint256"
        }
      ],
      "name": "RemoteDelaySet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "updateId",
          "type": "uint256"
        }
      ],
      "name": "RemoteUpdateExecuted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "updateId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "arrivalTime",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "string",
          "name": "updateType",
          "type": "string"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "market",
          "type": "address"
        }
      ],
      "name": "RemoteUpdateRegistered",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "updateTypeHash",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "updateType",
          "type": "string"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousRiskSteward",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "riskSteward",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "previousDebounce",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "debounce",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "previousActive",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        }
      ],
      "name": "RiskParameterConfigUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "updateId",
          "type": "uint256"
        }
      ],
      "name": "UpdateRejected",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "LAYER_ZERO_EID",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "REMOTE_UPDATE_EXPIRATION_TIME",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "acceptOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "accessControlManager",
      "outputs": [
        {
          "internalType": "contract IAccessControlManagerV8",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "origin",
          "type": "tuple"
        }
      ],
      "name": "allowInitializePath",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "endpoint",
      "outputs": [
        {
          "internalType": "contract ILayerZeroEndpointV2",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "updateId",
          "type": "uint256"
        }
      ],
      "name": "executeUpdate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "updateType",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "comptroller",
          "type": "address"
        }
      ],
      "name": "getExecutableUpdates",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "executableUpdates",
          "type": "uint256[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "updateType",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "market",
          "type": "address"
        }
      ],
      "name": "getLastExecutedAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "updateType",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "market",
          "type": "address"
        }
      ],
      "name": "getRegisteredUpdate",
      "outputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "string",
                  "name": "referenceId",
                  "type": "string"
                },
                {
                  "internalType": "uint256",
                  "name": "updateId",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "market",
                  "type": "address"
                },
                {
                  "internalType": "string",
                  "name": "updateType",
                  "type": "string"
                },
                {
                  "internalType": "bytes32",
                  "name": "updateTypeKey",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes",
                  "name": "newValue",
                  "type": "bytes"
                },
                {
                  "internalType": "bytes",
                  "name": "previousValue",
                  "type": "bytes"
                },
                {
                  "internalType": "uint256",
                  "name": "timestamp",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "publisher",
                  "type": "address"
                },
                {
                  "internalType": "uint96",
                  "name": "poolId",
                  "type": "uint96"
                },
                {
                  "internalType": "uint32",
                  "name": "destLzEid",
                  "type": "uint32"
                },
                {
                  "internalType": "bytes",
                  "name": "additionalData",
                  "type": "bytes"
                }
              ],
              "internalType": "struct RiskParameterUpdate",
              "name": "update",
              "type": "tuple"
            },
            {
              "internalType": "enum IDestinationStewardReceiver.UpdateStatus",
              "name": "status",
              "type": "uint8"
            },
            {
              "internalType": "uint256",
              "name": "arrivalTime",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "executor",
              "type": "address"
            }
          ],
          "internalType": "struct IDestinationStewardReceiver.DestinationUpdate",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "updateType",
          "type": "string"
        }
      ],
      "name": "getRiskParameterConfig",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bool",
              "name": "active",
              "type": "bool"
            },
            {
              "internalType": "uint256",
              "name": "debounce",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "riskSteward",
              "type": "address"
            }
          ],
          "internalType": "struct IDestinationStewardReceiver.RiskParamConfig",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "accessControlManager_",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "delegate_",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "",
          "type": "tuple"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        }
      ],
      "name": "isComposeMsgSender",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "market",
          "type": "address"
        }
      ],
      "name": "lastExecutedAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "market",
          "type": "address"
        }
      ],
      "name": "lastRegisteredUpdateId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "_origin",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "_guid",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_executor",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "lzReceive",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "nextNonce",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "nonce",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oAppVersion",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "senderVersion",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "receiverVersion",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_eid",
          "type": "uint32"
        }
      ],
      "name": "peers",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pendingOwner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "updateId",
          "type": "uint256"
        }
      ],
      "name": "rejectUpdate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "remoteDelay",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "riskParameterConfigs",
      "outputs": [
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "debounce",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "riskSteward",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "accessControlManager_",
          "type": "address"
        }
      ],
      "name": "setAccessControlManager",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "updateType",
          "type": "string"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        }
      ],
      "name": "setConfigActive",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_delegate",
          "type": "address"
        }
      ],
      "name": "setDelegate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_eid",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_peer",
          "type": "bytes32"
        }
      ],
      "name": "setPeer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "newRemoteDelay",
          "type": "uint256"
        }
      ],
      "name": "setRemoteDelay",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "updateType",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "riskSteward",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "debounce",
          "type": "uint256"
        }
      ],
      "name": "setRiskParameterConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "executor",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "setWhitelistedExecutor",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "updateId",
          "type": "uint256"
        }
      ],
      "name": "updates",
      "outputs": [
        {
          "components": [
            {
              "internalType": "string",
              "name": "referenceId",
              "type": "string"
            },
            {
              "internalType": "uint256",
              "name": "updateId",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "market",
              "type": "address"
            },
            {
              "internalType": "string",
              "name": "updateType",
              "type": "string"
            },
            {
              "internalType": "bytes32",
              "name": "updateTypeKey",
              "type": "bytes32"
            },
            {
              "internalType": "bytes",
              "name": "newValue",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "previousValue",
              "type": "bytes"
            },
            {
              "internalType": "uint256",
              "name": "timestamp",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "publisher",
              "type": "address"
            },
            {
              "internalType": "uint96",
              "name": "poolId",
              "type": "uint96"
            },
            {
              "internalType": "uint32",
              "name": "destLzEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes",
              "name": "additionalData",
              "type": "bytes"
            }
          ],
          "internalType": "struct RiskParameterUpdate",
          "name": "update",
          "type": "tuple"
        },
        {
          "internalType": "enum IDestinationStewardReceiver.UpdateStatus",
          "name": "status",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "arrivalTime",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "executor",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "whitelistedExecutors",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0xc748f9950476bf95a04954dd075b3e3c8d06305feb26e87be46c90ee7b1af1f0",
  "receipt": {
    "to": null,
    "from": "0xe2a089cA69a90f1E27E723EFD339Cff4c4701AcC",
    "contractAddress": "0x225D2c0cf62d46f7FA69a8E8fdD379304C5500fF",
    "transactionIndex": 3,
    "gasUsed": "3581659",
    "logsBloom": "0x00040000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x74f1a4ef876605c5aa9babbdad7355b86b6923ba0bd11813e9bec78e59ef98b0",
    "transactionHash": "0xc748f9950476bf95a04954dd075b3e3c8d06305feb26e87be46c90ee7b1af1f0",
    "logs": [
      {
        "transactionIndex": 3,
        "blockNumber": 40850117,
        "transactionHash": "0xc748f9950476bf95a04954dd075b3e3c8d06305feb26e87be46c90ee7b1af1f0",
        "address": "0x225D2c0cf62d46f7FA69a8E8fdD379304C5500fF",
        "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"],
        "data": "0x00000000000000000000000000000000000000000000000000000000000000ff",
        "logIndex": 0,
        "blockHash": "0x74f1a4ef876605c5aa9babbdad7355b86b6923ba0bd11813e9bec78e59ef98b0"
      }
    ],
    "blockNumber": 40850117,
    "cumulativeGasUsed": "3671589",
    "status": 1,
    "byzantium": true
  },
  "args": ["0xb8815f3f882614048CbE201a67eF9c6F10fe5035", 40333],
  "numDeployments": 1,
  "solcInputHash": "d8ac8b2eca2ebdf37ab511aea56679b0",
  "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"endpoint_\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"layerZeroEid_\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ConfigNotActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigStatusUnchanged\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutorStatusUnchanged\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDebounce\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDelegate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidEndpointCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidLayerZeroEid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRemoteDelay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidUpdateType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"}],\"name\":\"NoPeer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAnExecutor\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"OnlyEndpoint\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"}],\"name\":\"OnlyPeer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RemoteDelayUnchanged\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RenounceOwnershipNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"calledContract\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"methodSignature\",\"type\":\"string\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedUpdateType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpdateIsExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpdateNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpdateNotUnlocked\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpdateTooFrequent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"updateTypeHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"previousActive\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"name\":\"ConfigActiveUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"updateId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"arrivalTime\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"market\",\"type\":\"address\"}],\"name\":\"DuplicateUpdateReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"executor\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"previousApproved\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ExecutorStatusUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldAccessControlManager\",\"type\":\"address\"},{\"indexed\":false,\"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\":\"OwnershipTransferStarted\",\"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\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"peer\",\"type\":\"bytes32\"}],\"name\":\"PeerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"updateId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"arrivalTime\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"market\",\"type\":\"address\"}],\"name\":\"RegisteredPendingUpdateExist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remoteDelay\",\"type\":\"uint256\"}],\"name\":\"RemoteDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"updateId\",\"type\":\"uint256\"}],\"name\":\"RemoteUpdateExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"updateId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"arrivalTime\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"market\",\"type\":\"address\"}],\"name\":\"RemoteUpdateRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"updateTypeHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousRiskSteward\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"riskSteward\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousDebounce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"debounce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"previousActive\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"name\":\"RiskParameterConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"updateId\",\"type\":\"uint256\"}],\"name\":\"UpdateRejected\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LAYER_ZERO_EID\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REMOTE_UPDATE_EXPIRATION_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessControlManager\",\"outputs\":[{\"internalType\":\"contract IAccessControlManagerV8\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"origin\",\"type\":\"tuple\"}],\"name\":\"allowInitializePath\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endpoint\",\"outputs\":[{\"internalType\":\"contract ILayerZeroEndpointV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"updateId\",\"type\":\"uint256\"}],\"name\":\"executeUpdate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"comptroller\",\"type\":\"address\"}],\"name\":\"getExecutableUpdates\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"executableUpdates\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"market\",\"type\":\"address\"}],\"name\":\"getLastExecutedAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"market\",\"type\":\"address\"}],\"name\":\"getRegisteredUpdate\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"referenceId\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"updateId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"market\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"updateTypeKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"newValue\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"previousValue\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"publisher\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"poolId\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"destLzEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"additionalData\",\"type\":\"bytes\"}],\"internalType\":\"struct RiskParameterUpdate\",\"name\":\"update\",\"type\":\"tuple\"},{\"internalType\":\"enum IDestinationStewardReceiver.UpdateStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"arrivalTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"executor\",\"type\":\"address\"}],\"internalType\":\"struct IDestinationStewardReceiver.DestinationUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"}],\"name\":\"getRiskParameterConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"debounce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"riskSteward\",\"type\":\"address\"}],\"internalType\":\"struct IDestinationStewardReceiver.RiskParamConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegate_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"}],\"name\":\"isComposeMsgSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"market\",\"type\":\"address\"}],\"name\":\"lastExecutedAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"market\",\"type\":\"address\"}],\"name\":\"lastRegisteredUpdateId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"_origin\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_guid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_executor\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"lzReceive\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"nextNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oAppVersion\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"senderVersion\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"receiverVersion\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_eid\",\"type\":\"uint32\"}],\"name\":\"peers\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"updateId\",\"type\":\"uint256\"}],\"name\":\"rejectUpdate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"riskParameterConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"debounce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"riskSteward\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"}],\"name\":\"setAccessControlManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"name\":\"setConfigActive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"}],\"name\":\"setDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_eid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"_peer\",\"type\":\"bytes32\"}],\"name\":\"setPeer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newRemoteDelay\",\"type\":\"uint256\"}],\"name\":\"setRemoteDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"riskSteward\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"debounce\",\"type\":\"uint256\"}],\"name\":\"setRiskParameterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"executor\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setWhitelistedExecutor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"updateId\",\"type\":\"uint256\"}],\"name\":\"updates\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"referenceId\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"updateId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"market\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"updateType\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"updateTypeKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"newValue\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"previousValue\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"publisher\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"poolId\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"destLzEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"additionalData\",\"type\":\"bytes\"}],\"internalType\":\"struct RiskParameterUpdate\",\"name\":\"update\",\"type\":\"tuple\"},{\"internalType\":\"enum IDestinationStewardReceiver.UpdateStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"arrivalTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"executor\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"whitelistedExecutors\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Venus\",\"custom:security-contact\":\"https://github.com/VenusProtocol/governance-contracts#discussion\",\"events\":{\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"allowInitializePath((uint32,bytes32,uint64))\":{\"details\":\"This indicates to the endpoint that the OApp has enabled msgs for this particular path to be received.This defaults to assuming if a peer has been set, its initialized. Can be overridden by the OApp if there is other logic to determine this.\",\"params\":{\"origin\":\"The origin information containing the source endpoint and sender address.\"},\"returns\":{\"_0\":\"Whether the path has been initialized.\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"params\":{\"endpoint_\":\"Local LayerZero endpoint on this chain\",\"layerZeroEid_\":\"LayerZero endpoint ID for this destination chain\"}},\"executeUpdate(uint256)\":{\"custom:access\":\"Only whitelisted executors can execute updates\",\"custom:error\":\"NotAnExecutor if the caller is not a whitelisted executorConfigNotActive if the configuration for the update type is not activeUpdateNotFound if the update is not pending for the given (updateType, market)UpdateNotUnlocked if the remote delay has not elapsedUpdateIsExpired if the bridged update has expired on the destinationUpdateTooFrequent if the debounce period has not passed since the last execution\",\"custom:event\":\"Emits RemoteUpdateExecuted with the executed update ID\",\"params\":{\"updateId\":\"The bridged update ID to execute\"}},\"getExecutableUpdates(string,address)\":{\"params\":{\"comptroller\":\"The address of the Isolated Pools Comptroller that manages the markets\",\"updateType\":\"The human\\u2011readable identifier of the update type to filter by\"},\"returns\":{\"executableUpdates\":\"Array of update IDs that are ready to be executed\"}},\"getLastExecutedAt(string,address)\":{\"params\":{\"market\":\"The address of the market\",\"updateType\":\"The human-readable identifier of the update type\"},\"returns\":{\"_0\":\"The last executed timestamp\"}},\"getRegisteredUpdate(string,address)\":{\"params\":{\"market\":\"The address of the market\",\"updateType\":\"The human-readable identifier of the update type\"},\"returns\":{\"_0\":\"The registered update\"}},\"getRiskParameterConfig(string)\":{\"params\":{\"updateType\":\"The human-readable identifier of the update type\"},\"returns\":{\"_0\":\"The risk parameter configuration\"}},\"initialize(address,address)\":{\"params\":{\"accessControlManager_\":\"The address of the access control manager\",\"delegate_\":\"The owner (and LayerZero delegate) of this contract\"}},\"isComposeMsgSender((uint32,bytes32,uint64),bytes,address)\":{\"details\":\"_origin The origin information containing the source endpoint and sender address.  - srcEid: The source chain endpoint ID.  - sender: The sender address on the src chain.  - nonce: The nonce of the message._message The lzReceive payload.Applications can optionally choose to implement separate composeMsg senders that are NOT the bridging layer.The default sender IS the OAppReceiver implementer.\",\"params\":{\"_sender\":\"The sender address.\"},\"returns\":{\"_0\":\"isSender Is a valid sender.\"}},\"lzReceive((uint32,bytes32,uint64),bytes32,bytes,address,bytes)\":{\"details\":\"Entry point for receiving messages or packets from the endpoint.Entry point for receiving msg/packet from the LayerZero endpoint.\",\"params\":{\"_executor\":\"The address of the executor for the received message.\",\"_extraData\":\"Additional arbitrary data provided by the corresponding executor.\",\"_guid\":\"The unique identifier for the received LayerZero message.\",\"_message\":\"The payload of the received message.\",\"_origin\":\"The origin information containing the source endpoint and sender address.  - srcEid: The source chain endpoint ID.  - sender: The sender address on the src chain.  - nonce: The nonce of the message.\"}},\"nextNonce(uint32,bytes32)\":{\"details\":\"_srcEid The source endpoint ID._sender The sender address.The path nonce starts from 1. If 0 is returned it means that there is NO nonce ordered enforcement.Is required by the off-chain executor to determine the OApp expects msg execution is ordered.This is also enforced by the OApp.By default this is NOT enabled. ie. nextNonce is hardcoded to return 0.\",\"returns\":{\"nonce\":\"The next nonce.\"}},\"oAppVersion()\":{\"details\":\"Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented. ie. this is a RECEIVE only OApp.If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions.\",\"returns\":{\"receiverVersion\":\"The version of the OAppReceiver.sol contract.\",\"senderVersion\":\"The version of the OAppSender.sol contract.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"peers(uint32)\":{\"params\":{\"_eid\":\"The endpoint ID.\"},\"returns\":{\"_0\":\"peer The address of the peer associated with the specified endpoint.\"}},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"rejectUpdate(uint256)\":{\"custom:access\":\"Only whitelisted executors can reject updates\",\"custom:error\":\"NotAnExecutor if the caller is not a whitelisted executorUpdateNotFound if there is no pending update with the given ID\",\"custom:event\":\"Emits UpdateRejected with the rejected update ID\",\"params\":{\"updateId\":\"The oracle update ID of the update to reject\"}},\"renounceOwnership()\":{\"custom:error\":\"Throws RenounceOwnershipNotAllowed\"},\"setAccessControlManager(address)\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"Emits NewAccessControlManager event\",\"details\":\"Admin function to set address of AccessControlManager\",\"params\":{\"accessControlManager_\":\"The new address of the AccessControlManager\"}},\"setConfigActive(string,bool)\":{\"custom:access\":\"Controlled by AccessControlManager\",\"custom:error\":\"Throws UnsupportedUpdateType if the update type is not supportedThrows ConfigStatusUnchanged if the active status is already set to the desired value\",\"custom:event\":\"Emits ConfigActiveUpdated with the update type hash, update type, previous active status, and the active status\",\"params\":{\"active\":\"The active status to set\",\"updateType\":\"The type of update to configure\"}},\"setDelegate(address)\":{\"details\":\"Only the owner/admin of the OApp can call this function.Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.\",\"params\":{\"_delegate\":\"The address of the delegate to be set.\"}},\"setPeer(uint32,bytes32)\":{\"details\":\"Only the owner/admin of the OApp can call this function.Indicates that the peer is trusted to send LayerZero messages to this OApp.Set this to bytes32(0) to remove the peer address.Peer is a bytes32 to accommodate non-evm chains.\",\"params\":{\"_eid\":\"The endpoint ID.\",\"_peer\":\"The address of the peer to be associated with the corresponding endpoint.\"}},\"setRemoteDelay(uint256)\":{\"custom:access\":\"Controlled by AccessControlManager\",\"custom:error\":\"InvalidRemoteDelay if the delay is 0 or greater than or equal to the remote update expiration timeRemoteDelayUnchanged if the new delay is equal to the current delay\",\"custom:event\":\"Emits RemoteDelaySet with the new remote delay value\",\"params\":{\"newRemoteDelay\":\"The new remote delay in seconds\"}},\"setRiskParameterConfig(string,address,uint256)\":{\"custom:access\":\"Controlled by AccessControlManager\",\"custom:error\":\"InvalidUpdateType if the update type string is emptyInvalidDebounce if the debounce is 0\",\"custom:event\":\"Emits RiskParameterConfigUpdated\",\"params\":{\"debounce\":\"The debounce period for updates of this type on the destination (anti\\u2011DoS)\",\"riskSteward\":\"The address for the risk steward contract responsible for processing the update\",\"updateType\":\"The type of update to configure (e.g., \\\"supplyCap\\\", \\\"borrowCap\\\")\"}},\"setWhitelistedExecutor(address,bool)\":{\"custom:access\":\"Controlled by AccessControlManager\",\"custom:error\":\"Throws ZeroAddressNotAllowed if the executor address is zeroThrows ExecutorStatusUnchanged if the executor whitelist status is already set to the desired value\",\"custom:event\":\"Emits ExecutorStatusUpdated with the executor address, previous approval status, and new approval status\",\"params\":{\"approved\":\"The whitelist status to set (true to whitelist, false to remove)\",\"executor\":\"The address of the executor\"}},\"transferOwnership(address)\":{\"details\":\"Overrides OwnableUpgradeable and Ownable2StepUpgradeable to resolve      the multiple inheritance ownership transfer conflict.\"}},\"stateVariables\":{\"__gap\":{\"details\":\"This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain. See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\"}},\"title\":\"DestinationStewardReceiver\",\"version\":1},\"userdoc\":{\"errors\":{\"ConfigNotActive()\":[{\"notice\":\"Thrown when config for an update type is not active or not configured\"}],\"ConfigStatusUnchanged()\":[{\"notice\":\"Thrown when trying to set the same config active status\"}],\"ExecutorStatusUnchanged()\":[{\"notice\":\"Thrown when trying to set the same executor whitelist status\"}],\"InvalidDebounce()\":[{\"notice\":\"Thrown when a debounce value of 0 is set\"}],\"InvalidLayerZeroEid()\":[{\"notice\":\"Thrown when an invalid LayerZero endpoint ID is provided\"}],\"InvalidRemoteDelay()\":[{\"notice\":\"Thrown when an invalid remote delay is provided\"}],\"InvalidUpdateType()\":[{\"notice\":\"Thrown when an empty update type string is provided\"}],\"NotAnExecutor()\":[{\"notice\":\"Thrown when an address is not a whitelisted executor\"}],\"RemoteDelayUnchanged()\":[{\"notice\":\"Thrown when trying to set the same remote delay value\"}],\"RenounceOwnershipNotAllowed()\":[{\"notice\":\"Thrown when trying to renounce ownership\"}],\"Unauthorized(address,address,string)\":[{\"notice\":\"Thrown when the action is prohibited by AccessControlManager\"}],\"UnsupportedUpdateType()\":[{\"notice\":\"Thrown when an update type is not supported\"}],\"UpdateIsExpired()\":[{\"notice\":\"Thrown when a bridged update has expired on the destination\"}],\"UpdateNotFound()\":[{\"notice\":\"Thrown when trying to operate on an update that was never registered\"}],\"UpdateNotUnlocked()\":[{\"notice\":\"Thrown when trying to execute an update before its unlock time\"}],\"UpdateTooFrequent()\":[{\"notice\":\"Thrown when the debounce period hasn't passed for applying an update to a specific market / update type\"}],\"ZeroAddressNotAllowed()\":[{\"notice\":\"Thrown if the supplied address is a zero address where it is not allowed\"}]},\"events\":{\"ConfigActiveUpdated(bytes32,string,bool,bool)\":{\"notice\":\"Emitted when a risk parameter config active status is updated\"},\"DuplicateUpdateReceived(uint256,uint256,string,address)\":{\"notice\":\"Emitted when a duplicate bridged update (same updateId) is received.\"},\"ExecutorStatusUpdated(address,bool,bool)\":{\"notice\":\"Emitted when an executor status is set on the destination\"},\"NewAccessControlManager(address,address)\":{\"notice\":\"Emitted when access control manager contract address is changed\"},\"RegisteredPendingUpdateExist(uint256,uint256,string,address)\":{\"notice\":\"Emitted when a new bridged update arrives but a pending update is already registered for the same (updateType, market).\"},\"RemoteDelaySet(uint256)\":{\"notice\":\"Emitted when the remote delay is set in the constructor\"},\"RemoteUpdateExecuted(uint256)\":{\"notice\":\"Emitted when a bridged update is executed on the destination\"},\"RemoteUpdateRegistered(uint256,uint256,string,address)\":{\"notice\":\"Emitted when a bridged update is registered on the destination\"},\"RiskParameterConfigUpdated(bytes32,string,address,address,uint256,uint256,bool,bool)\":{\"notice\":\"Emitted when a risk parameter config is updated for an update type\"},\"UpdateRejected(uint256)\":{\"notice\":\"Emitted when an update is rejected on the destination\"}},\"kind\":\"user\",\"methods\":{\"LAYER_ZERO_EID()\":{\"notice\":\"Destination chain LayerZero endpoint ID\"},\"REMOTE_UPDATE_EXPIRATION_TIME()\":{\"notice\":\"Time before a bridged update is considered stale on the destination chain\"},\"accessControlManager()\":{\"notice\":\"Returns the address of the access control manager contract\"},\"allowInitializePath((uint32,bytes32,uint64))\":{\"notice\":\"Checks if the path initialization is allowed based on the provided origin.\"},\"constructor\":{\"notice\":\"Disables initializers and sets immutable values.\"},\"endpoint()\":{\"notice\":\"Retrieves the LayerZero endpoint associated with the OApp.\"},\"executeUpdate(uint256)\":{\"notice\":\"Executes a bridged update after its remote delay has passed.\"},\"getExecutableUpdates(string,address)\":{\"notice\":\"Returns executable updates for a given update type and comptroller.\"},\"getLastExecutedAt(string,address)\":{\"notice\":\"Returns the last executed timestamp for a given update type and market\"},\"getRegisteredUpdate(string,address)\":{\"notice\":\"Returns the registered update for a given update type and market\"},\"getRiskParameterConfig(string)\":{\"notice\":\"Returns the risk parameter configuration for a given update type\"},\"initialize(address,address)\":{\"notice\":\"Initializes the contract with the Access Control Manager and owner.\"},\"isComposeMsgSender((uint32,bytes32,uint64),bytes,address)\":{\"notice\":\"Indicates whether an address is an approved composeMsg sender to the Endpoint.\"},\"lastExecutedAt(bytes32,address)\":{\"notice\":\"Track last executed update timestamp per (updateType, market)\"},\"lastRegisteredUpdateId(bytes32,address)\":{\"notice\":\"Mapping from (updateType, market) to currently registered remote update ID\"},\"nextNonce(uint32,bytes32)\":{\"notice\":\"Retrieves the next nonce for a given source endpoint and sender address.\"},\"oAppVersion()\":{\"notice\":\"Retrieves the OApp version information.\"},\"peers(uint32)\":{\"notice\":\"Returns the peer address (OApp instance) associated with a specific endpoint.\"},\"rejectUpdate(uint256)\":{\"notice\":\"Rejects a registered remote update on the destination chain.\"},\"remoteDelay()\":{\"notice\":\"Delay before a bridged update can be executed on the destination chain\"},\"renounceOwnership()\":{\"notice\":\"Disables renounceOwnership function\"},\"riskParameterConfigs(bytes32)\":{\"notice\":\"Mapping of supported risk configurations per update type (hashed updateType string)\"},\"setAccessControlManager(address)\":{\"notice\":\"Sets the address of AccessControlManager\"},\"setConfigActive(string,bool)\":{\"notice\":\"Sets the active status of a risk parameter config\"},\"setDelegate(address)\":{\"notice\":\"Sets the delegate address for the OApp.\"},\"setPeer(uint32,bytes32)\":{\"notice\":\"Sets the peer address (OApp instance) for a corresponding endpoint.\"},\"setRemoteDelay(uint256)\":{\"notice\":\"Sets the remote delay before bridged updates can be executed on the destination chain.\"},\"setRiskParameterConfig(string,address,uint256)\":{\"notice\":\"Sets the risk parameter config for a given update type on the destination chain.\"},\"setWhitelistedExecutor(address,bool)\":{\"notice\":\"Sets the whitelist status of an executor on the destination chain.\"},\"updates(uint256)\":{\"notice\":\"Master storage of all bridged updates by update ID\"},\"whitelistedExecutors(address)\":{\"notice\":\"Mapping from executor address to whitelist status\"}},\"notice\":\"Destination\\u2011chain contract that receives bridged updates from `RiskStewardReceiver` via LayerZero,         enforces a fixed remote delay, and then executes the updates on the configured `IRiskSteward` contracts.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/RiskSteward/DestinationStewardReceiver.sol\":\"DestinationStewardReceiver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\nimport { IMessageLibManager } from \\\"./IMessageLibManager.sol\\\";\\nimport { IMessagingComposer } from \\\"./IMessagingComposer.sol\\\";\\nimport { IMessagingChannel } from \\\"./IMessagingChannel.sol\\\";\\nimport { IMessagingContext } from \\\"./IMessagingContext.sol\\\";\\n\\nstruct MessagingParams {\\n    uint32 dstEid;\\n    bytes32 receiver;\\n    bytes message;\\n    bytes options;\\n    bool payInLzToken;\\n}\\n\\nstruct MessagingReceipt {\\n    bytes32 guid;\\n    uint64 nonce;\\n    MessagingFee fee;\\n}\\n\\nstruct MessagingFee {\\n    uint256 nativeFee;\\n    uint256 lzTokenFee;\\n}\\n\\nstruct Origin {\\n    uint32 srcEid;\\n    bytes32 sender;\\n    uint64 nonce;\\n}\\n\\ninterface ILayerZeroEndpointV2 is IMessageLibManager, IMessagingComposer, IMessagingChannel, IMessagingContext {\\n    event PacketSent(bytes encodedPayload, bytes options, address sendLibrary);\\n\\n    event PacketVerified(Origin origin, address receiver, bytes32 payloadHash);\\n\\n    event PacketDelivered(Origin origin, address receiver);\\n\\n    event LzReceiveAlert(\\n        address indexed receiver,\\n        address indexed executor,\\n        Origin origin,\\n        bytes32 guid,\\n        uint256 gas,\\n        uint256 value,\\n        bytes message,\\n        bytes extraData,\\n        bytes reason\\n    );\\n\\n    event LzTokenSet(address token);\\n\\n    event DelegateSet(address sender, address delegate);\\n\\n    function quote(MessagingParams calldata _params, address _sender) external view returns (MessagingFee memory);\\n\\n    function send(\\n        MessagingParams calldata _params,\\n        address _refundAddress\\n    ) external payable returns (MessagingReceipt memory);\\n\\n    function verify(Origin calldata _origin, address _receiver, bytes32 _payloadHash) external;\\n\\n    function verifiable(Origin calldata _origin, address _receiver) external view returns (bool);\\n\\n    function initializable(Origin calldata _origin, address _receiver) external view returns (bool);\\n\\n    function lzReceive(\\n        Origin calldata _origin,\\n        address _receiver,\\n        bytes32 _guid,\\n        bytes calldata _message,\\n        bytes calldata _extraData\\n    ) external payable;\\n\\n    // oapp can burn messages partially by calling this function with its own business logic if messages are verified in order\\n    function clear(address _oapp, Origin calldata _origin, bytes32 _guid, bytes calldata _message) external;\\n\\n    function setLzToken(address _lzToken) external;\\n\\n    function lzToken() external view returns (address);\\n\\n    function nativeToken() external view returns (address);\\n\\n    function setDelegate(address _delegate) external;\\n}\\n\",\"keccak256\":\"0xf7f941bee89ea6369950fe54e8ac476ae6478b958b20fc0e8a83e8ff1364eac3\",\"license\":\"MIT\"},\"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\nimport { Origin } from \\\"./ILayerZeroEndpointV2.sol\\\";\\n\\ninterface ILayerZeroReceiver {\\n    function allowInitializePath(Origin calldata _origin) external view returns (bool);\\n\\n    function nextNonce(uint32 _eid, bytes32 _sender) external view returns (uint64);\\n\\n    function lzReceive(\\n        Origin calldata _origin,\\n        bytes32 _guid,\\n        bytes calldata _message,\\n        address _executor,\\n        bytes calldata _extraData\\n    ) external payable;\\n}\\n\",\"keccak256\":\"0x9641abba8d53b08bb517d1b74801dd15ea7b84d77a6719085bd96c8ea94e3ca0\",\"license\":\"MIT\"},\"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\nstruct SetConfigParam {\\n    uint32 eid;\\n    uint32 configType;\\n    bytes config;\\n}\\n\\ninterface IMessageLibManager {\\n    struct Timeout {\\n        address lib;\\n        uint256 expiry;\\n    }\\n\\n    event LibraryRegistered(address newLib);\\n    event DefaultSendLibrarySet(uint32 eid, address newLib);\\n    event DefaultReceiveLibrarySet(uint32 eid, address newLib);\\n    event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);\\n    event SendLibrarySet(address sender, uint32 eid, address newLib);\\n    event ReceiveLibrarySet(address receiver, uint32 eid, address newLib);\\n    event ReceiveLibraryTimeoutSet(address receiver, uint32 eid, address oldLib, uint256 timeout);\\n\\n    function registerLibrary(address _lib) external;\\n\\n    function isRegisteredLibrary(address _lib) external view returns (bool);\\n\\n    function getRegisteredLibraries() external view returns (address[] memory);\\n\\n    function setDefaultSendLibrary(uint32 _eid, address _newLib) external;\\n\\n    function defaultSendLibrary(uint32 _eid) external view returns (address);\\n\\n    function setDefaultReceiveLibrary(uint32 _eid, address _newLib, uint256 _gracePeriod) external;\\n\\n    function defaultReceiveLibrary(uint32 _eid) external view returns (address);\\n\\n    function setDefaultReceiveLibraryTimeout(uint32 _eid, address _lib, uint256 _expiry) external;\\n\\n    function defaultReceiveLibraryTimeout(uint32 _eid) external view returns (address lib, uint256 expiry);\\n\\n    function isSupportedEid(uint32 _eid) external view returns (bool);\\n\\n    function isValidReceiveLibrary(address _receiver, uint32 _eid, address _lib) external view returns (bool);\\n\\n    /// ------------------- OApp interfaces -------------------\\n    function setSendLibrary(address _oapp, uint32 _eid, address _newLib) external;\\n\\n    function getSendLibrary(address _sender, uint32 _eid) external view returns (address lib);\\n\\n    function isDefaultSendLibrary(address _sender, uint32 _eid) external view returns (bool);\\n\\n    function setReceiveLibrary(address _oapp, uint32 _eid, address _newLib, uint256 _gracePeriod) external;\\n\\n    function getReceiveLibrary(address _receiver, uint32 _eid) external view returns (address lib, bool isDefault);\\n\\n    function setReceiveLibraryTimeout(address _oapp, uint32 _eid, address _lib, uint256 _expiry) external;\\n\\n    function receiveLibraryTimeout(address _receiver, uint32 _eid) external view returns (address lib, uint256 expiry);\\n\\n    function setConfig(address _oapp, address _lib, SetConfigParam[] calldata _params) external;\\n\\n    function getConfig(\\n        address _oapp,\\n        address _lib,\\n        uint32 _eid,\\n        uint32 _configType\\n    ) external view returns (bytes memory config);\\n}\\n\",\"keccak256\":\"0x919b37133adff4dc528e3061deb2789c3149971b530c61e556fb3d09ab315dfc\",\"license\":\"MIT\"},\"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessagingChannel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\ninterface IMessagingChannel {\\n    event InboundNonceSkipped(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce);\\n    event PacketNilified(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);\\n    event PacketBurnt(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);\\n\\n    function eid() external view returns (uint32);\\n\\n    // this is an emergency function if a message cannot be verified for some reasons\\n    // required to provide _nextNonce to avoid race condition\\n    function skip(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce) external;\\n\\n    function nilify(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;\\n\\n    function burn(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;\\n\\n    function nextGuid(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (bytes32);\\n\\n    function inboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);\\n\\n    function outboundNonce(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (uint64);\\n\\n    function inboundPayloadHash(\\n        address _receiver,\\n        uint32 _srcEid,\\n        bytes32 _sender,\\n        uint64 _nonce\\n    ) external view returns (bytes32);\\n\\n    function lazyInboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);\\n}\\n\",\"keccak256\":\"0x0878f64dffebf58c4165569416372f40860fab546b88cd926eba0d5cb6d8d972\",\"license\":\"MIT\"},\"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessagingComposer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\ninterface IMessagingComposer {\\n    event ComposeSent(address from, address to, bytes32 guid, uint16 index, bytes message);\\n    event ComposeDelivered(address from, address to, bytes32 guid, uint16 index);\\n    event LzComposeAlert(\\n        address indexed from,\\n        address indexed to,\\n        address indexed executor,\\n        bytes32 guid,\\n        uint16 index,\\n        uint256 gas,\\n        uint256 value,\\n        bytes message,\\n        bytes extraData,\\n        bytes reason\\n    );\\n\\n    function composeQueue(\\n        address _from,\\n        address _to,\\n        bytes32 _guid,\\n        uint16 _index\\n    ) external view returns (bytes32 messageHash);\\n\\n    function sendCompose(address _to, bytes32 _guid, uint16 _index, bytes calldata _message) external;\\n\\n    function lzCompose(\\n        address _from,\\n        address _to,\\n        bytes32 _guid,\\n        uint16 _index,\\n        bytes calldata _message,\\n        bytes calldata _extraData\\n    ) external payable;\\n}\\n\",\"keccak256\":\"0x85bc7090134529ec474866dc4bb1c48692d518c756eb0a961c82574829c51901\",\"license\":\"MIT\"},\"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessagingContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\ninterface IMessagingContext {\\n    function isSendingMessage() external view returns (bool);\\n\\n    function getSendContext() external view returns (uint32 dstEid, address sender);\\n}\\n\",\"keccak256\":\"0xff0c546c2813dae3e440882f46b377375f7461b0714efd80bd3f0c6e5cb8da4e\",\"license\":\"MIT\"},\"@layerzerolabs/oapp-evm-upgradeable/contracts/oapp/OAppCoreUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.20;\\n\\nimport { OwnableUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport { IOAppCore, ILayerZeroEndpointV2 } from \\\"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol\\\";\\n\\n/**\\n * @title OAppCore\\n * @dev Abstract contract implementing the IOAppCore interface with basic OApp configurations.\\n */\\nabstract contract OAppCoreUpgradeable is IOAppCore, OwnableUpgradeable {\\n    struct OAppCoreStorage {\\n        mapping(uint32 => bytes32) peers;\\n    }\\n\\n    // keccak256(abi.encode(uint256(keccak256(\\\"layerzerov2.storage.oappcore\\\")) - 1)) & ~bytes32(uint256(0xff))\\n    bytes32 private constant OAPP_CORE_STORAGE_LOCATION =\\n        0x72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f900;\\n\\n    function _getOAppCoreStorage() internal pure returns (OAppCoreStorage storage $) {\\n        assembly {\\n            $.slot := OAPP_CORE_STORAGE_LOCATION\\n        }\\n    }\\n\\n    // The LayerZero endpoint associated with the given OApp\\n    ILayerZeroEndpointV2 public immutable endpoint;\\n\\n    /**\\n     * @dev Constructor to initialize the OAppCore with the provided endpoint and delegate.\\n     * @param _endpoint The address of the LOCAL Layer Zero endpoint.\\n     */\\n    constructor(address _endpoint) {\\n        endpoint = ILayerZeroEndpointV2(_endpoint);\\n    }\\n\\n    /**\\n     * @dev Initializes the OAppCore with the provided delegate.\\n     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.\\n     *\\n     * @dev The delegate typically should be set as the owner of the contract.\\n     * @dev Ownable is not initialized here on purpose. It should be initialized in the child contract to\\n     * accommodate the different version of Ownable.\\n     */\\n    function __OAppCore_init(address _delegate) internal onlyInitializing {\\n        __OAppCore_init_unchained(_delegate);\\n    }\\n\\n    function __OAppCore_init_unchained(address _delegate) internal onlyInitializing {\\n        if (_delegate == address(0)) revert InvalidDelegate();\\n        endpoint.setDelegate(_delegate);\\n    }\\n\\n    /**\\n     * @notice Returns the peer address (OApp instance) associated with a specific endpoint.\\n     * @param _eid The endpoint ID.\\n     * @return peer The address of the peer associated with the specified endpoint.\\n     */\\n    function peers(uint32 _eid) public view override returns (bytes32) {\\n        OAppCoreStorage storage $ = _getOAppCoreStorage();\\n        return $.peers[_eid];\\n    }\\n\\n    /**\\n     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.\\n     * @param _eid The endpoint ID.\\n     * @param _peer The address of the peer to be associated with the corresponding endpoint.\\n     *\\n     * @dev Only the owner/admin of the OApp can call this function.\\n     * @dev Indicates that the peer is trusted to send LayerZero messages to this OApp.\\n     * @dev Set this to bytes32(0) to remove the peer address.\\n     * @dev Peer is a bytes32 to accommodate non-evm chains.\\n     */\\n    function setPeer(uint32 _eid, bytes32 _peer) public virtual onlyOwner {\\n        OAppCoreStorage storage $ = _getOAppCoreStorage();\\n        $.peers[_eid] = _peer;\\n        emit PeerSet(_eid, _peer);\\n    }\\n\\n    /**\\n     * @notice Internal function to get the peer address associated with a specific endpoint; reverts if NOT set.\\n     * ie. the peer is set to bytes32(0).\\n     * @param _eid The endpoint ID.\\n     * @return peer The address of the peer associated with the specified endpoint.\\n     */\\n    function _getPeerOrRevert(uint32 _eid) internal view virtual returns (bytes32) {\\n        OAppCoreStorage storage $ = _getOAppCoreStorage();\\n        bytes32 peer = $.peers[_eid];\\n        if (peer == bytes32(0)) revert NoPeer(_eid);\\n        return peer;\\n    }\\n\\n    /**\\n     * @notice Sets the delegate address for the OApp.\\n     * @param _delegate The address of the delegate to be set.\\n     *\\n     * @dev Only the owner/admin of the OApp can call this function.\\n     * @dev Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.\\n     */\\n    function setDelegate(address _delegate) public onlyOwner {\\n        endpoint.setDelegate(_delegate);\\n    }\\n}\\n\",\"keccak256\":\"0xbe135fd35bf12c97aeb701caeb6c5d0c1c28c1ac2ab1d4219d15f8384951c140\",\"license\":\"MIT\"},\"@layerzerolabs/oapp-evm-upgradeable/contracts/oapp/OAppReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.20;\\n\\nimport { IOAppReceiver, Origin } from \\\"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppReceiver.sol\\\";\\nimport { OAppCoreUpgradeable } from \\\"./OAppCoreUpgradeable.sol\\\";\\n\\n/**\\n * @title OAppReceiver\\n * @dev Abstract contract implementing the ILayerZeroReceiver interface and extending OAppCore for OApp receivers.\\n */\\nabstract contract OAppReceiverUpgradeable is IOAppReceiver, OAppCoreUpgradeable {\\n    // Custom error message for when the caller is not the registered endpoint/\\n    error OnlyEndpoint(address addr);\\n\\n    // @dev The version of the OAppReceiver implementation.\\n    // @dev Version is bumped when changes are made to this contract.\\n    uint64 internal constant RECEIVER_VERSION = 2;\\n\\n    /**\\n     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.\\n     * @dev Ownable is not initialized here on purpose. It should be initialized in the child contract to\\n     * accommodate the different version of Ownable.\\n     */\\n    function __OAppReceiver_init(address _delegate) internal onlyInitializing {\\n        __OAppCore_init(_delegate);\\n    }\\n\\n    function __OAppReceiver_init_unchained() internal onlyInitializing {}\\n\\n    /**\\n     * @notice Retrieves the OApp version information.\\n     * @return senderVersion The version of the OAppSender.sol contract.\\n     * @return receiverVersion The version of the OAppReceiver.sol contract.\\n     *\\n     * @dev Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented.\\n     * ie. this is a RECEIVE only OApp.\\n     * @dev If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions.\\n     */\\n    function oAppVersion() public view virtual returns (uint64 senderVersion, uint64 receiverVersion) {\\n        return (0, RECEIVER_VERSION);\\n    }\\n\\n    /**\\n     * @notice Indicates whether an address is an approved composeMsg sender to the Endpoint.\\n     * @dev _origin The origin information containing the source endpoint and sender address.\\n     *  - srcEid: The source chain endpoint ID.\\n     *  - sender: The sender address on the src chain.\\n     *  - nonce: The nonce of the message.\\n     * @dev _message The lzReceive payload.\\n     * @param _sender The sender address.\\n     * @return isSender Is a valid sender.\\n     *\\n     * @dev Applications can optionally choose to implement separate composeMsg senders that are NOT the bridging layer.\\n     * @dev The default sender IS the OAppReceiver implementer.\\n     */\\n    function isComposeMsgSender(\\n        Origin calldata /*_origin*/,\\n        bytes calldata /*_message*/,\\n        address _sender\\n    ) public view virtual returns (bool) {\\n        return _sender == address(this);\\n    }\\n\\n    /**\\n     * @notice Checks if the path initialization is allowed based on the provided origin.\\n     * @param origin The origin information containing the source endpoint and sender address.\\n     * @return Whether the path has been initialized.\\n     *\\n     * @dev This indicates to the endpoint that the OApp has enabled msgs for this particular path to be received.\\n     * @dev This defaults to assuming if a peer has been set, its initialized.\\n     * Can be overridden by the OApp if there is other logic to determine this.\\n     */\\n    function allowInitializePath(Origin calldata origin) public view virtual returns (bool) {\\n        return peers(origin.srcEid) == origin.sender;\\n    }\\n\\n    /**\\n     * @notice Retrieves the next nonce for a given source endpoint and sender address.\\n     * @dev _srcEid The source endpoint ID.\\n     * @dev _sender The sender address.\\n     * @return nonce The next nonce.\\n     *\\n     * @dev The path nonce starts from 1. If 0 is returned it means that there is NO nonce ordered enforcement.\\n     * @dev Is required by the off-chain executor to determine the OApp expects msg execution is ordered.\\n     * @dev This is also enforced by the OApp.\\n     * @dev By default this is NOT enabled. ie. nextNonce is hardcoded to return 0.\\n     */\\n    function nextNonce(uint32, /*_srcEid*/ bytes32 /*_sender*/) public view virtual returns (uint64 nonce) {\\n        return 0;\\n    }\\n\\n    /**\\n     * @dev Entry point for receiving messages or packets from the endpoint.\\n     * @param _origin The origin information containing the source endpoint and sender address.\\n     *  - srcEid: The source chain endpoint ID.\\n     *  - sender: The sender address on the src chain.\\n     *  - nonce: The nonce of the message.\\n     * @param _guid The unique identifier for the received LayerZero message.\\n     * @param _message The payload of the received message.\\n     * @param _executor The address of the executor for the received message.\\n     * @param _extraData Additional arbitrary data provided by the corresponding executor.\\n     *\\n     * @dev Entry point for receiving msg/packet from the LayerZero endpoint.\\n     */\\n    function lzReceive(\\n        Origin calldata _origin,\\n        bytes32 _guid,\\n        bytes calldata _message,\\n        address _executor,\\n        bytes calldata _extraData\\n    ) public payable virtual {\\n        // Ensures that only the endpoint can attempt to lzReceive() messages to this OApp.\\n        if (address(endpoint) != msg.sender) revert OnlyEndpoint(msg.sender);\\n\\n        // Ensure that the sender matches the expected peer for the source endpoint.\\n        if (_getPeerOrRevert(_origin.srcEid) != _origin.sender) revert OnlyPeer(_origin.srcEid, _origin.sender);\\n\\n        // Call the internal OApp implementation of lzReceive.\\n        _lzReceive(_origin, _guid, _message, _executor, _extraData);\\n    }\\n\\n    /**\\n     * @dev Internal function to implement lzReceive logic without needing to copy the basic parameter validation.\\n     */\\n    function _lzReceive(\\n        Origin calldata _origin,\\n        bytes32 _guid,\\n        bytes calldata _message,\\n        address _executor,\\n        bytes calldata _extraData\\n    ) internal virtual;\\n}\\n\",\"keccak256\":\"0xa38e5d26d044331212af7fc69dbbdebf25f527811bbd0492a4cee9ecdd3bd671\",\"license\":\"MIT\"},\"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.20;\\n\\nimport { ILayerZeroEndpointV2 } from \\\"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol\\\";\\n\\n/**\\n * @title IOAppCore\\n */\\ninterface IOAppCore {\\n    // Custom error messages\\n    error OnlyPeer(uint32 eid, bytes32 sender);\\n    error NoPeer(uint32 eid);\\n    error InvalidEndpointCall();\\n    error InvalidDelegate();\\n\\n    // Event emitted when a peer (OApp) is set for a corresponding endpoint\\n    event PeerSet(uint32 eid, bytes32 peer);\\n\\n    /**\\n     * @notice Retrieves the OApp version information.\\n     * @return senderVersion The version of the OAppSender.sol contract.\\n     * @return receiverVersion The version of the OAppReceiver.sol contract.\\n     */\\n    function oAppVersion() external view returns (uint64 senderVersion, uint64 receiverVersion);\\n\\n    /**\\n     * @notice Retrieves the LayerZero endpoint associated with the OApp.\\n     * @return iEndpoint The LayerZero endpoint as an interface.\\n     */\\n    function endpoint() external view returns (ILayerZeroEndpointV2 iEndpoint);\\n\\n    /**\\n     * @notice Retrieves the peer (OApp) associated with a corresponding endpoint.\\n     * @param _eid The endpoint ID.\\n     * @return peer The peer address (OApp instance) associated with the corresponding endpoint.\\n     */\\n    function peers(uint32 _eid) external view returns (bytes32 peer);\\n\\n    /**\\n     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.\\n     * @param _eid The endpoint ID.\\n     * @param _peer The address of the peer to be associated with the corresponding endpoint.\\n     */\\n    function setPeer(uint32 _eid, bytes32 _peer) external;\\n\\n    /**\\n     * @notice Sets the delegate address for the OApp Core.\\n     * @param _delegate The address of the delegate to be set.\\n     */\\n    function setDelegate(address _delegate) external;\\n}\\n\",\"keccak256\":\"0x40e49f2de74506e1da5dcaed53a39853f691647f4ceb0fccc8f49a68d3f47c58\",\"license\":\"MIT\"},\"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport { ILayerZeroReceiver, Origin } from \\\"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroReceiver.sol\\\";\\n\\ninterface IOAppReceiver is ILayerZeroReceiver {\\n    /**\\n     * @notice Indicates whether an address is an approved composeMsg sender to the Endpoint.\\n     * @param _origin The origin information containing the source endpoint and sender address.\\n     *  - srcEid: The source chain endpoint ID.\\n     *  - sender: The sender address on the src chain.\\n     *  - nonce: The nonce of the message.\\n     * @param _message The lzReceive payload.\\n     * @param _sender The sender address.\\n     * @return isSender Is a valid sender.\\n     *\\n     * @dev Applications can optionally choose to implement a separate composeMsg sender that is NOT the bridging layer.\\n     * @dev The default sender IS the OAppReceiver implementer.\\n     */\\n    function isComposeMsgSender(\\n        Origin calldata _origin,\\n        bytes calldata _message,\\n        address _sender\\n    ) external view returns (bool isSender);\\n}\\n\",\"keccak256\":\"0xd26135185e19b3732746d4a9e2923e896f28dec8664bab161faea2ee26fcdc3d\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./OwnableUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides 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} and {acceptOwnership}.\\n *\\n * This module is used through inheritance. It will make available all functions\\n * from parent (Ownable).\\n */\\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\\n    function __Ownable2Step_init() internal onlyInitializing {\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable2Step_init_unchained() internal onlyInitializing {\\n    }\\n    address private _pendingOwner;\\n\\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Returns the address of the pending owner.\\n     */\\n    function pendingOwner() public view virtual returns (address) {\\n        return _pendingOwner;\\n    }\\n\\n    /**\\n     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual override onlyOwner {\\n        _pendingOwner = newOwner;\\n        emit OwnershipTransferStarted(owner(), newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual override {\\n        delete _pendingOwner;\\n        super._transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev The new owner accepts the ownership transfer.\\n     */\\n    function acceptOwnership() external {\\n        address sender = _msgSender();\\n        require(pendingOwner() == sender, \\\"Ownable2Step: caller is not the new owner\\\");\\n        _transferOwnership(sender);\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xd712fb45b3ea0ab49679164e3895037adc26ce12879d5184feb040e01c1c07a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.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/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable {\\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    function __Ownable_init() internal onlyInitializing {\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal onlyInitializing {\\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    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n *     function initialize() initializer public {\\n *         __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n *     }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n *     function initializeV2() reinitializer(2) public {\\n *         __ERC20Permit_init(\\\"MyToken\\\");\\n *     }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n *     _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     * @custom:oz-retyped-from bool\\n     */\\n    uint8 private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Triggered when the contract has been initialized or reinitialized.\\n     */\\n    event Initialized(uint8 version);\\n\\n    /**\\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n     * `onlyInitializing` functions can be used to initialize parent contracts.\\n     *\\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n     * constructor.\\n     *\\n     * Emits an {Initialized} event.\\n     */\\n    modifier initializer() {\\n        bool isTopLevelCall = !_initializing;\\n        require(\\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n            \\\"Initializable: contract is already initialized\\\"\\n        );\\n        _initialized = 1;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n        }\\n        _;\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n            emit Initialized(1);\\n        }\\n    }\\n\\n    /**\\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n     * used to initialize parent contracts.\\n     *\\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n     * are added through upgrades and that require initialization.\\n     *\\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\\n     *\\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n     * a contract, executing them in the right order is up to the developer or operator.\\n     *\\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\\n     *\\n     * Emits an {Initialized} event.\\n     */\\n    modifier reinitializer(uint8 version) {\\n        require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n        _initialized = version;\\n        _initializing = true;\\n        _;\\n        _initializing = false;\\n        emit Initialized(version);\\n    }\\n\\n    /**\\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n     */\\n    modifier onlyInitializing() {\\n        require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n     * through proxies.\\n     *\\n     * Emits an {Initialized} event the first time it is successfully executed.\\n     */\\n    function _disableInitializers() internal virtual {\\n        require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n        if (_initialized < type(uint8).max) {\\n            _initialized = type(uint8).max;\\n            emit Initialized(type(uint8).max);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n     */\\n    function _getInitializedVersion() internal view returns (uint8) {\\n        return _initialized;\\n    }\\n\\n    /**\\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n     */\\n    function _isInitializing() internal view returns (bool) {\\n        return _initializing;\\n    }\\n}\\n\",\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n     *\\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n     * constructor.\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize/address.code.length, which returns 0\\n        // for contracts in construction, since the code is only stored at the end\\n        // of the constructor execution.\\n\\n        return account.code.length > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n     *\\n     * _Available since v4.8._\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        if (success) {\\n            if (returndata.length == 0) {\\n                // only check isContract if the call was successful and the return data is empty\\n                // otherwise we already know that it was a contract\\n                require(isContract(target), \\\"Address: call to non-contract\\\");\\n            }\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason or using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n        // Look for revert reason and bubble it up if present\\n        if (returndata.length > 0) {\\n            // The easiest way to bubble the revert reason is using memory via assembly\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                let returndata_size := mload(returndata)\\n                revert(add(32, returndata), returndata_size)\\n            }\\n        } else {\\n            revert(errorMessage);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\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 ContextUpgradeable is Initializable {\\n    function __Context_init() internal onlyInitializing {\\n    }\\n\\n    function __Context_init_unchained() internal onlyInitializing {\\n    }\\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    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"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\"},\"@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/Governance/AccessControlledV8.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\nimport \\\"./IAccessControlManagerV8.sol\\\";\\n\\n/**\\n * @title AccessControlledV8\\n * @author Venus\\n * @notice This contract is helper between access control manager and actual contract. This contract further inherited by other contract (using solidity 0.8.13)\\n * to integrate access controlled mechanism. It provides initialise methods and verifying access methods.\\n */\\nabstract contract AccessControlledV8 is Initializable, Ownable2StepUpgradeable {\\n    /// @notice Access control manager contract\\n    IAccessControlManagerV8 internal _accessControlManager;\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[49] private __gap;\\n\\n    /// @notice Emitted when access control manager contract address is changed\\n    event NewAccessControlManager(address oldAccessControlManager, address newAccessControlManager);\\n\\n    /// @notice Thrown when the action is prohibited by AccessControlManager\\n    error Unauthorized(address sender, address calledContract, string methodSignature);\\n\\n    function __AccessControlled_init(address accessControlManager_) internal onlyInitializing {\\n        __Ownable2Step_init();\\n        __AccessControlled_init_unchained(accessControlManager_);\\n    }\\n\\n    function __AccessControlled_init_unchained(address accessControlManager_) internal onlyInitializing {\\n        _setAccessControlManager(accessControlManager_);\\n    }\\n\\n    /**\\n     * @notice Sets the address of AccessControlManager\\n     * @dev Admin function to set address of AccessControlManager\\n     * @param accessControlManager_ The new address of the AccessControlManager\\n     * @custom:event Emits NewAccessControlManager event\\n     * @custom:access Only Governance\\n     */\\n    function setAccessControlManager(address accessControlManager_) external onlyOwner {\\n        _setAccessControlManager(accessControlManager_);\\n    }\\n\\n    /**\\n     * @notice Returns the address of the access control manager contract\\n     */\\n    function accessControlManager() external view returns (IAccessControlManagerV8) {\\n        return _accessControlManager;\\n    }\\n\\n    /**\\n     * @dev Internal function to set address of AccessControlManager\\n     * @param accessControlManager_ The new address of the AccessControlManager\\n     */\\n    function _setAccessControlManager(address accessControlManager_) internal {\\n        require(address(accessControlManager_) != address(0), \\\"invalid acess control manager address\\\");\\n        address oldAccessControlManager = address(_accessControlManager);\\n        _accessControlManager = IAccessControlManagerV8(accessControlManager_);\\n        emit NewAccessControlManager(oldAccessControlManager, accessControlManager_);\\n    }\\n\\n    /**\\n     * @notice Reverts if the call is not allowed by AccessControlManager\\n     * @param signature Method signature\\n     */\\n    function _checkAccessAllowed(string memory signature) internal view {\\n        bool isAllowedToCall = _accessControlManager.isAllowedToCall(msg.sender, signature);\\n\\n        if (!isAllowedToCall) {\\n            revert Unauthorized(msg.sender, address(this), signature);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfe0fd441c84ac907cabc88db69ef04f6d7532d770c7e6a1dfe6e7d6305debb49\",\"license\":\"BSD-3-Clause\"},\"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\"},\"contracts/RiskSteward/DestinationStewardReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport { OwnableUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport { Ownable2StepUpgradeable } from \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\nimport { IDestinationStewardReceiver } from \\\"./Interfaces/IDestinationStewardReceiver.sol\\\";\\nimport { RiskParameterUpdate } from \\\"./Interfaces/IRiskOracle.sol\\\";\\nimport { IRiskSteward } from \\\"./Interfaces/IRiskSteward.sol\\\";\\nimport { ensureNonzeroAddress } from \\\"@venusprotocol/solidity-utilities/contracts/validators.sol\\\";\\nimport { AccessControlledV8 } from \\\"../Governance/AccessControlledV8.sol\\\";\\nimport { IIsolatedPoolsComptroller } from \\\"../interfaces/IIsolatedPoolsComptroller.sol\\\";\\nimport { OAppReceiverUpgradeable, Origin } from \\\"@layerzerolabs/oapp-evm-upgradeable/contracts/oapp/OAppReceiverUpgradeable.sol\\\";\\nimport { OAppCoreUpgradeable } from \\\"@layerzerolabs/oapp-evm-upgradeable/contracts/oapp/OAppCoreUpgradeable.sol\\\";\\n\\n/**\\n * @title DestinationStewardReceiver\\n * @author Venus\\n * @notice Destination\\u2011chain contract that receives bridged updates from `RiskStewardReceiver` via LayerZero,\\n *         enforces a fixed remote delay, and then executes the updates on the configured `IRiskSteward` contracts.\\n * @custom:security-contact https://github.com/VenusProtocol/governance-contracts#discussion\\n */\\ncontract DestinationStewardReceiver is IDestinationStewardReceiver, AccessControlledV8, OAppReceiverUpgradeable {\\n    /**\\n     * @notice Time before a bridged update is considered stale on the destination chain\\n     */\\n    uint256 public constant REMOTE_UPDATE_EXPIRATION_TIME = 2 days;\\n\\n    /**\\n     * @notice Destination chain LayerZero endpoint ID\\n     */\\n    uint32 public immutable LAYER_ZERO_EID;\\n\\n    /**\\n     * @notice Delay before a bridged update can be executed on the destination chain\\n     */\\n    uint256 public remoteDelay;\\n\\n    /**\\n     * @notice Mapping of supported risk configurations per update type (hashed updateType string)\\n     */\\n    mapping(bytes32 => RiskParamConfig) public riskParameterConfigs;\\n\\n    /**\\n     * @notice Master storage of all bridged updates by update ID\\n     */\\n    mapping(uint256 updateId => DestinationUpdate) public updates;\\n\\n    /**\\n     * @notice Mapping from (updateType, market) to currently registered remote update ID\\n     */\\n    mapping(bytes32 => mapping(address market => uint256)) public lastRegisteredUpdateId;\\n\\n    /**\\n     * @notice Track last executed update timestamp per (updateType, market)\\n     */\\n    mapping(bytes32 => mapping(address market => uint256)) public lastExecutedAt;\\n\\n    /**\\n     * @notice Mapping from executor address to whitelist status\\n     */\\n    mapping(address => bool) public whitelistedExecutors;\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[44] private __gap;\\n\\n    /**\\n     * @notice Modifier that ensures only whitelisted executors can call the function\\n     * @custom:error NotAnExecutor if the caller is not a whitelisted executor\\n     */\\n    modifier onlyWhitelistedExecutors() {\\n        if (!whitelistedExecutors[msg.sender]) {\\n            revert NotAnExecutor();\\n        }\\n        _;\\n    }\\n\\n    /**\\n     * @notice Disables initializers and sets immutable values.\\n     * @param endpoint_ Local LayerZero endpoint on this chain\\n     * @param layerZeroEid_ LayerZero endpoint ID for this destination chain\\n     * @custom:oz-upgrades-unsafe-allow constructor\\n     */\\n    constructor(address endpoint_, uint32 layerZeroEid_) OAppCoreUpgradeable(endpoint_) {\\n        _disableInitializers();\\n        ensureNonzeroAddress(endpoint_);\\n        if (layerZeroEid_ == 0) revert InvalidLayerZeroEid();\\n\\n        LAYER_ZERO_EID = layerZeroEid_;\\n    }\\n\\n    /**\\n     * @notice Initializes the contract with the Access Control Manager and owner.\\n     * @param accessControlManager_ The address of the access control manager\\n     * @param delegate_ The owner (and LayerZero delegate) of this contract\\n     */\\n    function initialize(address accessControlManager_, address delegate_) external initializer {\\n        __AccessControlled_init(accessControlManager_);\\n        __OAppReceiver_init(delegate_);\\n        remoteDelay = 6 hours; // Default value\\n        emit RemoteDelaySet(remoteDelay);\\n    }\\n\\n    /**\\n     * @notice Sets the risk parameter config for a given update type on the destination chain.\\n     * @param updateType The type of update to configure (e.g., \\\"supplyCap\\\", \\\"borrowCap\\\")\\n     * @param riskSteward The address for the risk steward contract responsible for processing the update\\n     * @param debounce The debounce period for updates of this type on the destination (anti\\u2011DoS)\\n     * @custom:access Controlled by AccessControlManager\\n     * @custom:event Emits RiskParameterConfigUpdated\\n     * @custom:error InvalidUpdateType if the update type string is empty\\n     * @custom:error InvalidDebounce if the debounce is 0\\n     */\\n    function setRiskParameterConfig(string calldata updateType, address riskSteward, uint256 debounce) external {\\n        _checkAccessAllowed(\\\"setRiskParameterConfig(string,address,uint256)\\\");\\n        ensureNonzeroAddress(riskSteward);\\n\\n        if (bytes(updateType).length == 0 || bytes(updateType).length > 64) {\\n            revert InvalidUpdateType();\\n        }\\n\\n        if (debounce == 0) {\\n            revert InvalidDebounce();\\n        }\\n\\n        bytes32 key = keccak256(bytes(updateType));\\n        RiskParamConfig storage previousConfig = riskParameterConfigs[key];\\n\\n        riskParameterConfigs[key] = RiskParamConfig({ active: true, debounce: debounce, riskSteward: riskSteward });\\n\\n        emit RiskParameterConfigUpdated(\\n            key,\\n            updateType,\\n            previousConfig.riskSteward,\\n            riskSteward,\\n            previousConfig.debounce,\\n            debounce,\\n            previousConfig.active,\\n            true\\n        );\\n    }\\n\\n    /**\\n     * @notice Sets the active status of a risk parameter config\\n     * @param updateType The type of update to configure\\n     * @param active The active status to set\\n     * @custom:access Controlled by AccessControlManager\\n     * @custom:event Emits ConfigActiveUpdated with the update type hash, update type, previous active status, and the active status\\n     * @custom:error Throws UnsupportedUpdateType if the update type is not supported\\n     * @custom:error Throws ConfigStatusUnchanged if the active status is already set to the desired value\\n     */\\n    function setConfigActive(string calldata updateType, bool active) external {\\n        _checkAccessAllowed(\\\"setConfigActive(string,bool)\\\");\\n        bytes32 key = keccak256(bytes(updateType));\\n\\n        if (riskParameterConfigs[key].riskSteward == address(0)) {\\n            revert UnsupportedUpdateType();\\n        }\\n\\n        bool previousActive = riskParameterConfigs[key].active;\\n        if (previousActive == active) {\\n            revert ConfigStatusUnchanged();\\n        }\\n\\n        riskParameterConfigs[key].active = active;\\n        emit ConfigActiveUpdated(key, updateType, previousActive, active);\\n    }\\n\\n    /**\\n     * @notice Sets the remote delay before bridged updates can be executed on the destination chain.\\n     * @param newRemoteDelay The new remote delay in seconds\\n     * @custom:access Controlled by AccessControlManager\\n     * @custom:event Emits RemoteDelaySet with the new remote delay value\\n     * @custom:error InvalidRemoteDelay if the delay is 0 or greater than or equal to the remote update expiration time\\n     * @custom:error RemoteDelayUnchanged if the new delay is equal to the current delay\\n     */\\n    function setRemoteDelay(uint256 newRemoteDelay) external {\\n        _checkAccessAllowed(\\\"setRemoteDelay(uint256)\\\");\\n\\n        if (newRemoteDelay == 0 || newRemoteDelay >= REMOTE_UPDATE_EXPIRATION_TIME) {\\n            revert InvalidRemoteDelay();\\n        }\\n\\n        uint256 previousDelay = remoteDelay;\\n        if (previousDelay == newRemoteDelay) {\\n            revert RemoteDelayUnchanged();\\n        }\\n\\n        remoteDelay = newRemoteDelay;\\n        emit RemoteDelaySet(newRemoteDelay);\\n    }\\n\\n    /**\\n     * @notice Sets the whitelist status of an executor on the destination chain.\\n     * @param executor The address of the executor\\n     * @param approved The whitelist status to set (true to whitelist, false to remove)\\n     * @custom:access Controlled by AccessControlManager\\n     * @custom:event Emits ExecutorStatusUpdated with the executor address, previous approval status, and new approval status\\n     * @custom:error Throws ZeroAddressNotAllowed if the executor address is zero\\n     * @custom:error Throws ExecutorStatusUnchanged if the executor whitelist status is already set to the desired value\\n     */\\n    function setWhitelistedExecutor(address executor, bool approved) external {\\n        _checkAccessAllowed(\\\"setWhitelistedExecutor(address,bool)\\\");\\n        ensureNonzeroAddress(executor);\\n        bool previousApproved = whitelistedExecutors[executor];\\n        if (previousApproved == approved) {\\n            revert ExecutorStatusUnchanged();\\n        }\\n\\n        whitelistedExecutors[executor] = approved;\\n        emit ExecutorStatusUpdated(executor, previousApproved, approved);\\n    }\\n\\n    /**\\n     * @notice Executes a bridged update after its remote delay has passed.\\n     * @param updateId The bridged update ID to execute\\n     * @custom:access Only whitelisted executors can execute updates\\n     * @custom:event Emits RemoteUpdateExecuted with the executed update ID\\n     * @custom:error NotAnExecutor if the caller is not a whitelisted executor\\n     * @custom:error ConfigNotActive if the configuration for the update type is not active\\n     * @custom:error UpdateNotFound if the update is not pending for the given (updateType, market)\\n     * @custom:error UpdateNotUnlocked if the remote delay has not elapsed\\n     * @custom:error UpdateIsExpired if the bridged update has expired on the destination\\n     * @custom:error UpdateTooFrequent if the debounce period has not passed since the last execution\\n     */\\n    function executeUpdate(uint256 updateId) external onlyWhitelistedExecutors {\\n        DestinationUpdate storage destUpdate = updates[updateId];\\n        RiskParameterUpdate memory update = destUpdate.update;\\n        bytes32 updateTypeKey = update.updateTypeKey;\\n        RiskParamConfig storage config = riskParameterConfigs[updateTypeKey];\\n        uint256 currentTime = block.timestamp;\\n\\n        if (!config.active) {\\n            revert ConfigNotActive();\\n        }\\n\\n        if (destUpdate.status != UpdateStatus.Pending) {\\n            revert UpdateNotFound();\\n        }\\n\\n        if (currentTime < destUpdate.arrivalTime + remoteDelay) {\\n            revert UpdateNotUnlocked();\\n        }\\n\\n        if (update.timestamp + REMOTE_UPDATE_EXPIRATION_TIME < currentTime) {\\n            revert UpdateIsExpired();\\n        }\\n\\n        // Destination-side debounce based on last execution for this (updateType, market)\\n        uint256 lastExecutionTime = lastExecutedAt[updateTypeKey][update.market];\\n        if (lastExecutionTime != 0 && (lastExecutionTime + config.debounce > currentTime)) {\\n            revert UpdateTooFrequent();\\n        }\\n\\n        lastExecutedAt[updateTypeKey][update.market] = currentTime;\\n        destUpdate.status = UpdateStatus.Executed;\\n        destUpdate.executor = msg.sender;\\n\\n        IRiskSteward(config.riskSteward).applyUpdate(update);\\n\\n        emit RemoteUpdateExecuted(updateId);\\n    }\\n\\n    /**\\n     * @notice Rejects a registered remote update on the destination chain.\\n     * @param updateId The oracle update ID of the update to reject\\n     * @custom:access Only whitelisted executors can reject updates\\n     * @custom:event Emits UpdateRejected with the rejected update ID\\n     * @custom:error NotAnExecutor if the caller is not a whitelisted executor\\n     * @custom:error UpdateNotFound if there is no pending update with the given ID\\n     */\\n    function rejectUpdate(uint256 updateId) external onlyWhitelistedExecutors {\\n        DestinationUpdate storage destUpdate = updates[updateId];\\n\\n        if (destUpdate.status != UpdateStatus.Pending) {\\n            revert UpdateNotFound();\\n        }\\n\\n        destUpdate.status = UpdateStatus.Rejected;\\n        emit UpdateRejected(updateId);\\n    }\\n\\n    /**\\n     * @notice Returns executable updates for a given update type and comptroller.\\n     * @param updateType The human\\u2011readable identifier of the update type to filter by\\n     * @param comptroller The address of the Isolated Pools Comptroller that manages the markets\\n     * @return executableUpdates Array of update IDs that are ready to be executed\\n     */\\n    function getExecutableUpdates(\\n        string calldata updateType,\\n        address comptroller\\n    ) external view returns (uint256[] memory executableUpdates) {\\n        bytes32 updateTypeKey = keccak256(bytes(updateType));\\n        address[] memory markets = IIsolatedPoolsComptroller(comptroller).getAllMarkets();\\n        uint256 maxUpdates = markets.length;\\n        uint256[] memory tempArray = new uint256[](maxUpdates);\\n        uint256 count = 0;\\n        RiskParamConfig storage config = riskParameterConfigs[updateTypeKey];\\n\\n        if (!config.active) return new uint256[](0);\\n\\n        for (uint256 i = 0; i < maxUpdates; ++i) {\\n            address market = markets[i];\\n            uint256 registeredUpdateId = lastRegisteredUpdateId[updateTypeKey][market];\\n            DestinationUpdate storage destUpdate = updates[registeredUpdateId];\\n\\n            if (!_checkPendingUpdate(registeredUpdateId)) continue;\\n\\n            // Validate Remote Delay\\n            if (block.timestamp < destUpdate.arrivalTime + remoteDelay) continue;\\n\\n            // Debounce: skip if last execution for this (updateType, market) is too recent\\n            uint256 lastExecutionTime = lastExecutedAt[updateTypeKey][market];\\n            if (lastExecutionTime != 0 && (lastExecutionTime + config.debounce > block.timestamp)) continue;\\n\\n            tempArray[count] = registeredUpdateId;\\n            count++;\\n        }\\n\\n        executableUpdates = new uint256[](count);\\n        for (uint256 i = 0; i < count; ++i) {\\n            executableUpdates[i] = tempArray[i];\\n        }\\n    }\\n\\n    /**\\n     * @notice Returns the risk parameter configuration for a given update type\\n     * @param updateType The human-readable identifier of the update type\\n     * @return The risk parameter configuration\\n     */\\n    function getRiskParameterConfig(string calldata updateType) external view returns (RiskParamConfig memory) {\\n        bytes32 key = keccak256(bytes(updateType));\\n        return riskParameterConfigs[key];\\n    }\\n\\n    /**\\n     * @notice Returns the registered update for a given update type and market\\n     * @param updateType The human-readable identifier of the update type\\n     * @param market The address of the market\\n     * @return The registered update\\n     */\\n    function getRegisteredUpdate(\\n        string calldata updateType,\\n        address market\\n    ) external view returns (DestinationUpdate memory) {\\n        bytes32 key = keccak256(bytes(updateType));\\n        uint256 updateId = lastRegisteredUpdateId[key][market];\\n        return updates[updateId];\\n    }\\n\\n    /**\\n     * @notice Returns the last executed timestamp for a given update type and market\\n     * @param updateType The human-readable identifier of the update type\\n     * @param market The address of the market\\n     * @return The last executed timestamp\\n     */\\n    function getLastExecutedAt(string calldata updateType, address market) external view returns (uint256) {\\n        bytes32 key = keccak256(bytes(updateType));\\n        return lastExecutedAt[key][market];\\n    }\\n\\n    /**\\n     * @dev Overrides OwnableUpgradeable and Ownable2StepUpgradeable to resolve\\n     *      the multiple inheritance ownership transfer conflict.\\n     */\\n    function transferOwnership(\\n        address newOwner\\n    ) public override(OwnableUpgradeable, Ownable2StepUpgradeable) onlyOwner {\\n        Ownable2StepUpgradeable.transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Internal hook to finalize ownership transfer, resolving the\\n     *      OwnableUpgradeable and Ownable2StepUpgradeable inheritance conflict.\\n     */\\n    function _transferOwnership(address newOwner) internal override(OwnableUpgradeable, Ownable2StepUpgradeable) {\\n        Ownable2StepUpgradeable._transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @notice Internal LayerZero receive hook that handles bridged updates from the source-chain `RiskStewardReceiver`.\\n     * @dev Emits `DuplicateUpdateReceived`, `RegisteredPendingUpdateExist`, or `RemoteUpdateRegistered`\\n     *      depending on whether the update ID was already seen or a non\\u2011expired pending update exists.\\n     * @param payload Encoded `RiskParameterUpdate` sent from the source chain\\n     */\\n    function _lzReceive(Origin calldata, bytes32, bytes calldata payload, address, bytes calldata) internal override {\\n        RiskParameterUpdate memory update = abi.decode(payload, (RiskParameterUpdate));\\n        uint256 newId = update.updateId;\\n        uint256 arrivalTime = block.timestamp;\\n\\n        // If this update ID was already stored, treat as a duplicate and do not overwrite\\n        if (updates[newId].status != UpdateStatus.None) {\\n            emit DuplicateUpdateReceived(newId, arrivalTime, update.updateType, update.market);\\n            return;\\n        }\\n\\n        // If already an update in Process do not override the registered update\\n        uint256 currentRegisteredId = lastRegisteredUpdateId[update.updateTypeKey][update.market];\\n        if (_checkPendingUpdate(currentRegisteredId)) {\\n            emit RegisteredPendingUpdateExist(currentRegisteredId, arrivalTime, update.updateType, update.market);\\n            return;\\n        }\\n\\n        DestinationUpdate storage destUpdate = updates[newId];\\n        destUpdate.update = update;\\n        destUpdate.status = UpdateStatus.Pending;\\n        destUpdate.arrivalTime = arrivalTime;\\n        lastRegisteredUpdateId[update.updateTypeKey][update.market] = newId;\\n        emit RemoteUpdateRegistered(newId, arrivalTime, update.updateType, update.market);\\n    }\\n\\n    /**\\n     * @notice Checks whether a given registered update ID corresponds to a pending, non\\u2011expired update.\\n     * @param currentRegisteredId The currently registered update ID for a specific (updateType, market) pair\\n     * @return True if currentRegisteredId is non\\u2011zero, the update status is Pending, and it has not expired; otherwise false\\n     */\\n    function _checkPendingUpdate(uint256 currentRegisteredId) internal view returns (bool) {\\n        if (currentRegisteredId == 0) return false; // no registered update\\n\\n        DestinationUpdate storage current = updates[currentRegisteredId];\\n\\n        if (current.status != UpdateStatus.Pending) return false;\\n\\n        // Check expiration\\n        return current.update.timestamp + REMOTE_UPDATE_EXPIRATION_TIME >= block.timestamp;\\n    }\\n\\n    /**\\n     * @notice Disables renounceOwnership function\\n     * @custom:error Throws RenounceOwnershipNotAllowed\\n     */\\n    function renounceOwnership() public pure override {\\n        revert RenounceOwnershipNotAllowed();\\n    }\\n}\\n\",\"keccak256\":\"0x2b4c0e85964fb89b8ab7aa9a4f427d8e40000dcaf10267480ee5edf6c5fac985\",\"license\":\"BSD-3-Clause\"},\"contracts/RiskSteward/Interfaces/IDestinationStewardReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport { RiskParameterUpdate } from \\\"./IRiskOracle.sol\\\";\\n\\ninterface IDestinationStewardReceiver {\\n    /**\\n     * @notice Local status of an update on the destination chain\\n     */\\n    enum UpdateStatus {\\n        None,\\n        Pending,\\n        Executed,\\n        Rejected\\n    }\\n\\n    /**\\n     * @notice Configuration for a risk parameter update type on the destination chain.\\n     * @param active Whether this update type configuration is currently active\\n     * @param debounce Minimum delay between consecutive executions for the same (updateType, market) pair\\n     * @param riskSteward Address of the risk steward contract responsible for processing this update type\\n     */\\n    struct RiskParamConfig {\\n        bool active;\\n        uint256 debounce;\\n        address riskSteward;\\n    }\\n\\n    /**\\n     * @notice Destination-side storage for a bridged risk parameter update.\\n     * @param update The full risk parameter update payload received from the source chain\\n     * @param status Current local status of the bridged update (Pending, Executed, Rejected)\\n     * @param arrivalTime Timestamp when the update was received on this chain\\n     * @param executor Address of the executor who executed this update on the destination (address(0) not executed yet)\\n     * @dev Unlock time is derived as `arrivalTime + remoteDelay` instead of being stored separately.\\n     */\\n    struct DestinationUpdate {\\n        RiskParameterUpdate update;\\n        UpdateStatus status;\\n        uint256 arrivalTime;\\n        address executor;\\n    }\\n\\n    /**\\n     * @notice Emitted when a risk parameter config is updated for an update type\\n     */\\n    event RiskParameterConfigUpdated(\\n        bytes32 indexed updateTypeHash,\\n        string updateType,\\n        address indexed previousRiskSteward,\\n        address indexed riskSteward,\\n        uint256 previousDebounce,\\n        uint256 debounce,\\n        bool previousActive,\\n        bool active\\n    );\\n\\n    /**\\n     * @notice Emitted when a bridged update is registered on the destination\\n     */\\n    event RemoteUpdateRegistered(\\n        uint256 indexed updateId,\\n        uint256 arrivalTime,\\n        string indexed updateType,\\n        address indexed market\\n    );\\n\\n    /**\\n     * @notice Emitted when a new bridged update arrives but a pending update is already registered for the same (updateType, market).\\n     */\\n    event RegisteredPendingUpdateExist(\\n        uint256 indexed updateId,\\n        uint256 arrivalTime,\\n        string indexed updateType,\\n        address indexed market\\n    );\\n\\n    /**\\n     * @notice Emitted when a duplicate bridged update (same updateId) is received.\\n     */\\n    event DuplicateUpdateReceived(\\n        uint256 indexed updateId,\\n        uint256 arrivalTime,\\n        string indexed updateType,\\n        address indexed market\\n    );\\n\\n    /**\\n     * @notice Emitted when a bridged update is executed on the destination\\n     */\\n    event RemoteUpdateExecuted(uint256 indexed updateId);\\n\\n    /**\\n     * @notice Emitted when an executor status is set on the destination\\n     */\\n    event ExecutorStatusUpdated(address indexed executor, bool previousApproved, bool approved);\\n\\n    /**\\n     * @notice Emitted when a risk parameter config active status is updated\\n     */\\n    event ConfigActiveUpdated(\\n        bytes32 indexed updateTypeHash,\\n        string updateType,\\n        bool previousActive,\\n        bool indexed active\\n    );\\n\\n    /**\\n     * @notice Emitted when an update is rejected on the destination\\n     */\\n    event UpdateRejected(uint256 indexed updateId);\\n\\n    /**\\n     * @notice Emitted when the remote delay is set in the constructor\\n     */\\n    event RemoteDelaySet(uint256 remoteDelay);\\n\\n    /**\\n     * @notice Thrown when trying to operate on an update that was never registered\\n     */\\n    error UpdateNotFound();\\n\\n    /**\\n     * @notice Thrown when trying to execute an update before its unlock time\\n     */\\n    error UpdateNotUnlocked();\\n\\n    /**\\n     * @notice Thrown when config for an update type is not active or not configured\\n     */\\n    error ConfigNotActive();\\n\\n    /**\\n     * @notice Thrown when a bridged update has expired on the destination\\n     */\\n    error UpdateIsExpired();\\n\\n    /**\\n     * @notice Thrown when the debounce period hasn't passed for applying an update to a specific market / update type\\n     */\\n    error UpdateTooFrequent();\\n\\n    /**\\n     * @notice Thrown when an empty update type string is provided\\n     */\\n    error InvalidUpdateType();\\n\\n    /**\\n     * @notice Thrown when an update type is not supported\\n     */\\n    error UnsupportedUpdateType();\\n\\n    /**\\n     * @notice Thrown when a debounce value of 0 is set\\n     */\\n    error InvalidDebounce();\\n\\n    /**\\n     * @notice Thrown when an address is not a whitelisted executor\\n     */\\n    error NotAnExecutor();\\n\\n    /**\\n     * @notice Thrown when an invalid LayerZero endpoint ID is provided\\n     */\\n    error InvalidLayerZeroEid();\\n\\n    /**\\n     * @notice Thrown when an invalid remote delay is provided\\n     */\\n    error InvalidRemoteDelay();\\n\\n    /**\\n     * @notice Thrown when trying to set the same remote delay value\\n     */\\n    error RemoteDelayUnchanged();\\n\\n    /**\\n     * @notice Thrown when trying to renounce ownership\\n     */\\n    error RenounceOwnershipNotAllowed();\\n\\n    /**\\n     * @notice Thrown when trying to set the same config active status\\n     */\\n    error ConfigStatusUnchanged();\\n\\n    /**\\n     * @notice Thrown when trying to set the same executor whitelist status\\n     */\\n    error ExecutorStatusUnchanged();\\n\\n    function setRiskParameterConfig(string calldata updateType, address riskSteward, uint256 debounce) external;\\n\\n    function setConfigActive(string calldata updateType, bool active) external;\\n\\n    function setWhitelistedExecutor(address executor, bool approved) external;\\n\\n    function setRemoteDelay(uint256 newRemoteDelay) external;\\n\\n    function executeUpdate(uint256 updateId) external;\\n\\n    function rejectUpdate(uint256 updateId) external;\\n\\n    function getExecutableUpdates(\\n        string calldata updateType,\\n        address comptroller\\n    ) external view returns (uint256[] memory executableUpdates);\\n\\n    function getRiskParameterConfig(string calldata updateType) external view returns (RiskParamConfig memory);\\n\\n    function getRegisteredUpdate(\\n        string calldata updateType,\\n        address market\\n    ) external view returns (DestinationUpdate memory);\\n\\n    function getLastExecutedAt(string calldata updateType, address market) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xa925bdc043521f851b9cc539478290d0d94b94c4c15688ab24b4e75658467e35\",\"license\":\"BSD-3-Clause\"},\"contracts/RiskSteward/Interfaces/IRiskOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.25;\\n\\n/**\\n * @notice Struct representing a risk parameter update published by the Risk Oracle\\n * @param referenceId External reference ID, potentially linking to a document or off-chain data\\n * @param updateId Unique identifier for this specific update\\n * @param market Address of the market for which the parameter update applies\\n * @param updateType Classification of the update type for validation purposes (human-readable)\\n * @param updateTypeKey Keccak256 hash of updateType for efficient comparisons\\n * @param newValue Encoded new value of the risk parameter, flexible for various data types\\n * @param previousValue Previous value of the parameter for historical comparison\\n * @param timestamp Block timestamp when the update was published\\n * @param publisher Address of the account that published this update\\n * @param poolId Pool identifier for eMode-style collateral configuration (0 for regular markets)\\n * @param destLzEid LayerZero endpoint ID of the destination chain (0 for local execution)\\n * @param additionalData Additional metadata or data associated with the update\\n */\\nstruct RiskParameterUpdate {\\n    string referenceId;\\n    uint256 updateId;\\n    address market;\\n    string updateType;\\n    bytes32 updateTypeKey;\\n    bytes newValue;\\n    bytes previousValue;\\n    uint256 timestamp;\\n    address publisher;\\n    uint96 poolId;\\n    uint32 destLzEid;\\n    bytes additionalData;\\n}\\n\\n/**\\n * @title IRiskOracle\\n * @author Venus\\n * @notice Interface for Risk Oracle contract that manages and publishes risk parameter updates\\n */\\ninterface IRiskOracle {\\n    /// @notice Event emitted when a risk parameter update is published\\n    event UpdatePublished(\\n        string referenceId,\\n        uint256 indexed updateId,\\n        address indexed market,\\n        string indexed updateType,\\n        bytes newValue,\\n        bytes previousValue,\\n        uint256 timestamp,\\n        address publisher,\\n        bytes additionalData\\n    );\\n\\n    /// @notice Event emitted when a new authorized sender is added\\n    event AuthorizedSenderAdded(address indexed sender);\\n\\n    /// @notice Event emitted when an authorized sender is removed\\n    event AuthorizedSenderRemoved(address indexed sender);\\n\\n    /// @notice Event emitted when a new update type is added\\n    event UpdateTypeAdded(string indexed updateType);\\n\\n    /// @notice Event emitted when an update type's active status is changed\\n    event UpdateTypeActiveStatusChanged(string indexed updateType, bool previousActive, bool active);\\n\\n    /// @notice Thrown when sender is not authorized\\n    error SenderNotAuthorized();\\n\\n    /// @notice Thrown when sender is already authorized\\n    error SenderAlreadyAuthorized();\\n\\n    /// @notice Thrown when update type string is invalid\\n    error InvalidUpdateTypeString();\\n\\n    /// @notice Thrown when update type already exists\\n    error UpdateTypeAlreadyExists();\\n\\n    /// @notice Thrown when update type doesn't exist\\n    error UpdateTypeNotFound();\\n\\n    /// @notice Thrown when update type active status is already set to the desired value\\n    error UpdateTypeStatusUnchanged();\\n\\n    /// @notice Thrown when update type is not active\\n    error UpdateTypeNotActive();\\n\\n    /// @notice Thrown when no update is found\\n    error NoUpdateFound();\\n\\n    /// @notice Thrown when update ID is invalid\\n    error InvalidUpdateId();\\n\\n    /// @notice Thrown when array lengths don't match in bulk operations\\n    error ArrayLengthMismatch();\\n\\n    /// @notice Thrown when trying to renounce ownership\\n    error RenounceOwnershipNotAllowed();\\n\\n    /**\\n     * @notice Returns the update type string at the given index in the allUpdateTypes array\\n     * @param index The index in the allUpdateTypes array\\n     * @return The update type string at the specified index\\n     */\\n    function allUpdateTypes(uint256 index) external view returns (string memory);\\n\\n    /**\\n     * @notice Returns the total number of update types in the allUpdateTypes array\\n     * @return The length of the allUpdateTypes array\\n     */\\n    function allUpdateTypesLength() external view returns (uint256);\\n\\n    /**\\n     * @notice Returns all update types in the allUpdateTypes array\\n     * @return An array of all update type strings\\n     */\\n    function getAllUpdateTypes() external view returns (string[] memory);\\n\\n    /**\\n     * @notice Checks if a given update type is currently active\\n     * @param updateType The update type string to check\\n     * @return True if the update type is active, false otherwise\\n     */\\n    function getActiveUpdateTypes(string memory updateType) external view returns (bool);\\n\\n    /**\\n     * @notice Checks if a given update type is currently active\\n     * @param updateTypeKey The keccak256 hash of the update type string\\n     * @return True if the update type key is active, false otherwise\\n     */\\n    function activeUpdateTypes(bytes32 updateTypeKey) external view returns (bool);\\n\\n    /**\\n     * @notice Checks if an address is authorized to publish updates\\n     * @param sender The address to check for authorization\\n     * @return True if the address is authorized, false otherwise\\n     */\\n    function authorizedSenders(address sender) external view returns (bool);\\n\\n    /**\\n     * @notice Gets the latest update ID for a specific market and update type combination\\n     * @param updateTypeKey The keccak256 hash of the update type string\\n     * @param market The market address\\n     * @return The latest update ID for the given market and update type key, or 0 if none exists\\n     */\\n    function latestUpdateIdByMarketAndType(bytes32 updateTypeKey, address market) external view returns (uint256);\\n\\n    /**\\n     * @notice Returns the total number of updates that have been published\\n     * @return The current update counter value\\n     */\\n    function updateCounter() external view returns (uint256);\\n\\n    /**\\n     * @notice Fetches the most recent update for a specific parameter type in a specific market\\n     * @param updateType The update type identifier\\n     * @param market The market address\\n     * @return The most recent RiskParameterUpdate for the specified parameter and market\\n     * @custom:error NoUpdateFound Thrown if no update exists for the specified parameter and market\\n     */\\n    function getLatestUpdateByTypeAndMarket(\\n        string memory updateType,\\n        address market\\n    ) external view returns (RiskParameterUpdate memory);\\n\\n    /**\\n     * @notice Gets the latest update ID for a specific market and update type (string) combination\\n     * @param updateType The update type identifier\\n     * @param market The market address\\n     * @return The latest update ID for the given market and update type, or 0 if none exists\\n     */\\n    function getLatestUpdateIdByTypeAndMarket(string memory updateType, address market) external view returns (uint256);\\n\\n    /**\\n     * @notice Fetches the update for a provided update ID\\n     * @param updateId The unique update ID\\n     * @return The RiskParameterUpdate struct for the specified update ID\\n     * @custom:error InvalidUpdateId Thrown if updateId is 0 or greater than updateCounter\\n     */\\n    function getUpdateById(uint256 updateId) external view returns (RiskParameterUpdate memory);\\n\\n    /**\\n     * @notice Adds a new address to the list of authorized senders who can publish updates\\n     * @param sender Address to be authorized\\n     * @custom:error ZeroAddressNotAllowed Thrown if sender is the zero address\\n     * @custom:error SenderAlreadyAuthorized Thrown if sender is already authorized\\n     * @custom:error Unauthorized Thrown if caller is not allowed by AccessControlManager\\n     * @custom:event AuthorizedSenderAdded Emitted when sender is successfully added\\n     */\\n    function addAuthorizedSender(address sender) external;\\n\\n    /**\\n     * @notice Removes an address from the list of authorized senders\\n     * @param sender Address to be removed from authorization\\n     * @custom:error SenderNotAuthorized Thrown if sender is not currently authorized\\n     * @custom:error Unauthorized Thrown if caller is not allowed by AccessControlManager\\n     * @custom:event AuthorizedSenderRemoved Emitted when sender is successfully removed\\n     */\\n    function removeAuthorizedSender(address sender) external;\\n\\n    /**\\n     * @notice Adds a new update type to the list of authorized update types\\n     * @param newUpdateType New update type string to allow (must be non-empty and <= 64 characters)\\n     * @custom:error InvalidUpdateTypeString Thrown if update type string is empty or exceeds 64 characters\\n     * @custom:error UpdateTypeAlreadyExists Thrown if update type already exists\\n     * @custom:error Unauthorized Thrown if caller is not allowed by AccessControlManager\\n     * @custom:event UpdateTypeAdded Emitted when update type is successfully added\\n     */\\n    function addUpdateType(string memory newUpdateType) external;\\n\\n    /**\\n     * @notice Sets the active status of an existing update type\\n     * @param updateType The update type to set active status for\\n     * @param active True to activate the update type, false to deactivate it\\n     * @custom:error UpdateTypeNotFound Thrown if update type doesn't exist\\n     * @custom:error UpdateTypeStatusUnchanged Thrown if status is already set to the desired value\\n     * @custom:error Unauthorized Thrown if caller is not allowed by AccessControlManager\\n     * @custom:event UpdateTypeActiveStatusChanged Emitted when status is successfully changed\\n     */\\n    function setUpdateTypeActive(string memory updateType, bool active) external;\\n\\n    /**\\n     * @notice Publishes a new risk parameter update.\\n     * @param referenceId An external reference ID associated with the update\\n     * @param newValue The new value of the risk parameter being updated (encoded as bytes)\\n     * @param updateType Type of update performed, must be an active update type\\n     * @param market Address of the market for which the parameter update applies\\n     * @param poolId Pool identifier for eMode-style collateral configuration (0 for regular markets)\\n     * @param dstEid Destination endpoint ID for cross-chain routing\\n     * @param additionalData Additional data or metadata for the update\\n     * @custom:error SenderNotAuthorized Thrown if caller is not an authorized sender\\n     * @custom:error UpdateTypeNotActive Thrown if update type is not active\\n     * @custom:error ZeroAddressNotAllowed Thrown if market is the zero address\\n     * @custom:event UpdatePublished Emitted when the update is successfully published\\n     */\\n    function publishRiskParameterUpdate(\\n        string memory referenceId,\\n        bytes memory newValue,\\n        string memory updateType,\\n        address market,\\n        uint96 poolId,\\n        uint32 dstEid,\\n        bytes memory additionalData\\n    ) external;\\n\\n    /**\\n     * @notice Publishes multiple risk parameter updates in a single transaction.\\n     * @param referenceIds Array of external reference IDs, one for each update\\n     * @param newValues Array of new values for each update (encoded as bytes)\\n     * @param updateTypes Array of update types, all must be active update types\\n     * @param markets Array of market addresses for each update\\n     * @param poolIds Array of pool identifiers for eMode-style collateral configuration (0 for regular markets)\\n     * @param dstEid Array of destination endpoint IDs for cross-chain routing\\n     * @param additionalData Array of additional data for each update\\n     * @custom:error SenderNotAuthorized Thrown if caller is not an authorized sender\\n     * @custom:error ArrayLengthMismatch Thrown if all arrays don't have the same length\\n     * @custom:error UpdateTypeNotActive Thrown if any update type is not active\\n     * @custom:error ZeroAddressNotAllowed Thrown if any market is the zero address\\n     * @custom:event UpdatePublished Emitted for each successfully published update\\n     */\\n    function publishBulkRiskParameterUpdates(\\n        string[] memory referenceIds,\\n        bytes[] memory newValues,\\n        string[] memory updateTypes,\\n        address[] memory markets,\\n        uint96[] memory poolIds,\\n        uint32[] memory dstEid,\\n        bytes[] memory additionalData\\n    ) external;\\n}\\n\",\"keccak256\":\"0x8a30b030d5be3cefabf55d889d0a06447613a9ada5a917730b7ec833bda167cd\",\"license\":\"MIT\"},\"contracts/RiskSteward/Interfaces/IRiskSteward.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport { RiskParameterUpdate } from \\\"./IRiskOracle.sol\\\";\\nimport { IRiskStewardReceiver } from \\\"./IRiskStewardReceiver.sol\\\";\\n\\n/**\\n * @title IRiskSteward\\n * @author Venus\\n * @notice Interface for risk stewards that validate and apply risk parameter updates\\n */\\ninterface IRiskSteward {\\n    /**\\n     * @notice Returns the `IRiskStewardReceiver` associated with this steward.\\n     * @return The risk steward receiver contract\\n     */\\n    function RISK_STEWARD_RECEIVER() external view returns (IRiskStewardReceiver);\\n\\n    /**\\n     * @notice Checks whether an update is safe for direct execution (no timelock required).\\n     * @param update The risk parameter update to evaluate\\n     * @return True if update is safe for direct execution, false if timelock is required\\n     */\\n    function isSafeForDirectExecution(RiskParameterUpdate calldata update) external view returns (bool);\\n\\n    /**\\n     * @notice Applies a validated risk parameter update.\\n     * @param update The risk parameter update to apply\\n     */\\n    function applyUpdate(RiskParameterUpdate calldata update) external;\\n}\\n\",\"keccak256\":\"0x6438497d6fd62f5e8c224a01e626a92ae2ebbe736852749862ff2f040a25b069\",\"license\":\"BSD-3-Clause\"},\"contracts/RiskSteward/Interfaces/IRiskStewardReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\ninterface IRiskStewardReceiver {\\n    /**\\n     * @notice Status of an update\\n     */\\n    enum UpdateStatus {\\n        None,\\n        Pending,\\n        Executed,\\n        Rejected,\\n        Expired,\\n        SENT_TO_DESTINATION\\n    }\\n\\n    /**\\n     * @notice Configuration for a risk parameter update type\\n     * @param active Whether this update type configuration is currently active\\n     * @param debounce Minimum delay between consecutive update executions for the same (updateType, market) pair\\n     * @param timelock Period that must pass after registration before an update can be executed\\n     * @param riskSteward Address of the risk steward contract responsible for processing this update type\\n     */\\n    struct RiskParamConfig {\\n        bool active;\\n        uint256 debounce;\\n        uint256 timelock;\\n        address riskSteward;\\n    }\\n\\n    /**\\n     * @notice Registered update structure with timelock and execution information\\n     * @param updateId Update ID from the Risk Oracle\\n     * @param unlockTime Timestamp when this update can be executed (calculated as registration time + timelock)\\n     * @param status Current status of the update (Pending, Executed, Rejected, Expired, etc.)\\n     * @param executor Address of the executor who executed this update (address(0) if not executed yet)\\n     * @param executedAt Timestamp when this update was executed (0 if not executed yet)\\n     */\\n    struct RegisteredUpdate {\\n        uint256 updateId;\\n        uint256 unlockTime;\\n        UpdateStatus status;\\n        address executor;\\n        uint256 executedAt;\\n    }\\n\\n    /**\\n     * @notice Event emitted when a risk parameter config is set\\n     */\\n    event RiskParameterConfigUpdated(\\n        bytes32 indexed updateTypeHash,\\n        string updateType,\\n        address indexed previousRiskSteward,\\n        address indexed riskSteward,\\n        uint256 previousDebounce,\\n        uint256 debounce,\\n        uint256 previousTimelock,\\n        uint256 timelock,\\n        bool previousActive,\\n        bool active\\n    );\\n\\n    /**\\n     * @notice Event emitted when a risk parameter config active status is set\\n     */\\n    event ConfigActiveUpdated(bytes32 indexed updateTypeHash, string updateType, bool previousActive, bool active);\\n\\n    /**\\n     * @notice Event emitted when an update is successfully executed\\n     */\\n    event UpdateExecuted(uint256 indexed updateId);\\n\\n    /**\\n     * @notice Event emitted when an update is rejected\\n     */\\n    event UpdateRejected(uint256 indexed updateId);\\n\\n    /**\\n     * @notice Event emitted when an update is marked as expired\\n     */\\n    event UpdateExpired(uint256 indexed updateId);\\n\\n    /**\\n     * @notice Event emitted when an executor status is set\\n     */\\n    event ExecutorStatusUpdated(address indexed executor, bool previousApproved, bool approved);\\n\\n    /**\\n     * @notice Event emitted when an update is registered\\n     */\\n    event UpdateRegistered(uint256 indexed updateId, uint256 unlockTime, string updateType, address indexed market);\\n\\n    /**\\n     * @notice Event emitted when an update is sent to a destination chain\\n     */\\n    event UpdateSentToDestination(\\n        uint256 updateId,\\n        uint32 indexed destLzEid,\\n        string indexed updateType,\\n        address indexed market\\n    );\\n\\n    /**\\n     * @notice Event emitted when an update is resent to a destination chain\\n     */\\n    event UpdateResentToDestination(\\n        uint256 updateId,\\n        uint32 indexed destLzEid,\\n        string indexed updateType,\\n        address indexed market\\n    );\\n\\n    /**\\n     * @notice Emitted when leftover native tokens are swept by owner\\n     */\\n    event SweepNative(address indexed receiver, uint256 amount);\\n\\n    /**\\n     * @notice Event emitted when the pause status changes\\n     * @param previousPaused Previous pause state\\n     * @param paused Current pause state\\n     */\\n    event PauseStatusUpdated(bool previousPaused, bool paused);\\n\\n    /**\\n     * @custom:error TransferFailed\\n     */\\n    error TransferFailed();\\n\\n    /**\\n     * @notice Thrown if a submitted update is not active and therefore cannot be processed\\n     */\\n    error ConfigNotActive();\\n\\n    /**\\n     * @notice Thrown when an update was not applied within the required time frame\\n     */\\n    error UpdateIsExpired();\\n\\n    /**\\n     * @notice Thrown when an update has already been processed\\n     */\\n    error UpdateAlreadyResolved();\\n\\n    /**\\n     * @notice Thrown when the debounce period hasn't passed for applying an update to a specific market / update type\\n     */\\n    error UpdateTooFrequent();\\n\\n    /**\\n     * @notice Thrown when an update type that is not supported is operated on\\n     */\\n    error UnsupportedUpdateType();\\n\\n    /**\\n     * @notice Thrown when an empty update type string is provided\\n     */\\n    error InvalidUpdateType();\\n\\n    /**\\n     * @notice Thrown when a debounce value of 0 is set\\n     */\\n    error InvalidDebounce();\\n\\n    /**\\n     * @notice Thrown when a timelock value is greater than or equal to the expiration time\\n     */\\n    error InvalidTimelock();\\n\\n    /**\\n     * @notice Thrown when update unlock time has not been reached\\n     */\\n    error UpdateNotUnlocked();\\n\\n    /**\\n     * @notice Thrown when trying to resolve an update that doesn't exist\\n     */\\n    error UpdateNotFound();\\n\\n    /**\\n     * @notice Thrown when an address is not an executor\\n     */\\n    error NotAnExecutor();\\n\\n    /**\\n     * @notice Thrown when there is a non-expired pending update of the same type for the market\\n     */\\n    error RegisteredUpdateTypeExist(uint256);\\n\\n    /**\\n     * @notice Thrown when trying to resend an update that is not in SENT_TO_DESTINATION status\\n     */\\n    error InvalidUpdateToResend();\\n\\n    /**\\n     * @notice Thrown when trying to execute an update that was never registered\\n     */\\n    error InvalidRegisteredUpdate();\\n\\n    /**\\n     * @notice Thrown when attempting to call lzSend from an address other than this contract\\n     */\\n    error InvalidLzSendCaller();\\n\\n    /**\\n     * @notice Thrown when trying to renounce ownership\\n     */\\n    error RenounceOwnershipNotAllowed();\\n\\n    /**\\n     * @notice Thrown when processUpdate is called while the contract is paused\\n     */\\n    error PausedError();\\n\\n    /**\\n     * @notice Thrown when an invalid LayerZero endpoint ID is provided\\n     */\\n    error InvalidLayerZeroEid();\\n\\n    /**\\n     * @notice Thrown when trying to set the same pause status\\n     */\\n    error PauseStatusUnchanged();\\n\\n    /**\\n     * @notice Thrown when trying to set the same config active status\\n     */\\n    error ConfigStatusUnchanged();\\n\\n    /**\\n     * @notice Thrown when trying to set the same executor whitelist status\\n     */\\n    error ExecutorStatusUnchanged();\\n\\n    /**\\n     * @notice Thrown when an update will expire before its timelock unlocks\\n     */\\n    error UpdateWillExpireBeforeUnlock();\\n\\n    function getRiskParameterConfig(string calldata updateType) external view returns (RiskParamConfig memory);\\n\\n    function getLastProcessedUpdate(string calldata updateType, address market) external view returns (uint256);\\n\\n    function getLastRegisteredUpdate(string calldata updateType, address market) external view returns (uint256);\\n\\n    function setRiskParameterConfig(\\n        string calldata updateType,\\n        address riskSteward,\\n        uint256 debounce,\\n        uint256 timelock\\n    ) external;\\n\\n    function setConfigActive(string calldata updateType, bool active) external;\\n\\n    function setWhitelistedExecutor(address executor, bool approved) external;\\n\\n    function processUpdate(uint256 updateId) external;\\n\\n    function executeRegisteredUpdate(uint256 updateId) external;\\n\\n    function rejectUpdate(uint256 updateId) external;\\n\\n    function resendRemoteUpdate(uint256 updateId, bytes calldata options) external payable;\\n\\n    function getExecutableUpdates(\\n        string calldata updateType,\\n        address comptroller\\n    ) external view returns (uint256[] memory executableUpdates);\\n\\n    function isUpdateExecutable(uint256 updateId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x206b4763cfe62155718edb4b53ee48d6e5204b81cbfac705808d2ffd3225bb12\",\"license\":\"BSD-3-Clause\"},\"contracts/interfaces/IIsolatedPoolsComptroller.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\ninterface IIsolatedPoolsComptroller {\\n    function borrowCaps(address) external view returns (uint256);\\n\\n    function supplyCaps(address) external view returns (uint256);\\n\\n    function setMarketSupplyCaps(address[] calldata, uint256[] calldata) external;\\n\\n    function setMarketBorrowCaps(address[] calldata, uint256[] calldata) external;\\n\\n    function getAllMarkets() external view returns (address[] memory);\\n\\n    function setCollateralFactor(\\n        address vToken,\\n        uint256 newCollateralFactorMantissa,\\n        uint256 newLiquidationThresholdMantissa\\n    ) external;\\n\\n    function markets(\\n        address vToken\\n    ) external view returns (bool isListed, uint256 collateralFactorMantissa, uint256 liquidationThresholdMantissa);\\n}\\n\",\"keccak256\":\"0x6cd545ea18e7b5fbd1d3b0a4162584eb0c1b466db46c62d96015091c47374930\",\"license\":\"BSD-3-Clause\"}},\"version\":1}",
  "bytecode": "0x60c060405234801561001057600080fd5b5060405161418938038061418983398101604081905261002f9161016d565b6001600160a01b038216608052610044610083565b61004d82610143565b8063ffffffff16600003610074576040516349961c7360e11b815260040160405180910390fd5b63ffffffff1660a052506101bc565b600054610100900460ff16156100ef5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015610141576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811661016a576040516342bcdf7f60e11b815260040160405180910390fd5b50565b6000806040838503121561018057600080fd5b82516001600160a01b038116811461019757600080fd5b602084015190925063ffffffff811681146101b157600080fd5b809150509250929050565b60805160a051613f9a6101ef60003960006103d101526000818161041a015281816108320152611d3d0152613f9a6000f3fe6080604052600436106102345760003560e01c80638da5cb5b11610138578063ca136b99116100b0578063f2fde38b1161007f578063f63106e411610064578063f63106e41461079f578063fe2b3502146107cc578063ff7bd03d146107fc57600080fd5b8063f2fde38b14610752578063f5d3b7b31461077257600080fd5b8063ca136b99146106de578063ca5eb5e1146106fe578063e2509c761461071e578063e30c39781461073457600080fd5b8063b4a0bdf311610107578063bb0b6a53116100ec578063bb0b6a531461064c578063be3881b41461069e578063c3e10deb146106be57600080fd5b8063b4a0bdf3146105fe578063b4c2f7271461061c57600080fd5b80638da5cb5b14610519578063a49e9ea114610537578063af9e0fd31461056f578063b080d71d146105de57600080fd5b8063438653fe116101cb578063715018a61161019a57806379edd1001161017f57806379edd1001461047e5780637d25a05e1461049e57806382413eac146104da57600080fd5b8063715018a61461045457806379ba50971461046957600080fd5b8063438653fe1461037f578063485cc9551461039f5780634c213449146103bf5780635e280f111461040857600080fd5b806317442b701161020757806317442b70146102d057806328207141146102f25780633400288b1461033f5780633aed7f311461035f57600080fd5b8063050d8986146102395780630e32cb861461026357806313137d6514610285578063170338c814610298575b600080fd5b34801561024557600080fd5b506102506202a30081565b6040519081526020015b60405180910390f35b34801561026f57600080fd5b5061028361027e3660046131cc565b61081c565b005b61028361029336600461324a565b610830565b3480156102a457600080fd5b506102506102b33660046132ea565b60cd60209081526000928352604080842090915290825290205481565b3480156102dc57600080fd5b506040805160008152600260208201520161025a565b3480156102fe57600080fd5b5061031261030d36600461331a565b610922565b6040805182511515815260208084015190820152918101516001600160a01b03169082015260600161025a565b34801561034b57600080fd5b5061028361035a366004613370565b6109a1565b34801561036b57600080fd5b5061028361037a3660046133a8565b610a20565b34801561038b57600080fd5b5061028361039a3660046133d6565b610b09565b3480156103ab57600080fd5b506102836103ba36600461342d565b610c6a565b3480156103cb57600080fd5b506103f37f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161025a565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161025a565b34801561046057600080fd5b50610283610e21565b34801561047557600080fd5b50610283610e53565b34801561048a57600080fd5b5061028361049936600461345b565b610ef8565b3480156104aa57600080fd5b506104c16104b9366004613370565b600092915050565b60405167ffffffffffffffff909116815260200161025a565b3480156104e657600080fd5b506105096104f5366004613474565b6001600160a01b0381163014949350505050565b604051901515815260200161025a565b34801561052557600080fd5b506033546001600160a01b031661043c565b34801561054357600080fd5b506102506105523660046132ea565b60cc60209081526000928352604080842090915290825290205481565b34801561057b57600080fd5b506105b861058a36600461345b565b60ca6020526000908152604090208054600182015460029092015460ff90911691906001600160a01b031683565b60408051931515845260208401929092526001600160a01b03169082015260600161025a565b3480156105ea57600080fd5b506102836105f93660046134db565b611589565b34801561060a57600080fd5b506097546001600160a01b031661043c565b34801561062857600080fd5b5061063c61063736600461345b565b611725565b60405161025a94939291906136fb565b34801561065857600080fd5b5061025061066736600461373b565b63ffffffff1660009081527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f900602052604090205490565b3480156106aa57600080fd5b506102506106b9366004613756565b611ad0565b3480156106ca57600080fd5b506102836106d936600461345b565b611b18565b3480156106ea57600080fd5b506102836106f936600461345b565b611bff565b34801561070a57600080fd5b506102836107193660046131cc565b611cfd565b34801561072a57600080fd5b5061025060c95481565b34801561074057600080fd5b506065546001600160a01b031661043c565b34801561075e57600080fd5b5061028361076d3660046131cc565b611d9c565b34801561077e57600080fd5b5061079261078d366004613756565b611dad565b60405161025a91906137a2565b3480156107ab57600080fd5b506107bf6107ba366004613756565b61224d565b60405161025a91906137fa565b3480156107d857600080fd5b506105096107e73660046131cc565b60ce6020526000908152604090205460ff1681565b34801561080857600080fd5b5061050961081736600461383e565b612508565b610824612526565b61082d8161259c565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314610899576040517f91ac5e4f0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b602087018035906108b3906108ae908a61373b565b6126a4565b1461090a576108c5602088018861373b565b6040517fc26bebcc00000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260208801356024820152604401610890565b6109198787878787878761271a565b50505050505050565b60408051606081018252600080825260208201819052918101919091526000838360405161095192919061385a565b60408051918290038220600090815260ca602090815290829020606084018352805460ff1615158452600181015491840191909152600201546001600160a01b0316908201529150505b92915050565b6109a9612526565b63ffffffff821660008181527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f900602081815260409283902085905582519384528301849052917f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b91015b60405180910390a1505050565b610a41604051806060016040528060248152602001613f1360249139612a6e565b610a4a82612b3e565b6001600160a01b038216600090815260ce602052604090205460ff1681151581151503610aa3576040517f8eee990d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815260ce6020908152604091829020805460ff191686151590811790915582518515158152918201527f10c0e7519c24c8e42dbd4d2405e9976e893c51df86614145b2758289f197ec3b910160405180910390a2505050565b610b476040518060400160405280601c81526020017f736574436f6e66696741637469766528737472696e672c626f6f6c2900000000815250612a6e565b60008383604051610b5992919061385a565b6040805191829003909120600081815260ca60205291909120600201549091506001600160a01b0316610bb8576040517f80919d7b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260ca602052604090205460ff1682151581151503610c07576040517f01e852dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260ca602052604090819020805460ff1916851515908117909155905183907fcba816b2fc5cd49700523a79b6e6c7dda19292fbb932cca77f7bccb1e500479290610c5b90899089908790613895565b60405180910390a35050505050565b600054610100900460ff1615808015610c8a5750600054600160ff909116105b80610ca45750303b158015610ca4575060005460ff166001145b610d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610890565b6000805460ff191660011790558015610d7057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d7983612b7e565b610d8282612c26565b61546060c98190556040519081527fa1c2964049f672e1cba842d393f777ed468b9846eb7de186d7e73665a326b3019060200160405180910390a18015610e1c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610a13565b505050565b6040517f96c553eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60655433906001600160a01b03168114610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610890565b61082d81612cc6565b33600090815260ce602052604090205460ff16610f41576040517f341f61ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260cb602052604080822081516101808101909252805490929190839082908290610f6f906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9b906138bb565b8015610fe85780601f10610fbd57610100808354040283529160200191610fe8565b820191906000526020600020905b815481529060010190602001808311610fcb57829003601f168201915b50505091835250506001820154602082015260028201546001600160a01b03166040820152600382018054606090920191611022906138bb565b80601f016020809104026020016040519081016040528092919081815260200182805461104e906138bb565b801561109b5780601f106110705761010080835404028352916020019161109b565b820191906000526020600020905b81548152906001019060200180831161107e57829003601f168201915b50505050508152602001600482015481526020016005820180546110be906138bb565b80601f01602080910402602001604051908101604052809291908181526020018280546110ea906138bb565b80156111375780601f1061110c57610100808354040283529160200191611137565b820191906000526020600020905b81548152906001019060200180831161111a57829003601f168201915b50505050508152602001600682018054611150906138bb565b80601f016020809104026020016040519081016040528092919081815260200182805461117c906138bb565b80156111c95780601f1061119e576101008083540402835291602001916111c9565b820191906000526020600020905b8154815290600101906020018083116111ac57829003601f168201915b50505091835250506007820154602082015260088201546001600160a01b03811660408301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff166060820152600982015463ffffffff166080820152600a8201805460a09092019161123f906138bb565b80601f016020809104026020016040519081016040528092919081815260200182805461126b906138bb565b80156112b85780601f1061128d576101008083540402835291602001916112b8565b820191906000526020600020905b81548152906001019060200180831161129b57829003601f168201915b505050919092525050506080810151600081815260ca6020526040902080549293509091429060ff16611317576040517fdea2a21200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600b86015460ff16600381111561133257611332613691565b14611369576040517f6196e5a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c95485600c015461137b9190613937565b8110156113b4576040517f05f5f49800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806202a3008560e001516113c89190613937565b1015611400576040517fc2a16f1400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260cd60209081526040808320878201516001600160a01b0316845290915290205480158015906114435750818360010154826114419190613937565b115b1561147a576040517f53f7a6ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260cd60209081526040808320888201516001600160a01b039081168552925291829020849055600b88018054600260ff199091168117909155600d890180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905585015491517fbf63783900000000000000000000000000000000000000000000000000000000815291169063bf6378399061152390889060040161394a565b600060405180830381600087803b15801561153d57600080fd5b505af1158015611551573d6000803e3d6000fd5b50506040518992507f27f52b13359f1687e1c3c6179b59fd5f217e9f580e76053c074a51d65de2dac79150600090a250505050505050565b6115aa6040518060600160405280602e8152602001613f37602e9139612a6e565b6115b382612b3e565b8215806115c05750604083115b156115f6576040517e64280000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003611630576040517ff6ea4e0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848460405161164292919061385a565b60408051918290038220600081815260ca602081815284832060608701865260018088528288018a81526001600160a01b038c81168a8a0181815297899052959094529751825460ff19169015159081178355975181830181905594516002830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919094169081179093559551949750959194909387937f2cbea64d1a2ece216f5461b535881b82196130c6a988a9d3b323bd6d5cfe608e93611715938e938e93928d9260ff9091169161395d565b60405180910390a4505050505050565b60cb6020528060005260406000206000915090508060000160405180610180016040529081600082018054611759906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611785906138bb565b80156117d25780601f106117a7576101008083540402835291602001916117d2565b820191906000526020600020905b8154815290600101906020018083116117b557829003601f168201915b50505091835250506001820154602082015260028201546001600160a01b0316604082015260038201805460609092019161180c906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611838906138bb565b80156118855780601f1061185a57610100808354040283529160200191611885565b820191906000526020600020905b81548152906001019060200180831161186857829003601f168201915b50505050508152602001600482015481526020016005820180546118a8906138bb565b80601f01602080910402602001604051908101604052809291908181526020018280546118d4906138bb565b80156119215780601f106118f657610100808354040283529160200191611921565b820191906000526020600020905b81548152906001019060200180831161190457829003601f168201915b5050505050815260200160068201805461193a906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611966906138bb565b80156119b35780601f10611988576101008083540402835291602001916119b3565b820191906000526020600020905b81548152906001019060200180831161199657829003601f168201915b50505091835250506007820154602082015260088201546001600160a01b03811660408301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff166060820152600982015463ffffffff166080820152600a8201805460a090920191611a29906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611a55906138bb565b8015611aa25780601f10611a7757610100808354040283529160200191611aa2565b820191906000526020600020905b815481529060010190602001808311611a8557829003601f168201915b50505091909252505050600b820154600c830154600d90930154919260ff909116916001600160a01b031684565b6000808484604051611ae392919061385a565b6040805191829003909120600090815260cd60209081528282206001600160a01b0387168352905220549150505b9392505050565b33600090815260ce602052604090205460ff16611b61576040517f341f61ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260cb602052604090206001600b82015460ff166003811115611b8a57611b8a613691565b14611bc1576040517f6196e5a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b8101805460ff1916600317905560405182907f0a4273908b9362e571cacd5610879e3dfd7ddc7c9b3ce1d7ea7ea8b41869116490600090a25050565b611c3d6040518060400160405280601781526020017f73657452656d6f746544656c61792875696e7432353629000000000000000000815250612a6e565b801580611c4d57506202a3008110155b15611c84576040517f545f991300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c954818103611cc0576040517fbb45c33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c98290556040518281527fa1c2964049f672e1cba842d393f777ed468b9846eb7de186d7e73665a326b301906020015b60405180910390a15050565b611d05612526565b6040517fca5eb5e10000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190602401600060405180830381600087803b158015611d8157600080fd5b505af1158015611d95573d6000803e3d6000fd5b5050505050565b611da4612526565b61082d81612ccf565b6040805161020081018252606060808201818152600060a0840181905260c0840181905260e08401839052610100840181905261012084018390526101408401839052610160840181905261018084018190526101a084018190526101c084018190526101e084018390529083526020830181905292820183905281019190915260008484604051611e4092919061385a565b60408051918290038220600081815260cc60209081528382206001600160a01b038916835281528382205480835260cb909152908390206102008501909352825491945092919082906080820190839082908290611e9d906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec9906138bb565b8015611f165780601f10611eeb57610100808354040283529160200191611f16565b820191906000526020600020905b815481529060010190602001808311611ef957829003601f168201915b50505091835250506001820154602082015260028201546001600160a01b03166040820152600382018054606090920191611f50906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7c906138bb565b8015611fc95780601f10611f9e57610100808354040283529160200191611fc9565b820191906000526020600020905b815481529060010190602001808311611fac57829003601f168201915b5050505050815260200160048201548152602001600582018054611fec906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054612018906138bb565b80156120655780601f1061203a57610100808354040283529160200191612065565b820191906000526020600020905b81548152906001019060200180831161204857829003601f168201915b5050505050815260200160068201805461207e906138bb565b80601f01602080910402602001604051908101604052809291908181526020018280546120aa906138bb565b80156120f75780601f106120cc576101008083540402835291602001916120f7565b820191906000526020600020905b8154815290600101906020018083116120da57829003601f168201915b50505091835250506007820154602082015260088201546001600160a01b03811660408301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff166060820152600982015463ffffffff166080820152600a8201805460a09092019161216d906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054612199906138bb565b80156121e65780601f106121bb576101008083540402835291602001916121e6565b820191906000526020600020905b8154815290600101906020018083116121c957829003601f168201915b505050919092525050508152600b82015460209091019060ff16600381111561221157612211613691565b600381111561222257612222613691565b8152600c8201546020820152600d909101546001600160a01b03166040909101529695505050505050565b60606000848460405161226192919061385a565b604051809103902090506000836001600160a01b031663b0772d0b6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156122ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122d39190810190613a22565b805190915060008167ffffffffffffffff8111156122f3576122f3613998565b60405190808252806020026020018201604052801561231c578160200160208202803683370190505b50600085815260ca602052604081208054929350909160ff166123565750506040805160008152602081019091529450611b119350505050565b60005b8481101561246a57600086828151811061237557612375613ad4565b60209081029190910181015160008a815260cc835260408082206001600160a01b038416835284528082205480835260cb90945290209092506123b782612d58565b6123c357505050612462565b60c95481600c01546123d59190613937565b4210156123e457505050612462565b60008a815260cd602090815260408083206001600160a01b038716845290915290205480158015906124245750428660010154826124229190613937565b115b156124325750505050612462565b8288888151811061244557612445613ad4565b60209081029190910101528661245a81613b03565b975050505050505b600101612359565b508167ffffffffffffffff81111561248457612484613998565b6040519080825280602002602001820160405280156124ad578160200160208202803683370190505b50965060005b828110156124fa578381815181106124cd576124cd613ad4565b60200260200101518882815181106124e7576124e7613ad4565b60209081029190910101526001016124b3565b505050505050509392505050565b60006020820180359061251f90610667908561373b565b1492915050565b6033546001600160a01b0316331461259a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610890565b565b6001600160a01b038116612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e6167657220616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610890565b609780546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa09101611cf1565b63ffffffff811660009081527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f9006020819052604082205480611b11576040517ff6ff4fb700000000000000000000000000000000000000000000000000000000815263ffffffff85166004820152602401610890565b600061272885870187613bc7565b60208101519091504260008083815260cb60205260409020600b015460ff16600381111561275857612758613691565b146127c75782604001516001600160a01b0316836060015160405161277d9190613d2e565b6040518091039020837f6f2b8853cd821aee89a0dc78a586658bcbd9c930d3d25be1de720fa0346bd73b846040516127b791815260200190565b60405180910390a4505050610919565b6080830151600090815260cc60209081526040808320818701516001600160a01b031684529091529020546127fb81612d58565b1561286b5783604001516001600160a01b031684606001516040516128209190613d2e565b6040518091039020827fa5cf028a8d57c7fae7982ac3692bb4bdf11ddcca7c93493242a00f4957a5ebb78560405161285a91815260200190565b60405180910390a450505050610919565b600083815260cb60205260409020845185908290819061288b9082613d9a565b506020820151600182015560408201516002820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055606082015160038201906128e89082613d9a565b506080820151600482015560a082015160058201906129079082613d9a565b5060c0820151600682019061291c9082613d9a565b5060e082015160078201556101008201516101208301516bffffffffffffffffffffffff1674010000000000000000000000000000000000000000026001600160a01b0390911617600882015561014082015160098201805463ffffffff9092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909216919091179055610160820151600a8201906129bc9082613d9a565b505050600b8101805460ff19166001179055600c81018390556080850151600090815260cc6020908152604080832081890180516001600160a01b0390811686529190935292819020879055905160608801519151921691612a1e9190613d2e565b6040518091039020857fd5a7f72731c4bc3d3a2da54b4c53b429270f8d7f8c5b053d9ee98e072f87584086604051612a5891815260200190565b60405180910390a4505050505050505050505050565b6097546040517f18c5e8ab0000000000000000000000000000000000000000000000000000000081526000916001600160a01b0316906318c5e8ab90612aba9033908690600401613e96565b602060405180830381865afa158015612ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612afb9190613ec0565b905080612b3a573330836040517f4a3fa29300000000000000000000000000000000000000000000000000000000815260040161089093929190613edd565b5050565b6001600160a01b03811661082d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16612c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b612c1d612dbf565b61082d81612e5e565b600054610100900460ff16612cbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b61082d81612ef5565b61082d81612f95565b612cd7612526565b606580546001600160a01b0383167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155612d206033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600081600003612d6a57506000919050565b600082815260cb602052604090206001600b82015460ff166003811115612d9357612d93613691565b14612da15750600092915050565b60078101544290612db6906202a30090613937565b10159392505050565b600054610100900460ff16612e56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b61259a612fc6565b600054610100900460ff16610824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b600054610100900460ff16612f8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b61082d81613066565b606580547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561082d8161313d565b600054610100900460ff1661305d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b61259a33612cc6565b600054610100900460ff166130fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b6001600160a01b038116611d05576040517fb586360400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038116811461082d57600080fd5b80356131c7816131a7565b919050565b6000602082840312156131de57600080fd5b8135611b11816131a7565b6000606082840312156131fb57600080fd5b50919050565b60008083601f84011261321357600080fd5b50813567ffffffffffffffff81111561322b57600080fd5b60208301915083602082850101111561324357600080fd5b9250929050565b600080600080600080600060e0888a03121561326557600080fd5b61326f89896131e9565b965060608801359550608088013567ffffffffffffffff8082111561329357600080fd5b61329f8b838c01613201565b909750955060a08a013591506132b4826131a7565b90935060c089013590808211156132ca57600080fd5b506132d78a828b01613201565b989b979a50959850939692959293505050565b600080604083850312156132fd57600080fd5b82359150602083013561330f816131a7565b809150509250929050565b6000806020838503121561332d57600080fd5b823567ffffffffffffffff81111561334457600080fd5b61335085828601613201565b90969095509350505050565b803563ffffffff811681146131c757600080fd5b6000806040838503121561338357600080fd5b61338c8361335c565b946020939093013593505050565b801515811461082d57600080fd5b600080604083850312156133bb57600080fd5b82356133c6816131a7565b9150602083013561330f8161339a565b6000806000604084860312156133eb57600080fd5b833567ffffffffffffffff81111561340257600080fd5b61340e86828701613201565b90945092505060208401356134228161339a565b809150509250925092565b6000806040838503121561344057600080fd5b823561344b816131a7565b9150602083013561330f816131a7565b60006020828403121561346d57600080fd5b5035919050565b60008060008060a0858703121561348a57600080fd5b61349486866131e9565b9350606085013567ffffffffffffffff8111156134b057600080fd5b6134bc87828801613201565b90945092505060808501356134d0816131a7565b939692955090935050565b600080600080606085870312156134f157600080fd5b843567ffffffffffffffff81111561350857600080fd5b61351487828801613201565b9095509350506020850135613528816131a7565b9396929550929360400135925050565b60005b8381101561355357818101518382015260200161353b565b50506000910152565b60008151808452613574816020860160208601613538565b601f01601f19169290920160200192915050565b6000610180825181855261359e8286018261355c565b9150506020830151602085015260408301516135c560408601826001600160a01b03169052565b50606083015184820360608601526135dd828261355c565b9150506080830151608085015260a083015184820360a0860152613601828261355c565b91505060c083015184820360c086015261361b828261355c565b91505060e083015160e085015261010080840151613643828701826001600160a01b03169052565b5050610120838101516bffffffffffffffffffffffff16908501526101408084015163ffffffff16908501526101608084015185830382870152613687838261355c565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106136f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60808152600061370e6080830187613588565b905061371d60208301866136c0565b8360408301526001600160a01b038316606083015295945050505050565b60006020828403121561374d57600080fd5b611b118261335c565b60008060006040848603121561376b57600080fd5b833567ffffffffffffffff81111561378257600080fd5b61378e86828701613201565b9094509250506020840135613422816131a7565b6020815260008251608060208401526137be60a0840182613588565b905060208401516137d260408501826136c0565b50604084015160608401526001600160a01b0360608501511660808401528091505092915050565b6020808252825182820181905260009190848201906040850190845b8181101561383257835183529284019291840191600101613816565b50909695505050505050565b60006060828403121561385057600080fd5b611b1183836131e9565b8183823760009101908152919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6040815260006138a960408301858761386a565b90508215156020830152949350505050565b600181811c908216806138cf57607f821691505b6020821081036131fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561099b5761099b613908565b602081526000611b116020830184613588565b60a08152600061397160a08301888a61386a565b60208301969096525060408101939093529015156060830152151560809091015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610180810167ffffffffffffffff811182821017156139eb576139eb613998565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a1a57613a1a613998565b604052919050565b60006020808385031215613a3557600080fd5b825167ffffffffffffffff80821115613a4d57600080fd5b818501915085601f830112613a6157600080fd5b815181811115613a7357613a73613998565b8060051b9150613a848483016139f1565b8181529183018401918481019088841115613a9e57600080fd5b938501935b83851015613ac85784519250613ab8836131a7565b8282529385019390850190613aa3565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b3457613b34613908565b5060010190565b600082601f830112613b4c57600080fd5b813567ffffffffffffffff811115613b6657613b66613998565b613b796020601f19601f840116016139f1565b818152846020838601011115613b8e57600080fd5b816020850160208301376000918101602001919091529392505050565b80356bffffffffffffffffffffffff811681146131c757600080fd5b600060208284031215613bd957600080fd5b813567ffffffffffffffff80821115613bf157600080fd5b908301906101808286031215613c0657600080fd5b613c0e6139c7565b823582811115613c1d57600080fd5b613c2987828601613b3b565b82525060208301356020820152613c42604084016131bc565b6040820152606083013582811115613c5957600080fd5b613c6587828601613b3b565b6060830152506080830135608082015260a083013582811115613c8757600080fd5b613c9387828601613b3b565b60a08301525060c083013582811115613cab57600080fd5b613cb787828601613b3b565b60c08301525060e083013560e0820152610100613cd58185016131bc565b90820152610120613ce7848201613bab565b90820152610140613cf984820161335c565b908201526101608381013583811115613d1157600080fd5b613d1d88828701613b3b565b918301919091525095945050505050565b60008251613d40818460208701613538565b9190910192915050565b601f821115610e1c576000816000526020600020601f850160051c81016020861015613d735750805b601f850160051c820191505b81811015613d9257828155600101613d7f565b505050505050565b815167ffffffffffffffff811115613db457613db4613998565b613dc881613dc284546138bb565b84613d4a565b602080601f831160018114613e1b5760008415613de55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613d92565b600085815260208120601f198616915b82811015613e4a57888601518255948401946001909101908401613e2b565b5085821015613e8657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0383168152604060208201526000613eb8604083018461355c565b949350505050565b600060208284031215613ed257600080fd5b8151611b118161339a565b60006001600160a01b03808616835280851660208401525060606040830152613f09606083018461355c565b9594505050505056fe73657457686974656c69737465644578656375746f7228616464726573732c626f6f6c297365745269736b506172616d65746572436f6e66696728737472696e672c616464726573732c75696e7432353629a2646970667358221220283f03b217042f9ed682cd3c3ca7600a0d6fd92a605768750715bbed92710ee964736f6c63430008190033",
  "deployedBytecode": "0x6080604052600436106102345760003560e01c80638da5cb5b11610138578063ca136b99116100b0578063f2fde38b1161007f578063f63106e411610064578063f63106e41461079f578063fe2b3502146107cc578063ff7bd03d146107fc57600080fd5b8063f2fde38b14610752578063f5d3b7b31461077257600080fd5b8063ca136b99146106de578063ca5eb5e1146106fe578063e2509c761461071e578063e30c39781461073457600080fd5b8063b4a0bdf311610107578063bb0b6a53116100ec578063bb0b6a531461064c578063be3881b41461069e578063c3e10deb146106be57600080fd5b8063b4a0bdf3146105fe578063b4c2f7271461061c57600080fd5b80638da5cb5b14610519578063a49e9ea114610537578063af9e0fd31461056f578063b080d71d146105de57600080fd5b8063438653fe116101cb578063715018a61161019a57806379edd1001161017f57806379edd1001461047e5780637d25a05e1461049e57806382413eac146104da57600080fd5b8063715018a61461045457806379ba50971461046957600080fd5b8063438653fe1461037f578063485cc9551461039f5780634c213449146103bf5780635e280f111461040857600080fd5b806317442b701161020757806317442b70146102d057806328207141146102f25780633400288b1461033f5780633aed7f311461035f57600080fd5b8063050d8986146102395780630e32cb861461026357806313137d6514610285578063170338c814610298575b600080fd5b34801561024557600080fd5b506102506202a30081565b6040519081526020015b60405180910390f35b34801561026f57600080fd5b5061028361027e3660046131cc565b61081c565b005b61028361029336600461324a565b610830565b3480156102a457600080fd5b506102506102b33660046132ea565b60cd60209081526000928352604080842090915290825290205481565b3480156102dc57600080fd5b506040805160008152600260208201520161025a565b3480156102fe57600080fd5b5061031261030d36600461331a565b610922565b6040805182511515815260208084015190820152918101516001600160a01b03169082015260600161025a565b34801561034b57600080fd5b5061028361035a366004613370565b6109a1565b34801561036b57600080fd5b5061028361037a3660046133a8565b610a20565b34801561038b57600080fd5b5061028361039a3660046133d6565b610b09565b3480156103ab57600080fd5b506102836103ba36600461342d565b610c6a565b3480156103cb57600080fd5b506103f37f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161025a565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161025a565b34801561046057600080fd5b50610283610e21565b34801561047557600080fd5b50610283610e53565b34801561048a57600080fd5b5061028361049936600461345b565b610ef8565b3480156104aa57600080fd5b506104c16104b9366004613370565b600092915050565b60405167ffffffffffffffff909116815260200161025a565b3480156104e657600080fd5b506105096104f5366004613474565b6001600160a01b0381163014949350505050565b604051901515815260200161025a565b34801561052557600080fd5b506033546001600160a01b031661043c565b34801561054357600080fd5b506102506105523660046132ea565b60cc60209081526000928352604080842090915290825290205481565b34801561057b57600080fd5b506105b861058a36600461345b565b60ca6020526000908152604090208054600182015460029092015460ff90911691906001600160a01b031683565b60408051931515845260208401929092526001600160a01b03169082015260600161025a565b3480156105ea57600080fd5b506102836105f93660046134db565b611589565b34801561060a57600080fd5b506097546001600160a01b031661043c565b34801561062857600080fd5b5061063c61063736600461345b565b611725565b60405161025a94939291906136fb565b34801561065857600080fd5b5061025061066736600461373b565b63ffffffff1660009081527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f900602052604090205490565b3480156106aa57600080fd5b506102506106b9366004613756565b611ad0565b3480156106ca57600080fd5b506102836106d936600461345b565b611b18565b3480156106ea57600080fd5b506102836106f936600461345b565b611bff565b34801561070a57600080fd5b506102836107193660046131cc565b611cfd565b34801561072a57600080fd5b5061025060c95481565b34801561074057600080fd5b506065546001600160a01b031661043c565b34801561075e57600080fd5b5061028361076d3660046131cc565b611d9c565b34801561077e57600080fd5b5061079261078d366004613756565b611dad565b60405161025a91906137a2565b3480156107ab57600080fd5b506107bf6107ba366004613756565b61224d565b60405161025a91906137fa565b3480156107d857600080fd5b506105096107e73660046131cc565b60ce6020526000908152604090205460ff1681565b34801561080857600080fd5b5061050961081736600461383e565b612508565b610824612526565b61082d8161259c565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314610899576040517f91ac5e4f0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b602087018035906108b3906108ae908a61373b565b6126a4565b1461090a576108c5602088018861373b565b6040517fc26bebcc00000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260208801356024820152604401610890565b6109198787878787878761271a565b50505050505050565b60408051606081018252600080825260208201819052918101919091526000838360405161095192919061385a565b60408051918290038220600090815260ca602090815290829020606084018352805460ff1615158452600181015491840191909152600201546001600160a01b0316908201529150505b92915050565b6109a9612526565b63ffffffff821660008181527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f900602081815260409283902085905582519384528301849052917f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b91015b60405180910390a1505050565b610a41604051806060016040528060248152602001613f1360249139612a6e565b610a4a82612b3e565b6001600160a01b038216600090815260ce602052604090205460ff1681151581151503610aa3576040517f8eee990d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815260ce6020908152604091829020805460ff191686151590811790915582518515158152918201527f10c0e7519c24c8e42dbd4d2405e9976e893c51df86614145b2758289f197ec3b910160405180910390a2505050565b610b476040518060400160405280601c81526020017f736574436f6e66696741637469766528737472696e672c626f6f6c2900000000815250612a6e565b60008383604051610b5992919061385a565b6040805191829003909120600081815260ca60205291909120600201549091506001600160a01b0316610bb8576040517f80919d7b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260ca602052604090205460ff1682151581151503610c07576040517f01e852dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260ca602052604090819020805460ff1916851515908117909155905183907fcba816b2fc5cd49700523a79b6e6c7dda19292fbb932cca77f7bccb1e500479290610c5b90899089908790613895565b60405180910390a35050505050565b600054610100900460ff1615808015610c8a5750600054600160ff909116105b80610ca45750303b158015610ca4575060005460ff166001145b610d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610890565b6000805460ff191660011790558015610d7057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d7983612b7e565b610d8282612c26565b61546060c98190556040519081527fa1c2964049f672e1cba842d393f777ed468b9846eb7de186d7e73665a326b3019060200160405180910390a18015610e1c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610a13565b505050565b6040517f96c553eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60655433906001600160a01b03168114610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610890565b61082d81612cc6565b33600090815260ce602052604090205460ff16610f41576040517f341f61ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260cb602052604080822081516101808101909252805490929190839082908290610f6f906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9b906138bb565b8015610fe85780601f10610fbd57610100808354040283529160200191610fe8565b820191906000526020600020905b815481529060010190602001808311610fcb57829003601f168201915b50505091835250506001820154602082015260028201546001600160a01b03166040820152600382018054606090920191611022906138bb565b80601f016020809104026020016040519081016040528092919081815260200182805461104e906138bb565b801561109b5780601f106110705761010080835404028352916020019161109b565b820191906000526020600020905b81548152906001019060200180831161107e57829003601f168201915b50505050508152602001600482015481526020016005820180546110be906138bb565b80601f01602080910402602001604051908101604052809291908181526020018280546110ea906138bb565b80156111375780601f1061110c57610100808354040283529160200191611137565b820191906000526020600020905b81548152906001019060200180831161111a57829003601f168201915b50505050508152602001600682018054611150906138bb565b80601f016020809104026020016040519081016040528092919081815260200182805461117c906138bb565b80156111c95780601f1061119e576101008083540402835291602001916111c9565b820191906000526020600020905b8154815290600101906020018083116111ac57829003601f168201915b50505091835250506007820154602082015260088201546001600160a01b03811660408301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff166060820152600982015463ffffffff166080820152600a8201805460a09092019161123f906138bb565b80601f016020809104026020016040519081016040528092919081815260200182805461126b906138bb565b80156112b85780601f1061128d576101008083540402835291602001916112b8565b820191906000526020600020905b81548152906001019060200180831161129b57829003601f168201915b505050919092525050506080810151600081815260ca6020526040902080549293509091429060ff16611317576040517fdea2a21200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600b86015460ff16600381111561133257611332613691565b14611369576040517f6196e5a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c95485600c015461137b9190613937565b8110156113b4576040517f05f5f49800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806202a3008560e001516113c89190613937565b1015611400576040517fc2a16f1400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260cd60209081526040808320878201516001600160a01b0316845290915290205480158015906114435750818360010154826114419190613937565b115b1561147a576040517f53f7a6ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260cd60209081526040808320888201516001600160a01b039081168552925291829020849055600b88018054600260ff199091168117909155600d890180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905585015491517fbf63783900000000000000000000000000000000000000000000000000000000815291169063bf6378399061152390889060040161394a565b600060405180830381600087803b15801561153d57600080fd5b505af1158015611551573d6000803e3d6000fd5b50506040518992507f27f52b13359f1687e1c3c6179b59fd5f217e9f580e76053c074a51d65de2dac79150600090a250505050505050565b6115aa6040518060600160405280602e8152602001613f37602e9139612a6e565b6115b382612b3e565b8215806115c05750604083115b156115f6576040517e64280000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003611630576040517ff6ea4e0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848460405161164292919061385a565b60408051918290038220600081815260ca602081815284832060608701865260018088528288018a81526001600160a01b038c81168a8a0181815297899052959094529751825460ff19169015159081178355975181830181905594516002830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919094169081179093559551949750959194909387937f2cbea64d1a2ece216f5461b535881b82196130c6a988a9d3b323bd6d5cfe608e93611715938e938e93928d9260ff9091169161395d565b60405180910390a4505050505050565b60cb6020528060005260406000206000915090508060000160405180610180016040529081600082018054611759906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611785906138bb565b80156117d25780601f106117a7576101008083540402835291602001916117d2565b820191906000526020600020905b8154815290600101906020018083116117b557829003601f168201915b50505091835250506001820154602082015260028201546001600160a01b0316604082015260038201805460609092019161180c906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611838906138bb565b80156118855780601f1061185a57610100808354040283529160200191611885565b820191906000526020600020905b81548152906001019060200180831161186857829003601f168201915b50505050508152602001600482015481526020016005820180546118a8906138bb565b80601f01602080910402602001604051908101604052809291908181526020018280546118d4906138bb565b80156119215780601f106118f657610100808354040283529160200191611921565b820191906000526020600020905b81548152906001019060200180831161190457829003601f168201915b5050505050815260200160068201805461193a906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611966906138bb565b80156119b35780601f10611988576101008083540402835291602001916119b3565b820191906000526020600020905b81548152906001019060200180831161199657829003601f168201915b50505091835250506007820154602082015260088201546001600160a01b03811660408301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff166060820152600982015463ffffffff166080820152600a8201805460a090920191611a29906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611a55906138bb565b8015611aa25780601f10611a7757610100808354040283529160200191611aa2565b820191906000526020600020905b815481529060010190602001808311611a8557829003601f168201915b50505091909252505050600b820154600c830154600d90930154919260ff909116916001600160a01b031684565b6000808484604051611ae392919061385a565b6040805191829003909120600090815260cd60209081528282206001600160a01b0387168352905220549150505b9392505050565b33600090815260ce602052604090205460ff16611b61576040517f341f61ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260cb602052604090206001600b82015460ff166003811115611b8a57611b8a613691565b14611bc1576040517f6196e5a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b8101805460ff1916600317905560405182907f0a4273908b9362e571cacd5610879e3dfd7ddc7c9b3ce1d7ea7ea8b41869116490600090a25050565b611c3d6040518060400160405280601781526020017f73657452656d6f746544656c61792875696e7432353629000000000000000000815250612a6e565b801580611c4d57506202a3008110155b15611c84576040517f545f991300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c954818103611cc0576040517fbb45c33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c98290556040518281527fa1c2964049f672e1cba842d393f777ed468b9846eb7de186d7e73665a326b301906020015b60405180910390a15050565b611d05612526565b6040517fca5eb5e10000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190602401600060405180830381600087803b158015611d8157600080fd5b505af1158015611d95573d6000803e3d6000fd5b5050505050565b611da4612526565b61082d81612ccf565b6040805161020081018252606060808201818152600060a0840181905260c0840181905260e08401839052610100840181905261012084018390526101408401839052610160840181905261018084018190526101a084018190526101c084018190526101e084018390529083526020830181905292820183905281019190915260008484604051611e4092919061385a565b60408051918290038220600081815260cc60209081528382206001600160a01b038916835281528382205480835260cb909152908390206102008501909352825491945092919082906080820190839082908290611e9d906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec9906138bb565b8015611f165780601f10611eeb57610100808354040283529160200191611f16565b820191906000526020600020905b815481529060010190602001808311611ef957829003601f168201915b50505091835250506001820154602082015260028201546001600160a01b03166040820152600382018054606090920191611f50906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7c906138bb565b8015611fc95780601f10611f9e57610100808354040283529160200191611fc9565b820191906000526020600020905b815481529060010190602001808311611fac57829003601f168201915b5050505050815260200160048201548152602001600582018054611fec906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054612018906138bb565b80156120655780601f1061203a57610100808354040283529160200191612065565b820191906000526020600020905b81548152906001019060200180831161204857829003601f168201915b5050505050815260200160068201805461207e906138bb565b80601f01602080910402602001604051908101604052809291908181526020018280546120aa906138bb565b80156120f75780601f106120cc576101008083540402835291602001916120f7565b820191906000526020600020905b8154815290600101906020018083116120da57829003601f168201915b50505091835250506007820154602082015260088201546001600160a01b03811660408301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff166060820152600982015463ffffffff166080820152600a8201805460a09092019161216d906138bb565b80601f0160208091040260200160405190810160405280929190818152602001828054612199906138bb565b80156121e65780601f106121bb576101008083540402835291602001916121e6565b820191906000526020600020905b8154815290600101906020018083116121c957829003601f168201915b505050919092525050508152600b82015460209091019060ff16600381111561221157612211613691565b600381111561222257612222613691565b8152600c8201546020820152600d909101546001600160a01b03166040909101529695505050505050565b60606000848460405161226192919061385a565b604051809103902090506000836001600160a01b031663b0772d0b6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156122ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122d39190810190613a22565b805190915060008167ffffffffffffffff8111156122f3576122f3613998565b60405190808252806020026020018201604052801561231c578160200160208202803683370190505b50600085815260ca602052604081208054929350909160ff166123565750506040805160008152602081019091529450611b119350505050565b60005b8481101561246a57600086828151811061237557612375613ad4565b60209081029190910181015160008a815260cc835260408082206001600160a01b038416835284528082205480835260cb90945290209092506123b782612d58565b6123c357505050612462565b60c95481600c01546123d59190613937565b4210156123e457505050612462565b60008a815260cd602090815260408083206001600160a01b038716845290915290205480158015906124245750428660010154826124229190613937565b115b156124325750505050612462565b8288888151811061244557612445613ad4565b60209081029190910101528661245a81613b03565b975050505050505b600101612359565b508167ffffffffffffffff81111561248457612484613998565b6040519080825280602002602001820160405280156124ad578160200160208202803683370190505b50965060005b828110156124fa578381815181106124cd576124cd613ad4565b60200260200101518882815181106124e7576124e7613ad4565b60209081029190910101526001016124b3565b505050505050509392505050565b60006020820180359061251f90610667908561373b565b1492915050565b6033546001600160a01b0316331461259a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610890565b565b6001600160a01b038116612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e6167657220616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610890565b609780546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa09101611cf1565b63ffffffff811660009081527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f9006020819052604082205480611b11576040517ff6ff4fb700000000000000000000000000000000000000000000000000000000815263ffffffff85166004820152602401610890565b600061272885870187613bc7565b60208101519091504260008083815260cb60205260409020600b015460ff16600381111561275857612758613691565b146127c75782604001516001600160a01b0316836060015160405161277d9190613d2e565b6040518091039020837f6f2b8853cd821aee89a0dc78a586658bcbd9c930d3d25be1de720fa0346bd73b846040516127b791815260200190565b60405180910390a4505050610919565b6080830151600090815260cc60209081526040808320818701516001600160a01b031684529091529020546127fb81612d58565b1561286b5783604001516001600160a01b031684606001516040516128209190613d2e565b6040518091039020827fa5cf028a8d57c7fae7982ac3692bb4bdf11ddcca7c93493242a00f4957a5ebb78560405161285a91815260200190565b60405180910390a450505050610919565b600083815260cb60205260409020845185908290819061288b9082613d9a565b506020820151600182015560408201516002820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055606082015160038201906128e89082613d9a565b506080820151600482015560a082015160058201906129079082613d9a565b5060c0820151600682019061291c9082613d9a565b5060e082015160078201556101008201516101208301516bffffffffffffffffffffffff1674010000000000000000000000000000000000000000026001600160a01b0390911617600882015561014082015160098201805463ffffffff9092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909216919091179055610160820151600a8201906129bc9082613d9a565b505050600b8101805460ff19166001179055600c81018390556080850151600090815260cc6020908152604080832081890180516001600160a01b0390811686529190935292819020879055905160608801519151921691612a1e9190613d2e565b6040518091039020857fd5a7f72731c4bc3d3a2da54b4c53b429270f8d7f8c5b053d9ee98e072f87584086604051612a5891815260200190565b60405180910390a4505050505050505050505050565b6097546040517f18c5e8ab0000000000000000000000000000000000000000000000000000000081526000916001600160a01b0316906318c5e8ab90612aba9033908690600401613e96565b602060405180830381865afa158015612ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612afb9190613ec0565b905080612b3a573330836040517f4a3fa29300000000000000000000000000000000000000000000000000000000815260040161089093929190613edd565b5050565b6001600160a01b03811661082d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16612c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b612c1d612dbf565b61082d81612e5e565b600054610100900460ff16612cbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b61082d81612ef5565b61082d81612f95565b612cd7612526565b606580546001600160a01b0383167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155612d206033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600081600003612d6a57506000919050565b600082815260cb602052604090206001600b82015460ff166003811115612d9357612d93613691565b14612da15750600092915050565b60078101544290612db6906202a30090613937565b10159392505050565b600054610100900460ff16612e56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b61259a612fc6565b600054610100900460ff16610824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b600054610100900460ff16612f8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b61082d81613066565b606580547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561082d8161313d565b600054610100900460ff1661305d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b61259a33612cc6565b600054610100900460ff166130fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610890565b6001600160a01b038116611d05576040517fb586360400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038116811461082d57600080fd5b80356131c7816131a7565b919050565b6000602082840312156131de57600080fd5b8135611b11816131a7565b6000606082840312156131fb57600080fd5b50919050565b60008083601f84011261321357600080fd5b50813567ffffffffffffffff81111561322b57600080fd5b60208301915083602082850101111561324357600080fd5b9250929050565b600080600080600080600060e0888a03121561326557600080fd5b61326f89896131e9565b965060608801359550608088013567ffffffffffffffff8082111561329357600080fd5b61329f8b838c01613201565b909750955060a08a013591506132b4826131a7565b90935060c089013590808211156132ca57600080fd5b506132d78a828b01613201565b989b979a50959850939692959293505050565b600080604083850312156132fd57600080fd5b82359150602083013561330f816131a7565b809150509250929050565b6000806020838503121561332d57600080fd5b823567ffffffffffffffff81111561334457600080fd5b61335085828601613201565b90969095509350505050565b803563ffffffff811681146131c757600080fd5b6000806040838503121561338357600080fd5b61338c8361335c565b946020939093013593505050565b801515811461082d57600080fd5b600080604083850312156133bb57600080fd5b82356133c6816131a7565b9150602083013561330f8161339a565b6000806000604084860312156133eb57600080fd5b833567ffffffffffffffff81111561340257600080fd5b61340e86828701613201565b90945092505060208401356134228161339a565b809150509250925092565b6000806040838503121561344057600080fd5b823561344b816131a7565b9150602083013561330f816131a7565b60006020828403121561346d57600080fd5b5035919050565b60008060008060a0858703121561348a57600080fd5b61349486866131e9565b9350606085013567ffffffffffffffff8111156134b057600080fd5b6134bc87828801613201565b90945092505060808501356134d0816131a7565b939692955090935050565b600080600080606085870312156134f157600080fd5b843567ffffffffffffffff81111561350857600080fd5b61351487828801613201565b9095509350506020850135613528816131a7565b9396929550929360400135925050565b60005b8381101561355357818101518382015260200161353b565b50506000910152565b60008151808452613574816020860160208601613538565b601f01601f19169290920160200192915050565b6000610180825181855261359e8286018261355c565b9150506020830151602085015260408301516135c560408601826001600160a01b03169052565b50606083015184820360608601526135dd828261355c565b9150506080830151608085015260a083015184820360a0860152613601828261355c565b91505060c083015184820360c086015261361b828261355c565b91505060e083015160e085015261010080840151613643828701826001600160a01b03169052565b5050610120838101516bffffffffffffffffffffffff16908501526101408084015163ffffffff16908501526101608084015185830382870152613687838261355c565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106136f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60808152600061370e6080830187613588565b905061371d60208301866136c0565b8360408301526001600160a01b038316606083015295945050505050565b60006020828403121561374d57600080fd5b611b118261335c565b60008060006040848603121561376b57600080fd5b833567ffffffffffffffff81111561378257600080fd5b61378e86828701613201565b9094509250506020840135613422816131a7565b6020815260008251608060208401526137be60a0840182613588565b905060208401516137d260408501826136c0565b50604084015160608401526001600160a01b0360608501511660808401528091505092915050565b6020808252825182820181905260009190848201906040850190845b8181101561383257835183529284019291840191600101613816565b50909695505050505050565b60006060828403121561385057600080fd5b611b1183836131e9565b8183823760009101908152919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6040815260006138a960408301858761386a565b90508215156020830152949350505050565b600181811c908216806138cf57607f821691505b6020821081036131fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561099b5761099b613908565b602081526000611b116020830184613588565b60a08152600061397160a08301888a61386a565b60208301969096525060408101939093529015156060830152151560809091015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610180810167ffffffffffffffff811182821017156139eb576139eb613998565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a1a57613a1a613998565b604052919050565b60006020808385031215613a3557600080fd5b825167ffffffffffffffff80821115613a4d57600080fd5b818501915085601f830112613a6157600080fd5b815181811115613a7357613a73613998565b8060051b9150613a848483016139f1565b8181529183018401918481019088841115613a9e57600080fd5b938501935b83851015613ac85784519250613ab8836131a7565b8282529385019390850190613aa3565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b3457613b34613908565b5060010190565b600082601f830112613b4c57600080fd5b813567ffffffffffffffff811115613b6657613b66613998565b613b796020601f19601f840116016139f1565b818152846020838601011115613b8e57600080fd5b816020850160208301376000918101602001919091529392505050565b80356bffffffffffffffffffffffff811681146131c757600080fd5b600060208284031215613bd957600080fd5b813567ffffffffffffffff80821115613bf157600080fd5b908301906101808286031215613c0657600080fd5b613c0e6139c7565b823582811115613c1d57600080fd5b613c2987828601613b3b565b82525060208301356020820152613c42604084016131bc565b6040820152606083013582811115613c5957600080fd5b613c6587828601613b3b565b6060830152506080830135608082015260a083013582811115613c8757600080fd5b613c9387828601613b3b565b60a08301525060c083013582811115613cab57600080fd5b613cb787828601613b3b565b60c08301525060e083013560e0820152610100613cd58185016131bc565b90820152610120613ce7848201613bab565b90820152610140613cf984820161335c565b908201526101608381013583811115613d1157600080fd5b613d1d88828701613b3b565b918301919091525095945050505050565b60008251613d40818460208701613538565b9190910192915050565b601f821115610e1c576000816000526020600020601f850160051c81016020861015613d735750805b601f850160051c820191505b81811015613d9257828155600101613d7f565b505050505050565b815167ffffffffffffffff811115613db457613db4613998565b613dc881613dc284546138bb565b84613d4a565b602080601f831160018114613e1b5760008415613de55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613d92565b600085815260208120601f198616915b82811015613e4a57888601518255948401946001909101908401613e2b565b5085821015613e8657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0383168152604060208201526000613eb8604083018461355c565b949350505050565b600060208284031215613ed257600080fd5b8151611b118161339a565b60006001600160a01b03808616835280851660208401525060606040830152613f09606083018461355c565b9594505050505056fe73657457686974656c69737465644578656375746f7228616464726573732c626f6f6c297365745269736b506172616d65746572436f6e66696728737472696e672c616464726573732c75696e7432353629a2646970667358221220283f03b217042f9ed682cd3c3ca7600a0d6fd92a605768750715bbed92710ee964736f6c63430008190033",
  "devdoc": {
    "author": "Venus",
    "custom:security-contact": "https://github.com/VenusProtocol/governance-contracts#discussion",
    "events": {
      "Initialized(uint8)": {
        "details": "Triggered when the contract has been initialized or reinitialized."
      }
    },
    "kind": "dev",
    "methods": {
      "acceptOwnership()": {
        "details": "The new owner accepts the ownership transfer."
      },
      "allowInitializePath((uint32,bytes32,uint64))": {
        "details": "This indicates to the endpoint that the OApp has enabled msgs for this particular path to be received.This defaults to assuming if a peer has been set, its initialized. Can be overridden by the OApp if there is other logic to determine this.",
        "params": {
          "origin": "The origin information containing the source endpoint and sender address."
        },
        "returns": {
          "_0": "Whether the path has been initialized."
        }
      },
      "constructor": {
        "custom:oz-upgrades-unsafe-allow": "constructor",
        "params": {
          "endpoint_": "Local LayerZero endpoint on this chain",
          "layerZeroEid_": "LayerZero endpoint ID for this destination chain"
        }
      },
      "executeUpdate(uint256)": {
        "custom:access": "Only whitelisted executors can execute updates",
        "custom:error": "NotAnExecutor if the caller is not a whitelisted executorConfigNotActive if the configuration for the update type is not activeUpdateNotFound if the update is not pending for the given (updateType, market)UpdateNotUnlocked if the remote delay has not elapsedUpdateIsExpired if the bridged update has expired on the destinationUpdateTooFrequent if the debounce period has not passed since the last execution",
        "custom:event": "Emits RemoteUpdateExecuted with the executed update ID",
        "params": {
          "updateId": "The bridged update ID to execute"
        }
      },
      "getExecutableUpdates(string,address)": {
        "params": {
          "comptroller": "The address of the Isolated Pools Comptroller that manages the markets",
          "updateType": "The human‑readable identifier of the update type to filter by"
        },
        "returns": {
          "executableUpdates": "Array of update IDs that are ready to be executed"
        }
      },
      "getLastExecutedAt(string,address)": {
        "params": {
          "market": "The address of the market",
          "updateType": "The human-readable identifier of the update type"
        },
        "returns": {
          "_0": "The last executed timestamp"
        }
      },
      "getRegisteredUpdate(string,address)": {
        "params": {
          "market": "The address of the market",
          "updateType": "The human-readable identifier of the update type"
        },
        "returns": {
          "_0": "The registered update"
        }
      },
      "getRiskParameterConfig(string)": {
        "params": {
          "updateType": "The human-readable identifier of the update type"
        },
        "returns": {
          "_0": "The risk parameter configuration"
        }
      },
      "initialize(address,address)": {
        "params": {
          "accessControlManager_": "The address of the access control manager",
          "delegate_": "The owner (and LayerZero delegate) of this contract"
        }
      },
      "isComposeMsgSender((uint32,bytes32,uint64),bytes,address)": {
        "details": "_origin The origin information containing the source endpoint and sender address.  - srcEid: The source chain endpoint ID.  - sender: The sender address on the src chain.  - nonce: The nonce of the message._message The lzReceive payload.Applications can optionally choose to implement separate composeMsg senders that are NOT the bridging layer.The default sender IS the OAppReceiver implementer.",
        "params": {
          "_sender": "The sender address."
        },
        "returns": {
          "_0": "isSender Is a valid sender."
        }
      },
      "lzReceive((uint32,bytes32,uint64),bytes32,bytes,address,bytes)": {
        "details": "Entry point for receiving messages or packets from the endpoint.Entry point for receiving msg/packet from the LayerZero endpoint.",
        "params": {
          "_executor": "The address of the executor for the received message.",
          "_extraData": "Additional arbitrary data provided by the corresponding executor.",
          "_guid": "The unique identifier for the received LayerZero message.",
          "_message": "The payload of the received message.",
          "_origin": "The origin information containing the source endpoint and sender address.  - srcEid: The source chain endpoint ID.  - sender: The sender address on the src chain.  - nonce: The nonce of the message."
        }
      },
      "nextNonce(uint32,bytes32)": {
        "details": "_srcEid The source endpoint ID._sender The sender address.The path nonce starts from 1. If 0 is returned it means that there is NO nonce ordered enforcement.Is required by the off-chain executor to determine the OApp expects msg execution is ordered.This is also enforced by the OApp.By default this is NOT enabled. ie. nextNonce is hardcoded to return 0.",
        "returns": {
          "nonce": "The next nonce."
        }
      },
      "oAppVersion()": {
        "details": "Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented. ie. this is a RECEIVE only OApp.If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions.",
        "returns": {
          "receiverVersion": "The version of the OAppReceiver.sol contract.",
          "senderVersion": "The version of the OAppSender.sol contract."
        }
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "peers(uint32)": {
        "params": {
          "_eid": "The endpoint ID."
        },
        "returns": {
          "_0": "peer The address of the peer associated with the specified endpoint."
        }
      },
      "pendingOwner()": {
        "details": "Returns the address of the pending owner."
      },
      "rejectUpdate(uint256)": {
        "custom:access": "Only whitelisted executors can reject updates",
        "custom:error": "NotAnExecutor if the caller is not a whitelisted executorUpdateNotFound if there is no pending update with the given ID",
        "custom:event": "Emits UpdateRejected with the rejected update ID",
        "params": {
          "updateId": "The oracle update ID of the update to reject"
        }
      },
      "renounceOwnership()": {
        "custom:error": "Throws RenounceOwnershipNotAllowed"
      },
      "setAccessControlManager(address)": {
        "custom:access": "Only Governance",
        "custom:event": "Emits NewAccessControlManager event",
        "details": "Admin function to set address of AccessControlManager",
        "params": {
          "accessControlManager_": "The new address of the AccessControlManager"
        }
      },
      "setConfigActive(string,bool)": {
        "custom:access": "Controlled by AccessControlManager",
        "custom:error": "Throws UnsupportedUpdateType if the update type is not supportedThrows ConfigStatusUnchanged if the active status is already set to the desired value",
        "custom:event": "Emits ConfigActiveUpdated with the update type hash, update type, previous active status, and the active status",
        "params": {
          "active": "The active status to set",
          "updateType": "The type of update to configure"
        }
      },
      "setDelegate(address)": {
        "details": "Only the owner/admin of the OApp can call this function.Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.",
        "params": {
          "_delegate": "The address of the delegate to be set."
        }
      },
      "setPeer(uint32,bytes32)": {
        "details": "Only the owner/admin of the OApp can call this function.Indicates that the peer is trusted to send LayerZero messages to this OApp.Set this to bytes32(0) to remove the peer address.Peer is a bytes32 to accommodate non-evm chains.",
        "params": {
          "_eid": "The endpoint ID.",
          "_peer": "The address of the peer to be associated with the corresponding endpoint."
        }
      },
      "setRemoteDelay(uint256)": {
        "custom:access": "Controlled by AccessControlManager",
        "custom:error": "InvalidRemoteDelay if the delay is 0 or greater than or equal to the remote update expiration timeRemoteDelayUnchanged if the new delay is equal to the current delay",
        "custom:event": "Emits RemoteDelaySet with the new remote delay value",
        "params": {
          "newRemoteDelay": "The new remote delay in seconds"
        }
      },
      "setRiskParameterConfig(string,address,uint256)": {
        "custom:access": "Controlled by AccessControlManager",
        "custom:error": "InvalidUpdateType if the update type string is emptyInvalidDebounce if the debounce is 0",
        "custom:event": "Emits RiskParameterConfigUpdated",
        "params": {
          "debounce": "The debounce period for updates of this type on the destination (anti‑DoS)",
          "riskSteward": "The address for the risk steward contract responsible for processing the update",
          "updateType": "The type of update to configure (e.g., \"supplyCap\", \"borrowCap\")"
        }
      },
      "setWhitelistedExecutor(address,bool)": {
        "custom:access": "Controlled by AccessControlManager",
        "custom:error": "Throws ZeroAddressNotAllowed if the executor address is zeroThrows ExecutorStatusUnchanged if the executor whitelist status is already set to the desired value",
        "custom:event": "Emits ExecutorStatusUpdated with the executor address, previous approval status, and new approval status",
        "params": {
          "approved": "The whitelist status to set (true to whitelist, false to remove)",
          "executor": "The address of the executor"
        }
      },
      "transferOwnership(address)": {
        "details": "Overrides OwnableUpgradeable and Ownable2StepUpgradeable to resolve      the multiple inheritance ownership transfer conflict."
      }
    },
    "stateVariables": {
      "__gap": {
        "details": "This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain. See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps"
      }
    },
    "title": "DestinationStewardReceiver",
    "version": 1
  },
  "userdoc": {
    "errors": {
      "ConfigNotActive()": [
        {
          "notice": "Thrown when config for an update type is not active or not configured"
        }
      ],
      "ConfigStatusUnchanged()": [
        {
          "notice": "Thrown when trying to set the same config active status"
        }
      ],
      "ExecutorStatusUnchanged()": [
        {
          "notice": "Thrown when trying to set the same executor whitelist status"
        }
      ],
      "InvalidDebounce()": [
        {
          "notice": "Thrown when a debounce value of 0 is set"
        }
      ],
      "InvalidLayerZeroEid()": [
        {
          "notice": "Thrown when an invalid LayerZero endpoint ID is provided"
        }
      ],
      "InvalidRemoteDelay()": [
        {
          "notice": "Thrown when an invalid remote delay is provided"
        }
      ],
      "InvalidUpdateType()": [
        {
          "notice": "Thrown when an empty update type string is provided"
        }
      ],
      "NotAnExecutor()": [
        {
          "notice": "Thrown when an address is not a whitelisted executor"
        }
      ],
      "RemoteDelayUnchanged()": [
        {
          "notice": "Thrown when trying to set the same remote delay value"
        }
      ],
      "RenounceOwnershipNotAllowed()": [
        {
          "notice": "Thrown when trying to renounce ownership"
        }
      ],
      "Unauthorized(address,address,string)": [
        {
          "notice": "Thrown when the action is prohibited by AccessControlManager"
        }
      ],
      "UnsupportedUpdateType()": [
        {
          "notice": "Thrown when an update type is not supported"
        }
      ],
      "UpdateIsExpired()": [
        {
          "notice": "Thrown when a bridged update has expired on the destination"
        }
      ],
      "UpdateNotFound()": [
        {
          "notice": "Thrown when trying to operate on an update that was never registered"
        }
      ],
      "UpdateNotUnlocked()": [
        {
          "notice": "Thrown when trying to execute an update before its unlock time"
        }
      ],
      "UpdateTooFrequent()": [
        {
          "notice": "Thrown when the debounce period hasn't passed for applying an update to a specific market / update type"
        }
      ],
      "ZeroAddressNotAllowed()": [
        {
          "notice": "Thrown if the supplied address is a zero address where it is not allowed"
        }
      ]
    },
    "events": {
      "ConfigActiveUpdated(bytes32,string,bool,bool)": {
        "notice": "Emitted when a risk parameter config active status is updated"
      },
      "DuplicateUpdateReceived(uint256,uint256,string,address)": {
        "notice": "Emitted when a duplicate bridged update (same updateId) is received."
      },
      "ExecutorStatusUpdated(address,bool,bool)": {
        "notice": "Emitted when an executor status is set on the destination"
      },
      "NewAccessControlManager(address,address)": {
        "notice": "Emitted when access control manager contract address is changed"
      },
      "RegisteredPendingUpdateExist(uint256,uint256,string,address)": {
        "notice": "Emitted when a new bridged update arrives but a pending update is already registered for the same (updateType, market)."
      },
      "RemoteDelaySet(uint256)": {
        "notice": "Emitted when the remote delay is set in the constructor"
      },
      "RemoteUpdateExecuted(uint256)": {
        "notice": "Emitted when a bridged update is executed on the destination"
      },
      "RemoteUpdateRegistered(uint256,uint256,string,address)": {
        "notice": "Emitted when a bridged update is registered on the destination"
      },
      "RiskParameterConfigUpdated(bytes32,string,address,address,uint256,uint256,bool,bool)": {
        "notice": "Emitted when a risk parameter config is updated for an update type"
      },
      "UpdateRejected(uint256)": {
        "notice": "Emitted when an update is rejected on the destination"
      }
    },
    "kind": "user",
    "methods": {
      "LAYER_ZERO_EID()": {
        "notice": "Destination chain LayerZero endpoint ID"
      },
      "REMOTE_UPDATE_EXPIRATION_TIME()": {
        "notice": "Time before a bridged update is considered stale on the destination chain"
      },
      "accessControlManager()": {
        "notice": "Returns the address of the access control manager contract"
      },
      "allowInitializePath((uint32,bytes32,uint64))": {
        "notice": "Checks if the path initialization is allowed based on the provided origin."
      },
      "constructor": {
        "notice": "Disables initializers and sets immutable values."
      },
      "endpoint()": {
        "notice": "Retrieves the LayerZero endpoint associated with the OApp."
      },
      "executeUpdate(uint256)": {
        "notice": "Executes a bridged update after its remote delay has passed."
      },
      "getExecutableUpdates(string,address)": {
        "notice": "Returns executable updates for a given update type and comptroller."
      },
      "getLastExecutedAt(string,address)": {
        "notice": "Returns the last executed timestamp for a given update type and market"
      },
      "getRegisteredUpdate(string,address)": {
        "notice": "Returns the registered update for a given update type and market"
      },
      "getRiskParameterConfig(string)": {
        "notice": "Returns the risk parameter configuration for a given update type"
      },
      "initialize(address,address)": {
        "notice": "Initializes the contract with the Access Control Manager and owner."
      },
      "isComposeMsgSender((uint32,bytes32,uint64),bytes,address)": {
        "notice": "Indicates whether an address is an approved composeMsg sender to the Endpoint."
      },
      "lastExecutedAt(bytes32,address)": {
        "notice": "Track last executed update timestamp per (updateType, market)"
      },
      "lastRegisteredUpdateId(bytes32,address)": {
        "notice": "Mapping from (updateType, market) to currently registered remote update ID"
      },
      "nextNonce(uint32,bytes32)": {
        "notice": "Retrieves the next nonce for a given source endpoint and sender address."
      },
      "oAppVersion()": {
        "notice": "Retrieves the OApp version information."
      },
      "peers(uint32)": {
        "notice": "Returns the peer address (OApp instance) associated with a specific endpoint."
      },
      "rejectUpdate(uint256)": {
        "notice": "Rejects a registered remote update on the destination chain."
      },
      "remoteDelay()": {
        "notice": "Delay before a bridged update can be executed on the destination chain"
      },
      "renounceOwnership()": {
        "notice": "Disables renounceOwnership function"
      },
      "riskParameterConfigs(bytes32)": {
        "notice": "Mapping of supported risk configurations per update type (hashed updateType string)"
      },
      "setAccessControlManager(address)": {
        "notice": "Sets the address of AccessControlManager"
      },
      "setConfigActive(string,bool)": {
        "notice": "Sets the active status of a risk parameter config"
      },
      "setDelegate(address)": {
        "notice": "Sets the delegate address for the OApp."
      },
      "setPeer(uint32,bytes32)": {
        "notice": "Sets the peer address (OApp instance) for a corresponding endpoint."
      },
      "setRemoteDelay(uint256)": {
        "notice": "Sets the remote delay before bridged updates can be executed on the destination chain."
      },
      "setRiskParameterConfig(string,address,uint256)": {
        "notice": "Sets the risk parameter config for a given update type on the destination chain."
      },
      "setWhitelistedExecutor(address,bool)": {
        "notice": "Sets the whitelist status of an executor on the destination chain."
      },
      "updates(uint256)": {
        "notice": "Master storage of all bridged updates by update ID"
      },
      "whitelistedExecutors(address)": {
        "notice": "Mapping from executor address to whitelist status"
      }
    },
    "notice": "Destination‑chain contract that receives bridged updates from `RiskStewardReceiver` via LayerZero,         enforces a fixed remote delay, and then executes the updates on the configured `IRiskSteward` contracts.",
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 6086,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 6089,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 6573,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "__gap",
        "offset": 0,
        "slot": "1",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 5958,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "_owner",
        "offset": 0,
        "slot": "51",
        "type": "t_address"
      },
      {
        "astId": 6078,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "__gap",
        "offset": 0,
        "slot": "52",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 5867,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "_pendingOwner",
        "offset": 0,
        "slot": "101",
        "type": "t_address"
      },
      {
        "astId": 5946,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "__gap",
        "offset": 0,
        "slot": "102",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 13718,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "_accessControlManager",
        "offset": 0,
        "slot": "151",
        "type": "t_contract(IAccessControlManagerV8)13903"
      },
      {
        "astId": 13723,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "__gap",
        "offset": 0,
        "slot": "152",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 15016,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "remoteDelay",
        "offset": 0,
        "slot": "201",
        "type": "t_uint256"
      },
      {
        "astId": 15022,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "riskParameterConfigs",
        "offset": 0,
        "slot": "202",
        "type": "t_mapping(t_bytes32,t_struct(RiskParamConfig)16320_storage)"
      },
      {
        "astId": 15028,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "updates",
        "offset": 0,
        "slot": "203",
        "type": "t_mapping(t_uint256,t_struct(DestinationUpdate)16332_storage)"
      },
      {
        "astId": 15035,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "lastRegisteredUpdateId",
        "offset": 0,
        "slot": "204",
        "type": "t_mapping(t_bytes32,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 15042,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "lastExecutedAt",
        "offset": 0,
        "slot": "205",
        "type": "t_mapping(t_bytes32,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 15047,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "whitelistedExecutors",
        "offset": 0,
        "slot": "206",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 15052,
        "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
        "label": "__gap",
        "offset": 0,
        "slot": "207",
        "type": "t_array(t_uint256)44_storage"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_uint256)44_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[44]",
        "numberOfBytes": "1408"
      },
      "t_array(t_uint256)49_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[49]",
        "numberOfBytes": "1568"
      },
      "t_array(t_uint256)50_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[50]",
        "numberOfBytes": "1600"
      },
      "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_contract(IAccessControlManagerV8)13903": {
        "encoding": "inplace",
        "label": "contract IAccessControlManagerV8",
        "numberOfBytes": "20"
      },
      "t_enum(UpdateStatus)16312": {
        "encoding": "inplace",
        "label": "enum IDestinationStewardReceiver.UpdateStatus",
        "numberOfBytes": "1"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_address,t_uint256)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_bytes32,t_mapping(t_address,t_uint256))": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => mapping(address => uint256))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_address,t_uint256)"
      },
      "t_mapping(t_bytes32,t_struct(RiskParamConfig)16320_storage)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => struct IDestinationStewardReceiver.RiskParamConfig)",
        "numberOfBytes": "32",
        "value": "t_struct(RiskParamConfig)16320_storage"
      },
      "t_mapping(t_uint256,t_struct(DestinationUpdate)16332_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => struct IDestinationStewardReceiver.DestinationUpdate)",
        "numberOfBytes": "32",
        "value": "t_struct(DestinationUpdate)16332_storage"
      },
      "t_string_storage": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_struct(DestinationUpdate)16332_storage": {
        "encoding": "inplace",
        "label": "struct IDestinationStewardReceiver.DestinationUpdate",
        "members": [
          {
            "astId": 16324,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "update",
            "offset": 0,
            "slot": "0",
            "type": "t_struct(RiskParameterUpdate)16568_storage"
          },
          {
            "astId": 16327,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "status",
            "offset": 0,
            "slot": "11",
            "type": "t_enum(UpdateStatus)16312"
          },
          {
            "astId": 16329,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "arrivalTime",
            "offset": 0,
            "slot": "12",
            "type": "t_uint256"
          },
          {
            "astId": 16331,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "executor",
            "offset": 0,
            "slot": "13",
            "type": "t_address"
          }
        ],
        "numberOfBytes": "448"
      },
      "t_struct(RiskParamConfig)16320_storage": {
        "encoding": "inplace",
        "label": "struct IDestinationStewardReceiver.RiskParamConfig",
        "members": [
          {
            "astId": 16315,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "active",
            "offset": 0,
            "slot": "0",
            "type": "t_bool"
          },
          {
            "astId": 16317,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "debounce",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 16319,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "riskSteward",
            "offset": 0,
            "slot": "2",
            "type": "t_address"
          }
        ],
        "numberOfBytes": "96"
      },
      "t_struct(RiskParameterUpdate)16568_storage": {
        "encoding": "inplace",
        "label": "struct RiskParameterUpdate",
        "members": [
          {
            "astId": 16545,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "referenceId",
            "offset": 0,
            "slot": "0",
            "type": "t_string_storage"
          },
          {
            "astId": 16547,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "updateId",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 16549,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "market",
            "offset": 0,
            "slot": "2",
            "type": "t_address"
          },
          {
            "astId": 16551,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "updateType",
            "offset": 0,
            "slot": "3",
            "type": "t_string_storage"
          },
          {
            "astId": 16553,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "updateTypeKey",
            "offset": 0,
            "slot": "4",
            "type": "t_bytes32"
          },
          {
            "astId": 16555,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "newValue",
            "offset": 0,
            "slot": "5",
            "type": "t_bytes_storage"
          },
          {
            "astId": 16557,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "previousValue",
            "offset": 0,
            "slot": "6",
            "type": "t_bytes_storage"
          },
          {
            "astId": 16559,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "timestamp",
            "offset": 0,
            "slot": "7",
            "type": "t_uint256"
          },
          {
            "astId": 16561,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "publisher",
            "offset": 0,
            "slot": "8",
            "type": "t_address"
          },
          {
            "astId": 16563,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "poolId",
            "offset": 20,
            "slot": "8",
            "type": "t_uint96"
          },
          {
            "astId": 16565,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "destLzEid",
            "offset": 0,
            "slot": "9",
            "type": "t_uint32"
          },
          {
            "astId": 16567,
            "contract": "contracts/RiskSteward/DestinationStewardReceiver.sol:DestinationStewardReceiver",
            "label": "additionalData",
            "offset": 0,
            "slot": "10",
            "type": "t_bytes_storage"
          }
        ],
        "numberOfBytes": "352"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint32": {
        "encoding": "inplace",
        "label": "uint32",
        "numberOfBytes": "4"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      },
      "t_uint96": {
        "encoding": "inplace",
        "label": "uint96",
        "numberOfBytes": "12"
      }
    }
  }
}
