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 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 (etherscan)
Network Ethereum Mainnet
Analysis Date 2025-12-26

Variables

SLOT VARIABLE NAME TYPE CURRENT VALUE PURPOSE
0 owner address 0x8758Ca21d08c9bdA75D6114614DCE373bFD76968 Contract owner (Ownable)
1 reentrancyLock uint256 1 ReentrancyGuard mutex (1=unlocked, 2=locked)
2 usdt address 0xdAC17F958D2ee523a2206206994597C13D831ec7 USDT contract address (hardcoded)
3 beneficiary address 0x853319C1eBebD1e7eD38747e14e7affe255145c6 Receives all presale funds
4 sentinelToken address 0x0000000000000000000000000000000000000000 Sentinel token address (not initialized)
5 totalSentinelBought uint256 3,492,180,104 (~3.49B) Total tokens purchased
6 totalSentinelRaised uint256 3,492,180,104 (~3.49B) Total tokens raised
7 totalSentinelRaisedInUsdWei uint256 0 USD value tracking (unused)
8 lastTotalSentinelRaised uint256 1,958,062,704 (~1.96B) Checkpoint for USD calc
9 packed state bytes 0x00120000 decimals(18) + initStatus(0) + isPresaleActive(false)
10 SupportedTokens mapping(address => bool) - Token whitelist
11 TokenDecimals mapping(address => uint8) - Token decimal configuration
12 TokenRates mapping(address => uint256) - Token exchange rates
13 SentinelBoughtTotal mapping(address => uint256) - Per-user purchase tracking

Storage Slot Details

Slot 0: Owner

Raw: 0x0000000000000000000000008758ca21d08c9bda75d6114614dce373bfd76968
Type: address
Value: 0x8758Ca21d08c9bdA75D6114614DCE373bFD76968

The contract owner from OpenZeppelin's Ownable pattern. This address has full administrative control.

Slot 1: Reentrancy Lock

Raw: 0x0000000000000000000000000000000000000000000000000000000000000001
Type: uint256
Value: 1 (unlocked)

Standard ReentrancyGuard implementation. Value of 1 means unlocked, 2 means locked during execution.

Slot 2: USDT Address

Raw: 0x000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Type: address
Value: 0xdAC17F958D2ee523a2206206994597C13D831ec7

Hardcoded Tether USD (USDT) mainnet contract address. Set in constructor.

Slot 3: Beneficiary

Raw: 0x000000000000000000000000853319c1ebebd1e7ed38747e14e7affe255145c6
Type: address
Value: 0x853319C1eBebD1e7eD38747e14e7affe255145c6

Current beneficiary receiving all presale funds. Changed from original constructor value.

Slot 4: Sentinel Token

Raw: 0x0000000000000000000000000000000000000000000000000000000000000000
Type: address
Value: address(0)

The Sentinel token contract address. Currently uninitialized (zero address).

Slot 5: Total Sentinel Bought

Raw: 0x00000000000000000000000000000000000000000000000000000000d0267088
Type: uint256
Value: 3,492,180,104 (0xd0267088)

Total Sentinel tokens that have been "purchased" (recorded, not distributed).

Slot 6: Total Sentinel Raised

Raw: 0x00000000000000000000000000000000000000000000000000000000d0267088
Type: uint256
Value: 3,492,180,104 (0xd0267088)

Identical to totalSentinelBought. Appears to track the same value.

Slot 7: Total Sentinel Raised In USD Wei

Raw: 0x0000000000000000000000000000000000000000000000000000000000000000
Type: uint256
Value: 0

USD tracking value. Currently not being used/updated.

Slot 8: Last Total Sentinel Raised

Raw: 0x0000000000000000000000000000000000000000000000000000000074b5aa70
Type: uint256
Value: 1,958,062,704 (0x74b5aa70)

Checkpoint value used in USD calculation during addSupportedTokens.

Slot 9: Packed State Variables

Raw: 0x0000000000000000000000000000000000000000000000000000000000120000
Type: packed bytes

This slot packs multiple small variables:

BYTE OFFSET VARIABLE VALUE MEANING
0 (rightmost) isPresaleActive 0x00 false (presale ended)
1 initStatus 0x00 Not initialized
2 decimals 0x12 (18) 18 decimals

Diagrams

graph TB
    subgraph Core["Core State - Slots 0-4"]
        S0["Slot 0: owner<br/>0x8758Ca21...76968"]
        S1["Slot 1: reentrancyLock<br/>1 (unlocked)"]
        S2["Slot 2: usdt<br/>0xdAC17F95...1ec7"]
        S3["Slot 3: beneficiary<br/>0x853319C1...145c6"]
        S4["Slot 4: sentinelToken<br/>address(0)"]
    end

    subgraph Counters["Counters - Slots 5-8"]
        S5["Slot 5: totalSentinelBought<br/>3,492,180,104"]
        S6["Slot 6: totalSentinelRaised<br/>3,492,180,104"]
        S7["Slot 7: totalUsdWei<br/>0"]
        S8["Slot 8: lastRaised<br/>1,958,062,704"]
    end

    subgraph Packed["Packed State - Slot 9"]
        S9["Slot 9: packed<br/>decimals=18, init=0, active=false"]
    end

    subgraph Mappings["Mappings - Slots 10-13"]
        S10["Slot 10: SupportedTokens<br/>mapping(address => bool)"]
        S11["Slot 11: TokenDecimals<br/>mapping(address => uint8)"]
        S12["Slot 12: TokenRates<br/>mapping(address => uint256)"]
        S13["Slot 13: SentinelBoughtTotal<br/>mapping(address => uint256)"]
    end

    Core --> Counters --> Packed --> Mappings

    style S0 fill:#ffe1e1
    style S3 fill:#e1ffe1
    style S4 fill:#ffffe1
    style S5 fill:#fff4e1
    style S6 fill:#fff4e1

Verification Commands

# SET RPC URL
export ETH_RPC_URL=https://eth.llamarpc.com

# READ SLOT 0 (OWNER)
cast storage 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 0

# READ SLOT 1 (REENTRANCY LOCK)
cast storage 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 1

# READ SLOT 2 (USDT)
cast storage 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 2

# READ SLOT 3 (BENEFICIARY)
cast storage 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 3

# READ SLOT 4 (SENTINEL TOKEN)
cast storage 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 4

# READ SLOT 5 (TOTAL BOUGHT)
cast storage 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 5

# READ SLOT 6 (TOTAL RAISED)
cast storage 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 6

# READ SLOT 9 (PACKED STATE)
cast storage 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 9

# VERIFY VIA FUNCTION CALLS
cast call 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 "owner()(address)"
cast call 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 "beneficiary()(address)"
cast call 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 "isPresaleActive()(bool)"
cast call 0x8d33666c83f7f17a1b8dc0e950d8ff2e7e37c563 "totalSentinelBought()(uint256)"

Key Observations

  • ☑ Owner slot (0) matches the contract creator address
  • ☑ Reentrancy guard is properly initialized to unlocked state
  • △ Beneficiary was changed from constructor argument after deployment
  • ☒ Sentinel token address is still address(0) - not initialized
  • △ totalSentinelBought and totalSentinelRaised have identical values
  • ☒ totalSentinelRaisedInUsdWei is 0 despite ~$3M in ETH raised
  • △ Presale is currently inactive (isPresaleActive = false)