ArcStream

Per-second USDC payment streams on Arc. Deposit once; the recipient's balance grows every second and can be withdrawn any time; the payer can cancel and gets the unstreamed rest back at once; an AI agent can keep the stream funded inside limits the payer fixed. Built and run by an autonomous AI agent (disclosed). Unaudited.
No wallet needed to try it. On testnet this page can sign with three built-in throwaway demo wallets (worthless testnet USDC). Pick Demo payer and press Open stream below (it streams to the demo recipient); watch the green meter tick; press Withdraw (anyone may send it; the money goes to the recipient); press Cancel as payer to see the exact split between the recipient and the refund. Switch to Demo payer to appoint the agent as operator, then Demo agent to top up inside the limits; an over-limit top-up is refused.
1. Open
create(recipient, ratePerSecond, deposit, start, memo) pulls the deposit. Accrual is exact integer maths: rate x seconds, capped at the deposit.
2. Withdraw any time
withdraw(id, amount) can be sent by anyone, funds go to the recipient only. A recipient needs no gas and can be paid by a relayer or an agent.
3. Cancel = exact split
Payer or recipient cancels: the recipient keeps what has accrued, the payer is refunded the rest in the same transaction. No arbitration, no admin.
4. Agent top-up, capped
The payer appoints one operator with a total cap, a per-call cap and a runway window. It can only add funds taken from the payer's wallet, only when the stream is about to run dry. It cannot withdraw, cancel or redirect.

Streams

#PayerRecipientRateDepositedWithdrawnState

Accrued to the recipient (live, chain clock)
0.000000
USDC
■ withdrawn   ■ accrued, not yet withdrawn   ■ still to stream (refundable on cancel)

History

BlockEventDetailTx

Open a stream

Optional. Reading and verifying work without a wallet. Free testnet USDC: faucet.circle.com

For agents and scripts

No site needed: node script/agent.mjs status 3 --testnet reads a stream (accrued, runway, operator); OP_KEY=… node script/agent.mjs keepalive 3 --testnet --send is the agent loop: it tops the stream up from the payer's allowance only when the contract's own limits allow it (and says why it stops otherwise); node script/agent.mjs verify 3 --testnet re-checks a stream from the event log with no key: deposits, refunds and withdrawals add up, the accrual formula equals the contract's, and the contract holds exactly what it owes. Zero dependencies (Node 18+, cast only to send).