Artifacts
DISCLAIMER // NFA // DYOR
This analysis is based on verified source code retrieved from Etherscan and 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 | 0xCa5E50710F656F2e537cE2Fc8504dB6E24eD3515 (etherscan) |
| Network | Ethereum Mainnet |
| Analysis Date | 2025-12-13 |
Verified Source Code
The contract source code is verified on Etherscan. This is the official implementation.
Source: Etherscan - Contract Code
Artifact:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title XcellarToken
* @dev ERC20 Token with fixed supply and burn capability
*/
contract XcellarToken is ERC20, Ownable {
/// @notice The total supply of tokens (immutable after deployment)
uint256 public immutable TOTAL_SUPPLY;
/// @notice The address that received presale tokens
address public presaleWallet;
/// @notice The amount of tokens allocated to presale
uint256 public presaleAllocation;
/**
* @dev Constructor that creates the token with initial distribution
* @param _totalSupply Total supply of tokens to mint
* @param _presaleWallet Address to receive presale allocation
* @param _presaleAllocation Amount of tokens for presale
*/
constructor(
uint256 _totalSupply,
address _presaleWallet,
uint256 _presaleAllocation
) ERC20("Xcellar", "XCL") Ownable(msg.sender) {
require(_totalSupply > 0, "Total supply must be greater than zero");
require(_presaleWallet != address(0), "Presale wallet cannot be zero address");
require(_presaleAllocation <= _totalSupply, "Presale allocation exceeds total supply");
TOTAL_SUPPLY = _totalSupply;
presaleWallet = _presaleWallet;
presaleAllocation = _presaleAllocation;
// Mint presale allocation to presale wallet
if (_presaleAllocation > 0) {
_mint(_presaleWallet, _presaleAllocation);
}
// Mint remaining tokens to deployer
uint256 remainingTokens = TOTAL_SUPPLY - _presaleAllocation;
if (remainingTokens > 0) {
_mint(msg.sender, remainingTokens);
}
}
/**
* @dev Burns tokens from the caller's balance
* @param value Amount of tokens to burn
*/
function burn(uint256 value) external {
_burn(msg.sender, value);
}
}
Runtime Bytecode
The deployed contract bytecode fetched from the blockchain.
Source: Etherscan - Contract Code
Command:
Constructor Arguments
The parameters used when deploying the contract.
Source: Etherscan - Creation TX
Decoded Arguments:
| PARAMETER | TYPE | VALUE |
|---|---|---|
_totalSupply |
uint256 | Query via TOTAL_SUPPLY() |
_presaleWallet |
address | Query via presaleWallet() |
_presaleAllocation |
uint256 | Query via presaleAllocation() |
Verification Commands:
export ETH_RPC_URL=https://eth.llamarpc.com
# GET TOTAL SUPPLY
cast call 0xCa5E50710F656F2e537cE2Fc8504dB6E24eD3515 "TOTAL_SUPPLY()(uint256)"
# GET PRESALE WALLET
cast call 0xCa5E50710F656F2e537cE2Fc8504dB6E24eD3515 "presaleWallet()(address)"
# GET PRESALE ALLOCATION
cast call 0xCa5E50710F656F2e537cE2Fc8504dB6E24eD3515 "presaleAllocation()(uint256)"
Contract ABI
The Application Binary Interface for interacting with the contract.
Source: Etherscan - Contract ABI
Key Function Signatures:
| FUNCTION | SELECTOR | SIGNATURE |
|---|---|---|
| burn | 0x42966c68 |
burn(uint256) |
| transfer | 0xa9059cbb |
transfer(address,uint256) |
| transferFrom | 0x23b872dd |
transferFrom(address,address,uint256) |
| approve | 0x095ea7b3 |
approve(address,uint256) |
| balanceOf | 0x70a08231 |
balanceOf(address) |
| totalSupply | 0x18160ddd |
totalSupply() |
| allowance | 0xdd62ed3e |
allowance(address,address) |
| name | 0x06fdde03 |
name() |
| symbol | 0x95d89b41 |
symbol() |
| decimals | 0x313ce567 |
decimals() |
| owner | 0x8da5cb5b |
owner() |
| transferOwnership | 0xf2fde38b |
transferOwnership(address) |
| renounceOwnership | 0x715018a6 |
renounceOwnership() |
| TOTAL_SUPPLY | 0x902d55a5 |
TOTAL_SUPPLY() |
| presaleWallet | 0x59be1d6c |
presaleWallet() |
| presaleAllocation | 0x2e1e7264 |
presaleAllocation() |
OpenZeppelin Dependencies
The contract inherits from OpenZeppelin contracts (version appears to be v5.x based on constructor pattern).
Inherited Contracts:
@openzeppelin/contracts/token/ERC20/ERC20.sol@openzeppelin/contracts/access/Ownable.sol
Reference: OpenZeppelin Contracts v5.x