Abeyo

Stablecoin holds for every counter that bills at the end.

Hotels, rental desks, chargers, pumps, bars, grocery stores and the APIs that agents pay all find out the total at the end. With Abeyo the customer approves a hold on Tempo with one passkey tap. The merchant captures what was used, in parts if needed, and the rest goes back.

The customer pays no network fee. Nobody, Abeyo included, can move held money any other way.

Harbor Hotel (example)

Reference EXAMPLE-RM-TMJJB7
Customer copy0x5875…06cc
Held for Harbor Hotel (example)380.00eUSD
Valid until6 Nov, 13:59 UTC, in 30 days
Merchant copy0x4976…679A
Authorized380.00eUSD
  • Imprinted, 7 Oct, 14:09380.00
  • Captured so far0.00
Hold no. 0xc7c32a03…4de475Opened 7 Oct, 14:09 UTC

Live from the vault on Tempo's Moderato testnet. The yellow copy is money still held. Each stub is a capture. A stamp closes the slip.

Eight counters, one slip

Each counter learns its total at a different moment: at checkout, at unplug, per batch of API calls, at closing time. The vault's rules are the same for all of them. Run a story to see what the customer and the merchant each press, or take the controls and try to break the rules.

CounterThe hold coversThe merchant capturesValid for at mostSimulator
HotelHarbor HotelTwo nights and incidentalsThe bill at checkout, once30 days, lodging
Car rentalRidgeway Car RentalThe rental, fuel and tollsTolls as they post, then the bill at return30 days, vehicle rental
EV chargingQuay Street ChargingA ceiling for the sessionThe energy delivered, at unplug7 days, general
Agent APISaltmarsh Inference APIAn agent's budget for one jobMetered usage, one stub per batch7 days, general
Bar tabThe Long RoomA ceiling for the tabThe tab and the tip, at close7 days, general
EquipmentLens and Tripod RentalsThe kit's value while it is outNothing, if it comes back whole10 days, equipment
FuelNorthgate FuelA ceiling for the pumpThe fuel pumped7 days, general
DeliveryLarder Grocery DeliveryThe basket estimateThe basket after substitutions, or nothing7 days, general

Every row has an example merchant registered on the Moderato vault: 8 merchants in all.

Simulated with example merchants. Every step runs through the same rules as the vault, from @abeyo/sdk.

GuestPasskey on a phone

Harbor Hotel asks for a hold

380.00eUSD

Valid until
14 Oct, 15:00 UTC
Network fee
Paid by the merchant's sponsor

Harbor Hotel

Reference RM-214
Customer copyNot held yet
To be held for Harbor Hotel380.00eUSD
Merchant copy

Terms signed with the merchant's own key. Nothing is held until the guest approves.

Simulated slip. The same rules as the vault; nothing here is on chain.
Merchant deskHarbor Hotel

Signs the terms with its own key: 380.00 eUSD, valid until 14 Oct, 15:00 UTC, paid out only to its own address.

Waiting for the guest to approve.

Step 0 of 4
  1. 17 Oct, 15:00Guestapprove + authorize, one sponsored transaction
  2. 28 Oct, 20:00MerchantNone. A request; nothing moves until the payer approves
  3. 38 Oct, 20:03Guestapprove + increment, one transaction
  4. 410 Oct, 11:00Merchantcapture, final; the rest returns in it

Every slip on this vault

Read from the chain on each visit, newest first. Held money stays yellow until a capture or a release settles it. A dashed stamp means someone still has to act.

