Browser Extension
Auto round-up every Solana transaction with zero code changes. Install the extension and every swap, bid, or transfer gets rounded up.
How It Works
The Buff extension intercepts your wallet's signTransaction() call and appends round-up transfer instructions into the same transaction before it reaches your wallet for signing. You see one Phantom popup with everything — the original swap plus the round-up. One signature, zero friction.
1dApp calls wallet.signTransaction(tx)2 → Buff intercepts via Proxy on window.solana3 → Estimates USD value of the transaction4 → Calls buff.finance/api/wrap to get round-up instructions5 → Appends instructions to the same transaction6 → Passes modified tx to the REAL wallet.signTransaction()7 → User signs ONE Phantom popup (original + round-up)8 → Transaction lands onchain with round-up includedInstall
Chrome / Brave / Edge / Arc
Option 1: Install from the Buff website (download and load unpacked).
Option 2: Install from the Chrome Web Store (coming soon).
Firefox
Download the Firefox build from buff.finance/extension and load as a temporary add-on.
Manual Install (Developer Mode)
1# Clone and build2git clone https://github.com/buff-protocol/buff3cd packages/chrome-extension4npm install5npm run build # Chrome → dist/6npm run build:firefox # Firefox → dist-firefox/78# Chrome: go to chrome://extensions → Enable Developer Mode → Load Unpacked → select dist/9# Firefox: go to about:debugging → Load Temporary Add-on → select dist-firefox/manifest.jsonSetup
After installing, click the Buff icon in your browser toolbar:
1. Open a Solana dApp
Navigate to any Solana dApp (Jupiter, Raydium, Tensor, Magic Eden, etc.) so the extension can access your wallet provider.
2. Connect Wallet
Click Connect Wallet in the Buff popup. This triggers Phantom (or your wallet) to connect. The extension communicates with the wallet on the active page — it never has access to your private keys.
3. Sign Authentication
Sign the “Buff API Authentication” message. This generates your API key and derives your self-custodial Buff wallet. Both are stored securely in the extension's sandboxed storage.
4. Start Transacting
That's it. Every Solana transaction you make will now include a round-up. Toggle it off anytime from the popup.
Popup Dashboard
The popup has 5 tabs:
Home
Quick stats: total round-ups invested, count, last round-up time. Shows the on/off toggle and accumulator progress toward the next swap threshold.
Plan
Choose your round-up increment. Each transaction is rounded up to the next multiple of your plan amount:
1Seed $0.50 round-up 5.0% fee2Sprout $1.00 round-up 3.0% fee ← default3Tree $5.00 round-up 1.5% fee4Forest $10.00 round-up 1.0% feeAllocate
Set your investment allocation. Split round-ups across BTC, ETH, SOL, USDC, and USDT with custom percentages. Presets available for common splits.
Portfolio
View your Buff wallet's total value, invested assets, pending SOL (accumulating toward the swap threshold), and threshold progress.
Settings
Configure the ceiling (max round-up per transaction), view your wallet addresses, and disconnect.
Security Model
API Key Isolation
Your API key is stored in the background service worker and never touches the page context. Websites cannot read your Buff credentials. All API calls happen in the extension's isolated background process.
Instruction Validation
Before appending any instructions, the extension validates that:
- Every instruction uses
SystemProgram(SOL transfers only) - The signer (fromPubkey) matches your connected wallet
- The total round-up amount is within your configured ceiling
If any validation fails, the transaction passes through unmodified.
Transaction Transparency
Every modification is visible in Phantom's signing popup. You see the original transaction plus the two extra SOL transfers (round-up to Buff wallet + fee to treasury) before you approve.
Supported Wallets
The extension wraps the following wallet providers:
- Phantom —
window.phantom.solanaandwindow.solana - Solflare —
window.solflare - Backpack —
window.backpack
Both signTransaction() and signAllTransactions() are intercepted. Legacy Transaction and VersionedTransaction (without address lookup tables) are supported.
Supported dApps
The extension works on any Solana dApp — it wraps the wallet provider globally. Tested on:
- Jupiter (swaps)
- Raydium (swaps, liquidity)
- Tensor (NFT marketplace)
- Magic Eden (NFT marketplace)
- Marinade (staking)
- Any dApp that uses standard Solana wallet adapter
Edge Cases
Exact Dollar Amounts
If a transaction is already an exact multiple of the plan amount (e.g., exactly $5.00 on the Tree plan), the round-up is $0 and skipped. No extra transfers are added.
VersionedTransaction with Lookup Tables
If a VersionedTransaction uses address lookup tables, the extension cannot safely add accounts and skips the round-up for that transaction. This is rare — most Jupiter swaps use lookup tables but the extension handles the common cases.
Very Small Transactions
Transactions estimated under $0.01 USD are skipped automatically.
API Timeout
The extension times out API requests after 8 seconds and passes the transaction through unmodified.
Building from Source
1cd packages/chrome-extension2npm install34# Development (watch mode)5npm run dev # Chrome6npm run dev:firefox # Firefox78# Production9npm run build # Chrome → dist/10npm run build:firefox # Firefox → dist-firefox/11npm run build:all # BothArchitecture
1┌─────────────────────────────────────────────────┐2│ PAGE CONTEXT (inject.ts) │3│ Proxies window.solana.signTransaction() │4│ Estimates tx value, appends instructions │5├──────────── window.postMessage ─────────────────┤6│ CONTENT SCRIPT (content.ts) │7│ Bridge: relays messages both directions │8├──────────── chrome.runtime.sendMessage ─────────┤9│ SERVICE WORKER (background.ts) │10│ API calls, auth, state, instruction validation │11│ API key lives here — never reaches page │12├──────────── fetch() ────────────────────────────┤13│ BUFF API (buff.finance/api/wrap) │14│ Calculates round-up, returns instructions │15└─────────────────────────────────────────────────┘