Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

5 Commits

Folders and files

Repository files navigation

Meteora Quick LP

A Chrome side-panel extension for providing liquidity on Meteora (Solana) without leaving the page you're on. It detects the token you're looking at — on pump.fun, DexScreener, Solscan, Birdeye, GMGN, Jupiter, even an X post with a mint address pasted in — and lets you create pools, deposit, track earnings, claim fees, and withdraw in a couple of clicks, with your own wallet signing everything.

It's built for people who have never LP'd before: every number comes with a plain-English explanation, every error tells you what happened and what to do next, and nothing is shown with more confidence than the data deserves. The UI follows Meteora's official look (dark, Inter, meteor orange).

What it does

Finds the token for you. Open the side panel on any page and it scans for a Solana token: the page URL on known sites, explorer links, repeated base58 strings in the text, or whatever address you've selected with your cursor (selection wins). You can always paste a mint address manually. Candidates are verified on-chain — it only accepts real SPL / Token-2022 mints — then enriched with symbol, icon, and live price from Jupiter.

Buys and sells through the pools themselves (Trade tab, the default). Not market swaps — single-sided Pro-pool deposits that behave like limit orders and pay you the pool's fee on every fill: Sell parks your tokens just above the current price, converting to SOL/USDC as trading pushes the price up through them; Buy parks quote just below, converting to tokens on the way down. You pick how far the order reaches (Close / Standard / Far), see it on a live bin chart — real liquidity per price bin fetched from chain, your order highlighted in orange, the range labeled in market-cap terms — place it in one click, and collect the converted side from Portfolio, or cancel any time by withdrawing. Orders always route through the biggest-TVL pool for the token; if no pool exists yet, one click creates one with a 5% fee first.

Deposits into existing pools (Deposit tab). Opens with the biggest-TVL pool pre-selected (the standing recommendation — you can still pick any other). Lists every Meteora DLMM and DAMM v2 pool for the detected token, sorted by TVL, each with a beginner-readable verdict ("$11K locked — small, expect the price to wobble"). Tap a pool to open its deposit form:

  • Classic pools (DAMM v2): type one amount, the extension quotes the matching other half at the current pool price, you approve once in your wallet.
  • Pro pools (DLMM): same one-amount flow, plus a price range (Narrow / Balanced / Wide presets or a slider) shown on the same live bin chart — existing liquidity per bin, your range in orange, labeled in market-cap terms (e.g. "$970K floor → $1.2M ceiling"), far easier to reason about than 0.0000071-style prices. Deposits can be both-sided or single-sided (token-only sits above the price, quote-only below — the chart shows which bins you land on). Deposit shape (spread evenly / piled near price / heavier at edges) sits under Advanced. The Trade tab wraps the same single-sided mechanic in a buy/sell framing.

Before sending, the panel re-quotes against fresh chain state (your preview may be a minute old by the time you approve) and refuses to proceed if the paired amount drifted beyond your slippage — then retries up to 3× if the pool moves during the send. The failure mode is always "nothing happened, try again", never "you deposited at a bad price".

