59179 sc low periodattimestamp bug returns current period for all timestamps
Submitted on Nov 9th 2025 at 16:14:05 UTC by @coinsspor for Audit Comp | Firelight
Report ID: #59179
Report Type: Smart Contract
Report severity: Low
Target: https://github.com/firelight-protocol/firelight-core/blob/main/contracts/FirelightVault.sol
Impacts:
Griefing (e.g. no profit motive for an attacker, but damage to the users or the protocol)
Description
Brief/Intro
I found a bug in periodAtTimestamp() - it ignores the timestamp parameter and always returns the current period. This breaks external contracts and services trying to query historical or future periods.
Vulnerability Details
Location: FirelightVault.sol, lines 246-250 and 795-797
What I Found: periodAtTimestamp() should calculate which period a given timestamp falls into. But I noticed there's a bug in the _sinceEpoch() helper - it always uses Time.timestamp() (current block time) instead of the timestamp parameter.
Here's the buggy code:
The timestamp parameter never gets used. I tested this and every query returns the current period regardless of what timestamp I pass in.
What I Tested: I deployed the contract and moved time forward 10 periods (current period = 10):
When I queried timestamp for period 2 → Got 10 back (wrong)
When I queried timestamp for period 15 → Got 10 back (wrong)
When I queried timestamps for periods 1-5 → All returned 10 (all wrong)
The only time it works is when I query current block.timestamp (and that's just by accident).
Impact Details
External Contracts: Any contract checking elapsed time will get wrong period data. I can see this causing problems with withdrawal eligibility checks - periodAtTimestamp(requestTime) always returns current period so the checks become useless.
Off-chain Systems: From what I can tell:
Indexers will show flat historical data
Analytics dashboards won't display period metrics correctly
Monitoring alerts won't work properly
Integration Partners: Projects building on Firelight need accurate period data. This bug makes the public API unreliable.
Why I'm Categorizing as Griefing: There's no direct fund loss, but I think this causes systematic data corruption that damages protocol usability. No profit motive for attacker, but clear damage to users and integrations.
References
My Suggested Fix: Line 249 should be:
Proof of Concept
Proof of Concept / Steps to Reproduce
Test Environment:
OS: Ubuntu 22.04
Node.js: v20.x
Hardhat: 2.22.x
Solidity: 0.8.28
Setup Steps:
I cloned the Firelight repository:
I created a simple MockERC20 contract for testing:
I configured the environment:
I wrote this test to reproduce the bug:
Running the Test:
Results:
What This Proves:
I tested the periodAtTimestamp() function with different timestamps:
Queried for period 2 (2 days after deployment) → Got period 10 (current)
Queried for periods 1-5 → All returned period 10 (current)
The function completely ignores the timestamp parameter. This happens because _sinceEpoch() uses Time.timestamp() instead of the parameter.
Verification: Anyone can reproduce this by following the setup steps above. The bug is deterministic.
Was this helpful?