Storage Layout
DISCLAIMER // NFA // DYOR
This analysis is based on observations of the contract behavior. We are not smart contract security experts. This document aims to explain what the contract appears to do based on the code. It should not be considered a comprehensive security audit or financial advice. Always verify critical information independently and consult with blockchain security professionals for important decisions.
⊙ generated by robots | curated by humans
| METADATA | |
|---|---|
| Contract Address | 0x1aa0c77d207cd2e20dc00523ee0511ac6514aeb3 (etherscan) |
| Network | Ethereum Mainnet |
| Analysis Date | 2026-01-24 |
Variables
| SLOT | VARIABLE NAME | TYPE | CURRENT VALUE | PURPOSE |
|---|---|---|---|---|
| 0 | _owner | address | 0x8758ca21...bfd76968 |
Contract owner (single EOA) |
| 1 | _daySchedules | mapping(uint8 => DaySchedule) | See below | Day-indexed schedule data |
The contract uses a minimal storage layout with only 2 primary storage locations. Total storage slots used: 1 fixed + up to 202 dynamic (if all 101 days configured with 2 fields each).
DaySchedule Struct
struct DaySchedule {
uint256 percent; // Slot offset +0 (basis points, max 1,000,000 = 100%)
uint256 amount; // Slot offset +1 (purpose unknown, no token interaction observed)
}
Configured Day Values
Based on on-chain queries (as of analysis date):
| DAY | PERCENT | PERCENT (%) | AMOUNT | STATUS |
|---|---|---|---|---|
| 0 | 0 | 0.0% | 0 | ☒ |
| 1 | 43,500 | 4.35% | 230,222 | ☑ |
| 2 | 52,100 | 5.21% | 334,111 | ☑ |
| 3 | 21,000 | 2.10% | 159,000 | ☑ |
| 4 | 34,000 | 3.40% | 133,000 | ☑ |
| 5 | 44,000 | 4.40% | 35,484 | ☑ |
| 6 | 50,000 | 5.00% | 28,313 | ☑ |
| 7 | 47,000 | 4.70% | [incomplete] | △ |
| 8-100 | 0 | 0.0% | 0 | ☒ |
Days marked ☒ return (0, 0) which could mean either unconfigured or intentionally set to zero. No mechanism exists to distinguish between the two.
Diagrams
graph TB
subgraph Core["Slot 0: Core State"]
S0["_owner<br/>address<br/>0x8758ca21...bfd76968"]
end
subgraph Mapping["Slot 1+: Day Schedules Mapping"]
Map["mapping(uint8 => DaySchedule)"]
Map --> Day0["Day 0<br/>keccak256(0, 1)<br/>percent: 0<br/>amount: 0"]
Map --> Day1["Day 1<br/>keccak256(1, 1)<br/>percent: 43,500<br/>amount: 230,222"]
Map --> Day2["Day 2<br/>keccak256(2, 1)<br/>percent: 52,100<br/>amount: 334,111"]
Map --> Day3["Day 3<br/>keccak256(3, 1)<br/>percent: 21,000<br/>amount: 159,000"]
Map --> DayN["Day 100<br/>keccak256(100, 1)<br/>percent: 0<br/>amount: 0"]
end
Core --> Mapping
style S0 fill:#ffe1e1,stroke:#333,stroke-width:2px
style Map fill:#e1e1ff,stroke:#333,stroke-width:2px
style Day1 fill:#fff4e1,stroke:#333,stroke-width:2px
style Day2 fill:#fff4e1,stroke:#333,stroke-width:2px
style Day3 fill:#fff4e1,stroke:#333,stroke-width:2px
Storage Slot Calculation
For a given day D, the storage location is calculated as:
Base slot for DaySchedule = keccak256(abi.encode(D, 1))
where:
- D = day number (uint8, padded to 32 bytes)
- 1 = mapping slot number
Percent location = keccak256(abi.encode(D, 1)) + 0
Amount location = keccak256(abi.encode(D, 1)) + 1
Verification Example (Day 1)
# CALCULATE STORAGE SLOT FOR DAY 1
cast index uint8 1 1
# Output: 0xada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d
# READ DAY 1 PERCENT
cast storage 0x1aa0c77d207cd2e20dc00523ee0511ac6514aeb3 \
0xada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d
# Output: 0x000000000000000000000000000000000000000000000000000000000000a9ec
# Decoded: 43,500
# READ DAY 1 AMOUNT (SLOT + 1)
cast storage 0x1aa0c77d207cd2e20dc00523ee0511ac6514aeb3 \
0xada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7e
# Output: 0x000000000000000000000000000000000000000000000000000000000003834e
# Decoded: 230,222
# VERIFY VIA FUNCTION CALL
cast call 0x1aa0c77d207cd2e20dc00523ee0511ac6514aeb3 "dayInfo(uint8)" 1
# Returns: (43500, 230222)
Storage Evolution Timeline
| BLOCK | DATE | CHANGES | DAYS AFFECTED |
|---|---|---|---|
| 23,879,687 | 2025-11-25 | Contract deployed, owner set | 0 |
| 23,879,774 | 2025-11-25 | batchSetDaySchedule | Days 1-2 |
| 23,881,133 | 2025-11-26 | batchSetDaySchedule | Day 3 |
| 23,888,402 | 2025-11-27 | batchSetDaySchedule | Day 4 |
| 23,888,415 | 2025-11-27 | batchSetDaySchedule | Day 4 (update) |
| 23,894,702 | 2025-11-27 | batchSetDaySchedule | Day 5 |
| 23,902,612 | 2025-11-29 | batchSetDaySchedule | Day 5 (update) |
| 23,903,351 | 2025-11-29 | batchSetDaySchedule | Day 6 |
| 23,903,356 | 2025-11-29 | batchSetDaySchedule | Day 5 (re-update) |
| 23,909,309 | 2025-11-29 | batchSetDaySchedule | Day 7 |
| Present | 2026-01-24 | No further changes | 7 total configured |
Multiple updates to the same day (days 4 and 5) suggest iterative configuration adjustments during the initial setup period.
Storage Security Considerations
Mapping Collision Risk
△ Low Risk — Solidity mapping storage is collision-resistant. Each day's storage location uses keccak256(abi.encode(day, 1)) which provides cryptographic collision resistance. Day values are constrained to 0-100, preventing arbitrary key injection.
Uninitialized Storage
◇ Reading unconfigured days returns zero values. No way to distinguish between "not configured" and "intentionally zero". Consumer contracts must handle zero values appropriately.
Storage Growth
◇ Maximum 202 storage slots for mapping (101 days x 2 values). Current usage is approximately 14 slots (7 days x 2 values: percent + amount). Storage cost is fully predictable and bounded.