Errors
All contracts use custom Solidity errors for gas-efficient reverts. This page lists every custom error grouped by contract.
WTDToken
ZeroAddress()
Recipient or owner address is the zero address
ZeroAmount()
Allocation has already been fully claimed (remaining = 0)
ExceedsAllocation()
Claim would exceed the allocation for this category
ExceedsMaxSupply()
Minting would exceed the 100 billion max supply
WTDSale
ZeroAddress()
Address parameter is the zero address
ZeroAmount()
Payment amount is zero, or price/allocation is zero during configuration
RoundNotActive()
Attempting to purchase in a round that is not active
ExceedsAllocation()
Purchase would exceed the round's total allocation
InvalidRound()
Round enum value is out of range (> 2)
InsufficientUSDCBalance()
Contract doesn't have enough USDC balance for withdrawal
InsufficientUSDTBalance()
Contract doesn't have enough USDT balance for withdrawal
InsufficientETHBalance()
Contract doesn't have enough ETH balance for withdrawal
InsufficientUSDCAllowance()
Buyer hasn't approved enough USDC
InsufficientTokenBalance()
Insufficient token balance
InsufficientWithdrawableAmount()
Requested withdrawal exceeds available withdrawable amount
RoundAlreadyConfigured()
Round has already been configured (one-time only)
InvalidOraclePrice()
Chainlink oracle returned a non-positive price
StaleOraclePrice()
Chainlink oracle price is older than 1 hour
RecipientNotSet()
No withdrawal recipient configured for this round
ETHTransferFailed()
Native ETH transfer to recipient failed
WTDVesting
ZeroAddress()
Address parameter is the zero address
ZeroAmount()
Amount is zero, or TGE timestamp is zero
InvalidRound()
Round enum value is out of range (> 2)
InvalidRole()
Role enum value is out of range (> 2)
InvalidMembers()
Empty beneficiaries array in team vesting creation
LockUpNotEnded()
Attempting to claim before lock-up period has ended
NothingToClaim()
No tokens are available to claim at this time
TGEUnlockNotAvailable()
No TGE unlock amount exists for this vesting
TGEAlreadySet()
TGE timestamp has already been set
VestingNotInitialized()
No vesting schedule exists for this beneficiary/round
InsufficientFunds()
Emergency withdraw amount exceeds available non-allocated balance
InsufficientUnallocated()
Not enough unallocated tokens for this round
InvalidToken()
Invalid token address for emergency withdraw
VestingRoleAlreadyLocked()
VESTING_ROLE has already been permanently locked
WTDLiquidityManager
InvalidTokenId()
Invalid LP NFT token ID
StillLocked()
Attempting to unlock a position before the unlock time
NotLockOwner()
Caller is not the owner of this lock
InvalidRecipient()
Fee recipient is the zero address
InvalidUnlockTime()
Unlock time is in the past, or invalid range
NoLiquidityInPosition()
LP position has zero liquidity
TransferFailed()
NFT or token transfer failed
Additionally, WTDLiquidityManager uses string reverts for some checks:
"Position pool mismatch" — LP position is not in the expected WTD/USDC pool
"Lock does not exist" — No lock found for the given lock ID