Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
535 changes: 535 additions & 0 deletions test/Reentrancy/GMXProtocol/ExploitSC.sol

Large diffs are not rendered by default.

14 changes: 14 additions & 0 deletions test/Reentrancy/GMXProtocol/IFastPriceFeed.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IFastPriceFeed {
// Only the updater can call this function
function setPricesWithBitsAndExecute(
uint256 _priceBits,
uint256 _timestamp,
uint256 _endIndexForIncreasePositions,
uint256 _endIndexForDecreasePositions,
uint256 _maxIncreasePositions,
uint256 _maxDecreasePositions
) external;
}
10 changes: 10 additions & 0 deletions test/Reentrancy/GMXProtocol/IGlpManager.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IGlpManager {
function getGlobalShortAveragePrice(
address _token
) external view returns (uint256);

function getAum(bool maximise) external view returns (uint256);
}
84 changes: 84 additions & 0 deletions test/Reentrancy/GMXProtocol/IOrderBook.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IOrderBook {
struct DecreaseOrder {
address account;
address collateralToken;
uint256 collateralDelta;
address indexToken;
uint256 sizeDelta;
bool isLong;
uint256 triggerPrice;
bool triggerAboveThreshold;
uint256 executionFee;
}


function decreaseOrders(address _account, uint256 _orderIndex) external view returns (
DecreaseOrder memory
);
function decreaseOrdersIndex(address) external view returns (uint256);
function getSwapOrder(address _account, uint256 _orderIndex) external view returns (
address path0,
address path1,
address path2,
uint256 amountIn,
uint256 minOut,
uint256 triggerRatio,
bool triggerAboveThreshold,
bool shouldUnwrap,
uint256 executionFee
);

function getIncreaseOrder(address _account, uint256 _orderIndex) external view returns (
address purchaseToken,
uint256 purchaseTokenAmount,
address collateralToken,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee
);

function getDecreaseOrder(address _account, uint256 _orderIndex) external view returns (
address collateralToken,
uint256 collateralDelta,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee
);

function executeSwapOrder(address, uint256, address payable) external;
function executeDecreaseOrder(address, uint256, address payable) external;
function executeIncreaseOrder(address, uint256, address payable) external;

function createIncreaseOrder(
address[] memory _path,
uint256 _amountIn,
address _indexToken,
uint256 _minOut,
uint256 _sizeDelta,
address _collateralToken,
bool _isLong,
uint256 _triggerPrice,
bool _triggerAboveThreshold,
uint256 _executionFee,
bool _shouldWrap
) external payable;

function createDecreaseOrder(
address _indexToken,
uint256 _sizeDelta,
address _collateralToken,
uint256 _collateralDelta,
bool _isLong,
uint256 _triggerPrice,
bool _triggerAboveThreshold
) external payable;
}
8 changes: 8 additions & 0 deletions test/Reentrancy/GMXProtocol/IPositionManager.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IPositionManager {
// This functions can only be called by the keeper
function executeDecreaseOrder(address _account, uint256 _orderIndex, address payable _feeReceiver) external;
function executeIncreaseOrder(address _account, uint256 _orderIndex, address payable _feeReceiver) external;
}
18 changes: 18 additions & 0 deletions test/Reentrancy/GMXProtocol/IPositionRouter.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IPositionRouter {
function createDecreasePosition(
address[] memory _path,
address _indexToken,
uint256 _collateralDelta,
uint256 _sizeDelta,
bool _isLong,
address _receiver,
uint256 _acceptablePrice,
uint256 _minOut,
uint256 _executionFee,
bool _withdrawETH,
address _callbackTarget
) external payable returns (bytes32);
}
18 changes: 18 additions & 0 deletions test/Reentrancy/GMXProtocol/IRewardRouterV2.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IRewardRouterV2 {
function mintAndStakeGlp(
address _token,
uint256 _amount,
uint256 _minUsdg,
uint256 _minGlp
) external returns (uint256);

function unstakeAndRedeemGlp(
address _tokenOut,
uint256 _glpAmount,
uint256 _minOut,
address _receiver
) external returns (uint256);
}
6 changes: 6 additions & 0 deletions test/Reentrancy/GMXProtocol/IRouter.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IRouter {
function approvePlugin(address _plugin) external;
}
56 changes: 56 additions & 0 deletions test/Reentrancy/GMXProtocol/IVault.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IVaultUtils {
struct Position {
uint256 size;
uint256 collateral;
uint256 averagePrice;
uint256 entryFundingRate;
uint256 reserveAmount;
int256 realisedPnl;
uint256 lastIncreasedTime;
}

function updateCumulativeFundingRate(address _collateralToken, address _indexToken) external returns (bool);
function validateIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external view;
function validateDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external view;
function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256);
function getEntryFundingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256);
function getPositionFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _sizeDelta) external view returns (uint256);
function getFundingFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _size, uint256 _entryFundingRate) external view returns (uint256);
function getBuyUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getSellUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getSwapFeeBasisPoints(address _tokenIn, address _tokenOut, uint256 _usdgAmount) external view returns (uint256);
function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);
}

interface IVault {
struct Position {
uint256 size;
uint256 collateral;
uint256 averagePrice;
uint256 entryFundingRate;
uint256 reserveAmount;
int256 realisedPnl;
uint256 lastIncreasedTime;
}

function getMinPrice(address _token) external view returns (uint256);

function getMaxPrice(address _token) external view returns (uint256);

function getPosition(address _account, address _collateralToken, address _indexToken, bool _isLong) external view returns (Position memory);

function increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external;

function decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256);

function reservedAmounts(address _token) external view returns (uint256);

function poolAmounts(address _token) external view returns (uint256);

function usdgAmounts(address _token) external view returns (uint256);

function maxUsdgAmounts(address _token) external view returns (uint256);
}
Loading