Docs

How Lark pays

Lark pays people in dollars (USDG) — or in a stock they choose — from the tokenized stocks in your wallet on Robinhood Chain. It is a web page that builds one transaction for your wallet to sign. It deploys no contract, holds nothing, and charges no fee: the only contract you call is Uniswap's SwapRouter02, which was already on the chain.

Every number on the page comes from one module, js/pay.js, and the tests run that same file against the live chain. What is tested is what is signed.

The transaction

A payment is one call to SwapRouter02.multicall(deadline, steps). The steps, in order:

  1. selfPermit(token, value, deadline, v, r, s) — one for each token you pay from. Robinhood's stock tokens and USDG accept EIP-2612 permits (their domain is name, version 1, chain 4663; Lark checks it against each token's own DOMAIN_SEPARATOR before asking you to sign). The permit lets the router take at most value, and expires with the transaction.
  2. For each person, in turn:
    • pull(USDG, x) for the part paid from your own dollars;
    • exactOutputSingle(stock → USDG) for each stock slice: sell exactly enough to raise y dollars, spending at most its quote plus 0.5%;
    • sweepToken(USDG, amount, them) to hand over exactly their amount — or exactInputSingle(USDG → stock) with amountIn = 0 (the router's own balance), to buy the stock they asked for straight into their wallet, with a minimum of its quote less 0.5%.

Each person's dollars are gathered and handed over before the next person's are, so the router holds nothing between people and nothing afterwards. A single sale paying one person in dollars is sent straight to them. A single person paid in dollars from dollars is a plain USDG.transfer, with no router and no signature.

If any sale would cost more than its limit, any purchase would return less than its minimum, a permit is short, or fifteen minutes have passed, the router reverts and nothing moves.

Where the money comes from

With use my dollars first on, the USDG in your wallet pays first. The rest is split across the stocks you tick in proportion to what each is worth at its pool's price, so paying someone leaves the mix of your portfolio as it was. The arithmetic is in integers: the pieces add up to the amount owed to the unit (a millionth of a dollar), and a rounding remainder goes to the largest holding.

At most 97% of any holding's value is sold, which leaves room for the price to move between the quote and the transaction. A slice under $1 is not worth its gas: it is dropped and the others re-spread. If what you hold cannot cover the payment, the page says by exactly how much.

A stock that pays several people is sold in several slices, one after another. Each slice is quoted as the difference between two cumulative quotes, so the second slice pays the price the first one left behind. The fee tier (0.05%, 0.3% or 1%) is chosen once per stock, as the cheapest for the whole amount.

Limits and guards

  • Slippage. Each sale may spend at most its quote plus 0.5%; each purchase must return at least its quote less 0.5%. The permits cover exactly those limits, so after a payment the router is left approved for at most the unused 0.5%.
  • Robinhood's price. Robinhood publishes a price feed for 26 of the 42 stocks. Every sale and purchase is priced against it before you sign. More than 3% worse than a fresh feed is refused, naming the stock. When the market is shut the feed stops, and after 20 hours a difference only warns.
  • Deadline. The transaction and every permit expire fifteen minutes after they are built, measured by the chain's own clock.
  • Size. Up to 8 people and 28 steps in one transaction (a Robinhood Chain block holds 32M gas; a swap takes up to ~250k).
  • Who you can pay. The page refuses a token or a Uniswap contract as a recipient: money sent there is lost.

Requests and receipts

A request is a link: /pay?to=0x…&usd=42.50&get=NVDA&note=Dinner. It holds the address, the amount (dollars and cents), what to be paid in and a note of up to 80 characters. Nothing is stored anywhere; whoever has the link can read those four things. Opening it fixes the address and the amount; the payer chooses what to pay from.

A receipt is /receipt?tx=0x…. It fetches the transaction and its logs from Robinhood Chain and shows who received what — read from the Transfer logs to the recipients the calldata names — and what left the payer's wallet.

How it is tested

The property suite (tools/test.mjs) runs the page's own js/pay.js against live Robinhood Chain state with eth_simulateV1: test wallets are funded by state override and hold real keys, so every permit is a real signature the token verifies on chain. Nothing is broadcast. Expected values are computed in the test, from balances, pool prices and Transfer logs — never by asking the module under test.

The last run: 13/13 properties and 65,729 checks passed against live state at block 75,855,589 (29 Sep 2026).

PropertyWhat the last run showedChecks
exact$123.45 arrived to the unit, paid by 2 permits and one transaction; the router kept nothing59
mix$250 from four stocks; the heaviest weight moved 0.003 points3
cash$25 of cash then $35.02 of NVDA paid $60.00 exactly4
stock$40.00 bought 0.113143 raw TSLA straight into their wallet8
manythree people ($45.67, $12.34, $60 as AAPL) in one transaction, 858,172 gas5
permitevery permit is spent to within its 0.5% slippage room; an unpicked stock is never touched7
direct$99.99 moved in one ERC-20 transfer4
limita seller dumping a quarter of RBLX's pool first made the payment revert ("STF"); nothing moved7
latefifteen minutes and one second later it reverts (Transaction too old)3
guardrefused at 6% from a fresh feed, warned when the feed is 3 days old, silent at 2%6
shortshort by exactly $1.00 at one dollar over capacity; covered at capacity2
split3,000 random wallets and payments: every split exact to the unit65,615
linkslinks round-trip; bad addresses, sub-cent and negative amounts are refused; a mis-domained permit is refused6

Then a sabotage sweep plants 18 bugs, one at a time, in a copy of js/pay.js — a sale that may spend without limit, a permit for the wrong amount, pieces that do not add up, a price read upside down — and requires the property named for each one to fail. 18/18 were caught.

The browser run: 7/7 journeys (31 checks) clicked through the real pages in Chrome with a test wallet, against a private copy of the live chain (29 Sep 2026).

Addresses

Every contract Lark talks to was already on Robinhood Chain (chain id 4663), written and audited by its own authors.

Uniswap SwapRouter020xCaf681a66D020601342297493863E78C959E5cb2
Uniswap QuoterV20x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7
Uniswap v3 factory0x1f7d7550B1b028f7571E69A784071F0205FD2EfA
USDG (Global Dollar, Paxos)0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
Multicall30xcA11bde05977b3631167028862bE2a173976CA11

Stocks

Every Robinhood stock token Lark can pay from or pay in, deepest pool first: each has a USDG pool on Uniswap v3. From a scan at block 75,808,765, 29 Sep 2026. Prices are the deepest pool's; the page re-reads them live.

StockPricePool feeFeedToken
NVDA NVIDIA$229.880.05%yes0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC
SPCX SpaceX$148.860.05%yes0x4a0E65A3EcceC6dBe60AE065F2e7bb85Fae35eEa
USO United States Oil Fund$145.530.30%yes0xa30FA36Db767ad9eD3f7a60fC79526fB4d56D344
CRCL Circle Internet Group$84.280.30%yes0xdF0992E440dD0be65BD8439b609d6D4366bf1CB5
MU Micron Technology$1068.490.30%yes0xfF080c8ce2E5feadaCa0Da81314Ae59D232d4afD
QQQ Invesco QQQ$736.400.05%yes0xD5f3879160bc7c32ebb4dC785F8a4F505888de68
GOOGL Alphabet$339.090.05%yes0x2e0847E8910a9732eB3fb1bb4b70a580ADAD4FE3
COST Costco$920.110.30%—0x4EA005168D7F09a7A0Ba9D1DEf21a479950E44C2
MSFT Microsoft$509.240.30%yes0xe93237C50D904957Cf27E7B1133b510C669c2e74
AMC AMC Entertainment$3.040.30%—0x05a3d1Cd21d0C88145E82600E62e7E496e0F222B
MSTR Strategy$153.991.00%yes0xec262a75e413fAfD0dF80480274532C79D42da09
HIMS Hims & Hers Health$28.780.30%—0xCceE82fE024c36fA15E1005edE3E9e4787e23D09
Show all 42 stocks
AMZN Amazon$246.380.30%yes0x12f190a9F9d7D37a250758b26824B97CE941bF54
GLD SPDR Gold Trust$380.820.05%yes0xC9a981FEE1F9DEc688bb123ccDeCc63D0deBFC4e
DJT Trump Media & Technology$9.201.00%—0x1D11f0496982706C5e14A514D4E79F2e6BdE4516
TSLA Tesla$353.660.30%yes0x322F0929c4625eD5bAd873c95208D54E1c003b2d
SPY SPDR S&P 500 ETF$763.220.05%yes0x117cc2133c37B721F49dE2A7a74833232B3B4C0C
LLY Eli Lilly$1177.530.05%—0x8005d266423c7ea827372c9c864491e5786600ea
SGOV iShares 0–3 Month Treasury$100.620.05%yes0x92FD66527192E3e61d4DDd13322Aa222DE86F9B5
DELL Dell$544.661.00%yes0x941AE714EC6D8130c7B75d67160Ca08f1e7d11Dd
AVGO Broadcom$357.880.30%—0x156E175DD063a8cE274C50654eF40e0032b3fbcF
AMD AMD$613.670.30%yes0x86923f96303D656E4aa86D9d42D1e57ad2023fdC
AAPL Apple$331.190.05%yes0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9
INTC Intel$116.310.30%yes0xc72b96e0E48ecd4DC75E1e45396e26300BC39681
META Meta Platforms$719.810.30%yes0xc0D6457C16Cc70d6790Dd43521C899C87ce02f35
RDDT Reddit$143.981.00%—0x05b37Fb53A299a1b874A619e1c4C404D52C36F4C
TSM TSMC$453.281.00%yes0x58FfE4a942d3885bAa22D7520691F611EF09e7AA
NET Cloudflare$352.050.30%—0x116F00968269B7bfbaD4109cE591d6E74c0601d4
QUBT Quantum Computing$8.600.30%—0x59818904ab4cE163b3cE4FfB64f2D6Ca02c434B4
MRNA Moderna$199.120.30%—0x43B07D15cE533bEc5476d70C22a78a1B2B662155
PLTR Palantir$185.890.30%yes0x894E1EC2D74FFE5AEF8Dc8A9e84686acCB964F2A
GME GameStop$23.370.05%yes0x1b0E319c6A659F002271B69dB8A7df2F911c153E
SLV iShares Silver Trust$55.040.30%yes0x411eFb0E7f985935DAec3D4C3ebaEa0d0AD7D89f
NFLX Netflix$70.600.30%—0xE0444EF8BF4eD74f74FD73686e2ddF4C1c5591E8
SNDK Sandisk$1720.131.00%yes0xB90A19fF0Af67f7779afF50A882A9CfF42446400
ASML ASML Holding$1819.741.00%yes0x47F93d52cBeC7C6D2CfC080e154002370a60dAEA
TTWO Take-Two Interactive$202.430.30%—0x5e81213613b6B86EaB4c6c50d718d34359459786
RBLX Roblox$41.750.30%—0xF0C4BF4C582cb3836e98394b1d4e7B7281101bE8
JNJ Johnson & Johnson$266.600.30%—0x03DfbBE0AC4E7bCDaFd08eD41A400326B77D8c80
USAR USA Rare Earth$14.080.30%yes0xd917B029C761D264c6A312BBbcDA868658eF86a6
RIVN Rivian Automotive$15.070.30%—0xB1BF26c1D20ff267A4f93550d1E0d06ac40a114B
NU Nu$12.410.30%—0x408c14038a04f7bD235329E26d2bf569ee20e250

Risks

  • Paying from a stock is selling it. The price can be worse than you expect in a thin pool; the review shows the cost of selling before you sign.
  • A payment to the wrong address cannot be undone. Check it; the page shows an avatar drawn from the address to make a typo easier to spot.
  • Robinhood can pause a stock token, and a paused token cannot be sold. The transaction would then revert and nothing would move.
  • Lark is not audited. It deploys nothing, but the page that builds your transaction is new code. Read how it is tested.