When you pay a contractor from your main wallet, you don't just send them money — you hand them a permanent window into your finances. The instant the transfer lands, the freelancer (and anyone they share the address with) can open a block explorer and see your balance, every other payment you've made, who else you work with, and roughly what you pay them. For a business or an individual operator, that's a leak of competitive and personal information that has nothing to do with the invoice you're settling.
This is the practical guide to paying a one-off invoice on Solana without exposing the wallet you pay from. If you run recurring salaries for a team, /blog/private-payroll-on-solana covers that distinct case; this post is about ad-hoc contractor and freelancer payments.
Why paying directly exposes you
A direct transfer writes both addresses, the amount, and the timestamp to a public ledger — that's the link, and it can't be undone by routing through extra wallets first. To pay without exposing your wallet, you put a shielded pool between you and the contractor: you deposit behind a commitment, then withdraw straight to their address with a zero-knowledge proof, so the payment they receive has no on-chain edge back to your treasury. /learn/what-is-a-shielded-pool is the explainer.
This protects your side unconditionally. Whether the contractor's receiving address is also private is their choice — but you can pay cleanly regardless.
The flow, step by step
1. Agree on the asset and a receiving address. Most invoices are quoted in USDC; SolMask supports SOL, USDC, and USDT. Ask the contractor for a receiving address — and, if they care about their own privacy, suggest they give you a fresh one with no history (/learn/choosing-a-recipient-address).
2. Deposit the invoice amount from your wallet. Open /swap, connect the wallet you're paying from, choose the asset and amount, and deposit. Depositing is free — the full amount enters the pool, with only a commitment hash on-chain (/blog/fee-model-explained). Budget for the withdraw fee on top so the contractor receives the exact invoiced amount.
3. Use a privacy delay where the timeline allows. Set an unlock delay at deposit (10 minutes to a week). If the invoice has a few days' runway, a longer delay means your deposit blends with more activity before the payment goes out. /blog/the-privacy-delay-explained explains why. For an urgent same-day payment, the 10-minute floor still breaks the direct link — you just get a smaller crowd.
4. Withdraw to the contractor's address. Generate the proof in your browser and submit through the relayer, which broadcasts and pays the network fee — so you pay even a brand-new freelancer wallet that holds no SOL, without funding it yourself (/glossary/relayer). The contractor receives the funds; on-chain, the payment traces to a pool withdraw, not to your business wallet.
The mistakes that undo all of it
- Paying recurring invoices to the same fresh wallet on a fixed schedule. Same amount, same payee, every two weeks, is a pattern even through a pool. For ongoing relationships, treat it like payroll and read /blog/private-payroll-on-solana.
- Depositing the exact, oddly-specific invoice amount and withdrawing it instantly. A unique amount in and the same amount out moments later correlates by value and timing. Use the delay; consider depositing a rounder amount than the precise invoice.
- Funding the contractor's wallet for gas. Never — the relayer covers it. A top-up from your wallet re-links you to the payee.
- Memos and invoices. Putting an invoice number or your company name in a transaction memo, or emailing a receipt that names both wallets, leaks off-chain what you protected on-chain. /learn/what-solmask-cannot-protect-you-from covers the rest.
For a one-page summary of every rule here, see /blog/solana-wallet-privacy-checklist.
FAQ
Q. How is this different from private payroll? A. Payroll is recurring payments to a known set of people on a schedule, which creates timing and amount patterns you have to manage deliberately. This post is for one-off or occasional contractor invoices, where a single clean deposit-and-withdraw is usually enough. See /blog/private-payroll-on-solana for the recurring case.
Q. Can I pay a contractor who has no SOL for gas? A. Yes. The relayer pays the network fee and broadcasts, so the contractor receives the full payment to an empty wallet — no need for you to fund it first.
Q. Will the contractor be able to see my main wallet? A. No. They receive funds from a pool withdraw with no on-chain link to the wallet you deposited from. They can see they were paid through SolMask; they cannot see your balance or history.
Q. Can I pay in USDC if I only hold SOL? A. Yes — deposit SOL and route the withdraw through a swap so the contractor receives USDC. See /blog/swapping-sol-to-usdc-privately.
Q. Does my business wallet still show the payment? A. It shows a deposit into the pool — not who you paid. The link between your deposit and the contractor's withdraw is what stays hidden.