Send crypto like a text.

Ferry turns crypto into a link. Drop it in any chat, and whoever opens it claims the money. No wallet address to ask for, no gas for them to find.

< 1¢
to claim on-chain
0
addresses to copy
Any
wallet, any chat
Ferry
Robinhood Chain
You've been sent
25 USDC
from lena.eth · tap to claim
You've been sent 25 USDC
ferry-rosy.vercel.app · Claim to any wallet in one tap. No gas needed.

How it works

Three steps. One transaction each side.

01

Deposit

Pick a token and an amount. Your wallet locks it in the Ferry escrow contract on Robinhood Chain, in one transaction.

02

Share the link

Ferry mints a one-time key for that deposit and puts it in the URL. Paste it in iMessage, Telegram, Slack, a QR code, anywhere.

03

They claim

The recipient opens it, picks a wallet, taps claim. Their browser signs with the link key and a relayer pays the gas.

Why Ferry

Built like infrastructure. Feels like a message.

Non-custodial

Funds sit in a ~150-line escrow contract, never on a Ferry server. Read every line on Blockscout.

Gasless for recipients

Claims are signature-authorised, so a relayer can submit them. New users don't need ETH to receive ETH.

Cancel anytime

Sent it to the wrong chat? Cancel from your wallet and the funds come straight back. Optional expiry, too.

Private by design

The secret lives in the URL fragment, which browsers never send to servers. Ferry can't see it, and neither can we.

Rich previews

Every link unfurls into a card showing the amount and token, in iMessage, Telegram, Slack, X, Discord.

Any wallet

Claim to a Coinbase Wallet, Rainbow, MetaMask, a smart account, or just paste an address. No sign-up.

Under the hood

The link is a key. The key is the only thing that can claim.

Every link maps to a fresh keypair. The contract stores only the public address. To claim, the holder signs a message naming the recipient, so a relayer can pay gas but can't redirect the funds.

Try it now
function claim(address claimKey, address to, bytes sig) {
  Link storage l = links[claimKey];
  require(!l.claimed && !expired(l));

  bytes32 digest = claimDigest(claimKey, to);
  require(recover(digest, sig) == claimKey);   // link holder

  l.claimed = true;
  pay(l.token, to, l.amount);                  // → recipient
}

FAQ

Questions, answered.

Whoever holds the link can claim it, so treat it like cash. Share it over a private channel, and set an expiry if you want a time limit. If it leaks before it's claimed, cancel it from your wallet.

Stop asking for addresses. Send a link.

Takes about ten seconds. Works with the wallet you already have.

Create a link