SqueekToken
$SQK ERC-20 reference: premint, lifetime cap, Mining binding, burns, and supply totals.
TL;DR
- $SQK is a non-upgradeable ERC-20 with EIP-2612 permit and 18 decimals, capped at 2.1 billion $SQK of lifetime issuance including a construction premint.
- The admin Timelock binds
SqueekMiningonce withbindMining; after that only SqueekMining can mint, always to itself. - Any holder can
burntheir own $SQK; burns lower circulating supply but never reopen the cap, because the cap limitstotalMinted().
Overview
These contracts may change before mainnet. Pin the ABI you use and re-check the deployment before relying on it.
SqueekToken records $SQK balances, allowances and lifetime issuance. Its constructor mints a bounded premint and authorizes the admin Timelock to bind SqueekMining once. After binding, only that proxy can increase supply, through mintForCheckpoint; the token has no owner, pause, blocklist or upgrade path. The issuance schedule lives in SqueekMining.
The token is deployed directly, not behind a proxy; its Sepolia address is under Deployments (0xd78a3956cF63164d1Fa1C622ad3c66623162Fa1e for core-sepolia-20261103).
Holder actions
Standard ERC-20 and EIP-2612
function name() external view returns (string); // "Squeek"
function symbol() external view returns (string); // "SQK"
function decimals() external view returns (uint8); // 18
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
Amounts are $SQK base units (10^-18 $SQK); totalSupply() is circulating supply (minted minus burned).
burn
function burn(uint256 amount) external;
Destroys amount of the caller's own $SQK and adds it to totalBurned(); there's no burnFrom. SqueekStaking burns exit fees this way from its own balance. Burning never restores issuance capacity.
Totals and cap
function cap() external view returns (uint256);
function totalPreminted() external view returns (uint256);
function totalBurned() external view returns (uint256);
function totalMinted() external view returns (uint256);
function MAX_PREMINT_RECIPIENTS() external view returns (uint256);
| Function | Returns |
|---|---|
cap() | The lifetime cap on totalMinted(): 2,100,000,000 × 10^18 base units |
totalPreminted() | $SQK minted by the constructor premint; never changes |
totalBurned() | Lifetime $SQK destroyed through burn |
totalMinted() | Lifetime $SQK minted, premint included: totalSupply() + totalBurned() |
MAX_PREMINT_RECIPIENTS() | 8, the longest constructor premint list |
mining
function mining() external view returns (address);
Zero before bindMining; afterwards the bound SqueekMining proxy, permanently the only minter.
bindMining
function bindMining(address candidate) external;
Binding authority only, once. Atomically attaches the SqueekMining proxy, validates it, calls completeBootstrap(), and emits MiningBound. There's no rebinding.
mintForCheckpoint
function mintForCheckpoint(uint64 throughRound, uint256 amount) external returns (uint256);
Bound SqueekMining only. Mints amount to SqueekMining, emits CheckpointMinted, and returns amount. SqueekMining forwards it all to SqueekStaking in the same transaction.
Integration notes
- Use base units. Keep amounts as
bigintbase units and format with 18 decimals; never convert tonumber. - Measure issuance with
totalMinted(). Circulating supply istotalSupply(); the cap applies to lifetime issuance. - Reconcile with SqueekMining:
totalMinted() == totalPreminted() + SqueekMining.state().minted. - Count supply once. A checkpoint mint emits both
CheckpointMintedand aTransfer; count one. - Check the binding. Before relying on issuance, confirm
mining()is nonzero and equals the SqueekMining proxy you verified.
Supply totals
totalMinted() = totalPreminted() + SqueekMining.state().minted
totalSupply() = totalMinted() − totalBurned()
totalMinted() ≤ cap() = 2,100,000,000 × 10^18
