Manual review.
Write and run test for the getting current funding rate function. Consider the one below.
File: /test/integration/perpetuals/perp-market-branch/getFundingRate/getFundingRate.t.sol
import { PerpMarket } from "@zaros/perpetuals/leaves/PerpMarket.sol";
import { PerpMarketHarness } from "test/harnesses/perpetuals/leaves/PerpMarketHarness.sol";
import { UD60x18, convert as ud60x18Convert, ud60x18 } from "@prb-math/UD60x18.sol";
import { SD59x18, sd59x18, unary, convert as sd59x18Convert } from "@prb-math/SD59x18.sol";
import { console } from "forge-std/console.sol";
function testFuzz_GetPendingFundingFeePerUnit(
uint128 marketId,
uint256 marginValueUsd,
bool isLong,
uint256 timeElapsed
)
external
{
MarketConfig memory fuzzMarketConfig = getFuzzMarketConfig(marketId);
marginValueUsd = bound({
x: marginValueUsd,
min: USDC_MIN_DEPOSIT_MARGIN,
max: convertUd60x18ToTokenAmount(address(usdc), USDC_DEPOSIT_CAP_X18)
});
timeElapsed = bound({ x: timeElapsed, min: 1 seconds, max: 365 days });
deal({ token: address(usdc), to: users.naruto.account, give: marginValueUsd });
uint256 initialMarginRate = ud60x18(fuzzMarketConfig.imr).mul(ud60x18(1.001e18)).intoUint256();
uint128 tradingAccountId = createAccountAndDeposit(marginValueUsd, address(usdc));
openPosition(fuzzMarketConfig, tradingAccountId, initialMarginRate, marginValueUsd, isLong);
skip(timeElapsed);
PerpMarketHarness perpMarketHarness = PerpMarketHarness(address(perpsEngine));
UD60x18 indexPriceX18 = ud60x18(fuzzMarketConfig.mockUsdPrice);
UD60x18 markPrice = perpsEngine.getMarkPrice(fuzzMarketConfig.marketId, indexPriceX18.intoUint256(), 0);
SD59x18 fundingRate = perpsEngine.getFundingRate(fuzzMarketConfig.marketId);
PerpMarket.Data memory perpMarket = perpMarketHarness.exposed_PerpMarket_load(fuzzMarketConfig.marketId);
SD59x18 avgFundingRate = unary(sd59x18(perpMarket.lastFundingRate).add(fundingRate)).div(sd59x18Convert(2));
int256 expectedPendingFundingFeePerUnit = avgFundingRate.mul(ud60x18Convert(timeElapsed).intoSD59x18()).mul(
markPrice.intoSD59x18()
).intoInt256();
SD59x18 pendingFundingFeePerUnit = perpMarketHarness.exposed_getPendingFundingFeePerUnit(
fuzzMarketConfig.marketId,
fundingRate,
markPrice
);
console.log("pendingFundingFeePerUnit", pendingFundingFeePerUnit.intoInt256());
console.log("expectedPendingFundingFeePerUnit", expectedPendingFundingFeePerUnit);
assertAlmostEq(pendingFundingFeePerUnit.intoInt256(), expectedPendingFundingFeePerUnit, 1);
}