> For the complete documentation index, see [llms.txt](https://docs.libertyswap.finance/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.libertyswap.finance/zkx-wallet/user-manual/self-broadcasting-setup-for-zkx-wallet-users.md).

# 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.
