Installing and enabling Solana

Activate the licence, install the release, switch the chain on, 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.

11 min readUpdated 26 August 2026install, licence, sol-network, master-wallet, diagnostics

Solana is enabled in six 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
  • The purchase code for the Solana Blockchain add-on — product ID 54514052 — from your MashDiv dashboard
  • 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

Go to Admin → System → Extension Manager (/admin/system/extension) — the page heading is Add-ons & Integrations. On the Blockchains tab (or by searching for Solana) find the Solana Blockchain for Ecosystem Addon card, product ID 54514052, and click it. Until its licence is activated the card reads Activate and its enable switch is disabled — the tooltip says Activate license first.

  1. The Solana card — click it to open the product page
  2. Its switch stays disabled until the licence is activated

On the product page press Activate License. Paste the purchase code from your MashDiv dashboard, optionally an email address for update notifications, and press Activate License. The screen confirms License Activated! and returns you to the product page a couple of seconds later. If the server has no outbound access, use the License File tab on the same screen instead: download the licence certificate from your MashDiv dashboard, place it as license.txt in the /lic folder at the project root, and press the button on that tab.

  1. Paste the purchase code here
  2. Activate License — then wait for the redirect back to the product page
  3. The offline route, for a server with no outbound HTTPS

Activation is what writes the machine-bound licence file lic/54514052.lic under the project root. The Solana chain service checks that licence again at construction and caches the result for five minutes — if you activate while the backend is running, allow for that delay before concluding it did not work. The restart in step 5 clears it either way.

2. Install the release

Back on the product page, now licensed, the Overview tab has a release panel. If it offers Install v…, press it; if it says Up to date on a licence you have only just activated, press Check for Updates once, then install whatever it offers. The Releases tab holds the notes for the version you are being offered — read them first.

Install downloads the release, verifies it and extracts it over the project root — this is what puts the chain service at backend/src/blockchains/sol.ts, the file the diagnostics in step 6 check for. It runs no migrations, builds nothing and restarts nothing, so finish it from a shell on the server:

pnpm updator

That is the finalise chain — stop, dependencies, schema, seed data, frontend build, start. If the panel still says Up to date after the check there is nothing to download — the release already on the server is current — and you move straight on to the next step.

  1. Check for Updates, then Install v… when it is offered
  2. Releases — the notes for the version you are about to install
  3. The Enabled switch — step 3, not yet

3. Switch the chain on

Turn the Enabled switch on — in the product page heading, or on the Solana card on the Blockchains tab of the Extension Manager, usable now that the licence is verified. Enabling the chain is what makes SOL appear as a choice in the token and master wallet screens — the blockchain options endpoint offers Solana only while the chain is enabled.

A blockchain add-on switches a chain on for the Ecosystem addon: Ecosystem itself must be licensed and enabled before this switch does anything useful, which is why it sits in the checklist above.

The switch takes effect without a restart. The chain service does not — it is constructed from process.env when the backend starts, which is why steps 4 and 5 come before anyone touches a deposit page.

4. 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 6 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.

5. 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.

6. Run the diagnostics

  1. Expand the Solana card

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

GET/api/admin/ecosystem/blockchain/requirementspermission: view.ecosystem.blockchain
Full per-chain requirements report — every variable the runtime reads, whether it is set, and the non-environment prerequisites
POST/api/admin/ecosystem/blockchain/requirements/testpermission: view.ecosystem.blockchain
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 + chain enabled The licence is active and the chain is switched on in the Extension Manager

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.

7. Create the master wallet

  1. One SOL master wallet per install, enforced

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

POST/api/admin/ecosystem/wallet/masterpermission: create.ecosystem.master.wallet
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.

8. Add tokens

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

POST/api/admin/ecosystem/tokenpermission: create.ecosystem.token
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.

GET/api/admin/ecosystem/blockchain/balancepermission: view.ecosystem.blockchain
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.

9. 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.