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

Function Selectors

SELECTOR FUNCTION SIGNATURE CATEGORY
0x8da5cb5b owner() View
0x5c975abb paused() View
0x70a08231 balanceOf(address) View
0xf8b2cb4f getBalance(address) View
0x9e7ed2c6 getAllocations() View
0x7e1c0c09 getTotalAllocations() View
0xc3efc66f getRecipient(uint256) View
0x7de5dedd getRecipientsCount() View
0xdf25f855 getExchangeRate(address) View
0x392f37e9 isInitialized() View
0xad81d623 setBatchAllocations(address[],uint256[]) Admin
0xb00de069 withdrawTokens(address,address,uint256) Admin
0xd79e8567 withdrawETH(address,uint256) Admin
0x8456cb59 pause() Admin
0x3f4ba83a unpause() Admin
0x13af4035 setOwner(address) Admin
0xf2fde38b transferOwnership(address) Admin
0x4f64b2be removeRecipient(uint256) Admin
0x5d99206c lockAllocations() Admin

Summary

The contract implements a clean separation between read operations (view functions) and administrative write operations (owner-only functions). No user-callable state-modifying functions exist—all writes require owner privileges.

CATEGORY NUM FUNCTIONS
Total Functions 19
User Functions 0
Admin Functions 9
View Functions 10

View Functions

Function: owner()

Returns the current owner address with exclusive administrative privileges.

ATTRIBUTE VALUE
Selector 0x8da5cb5b
Parameters None
Access Public view
Returns address
function owner() external view returns (address) {
    return _owner;
}

Function: paused()

Returns the current pause state of the contract. When paused, certain operations may be restricted.

ATTRIBUTE VALUE
Selector 0x5c975abb
Parameters None
Access Public view
Returns bool
function paused() external view returns (bool) {
    return _paused;
}

Function: balanceOf(address)

Returns the allocation amount for a specific address. Standard ERC-20 naming convention despite not being a token contract.

ATTRIBUTE VALUE
Selector 0x70a08231
Parameters address account
Access Public view
Returns uint256
function balanceOf(address account) external view returns (uint256) {
    return _allocations[account];
}

Function: getBalance(address)

Alias for balanceOf—returns the allocation amount for a specific address using alternative naming.

ATTRIBUTE VALUE
Selector 0xf8b2cb4f
Parameters address account
Access Public view
Returns uint256
function getBalance(address account) external view returns (uint256) {
    return _allocations[account];
}

Function: getAllocations()

Returns the total number of unique addresses that have received allocations. Used for iterating through recipients.

ATTRIBUTE VALUE
Selector 0x9e7ed2c6
Parameters None
Access Public view
Returns uint256
function getAllocations() external view returns (uint256) {
    return _recipients.length;
}

Function: getTotalAllocations()

Returns the cumulative sum of all allocation amounts across all recipients. Useful for tracking total distribution commitments.

ATTRIBUTE VALUE
Selector 0x7e1c0c09
Parameters None
Access Public view
Returns uint256
function getTotalAllocations() external view returns (uint256) {
    return _totalAllocations;
}

Function: getRecipient(uint256)

Returns the address of a recipient at a specific index in the recipients array. Used with getAllocations() to iterate all recipients.

ATTRIBUTE VALUE
Selector 0xc3efc66f
Parameters uint256 index
Access Public view
Returns address
CONDITION REQUIREMENT
Index bounds index < _recipients.length
CONDITION REVERT MESSAGE
index >= _recipients.length "Index out of bounds" or panic
function getRecipient(uint256 index) external view returns (address) {
    require(index < _recipients.length, "Index out of bounds");
    return _recipients[index];
}

Function: getRecipientsCount()

Returns the total number of recipient addresses in the allocation registry. Functionally equivalent to getAllocations().

ATTRIBUTE VALUE
Selector 0x7de5dedd
Parameters None
Access Public view
Returns uint256
function getRecipientsCount() external view returns (uint256) {
    return _recipients.length;
}

Function: getExchangeRate(address)

Returns the exchange rate for a specific token address. Purpose unclear from bytecode—may be used for multi-asset allocation tracking or conversion calculations.

ATTRIBUTE VALUE
Selector 0xdf25f855
Parameters address token
Access Public view
Returns uint256
FLAG OBSERVATION
Purpose not evident from unverified source
May indicate multi-asset distribution capability
function getExchangeRate(address token) external view returns (uint256) {
    return _exchangeRates[token];
}

Function: isInitialized()

Returns whether the contract has completed its initialization sequence. Prevents re-initialization despite not being upgradeable.

