# Tips

> Required tip on every Sender transaction. Minimum 1,000,000 lamports (0.001 SOL), tip addresses, and how to attach.

Every transaction sent through Sender must include a tip. Without one, it's rejected at the gateway.

## Why are tips required?

The tip pays for priority routing through Supanode's stake-weighted connection to the active leader and through Jito's bundle auction. Tips are paid only on transactions that get included - if your transaction doesn't land, the tip doesn't move.

## What is the minimum Sender tip?

**1,000,000 lamports (0.001 SOL)** per transaction. Below this floor the transaction is rejected at the gateway.

The amount above the minimum is your call - it depends on how aggressive you need to be during contention. Supanode doesn't publish recommended levels.

## How do you attach a tip?

Add a System Program `transfer` instruction to your transaction, paying to one of the official tip addresses below. Placement within the transaction doesn't matter.

## Tip addresses

Five rotating addresses. Choose **one randomly per transaction** to avoid hot-account contention.

```
1andAhkXmzRbuD37iuzTLnYKRkBGU7X26zw1wv2FBpT
1andoC8jkb9EXEz1RpgQiuGqgm8sEAsASBScS2nip4f
1andeJ5dyAENtyMHSHv3ZXDzJEctmqgAFvGbssqoyvH
1andf7rAwTZHozYhEm7ieCMvWMczGbHDNbAR5ktsmAq
1andxYDwQuoWuDFJ1rdyGCXET5AfEc4H3nYJkaU9Eay
```

## Code samples

### TypeScript

```typescript
import {
  Connection, Keypair, SystemProgram,
  Transaction, PublicKey, LAMPORTS_PER_SOL,
} from "@solana/web3.js";

const TIP_ACCOUNTS = [
  "1andAhkXmzRbuD37iuzTLnYKRkBGU7X26zw1wv2FBpT",
  "1andoC8jkb9EXEz1RpgQiuGqgm8sEAsASBScS2nip4f",
  "1andeJ5dyAENtyMHSHv3ZXDzJEctmqgAFvGbssqoyvH",
  "1andf7rAwTZHozYhEm7ieCMvWMczGbHDNbAR5ktsmAq",
  "1andxYDwQuoWuDFJ1rdyGCXET5AfEc4H3nYJkaU9Eay",
];

function pickRandomTipAccount(): PublicKey {
  const random = TIP_ACCOUNTS[Math.floor(Math.random() * TIP_ACCOUNTS.length)];
  return new PublicKey(random);
}

const tipAmount = 1_000_000; // 0.001 SOL - minimum

const tipInstruction = SystemProgram.transfer({
  fromPubkey: payer.publicKey,
  toPubkey: pickRandomTipAccount(),
  lamports: tipAmount,
});

transaction.add(tipInstruction);
```

### Rust

```rust
use solana_sdk::{pubkey::Pubkey, system_instruction};
use std::str::FromStr;
use rand::seq::SliceRandom;

const TIP_ACCOUNTS: [&str; 5] = [
    "1andAhkXmzRbuD37iuzTLnYKRkBGU7X26zw1wv2FBpT",
    "1andoC8jkb9EXEz1RpgQiuGqgm8sEAsASBScS2nip4f",
    "1andeJ5dyAENtyMHSHv3ZXDzJEctmqgAFvGbssqoyvH",
    "1andf7rAwTZHozYhEm7ieCMvWMczGbHDNbAR5ktsmAq",
    "1andxYDwQuoWuDFJ1rdyGCXET5AfEc4H3nYJkaU9Eay",
];

fn pick_random_tip_account() -> Pubkey {
    let mut rng = rand::thread_rng();
    let pick = TIP_ACCOUNTS.choose(&mut rng).unwrap();
    Pubkey::from_str(pick).unwrap()
}

let tip_amount = 1_000_000u64; // 0.001 SOL - minimum

let tip_ix = system_instruction::transfer(
    &payer.pubkey(),
    &pick_random_tip_account(),
    tip_amount,
);
```

## Best practices

- **Randomize per transaction.** Hot-account contention reduces throughput. Pick a different tip address each time.
- **Track your landing rate.** If transactions aren't landing during contention, raising the tip is one lever. The right amount is workload-dependent.

## External references

- [Jito documentation](https://docs.jito.wtf)

## See also

- [Get started](https://supanode.xyz/docs/solana/sender/start)
- [Submission methods](https://supanode.xyz/docs/solana/sender/send)
- [Endpoints](https://supanode.xyz/docs/solana/sender/endpoints)
