---
title: "Errors"
description: "The errors you are most likely to hit, what they mean and how to fix them."
---

> Documentation Index
> Fetch the complete documentation index at: https://developer.clank.trade/llms.txt
> Use this file to discover all available pages before exploring further.

# Errors

These are the errors people hit most. Viem shows an error's name only if the error is in the ABI you call with. Add lines like `"error SlippageExceeded(uint256 actual, uint256 minimum)"` to your ABIs to get readable errors.

## Launching

| Error | Meaning | Fix |
| --- | --- | --- |
| `InvalidMetadata()` | A required field is empty, or a field is too long. | Check the metadata limits in [Launch a token](/guides/launch-a-token). Lengths are in bytes. |
| `LaunchFeeNotPaid()` | You sent ETH to `launchToken`. | Send `value: 0`. To buy at launch, use [`launchAndBuy`](/guides/launch-a-token#launch-and-buy-in-one-transaction). |
| `LaunchEconomicsMismatch(bytes32 expected, bytes32 actual)` | The launch settings changed after you read `expectedEconomics`. | Read `previewLaunchEconomics` again and retry. |
| `UnsupportedCreatorTax()` | `creatorTaxBps` isn't `0`. | Set it to `0`. |
| `UnsupportedBuyback()` | `buybackEnabled` is `true`. | Set it to `false`. |
| `PairTokenNotApproved()` | The pair token isn't allowed. | Use ETH, or check `approvedPairTokens(pairToken)` on the factory. |
| `InvalidLaunchConfigId()` / `LaunchConfigDisabled()` | Wrong or turned-off launch config. | Use `0`. |
| `NotWhitelisted()` | Launches are paused. | Check `launchEnabled()` on the factory and try later. |
| `ZeroAddress()` | An address argument is zero, like `recipient` or `creatorFeeRecipient`. | Pass a real address. |
| `NativeValueMismatch(uint256 sent, uint256 expected)` | `launchAndBuy` got a `value` that doesn't match the buy amount. | For ETH, send `value` equal to the buy amount. For ERC-20, send `0`. |
| `LaunchAlreadyExists()` | A token with the same creator, params and salt already exists. | Change the `salt`. |

## Trading on the curve

| Error | Meaning | Fix |
| --- | --- | --- |
| `CurveGraduated()` | The curve stopped trading. It sold out and is graduating or has graduated. | Trade in the [Uniswap V4 pool](/guides/trade-after-graduation) once it's live. |
| `SlippageExceeded(uint256 actual, uint256 minimum)` | The price moved and you'd get less than your minimum. | Get a new quote and retry. |
| `NativeValueMismatch(uint256 supplied, uint256 expected)` | `value` doesn't equal `quoteIn`. | Send exactly `quoteIn`. |
| `UnexpectedNativeValue()` | You sent ETH to a curve that uses an ERC-20 pair token. | Send `value: 0` and approve the curve instead. |
| `ZeroAmount()` | The amount is `0`, or nothing is left after fees. | Use a bigger amount. |
| `ZeroOutput()` | The trade is too small to get anything back. | Use a bigger amount. |
| `ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)` | The curve can't take your tokens. | `approve` the curve before selling. |

## Graduation

| Error | Meaning | Fix |
| --- | --- | --- |
| `InvalidState(uint8 expected, uint8 actual)` | The curve isn't in the state this call needs. | Read `state()` on the curve. Call `graduate` in state `1` (`Ready`) and `createGraduatedPool` in state `2` (`Swept`). See [Token lifecycle](/concepts/token-lifecycle). |

## Uniswap V4 swaps

If a swap through the Universal Router reverts with no clear reason, check these first:

- Did you include the extra `minHopPriceX36` field in the route? See [Trade after graduation](/guides/trade-after-graduation).
- Is the pool key right? `hooks` must be the Clank hook, and ETH must be `currency0`.
- For sells, did you do both [Permit2 approvals](/guides/trade-after-graduation#approvals-and-permit2)?
- Is the `deadline` in the future?

Source: https://developer.clank.trade/reference/errors/index.mdx
