At the same time the same horse can be happy on Arbitrum and unhappy on Ethereum due to the way in which block.timestamp works on Arbitrum.
The project will be deployed on Arbitrum and Ethereum. Also, the HorseStore::isHappyHorse relies on block.timestamp to check the time when the horse was last fed. But the block.timestamp on Arbitrum works differently.
In the Arbitrum documentation is said:
https://docs.arbitrum.io/for-devs/concepts/differences-between-arbitrum-ethereum/block-numbers-and-time#block-timestamps-arbitrum-vs-ethereum
Due to the way in which the block.timestamp works on Arbitrum it is possible the following scenario:
Bob feeds the horse with Id 1 at 15 hour on 18 January. On the next day (19 January) at 17 hour Alice checks if the horse with Id 1 is happy. The contract is deployed on Arbitrum and the block.timestamp can return value that is 24 hours earlier than the current time. So, the HorseStore::isHappyHorse function returns true, because for the function is 17 hour on 18 January and the horse was fed 2 hours ago. But actually the horse was fed 26 hours ago and it is unhappy. On the Ethereum the horse will be unhappy.
Manual Review
Ensure that the return value of the HorseStore::isHappyHorse function is reliable on every chain that the project is deployed.
Block timestamps can vary between Arbitrum and Ethereum in case sequencer fails to post batches on the parent chain within a [24 hours earlier than the current time or 1 hour in the future] boundary. This can lead to inconsistencies for Horses minted on Arb.
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.