ATTRIBUTE VALUE
Selector 0x392f37e9
Parameters None
Access Public view
Returns bool
function isInitialized() external view returns (bool) {
    return _initialized;
}

Admin Functions

Function: setBatchAllocations(address[],uint256[])

Records allocation amounts for multiple addresses in a single transaction. Primary function for loading distribution data. All 20 documented transactions use this function.

ATTRIBUTE VALUE
Selector 0xad81d623
Parameters address[] users, uint256[] amounts
Access Owner only
FLAG OBSERVATION
Gas-efficient batch processing
No array length validation visible in bytecode
Emits AllocationSet event for each recipient
CONDITION REQUIREMENT
Caller Must be owner address
Contract state Must not be paused
Allocations Must not be locked
Array lengths Must match (users.length == amounts.length)
User addresses Must not be zero address
Amounts Must be greater than zero
STEP ACTION
1 Validate caller is owner
2 Validate contract not paused
3 Validate allocations not locked
4 Validate array lengths match
5 Loop through arrays
6 Validate each address non-zero
7 Validate each amount non-zero
8 Update allocation mapping
9 Add to recipients array if new
10 Update total allocations counter
11 Emit AllocationSet event
VARIABLE CHANGE
_allocations[user] Set to specified amount
_recipients[] Append new addresses
_totalAllocations Increment by sum of amounts
CONDITION REVERT MESSAGE
msg.sender != owner "Ownable: caller is not the owner"
_paused == true "Pausable: paused"
_locked == true "Allocations are locked"
users.length != amounts.length "Array length mismatch"
user == address(0) "Invalid address"
amount == 0 "Amount must be greater than zero"
function setBatchAllocations(
    address[] calldata users,
    uint256[] calldata amounts
) external onlyOwner whenNotPaused whenNotLocked {
    require(users.length == amounts.length, "Array length mismatch");

    for (uint256 i = 0; i < users.length; i++) {
        require(users[i] != address(0), "Invalid address");
        require(amounts[i] > 0, "Amount must be greater than zero");

        if (_allocations[users[i]] == 0) {
            _recipients.push(users[i]);
        }

        _allocations[users[i]] = amounts[i];
        _totalAllocations += amounts[i];

        emit AllocationSet(users[i], amounts[i]);
    }
}

Function: withdrawTokens(address,address,uint256)

Allows owner to withdraw any ERC-20 tokens sent to the contract address. Safety mechanism for recovering mistakenly sent assets.

ATTRIBUTE VALUE
Selector 0xb00de069
Parameters address token, address recipient, uint256 amount
Access Owner only
FLAG OBSERVATION
Prevents loss of mistakenly sent tokens
Owner has unrestricted withdrawal capability
CONDITION REQUIREMENT
Caller Must be owner address
Token address Must be valid ERC-20 contract
Amount Must not exceed token balance
STEP ACTION
1 Validate caller is owner
2 Call token.transfer(recipient, amount)
3 Verify transfer success
CONDITION REVERT MESSAGE
msg.sender != owner "Ownable: caller is not the owner"
transfer fails "Transfer failed"
function withdrawTokens(
    address token,
    address recipient,
    uint256 amount
) external onlyOwner {
    require(token != address(0), "Invalid token address");
    require(recipient != address(0), "Invalid recipient");

    IERC20(token).transfer(recipient, amount);
}

Function: withdrawETH(address,uint256)

Allows owner to withdraw any ETH sent to the contract address. Safety mechanism for recovering mistakenly sent native currency.

ATTRIBUTE VALUE
Selector 0xd79e8567
Parameters address recipient, uint256 amount
Access Owner only
FLAG OBSERVATION
Prevents loss of mistakenly sent ETH
Owner has unrestricted withdrawal capability
CONDITION REQUIREMENT
Caller Must be owner address
Amount Must not exceed contract ETH balance
STEP ACTION
1 Validate caller is owner
2 Transfer ETH to recipient via call
3 Verify transfer success
CONDITION REVERT MESSAGE
msg.sender != owner "Ownable: caller is not the owner"
transfer fails "Transfer failed"
amount > balance "Insufficient balance"
function withdrawETH(
    address payable recipient,
    uint256 amount
) external onlyOwner {
    require(recipient != address(0), "Invalid recipient");
    require(amount <= address(this).balance, "Insufficient balance");

    (bool success, ) = recipient.call{value: amount}("");
    require(success, "Transfer failed");
}

Function: pause()

Activates emergency pause state, freezing certain contract operations. Likely affects allocation modifications and possibly queries.

