Untitled
unknown
plain_text
3 years ago
1.8 kB
11
Indexable
function executeDecreasePosition(bytes32 _key, address payable _executionFeeReceiver) public nonReentrant returns (bool) {
DecreasePositionRequest memory request = decreasePositionRequests[_key];
// if the request was already executed or cancelled, return true so that the executeDecreasePositions loop will continue executing the next request
if (request.account == address(0)) { return true; }
bool shouldExecute = _validateExecution(request.blockNumber, request.blockTime, request.account);
if (!shouldExecute) { return false; }
delete decreasePositionRequests[_key];
uint256 amountOut = _decreasePosition(request.account, request.path[0], request.indexToken, request.collateralDelta, request.sizeDelta, request.isLong, address(this), request.acceptablePrice);
if (request.path.length > 1) {
IERC20(request.path[0]).safeTransfer(vault, amountOut);
amountOut = _swap(request.path, request.minOut, address(this));
}
if (request.withdrawETH) {
_transferOutETHWithGasLimit(amountOut, payable(request.receiver));
} else {
IERC20(request.path[request.path.length - 1]).safeTransfer(request.receiver, amountOut);
}
_transferOutETH(request.executionFee, _executionFeeReceiver);
emit ExecuteDecreasePosition(
request.account,
request.path,
request.indexToken,
request.collateralDelta,
request.sizeDelta,
request.isLong,
request.receiver,
request.acceptablePrice,
request.minOut,
request.executionFee,
block.number.sub(request.blockNumber),
block.timestamp.sub(request.blockTime)
);
return true;
}Editor is loading...