Try Doorstep with real USDC.
Pretend you run a savings app on Arc. Your customers keep their USDC on exchanges like Kraken or KuCoin. This demo shows how they can save straight from there, with no wallet setup and no app to connect.
Why it matters
- Withdraw USDC from the exchange to a personal wallet
- Add the Arc network to that wallet
- Open the savings app and connect the wallet
- Approve the vault to take USDC
- Press Deposit and confirm again
- Six steps, two wallet confirmations, and a wallet the customer may not have
- The app shows the customer their savings address once
- They withdraw from the exchange straight to it. It's in their savings a few seconds later
Your savings address
This is Arc mainnet, so it uses real USDC. Start with a few cents; you can withdraw everything at the end.
Connect your wallet
This is the account your savings belong to.
Why connect a wallet?
Only so the demo knows whose savings these are, and so you can withdraw later. In a real app this would be your account in the app. The payments themselves can come from anywhere: another wallet, an exchange, a friend.
Get your savings address
One confirmation in your wallet, under $0.01. You only do this once: it's the same address every time.
What is this address?
It's calculated from a set of instructions, so it can't be changed or redirected. Yours says:
- Deposit into
- The demo savings vault
- Credit
- Your wallet
- If it can't be delivered
- Back to your wallet
- Smallest delivery
- 0.01 USDC; less waits for more
- Delivery fee limit
- 0.01 USDC, taken from the payment
- Accepts until
- 31 December 2027
Registering publishes these instructions on Arc so delivery bots know to watch your address.
Send USDC to it
Use this wallet, or any wallet or exchange that sends USDC on the Arc network.
0.01 USDC or more is delivered. Less waits at the address until more arrives, or until you take it back.
Send from an exchange instead
- In Kraken, KuCoin or another exchange that supports Arc, choose Withdraw USDC.
- Pick Arc as the network. Not Ethereum, Base or any other.
- Paste your savings address, or scan the QR code.
- Send. It's delivered into your savings seconds after it arrives.
Only USDC on Arc can be delivered. Other tokens sent to this address can't be recovered.
Watch it arrive in your savings
- Sent
- At your address
- In your savings
Your balance in the vault updates here within seconds of each payment.
What if something goes wrong?
Under the minimum: it waits at your address. Press Take back what's waiting to get every cent back at once, with no fee. Otherwise it stays until more arrives, or is returned after the address's deadline.
Delivery bot offline: after 15 seconds a Deliver it now button appears. Your wallet pays the network fee and gets it straight back from the payment.
The vault refuses it: the money goes straight back to your wallet.
Withdraw whenever you like
The money is in the vault under your name. Take some or all of it back to your wallet.
Your payments
Every delivery and return for your savings address, read from Arc. Each has a receipt.
- Nothing yet. Payments appear here after they're delivered.
Accept payments into your contract from any wallet or exchange.
Give each payer a Doorstep address. When USDC lands, Doorstep calls your contract's deposit function with the amount and the person to credit. If the call fails or the deadline passes, the money goes back to the refund wallet.
Make a payment link
Answer these and you get a shareable pay page. Its address delivers into the contract you choose. Before showing it, this page checks its own maths against the Doorstep contract.
Do it from code
The SDK does the same inside your app. Your contract must take the deposit with transferFrom; Doorstep approves exactly the amount, then revokes. Any ERC-4626 vault works as it is.
npm install doorstep-arc viem
import { createDoorstep } from 'doorstep-arc';
const ds = createDoorstep(); // Arc mainnet
const intent = ds.depositIntent({
into: '0xYourVault', // has deposit(uint256 amount, address to)
beneficiary: customer, // who gets credited
refundTo: customer, // where it goes if it can't be delivered
minimum: '1', // USDC
expires: '30d',
reference: 'order-1042',
});
ds.depositAddress(intent); // show this, or a QR code
ds.describe(intent); // one paragraph your payer can read
ds.watch(intent, (e) => console.log(e.type)); // waiting, landed, bounced
Or use the hosted API: one HTTPS call returns an address and a ready pay page, and a signed webhook tells your server when the money lands. API reference. API keys on request through a GitHub issue.
Contracts on Arc mainnet
Pay with USDC on Arc
Send USDC to this address from any wallet, or withdraw to it from an exchange. Choose the Arc network.
Status
In the demo savings vault
- Belongs to
- Balance
- 0 USDC
What this address does
This page recalculates the address from these instructions itself. If anything were changed, the address would be different.
History
- Nothing yet.
More actions
Deliver now moves what's waiting into the contract (anyone can press it; the network fee comes out of the payment). Cancel and refund sends everything waiting back to the refund wallet, and works only from that wallet.