Omniscia Mantissa Finance Audit
Marketplace Code Style Findings
Marketplace Code Style Findings
MEC-01C: Inefficient mapping
Lookups
Type | Severity | Location |
---|---|---|
Gas Optimization | Marketplace.sol:L163, L169, L174, L184, L198, L207, L217, L231 |
Description:
The linked statements perform key-based lookup operations on mapping
declarations from storage multiple times for the same key redundantly.
Example:
163Listing memory listing = listings[msg.sender][lid];164require(listing.veMntAmount > 0 && !listing.sold, "No such listing");165require(bids[msg.sender][lid].bidder == address(0), "Bid already made");166
167mntLp.approve(address(veMnt), listing.mntLpAmount);168require(veMnt.releaseVeMnt(msg.sender, listing.mntLpAmount, listing.veMntAmount, listing.veMntRate), "Error");169delete listings[msg.sender][lid];
Recommendation:
As the lookups internally perform an expensive keccak256
operation, we advise the lookups to be cached wherever possible to a single local declaration that either holds the value of the mapping
in case of primitive types or holds a storage
pointer to the struct
contained.
Alleviation (418ee413ad8e26f7eea383764c19953ff31b2bf3):
The Mantissa Finance team evaluated this exhibit as if it was referring to the data locations of the struct
entries rather than the lookups itself.
While a partial remediation has been applied, what our exhibit's original advice is the caching of interim mapping
lookups.
To illustrate, a mapping
lookup of bids[seller][lid]
is performed twice in Marketplace::makeAuctionBid
. This can be optimized by storing bids[seller]
to a mapping(uint256 => Bid)
variable and utilizing it for the two lookups, reducing the number of mapping
lookups that need to be performed in the function from 4
to 3
.
MEC-02C: Repetitive Value Literals
Type | Severity | Location |
---|---|---|
Code Style | Marketplace.sol:L138, L177, L178, L202, L205, L224, L225 |
Description:
The linked value literals are repeated across the codebase multiple times.
Example:
138require(percent < 100_00, "Cannot be > 100%");
Recommendation:
We advise each to be set to its dedicated constant
variable instead optimizing the legibility of the codebase.
Alleviation (418ee413ad8e26f7eea383764c19953ff31b2bf3):
All repetitive value literals have been replaced by two constant
contract-level variables that are aptly named PERCENT_DECIMALS
and AMOUNT_DECIMALS
, increasing the legibility of the codebase and addressing this exhibit in full.