Euler Lite provides all the core functionality of Euler Finance in a customizable package:
- Lending & Borrowing: Users can deposit assets to earn yield or borrow against collateral
- Portfolio Management: Track positions and performance
- Rewards: Participate in Merkl, Incentra, and Fuul reward programs
- Multi-chain Support: Connect to multiple EVM-compatible networks
- Node.js 24.22.1 (see
.nvmrc) - npm 11.20.0 (pinned in
package.json, CI and the Docker build) - Git
- A Reown Project ID for AppKit wallet connections - get one at reown.com
git clone <repository-url>
cd euler-lite
npm install --global npm@11.20.0
npm ciCopy .env.example to .env and fill in your values:
cp .env.example .env| Variable | Description |
|---|---|
APPKIT_PROJECT_ID or NUXT_PUBLIC_APP_KIT_PROJECT_ID |
Reown (WalletConnect) project ID |
NUXT_PUBLIC_APP_URL |
Your app's public URL |
RPC_URL_<chainId> |
RPC endpoint per chain (e.g. RPC_URL_1 for Ethereum) |
SUBGRAPH_CATALOG_URL or SUBGRAPH_URL_<chainId> |
Subgraph source for each enabled chain: an active entry in the selected catalog, or an explicit URL. NUXT_PUBLIC_SUBGRAPH_URI_<chainId> is also supported. Explicit URLs take priority; all settings stay server-side. |
| Variable | Default | Description |
|---|---|---|
V3_API_URL |
https://v3.euler.finance |
Euler V3 upstream used by the server /api/internal/v3 proxy |
DISABLE_V3 |
false |
Explicitly disables V3 adapters, proxying, image discovery and V3 utility reads. Requires static labels. Alias: EULER_SDK_DISABLE_V3. See Fork setup. |
EULER_SDK_V3_API_KEY |
— | Optional server-side V3 API key forwarded by /api/internal/v3 as X-API-Key |
SWAP_API_URL or NUXT_PUBLIC_SWAP_API_URL |
— | Euler swap API |
PYTH_API_KEY |
— | Server-side API key sent to https://hermes.pyth.network as Bearer authentication by /api/internal/pyth/updates |
Doppler compatibility: If your secret manager injects prefixed URL names, the server also accepts
EULER_SDK_V3_API_URLandNUXT_PUBLIC_V3_API_URL. API keys use server-side names such asEULER_SDK_V3_API_KEY,PYTH_API_KEY, andTURTLE_EARN_API_KEY.
Euler Lite uses the Euler V2 SDK for vault reads, portfolio data, prices, rewards, and transaction plans. These controls select which SDK adapter path is used for cached browsing reads and the server-side vault snapshot:
| Variable | Default | Description |
|---|---|---|
SERVER_VAULT_CACHE_SOURCE |
fallback |
Server snapshot builder adapter chain: fallback, onchain, or v3. |
NUXT_PUBLIC_BROWSER_VAULT_SOURCE |
fallback |
Browser "fast" SDK adapter chain: fallback, onchain, or v3. The plan-time SDK is always on-chain. |
DISABLE_SERVER_VAULT_CACHE |
false |
Set to true to disable /api/internal/vaults snapshots and let the browser fall through to the normal RPC pipeline. |
DEPRECATED_CHAINS |
— | Optional comma-separated deprecated-chain override. Enabled chains marked deprecated here or in EulerChains.json appear collapsed in the chain selector, skip warm-cache cycles, and use V3 metadata with on-chain labels verification. They must also be in ONCHAIN_SDK_CHAINS. |
ONCHAIN_SDK_CHAINS |
— | Comma-separated chain IDs pinned to the onchain SDK adapter config for chain-aware browser reads and the server vault snapshot, bypassing V3. Independent of deprecated status; include every enabled chain using metadata-only labels verification. |
EVAULT_FETCH_CHUNK_CHAINS |
— | Comma-separated chain IDs whose EVault list reads are split into small sequential SDK calls. Use for RPC/lens endpoints that fail under larger concurrent onchain EVault fetches. |
EULER_SDK_EULER_INTERFACES_BRANCH |
master |
Euler interfaces branch used for runtime ABIs and EulerChains.json. Explicit NUXT_PUBLIC_CONFIG_EULER_CHAINS_URL and NUXT_PUBLIC_CONFIG_EULER_ABIS_BASE_URL overrides take precedence over the branch for their respective manifests. |
fallback uses V3 first and on-chain reads second. If no V3 URL is configured, Lite passes disableV3: true to the SDK so fallback reads go straight on-chain.
| Variable | Description |
|---|---|
CORS_ALLOWED_ORIGINS |
Comma-separated allowlist for /api/*; falls back to NUXT_PUBLIC_APP_URL. |
FIRST_PARTY_COOKIE_SECRET |
Optional server-only secret that keeps the internal API marker cookie stable across replicas and deploys. Defaults to a value derived from NUXT_PUBLIC_APP_URL when configured, otherwise a random value per process. |
CSP_EXTRA_CONNECT_SRC |
Extra connect-src origins for development or staging endpoints. |
DEV_GEO_COUNTRY |
Local/preview country fallback when the edge provides no country. Production (DOPPLER_ENVIRONMENT=prd) refuses to boot with it set. |
ADDRESS_SCREENING_URI / ADDRESS_SCREENING_API_KEY |
Server-side data-v3 compliance endpoint + restricted API key, proxied by /api/internal/screen-address (also serves first-party *.euler.finance SPAs). Both unset ⇒ screening disabled (all addresses pass) — except in production (DOPPLER_ENVIRONMENT=prd), where missing configuration fails closed; only one set ⇒ fails closed everywhere. URI must be https (localhost http allowed for dev). |
MERKL_API_KEY |
Optional server-side Merkl key. The Merkl API works anonymously (10 req/sec shared across all users via /api/internal/proxy/merkl); set this to send X-API-Key upstream for a higher quota. Server-only — never exposed to the browser. |
TENDERLY_ACCESS_KEY, TENDERLY_ACCOUNT_SLUG, TENDERLY_PROJECT_SLUG |
Optional Tenderly simulation configuration. |
FUUL_API_URL or NUXT_PUBLIC_FUUL_API_URL |
Optional Fuul API upstream override. |
INCENTRA_API_URL or NUXT_PUBLIC_INCENTRA_API_URL |
Optional Incentra/Brevis API upstream override. |
LABELS_SOURCE |
v3 (default) or static; selects the shared label snapshot producer. |
LABELS_VAULT_TAG |
Optional exact, case-sensitive tag for discovery and new-target suggestions, e.g. base or governance limited. Blank disables tag filtering. |
STATIC_LABELS_BASE_URL |
Required directory URL for static authoring files; unused by hosted V3 mode. |
LABELS_IMAGE_ORIGINS |
Optional comma-separated HTTP(S) origins for hosted label images in the UI and public metadata, in addition to the configured custom V3 origin and Euler's image hosts. |
LIQUIDATION_BOT_API_URL |
Optional default liquidation bot API with a {chainId} placeholder, e.g. https://{chainId}-liquidations.euler.finance. When set, the server reads each enabled chain's /vault-filter and borrowable vaults the bot does not cover get a "Not covered by default liquidation bot" badge in lists and portfolio rows and a notice on the vault overview. A chain whose bot has not answered since the server started, or whose last answer is more than 30 minutes old, counts as having no bot, so all its borrowable vaults get the badge. Unset disables the feature. HTTPS only (localhost HTTP allowed for dev). Server-only. |
TURTLE_EARN_API_KEY |
Required when NUXT_PUBLIC_CONFIG_ENABLE_TURTLE is on. Server-only Turtle Earn API key sent as X-API-Key by /api/internal/proxy/turtle and by the server-side SDK's rewards adapters (server/utils/sdk-server.ts), which call Turtle directly for stream discovery. Turtle rejects unauthenticated requests with 401; without this variable the proxy answers 503 and never calls upstream, and the server SDK disables direct Turtle discovery (rewardsEnableTurtle: false) instead of issuing unauthenticated calls, so reward proofs and claims are unavailable. Turtle campaigns sourced from euler-data-v3 may still appear in snapshots and APYs, because the flag only gates the SDK's direct adapter. Configure the secret before rolling out. Never exposed to the browser. |
These settings use NUXT_PUBLIC_CONFIG_* env vars. Branding and announcement values are read by the server at startup and injected into window.__APP_CONFIG__; links and feature flags use Nuxt's public runtimeConfig. The server proxy handlers resolve the upstream source overrides.
| Variable | Default | Description |
|---|---|---|
NUXT_PUBLIC_CONFIG_APP_TITLE |
Euler Lite |
App title (SEO, meta tags) |
NUXT_PUBLIC_CONFIG_APP_DESCRIPTION |
Lightweight interface for Euler Finance. |
App description |
NUXT_PUBLIC_CONFIG_LOGO_URL |
— | Custom logo URL (falls back to built-in Euler logo) |
NUXT_PUBLIC_CONFIG_SOCIAL_IMAGE_URL |
— | Absolute URL to social share image (og:image / twitter:image), 1200×630+ |
NUXT_PUBLIC_CONFIG_EULER_CHAINS_URL |
— | Explicit URL for EulerChains.json; takes precedence over the Euler interfaces branch |
NUXT_PUBLIC_CONFIG_EULER_ABIS_BASE_URL |
— | Base URL serving {contract}.json for runtime ABIs; takes precedence over the Euler interfaces branch. |
NUXT_PUBLIC_CONFIG_DOCS_URL |
— | Documentation link |
NUXT_PUBLIC_CONFIG_TOOLBOX_URL |
— | Toolbox link |
NUXT_PUBLIC_CONFIG_RISK_ANALYTICS_URL |
— | Risk & Analytics link |
NUXT_PUBLIC_CONFIG_STARGATE_URL |
— | Stargate link |
NUXT_PUBLIC_CONFIG_TOS_URL |
— | Terms of Service link |
NUXT_PUBLIC_CONFIG_TOS_MD_URL |
— | TOS markdown URL (enables TOS signing when set) |
NUXT_PUBLIC_CONFIG_PRIVACY_POLICY_URL |
https://www.euler.finance/privacy-policy |
Privacy policy link |
NUXT_PUBLIC_CONFIG_RISK_DISCLOSURES_URL |
https://www.euler.finance/risk-disclosures |
Risk disclosures link |
NUXT_PUBLIC_CONFIG_MICA_WHITEPAPER_URL |
https://www.euler.finance/MICA-Whitepaper.pdf |
MiCA whitepaper link |
NUXT_PUBLIC_CONFIG_X_URL |
— | X (Twitter) link |
NUXT_PUBLIC_CONFIG_DISCORD_URL |
— | Discord link |
NUXT_PUBLIC_CONFIG_TELEGRAM_URL |
— | Telegram link |
NUXT_PUBLIC_CONFIG_GITHUB_URL |
— | GitHub link |
NUXT_PUBLIC_CONFIG_ENABLE_EARN_PAGE |
true |
Show Earn page |
NUXT_PUBLIC_CONFIG_ENABLE_LEND_PAGE |
true |
Show Lend page |
NUXT_PUBLIC_CONFIG_ENABLE_EXPLORE_PAGE |
true |
Show Explore page |
NUXT_PUBLIC_CONFIG_ENABLE_ENTITY_BRANDING |
true |
Show entity branding |
NUXT_PUBLIC_CONFIG_ENABLE_VAULT_TYPE |
true |
Show vault type labels |
NUXT_PUBLIC_CONFIG_ENABLE_APP_TITLE |
true |
Show app title in the navbar |
NUXT_PUBLIC_CONFIG_ENABLE_POWERED_BY_EULER |
true |
Show the Powered by Euler branding in the navbar |
NUXT_PUBLIC_CONFIG_ENABLE_MERKL |
true |
Enable Merkl rewards integration |
NUXT_PUBLIC_CONFIG_ENABLE_INCENTRA |
true |
Enable Incentra rewards integration |
NUXT_PUBLIC_CONFIG_ENABLE_FUUL |
true |
Enable Fuul rewards integration |
NUXT_PUBLIC_CONFIG_ENABLE_TURTLE |
true |
Enable Turtle rewards integration |
NUXT_PUBLIC_CONFIG_ANNOUNCEMENT_TITLE |
— | Optional one-time modal title; any announcement content field enables the modal |
NUXT_PUBLIC_CONFIG_ANNOUNCEMENT_BODY |
— | Optional one-time modal body text |
NUXT_PUBLIC_CONFIG_ANNOUNCEMENT_ITEMS |
— | Optional newline-delimited or JSON-array bullet items |
NUXT_PUBLIC_CONFIG_ANNOUNCEMENT_URL |
— | Optional announcement link (https://, http://, or safe root-relative path) |
NUXT_PUBLIC_CONFIG_UNISWAP_TOKEN_LIST_URL |
https://tokens.uniswap.org |
Uniswap token list for swap selector |
NUXT_PUBLIC_CONFIG_DEFILLAMA_TOKEN_LIST_URL |
https://d3g10bzo9rdluh.cloudfront.net |
DefiLlama token list for swap selector |
At server startup, short CONFIG_ANNOUNCEMENT_* names take precedence over the corresponding NUXT_PUBLIC_CONFIG_ANNOUNCEMENT_* names. In Nitro-served deployments, both naming forms are read at server startup, so updates require a server restart without rebuilding client assets. Generated/static deployments must rebuild when NUXT_PUBLIC_CONFIG_ANNOUNCEMENT_* fallback values change. To disable an announcement, clear both naming forms for all four content fields. See Announcement Modal for rollout and dismissal behavior.
Chains are configured dynamically at runtime. Set one RPC URL per chain and select a subgraph source. .env.example selects Euler's published catalog, which supplies endpoints for its active chain entries:
SUBGRAPH_CATALOG_URL=https://raw.githubusercontent.com/euler-xyz/euler-subgraph/catalog/v1/catalog.json
SUBGRAPH_CATALOG_DISABLED=false
# Ethereum Mainnet
RPC_URL_1=https://your-rpc-endpoint.com
# Arbitrum
RPC_URL_42161=https://your-arbitrum-rpc.comThe app scans RPC_URL_<chainId> variables at server startup; catalog membership does not enable a chain. Browser SDK subgraph reads use /api/internal/proxy/subgraph/<chainId>. Per-chain disabling takes priority, followed by SUBGRAPH_URL_<chainId>, its compatibility alias NUXT_PUBLIC_SUBGRAPH_URI_<chainId>, then the selected catalog. Leave both URL aliases unset for chains managed by the catalog.
Forks can replace the catalog URL or use only their own direct endpoints. For direct-only operation, clear SUBGRAPH_CATALOG_URL, set SUBGRAPH_CATALOG_DISABLED=true to prevent bundled server SDK fallback, and configure the intended per-chain URLs. Clear or replace any existing Euler URL overrides as well. See Your own subgraphs for copyable examples and disable behaviour.
A chain also needs an entry in euler-interfaces EulerChains.json, and both the pinned @eulerxyz/euler-v2-sdk and @reown/appkit/networks must support it. When they already do, adding a chain needs no code change; otherwise it needs a dependency bump and a release. See Adding a Chain for the full checklist.
The chain's status in EulerChains.json decides whether an enabled chain is shown: production chains are shown, staging chains only where DOPPLER_ENVIRONMENT is not prd, deprecated chains in the chain selector's deprecated section (like DEPRECATED_CHAINS), and unlisted chains not at all.
Euler Lite remains a normal multichain web app, but it supports opening inside the Base App in-app browser. The wallet flow prefers the injected Base App provider when it is available, then falls back to the standard Reown AppKit modal for all other browsers and wallets.
With the catalog configured above and an active Base entry, add Base mainnet's RPC:
RPC_URL_8453=https://your-base-rpc.comUse SUBGRAPH_URL_8453 only to pin an explicit compatible endpoint instead of the catalog entry.
All colors are defined as CSS custom properties in variables.scss. The file has a clearly marked THEME CONFIGURATION section at the top — change these values to restyle the entire app:
// — Brand Accent (buttons, links, focus rings, highlights) —
--accent-500: #1c997c; // Main accent color
--accent-rgb: 28, 153, 124; // RGB components (for alpha variants)
// — Status Colors —
--success-500: #62ad4f;
--warning-500: #ecc033;
--error-500: #c02723;Key design principles:
- RGB companion variables (
--accent-rgb,--success-rgb, etc.) — allrgba()values throughout the app derive from these automatically - Chart colors (
--chart-*) — 15 variables controlling Chart.js canvas rendering, with light/dark overrides - Graph colors (
--graph-*) — 5 variables controlling SVG topology visualizations - Accent shadows (
--accent-glow,--accent-shadow-*) — auto-derived from--accent-rgb - Dark theme — all variables are overridden in the
[data-theme="dark"]section at the bottom of the file
The useThemeColors composable bridges CSS variables into JavaScript for Chart.js by reading computed styles from document.body. It uses useTheme() for reactivity so chart re-renders happen after the DOM data-theme attribute updates.
The app logo is rendered by components/base/LogoBrand.vue. By default it displays the Euler logo as an inline SVG using currentColor, so it automatically follows the theme's accent color.
To use a custom logo, set the LOGO_URL environment variable (or NUXT_PUBLIC_CONFIG_LOGO_URL). If the custom logo fails to load, the app falls back to the default Euler logo.
Intrinsic APY is populated by the Euler V2 SDK through the V3 backend and exposed on fetched vault entities as intrinsicApy. Lite enables this in utils/sdk-fetch-options.ts; provider coverage is configured upstream in V3. See Intrinsic APY for the current data flow.
Replace the favicon files in public/favicons/:
favicon.icofavicon.svg
Token icons are resolved from a unified server-side token list that aggregates the Euler SDK token list, DefiLlama, Uniswap, and Merkl. All sources are fetched in parallel with 5-minute caching and stale-fallback resilience. Euler SDK entries take priority for vault assets.
To override an icon for a specific token, add a file to assets/tokens/:
assets/tokens/
eul.png # overrides the EUL token icon
mytoken.png # overrides MYTOKEN icon
The resolution order in getAssetLogoUrl(address, symbol):
- Local override in
assets/tokens/<symbol>.png logoURIfrom the unified token list (Euler SDK token list > DefiLlama > Uniswap > Merkl)- Empty string (component shows initials fallback)
Vault inventory, products, entities, hosted logos, tags, campaigns, and deprecation metadata come from the versioned Public Labels API at V3_API_URL. Lite resolves version=latest to one immutable publication before fetching a chain bundle and follows every paginated list through meta.total.
Hosted labels, visibility and geo policies come exclusively from V3. Fork deployments can set LABELS_SOURCE=static and provide their own authoring files through STATIC_LABELS_BASE_URL. Start with Fork setup for complete examples using your own V3, static labels, or static labels without V3. See Static labels for the authoring format and failure semantics.
npm run devThe app will be available at http://localhost:3000.
For HTTPS in local development, set HTTPS_KEY and HTTPS_CERT env vars pointing to your certificate files.
The committed dependency uses the npm version in package.json and package-lock.json. Keep those files pinned to a published @eulerxyz/euler-v2-sdk version unless the PR is intentionally updating the SDK dependency.
For local Lite + SDK development, link the sibling SDK package without editing Lite package files:
cd ../euler-sdks/packages/euler-v2-sdk
pnpm run build
npm link
cd ../../../euler-lite
npm link @eulerxyz/euler-v2-sdk
npm ls @eulerxyz/euler-v2-sdk --depth=0
npm run devRebuild the SDK after SDK source changes:
cd ../euler-sdks/packages/euler-v2-sdk
pnpm run buildReturn Lite to the committed npm package before final validation:
cd ../../../euler-lite
npm ci
npm ls @eulerxyz/euler-v2-sdk --depth=0npm run build
npm run preview # preview locallyThe project includes a Dockerfile that uses Doppler for runtime secret injection:
docker build --build-arg APP_PORT=3000 -t euler-lite .
docker run -p 3000:3000 \
-e DOPPLER_TOKEN=your-doppler-token \
-e DOPPLER_PROJECT=euler-lite \
-e DOPPLER_CONFIG=production \
euler-liteDoppler injects all environment variables at runtime. The server plugins scan the injected env vars and pass config to the client via window.__APP_CONFIG__ and window.__CHAIN_CONFIG__.
The Docker build uses the npm SDK version from package-lock.json by default. For a Lite PR that needs an unreleased SDK branch, pass the SDK branch as a build argument:
docker build \
--build-arg EULER_SDK_BRANCH=feat/sdk-branch \
--build-arg APP_PORT=3000 \
-t euler-lite .When EULER_SDK_BRANCH is set, the builder clones euler-xyz/euler-sdks, builds packages/euler-v2-sdk, packs it, and installs that tarball with --no-save before running the Lite build. The committed Lite package files still point at the installed npm version.
The SDK preview build installs pnpm@10 by default. Set EULER_SDK_PNPM_VERSION if the SDK branch requires another pnpm version.
To run without Doppler, override the CMD and pass env vars directly:
docker run -p 3000:3000 \
-e V3_API_URL=https://v3.euler.finance \
-e EULER_SDK_V3_API_KEY=your-v3-api-key \
-e SWAP_API_URL=https://swap.euler.finance \
-e APPKIT_PROJECT_ID=your-project-id \
-e RPC_URL_1=https://your-rpc.com \
-e SUBGRAPH_CATALOG_URL=https://raw.githubusercontent.com/euler-xyz/euler-subgraph/catalog/v1/catalog.json \
euler-lite node .output/server/index.mjsassets/
styles/variables.scss # Theme config + CSS variables (edit top section to restyle)
tokens/ # Token icon overrides
components/
base/LogoBrand.vue # App logo (inline SVG default, env var override, error fallback)
... # Vue components organized by feature
composables/
useEnvConfig.ts # Runtime env config (API URLs, Pyth, Reown, logo)
useDeployConfig.ts # Branding, social links, feature flags
useThemeColors.ts # Bridges CSS color variables into Chart.js
useChainConfig.ts # Dynamic chain derivation from env vars
useEulerConfig.ts # Aggregated config for Euler services
useTokenList.ts # Unified token list and icon resolution
useEulerTx.ts # SDK TransactionPlan builders, simulation, and execution
entities/
account.ts # Account and position helpers
chainRegistry.ts # Supported-chain lookup helpers
constants.ts # Shared protocol/API constants
utils/
vault/ # Vault classification, APY, LTV, and verification helpers
pages/ # Nuxt pages/routes
plugins/
00.wagmi.ts # Wagmi/Reown wallet configuration
public/
favicons/ # Favicon files
logo.svg # Default logo (uses currentColor for theme-awareness)
server/
plugins/app-config.ts # Injects env config into HTML (incl. logo URL)
plugins/chain-config.ts # Injects chain config into HTML
| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Build for production |
npm run preview |
Preview production build locally |
npm run generate |
Generate static site |
npm run lint |
Run ESLint |
npm run lint:fix |
Run ESLint with auto-fix |
npm run test |
Run unit tests (watch mode) |
npm run test:run |
Run unit tests (single pass) |
npm run typecheck |
Type-check the project |
npm run postinstall |
Prepare Nuxt (runs automatically) |
Before deploying:
- Copied
.env.exampleto.envand filled in values - Set
APPKIT_PROJECT_IDandNUXT_PUBLIC_APP_URL - Set
V3_API_URL, optionalEULER_SDK_V3_API_KEY, andSWAP_API_URL - Set
TURTLE_EARN_API_KEYif Turtle rewards stay enabled (NUXT_PUBLIC_CONFIG_ENABLE_TURTLE), otherwise Turtle reward proofs return 503 and the server SDK skips Turtle stream discovery - Added at least one
RPC_URL_<chainId>and verified an active catalog entry withSUBGRAPH_CATALOG_URLset, or configured an explicitSUBGRAPH_URL_<chainId>/NUXT_PUBLIC_SUBGRAPH_URI_<chainId> - Configured branding via
NUXT_PUBLIC_CONFIG_*env vars (title, description, logo, social links, social share image) - Customized theme colors in
assets/styles/variables.scss(THEME CONFIGURATION section) - Replaced favicon files in
public/favicons/ - Added token icon overrides in
assets/tokens/(if needed)
- Verify
V3_API_URLis set correctly. If the V3 deployment requires authentication, verifyEULER_SDK_V3_API_KEYis set. If using Doppler, ensure the URL env var name matches (V3_API_URL,EULER_SDK_V3_API_URL, orNUXT_PUBLIC_V3_API_URL). - Token data is fetched server-side via
/api/internal/token-listwhich aggregates Euler V3, DefiLlama, Uniswap, and Merkl sources with fallback. Check server logs for upstream failures.
- The Turtle Earn API requires an API key. Confirm
TURTLE_EARN_API_KEYis set on the server; the/api/internal/proxy/turtleroute logsreason: missing-api-keyand answers 503 when it is not. - A 502 with
upstream failedandstatus: 401in the logs means Turtle rejected the configured key (revoked or wrong environment). - Without the key the server SDK is built with
rewardsEnableTurtle: false, which disables the SDK's direct Turtle discovery only. The server SDK runs in fallback mode (euler-data-v3 primary), so Turtle campaigns sourced from V3 can remain visible in vault snapshots (/api/internal/vaults) and APYs while proof requests through the proxy fail with 503. Visible campaigns therefore do not prove the key is set; check the proxy logs. - Turtle campaigns missing from snapshots is not by itself a missing-key symptom. It also happens when euler-data-v3 is failing or has no active Turtle streams. If the key was the cause, fix the env and restart; each chain's SDK is cached on first use (normally during startup warm-up).
- Ensure Node.js version is 24.22.1 (see
.nvmrc) - Clear and reinstall:
rm -rf node_modules && npm ci
- Verify
APPKIT_PROJECT_IDis correct (orNUXT_PUBLIC_APP_KIT_PROJECT_IDfor Doppler) - Ensure
NUXT_PUBLIC_APP_URLmatches your domain - Check browser console for errors
- Ensure at least one
RPC_URL_<chainId>env var is set - For subgraph discovery, verify an active entry in the catalog selected by
SUBGRAPH_CATALOG_URL, or an explicitSUBGRAPH_URL_<chainId>/NUXT_PUBLIC_SUBGRAPH_URI_<chainId>. Subgraph configuration does not enable chains. - Check the chain's
statusinEulerChains.json:unlistedchains are always hidden, andstagingchains are hidden whenDOPPLER_ENVIRONMENT=prd
MIT — see the LICENSE file.