Skip to content

Functions

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 0x33184cD3E5F9D27C6E102Da6BE33e779528A606D (etherscan)
Network Ethereum Mainnet
Analysis Date 2026-01-23

Function Selectors

SELECTOR FUNCTION SIGNATURE CATEGORY
0x4e71d92d claim() User
0xfd32ea70 canClaim(address) View
0x5c975abb paused() View
0x8da5cb5b owner() View
0x0fb50c26 claimingEnabled() View
0x9d97e2bb flexibleAllocation() View
0x73b2e80e hasClaimed(address) View
0xa074696a getEligibilityStatus(address) View
0x8456cb59 pause() Admin
0x3f4ba83a unpause() Admin
0x28c30c07 setClaimingEnabled(bool) Admin
0xba2f0e4c setFlexibleAllocation(address) Admin
0x2b2b14a4 setEligibilityStatus(address,bool) Admin
0x360cbe3e batchSetEligibilityStatus(address[],bool[]) Admin
0xf2fde38b transferOwnership(address) Admin

Summary

CATEGORY NUM FUNCTIONS
Total Functions 15
User Functions 1
Admin Functions 6
View Functions 7
Internal/Private 1 (estimated)

User Functions

Function: claim()

Primary user function that allows eligible addresses to register a claim. Does not transfer tokens or ETH—only marks the address as having claimed.

ATTRIBUTE VALUE
Selector 0x4e71d92d
Parameters None
Access Public, non-payable
Modifiers Pause check, claim status check
FLAG OBSERVATION
Claims are permanent and cannot be undone
Depends on external contract for allocation verification
Emits Claimed event for off-chain tracking
Does NOT transfer tokens or ETH
CONDITION REQUIREMENT
Contract not paused paused() == false
Not already claimed hasClaimed[msg.sender] == false
Sufficient allocation FlexibleAllocation.getAllocation(msg.sender) >= 1
STEP ACTION
1 Check contract is not paused
2 Check address has not already claimed
3 Call external FlexibleAllocation.getAllocation(msg.sender)
4 Verify allocation >= 1
5 Set hasClaimed[msg.sender] = true
6 Emit Claimed(msg.sender, allocationAmount)
VARIABLE CHANGE
hasClaimed[msg.sender] falsetrue (permanent)
  • Claimed(address indexed account, uint256 allocation)
CONDITION ERROR MESSAGE
Contract is paused "Contract is paused"
Already claimed "Already claimed"
Allocation < 1 "Insufficient allocation - must have at least 1"

View Functions

Function: canClaim(address)

Checks if an address is eligible to claim by verifying both hasClaimed status and allocation amount.

ATTRIBUTE VALUE
Selector 0xfd32ea70
Parameters address - The address to check
Returns bool - True if can claim, false otherwise
Access Public view
if hasClaimed[address] == true:
    return false

allocation = FlexibleAllocation.getAllocation(address)
if allocation >= 1:
    return true
else:
    return false

Function: hasClaimed(address)

Returns whether an address has already claimed.

ATTRIBUTE VALUE
Selector 0x73b2e80e
Parameters address - The address to check
Returns bool - True if claimed, false otherwise
Access Public view
Storage Reads from slot 1

Function: getEligibilityStatus(address)

Returns eligibility status for an address. Reads from the same storage slot as hasClaimed.

ATTRIBUTE VALUE
Selector 0xa074696a
Parameters address - The address to check
Returns bool - Eligibility status
Access Public view
Storage Reads from slot 1 (same as hasClaimed)
FLAG OBSERVATION
Reads from same storage as hasClaimed—cannot distinguish between "ineligible" and "already claimed"

Function: paused()

Returns current pause state of the contract.

ATTRIBUTE VALUE
Selector 0x5c975abb
Parameters None
Returns bool - True if paused, false otherwise
Access Public view
Storage Reads from slot 2, byte 20

Function: owner()

Returns current owner address.

ATTRIBUTE VALUE
Selector 0x8da5cb5b
Parameters None
Returns address - Current owner
Access Public view
Storage Reads from slot 2, bytes 0-19

Function: claimingEnabled()

Returns whether claiming is globally enabled.

ATTRIBUTE VALUE
Selector 0x0fb50c26
Parameters None
Returns bool - True if enabled, false otherwise
Access Public view
Storage Reads from slot 2, byte 21
FLAG OBSERVATION
This flag exists in storage but does NOT appear to be enforced in claim() logic

Function: flexibleAllocation()

Returns address of the FlexibleAllocation contract used for allocation verification.

ATTRIBUTE VALUE
Selector 0x9d97e2bb
Parameters None
Returns address - FlexibleAllocation contract address
Access Public view
Storage Reads from slot 0

Admin Functions

Function: pause()

Pauses the contract, preventing claims.

ATTRIBUTE VALUE
Selector 0x8456cb59
Parameters None
Access Owner only
Preconditions Contract must not already be paused
STEP ACTION
1 Verify msg.sender == owner
2 Verify contract is not already paused
3 Set paused = true
4 Emit Paused(msg.sender)
  • Paused(address account)

