Summary
It is one of the main invariants of the protocol that in every marketParametrs creation contract must do this: _marketParametrs.timestamp = block.timestamp
Function setMarketParametrs implement this behaviour
function setMarketParameters(SwanMarketParameters memory _marketParameters) external onlyOwner {
require(_marketParameters.platformFee <= 100, "Platform fee cannot exceed 100%");
_marketParameters.timestamp = block.timestamp;
marketParameters.push(_marketParameters);
}
But this behavior is not implemented for first marketParametr in initialization
function initialize(
SwanMarketParameters calldata _marketParameters,
LLMOracleTaskParameters calldata _oracleParameters,
address _coordinator,
address _token,
address _buyerAgentFactory,
address _swanAssetFactory
) public initializer {
__Ownable_init(msg.sender);
require(_marketParameters.platformFee <= 100, "Platform fee cannot exceed 100%");
marketParameters.push(_marketParameters);
oracleParameters = _oracleParameters;
coordinator = LLMOracleCoordinator(_coordinator);
token = ERC20(_token);
buyerAgentFactory = BuyerAgentFactory(_buyerAgentFactory);
swanAssetFactory = SwanAssetFactory(_swanAssetFactory);
isOperator[address(this)] = true;
isOperator[msg.sender] = true;
}
Impact
The protocol can only suffer damage if it initializes incorrectly and does not put timestamp on block.timestamp, so severity = low
Tools Used
Manual Review
Recommendations
Add _marketParameters.timestamp = block.timestamp;
to initialization function