Skip to content

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.