Omniscia Steadefi Audit
TraderJoeYieldFarmVault Code Style Findings
TraderJoeYieldFarmVault Code Style Findings
TJY-01C: Inefficient Transfer Flow
Type | Severity | Location |
---|---|---|
Gas Optimization | TraderJoeYieldFarmVault.sol:L179, L182 |
Description:
The TraderJoeYieldFarmVault::deposit
function will either wrap the incoming native funds or transfer them inwards and will ultimately transfer them outwards to the target manager
recipient.
Example:
165if (_isNative) {166 require(vaultConfig.isNativeAsset, "Vault asset not native token");167 require(_amt == msg.value, "Amt != msg.value");168
169 token = tokenA;170
171 IWAVAX(address(token)).deposit{ value: msg.value }();172} else {173 if (strategy == VaultStrategy.Neutral || strategy == VaultStrategy.Short) {174 token = tokenB;175 } else if (strategy == VaultStrategy.Long) {176 token = tokenA;177 }178
179 token.safeTransferFrom(msg.sender, address(this), _amt);180}181
182token.safeTransfer(address(manager), _amt);
Recommendation:
We advise the outward transfer to be relocated after the deposit
call to IWAVAX
and the safeTransferFrom
statement within the else
branch of the if-else
construct in TraderJoeYieldFarmVault::deposit
to provide the manager
variable as the second positional argument to the call, transferring the funds directly from the msg.sender
to the manager
.
Alleviation (4325253d6d):
While the exhibit appears to have been resolved albeit incorrectly in PR#167, no changes are reflected in the revised commit hash that was provided to us.
Alleviation (7c9b2b09db):
The asset transfer flows have all been made as optimal as possible, requiring a single transfer towards the manager
as advised.
TJY-02C: Inexplicable Transfer of Dust
Type | Severity | Location |
---|---|---|
Gas Optimization | TraderJoeYieldFarmVault.sol:L318-L319 |
Description:
The TraderJoeYieldFarmVault::_deposit
execution flow when a deposit is performed will utilize the full available balance of the user when providing liquidity to the LP pair, rendering any "dust" clean-up redundant.
Example:
317// transfer dust318tokenA.safeTransfer(msg.sender, tokenA.balanceOf(address(this)));319tokenB.safeTransfer(msg.sender, tokenB.balanceOf(address(this)));
Recommendation:
We advise the safeTransfer
functions to be omitted from this point as they are ineffectual.
Alleviation (4325253d6de0ea91c1e9fb9e01d2e7e98f3d83a9):
The inexplicable transfer of dust has been removed per our recommendation, optimizing the execution cost of TraderJoeYieldFarmVault::_deposit
significantly.
TJY-03C: Repetitive Value Literal
Type | Severity | Location |
---|---|---|
Code Style | TraderJoeYieldFarmVault.sol:L237, L330 |
Description:
The linked value literal is repeated across the codebase multiple times.
Example:
237if (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.
TJY-04C: Variable Mutability Specifiers (Immutable)
Type | Severity | Location |
---|---|---|
Gas Optimization | TraderJoeYieldFarmVault.sol:L109-L112, L117 |
Description:
The linked variables are assigned to only once during the contract's constructor
.
Example:
96constructor (97 string memory _name,98 string memory _symbol,99 VaultStrategy _strategy,100 IERC20 _tokenA,101 IERC20 _tokenB,102 IChainLinkOracle _priceOracle,103 VaultConfig memory _vaultConfig,104 uint256 _capacityValue,105 uint256 _mgmtFeePerSecond,106 uint256 _perfFee,107 address _treasury108) ERC20(_name, _symbol) {109 strategy = _strategy;110 tokenA = _tokenA;111 tokenB = _tokenB;112 priceOracle = _priceOracle;113 vaultConfig = _vaultConfig;114 capacityValue = _capacityValue;115 mgmtFeePerSecond = _mgmtFeePerSecond;116 perfFee = _perfFee;117 treasury = _treasury;118 lastFeeCollected = block.timestamp;119}
Recommendation:
We advise them to be set as immutable
greatly optimizing their read-access gas cost.
Alleviation (4325253d6d):
Four out of the five 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.