Paying tips in $RELAY
Provisional: $RELAY tipping launches with the token. The mechanics on this page — discount levels, TWAP window, burn share — are provisional and will be finalized before launch.
The relay charges a tip per transaction, payable in SOL or $RELAY — $RELAY at a discount. A portion of every confirmed tip is burned, so supply contracts with usage.
How tips work today (SOL)
Every transaction submitted to the relay must include a tip to one of the Fast… FastRelay tip wallets (selected at random):
- Minimum: 0.001 SOL (1,000,000 lamports)
- Recommended during congestion: 0.002–0.005 SOL
- Staked wallets pay less, down to tip-free at full stake — see your effective rate
- Jito atomic bundles additionally require a Jito tip (minimum 1,000 lamports) — a separate requirement
The full rules — tip wallet list, ALT restrictions, bundle requirements, error codes — are in the relay integration guide.
Worked example: building a SOL tip (real today)
The tip is not a separate API call — it is a plain SystemProgram.transfer inside your signed transaction, sending at least 1,000,000 lamports to one of the Fast… wallets. Build the transaction, add the tip instruction, sign, base64-encode, and submit to the relay:
import {
Connection,
Keypair,
PublicKey,
SystemProgram,
Transaction,
} from "@solana/web3.js";
// FastRelay tip wallets — pick one at random per transaction.
// Full list in the integration guide: /docs/relay/tips
const TIP_WALLETS = [
"Fast4fVSRa7HCyhWrnrgty8VwUbH3fas28NDhFsUpLW3",
"Fastb3cHVBqbTSc7p7HacsMFdJVje5m9ASgprGsPCD4U",
"Fast2uKJ79oMFwmz3EmyLcGF9H9b6Nn2NBRRTPjTDsuo",
"FasthH6DiM2KyfjvD2M6edqHWg9TUj9UDX7J1v3iy6rf",
];
const tipWallet = new PublicKey(
TIP_WALLETS[Math.floor(Math.random() * TIP_WALLETS.length)]
);
const RELAY_TIP_LAMPORTS = 1_000_000; // 0.001 SOL — the relay minimum
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const payer = Keypair.fromSecretKey(/* your signer's secret key */);
const tx = new Transaction();
// … your app instructions (swap, transfer, etc.) go here …
// The relay tip: a plain SystemProgram transfer to a Fast… wallet.
tx.add(
SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: tipWallet,
lamports: RELAY_TIP_LAMPORTS,
})
);
tx.feePayer = payer.publicKey;
tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
tx.sign(payer);
// Base64-encode the fully signed transaction and hand it to the relay.
const txBase64 = tx.serialize().toString("base64");
const res = await fetch("https://fra.fastrelay.sh/v1/sendTx", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ tx: txBase64, simulate: false }),
});
console.log(await res.json());
// → { "status": "accepted", "request_id": "…", "signature": "5wH…" }The tip lives inside the signed transaction, so the curl submission is identical to any other — you are just posting the base64 blob you built above:
curl -X POST "https://fra.fastrelay.sh/v1/sendTx" \
-H "Content-Type: application/json" \
-d '{
"tx": "BASE64_SIGNED_TX_WITH_TIP_TRANSFER",
"simulate": false
}'If the transfer to a Fast… wallet is missing or below 1,000,000 lamports, the relay rejects the transaction with tip_missing or tip_insufficient.
Paying in $RELAY instead
At launch, $RELAY becomes a second way to pay the same tip, at a discount to the SOL price:
- Value-targeted, not a fixed token count. The $RELAY tip targets a set SOL-value at tip time, priced via a time-averaged (TWAP) RELAY/SOL price — so the tip always tracks value rather than a fixed number of tokens.
- Discounted for stakers. Stakers tip at a further discount that scales with stake — see Staking.
- A portion of every confirmed tip is burned. Real relay usage permanently removes $RELAY from supply — supply is fixed and only ever decreases. Verify it live on the burn dashboard.
There is no client code for $RELAY tips yet — this path opens with the token. Until then, the SOL tip shown above is the only tip the relay accepts. When $RELAY tipping ships, the transaction shape stays the same (a token transfer to the relay's tip program in place of the SOL SystemProgram.transfer); the worked example will be published here at launch.
SOL fallback — always available
Tipping in $RELAY is optional. SOL tips continue to work exactly as they do today, with the same minimums and the same tip wallets. Nothing about the existing integration breaks when $RELAY tipping ships.