Merchant and referenceHeldCapturedReturnedValid until (UTC)State
Saltmarsh Inference API (example)MCP-JOB0.003.1246.888 Oct, 14:41Captured, rest returned
Saltmarsh Inference API (example)MCP-JOB0.003.1246.888 Oct, 14:40Captured, rest returned
Saltmarsh Inference API (example)MCP-JOB0.003.1246.888 Oct, 14:39Captured, rest returned
Saltmarsh Inference API (example)MCP-JOB20.00 eUSD0.000.008 Oct, 14:38Held
Lens and Tripod Rentals (example)EXAMPLE-KIT-TMJJBK1,200.00 eUSD0.000.0017 Oct, 13:59Held
The Long Room (example)EXAMPLE-TAB-TMJJBJ100.00 eUSD0.000.0014 Oct, 13:59Held
Saltmarsh Inference API (example)EXAMPLE-JOB-TMJJBF42.08 eUSD7.920.0014 Oct, 13:59Held
Quay Street Charging (example)EXAMPLE-BAY-TMJJBE60.00 eUSD0.000.0014 Oct, 13:59Held
Ridgeway Car Rental (example)EXAMPLE-CAR-TMJJBB481.60 eUSD18.400.006 Nov, 13:59Held
Harbor Hotel (example)EXAMPLE-RM-TMJJB7380.00 eUSD140.000.006 Nov, 13:59Held
Show the other 33 slips
Merchant and referenceHeldCapturedReturnedValid until (UTC)State
Harbor Hotel (example)PROOF-DESK-197.50 eUSD52.500.008 Oct, 13:55Held
Quay Street Charging (example)PROOF-BAY-6151G0.000.0060.007 Oct, 13:52Expired, returned
Larder Grocery Delivery (example)PROOF-ORDER-6151G0.000.0085.009 Oct, 13:51Void
Saltmarsh Inference API (example)PROOF-JOB-6151G0.0010.1839.828 Oct, 13:51Captured, rest returned
Harbor Hotel (example)PROOF-RM-6151G0.00120.00220.0010 Oct, 13:51Captured, rest returned
Quay Street Charging (example)PROOF-BAY-5XP500.000.0060.007 Oct, 13:49Expired, returned
Larder Grocery Delivery (example)PROOF-ORDER-5XP500.000.0085.009 Oct, 13:48Void
Saltmarsh Inference API (example)PROOF-JOB-5XP500.0010.1839.828 Oct, 13:48Captured, rest returned
Harbor Hotel (example)PROOF-RM-5XP500.00120.00220.0010 Oct, 13:48Captured, rest returned
Quay Street Charging (example)PROOF-BAY-5UH350.000.0060.007 Oct, 13:47Expired, returned
Larder Grocery Delivery (example)PROOF-ORDER-5UH350.000.0085.009 Oct, 13:46Void
Saltmarsh Inference API (example)PROOF-JOB-5UH350.0010.1839.828 Oct, 13:45Captured, rest returned
Harbor Hotel (example)PROOF-RM-5UH350.00120.00220.0010 Oct, 13:45Captured, rest returned
Harbor Hotel (example)EXAMPLE-RM0080.000.000.0090.00 waiting8 Oct, 20:41Waiting to be collected
Ridgeway Car Rental (example)EXAMPLE-CAR-04481.60 eUSD18.400.004 Nov, 20:25Held
Larder Grocery Delivery (example)EXAMPLE-ORDER-020.000.0085.008 Oct, 20:25Void
Larder Grocery Delivery (example)EXAMPLE-ORDER-010.0079.125.888 Oct, 20:25Captured, rest returned
Northgate Fuel (example)EXAMPLE-PUMP-010.0063.2086.807 Oct, 20:25Captured, rest returned
Lens and Tripod Rentals (example)EXAMPLE-KIT-021,200.00 eUSD0.000.0016 Oct, 20:15Held
Lens and Tripod Rentals (example)EXAMPLE-KIT-010.00135.00465.0016 Oct, 20:15Captured, rest returned
The Long Room (example)EXAMPLE-TAB-02100.00 eUSD0.000.0013 Oct, 20:14Held
The Long Room (example)EXAMPLE-TAB-010.0086.4013.607 Oct, 20:24Captured, rest returned
Saltmarsh Inference API (example)EXAMPLE-JOB-0129.12 eUSD20.880.0013 Oct, 20:14Held
Quay Street Charging (example)EXAMPLE-BAY-0247.60 eUSD12.400.0013 Oct, 20:14Held
Quay Street Charging (example)EXAMPLE-BAY-010.0020.0739.937 Oct, 20:24Captured, rest returned
Harbor Hotel (example)EXAMPLE-RM0070.000.0090.008 Oct, 18:41Void
Ridgeway Car Rental (example)EXAMPLE-CAR-17250.00 eUSD0.000.0015 Oct, 18:41Held
Harbor Hotel (example)EXAMPLE-RM4020.000.00420.009 Oct, 18:41Void
Ridgeway Car Rental (example)EXAMPLE-CAR-910.000.00150.0010 Oct, 18:41Void
Harbor Hotel (example)EXAMPLE-RM120380.00 eUSD120.000.0011 Oct, 18:41Held
Harbor Hotel (example)EXAMPLE-RM3110.00120.00220.009 Oct, 18:41Captured, rest returned
Ridgeway Car Rental (example)EXAMPLE-CAR-88180.00 eUSD0.000.006 Oct, 18:41Past expiry
Harbor Hotel (example)EXAMPLE-RM2040.000.00300.006 Oct, 18:41Expired, returned