Function: unpause()

Unpauses the contract, allowing claims.

ATTRIBUTE VALUE
Selector 0x3f4ba83a
Parameters None
Access Owner only
Preconditions Contract must be paused
STEP ACTION
1 Verify msg.sender == owner
2 Verify contract is paused
3 Set paused = false
4 Emit Unpaused(msg.sender)
  • Unpaused(address account)

Function: setClaimingEnabled(bool)

Enables or disables claiming globally.

ATTRIBUTE VALUE
Selector 0x28c30c07
Parameters bool enabled - New enabled state
Access Owner only
STEP ACTION
1 Verify msg.sender == owner
2 Set claimingEnabled = enabled
3 Emit ClaimingEnabledUpdated(enabled)
  • ClaimingEnabledUpdated(bool enabled)

Function: setFlexibleAllocation(address)

Changes the FlexibleAllocation contract reference.

ATTRIBUTE VALUE
Selector 0xba2f0e4c
Parameters address newAllocation - New allocation contract address
Access Owner only
Preconditions newAllocation != address(0)
STEP ACTION
1 Verify msg.sender == owner
2 Verify newAllocation != address(0)
3 Store old address
4 Set flexibleAllocation = newAllocation
5 Emit FlexibleAllocationUpdated(oldAddress, newAddress)
  • FlexibleAllocationUpdated(address indexed oldAddress, address indexed newAddress)
FLAG OBSERVATION
Changing this address mid-operation could affect active claimers
No timelock or delay—takes effect immediately

Function: setEligibilityStatus(address, bool)

Sets eligibility status for a single address.

ATTRIBUTE VALUE
Selector 0x2b2b14a4
Parameters address account - Address to modify
bool status - New eligibility status
Access Owner only
Preconditions account != address(0)
STEP ACTION
1 Verify msg.sender == owner
2 Verify account != address(0)
3 Set hasClaimed[account] = status
4 Emit EligibilityStatusUpdated(account, status)
  • EligibilityStatusUpdated(address indexed account, bool status)
FLAG OBSERVATION
Writes to same storage as hasClaimed—cannot distinguish purpose
Setting status=false makes address appear "already claimed"
Does NOT appear to be checked in claim() logic flow

Function: batchSetEligibilityStatus(address[], bool[])

Sets eligibility status for multiple addresses in a single transaction.

ATTRIBUTE VALUE
Selector 0x360cbe3e
Parameters address[] accounts - Addresses to modify
bool[] statuses - New eligibility statuses
Access Owner only
Preconditions Arrays must be equal length and non-empty
STEP ACTION
1 Verify msg.sender == owner
2 Verify arrays.length > 0
3 Verify accounts.length == statuses.length
4 For each index: verify account != address(0)
5 For each index: set hasClaimed[account] = status
6 For each index: emit EligibilityStatusUpdated(account, status)
  • EligibilityStatusUpdated(address indexed account, bool status) (emitted for each address)
CONDITION ERROR MESSAGE
Empty arrays "Empty accounts array"
Length mismatch "Arrays length mismatch"
Zero address "Invalid account address"

Function: transferOwnership(address)

Transfers ownership to a new address.

ATTRIBUTE VALUE
Selector 0xf2fde38b
Parameters address newOwner - New owner address
Access Owner only
Preconditions newOwner != address(0)
STEP ACTION
1 Verify msg.sender == owner
2 Verify newOwner != address(0)
3 Store old owner
4 Set owner = newOwner
5 Emit OwnershipTransferred(oldOwner, newOwner)
  • OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
FLAG OBSERVATION
No renounceOwnership function—ownership cannot be burned
No timelock or delay—takes effect immediately
No multisig requirement—single owner has full control

Verification Commands

# View functions - anyone can call
cast call 0x33184cD3E5F9D27C6E102Da6BE33e779528A606D "owner()"
cast call 0x33184cD3E5F9D27C6E102Da6BE33e779528A606D "paused()"
cast call 0x33184cD3E5F9D27C6E102Da6BE33e779528A606D "claimingEnabled()"
cast call 0x33184cD3E5F9D27C6E102Da6BE33e779528A606D "flexibleAllocation()"
cast call 0x33184cD3E5F9D27C6E102Da6BE33e779528A606D "hasClaimed(address)" <ADDRESS>
cast call 0x33184cD3E5F9D27C6E102Da6BE33e779528A606D "canClaim(address)" <ADDRESS>
cast call 0x33184cD3E5F9D27C6E102Da6BE33e779528A606D "getEligibilityStatus(address)" <ADDRESS>

# Storage verification
cast storage 0x33184cD3E5F9D27C6E102Da6BE33e779528A606D 0  # flexibleAllocation
cast storage 0x33184cD3E5F9D27C6E102Da6BE33e779528A606D 2  # owner + paused + claimingEnabled