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()
Function: 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: getBalance(address)
Function: getAllocations()
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: 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: 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: 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: isInitialized()
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: 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: 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: 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: 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: 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: 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);
}