
Pgas.me
Fund a new EVM wallet without linking it to your old one. Any token in, unlinked gas out.
Demo
About
Every fresh wallet has a birth certificate: the transaction that funded it. Send gas from your main wallet to a new one and the two are linked forever. Every protocol you touch, every position you open, every payment that arrives at that "new" address is attributable to you, your balance and your whole history. On a public ledger there is no way to start clean, which is why most people keep using one doxxed address for everything. pgas.me funds new wallets with gas without creating that link. Connect any wallet, pay with any token you already hold on any supported chain, and the deposit is routed to Ethereum and locked into the Beam bridge. The value settles on Beam, a confidential ledger with no per-address balances and blinded amounts, where it is held as bETH, bDAI or bWBTC. Later, whenever you choose, you list the wallets to fund, the amounts and when they should arrive. Each payout crosses back through the bridge and is signed from a fresh Beam address created for that single order, so on Ethereum the funded wallet's history begins with a bridge payout and nothing points back at your deposit. Two details make the unlinking real rather than decorative. First, every deposit names a different receiver key on Ethereum. We rebuilt the Beam bridge's wallet-side application so keys are derived from the contract id plus an index rather than the single constant key the stock build derives, so two deposits from the same payer no longer share the 33 bytes that identify them. Second, every payout is signed from a single-use Beam address, so nothing on the Beam side resembles an account either. Where this goes, and the actual point of the project: - Run it yourself. A standalone app you download from GitHub, launch on your own machine, point at your own Beam wallet and use to fund as many wallets as you want. No operator, no custody, no trust in us. The service you can try today is the hosted demonstration of that app. - Max privacy mode. Beam's Lelantus shielded pool, so value is not merely confidential but drawn from an anonymity set. The code exists and is deliberately disabled today because the pool's unlock timer would strand user funds; it ships when the set size and the timers make it honest. - Instant payouts from a rotating distributor pool. Each distributor is funded independently across the bridge, spends a fixed budget and is retired, so the transaction graph stops at a wallet with no relationship to any deposit. Built and tested, currently flag-off. - Funding for AI agents. An agent that needs gas for a fresh account calls the same API, or runs the local app, and funds itself without exposing the operator's treasury or reusing one hot wallet for every task. - Non-custodial settlement. A BeamVM contract holding balances against keys in the user's browser, so the operator cannot move funds at all.
How it's made
The backend is FastAPI with MongoDB; the front end is React, TypeScript and ethers v6. Sign-in is SIWE("Sign-In with Ethereum"), there are no accounts and no email, and the whole thing is in the public repository. Ingress: on Ethereum a deposit is a direct call to the Beam bridge's pipe contract. From any other chain we ask a cross-chain intent router to fill an order on Ethereum and attach the pipe call as the fill's hook, so the user signs once, on the chain where their money already is. For token-to-ETH on Ethereum we shipped a Uniswap V4 route: a Universal Router swap priced by the V4 Quoter into the user's own wallet, then the direct deposit. On Uniswap specifically, we first built the atomic version: a zero-liquidity gateway pool whose hook takes the entire input in beforeSwap, routes it through the canonical hookless pool for the real price, floors the output onto the bridge's 8-decimal grid and calls sendFunds in the same transaction, with our own router exposing msgSender() for attribution. It is in the repo with 76 offline tests and 9 mainnet-fork tests after two adversarial review rounds, and we chose not to deploy it. FEEDBACK.md explains why: permission bits in the address mean salt mining on every bytecode change, a hook that takes 100% of the output forces amountOutMinimum to zero at the router so slippage must be enforced inside the hook, router and sender semantics are not discoverable from the interface, and the same atomic post-swap effect is a single field on a cross-chain intent order. That comparison is the most useful thing we can give the Uniswap team. Beam side: our backend runs its own Beam node and wallet-api, claims each bridge message, and books every movement through an append-only ledger, so a balance is always a sum over movements and never a raw wallet read. The part we are proudest of is the shader rebuild. The bridge's wallet-side application derives exactly one receiver key per wallet per pipe, so every deposit would have named the same 33 bytes on Ethereum. We patched it: a packed KeyID of contract id plus index is passed to Env::DerivePk, the same blob is handed to SigRequest when the claim is signed, and the incoming-message view derives a bounded window of keys and reports which index a message matched. It compiles to wasm32 with clang in a pinned Docker image, rebuilds byte-for-byte identically, and was proven against the live wallet read-only before deployment: the legacy key is unchanged on all three pipes, indexed keys are distinct and stable, the claim data for an existing message is byte-identical to the stock build's, and a wrong index is refused before anything is signed. Because this moves real money, the engineering is mostly about evidence. A delivery is proven by identity rather than a balance guess, the pipe's balance falling and the destination's rising in the same block. Every irreversible step checks a kill-switch file. A retry never re-signs, so one nonce means at most one fill. The relayer fee is charged at cost with headroom and the unused part is refunded when the crossing settles. Chain reads walk the whole endpoint pool, because one endpoint's refusal is not evidence of anything. Statuses never say "failed" for an internal cause; an order that cannot move says what it is waiting for and when it will retry. There are 1,134 backend tests and 209 browser tests, all offline. Operationally it is one VPS: systemd units for the API, the Beam node, the wallet-api and the payment services, nginx behind Cloudflare, and a deploy script that builds locally and ships.