Chrome · Firefox · Brave · Edge · Arc

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.

Flow
text
1dApp calls wallet.signTransaction(tx)
2 → Buff intercepts via Proxy on window.solana
3 → Estimates USD value of the transaction
4 → Calls buff.finance/api/wrap to get round-up instructions
5 → Appends instructions to the same transaction
6 → Passes modified tx to the REAL wallet.signTransaction()
7 → User signs ONE Phantom popup (original + round-up)
8 → Transaction lands onchain with round-up included
Note
Fail-open safety: If the Buff API is unavailable, times out, or returns an error, your transaction goes through completely unmodified. Buff will never block or corrupt a transaction.

Install

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)

terminal
bash
1# Clone and build
2git clone https://github.com/buff-protocol/buff
3cd packages/chrome-extension
4npm install
5npm run build # Chrome → dist/
6npm run build:firefox # Firefox → dist-firefox/
7
8# 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.json

Setup

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.

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:

Plans
text
1Seed $0.50 round-up 5.0% fee
2Sprout $1.00 round-up 3.0% fee ← default
3Tree $5.00 round-up 1.5% fee
4Forest $10.00 round-up 1.0% fee

Allocate

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:

  • Phantomwindow.phantom.solana and window.solana
  • Solflarewindow.solflare
  • Backpackwindow.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

terminal
bash
1cd packages/chrome-extension
2npm install
3
4# Development (watch mode)
5npm run dev # Chrome
6npm run dev:firefox # Firefox
7
8# Production
9npm run build # Chrome → dist/
10npm run build:firefox # Firefox → dist-firefox/
11npm run build:all # Both

Architecture

Architecture
text
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└─────────────────────────────────────────────────┘