Installing and enabling Solana

Activate the licence, enable the chain row, set SOL_NETWORK, restart, create the master wallet and add your first SPL token — in the order that avoids issuing addresses on the wrong cluster.

6 min readUpdated 3 August 2026install, licence, sol-network, master-wallet, diagnostics

Solana is enabled in five steps, and the order matters more than usual. Deposit addresses are generated against whatever cluster is configured at the time, and the stored wallet record stamps a network name that nothing later corrects. Set the cluster before anyone can reach a deposit page, not after.

Nothing here is done by installer.sh or by the Ecosystem installer. Every step is manual.

Before you begin

    • A working Bicrypto install — backend, frontend and cron under PM2
    • Ecosystem installed, enabled and working
    • The Ecosystem vault unlocked — /admin/ecosystem shows a green Vault Active badge
    • A purchased Solana licence (Envato item 54514052) activated on this install
    • The chain service present at backend/src/blockchains/sol.ts
    • Shell access to the project root, to edit .env and restart PM2
    • SOL to fund the master wallet, on the cluster you are about to configure

Every Solana private key this addon creates is encrypted with Ecosystem's vault key. If you have not generated ENCRYPTED_ENCRYPTION_KEY yet, do that first — see Master wallets and the vault. Regenerating that key later makes every Solana key on the install permanently unreadable, and there is no recovery.

1. Activate the licence

Activation writes lic/54514052.lic under the project root — an encrypted, machine-bound file. Two independent code paths check for it: the admin toggle refuses to enable the chain without it, and the Solana service checks it again at construction.

The result of the service-side check is cached for five minutes. If you activate the licence while the backend is running, allow for that delay before concluding it did not work.

2. Enable the chain row

Admin → Ecosystem → Blockchains lists the four licensed chains with their product IDs. The Solana row is seeded by 20240402234742-ecosystemBlockchains.js as Solana Blockchain for Ecosystem Addon, product ID 54514052, with status: false.

Enables or disables a seeded blockchain by product ID. Enabling refuses with 403 when the licence file is absent.

Enabling the row is what makes SOL appear as a choice in the token and master wallet screens — the blockchain options endpoint adds Solana to its list only when this row exists and is enabled.

3. Set the cluster

Add SOL_NETWORK to the project root .env. It is not in .env.example, so on a fresh install it does not exist, and an absent value is the same as a wrong one.

# mainnet | testnet — anything else falls through to devnet
SOL_NETWORK="mainnet"

# Metadata only: stamped into each wallet's address record at generation time.
# Keep it equal to SOL_NETWORK.
SOLANA_NETWORK="mainnet"

mainnet selects mainnet-beta and testnet selects testnet. Every other value — unset, misspelled, or the plausible-looking mainnet-beta — silently selects devnet. There is no error, no warning in the request path, and no visible symptom until a customer's real SOL never arrives.

The diagnostics console does call this out, which is why step 5 exists.

SOLANA_NETWORK is a different variable and does not choose a cluster. It is written into the wallet's address record when an address is generated, and nothing else reads it. Setting the two to different values does not break deposits — it makes the stored record lie about which cluster the address belongs to, which is exactly the sort of thing that costs an afternoon during an incident.

For the full list including the variables that are read by nothing, see the environment reference.

4. Restart the backend

pm2 restart backend

The Solana connection is constructed once from process.env and held on a singleton, so an edited .env has no effect until the process restarts. A chain that "did not take" after an edit is almost always a chain that has not been restarted.

5. Run the diagnostics

Admin → Ecosystem → Blockchains → Requirements, select Solana, run the test.

Full per-chain requirements report — every variable the runtime reads, whether it is set, and the non-environment prerequisites
Runs live read-only probes against the resolved cluster and returns per-flow readiness

The Solana test runs four checks and then reports readiness per flow:

Check What it proves
Cluster resolution Which cluster SOL_NETWORK actually resolved to, printed as a URL
getHealth The public cluster RPC answers and reports itself healthy
getSlot It returns a live slot number, not just an HTTP 200
Chain service installed backend/src/blockchains/sol.ts is present
Licence + DB toggle active The .lic file exists and the row is enabled

Deposits and withdrawals are each reported ok only when the RPC health check passed and the licence and service checks passed. Withdrawals additionally fail if the vault is locked or the master wallet is missing or disabled — an RPC that answers is not a pass if a customer still cannot get their money out.

Read the cluster-resolution line specifically. It is the fastest way to catch a devnet fall-through, because it prints the endpoint the service will really use.

6. Create the master wallet

Admin → Ecosystem → Wallets → Master Wallets, create a wallet, choose SOL.

Generates, encrypts and stores a master wallet for a chain

One per chain, enforced — a second attempt returns 409. The keypair is generated by the Solana service, so a missing or unlicensed service fails the creation outright rather than storing something unusable.

Then fund it with SOL. On Solana the master wallet is a fee payer, not a reserve. It pays for:

  • the network fee on every SPL token withdrawal;
  • creating an associated token account for a recipient who does not have one yet, which costs rent-exempt lamports;
  • deploying an SPL mint and minting its initial supply.

Native SOL withdrawals do not touch it — they are signed by the customer's own address and the fee comes out of the balance being withdrawn. So an empty master wallet produces a selective failure: native SOL keeps working while every SPL withdrawal fails. See Wallets and key custody.

7. Add tokens

Admin → Ecosystem → Tokens. Solana appears in the chain list once step 2 is done.

Deploys a new SPL mint signed by the master wallet, then queues the initial supply minting as a background task

Deploying creates the mint with the master wallet as mint authority and no freeze authority, at the decimals you specify. The initial supply is minted afterwards in the background — if that background mint fails after its retries, the token row is deleted again, so a token that vanishes shortly after creation is telling you the master wallet ran out of SOL.

To carry an existing token such as USDC, import it instead and set its contract to the SPL mint address. That address is used verbatim to build the deposit subscription, and an invalid one is rejected with an explicit log line naming the token rather than a silent dead monitor.

Set the token's network label to match your cluster even though nothing enforces it. Solana is on Ecosystem's network-agnostic list, so a devnet row is still offered on a mainnet install.

Estimates the SPL token deployment cost as the rent-exempt minimum for a 165-byte token account

That estimate is the one place SOLANA_RPC_URL is read, and it defaults to mainnet-beta regardless of SOL_NETWORK. On a testnet or devnet install the figure is a mainnet number.

8. Verify end to end

Do this with your own money before a customer does it with theirs.

  1. Open a deposit page for a Solana-backed currency at /finance/deposit and copy the address. Confirm it is a base58 Solana address, not a 0x… value.

  2. Send a small amount of SOL to it and leave the page open. Detection is a live subscription while the page is open; crediting happens on a 60-second pass afterwards.

  3. Close the page and send a second deposit. It should still be found — the address stays in the background scanner's working set for 72 hours. This is the case that catches a broken install, because the live path can work while the background path does not.

  4. Withdraw it back out. Check the resulting transaction row reaches COMPLETED with a signature, and check the signature on explorer.solana.com.

  5. Repeat both with an SPL token, because the SPL path uses a completely different detection mechanism and a completely different fee payer.