# Build on Solana (/docs/build/solana)



Domino runs quests, points and leaderboards for your Solana app. Members sign in with their wallet, Domino reads devnet or mainnet to check what they did, and your app shows the result. This page gathers every Solana guide in one place.

## Start [#start]

Pick the path that matches where you are.

- [Start from create-solana-dapp](/docs/start/solana) — A new Next.js and `@solana/kit` app with Sign-In With Solana, a Quests page, a Leaderboard page and two quests that check devnet.
- [Connect an existing app](/docs/start/existing-app) — Keep your code, login and hosting, and add Domino where you need it. Then pick a sign-in below.

## Sign members in with their wallet [#sign-members-in-with-their-wallet]

A member's Solana wallet is how Domino knows them and what its quests read. Choose the sign-in that fits your app:

* **No login yet:** [Domino's wallet sign-in](/docs/build/wallets#sign-in-with-a-wallet), with **Solana** checked in **Settings → Sign-in**.
* **Your own Sign-In With Solana:** [sign in with Solana](/docs/build/self-hosted-wallet-sign-in#sign-in-with-solana) in your own Next.js app, as the template does.
* **Privy, Dynamic or Para:** keep your login and link its Solana wallets, with [Privy](/docs/build/privy), [Dynamic](/docs/build/dynamic) or [Para](/docs/build/para).
* **Reown AppKit with the Solana adapter:** [Reown AppKit](/docs/build/reown).
* **Your own wallet UI:** [bring your own wallet provider](/docs/build/wallets#bring-your-own-wallet-provider).

Members can also [link more wallets](/docs/build/wallets#link-a-wallet) after they sign in. A quest reads every Solana wallet the member linked.

## What a quest can check on Solana [#what-a-quest-can-check-on-solana]

Each check reads Solana mainnet or devnet, and each guide starts from a snippet.

- [Check token balances](/docs/build/wallets#check-token-balances) — Holding SOL, an SPL or a Token-2022 token. Snippet: `token-holder`.
- [Reward holding for days](/docs/build/wallets#reward-holding-for-days) — Holding a token every day for a run of days. Snippet: `token-hold-streak`.
- [Check NFT holdings](/docs/build/wallets#check-nft-holdings) — Holding an NFT from a Metaplex verified collection. Snippet: `nft-holder`.
- [Check on-chain actions on Solana](/docs/build/wallets#check-on-chain-actions-on-solana) — Calling your program, such as a swap, mint or deposit. Snippet: `solana-action`.
- [Check an instruction's arguments](/docs/build/wallets#4-check-an-instructions-arguments) — The arguments your program was called with, decoded with its Anchor IDL. Snippet: `solana-action`.

Install a snippet with `pnpm dlx shadcn@4.21.0 add https://snippets.domino.run/r/<snippet>.json`. The NFT check doesn't count compressed NFTs (cNFTs) or Metaplex Core assets.

Points, [leaderboards](/docs/build/leaderboards) and [referrals](/docs/build/referrals) work the same as for any other app. A leaderboard's [payout list](/docs/build/leaderboards#export-the-payout-list) names the wallets members proved by [signing Domino's own message](/docs/build/self-hosted-wallet-sign-in#pay-prizes-to-the-wallet), for you to pay.

## Move from devnet to mainnet [#move-from-devnet-to-mainnet]

Build against devnet with free tokens, then switch each piece to mainnet before your members arrive.

### 1. Point your quests at mainnet [#1-point-your-quests-at-mainnet]

* **Balance and transaction reads.** Change `chain` from devnet's `"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"` to `"solana"`. `ctx.wallet.transactions()` reads mainnet when you leave `chain` out.
* **NFT collections.** Change the collection's prefix from `solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1/nft:` to `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/nft:`, with your mainnet collection mint.
* **Token mints and programs.** Set your mainnet mint and program in the quest's settings, in code or in Console.

A [balance tracker](/docs/build/trackers#reward-holding-tokens), such as the `token-hold-streak` snippet's, keeps the chain and token it was published with: add a new tracker for mainnet, with its own key, and point the quest at it.

In the template, both sample quests read the `devnet` constant in `domino/devnet.ts`; set it to `"solana"`. A linked Solana wallet reads on both clusters, so members don't link again.

When you set a program, Domino looks for it on mainnet first, then on devnet. A mainnet program that publishes no Anchor IDL there decodes its instructions with the IDL it publishes on devnet.

### 2. Promote to Live [#2-promote-to-live]

Quests change in your project's **Test** environment. Publish them there, try them, then [promote](/docs/concepts/promotion) Test to **Live**, where a person on your team approves the change. See [test and live](/docs/concepts/environments).

### 3. Sign members in on Live [#3-sign-members-in-on-live]

* **A Live app login key.** Live keys need an HTTPS origin: create one for your deployed address, as in [develop on localhost](/docs/build/self-hosted-wallet-sign-in#develop-on-localhost), and allow vouching on it as on your Test key. A promotion never copies keys.
* **Wallet sign-in on Live.** If members sign in through Domino, check **Solana** under **Settings → Sign-in** in Live too. Each environment has its own setting.
* **Your app's environment.** In the template, set `DOMINO_APP_LOGIN_KEY` to the Live key, `DOMINO_APP_ORIGIN` to the HTTPS address, and `IRON_SESSION_SECRET`, which production requires.

A project needs a plan when it goes live; see [plans and pricing](/docs/pricing).

## Where next [#where-next]

- [Wallets](/docs/build/wallets) — Every wallet check in full, with what each read covers and how it fails.
- [Write your first quest](/docs/build/first-quest) — How a quest is written, published and tried.
- [Leaderboards](/docs/build/leaderboards) — Boards, seasons and payout lists.
