burowd

a private node dug under pump.fun.

burowd / bore 01

§ field log

how it works

re
Private Solana node under pump.fun. Your bot reads and lands from inside.
bore
01, sealed
status
Closed. Node opens soon.
handling
Read below ground.

§00 abstract

burowd is a private Solana node dug in beside the pump.fun program. Your bot does not stand in the public RPC queue. It reads account state from a local replay, built from shreds as they come off the wire, and it lands transactions by handing them straight to the leaders that own the coming slots, over a staked QUIC path. One tenant per tunnel. No shared rate limit, no shared send lane, no load balancer between your bot and the chain. The public endpoint is a road on the surface. burowd is the tunnel under it.

surface ............................................................
  bot --> public rpc --> balancer --> queue --> shared node --> ?
=============================================================== ground
      |
      |  burowd
  +---+--------------------------------------------+
  |   turbine shreds --> repair --> replay --> CACHE |
  |                                          |     |
  |   your bot <===== tunnel =====> NODE <-------+     |
  |                                 |              |
  |                                 +--quic--> TPU(L, L+1, L+2)
  +------------------------------------------------+

§01 galleries

The node is one machine with one job. It joins gossip like any full node that sits next to validators, takes turbine shreds at its layer of the broadcast tree, repairs gaps, and replays the bank. Each tenant gets a gallery: a dedicated socket, a dedicated stream, a dedicated send path. Galleries never share a queue. A tenant that floods its gallery floods only its own gallery. The rest of the burrow does not feel it.

                 gossip / turbine
                        |
                 +------v------+
                 |    NODE     |
                 |   replay    |
                 +--+---+---+--+
                    |   |   |
          g.01  +----+   |   +----+  g.03
                |      g.02      |
              bot a     |      bot c
                      bot b

  gallery := { socket, stream, read, land, quota(self) }

§02 read path

Shreds are recovered from their erasure sets and entries are rebuilt before the block is whole. Transactions that touch the program are decoded on arrival and folded into a hot account cache: the global config, the fee recipients, every bonding curve and the token account behind it. A read never leaves the machine. Asking for a curve is a memory lookup, not a trip across the internet. Commitment starts at processed and is upgraded in place as the bank confirms.

struct CurveView {
  mint      Pubkey
  curve     Pubkey   // pda ["bonding-curve", mint]
  v_sol     u64      // virtual sol reserve
  v_tok     u64      // virtual token reserve
  r_sol     u64      // real sol reserve
  r_tok     u64      // real token reserve
  complete  bool     // curve filled, migration next
  slot      u64
  commit    processed | confirmed | finalized
}

price is never stored. it is derived from reserves at read time.

§03 land path

A signed transaction enters the tunnel and leaves the machine once, toward the leaders. The node holds the leader schedule for the epoch, resolves the TPU QUIC address of the leader that owns the coming slot and of the ones after it, and fans the same packet out to each of them over a staked connection, so stake-weighted QoS lets it through when the public lanes are full. No hop through a shared RPC. No retry storm. If the slot passes, the transaction is sent again with a fresh blockhash only if your bot asked for that.

bot --sign--> tunnel --> NODE
                          |  schedule[epoch]
                          |  owner(s), owner(s+1), owner(s+2)
                          |
                          +--quic/staked--> TPU L
                          +--quic/staked--> TPU L+1
                          +--quic/staked--> TPU L+2
                          +--(opt) bundle--> block engine, tip

the node can drop a transaction. it can never change one.

§04 leader clock

Slots are counted from the bank the node replays, not polled from a remote endpoint. The send path reads the schedule from the same bank, so it aims at the leader that owns the coming slot and the one after it, never at the one that just left. A skipped slot moves the aim forward. A fork moves it back to the last bank both branches agree on.

slot     s-1      s        s+1      s+2      s+3
leader   L0       L1       L1       L2       L2
         |        |        |        |        |
send     .        x------->x------->x        .     fanout 3
watch    .        .    sig? --------+-------> landed
                                    +-------> expired
                                    +-------> dropped

§05 pump.fun surface

The node keeps warm every account the program reads on create, buy and sell, so a transaction built from the cache never waits on a lookup. Instructions are decoded with their inner instructions, so a buy routed through a wrapper or an aggregator still lands in the log as a buy against the curve. Failed transactions are kept. A reverted snipe still tells you who was in the slot.

ix        accounts kept warm
create    global, mint, curve, curve_ata, metadata, creator
buy       global, fee_rcpt, mint, curve, curve_ata, user_ata, user
sell      global, fee_rcpt, mint, curve, curve_ata, user_ata, user
migrate   curve, pool, lp_mint, pool_base, pool_quote
failed    Attempt(slot, tx, err)   // kept

§06 tunnel protocol

A tunnel is one long-lived connection bound to one wallet. It opens with a Sign-In With Solana message: a nonce, a domain, a wallet, a signature. No transaction, and no key ever crosses the tunnel. Inside it there are three channels, each with its own order. Stream carries decoded events. Read answers account and slot questions. Land takes signed transactions and reports what happened to them. Nothing in one channel waits on another.

open    siws(nonce, domain, wallet, sig)   -> Session

chan    stream  events.tail(filter, from?)  -> stream<Event>
chan    read    account(pubkey)             -> AccountView
                curve(mint)                 -> CurveView
                slot()                      -> SlotInfo
chan    land    send(tx, fanout?, tip?)     -> Receipt
                watch(sig)                  -> landed | expired | dropped

close   drain, then seal

§07 backfill

When a fork is abandoned, history is not rewritten. Every event that came out of the dead slot is followed, in order, by a tombstone, and the cache rewinds each curve it touched to the last view both branches share. Bots tailing the stream see the retraction arrive like any other event. A collapsed gallery is backfilled. The tunnel stays open.

slot  tx   kind   mint        commit
s+0   014  buy    7Hq..pump   processed
s+0   015  buy    7Hq..pump   processed
s+1   ---  tomb   s+0/014..015 fork       < cache rewinds 7Hq
s+1   009  buy    7Hq..pump   processed
s+2   ---  ---    ---         confirmed

§08 custody

burowd never holds a key. Transactions arrive signed and leave signed. The node does not reorder your bundle, does not copy your flow into another gallery, and does not trade. It digs, it reads, it carries.

holds keys         no
signs for you      no
reorders you       no
copies your flow   no
shares your lane   no

§09 non-goals

No terminal. No charts. No signals. No copy trading. No dashboard to stare at. A node, a tunnel and a send path, for bots that already know what they want.

terminal     no
charts       no
signals      no
copy trade   no
dashboard    no

§10 access

Sealed for now. Every wallet that digs in goes into the draw for the first galleries. Node opens soon.

status      sealed
galleries   draw, per connected wallet
node        opens soon

— end of log —