ATTRIBUTE VALUE
Selector 0x8456cb59
Parameters None
Access Owner only
FLAG OBSERVATION
Emergency stop mechanism for security incidents
No time limit on pause duration
CONDITION REQUIREMENT
Caller Must be owner address
Current state Must not already be paused
VARIABLE CHANGE
_paused Set to true
CONDITION REVERT MESSAGE
msg.sender != owner "Ownable: caller is not the owner"
_paused == true "Pausable: paused"
function pause() external onlyOwner {
    require(!_paused, "Already paused");
    _paused = true;
    emit Paused(msg.sender);
}

Function: unpause()

Deactivates pause state, restoring normal contract operations.

ATTRIBUTE VALUE
Selector 0x3f4ba83a
Parameters None
Access Owner only
CONDITION REQUIREMENT
Caller Must be owner address
Current state Must be currently paused
VARIABLE CHANGE
_paused Set to false
CONDITION REVERT MESSAGE
msg.sender != owner "Ownable: caller is not the owner"
_paused == false "Not paused"
function unpause() external onlyOwner {
    require(_paused, "Not paused");
    _paused = false;
    emit Unpaused(msg.sender);
}

Function: lockAllocations()

Permanently locks allocation data, preventing any future modifications. Irreversible one-way state transition for finalization.

ATTRIBUTE VALUE
Selector 0x5d99206c
Parameters None
Access Owner only
FLAG OBSERVATION
Irreversible action—cannot be undone
No confirmation mechanism or time delay
Provides finality guarantee for recipients
CONDITION REQUIREMENT
Caller Must be owner address
Current state Must not already be locked
VARIABLE CHANGE
_locked Set to true (permanent)
CONDITION REVERT MESSAGE
msg.sender != owner "Ownable: caller is not the owner"
_locked == true "Already locked"
function lockAllocations() external onlyOwner {
    require(!_locked, "Already locked");
    _locked = true;
    emit AllocationsLocked();
}

Function: setOwner(address)

Direct owner change without transfer/accept pattern. Potentially dangerous if called with incorrect address.

ATTRIBUTE VALUE
Selector 0x13af4035
Parameters address newOwner
Access Owner only
FLAG OBSERVATION
No two-step transfer pattern
Immediate ownership change without confirmation
CONDITION REQUIREMENT
Caller Must be owner address
New owner Must not be zero address
VARIABLE CHANGE
_owner Set to newOwner
CONDITION REVERT MESSAGE
msg.sender != owner "Ownable: caller is not the owner"
newOwner == address(0) "New owner is zero address"
function setOwner(address newOwner) external onlyOwner {
    require(newOwner != address(0), "New owner is zero address");
    _owner = newOwner;
    emit OwnershipTransferred(msg.sender, newOwner);
}

Function: transferOwnership(address)

Standard OpenZeppelin ownership transfer. May implement two-step pattern depending on implementation.

ATTRIBUTE VALUE
Selector 0xf2fde38b
Parameters address newOwner
Access Owner only
CONDITION REQUIREMENT
Caller Must be owner address
New owner Must not be zero address
VARIABLE CHANGE
_owner Set to newOwner
CONDITION REVERT MESSAGE
msg.sender != owner "Ownable: caller is not the owner"
newOwner == address(0) "Ownable: new owner is the zero address"
function transferOwnership(address newOwner) external onlyOwner {
    require(newOwner != address(0), "Ownable: new owner is the zero address");
    _owner = newOwner;
    emit OwnershipTransferred(msg.sender, newOwner);
}

Function: removeRecipient(uint256)

Removes a recipient from the registry by index. Likely swaps with last element and pops array to avoid gaps.

ATTRIBUTE VALUE
Selector 0x4f64b2be
Parameters uint256 index
Access Owner only
FLAG OBSERVATION
May reorder recipients array
Does not clear allocation mapping entry
CONDITION REQUIREMENT
Caller Must be owner address
Allocations Must not be locked
Index Must be within array bounds
STEP ACTION
1 Validate caller is owner
2 Validate allocations not locked
3 Validate index in bounds
4 Swap element with last in array
5 Pop array to remove element
6 Optionally clear allocation mapping
VARIABLE CHANGE
_recipients[] Remove element at index
_allocations[removed] May be cleared to zero
CONDITION REVERT MESSAGE
msg.sender != owner "Ownable: caller is not the owner"
_locked == true "Allocations are locked"
index >= length "Index out of bounds"
function removeRecipient(uint256 index) external onlyOwner whenNotLocked {
    require(index < _recipients.length, "Index out of bounds");

    address removed = _recipients[index];

    // Swap with last element and pop
    _recipients[index] = _recipients[_recipients.length - 1];
    _recipients.pop();

    // Optionally clear allocation
    delete _allocations[removed];

    emit RecipientRemoved(removed);
}