SOLSCOPE docs
v1.0.0
Live demo Get help
● Set up · Settings and keys

Configuration
every setting, and where it wins.

Where each value can come from — a build define, the Setup tab, your config URL or the shipped default — and every key the app reads. Parsed by lib/core/config/admin_config_model.dart.

01Four layers, highest first

LayerSet byShown in Setup as
Build define--dart-define at build timeBuild define / Pinned at build — not editable in the app
Operator consoleThe Setup tab, on this device — only in a build with an operator passcodeSet here
Config documentThe JSON at your config URL, live or from this device's cacheConfig URL / Config URL (cached)
Shipped defaultThe tables belowDefault

Setup → Effective configuration prints every key with the layer its value came from. A console value that hides a published one says so, and names what it hides. fee_enabled can also read Inferred: nobody set it and it follows a positive fee_bps.

Setup exists only in a build with a passcode

Values set in the Setup tab are stored on that device and outrank your config URL, so the tab is an operator tool, not a user setting. It is compiled in only with SOLSCOPE_OPERATOR_PASSCODE and opens only after that passcode is typed (how). Ship your users a build without it: they get no Setup tab and run on your config URL and defines. To make the fee impossible to change even in your own console builds, pin it with SOLSCOPE_FEE_BPS and SOLSCOPE_FEE_ACCOUNT (below).

Setup screen with About this demo, Data sources and the operator configuration status
Setup shows which layer each value came from: a build-time define, a hosted config, or this device.

02Build defines

Pass with --dart-define=NAME=value, or list them in .env and use --dart-define-from-file=.env. All are empty by default.

NamePurposeWhere to get it
SOLSCOPE_RPC_URL Before launchYour Solana RPC endpoint. Empty = public fallback, rate limited.Your RPC provider
SOLSCOPE_HELIUS_API_KEYFull holder count, dev-wallet history, funding source. Without it the holder list is limited and those rows say why.helius.dev — your own account; free tier, you pay Helius for usage above it
SOLSCOPE_COINGECKO_DEMO_KEYHigher rate limit for the SOL reference pricecoingecko.com/en/api (Demo) — your own account; paid plans are billed to you
SOLSCOPE_ADMIN_CONFIG_URLWhere the admin JSON is fetched fromYour host (how)
SOLSCOPE_FEE_BPSPins fee_bps into the binaryYour choice (Earnings)
SOLSCOPE_FEE_ACCOUNTPins fee_account into the binaryYour fee token account
SOLSCOPE_OPENING_MINTThe token the terminal opens on when the device has no history. Default: JUP.Any mint address
SOLSCOPE_LIVE_HOSTSite the status-bar Docs and site buttons open (<host>/docs/). Default: https://solscope-demo.mikodes.com (the public demo, whose /docs/ is this documentation).Your website
SOLSCOPE_OPERATOR_PASSCODESix characters or more. Compiles in the Setup tab (the operator console), locked behind this passcode. Empty = no Setup tab at all — the build for your users.Your choice; never in a build you hand to users
SOLSCOPE_DEMOtrue builds the public demo: no wallet connectors, read-only Setup, a labelled placeholder fee account.Only for a demo build
SOLSCOPE_DEMO_MINTThe token a demo build opens on. Default: JUP.Only for a demo build

Only three admin values can be pinned at build time: the config URL, fee_bps and fee_account. maintenance_mode is deliberately not pinnable, so you always keep one remote stop switch.

03Admin JSON

One JSON document, fetched at start-up and cached. Every key is optional; a missing or malformed key falls back to the default, and a failed fetch leaves the last good config in force. The example below is also the shipped default — the fee is empty.

{
  "maintenance_mode": false,
  "maintenance_message": "",
  "swap_enabled": true,
  "new_token_feed_enabled": true,
  "alerts_enabled": true,
  "paid_listings_enabled": false,
  "fee_bps": 0,
  "fee_account": "",
  "fee_enabled": false,
  "default_slippage_bps": 50,
  "max_slippage_bps": 500,
  "min_app_version": "",
  "announcement": "",
  "announcement_url": "",
  "swap_disclaimer": "",
  "promoted_mints": [],
  "blocked_mints": [],
  "rpc_url": ""
}
KeyType · defaultMeaning
maintenance_modebool · falseShows a full-screen overlay.
maintenance_messagestring · ""Text on that overlay.
swap_enabledbool · trueKill switch for the swap path.
new_token_feed_enabledbool · trueKill switch for the new-pairs feed.
alerts_enabledbool · trueKill switch for alert evaluation.
paid_listings_enabledbool · falseShows promoted_mints. Promoted rows are always labelled as paid.
fee_bpsint 0–100 · 0Your fee, sent to Jupiter as platformFeeBps. 100 bps = 1 %, which is the hard cap: a higher value switches the fee off.
fee_accountstring · ""The token account that receives it, sent as feeAccount.
fee_enabledbool · inferredOmit it and a positive fee_bps means "charge". Set false to switch off without clearing the values.
default_slippage_bpsint · 50Clamped to 1–5000.
max_slippage_bpsint · 500Clamped to 1–5000.
min_app_versionstring · ""Dotted version such as 1.2.0. Empty lets every build in.
announcement, announcement_urlstring · ""Banner text and the link it opens.
swap_disclaimerstring · ""Extra text on the swap confirm, for whatever your jurisdiction requires.
promoted_mintsarray · []{"mint": "…", "label": "…", "expires_at": "ISO-8601"}. Live entries are pinned at the top of the new-pairs feed in this order, even when the mint is not in the organic feed. An expired or unparseable entry is not shown.
blocked_mintsarray · []Hidden from discovery. A blocked mint still opens by direct address, with the reason stated.
rpc_urlstring · ""Overrides the in-app RPC credential, so you can move endpoints without a new build.

The fee keys may also be nested: { "swap_config": { "fee_bps": 25, "fee_account": "…" } } is flattened on the way in.

04The cache

A fetched document is cached together with the URL it came from. If you change or remove the config URL, a cache from the old URL is deleted rather than applied, so an old fee, block list or slippage ceiling cannot stay in force.

05What is deliberately absent

  • No referral or affiliate field, and no field that maps a code, a user or a wallet address to anything.
  • No auto-execution: alerts notify, they never trade.
  • No analytics or server that receives what users watch. Watchlist, alerts and the trade journal stay on the device.