function testFuzz_TraderCanBeMovedToLiquidationZoneByOtherTraders(
uint256 marketId,
uint256 accountMarginSasuke
)
external
givenTheSenderIsARegisteredLiquidator
whenTheAccountsIdsArrayIsNotEmpty
givenAllAccountsExist
{
uint256 staticMockOpenPrice = 1000e18;
bool isLong = true;
TestFuzz_GivenThereAreLiquidatableAccountsInTheArray_Context memory ctxSasuke;
TestFuzz_GivenThereAreLiquidatableAccountsInTheArray_Context memory ctx;
ctx.fuzzMarketConfig = getFuzzMarketConfig(marketId);
ctxSasuke.fuzzMarketConfig = ctx.fuzzMarketConfig;
ctx.marginValueUsd = 1_000_000e18;
ctx.initialMarginRate = ctx.fuzzMarketConfig.imr;
deal({ token: address(usdz), to: users.naruto.account, give: ctx.marginValueUsd });
ctx.accountsIds = new uint128[](1);
ctx.accountMarginValueUsd = ctx.marginValueUsd;
ctx.tradingAccountId = createAccountAndDeposit(ctx.accountMarginValueUsd, address(usdz));
console.log("The skew before any trades is: ", uint256(skewBefore));
console.log("this initial margin requirement is: ", ctx.fuzzMarketConfig.imr); */
uint256 marginValueInt = 10_000e18;
uint256 tradeSize = marginValueInt
- marginValueInt * (ctx.fuzzMarketConfig.imr + ctx.fuzzMarketConfig.orderFees.takerFee) / 1e18 - 200e18;
openManualPosition(
ctx.fuzzMarketConfig.marketId,
ctx.fuzzMarketConfig.streamId,
staticMockOpenPrice,
ctx.tradingAccountId,
int128(int256((tradeSize)))
);
(,, UD60x18 initialTotalOpenInterest) = perpsEngine.getOpenInterest(ctx.fuzzMarketConfig.marketId);
console.log("Skew after Naruto is: ", uint256(skewAfterNaruto)); */
ctx.accountsIds[0] = ctx.tradingAccountId;
deal({ token: address(usdz), to: users.naruto.account, give: ctx.marginValueUsd });
address sasuke = makeAddr("sasuke");
changePrank(sasuke);
ctx.marginValueUsd = 1_000_000e18 * 4;
ctx.initialMarginRate = ctx.fuzzMarketConfig.imr;
deal({ token: address(usdz), to: address(sasuke), give: ctx.marginValueUsd });
IERC20(usdz).approve(address(perpsEngine), ctx.marginValueUsd);
ctx.accountMarginValueUsd = ctx.marginValueUsd;
ctx.tradingAccountId = createAccountAndDeposit(ctx.accountMarginValueUsd, address(usdz));
int128 sasukeTradeSize = int128(925e18 * 4);
openManualPosition(
ctx.fuzzMarketConfig.marketId,
ctx.fuzzMarketConfig.streamId,
staticMockOpenPrice,
ctx.tradingAccountId,
sasukeTradeSize
);
address traderOne = makeAddr("traderOne");
changePrank(traderOne);
ctx.marginValueUsd = 1_000_000e18 * 8;
ctx.initialMarginRate = ctx.fuzzMarketConfig.imr;
deal({ token: address(usdz), to: address(traderOne), give: ctx.marginValueUsd });
IERC20(usdz).approve(address(perpsEngine), ctx.marginValueUsd);
ctx.accountMarginValueUsd = ctx.marginValueUsd;
ctx.tradingAccountId = createAccountAndDeposit(ctx.accountMarginValueUsd, address(usdz));
openManualPosition(
ctx.fuzzMarketConfig.marketId,
ctx.fuzzMarketConfig.streamId,
staticMockOpenPrice,
ctx.tradingAccountId,
sasukeTradeSize * 2
);
address traderTwo = makeAddr("traderTwo");
changePrank(traderTwo);
ctxSasuke.marginValueUsd = 400_000e18;
ctxSasuke.initialMarginRate = ctx.fuzzMarketConfig.imr;
deal({ token: address(usdz), to: address(traderTwo), give: ctxSasuke.marginValueUsd });
IERC20(usdz).approve(address(perpsEngine), ctxSasuke.marginValueUsd);
ctxSasuke.accountMarginValueUsd = ctxSasuke.marginValueUsd;
ctxSasuke.tradingAccountId = createAccountAndDeposit(ctxSasuke.accountMarginValueUsd, address(usdz));
openPosition(
ctxSasuke.fuzzMarketConfig,
ctxSasuke.tradingAccountId,
ctxSasuke.initialMarginRate,
ctxSasuke.accountMarginValueUsd,
isLong
);
address traderThree = makeAddr("traderThree");
changePrank(traderThree);
ctxSasuke.marginValueUsd = 400_000e18;
ctxSasuke.initialMarginRate = ctx.fuzzMarketConfig.imr;
deal({ token: address(usdz), to: address(traderThree), give: ctxSasuke.marginValueUsd });
IERC20(usdz).approve(address(perpsEngine), ctxSasuke.marginValueUsd);
ctxSasuke.accountMarginValueUsd = ctxSasuke.marginValueUsd;
ctxSasuke.tradingAccountId = createAccountAndDeposit(ctxSasuke.accountMarginValueUsd, address(usdz));
openPosition(
ctxSasuke.fuzzMarketConfig,
ctxSasuke.tradingAccountId,
ctxSasuke.initialMarginRate,
ctxSasuke.accountMarginValueUsd,
true
);
address traderFour = makeAddr("traderFour");
changePrank(traderFour);
ctxSasuke.marginValueUsd = 400_000e18;
ctxSasuke.initialMarginRate = ctx.fuzzMarketConfig.imr;
deal({ token: address(usdz), to: address(traderFour), give: ctxSasuke.marginValueUsd });
IERC20(usdz).approve(address(perpsEngine), ctxSasuke.marginValueUsd);
ctxSasuke.accountMarginValueUsd = ctxSasuke.marginValueUsd;
ctxSasuke.tradingAccountId = createAccountAndDeposit(ctxSasuke.accountMarginValueUsd, address(usdz));
openPosition(
ctxSasuke.fuzzMarketConfig,
ctxSasuke.tradingAccountId,
ctxSasuke.initialMarginRate,
ctxSasuke.accountMarginValueUsd,
true
);
deal({ token: address(usdz), to: address(sasuke), give: ctxSasuke.marginValueUsd });
perpsEngine.exposed_getUnrealizedPnl(1, ctxSasuke.fuzzMarketConfig.marketId, ud60x18(1e18));
if (unrealizedPnl.intoInt256() <= 0) {
uint256 absolutePnl = uint256(-1 * unrealizedPnl.intoInt256());
console.log("The PNL is negative: ", absolutePnl);
} else {
console.log("The Pnl is positive: ", uint256(unrealizedPnl.intoInt256()));
} */
console.log("The max skew is ", ctx.fuzzMarketConfig.maxSkew);
console.log("Final Skew is ", uint256(skewAfterNaruto)); */
(,, UD60x18 finalTotalOpenInterest) = perpsEngine.getOpenInterest(ctx.fuzzMarketConfig.marketId);
console.log("Total open Interest after first Trade:", initialTotalOpenInterest.intoUint256());
console.log("Total open Interest is:", finalTotalOpenInterest.intoUint256());
changePrank({ msgSender: liquidationKeeper });
vm.recordLogs();
perpsEngine.liquidateAccounts(ctx.accountsIds);
assertEq(vm.getRecordedLogs().length, 0);
}