Omniscia Steadefi Audit
GMXPerpetualDEXLongVault Code Style Findings
GMXPerpetualDEXLongVault Code Style Findings
GMX-01C: Ineffectual Usage of Safe Arithmetics
Type | Severity | Location |
---|---|---|
Language Specific | GMXPerpetualDEXLongVault.sol:L195 |
Description:
The linked mathematical operation is guaranteed to be performed safely by surrounding conditionals evaluated in either require
checks or if-else
constructs.
Example:
192require(_shareAmt <= balanceOf(msg.sender), "Withdraw amt exceeds balance");193
194// to avoid leaving dust behind195if (balanceOf(msg.sender) - _shareAmt < (1 * SAFE_MULTIPLIER / 10)) {196 _shareAmt = balanceOf(msg.sender);197}
Recommendation:
Given that safe arithmetics are toggled on by default in pragma
versions of 0.8.X
, we advise the linked statement to be wrapped in an unchecked
code block thereby optimizing its execution cost.
Alleviation (4325253d6de0ea91c1e9fb9e01d2e7e98f3d83a9):
The referenced subtraction is optimally wrapped in an unchecked
code block in the latest implementation of GMXPerpetualDEXLongVault
.
GMX-02C: Inefficient Transfer Flow
Type | Severity | Location |
---|---|---|
Gas Optimization | GMXPerpetualDEXLongVault.sol:L146-L147 |
Description:
The referenced transfer flow transmits the funds from the msg.sender
to the contract itself and then to the manager
.
Example:
146token.safeTransferFrom(msg.sender, address(this), _amt);147token.safeTransfer(address(manager), _amt);
Recommendation:
We advise the funds to be transmitted directly from the msg.sender
to the manager
by utilizing a single safeTransferFrom
call with the correct arguments.
Alleviation (4325253d6de0ea91c1e9fb9e01d2e7e98f3d83a9):
The inefficient transfer flow has been remediated by directly transferring the token
funds from the msg.sender
to the target manager
.
GMX-03C: Inexplicable Transfer of Dust
Type | Severity | Location |
---|---|---|
Gas Optimization | GMXPerpetualDEXLongVault.sol:L261 |
Description:
The GMXPerpetualDEXLongManager::work
execution flow when a deposit is performed will utilize the full available balance of the user when minting and staking the GLP, rendering any "dust" clean-up redundant.
Example:
247manager.work(248 ManagerAction.Deposit, /* action */249 0, /* lpAmt */250 borrowTokenAmt, /* borrowTokenAmt */251 0 /* repayTokenAAmt */252);253
254uint256 _equityChange = (reader.assetValueWithPrice(glpPrice) - reader.debtValue()) - equityBefore;255// calculate shares to users256uint256 sharesToUser = valueToShares(_equityChange, equityBefore);257
258_mint(msg.sender, sharesToUser);259
260// transfer dust261token.safeTransfer(msg.sender, token.balanceOf(address(this)));
Recommendation:
We advise the safeTransfer
function to be omitted from this point as it is ineffectual.
Alleviation (4325253d6de0ea91c1e9fb9e01d2e7e98f3d83a9):
The transfer of "dust" has been removed per our recommendation, optimizing all GMXPerpetualDEXLongVault::_deposit
operations.
GMX-04C: Repetitive Value Literal
Type | Severity | Location |
---|---|---|
Code Style | GMXPerpetualDEXLongVault.sol:L195, L272 |
Description:
The linked value literal is repeated across the codebase multiple times.
Example:
195if (balanceOf(msg.sender) - _shareAmt < (1 * SAFE_MULTIPLIER / 10)) {
Recommendation:
We advise it to be set to a constant
variable instead optimizing the legibility of the codebase.
Alleviation (4325253d6d):
The repetitive value literal outlined has been replaced by the 1e17
statement in each instance; the exhibit's recommendation, however, is to declare the value as a contract-level constant
that is in turn utilized in the referenced statements. As such, we consider this exhibit partially alleviated.
Alleviation (7c9b2b09db):
The 1e17
value literal that resulted from the original calculation was relocated to its dedicated DUST_AMOUNT
constant variable as advised, addressing this exhibit in full.
GMX-05C: Variable Mutability Specifiers (Immutable)
Type | Severity | Location |
---|---|---|
Gas Optimization | GMXPerpetualDEXLongVault.sol:L95, L96, L101 |
Description:
The linked variables are assigned to only once during the contract's constructor
.
Example:
84constructor (85 string memory _name,86 string memory _symbol,87 IERC20 _token,88 IChainLinkOracle _priceOracle,89 VaultConfig memory _vaultConfig,90 uint256 _capacityValue,91 uint256 _mgmtFeePerSecond,92 uint256 _perfFee,93 address _treasury94) ERC20(_name, _symbol) {95 token = _token;96 priceOracle = _priceOracle;97 vaultConfig = _vaultConfig;98 capacityValue = _capacityValue;99 mgmtFeePerSecond = _mgmtFeePerSecond;100 perfFee = _perfFee;101 treasury = _treasury;102 lastFeeCollected = block.timestamp;103}
Recommendation:
We advise them to be set as immutable
greatly optimizing their read-access gas cost.
Alleviation (4325253d6d):
Two out of the three referenced variables were set as immutable
, rendering this exhibit partially alleviated.
Alleviation (7c9b2b09db):
The last remaining member (treasury
) has been set as immutable
in the latest update to the codebase, rendering this exhibit fully alleviated.