{
  "address": "0x6a8154699b6670Ba6166ba59d1c094663E603cA8",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "stakeManager",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "slisBNB",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "resilientOracle",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "annualGrowthRate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_snapshotInterval",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "initialSnapshotMaxExchangeRate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "initialSnapshotTimestamp",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "accessControlManager",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_snapshotGap",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "InvalidGrowthRate",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialSnapshot",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidSnapshotMaxExchangeRate",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidTokenAddress",
      "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": "ZeroAddressNotAllowed",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "oldGrowthRatePerSecond",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "newGrowthRatePerSecond",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "oldSnapshotInterval",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newSnapshotInterval",
          "type": "uint256"
        }
      ],
      "name": "GrowthRateUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "oldSnapshotGap",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "newSnapshotGap",
          "type": "uint256"
        }
      ],
      "name": "SnapshotGapUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "maxExchangeRate",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "SnapshotUpdated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "ACCESS_CONTROL_MANAGER",
      "outputs": [
        {
          "internalType": "contract IAccessControlManagerV8",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "CORRELATED_TOKEN",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "NATIVE_TOKEN_ADDR",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RESILIENT_ORACLE",
      "outputs": [
        {
          "internalType": "contract ResilientOracleInterface",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "STAKE_MANAGER",
      "outputs": [
        {
          "internalType": "contract ISynclubStakeManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UNDERLYING_TOKEN",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getMaxAllowedExchangeRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "asset",
          "type": "address"
        }
      ],
      "name": "getPrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getUnderlyingAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "growthRatePerSecond",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isCapped",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_annualGrowthRate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_snapshotInterval",
          "type": "uint256"
        }
      ],
      "name": "setGrowthRate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_snapshotMaxExchangeRate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_snapshotTimestamp",
          "type": "uint256"
        }
      ],
      "name": "setSnapshot",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_snapshotGap",
          "type": "uint256"
        }
      ],
      "name": "setSnapshotGap",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "snapshotGap",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "snapshotInterval",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "snapshotMaxExchangeRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "snapshotTimestamp",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "updateSnapshot",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x2c6d2d80fe003e9f29c0bde2eb5036fe3f6f4b83797a5fc3208690426a08dfa9",
  "receipt": {
    "to": null,
    "from": "0x33C6476F88eeA28D7E7900F759B4597704Ef95B7",
    "contractAddress": "0x6a8154699b6670Ba6166ba59d1c094663E603cA8",
    "transactionIndex": 0,
    "gasUsed": "768617",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xecc40b1924a8a282f7238ef8522b76fadedfba3f264e45ece7d64f89081234f9",
    "transactionHash": "0x2c6d2d80fe003e9f29c0bde2eb5036fe3f6f4b83797a5fc3208690426a08dfa9",
    "logs": [],
    "blockNumber": 54536041,
    "cumulativeGasUsed": "768617",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xbF0Db0d1340fdd5DF245613E280856aEAFbF54d1",
    "0xd2aF6A916Bc77764dc63742BC30f71AF4cF423F4",
    "0x3cD69251D04A28d887Ac14cbe2E14c52F3D57823",
    0,
    0,
    0,
    0,
    "0x45f8a08F534f34A97187626E05d4b6648Eeaa9AA",
    0
  ],
  "numDeployments": 1,
  "solcInputHash": "8100be9851a60cd39397bcc019f102c9",
  "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakeManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"slisBNB\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"resilientOracle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"annualGrowthRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_snapshotInterval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"initialSnapshotMaxExchangeRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"initialSnapshotTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"accessControlManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_snapshotGap\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidGrowthRate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialSnapshot\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSnapshotMaxExchangeRate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenAddress\",\"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\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldGrowthRatePerSecond\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newGrowthRatePerSecond\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldSnapshotInterval\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newSnapshotInterval\",\"type\":\"uint256\"}],\"name\":\"GrowthRateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldSnapshotGap\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newSnapshotGap\",\"type\":\"uint256\"}],\"name\":\"SnapshotGapUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"maxExchangeRate\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"SnapshotUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACCESS_CONTROL_MANAGER\",\"outputs\":[{\"internalType\":\"contract IAccessControlManagerV8\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CORRELATED_TOKEN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_ADDR\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RESILIENT_ORACLE\",\"outputs\":[{\"internalType\":\"contract ResilientOracleInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKE_MANAGER\",\"outputs\":[{\"internalType\":\"contract ISynclubStakeManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UNDERLYING_TOKEN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMaxAllowedExchangeRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"getPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getUnderlyingAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"growthRatePerSecond\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isCapped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_annualGrowthRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_snapshotInterval\",\"type\":\"uint256\"}],\"name\":\"setGrowthRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_snapshotMaxExchangeRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_snapshotTimestamp\",\"type\":\"uint256\"}],\"name\":\"setSnapshot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_snapshotGap\",\"type\":\"uint256\"}],\"name\":\"setSnapshotGap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"snapshotGap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"snapshotInterval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"snapshotMaxExchangeRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"snapshotTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateSnapshot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Venus\",\"kind\":\"dev\",\"methods\":{\"getMaxAllowedExchangeRate()\":{\"returns\":{\"_0\":\"maxExchangeRate Maximum allowed exchange rate\"}},\"getPrice(address)\":{\"custom:error\":\"InvalidTokenAddress error is thrown if the token address is invalid\",\"params\":{\"asset\":\"Address of the token\"},\"returns\":{\"_0\":\"price The price of the token in scaled decimal places. It can be capped to a maximum value taking into account the growth rate\"}},\"getUnderlyingAmount()\":{\"returns\":{\"_0\":\"amount The amount of BNB for slisBNB\"}},\"isCapped()\":{\"returns\":{\"_0\":\"isCapped Boolean indicating if the price is capped\"}},\"setGrowthRate(uint256,uint256)\":{\"custom:error\":\"InvalidGrowthRate error is thrown if the growth rate is invalid\",\"custom:event\":\"Emits GrowthRateUpdated event on successful update of the growth rate\",\"params\":{\"_annualGrowthRate\":\"The annual growth rate to set\",\"_snapshotInterval\":\"The snapshot interval to set\"}},\"setSnapshot(uint256,uint256)\":{\"custom:event\":\"Emits SnapshotUpdated event on successful update of the snapshot\",\"params\":{\"_snapshotMaxExchangeRate\":\"The exchange rate to set\",\"_snapshotTimestamp\":\"The timestamp to set\"}},\"setSnapshotGap(uint256)\":{\"custom:event\":\"Emits SnapshotGapUpdated event on successful update of the snapshot gap\",\"params\":{\"_snapshotGap\":\"The snapshot gap to set\"}},\"updateSnapshot()\":{\"custom:error\":\"InvalidSnapshotMaxExchangeRate error is thrown if the max snapshot exchange rate is zero\",\"custom:event\":\"Emits SnapshotUpdated event on successful update of the snapshot\"}},\"title\":\"SlisBNBOracle\",\"version\":1},\"userdoc\":{\"errors\":{\"InvalidGrowthRate()\":[{\"notice\":\"Thrown if the growth rate is invalid\"}],\"InvalidInitialSnapshot()\":[{\"notice\":\"Thrown if the initial snapshot is invalid\"}],\"InvalidSnapshotMaxExchangeRate()\":[{\"notice\":\"Thrown if the max snapshot exchange rate is invalid\"}],\"InvalidTokenAddress()\":[{\"notice\":\"Thrown if the token address is invalid\"}],\"Unauthorized(address,address,string)\":[{\"notice\":\"@notice Thrown when the action is prohibited by AccessControlManager\"}],\"ZeroAddressNotAllowed()\":[{\"notice\":\"Thrown if the supplied address is a zero address where it is not allowed\"}]},\"events\":{\"GrowthRateUpdated(uint256,uint256,uint256,uint256)\":{\"notice\":\"Emitted when the growth rate is updated\"},\"SnapshotGapUpdated(uint256,uint256)\":{\"notice\":\"Emitted when the snapshot gap is updated\"},\"SnapshotUpdated(uint256,uint256)\":{\"notice\":\"Emitted when the snapshot is updated\"}},\"kind\":\"user\",\"methods\":{\"ACCESS_CONTROL_MANAGER()\":{\"notice\":\"Address of the AccessControlManager contract\"},\"CORRELATED_TOKEN()\":{\"notice\":\"Address of the correlated token\"},\"NATIVE_TOKEN_ADDR()\":{\"notice\":\"This is used as token address of BNB on BSC\"},\"RESILIENT_ORACLE()\":{\"notice\":\"Address of Resilient Oracle\"},\"STAKE_MANAGER()\":{\"notice\":\"Address of StakeManager\"},\"UNDERLYING_TOKEN()\":{\"notice\":\"Address of the underlying token\"},\"constructor\":{\"notice\":\"Constructor for the implementation contract.\"},\"getMaxAllowedExchangeRate()\":{\"notice\":\"Gets the maximum allowed exchange rate for token\"},\"getPrice(address)\":{\"notice\":\"Fetches the price of the token\"},\"getUnderlyingAmount()\":{\"notice\":\"Fetches the amount of BNB for 1 slisBNB\"},\"isCapped()\":{\"notice\":\"Returns if the price is capped\"},\"setGrowthRate(uint256,uint256)\":{\"notice\":\"Sets the growth rate and snapshot interval\"},\"setSnapshot(uint256,uint256)\":{\"notice\":\"Directly sets the snapshot exchange rate and timestamp\"},\"setSnapshotGap(uint256)\":{\"notice\":\"Sets the snapshot gap\"},\"snapshotGap()\":{\"notice\":\"Gap to add when updating the snapshot\"},\"snapshotInterval()\":{\"notice\":\"Snapshot update interval\"},\"snapshotMaxExchangeRate()\":{\"notice\":\"Last stored snapshot maximum exchange rate\"},\"snapshotTimestamp()\":{\"notice\":\"Last stored snapshot timestamp\"},\"updateSnapshot()\":{\"notice\":\"Updates the snapshot price and timestamp\"}},\"notice\":\"This oracle fetches the price of slisBNB asset\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/oracles/SlisBNBOracle.sol\":\"SlisBNBOracle\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n    /**\\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n     *\\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n     * {RoleAdminChanged} not being emitted signaling this.\\n     *\\n     * _Available since v3.1._\\n     */\\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n    /**\\n     * @dev Emitted when `account` is granted `role`.\\n     *\\n     * `sender` is the account that originated the contract call, an admin role\\n     * bearer except when using {AccessControl-_setupRole}.\\n     */\\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Emitted when `account` is revoked `role`.\\n     *\\n     * `sender` is the account that originated the contract call:\\n     *   - if using `revokeRole`, it is the admin role bearer\\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n     */\\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function grantRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function revokeRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `account`.\\n     */\\n    function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `from` to `to` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the symbol of the token.\\n     */\\n    function symbol() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the decimals places of the token.\\n     */\\n    function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@venusprotocol/governance-contracts/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\"},\"@venusprotocol/solidity-utilities/contracts/constants.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\n/// @dev Base unit for computations, usually used in scaling (multiplications, divisions)\\nuint256 constant EXP_SCALE = 1e18;\\n\\n/// @dev A unit (literal one) in EXP_SCALE, usually used in additions/subtractions\\nuint256 constant MANTISSA_ONE = EXP_SCALE;\\n\\n/// @dev The approximate number of seconds per year\\nuint256 constant SECONDS_PER_YEAR = 31_536_000;\\n\",\"keccak256\":\"0x14de93ead464da249af31bea0e3bcfb62ec693bea3475fb4d90f055ac81dc5eb\",\"license\":\"BSD-3-Clause\"},\"@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/interfaces/ICappedOracle.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\ninterface ICappedOracle {\\n    function updateSnapshot() external;\\n}\\n\",\"keccak256\":\"0xad239e65b5e92b3486418c5ccca120247702251f9724cd96657c3cfdc7fedc31\",\"license\":\"BSD-3-Clause\"},\"contracts/interfaces/ISynclubStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\ninterface ISynclubStakeManager {\\n    function convertSnBnbToBnb(uint256 _amount) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x81da7034490b7e92a26c58e9f22ff08c0c13f9aa9debffc95237684989ce2e3e\",\"license\":\"BSD-3-Clause\"},\"contracts/interfaces/OracleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\ninterface OracleInterface {\\n    function getPrice(address asset) external view returns (uint256);\\n}\\n\\ninterface ResilientOracleInterface is OracleInterface {\\n    function updatePrice(address vToken) external;\\n\\n    function updateAssetPrice(address asset) external;\\n\\n    function getUnderlyingPrice(address vToken) external view returns (uint256);\\n}\\n\\ninterface BoundValidatorInterface {\\n    function validatePriceWithAnchorPrice(\\n        address asset,\\n        uint256 reporterPrice,\\n        uint256 anchorPrice\\n    ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xd3bbb7c9eef19e8f467342df6034ef95399a00964646fb8c82b438968ae3a8c0\",\"license\":\"BSD-3-Clause\"},\"contracts/oracles/SlisBNBOracle.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport { ISynclubStakeManager } from \\\"../interfaces/ISynclubStakeManager.sol\\\";\\nimport { ensureNonzeroAddress } from \\\"@venusprotocol/solidity-utilities/contracts/validators.sol\\\";\\nimport { CorrelatedTokenOracle } from \\\"./common/CorrelatedTokenOracle.sol\\\";\\nimport { EXP_SCALE } from \\\"@venusprotocol/solidity-utilities/contracts/constants.sol\\\";\\n\\n/**\\n * @title SlisBNBOracle\\n * @author Venus\\n * @notice This oracle fetches the price of slisBNB asset\\n */\\ncontract SlisBNBOracle is CorrelatedTokenOracle {\\n    /// @notice This is used as token address of BNB on BSC\\n    address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\\n\\n    /// @notice Address of StakeManager\\n    ISynclubStakeManager public immutable STAKE_MANAGER;\\n\\n    /// @notice Constructor for the implementation contract.\\n    constructor(\\n        address stakeManager,\\n        address slisBNB,\\n        address resilientOracle,\\n        uint256 annualGrowthRate,\\n        uint256 _snapshotInterval,\\n        uint256 initialSnapshotMaxExchangeRate,\\n        uint256 initialSnapshotTimestamp,\\n        address accessControlManager,\\n        uint256 _snapshotGap\\n    )\\n        CorrelatedTokenOracle(\\n            slisBNB,\\n            NATIVE_TOKEN_ADDR,\\n            resilientOracle,\\n            annualGrowthRate,\\n            _snapshotInterval,\\n            initialSnapshotMaxExchangeRate,\\n            initialSnapshotTimestamp,\\n            accessControlManager,\\n            _snapshotGap\\n        )\\n    {\\n        ensureNonzeroAddress(stakeManager);\\n        STAKE_MANAGER = ISynclubStakeManager(stakeManager);\\n    }\\n\\n    /**\\n     * @notice Fetches the amount of BNB for 1 slisBNB\\n     * @return amount The amount of BNB for slisBNB\\n     */\\n    function getUnderlyingAmount() public view override returns (uint256) {\\n        return STAKE_MANAGER.convertSnBnbToBnb(EXP_SCALE);\\n    }\\n}\\n\",\"keccak256\":\"0xc7d862d53cfc7807710ebf906542d2dc799100671b439fb4f058917a3b7f0c1d\",\"license\":\"BSD-3-Clause\"},\"contracts/oracles/common/CorrelatedTokenOracle.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport { OracleInterface, ResilientOracleInterface } from \\\"../../interfaces/OracleInterface.sol\\\";\\nimport { ensureNonzeroAddress } from \\\"@venusprotocol/solidity-utilities/contracts/validators.sol\\\";\\nimport { SECONDS_PER_YEAR } from \\\"@venusprotocol/solidity-utilities/contracts/constants.sol\\\";\\nimport { IERC20Metadata } from \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\nimport { ICappedOracle } from \\\"../../interfaces/ICappedOracle.sol\\\";\\nimport { IAccessControlManagerV8 } from \\\"@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.sol\\\";\\n\\n/**\\n * @title CorrelatedTokenOracle\\n * @notice This oracle fetches the price of a token that is correlated to another token.\\n */\\nabstract contract CorrelatedTokenOracle is OracleInterface, ICappedOracle {\\n    /// @notice Address of the correlated token\\n    address public immutable CORRELATED_TOKEN;\\n\\n    /// @notice Address of the underlying token\\n    address public immutable UNDERLYING_TOKEN;\\n\\n    /// @notice Address of Resilient Oracle\\n    ResilientOracleInterface public immutable RESILIENT_ORACLE;\\n\\n    /// @notice Address of the AccessControlManager contract\\n    IAccessControlManagerV8 public immutable ACCESS_CONTROL_MANAGER;\\n\\n    //// @notice Growth rate percentage in seconds. Ex: 1e18 is 100%\\n    uint256 public growthRatePerSecond;\\n\\n    /// @notice Snapshot update interval\\n    uint256 public snapshotInterval;\\n\\n    /// @notice Last stored snapshot maximum exchange rate\\n    uint256 public snapshotMaxExchangeRate;\\n\\n    /// @notice Last stored snapshot timestamp\\n    uint256 public snapshotTimestamp;\\n\\n    /// @notice Gap to add when updating the snapshot\\n    uint256 public snapshotGap;\\n\\n    /// @notice Emitted when the snapshot is updated\\n    event SnapshotUpdated(uint256 indexed maxExchangeRate, uint256 indexed timestamp);\\n\\n    /// @notice Emitted when the growth rate is updated\\n    event GrowthRateUpdated(\\n        uint256 indexed oldGrowthRatePerSecond,\\n        uint256 indexed newGrowthRatePerSecond,\\n        uint256 indexed oldSnapshotInterval,\\n        uint256 newSnapshotInterval\\n    );\\n\\n    /// @notice Emitted when the snapshot gap is updated\\n    event SnapshotGapUpdated(uint256 indexed oldSnapshotGap, uint256 indexed newSnapshotGap);\\n\\n    /// @notice Thrown if the token address is invalid\\n    error InvalidTokenAddress();\\n\\n    /// @notice Thrown if the growth rate is invalid\\n    error InvalidGrowthRate();\\n\\n    /// @notice Thrown if the initial snapshot is invalid\\n    error InvalidInitialSnapshot();\\n\\n    /// @notice Thrown if the max snapshot exchange rate is invalid\\n    error InvalidSnapshotMaxExchangeRate();\\n\\n    /// @notice @notice Thrown when the action is prohibited by AccessControlManager\\n    error Unauthorized(address sender, address calledContract, string methodSignature);\\n\\n    /**\\n     * @notice Constructor for the implementation contract.\\n     * @custom:error InvalidGrowthRate error is thrown if the growth rate is invalid\\n     * @custom:error InvalidInitialSnapshot error is thrown if the initial snapshot values are invalid\\n     */\\n    constructor(\\n        address _correlatedToken,\\n        address _underlyingToken,\\n        address _resilientOracle,\\n        uint256 _annualGrowthRate,\\n        uint256 _snapshotInterval,\\n        uint256 _initialSnapshotMaxExchangeRate,\\n        uint256 _initialSnapshotTimestamp,\\n        address _accessControlManager,\\n        uint256 _snapshotGap\\n    ) {\\n        growthRatePerSecond = _annualGrowthRate / SECONDS_PER_YEAR;\\n\\n        if ((growthRatePerSecond == 0 && _snapshotInterval > 0) || (growthRatePerSecond > 0 && _snapshotInterval == 0))\\n            revert InvalidGrowthRate();\\n\\n        if ((_initialSnapshotMaxExchangeRate == 0 || _initialSnapshotTimestamp == 0) && _snapshotInterval > 0) {\\n            revert InvalidInitialSnapshot();\\n        }\\n\\n        ensureNonzeroAddress(_correlatedToken);\\n        ensureNonzeroAddress(_underlyingToken);\\n        ensureNonzeroAddress(_resilientOracle);\\n        ensureNonzeroAddress(_accessControlManager);\\n\\n        CORRELATED_TOKEN = _correlatedToken;\\n        UNDERLYING_TOKEN = _underlyingToken;\\n        RESILIENT_ORACLE = ResilientOracleInterface(_resilientOracle);\\n        snapshotInterval = _snapshotInterval;\\n\\n        snapshotMaxExchangeRate = _initialSnapshotMaxExchangeRate;\\n        snapshotTimestamp = _initialSnapshotTimestamp;\\n        snapshotGap = _snapshotGap;\\n\\n        ACCESS_CONTROL_MANAGER = IAccessControlManagerV8(_accessControlManager);\\n    }\\n\\n    /**\\n     * @notice Directly sets the snapshot exchange rate and timestamp\\n     * @param _snapshotMaxExchangeRate The exchange rate to set\\n     * @param _snapshotTimestamp The timestamp to set\\n     * @custom:event Emits SnapshotUpdated event on successful update of the snapshot\\n     */\\n    function setSnapshot(uint256 _snapshotMaxExchangeRate, uint256 _snapshotTimestamp) external {\\n        _checkAccessAllowed(\\\"setSnapshot(uint256,uint256)\\\");\\n\\n        snapshotMaxExchangeRate = _snapshotMaxExchangeRate;\\n        snapshotTimestamp = _snapshotTimestamp;\\n\\n        emit SnapshotUpdated(snapshotMaxExchangeRate, snapshotTimestamp);\\n    }\\n\\n    /**\\n     * @notice Sets the growth rate and snapshot interval\\n     * @param _annualGrowthRate The annual growth rate to set\\n     * @param _snapshotInterval The snapshot interval to set\\n     * @custom:error InvalidGrowthRate error is thrown if the growth rate is invalid\\n     * @custom:event Emits GrowthRateUpdated event on successful update of the growth rate\\n     */\\n    function setGrowthRate(uint256 _annualGrowthRate, uint256 _snapshotInterval) external {\\n        _checkAccessAllowed(\\\"setGrowthRate(uint256,uint256)\\\");\\n        uint256 oldGrowthRatePerSecond = growthRatePerSecond;\\n\\n        growthRatePerSecond = _annualGrowthRate / SECONDS_PER_YEAR;\\n\\n        if ((growthRatePerSecond == 0 && _snapshotInterval > 0) || (growthRatePerSecond > 0 && _snapshotInterval == 0))\\n            revert InvalidGrowthRate();\\n\\n        emit GrowthRateUpdated(oldGrowthRatePerSecond, growthRatePerSecond, snapshotInterval, _snapshotInterval);\\n\\n        snapshotInterval = _snapshotInterval;\\n    }\\n\\n    /**\\n     * @notice Sets the snapshot gap\\n     * @param _snapshotGap The snapshot gap to set\\n     * @custom:event Emits SnapshotGapUpdated event on successful update of the snapshot gap\\n     */\\n    function setSnapshotGap(uint256 _snapshotGap) external {\\n        _checkAccessAllowed(\\\"setSnapshotGap(uint256)\\\");\\n\\n        emit SnapshotGapUpdated(snapshotGap, _snapshotGap);\\n\\n        snapshotGap = _snapshotGap;\\n    }\\n\\n    /**\\n     * @notice Returns if the price is capped\\n     * @return isCapped Boolean indicating if the price is capped\\n     */\\n    function isCapped() external view virtual returns (bool) {\\n        if (snapshotInterval == 0) {\\n            return false;\\n        }\\n\\n        uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\\n        if (maxAllowedExchangeRate == 0) {\\n            return false;\\n        }\\n\\n        uint256 exchangeRate = getUnderlyingAmount();\\n\\n        return exchangeRate > maxAllowedExchangeRate;\\n    }\\n\\n    /**\\n     * @notice Updates the snapshot price and timestamp\\n     * @custom:event Emits SnapshotUpdated event on successful update of the snapshot\\n     * @custom:error InvalidSnapshotMaxExchangeRate error is thrown if the max snapshot exchange rate is zero\\n     */\\n    function updateSnapshot() public override {\\n        if (block.timestamp - snapshotTimestamp < snapshotInterval || snapshotInterval == 0) return;\\n\\n        uint256 exchangeRate = getUnderlyingAmount();\\n        uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\\n\\n        snapshotMaxExchangeRate =\\n            (exchangeRate > maxAllowedExchangeRate ? maxAllowedExchangeRate : exchangeRate) +\\n            snapshotGap;\\n        snapshotTimestamp = block.timestamp;\\n\\n        if (snapshotMaxExchangeRate == 0) revert InvalidSnapshotMaxExchangeRate();\\n\\n        RESILIENT_ORACLE.updateAssetPrice(UNDERLYING_TOKEN);\\n        emit SnapshotUpdated(snapshotMaxExchangeRate, snapshotTimestamp);\\n    }\\n\\n    /**\\n     * @notice Fetches the price of the token\\n     * @param asset Address of the token\\n     * @return price The price of the token in scaled decimal places. It can be capped\\n     * to a maximum value taking into account the growth rate\\n     * @custom:error InvalidTokenAddress error is thrown if the token address is invalid\\n     */\\n    function getPrice(address asset) public view override returns (uint256) {\\n        if (asset != CORRELATED_TOKEN) revert InvalidTokenAddress();\\n\\n        uint256 exchangeRate = getUnderlyingAmount();\\n\\n        if (snapshotInterval == 0) {\\n            return _calculatePrice(exchangeRate);\\n        }\\n\\n        uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\\n\\n        uint256 finalExchangeRate = (exchangeRate > maxAllowedExchangeRate && maxAllowedExchangeRate != 0)\\n            ? maxAllowedExchangeRate\\n            : exchangeRate;\\n\\n        return _calculatePrice(finalExchangeRate);\\n    }\\n\\n    /**\\n     * @notice Gets the maximum allowed exchange rate for token\\n     * @return maxExchangeRate Maximum allowed exchange rate\\n     */\\n    function getMaxAllowedExchangeRate() public view returns (uint256) {\\n        uint256 timeElapsed = block.timestamp - snapshotTimestamp;\\n        uint256 maxExchangeRate = snapshotMaxExchangeRate +\\n            (snapshotMaxExchangeRate * growthRatePerSecond * timeElapsed) /\\n            1e18;\\n        return maxExchangeRate;\\n    }\\n\\n    /**\\n     * @notice Gets the underlying amount for correlated token\\n     * @return underlyingAmount Amount of underlying token\\n     */\\n    function getUnderlyingAmount() public view virtual returns (uint256);\\n\\n    /**\\n     * @notice Fetches price of the token based on an underlying exchange rate\\n     * @param exchangeRate The underlying exchange rate to use\\n     * @return price The price of the token in scaled decimal places\\n     */\\n    function _calculatePrice(uint256 exchangeRate) internal view returns (uint256) {\\n        uint256 underlyingUSDPrice = RESILIENT_ORACLE.getPrice(UNDERLYING_TOKEN);\\n\\n        IERC20Metadata token = IERC20Metadata(CORRELATED_TOKEN);\\n        uint256 decimals = token.decimals();\\n\\n        return (exchangeRate * underlyingUSDPrice) / (10 ** decimals);\\n    }\\n\\n    /**\\n     * @notice Reverts if the call is not allowed by AccessControlManager\\n     * @param signature Method signature\\n     * @custom:error Unauthorized error is thrown if the call is not allowed\\n     */\\n    function _checkAccessAllowed(string memory signature) internal view {\\n        bool isAllowedToCall = ACCESS_CONTROL_MANAGER.isAllowedToCall(msg.sender, signature);\\n\\n        if (!isAllowedToCall) {\\n            revert Unauthorized(msg.sender, address(this), signature);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x808b444fa4d1d440dc43de290f1eb59a64646ce9085028b286fa30346305872e\",\"license\":\"BSD-3-Clause\"}},\"version\":1}",
  "bytecode": "0x610120604052348015610010575f80fd5b50604051610f33380380610f3383398101604081905261002f91610190565b8773bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb8888888888888861005a6301e133808761020f565b5f81905515801561006a57505f85115b8061007e57505f805411801561007e575084155b1561009c576040516353b7e64560e11b815260040160405180910390fd5b8315806100a7575082155b80156100b257505f85115b156100d05760405163b8a5589b60e01b815260040160405180910390fd5b6100d98961014b565b6100e28861014b565b6100eb8761014b565b6100f48261014b565b6001600160a01b0398891660805296881660a05294871660c052600192909255600255600355506004919091551660e05261012e8961014b565b5050506001600160a01b03909516610100525061022e9350505050565b6001600160a01b038116610172576040516342bcdf7f60e11b815260040160405180910390fd5b50565b80516001600160a01b038116811461018b575f80fd5b919050565b5f805f805f805f805f6101208a8c0312156101a9575f80fd5b6101b28a610175565b98506101c060208b01610175565b97506101ce60408b01610175565b965060608a0151955060808a0151945060a08a0151935060c08a015192506101f860e08b01610175565b91506101008a015190509295985092959850929598565b5f8261022957634e487b7160e01b5f52601260045260245ffd5b500490565b60805160a05160c05160e05161010051610c906102a35f395f818161023b01526106e601525f818161019c015261091901525f818161027e015281816105c201526107ec01525f81816101410152818161059a01526107c001525f8181610214015281816102d6015261085a0152610c905ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c806369240426116100a9578063a4edcd4c1161006e578063a4edcd4c14610279578063a9534f8a146102a0578063abb85613146102bb578063ac5a693e146102c3578063bdf13af2146102cb575f80fd5b8063692404261461020757806369818a351461020f5780637353847a146102365780637fc4e4a01461025d5780639c43eb5414610270575f80fd5b806345be2dc7116100ef57806345be2dc7146101975780635213f9c8146101be578063596efe6f146101d3578063643d813d146101dc578063671528d4146101ef575f80fd5b806307d0413c1461012057806329db1be61461013c5780634169d2451461017b57806341976e0914610184575b5f80fd5b61012960015481565b6040519081526020015b60405180910390f35b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610133565b61012960045481565b6101296101923660046109c2565b6102d3565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6101d16101cc3660046109e8565b610384565b005b61012960025481565b6101d16101ea3660046109ff565b6103f5565b6101f76104cb565b6040519015158152602001610133565b6101d1610506565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6101d161026b3660046109ff565b61064f565b61012960035481565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b61016373bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb81565b6101296106c7565b6101295f5481565b61012961075c565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161461032657604051630f58058360e11b815260040160405180910390fd5b5f61032f6106c7565b90506001545f0361034a57610343816107a9565b9392505050565b5f61035361075c565b90505f818311801561036457508115155b61036e5782610370565b815b905061037b816107a9565b95945050505050565b6103c26040518060400160405280601781526020017f736574536e617073686f744761702875696e7432353629000000000000000000815250610900565b6004546040518291907feb3716d3f8388c182853c1dc98b18931f3a600bbab31f2ff48631f6412e4997f905f90a3600455565b6104336040518060400160405280601e81526020017f73657447726f777468526174652875696e743235362c75696e74323536290000815250610900565b5f546104436301e1338084610a33565b5f81905515801561045357505f82115b8061046757505f8054118015610467575081155b15610485576040516353b7e64560e11b815260040160405180910390fd5b6001545f54827fa65cbeb0e28a8803a912daac67c472c160aa01e2c988755fa424f290321de608856040516104bc91815260200190565b60405180910390a45060015550565b5f6001545f036104da57505f90565b5f6104e361075c565b9050805f036104f3575f91505090565b5f6104fc6106c7565b9190911192915050565b6001546003546105169042610a52565b10806105225750600154155b1561052957565b5f6105326106c7565b90505f61053d61075c565b905060045481831161054f5782610551565b815b61055b9190610a6b565b6002819055426003555f0361058357604051635f18388760e01b815260040160405180910390fd5b60405163b62cad6960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b62cad69906024015f604051808303815f87803b158015610603575f80fd5b505af1158015610615573d5f803e3d5ffd5b505050506003546002547f2c8c8fcb8c77a0ca21dcc3ab8fc0ade761557e76b1240cb40ebbef9fcee00f7d60405160405180910390a35050565b61068d6040518060400160405280601c81526020017f736574536e617073686f742875696e743235362c75696e743235362900000000815250610900565b60028290556003819055604051819083907f2c8c8fcb8c77a0ca21dcc3ab8fc0ade761557e76b1240cb40ebbef9fcee00f7d905f90a35050565b60405163ce6298e160e01b8152670de0b6b3a764000060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ce6298e190602401602060405180830381865afa158015610733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107579190610a7e565b905090565b5f806003544261076c9190610a52565b90505f670de0b6b3a7640000825f546002546107889190610a95565b6107929190610a95565b61079c9190610a33565b6002546103439190610a6b565b6040516341976e0960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f9182917f000000000000000000000000000000000000000000000000000000000000000016906341976e0990602401602060405180830381865afa158015610831573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108559190610a7e565b90505f7f000000000000000000000000000000000000000000000000000000000000000090505f816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108dc9190610aac565b60ff1690506108ec81600a610bac565b6108f68487610a95565b61037b9190610a33565b6040516318c5e8ab60e01b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906318c5e8ab906109509033908690600401610be5565b602060405180830381865afa15801561096b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098f9190610c10565b9050806109be57333083604051634a3fa29360e01b81526004016109b593929190610c2f565b60405180910390fd5b5050565b5f602082840312156109d2575f80fd5b81356001600160a01b0381168114610343575f80fd5b5f602082840312156109f8575f80fd5b5035919050565b5f8060408385031215610a10575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b5f82610a4d57634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610a6557610a65610a1f565b92915050565b80820180821115610a6557610a65610a1f565b5f60208284031215610a8e575f80fd5b5051919050565b8082028115828204841417610a6557610a65610a1f565b5f60208284031215610abc575f80fd5b815160ff81168114610343575f80fd5b600181815b80851115610b0657815f1904821115610aec57610aec610a1f565b80851615610af957918102915b93841c9390800290610ad1565b509250929050565b5f82610b1c57506001610a65565b81610b2857505f610a65565b8160018114610b3e5760028114610b4857610b64565b6001915050610a65565b60ff841115610b5957610b59610a1f565b50506001821b610a65565b5060208310610133831016604e8410600b8410161715610b87575081810a610a65565b610b918383610acc565b805f1904821115610ba457610ba4610a1f565b029392505050565b5f6103438383610b0e565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190525f90610c0890830184610bb7565b949350505050565b5f60208284031215610c20575f80fd5b81518015158114610343575f80fd5b6001600160a01b038481168252831660208201526060604082018190525f9061037b90830184610bb756fea2646970667358221220bd7f4453b3212b60002fe4427a7c39d0f659354b7eec464964ebbbf40769a49364736f6c63430008190033",
  "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061011c575f3560e01c806369240426116100a9578063a4edcd4c1161006e578063a4edcd4c14610279578063a9534f8a146102a0578063abb85613146102bb578063ac5a693e146102c3578063bdf13af2146102cb575f80fd5b8063692404261461020757806369818a351461020f5780637353847a146102365780637fc4e4a01461025d5780639c43eb5414610270575f80fd5b806345be2dc7116100ef57806345be2dc7146101975780635213f9c8146101be578063596efe6f146101d3578063643d813d146101dc578063671528d4146101ef575f80fd5b806307d0413c1461012057806329db1be61461013c5780634169d2451461017b57806341976e0914610184575b5f80fd5b61012960015481565b6040519081526020015b60405180910390f35b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610133565b61012960045481565b6101296101923660046109c2565b6102d3565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6101d16101cc3660046109e8565b610384565b005b61012960025481565b6101d16101ea3660046109ff565b6103f5565b6101f76104cb565b6040519015158152602001610133565b6101d1610506565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6101d161026b3660046109ff565b61064f565b61012960035481565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b61016373bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb81565b6101296106c7565b6101295f5481565b61012961075c565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161461032657604051630f58058360e11b815260040160405180910390fd5b5f61032f6106c7565b90506001545f0361034a57610343816107a9565b9392505050565b5f61035361075c565b90505f818311801561036457508115155b61036e5782610370565b815b905061037b816107a9565b95945050505050565b6103c26040518060400160405280601781526020017f736574536e617073686f744761702875696e7432353629000000000000000000815250610900565b6004546040518291907feb3716d3f8388c182853c1dc98b18931f3a600bbab31f2ff48631f6412e4997f905f90a3600455565b6104336040518060400160405280601e81526020017f73657447726f777468526174652875696e743235362c75696e74323536290000815250610900565b5f546104436301e1338084610a33565b5f81905515801561045357505f82115b8061046757505f8054118015610467575081155b15610485576040516353b7e64560e11b815260040160405180910390fd5b6001545f54827fa65cbeb0e28a8803a912daac67c472c160aa01e2c988755fa424f290321de608856040516104bc91815260200190565b60405180910390a45060015550565b5f6001545f036104da57505f90565b5f6104e361075c565b9050805f036104f3575f91505090565b5f6104fc6106c7565b9190911192915050565b6001546003546105169042610a52565b10806105225750600154155b1561052957565b5f6105326106c7565b90505f61053d61075c565b905060045481831161054f5782610551565b815b61055b9190610a6b565b6002819055426003555f0361058357604051635f18388760e01b815260040160405180910390fd5b60405163b62cad6960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b62cad69906024015f604051808303815f87803b158015610603575f80fd5b505af1158015610615573d5f803e3d5ffd5b505050506003546002547f2c8c8fcb8c77a0ca21dcc3ab8fc0ade761557e76b1240cb40ebbef9fcee00f7d60405160405180910390a35050565b61068d6040518060400160405280601c81526020017f736574536e617073686f742875696e743235362c75696e743235362900000000815250610900565b60028290556003819055604051819083907f2c8c8fcb8c77a0ca21dcc3ab8fc0ade761557e76b1240cb40ebbef9fcee00f7d905f90a35050565b60405163ce6298e160e01b8152670de0b6b3a764000060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ce6298e190602401602060405180830381865afa158015610733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107579190610a7e565b905090565b5f806003544261076c9190610a52565b90505f670de0b6b3a7640000825f546002546107889190610a95565b6107929190610a95565b61079c9190610a33565b6002546103439190610a6b565b6040516341976e0960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f9182917f000000000000000000000000000000000000000000000000000000000000000016906341976e0990602401602060405180830381865afa158015610831573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108559190610a7e565b90505f7f000000000000000000000000000000000000000000000000000000000000000090505f816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108dc9190610aac565b60ff1690506108ec81600a610bac565b6108f68487610a95565b61037b9190610a33565b6040516318c5e8ab60e01b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906318c5e8ab906109509033908690600401610be5565b602060405180830381865afa15801561096b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098f9190610c10565b9050806109be57333083604051634a3fa29360e01b81526004016109b593929190610c2f565b60405180910390fd5b5050565b5f602082840312156109d2575f80fd5b81356001600160a01b0381168114610343575f80fd5b5f602082840312156109f8575f80fd5b5035919050565b5f8060408385031215610a10575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b5f82610a4d57634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610a6557610a65610a1f565b92915050565b80820180821115610a6557610a65610a1f565b5f60208284031215610a8e575f80fd5b5051919050565b8082028115828204841417610a6557610a65610a1f565b5f60208284031215610abc575f80fd5b815160ff81168114610343575f80fd5b600181815b80851115610b0657815f1904821115610aec57610aec610a1f565b80851615610af957918102915b93841c9390800290610ad1565b509250929050565b5f82610b1c57506001610a65565b81610b2857505f610a65565b8160018114610b3e5760028114610b4857610b64565b6001915050610a65565b60ff841115610b5957610b59610a1f565b50506001821b610a65565b5060208310610133831016604e8410600b8410161715610b87575081810a610a65565b610b918383610acc565b805f1904821115610ba457610ba4610a1f565b029392505050565b5f6103438383610b0e565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190525f90610c0890830184610bb7565b949350505050565b5f60208284031215610c20575f80fd5b81518015158114610343575f80fd5b6001600160a01b038481168252831660208201526060604082018190525f9061037b90830184610bb756fea2646970667358221220bd7f4453b3212b60002fe4427a7c39d0f659354b7eec464964ebbbf40769a49364736f6c63430008190033",
  "devdoc": {
    "author": "Venus",
    "kind": "dev",
    "methods": {
      "getMaxAllowedExchangeRate()": {
        "returns": {
          "_0": "maxExchangeRate Maximum allowed exchange rate"
        }
      },
      "getPrice(address)": {
        "custom:error": "InvalidTokenAddress error is thrown if the token address is invalid",
        "params": {
          "asset": "Address of the token"
        },
        "returns": {
          "_0": "price The price of the token in scaled decimal places. It can be capped to a maximum value taking into account the growth rate"
        }
      },
      "getUnderlyingAmount()": {
        "returns": {
          "_0": "amount The amount of BNB for slisBNB"
        }
      },
      "isCapped()": {
        "returns": {
          "_0": "isCapped Boolean indicating if the price is capped"
        }
      },
      "setGrowthRate(uint256,uint256)": {
        "custom:error": "InvalidGrowthRate error is thrown if the growth rate is invalid",
        "custom:event": "Emits GrowthRateUpdated event on successful update of the growth rate",
        "params": {
          "_annualGrowthRate": "The annual growth rate to set",
          "_snapshotInterval": "The snapshot interval to set"
        }
      },
      "setSnapshot(uint256,uint256)": {
        "custom:event": "Emits SnapshotUpdated event on successful update of the snapshot",
        "params": {
          "_snapshotMaxExchangeRate": "The exchange rate to set",
          "_snapshotTimestamp": "The timestamp to set"
        }
      },
      "setSnapshotGap(uint256)": {
        "custom:event": "Emits SnapshotGapUpdated event on successful update of the snapshot gap",
        "params": {
          "_snapshotGap": "The snapshot gap to set"
        }
      },
      "updateSnapshot()": {
        "custom:error": "InvalidSnapshotMaxExchangeRate error is thrown if the max snapshot exchange rate is zero",
        "custom:event": "Emits SnapshotUpdated event on successful update of the snapshot"
      }
    },
    "title": "SlisBNBOracle",
    "version": 1
  },
  "userdoc": {
    "errors": {
      "InvalidGrowthRate()": [
        {
          "notice": "Thrown if the growth rate is invalid"
        }
      ],
      "InvalidInitialSnapshot()": [
        {
          "notice": "Thrown if the initial snapshot is invalid"
        }
      ],
      "InvalidSnapshotMaxExchangeRate()": [
        {
          "notice": "Thrown if the max snapshot exchange rate is invalid"
        }
      ],
      "InvalidTokenAddress()": [
        {
          "notice": "Thrown if the token address is invalid"
        }
      ],
      "Unauthorized(address,address,string)": [
        {
          "notice": "@notice Thrown when the action is prohibited by AccessControlManager"
        }
      ],
      "ZeroAddressNotAllowed()": [
        {
          "notice": "Thrown if the supplied address is a zero address where it is not allowed"
        }
      ]
    },
    "events": {
      "GrowthRateUpdated(uint256,uint256,uint256,uint256)": {
        "notice": "Emitted when the growth rate is updated"
      },
      "SnapshotGapUpdated(uint256,uint256)": {
        "notice": "Emitted when the snapshot gap is updated"
      },
      "SnapshotUpdated(uint256,uint256)": {
        "notice": "Emitted when the snapshot is updated"
      }
    },
    "kind": "user",
    "methods": {
      "ACCESS_CONTROL_MANAGER()": {
        "notice": "Address of the AccessControlManager contract"
      },
      "CORRELATED_TOKEN()": {
        "notice": "Address of the correlated token"
      },
      "NATIVE_TOKEN_ADDR()": {
        "notice": "This is used as token address of BNB on BSC"
      },
      "RESILIENT_ORACLE()": {
        "notice": "Address of Resilient Oracle"
      },
      "STAKE_MANAGER()": {
        "notice": "Address of StakeManager"
      },
      "UNDERLYING_TOKEN()": {
        "notice": "Address of the underlying token"
      },
      "constructor": {
        "notice": "Constructor for the implementation contract."
      },
      "getMaxAllowedExchangeRate()": {
        "notice": "Gets the maximum allowed exchange rate for token"
      },
      "getPrice(address)": {
        "notice": "Fetches the price of the token"
      },
      "getUnderlyingAmount()": {
        "notice": "Fetches the amount of BNB for 1 slisBNB"
      },
      "isCapped()": {
        "notice": "Returns if the price is capped"
      },
      "setGrowthRate(uint256,uint256)": {
        "notice": "Sets the growth rate and snapshot interval"
      },
      "setSnapshot(uint256,uint256)": {
        "notice": "Directly sets the snapshot exchange rate and timestamp"
      },
      "setSnapshotGap(uint256)": {
        "notice": "Sets the snapshot gap"
      },
      "snapshotGap()": {
        "notice": "Gap to add when updating the snapshot"
      },
      "snapshotInterval()": {
        "notice": "Snapshot update interval"
      },
      "snapshotMaxExchangeRate()": {
        "notice": "Last stored snapshot maximum exchange rate"
      },
      "snapshotTimestamp()": {
        "notice": "Last stored snapshot timestamp"
      },
      "updateSnapshot()": {
        "notice": "Updates the snapshot price and timestamp"
      }
    },
    "notice": "This oracle fetches the price of slisBNB asset",
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 6407,
        "contract": "contracts/oracles/SlisBNBOracle.sol:SlisBNBOracle",
        "label": "growthRatePerSecond",
        "offset": 0,
        "slot": "0",
        "type": "t_uint256"
      },
      {
        "astId": 6410,
        "contract": "contracts/oracles/SlisBNBOracle.sol:SlisBNBOracle",
        "label": "snapshotInterval",
        "offset": 0,
        "slot": "1",
        "type": "t_uint256"
      },
      {
        "astId": 6413,
        "contract": "contracts/oracles/SlisBNBOracle.sol:SlisBNBOracle",
        "label": "snapshotMaxExchangeRate",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 6416,
        "contract": "contracts/oracles/SlisBNBOracle.sol:SlisBNBOracle",
        "label": "snapshotTimestamp",
        "offset": 0,
        "slot": "3",
        "type": "t_uint256"
      },
      {
        "astId": 6419,
        "contract": "contracts/oracles/SlisBNBOracle.sol:SlisBNBOracle",
        "label": "snapshotGap",
        "offset": 0,
        "slot": "4",
        "type": "t_uint256"
      }
    ],
    "types": {
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}
