For the complete documentation index, see llms.txt. This page is also available as Markdown.

Self-Broadcasting Setup for ZKX Wallet Users

It is provided for general educational and informational purposes only and does not constitute legal, financial, or compliance advice.

What is Self-Broadcasting?

When you shield, unshield, or send privately with a Railgun-powered wallet like ZKX Wallet, the resulting transaction has to be submitted on-chain by someone. Normally, that job can be handed to a Broadcaster (Railgun's relayer network) β€” see Railgun Private Sends: Privacy and Fee Structure for how relayer premiums factor into private-send fees.

Self-broadcasting means you skip the Broadcaster and submit the transaction yourself, using gas from your own wallet. This removes your dependence on a third party to get the transaction included, and β€” when paired with the correct wallet setup below β€” reduces the metadata trail that could otherwise link your shielding activity back to a single identity.

Self-broadcasting only removes your reliance on a Broadcaster. It does not, by itself, separate your public and private identities β€” that depends entirely on which wallets you use to fund, shield, and receive. That's what the setup below is for.

Why You Need Two Separate Wallets

If the same 0x address funds a shield and later receives the unshielded funds, an observer only has to watch that one address to connect both ends β€” the privacy Railgun provides in between is undermined by the addresses on either side.

Rule: the wallet that funds the shield β‰  the wallet that receives the funds later.

Splitting these roles across two independent 0x/0zk pairs, each capable of paying its own gas, is the baseline setup for self-broadcasting with ZKX Wallet.

The Setup

Wallet 1 β€” Shielding Wallet (0x1 + 0zk1)

  • Keep enough native gas token on 0x1 to self-broadcast the shield transaction.

  • Keep the funds you intend to shield (for example, on PulseChain) on 0x1.

  • Shield those funds from 0x1 β†’ 0zk1.

Wallet 2 β€” Receiving Wallet (0x2 + 0zk2)

  • Keep enough native gas token on 0x2 to self-broadcast.

  • Use 0x2 as the separate, clean public wallet you receive your funds into later β€” not an address that has ever been linked to 0x1 or posted publicly.

Privacy Flow

The full flow moves funds through three hops, only the first and last of which touch the public chain:

Hop
Action
Notes

0x1 β†’ 0zk1

Shield

Public transaction, self-broadcast using 0x1's own gas

0zk1 β†’ 0zk2

Private transfer

Fully shielded β€” no public transaction, no network gas required for the transfer itself

0zk2 β†’ 0x2

Unshield

Public transaction, self-broadcast using 0x2's own gas

The important part is separating the two wallet pairs. Don't reuse 0x1 when unshielding if your goal is to avoid creating an obvious public link back to the original wallet.

Privacy here isn't just about which addresses you use β€” it depends on how you use the whole system. Self-broadcasting each public hop, keeping the middle hop fully private, and never letting 0x1 and 0x2 cross paths are all part of the same setup, not separate options.

Step-by-Step in ZKX Wallet

  1. Create two independent accounts. In ZKX Wallet, go to Settings β†’ Accounts β†’ Add an account and create Wallet 1 and Wallet 2 using separate recovery phrases β€” not two sub-accounts under the same seed. If both wallets are derived from one recovery phrase, compromising that single phrase exposes both, defeating the separation this setup is meant to provide.

  2. Fund both public addresses with gas. Send enough native gas token (for example, PLS on PulseChain) to 0x1 and 0x2 so each can independently cover a self-broadcast transaction. See Optional: Funding Wallet 2 Through Tornado Cash below for a way to fund 0x2 without linking it back to 0x1.

  3. Load the funds to shield onto 0x1. Keep them there rather than moving them through 0x2 first.

  4. Shield from 0x1 to 0zk1. Switch to Wallet 1, open Shield, and follow the flow described in Shielding Tokens. The recipient defaults to your own private address (0zk1) β€” confirm this on the One last check screen before submitting.

  5. Send privately from 0zk1 to 0zk2. This is a shielded-to-shielded transfer β€” no public transaction is created and no network gas is required for the transfer itself, so this step doesn't depend on either wallet's gas balance.

  6. Unshield from 0zk2 to 0x2. Switch to Wallet 2, open Unshield, and follow the flow described in Unshielding Tokens, self-broadcasting with 0x2's own gas. 0x2 β€” never 0x1 β€” is the address that should end up holding the funds publicly again.

Optional: Funding Wallet 2 Through Tornado Cash

0x2 still needs to be funded with native gas token before it can self-broadcast the final unshield (step 2 above). If that funding comes from an exchange or address that's linked to your real identity or to 0x1, it can reintroduce the exact correlation this setup is designed to avoid.

For extra separation, fund 0x2's gas through Tornado Cash instead of sending it directly from a known source.

Important Notes

  • Fund 0x1 and 0x2 from sources and at times that aren't obviously linked to each other β€” funding both from the same exchange withdrawal seconds apart re-creates the correlation this setup is meant to avoid. See Use Privacy Protocols Like Railgun for the broader timing and amount-variance principles this setup builds on.

  • Don't reuse 0x1 or 0zk1 for anything once they've touched the shield in this flow β€” treat them as tainted going forward, per the "funding wallet β‰  fee payer β‰  receiver" rule linked above.

  • Don't post either address, or a screenshot of the transaction, on social media β€” see point 6 in Use Privacy Protocols Like Railgun.

Last updated