Skip to content

Commit

Permalink
👷🏻 Handle insufficient margin
Browse files Browse the repository at this point in the history
  • Loading branch information
tommyrharper committed Jul 11, 2024
1 parent 9b04be9 commit 592d355
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 6 deletions.
31 changes: 25 additions & 6 deletions src/MarginPaymaster.sol
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,6 @@ contract MarginPaymaster is IPaymaster, Zap, Ownable {
POST OP
//////////////////////////////////////////////////////////////*/

// TODO: handle user not having enough funds
function postOp(
PostOpMode,
bytes calldata context,
Expand All @@ -144,9 +143,12 @@ contract MarginPaymaster is IPaymaster, Zap, Ownable {
uint256 sUSDToWithdrawFromMargin = (costOfGasInUSDC -
availableUSDCInWallet) * 1e12;
// TODO: handle users who don't have an snx account or margin or enough margin
withdrawFromMargin(sender, sUSDToWithdrawFromMargin);
uint256 withdrawn = withdrawFromMargin(
sender,
sUSDToWithdrawFromMargin
);
// zap sUSD into USDC
_zapOut(sUSDToWithdrawFromMargin);
_zapOut(withdrawn);
}
}

Expand Down Expand Up @@ -212,16 +214,33 @@ contract MarginPaymaster is IPaymaster, Zap, Ownable {
return uint128(snxV3AccountsModule.tokenOfOwnerByIndex(wallet, 0));
}

/// @notice withdraws sUSD from margin account
/// @notice if insufficent margin, pulls out whatever is available
function withdrawFromMargin(
address sender,
uint256 sUSDToWithdrawFromMargin
) internal {
) internal returns (uint256) {
uint128 accountId = getWalletAccountId(sender);
int256 withdrawableMargin = perpsMarketSNXV3.getWithdrawableMargin(
accountId
);

if (withdrawableMargin < 0) return 0;
uint256 withdrawableMarginUint = uint256(withdrawableMargin);

uint256 amountToPullFromMargin = sUSDToWithdrawFromMargin <
withdrawableMarginUint
? sUSDToWithdrawFromMargin
: withdrawableMarginUint;

// pull sUSD from margin
perpsMarketSNXV3.modifyCollateral(
getWalletAccountId(sender),
accountId,
sUSDId,
-int256(sUSDToWithdrawFromMargin)
-int256(amountToPullFromMargin)
);

return amountToPullFromMargin;
}

function swapUSDCForWETH(
Expand Down
4 changes: 4 additions & 0 deletions src/interfaces/external/IPerpsMarketProxy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ interface IPerpsMarketProxy {

function getAccountTokenAddress() external view returns (address accountNftToken);

function getWithdrawableMargin(
uint128 accountId
) external view returns (int256 withdrawableMargin);

/// @notice Returns the address that owns a given account, as recorded by the system.
/// @param accountId The account id whose owner is being retrieved.
/// @return owner The owner of the given account id.
Expand Down

0 comments on commit 592d355

Please sign in to comment.