What the slip allows

The rules are code in the vault. A merchant cannot capture past them and Abeyo cannot change them.

RuleLimit
Valid untilLodging and vehicle rental 30 days, equipment 10 days, everything else 7 days. Set by the merchant's category when the hold is opened, never extended.
AdditionsUp to 10, each approved and funded by the customer in one tap, and only before the first capture. Never above the ceiling the customer signed, and never above the original amount plus the larger of 500 or five times the original.
CapturesUp to 50 partial captures and one final capture, only before the valid-until date, only to the merchant's registered payout address.
ReleaseA final capture or a void returns the rest at once. After the valid-until date anyone can return what is left to the customer.
Fee0.20% of each capture on this deployment, kept in the vault and swept separately. A capture never waits on it.

Who can move what

The vault has no admin key, no upgrade and no pause.

WhoCanCannot
CustomerOpen a hold, approve an addition, collect a refund that waitedCapture, or touch anyone else's hold
MerchantCapture to its payout address, void, ask for an additionCapture more than is held, change the payout address, extend the date
AnyoneReturn an expired hold to its customerRelease a hold early or send money anywhere else
AbeyoPay network fees for customers, sweep its fee, add merchants for new holdsMove or freeze held money, or block a capture, void or release

Why Tempo does not have this yet

Checked on 6 Oct 2026. Each line links to where it can be checked again.

  • Tempo has no authorize, capture or increment primitive. An MPP intent for authorize and capture, with partial captures and incremental authorization, was drafted in the open and closed without merging on 29 Jul 2026: mpp-specs pull request 226.
  • Stripe, which accepts stablecoin payments on Tempo, lists manual capture as not supported for them: Stripe's stablecoin payments docs.
  • The Base and Coinbase contracts that do offer authorize and capture have no code at their published addresses on Tempo: the Commerce Payments repository lists them.
  • Agents need ceilings. An open MPP proposal describes an agent paying 450 dollars for a hotel room when its user authorized up to 100: mpp-specs issue 359, opened 16 Sep 2026. A hold prints its ceiling on the slip, and going past it takes a new approval from the payer, funded in the same transaction.

Three calls to hold, capture and return

@abeyo/sdk builds the signed terms and the calls. The same package carries the rules as a pure model, which is what the simulator above runs, so a merchant can test a counter's flow before it sends anything.

import { authorizeCalls, captureCall, holdTypedData } from "@abeyo/sdk";

// The merchant's server signs the terms of the hold with its own key.
const signature = await merchant.signTypedData(holdTypedData(vault, chainId, terms));

// The customer approves with a passkey: approve + authorize, one sponsored Tempo transaction.
await customer.sendTransaction({ calls: authorizeCalls(vault, terms, signature), feePayer: true });

// The charger captures what was used and closes the slip. The rest returns in the same transaction.
await merchant.sendTransaction({ calls: [captureCall(vault, terms, 20_070_000n, { final: true })] });