Creates new pools (Create tab) when none exist yet:

  • Classic (DAMM v2): deposit both tokens, pick a trading fee (0.25%–6%), optionally enable a dynamic fee during volatility spikes or collect your fee earnings in the quote token only. Your two amounts set the starting price, and the panel warns you loudly if that price is >20% away from market ("arbitrage bots will eat the difference!").
  • Pro (DLMM): pick bin step (price ladder spacing), fee, and starting price (pre-filled from Jupiter's market price). This creates the empty pair — the program works that way — then you deposit into it from the Deposit tab.

Shows your whole portfolio (Portfolio tab). Scans the chain for every DLMM and DAMM v2 position a wallet holds — including ones opened on Meteora's own site — and totals it up: how much is in pools and how much sits in unclaimed fees, in USD (per position too, priced via Jupiter; anything unpriceable is shown without a dollar figure rather than guessed). For each position: what's deposited, unclaimed fees ticking live (refreshes every 20s), one-click Claim fees, and Withdraw 25% / 50% / 100%. A 100% withdrawal also claims fees, closes the position, and returns the position's SOL rent deposit to your wallet. Locked/vesting DAMM liquidity is respected — you get a clear message instead of a failed transaction.

Auto-pilot (price-triggered actions). On any position, arm a rule like "when the price is up 10%, withdraw 50%" or "when it's down 15%, claim fees". The background worker checks pool prices about every minute — even with the panel closed — and when a rule hits you get a Chrome notification, an orange badge on the toolbar icon, and a one-click button on the position. Nothing is ever sent silently: the extension is non-custodial, so the final signature always happens in your wallet popup. Rules are one-shot (they disarm after firing or executing) and are cleaned up automatically if the position is closed.

Handles multiple wallets. Switching is one click: change the account in your wallet app, then click the green wallet badge in the header — it reconnects as whatever account is now active. Portfolio additionally has a per-wallet view switcher: every wallet you've ever connected is remembered, and you can paste any address to watch it. Watched wallets are read-only — you see their deposits and live fees, and to act on one you switch to that account in your wallet and click the badge (signing always happens in your wallet, so the extension can never act as an account that isn't active there).

Stays live while open. Token price refreshes every 10s (with an up/down flash), pool lists every 20s, the open deposit form's pool state every 5s — all in place, never resetting what you're typing.

