HANDLE
Solana · direct payments not configured · escrow not live

Docs

How HANDLE verifies who you are, where funds sit, what it charges, and what it deliberately doesn't do yet.

What HANDLE is

HANDLE is a way to pay a person on X in SOL without them having an account here and without you ever asking for a wallet address. You type their @username. The funds sit in an on-chain escrow account that only the matching X identity can drain, and they come back to you automatically if nobody claims them.

It is not a wallet, an exchange, a custodian, or a bank. HANDLE never holds funds in a database or in a keypair the team controls.

Sending SOL to an X username

  1. You type a @username. The app resolves it through X's official API to that account's permanent numeric user ID and shows you the profile it matched.
  2. You choose an amount in SOL and optionally a note. You see the fee breakdown before anything is signed.
  3. You connect a Solana wallet and approve a deposit into a per-payment escrow account.
  4. You get a transaction signature and a shareable payment link. Anyone with the link can see the status; the sender's wallet is hidden unless the sender chose to show it.

If the username can't be resolved to a real, live X account, the send stops there. A handle alone is never treated as authority over funds.

Claiming SOL

  1. Sign in with X using OAuth 2.0 with PKCE. The app reads your profile from X's official /2/users/me endpoint and keeps your numeric user ID.
  2. Connect the wallet you want paid into, then sign a one-time challenge. It binds your wallet, your X session, this domain, a random nonce and a five-minute expiry, and it moves no funds.
  3. Request a claim. You see the escrowed amount, the 1% claim fee and the net amount before you sign.
  4. The claim instruction is submitted to the escrow program, which verifies the attestation and the wallet signature and releases the funds in one transaction.

The browser never decides whether a claim is allowed. The server issues a short-lived, single-use attestation, and the on-chain program checks it.

Identity: X user IDs, not handles

X usernames can be changed, released and taken by someone else. X numeric user IDs never change. Every payment is written against the recipient's numeric ID at the moment it is created, so a payment made to you stays yours even if you rename your account, and a payment can't be re-pointed at whoever grabs your old handle.

The app asks X for the least access it can: users.read and tweet.read. It never posts, follows, reads messages, or keeps your X access token after reading your profile.

Escrow, fees and refunds

Claim fee
1% of the payment, charged only when a claim completes.
Refund fee
None. An expired, unclaimed payment returns in full.
Network fees
Solana transaction fees are paid by whoever signs, and are shown separately from the claim fee.
Refund window
A payment is refundable by the sender 30 days after it was created, and only if it is still unclaimed.

Funds live in a program-controlled escrow account created for that one payment. Nothing is held in the app's database, and no operator key can move a payment.

Wallets and security holds

You can link more than one wallet to your X account. A wallet only becomes usable for payouts after you sign the ownership challenge. If you switch to a different payout wallet, the new one sits on a 48-hour security hold before it can receive funds, and you're notified — that delay exists so a hijacked X account can't instantly redirect your money.

Signing a challenge is safe: it is a signature on a text message, not a transaction. HANDLE never sees your private key, and nothing in the app can ask your wallet to sign a transfer you didn't start.

The launches directory

The Launches page lists projects with two things that are never optional and always visible: the project's X account and its on-chain contract address. Every card links the X profile, lets you copy the contract address, and opens it on the block explorer.

Cover images are added by dragging a file onto the upload box (or clicking it to choose one): PNG, JPEG, WebP or GIF, up to 1 MB. Images are stored privately and shown through short-lived signed links.

A listing is a directory entry, not an endorsement. Verify the contract address on-chain before interacting with it.

What isn't live yet

  • The escrow program itself. Until it is written, tested and reviewed, real deposits and claims stay switched off — the app will tell you so rather than pretend.
  • Mainnet. This build is pinned to the test network regardless of configuration.
  • Automated on-chain reconciliation and alerting for stale deposits.

The How it works page shows the full setup checklist and exactly which pieces are missing.

Errors you may see

That username doesn't exist on X
The account was never there, or was deleted. Nothing was sent and nothing was charged.
X lookup isn't available right now
X's API rejected the request (rate limit or no credits). Try again later — the app won't guess who you meant.
Sign in with X again to confirm this claim
Your session is older than the safety window. Re-authenticate and try once more.
Verify ownership of this wallet first
You connected a wallet but haven't signed the challenge yet.
New payout wallet is on security hold
You changed payout wallet recently. Claims resume automatically when the 48-hour hold ends.
Real sends are disabled
The escrow program isn't deployed on this deployment, so no funds can be moved safely.