The PerMarkets
contract, inheriting from PerMarketsStorage
, demonstrates a critical issue with the timing of offerId
incrementation. The incrementation of offerId
is performed after generating addresses and creating entities (offers, makers, stocks) based on the current offerId
. This incorrect order of operations can lead to address collisions, mismatched data references, and overall data integrity risks.
The offerId
state variable is used for generating unique addresses and managing entity references in the PerMarkets
contract. The typical workflow involves:
Address Generation: Addresses for maker, offer, and stock are generated using the current offerId.
Entity Creation: Entities (makers, offers, and stocks) are created using the addresses generated in the previous step and the new offerId
value will be the id
attribute for each new entity.
Incrementation: The offerId
is incremented to prepare for the next entity.
The issue in the createOffer
and createTaker
functions involves a mismatch between the offerId
used for generating addresses and the offerId
actually stored in the contract.
In the createOffer
function, addresses for the maker, offer, and stock are generated using the current offerId
before it is incremented. This means that the new addresses are based on the old offerId
, but the updated offerId
is stored only after the addresses are generated. Consequently, if multiple offers are created quickly in succession, this mismatch can lead to incorrect associations between addresses and offer data.
Similarly, in the createTaker
function, a new stockAddr
is generated using the current offerId
, but the offerId is incremented only after updating the stock information. This can result in the stock being linked to the wrong offerId
, causing inconsistencies in data storage and retrieval.
Address Collisions: Incorrect addresses may lead to conflicts and unintended overwriting of existing entities.
Data Integrity Issues: Mismatched references can corrupt the mapping of offers, stocks, and other entities, affecting the reliability of contract operations.
Operational Disruptions: Users may encounter issues where their operations reference incorrect or stale entities, leading to failed transactions and disputes.
Manual Code Review
Ensure that the offerId
is incremented before generating addresses and creating new entities. This will ensure that all addresses are unique and correctly assigned.
I believe this is valid low severity, although there is inconsistency here when using the correct `offerId` for assigning offerIds and generating the unique addresses as seen [here](https://github.com/Cyfrin/2024-08-tadle/blob/04fd8634701697184a3f3a5558b41c109866e5f8/src/core/PreMarkets.sol#L67-L69), this is purely an accounting error for offerIds. If we generate the offerId using current `offerId - 1`, the appropriate listing/taker orders can still be created against those offers.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.