Security model (read this once)

  • Non-custodial, by construction. Transactions are built locally with Meteora's official SDKs (@meteora-ag/dlmm, @meteora-ag/cp-amm-sdk) and sent to your browser wallet (Phantom, Solflare, or any window.solana provider) for signing. The extension never sees, stores, or transmits a private key — it physically has no code path for one.
  • Your wallet popup is the final word. Every transaction appears there before anything happens; you can inspect and reject it. Nothing is ever auto-approved.
  • Nothing runs until you open the panel. Scripts are injected into the current tab on demand, only when the panel needs to scan the page or reach your wallet. The extension does not watch your browsing.
  • No backend. The only network calls are to your RPC endpoint, Meteora's public data API, and Jupiter's public token API. No analytics, no telemetry, nothing of ours.
  • How signing is hosted: the wallet bridge has to run through a web page (that's where window.solana lives), and wallets attribute requests to that page's origin. So the extension keeps a managed signing tab: a quiet, Chrome-pinned app.meteora.ag tab it opens on first Connect and reuses forever after (recreated automatically if you close it). All wallet traffic flows through it no matter what you're browsing — which means the panel works fine while you sit on trading terminals your wallet distrusts, your wallet always shows the same familiar origin, and no random page ever hosts your signing requests. The wallet badge's tooltip shows the origin in use. The wallet popup — which simulates and displays exactly what a transaction does — remains the final security boundary.

Install

npm install
npm run build

Then in Chrome: chrome://extensions → enable Developer mode → Load unpacked → select the dist/ folder.

First run: the panel asks for an RPC URL (a connection to Solana). Get a free one at helius.dev, paste it in Settings, done — this is the only setup. A default public RPC keeps things from crashing before that, but it's heavily rate-limited.

Building for yourself vs. sharing:

  • npm run build → dist/ — bakes in the RPC from owner-rpc.local (a gitignored file, one URL on one line) or the OWNER_RPC env var, if present, so you skip the setup step.
  • npm run build:share → dist-share/ — bakes in nothing; each person you share it with pastes their own RPC in Settings.

Using it

  1. Open a token page anywhere (or any page at all).
  2. Click the extension icon — the side panel opens and auto-detects the token. Wrong token picked up? Select the mint address with your cursor and hit Rescan, or paste it manually.
  3. Connect Wallet (top right) — approve in your wallet.
  4. Deposit into an existing pool, or create one if none exists.
  5. Come back any time: Portfolio shows your totals and earnings; claim or withdraw whenever you like.

Settings

Setting What it means
Interface Simple (default) hides every optional control for the quickest flow — one amount box, sensible defaults (balanced ranges, Classic pools, standard reach). Advanced shows all the knobs: range sliders, deposit shapes, which-amount pickers, auto-pilot rules, Pro pool creation.
RPC address Your connection to Solana. Free from helius.dev; the panel nags until you set one.
Price wiggle room (slippage) How many % prices may shift between your click and network confirmation. Shift more than that and the transaction safely cancels itself. Default 1%.
Speed tip (priority fee) A tiny extra fee (fractions of a cent) that gets your transaction confirmed faster when the network is busy. Default is fine.
Theme Dark (default, matches Meteora) or light.

Words the UI uses

Term Meaning
Pool A shared pot of two tokens people trade against. Depositors earn a cut of every trade.
Classic / Pro Friendly names for Meteora's DAMM v2 (covers every price automatically) and DLMM (you pick a price range and earn more while price stays inside it).
TVL / "$X inside" Money already deposited in a pool. Bigger usually means steadier prices.
Bin step / "% steps" A Pro pool's price ladder spacing. Price moves one rung at a time; your deposit sits on rungs you choose.
MC floor / ceiling Your earning range expressed as the token's market cap instead of raw price.

How it works

Piece Role
Side panel (React) The whole UI. Validates mints on-chain, queries dlmm.datapi.meteora.ag / damm-v2.datapi.meteora.ag for pools, builds transactions with the Meteora SDKs.
detect.js (content script) Finds mint candidates: known URL patterns → explorer links → repeated base58 strings → your text selection.
bridge.js (content script, isolated world) Relays panel ⇄ page messages.
inject.js (MAIN world) Talks to the page's wallet provider; deserializes and signs transactions.
background.js One job: open the side panel when the toolbar icon is clicked.

All three page scripts are injected on demand via chrome.scripting when the panel first talks to a tab — nothing runs on pages you visit otherwise.

The UI is a side panel rather than a popup on purpose: popups close when the wallet's approval window takes focus, side panels don't.

Source layout: src/lib/ is UI-free logic (transaction builders, RPC helpers, Meteora/Jupiter API clients, wallet bridge client), src/panel/ is the React UI (one file per tab plus shared hooks and icons), src/content/ and src/inject.ts are the page scripts.

Development

Command Does
npm run build Build dist/ (load this unpacked)
npm run build:share Build dist-share/ with no baked RPC
npm run watch Rebuild on change
npm run typecheck TypeScript, no emit
npm run test Offline unit tests (node:test): amount/format math, error humanizing, auto-pilot rule evaluation with mocked prices. No network, no wallet.
npm run smoke Bundle and run scripts/smoke.ts: exercises detection, pool discovery, and all four transaction builders against real mainnet state without sending anything. Set RPC_URL to avoid the rate-limited public endpoint.
npm run preview After a build, serves dist/panel.html at localhost:4173 so you can work on the UI in a normal browser tab. Chrome APIs are guarded, so token loading and pool browsing work there; only page-scan and wallet signing need the real extension.
node scripts/make-icons.mjs Regenerate the toolbar icons (meteor mark, hand-rolled PNG encoder, zero image deps)

Notes / limits

  • Mainnet only. Quote tokens: SOL and USDC.
  • DLMM pool creation makes the empty pair only (that's how the program works) — deposit right after from the Deposit tab. The new pool can take a minute to appear in Meteora's indexer; rescan if it's not there yet.
  • One customizable DLMM pair and one customizable DAMM v2 pool can exist per token pair; creating a duplicate fails at the program level (the panel translates that error and points you to the Deposit tab).
  • A DLMM position spans at most 69 bins; the range slider maxes out accordingly. Wider coverage = multiple positions.
  • Creating a pool costs a little SOL in one-time network deposits (usually under 0.1 SOL) on top of what you deposit; closing a position returns its rent deposit.
  • The Meteora data API's volume/fee figures are unreliable for some pools, so the UI deliberately shows no volume or projected-earnings stats — only numbers that are actually trustworthy.
  • Not affiliated with Meteora — a personal tool built on their public SDKs and APIs.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages