> ## Documentation Index
> Fetch the complete documentation index at: https://sdk.umbraprivacy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Supported Tokens

> V18 mint list: wSOL, USDC, USDT, UMBRA, CASH, ZINC on mainnet; wSOL only on devnet. Each pool supports both EncryptedTokenAccount operations and the Stealth Pool mixer, including Token-2022 transfer fees.

## Overview

Each Umbra pool is deployed per token mint. A pool supports both the **EncryptedTokenAccount** flow (deposit / withdraw / convert) and the **Stealth Pool** flow (Stealth Pool Note create + burn).

Token-2022 mints with a transfer fee extension are fully supported — the SDK accounts for the transfer fee before applying protocol fees. See [Token-2022 Support](/advanced/token-2022).

The list below is a snapshot. **The authoritative source at runtime is the relayer's `getSupportedMints()` endpoint** — it returns only mints with deployed token-pool and fee-schedule PDAs, so it doubles as a "pool deployed" check.

```typescript theme={null}
import { getUmbraRelayer } from "@umbra-privacy/sdk";

const relayer = getUmbraRelayer({ apiEndpoint: "https://relayer.api.umbraprivacy.com" });
const live    = await relayer.getSupportedMints();
```

***

## Mainnet

* **wSOL** (Wrapped SOL)
  * Mint: `So11111111111111111111111111111111111111112`
  * Decimals: 9
  * Token program: SPL
  * EncryptedTokenAccount: enabled
  * Stealth Pool: enabled

* **USDC**
  * Mint: `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`
  * Decimals: 6
  * Token program: SPL
  * EncryptedTokenAccount: enabled
  * Stealth Pool: enabled

* **USDT**
  * Mint: `Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB`
  * Decimals: 6
  * Token program: SPL
  * EncryptedTokenAccount: enabled
  * Stealth Pool: enabled

* **UMBRA**
  * Mint: `PRVT6TB7uss3FrUd2D9xs2zqDBsa3GbMJMwCQsgmeta`
  * Decimals: 6
  * Token program: SPL
  * EncryptedTokenAccount: enabled
  * Stealth Pool: enabled

* **CASH**
  * Mint: `CASHx9KJUStyftLFWGvEVf59SGeG9sh5FfcnZMVPCASH`
  * Decimals: 6
  * Token program: SPL
  * EncryptedTokenAccount: enabled
  * Stealth Pool: enabled

* **ZINC**
  * Mint: `zinc155BS4mSPk8GXQj4R5hkVDQXcW253pTYq5SGyfi`
  * Decimals: 9
  * Token program: SPL
  * EncryptedTokenAccount: enabled
  * Stealth Pool: enabled

***

## Devnet

* **wSOL** (Wrapped SOL)
  * Mint: `So11111111111111111111111111111111111111112`
  * Decimals: 9
  * Token program: SPL
  * EncryptedTokenAccount: enabled
  * Stealth Pool: enabled

* **dUSDC** (Dummy USDC — mock of the USD Coin standard)
  * Mint: `4oG4sjmopf5MzvTHLE8rpVJ2uyczxfsw2K84SUTpNDx7`
  * Decimals: 6
  * Token program: SPL
  * EncryptedTokenAccount: enabled
  * Stealth Pool: enabled

* **dUSDT** (Dummy USDT — mock of Tether USD)
  * Mint: `DXQwBNGgyQ2BzGWxEriJPVmXYFQBsQbXvfvfSNTaJkL6`
  * Decimals: 6
  * Token program: SPL
  * EncryptedTokenAccount: enabled
  * Stealth Pool: enabled

Mints outside this list will fail at the account-fetch stage with `error 3012` (pool missing).

### Devnet Faucet

Get test tokens at **[faucet.umbraprivacy.com](https://faucet.umbraprivacy.com/)**. The faucet distributes 1,000 tokens per wallet every 60 minutes for each of dUSDC and dUSDT — no signup, no KYC, just paste a Solana devnet wallet address. For devnet wSOL, use any standard Solana airdrop faucet (e.g. `solana airdrop`) and wrap it with the SDK.

***

## Localnet

Localnet uses the same configuration as devnet — wSOL only — and runs against a local Solana validator + a locally-spun-up indexer/relayer stack.

***

## Using a Supported Mint

Pass the mint address directly to any SDK function that accepts a `mint` parameter:

```typescript theme={null}
import { getATAIntoETADirectDepositorFunction } from "@umbra-privacy/sdk/deposit";
import { getETAIntoATAWithdrawerFunction } from "@umbra-privacy/sdk/withdrawal";

const USDC = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";

// Deposit: ATA → ETA
const deposit = getATAIntoETADirectDepositorFunction({ client });
await deposit(client.signer.address, USDC, 1_000_000n);

// Withdraw: ETA → ATA
const withdraw = getETAIntoATAWithdrawerFunction({ client });
await withdraw(client.signer.address, USDC, 1_000_000n);
```

The SDK fetches the pool configuration on-chain and selects the correct instruction variant automatically.

<Warning>
  Always verify the mint is supported before building a transaction. Use `relayer.getSupportedMints()` at app boot and cache the result for the session. Calling a deposit / withdraw / create with an unsupported mint fails with `error 3012` after the account-fetch stage — surface a clear user-facing error before you get there.
</Warning>
