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

# Wallet Setup

> Configure your seed phrase and payout addresses

My Crypto Server is non-custodial — you provide the seed phrase that generates all deposit addresses, and you control where funds are swept after payment.

## Setup wizard

After creating your owner account at `/setup` (see [Authentication](/self-hosting/authentication)) and signing in, you'll be guided through the onboarding wizard:

1. **Generate or import a seed** — generate a new BIP-39 mnemonic in the wizard, or import an existing one from a hardware wallet.
2. **Verify addresses** — the wizard derives the first 3 addresses and shows them. Verify these match your hardware wallet or MetaMask for the same mnemonic.
3. **Configure payout addresses** — set the destination address for each chain type.

<Note>
  On a demo deployment (`IS_DEMO_SITE=true`), payout addresses are fixed and read-only. See [Authentication → Demo mode](/self-hosting/authentication#demo-mode).
</Note>

## Security

Your seed phrase is:

* **Never stored in plaintext.** The wizard encrypts it with AES-256-GCM using a key derived from your `MASTER_PASSPHRASE`.
* **Only decrypted on the server**, in memory, when needed for address derivation or transaction signing.
* **Never sent to the frontend.**

### MASTER\_PASSPHRASE

`MASTER_PASSPHRASE` is the encryption key for your seed. Set it in your environment variables as a strong random string (32+ characters).

```bash theme={null}
openssl rand -base64 32
```

**Back this up securely.** If you lose `MASTER_PASSPHRASE`, you cannot decrypt the seed and will lose access to all deposit addresses and their funds.

## Payout addresses

After setup, configure a payout address for each chain type you want to accept. Funds swept from deposit addresses go here.

| Chain type                           | Example                          |
| ------------------------------------ | -------------------------------- |
| EVM (Ethereum, Base, Arbitrum, etc.) | `0x1234...` — EIP-55 checksummed |
| Solana                               | `AaBbCc...` — base58             |
| Bitcoin                              | `bc1q...` — bech32 P2WPKH        |
| Tron                                 | `T...`                           |
| Litecoin                             | `ltc1...` — bech32 P2WPKH        |
| Dogecoin                             | `D...` — legacy P2PKH            |

You can use a hardware wallet address, a multi-sig, or any address you control. The payout address is validated before each sweep — a malformed address causes the sweep to fail with a `payout_misconfigured` notification rather than silently sending to a wrong address.

## Recommended: hardware wallet

For mainnet, use a hardware wallet (Ledger, Trezor) to hold the seed. Import the seed into the setup wizard, then verify the derived addresses on the device. The seed remains encrypted in the database; sweeps sign transactions in-memory on the server.

## Changing the payout address

You can update payout addresses at any time in **Settings → Wallet**. The change takes effect for the next sweep. In-flight sweeps (stage `broadcasting` or later) use the address that was set when they started.

## After entering the seed

* Create a payment link and open the checkout URL.
* Pay a small test amount on testnet.
* Confirm the session reaches `paid` in the dashboard.
* Verify the sweep lands in your payout wallet.
