Omniscia Tren Finance Audit
LockedTREN Code Style Findings
LockedTREN Code Style Findings
LTR-01C: Inefficient Data Pointer
Type | Severity | Location |
---|---|---|
Gas Optimization | LockedTREN.sol:L90 |
Description:
The referenced data pointer is set as memory
even though only two out of its five variables are read rendering it inefficient.
Example:
90Rule memory vestingRule = entitiesVesting[_entity];91
92assignedTRENTokens = assignedTRENTokens - (vestingRule.totalSupply - vestingRule.claimed);
Recommendation:
We advise its data location to be set to storage
, optimizing the function's gas cost.
Alleviation (f6f1ad0b8f24a96ade345db1dd05a1878eb0f761):
The referenced data pointer has been set to storage
as advised, optimizing the code's gas cost.
LTR-02C: Inefficient Storage Reads
Type | Severity | Location |
---|---|---|
Gas Optimization | LockedTREN.sol:L65, L66 |
Description:
The referenced statements will read the startVestingDate
and endVestingDate
of the vesting entry from storage redundantly instead of using the same expressions as their assignment.
Example:
52entitiesVesting[_entity] = Rule(53 block.timestamp,54 _totalSupply,55 block.timestamp + SIX_MONTHS,56 block.timestamp + TWO_YEARS,57 058);59
60trenToken.safeTransferFrom(msg.sender, address(this), _totalSupply);61
62emit AddEntityVesting(63 _entity,64 _totalSupply,65 entitiesVesting[_entity].startVestingDate,66 entitiesVesting[_entity].endVestingDate67);
Recommendation:
We advise the expressions to be utilized instead, optimizing the code's gas cost.
Alleviation (f6f1ad0b8f24a96ade345db1dd05a1878eb0f761):
The event emission's storage-referenced arguments were replaced with their in-memory calculation counterparts optimizing the code's gas cost.
LTR-03C: Mislabelled Variable
Type | Severity | Location |
---|---|---|
Code Style | LockedTREN.sol:L41, L50, L60 |
Description:
The _totalSupply
variable of the LockedTREN::addEntityVesting
function does not match what it implies.
Example:
50assignedTRENTokens += _totalSupply;
Recommendation:
We advise it to be aptly renamed to _vestedTokenAmount
or a similar naming convention, increasing the legibility of the codebase.
Alleviation (f6f1ad0b8f24a96ade345db1dd05a1878eb0f761):
The variable was aptly renamed to _vestedTokenAmount
properly indicating its purpose.
LTR-04C: Non-Standard Overlap of Modifier
Type | Severity | Location |
---|---|---|
Standard Conformity | LockedTREN.sol:L31-L35, L37-L39 |
Description:
The LockedTREN::setAddresses
function has the same Initializable
modifier as the LockedTREN::initialize
function which is ill-advised.
Example:
31function initialize() public initializer {32 address initialOwner = _msgSender();33
34 __Ownable_init(initialOwner);35}36
37function setAddresses(address _trenAddress) public initializer onlyOwner {38 trenToken = IERC20(_trenAddress);39}
Recommendation:
While the functions can both be successfully invoked when the contract is deployed, it is strongly advised to use a one-off configuration restriction in the LockedTREN::setAddresses
function rather than the Initializable::initializer
as the modifier is expected to be applied to a single external
/ public
function.
Alleviation (f6f1ad0b8f):
The Tren Finance team opted to remove the Initializable::initializer
modifier from the LockedTREN::initialize
function, however, no other restriction was set in its place which would permit the contract to become owned by any party.
In-line with our original recommendation, we advise the Initializable::initializer
to remain in the LockedTREN::initialize
function and the LockedTREN::setAddresses
function to use a one-off restriction (i.e. if (trenToken != IERC20(address(0))) revert
) instead.
Alleviation (73b9546eb9):
The code was updated to apply our original recommendation, ensuring that the contract's initialization is properly protected and that the LockedTREN::setAddresses
function cannot be re-invoked arbitrarily.
LTR-05C: Suboptimal Struct Declaration Style
Type | Severity | Location |
---|---|---|
Code Style | LockedTREN.sol:L52-L58 |
Description:
The linked declaration style of a struct is using index-based argument initialization.
Example:
52entitiesVesting[_entity] = Rule(53 block.timestamp,54 _totalSupply,55 block.timestamp + SIX_MONTHS,56 block.timestamp + TWO_YEARS,57 058);
Recommendation:
We advise the key-value declaration format to be utilized instead, greatly increasing the legibility of the codebase.
Alleviation (f6f1ad0b8f24a96ade345db1dd05a1878eb0f761):
The key-value declaration style has been properly used in the referenced assignment addressing this exhibit.