Overview
A house is a business that pays people through Scalehouse. Each payment is a ticket: a record of goods delivered or work done, the posted price, and the wallet that gets paid. A ticket pays once, only after a second person has confirmed the quantity, and only if the agent's request matches the ticket exactly.
| Role | Who | What they do |
|---|---|---|
| Owner | The business | Opens the house, posts prices, sets limits, approves a budget, reviews frozen tickets |
| Clerk | Whoever receives goods or records work | Cuts tickets |
| Witness | A second person | Counts again and confirms (free to sign) |
| Agent | Scalehouse's AI | Decides when and whether to pay, and explains why |
| Contract | ScaleTicket on Arc | Checks the agent against the ticket, then pays or freezes |
For owners
- 1Connect the wallet you pay fromAny browser wallet that supports Arc: MetaMask, OKX Wallet, Rabby. Your money stays in this wallet.
- 2Open a houseName it, choose USDC or EURC, and set three limits: the most one ticket can pay, the most paid per day, and how far a witness's count may differ before a ticket freezes.
- 3Appoint the agent and approve a budgetThe agent can only call the contract. The budget is a token approval: the total Scalehouse may move from your wallet. Raise, lower or revoke it any time.
- 4Post pricesOne price per thing you pay for: a bag, a kilo, an hour, a milestone. Tickets lock the price at the moment they're cut.
- 5Add your teamGive clerks and witnesses their roles. Nobody can witness a ticket they cut or are paid by.
- 6Review what freezesA frozen ticket waits for you. Reopen it for a fresh count, or void it.
For clerks
Cut a ticket when goods arrive or work is delivered. From your house page, choose Cut a ticket.
- 1Pick the posted priceWhat was delivered.
- 2Enter the quantity you countedDecimals are fine: 2.5 kg, 1.25 hours.
- 3Paste the payee's walletCheck it twice. It is locked onto the ticket and nobody can change it later.
- 4Add the referenceAn invoice, delivery note or job number. The same reference from the same payee can only be ticketed once.
- 5Optionally add a note and a photoPhotos are public on the board; leave out faces and personal details.
For witnesses
Open the ticket, count for yourself, and enter what youcounted. Signing is free: your wallet signs a message and Scalehouse submits it. If your count is within the house's tolerance, the ticket is confirmed at the lower of the two counts. If not, it freezes so the owner can look.
For people being paid
You need a wallet address on Arc. The money arrives directly from the business's wallet, usually seconds after your ticket is confirmed and the agent releases it. Every ticket has a public page you can share as a receipt.
The agent
The agent runs whenever a ticket is confirmed, once a day on a schedule, and whenever an owner asks. It reads the house's position, lists payable tickets, screens each payee, reads a counterparty's history when something stands out, and then decides what to pay first.
| Tool | What it does |
|---|---|
| get_position | Balance, approved budget, paid today, daily limit, spendable now |
| list_payable_tickets | Confirmed, waiting and frozen tickets with their amounts |
| get_counterparty | A wallet's history: paid, frozen, witness shortfalls, current cap |
| screen_counterparty | Circle's USDC blocklist on Arc, plus a sanctions list when configured |
| release_ticket | Asks the contract to pay, naming the payee and amount it expects |
| defer_ticket | Records a decision not to pay yet, and why |
| flag_ticket | Records that a ticket needs the owner |
| lower_payee_cap | Lowers one counterparty's per-ticket limit (never raises it) |
Every action stores the agent's full reasoning, including the balance it saw, and puts a hash of that reasoning on-chain. Ticket pages show the reasoning and check the hash. Code-level guards sit on top of the contract: no payment to a payee not screened in the same run, and a screening outage means do not pay.
The contract
ScaleTicket is one small, non-upgradeable contract. View it on the explorer. The full specification is in docs/SPEC.md.
cut(houseId, payee, rateId, quantity, evidenceHash) // clerk confirm(ticketId, observedQuantity) // witness confirmBySig(ticketId, observedQuantity, witness, deadline, sig) release(ticketId, payee, amount, rationaleHash) // agent → pays confirmedQuantity × unitPrice / 1000, once → or emits ReleaseRefused / TicketFrozen with a reason
Quantities use three decimals (1500 means 1.5). Amounts use the token's six decimals.
Refusals and freezes
| Reason | Effect | Meaning |
|---|---|---|
| AlreadyPaid | Refused | The ticket already paid. It pays once. |
| NotConfirmed | Refused | No witness yet. |
| OverDailyCap | Refused | Today's limit is used up; it can pay tomorrow. |
| OverPayeeCap | Refused | Above this counterparty's limit. |
| InsufficientFloat | Refused | The paying wallet's balance or budget is short. |
| Paused | Refused | The house or the protocol is paused. |
| PayeeMismatch | Frozen | The agent named a different wallet than the ticket. |
| AmountMismatch | Frozen | The agent named a different amount than the rule. |
| QuantityMismatch | Frozen | The witness's count was too far from the claim. |
Refusals leave a ticket payable later. Freezes wait for the owner. Both are public and permanent.
Custody and safety
Scalehouse never holds money. The contract has no balance: a payment moves from the owner's wallet to the payee's in one transaction. The protocol admin can pause releases in an emergency and can do nothing else. House ownership moves in two steps, so a house can never be pointed at a wallet that didn't agree.
Costs
Network fees on Arc are paid in USDC and are around a cent per transaction. Scalehouse charges nothing today. A house can set an optional levy (up to 10%) that it sends to a wallet of its choice, for example a cooperative fund.
Questions? See the FAQ.