Live on Arc mainnet. Every number here is read from the chain.
Scalehouse
Documentation

How Scalehouse works

Everything you need to run a house. Owners, clerks, witnesses and the people being paid each have one short job.

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.

RoleWhoWhat they do
OwnerThe businessOpens the house, posts prices, sets limits, approves a budget, reviews frozen tickets
ClerkWhoever receives goods or records workCuts tickets
WitnessA second personCounts again and confirms (free to sign)
AgentScalehouse's AIDecides when and whether to pay, and explains why
ContractScaleTicket on ArcChecks the agent against the ticket, then pays or freezes

For owners

  1. 1
    Connect the wallet you pay from
    Any browser wallet that supports Arc: MetaMask, OKX Wallet, Rabby. Your money stays in this wallet.
  2. 2
    Open a house
    Name 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.
  3. 3
    Appoint the agent and approve a budget
    The 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.
  4. 4
    Post prices
    One price per thing you pay for: a bag, a kilo, an hour, a milestone. Tickets lock the price at the moment they're cut.
  5. 5
    Add your team
    Give clerks and witnesses their roles. Nobody can witness a ticket they cut or are paid by.
  6. 6
    Review what freezes
    A 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.

  1. 1
    Pick the posted price
    What was delivered.
  2. 2
    Enter the quantity you counted
    Decimals are fine: 2.5 kg, 1.25 hours.
  3. 3
    Paste the payee's wallet
    Check it twice. It is locked onto the ticket and nobody can change it later.
  4. 4
    Add the reference
    An invoice, delivery note or job number. The same reference from the same payee can only be ticketed once.
  5. 5
    Optionally add a note and a photo
    Photos 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.

ToolWhat it does
get_positionBalance, approved budget, paid today, daily limit, spendable now
list_payable_ticketsConfirmed, waiting and frozen tickets with their amounts
get_counterpartyA wallet's history: paid, frozen, witness shortfalls, current cap
screen_counterpartyCircle's USDC blocklist on Arc, plus a sanctions list when configured
release_ticketAsks the contract to pay, naming the payee and amount it expects
defer_ticketRecords a decision not to pay yet, and why
flag_ticketRecords that a ticket needs the owner
lower_payee_capLowers 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

ReasonEffectMeaning
AlreadyPaidRefusedThe ticket already paid. It pays once.
NotConfirmedRefusedNo witness yet.
OverDailyCapRefusedToday's limit is used up; it can pay tomorrow.
OverPayeeCapRefusedAbove this counterparty's limit.
InsufficientFloatRefusedThe paying wallet's balance or budget is short.
PausedRefusedThe house or the protocol is paused.
PayeeMismatchFrozenThe agent named a different wallet than the ticket.
AmountMismatchFrozenThe agent named a different amount than the rule.
QuantityMismatchFrozenThe 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.