The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Idios listing page.
Private escrow and settlement for AI and other compute on Beam.
Pay for AI and compute work privately. Verifiable delivery, escrowed payment, on chain dispute resolution. No public record of amounts or parties.
Website · AI and compute use cases · Latest Release · Live Explorer
"Pay privately. Verify on chain. Dispute when needed."
An AI agent takes a job, privately subcontracts two parts to other agents, reviews and pays each, then settles with the client, all on Beam mainnet with amounts and parties hidden the whole way.
Public payment rails leak. Every contract, every payment, every counterparty becomes part of a permanent searchable record. For AI inference, model training, scientific compute, work that involves proprietary inputs, private data, or competitive operations, that visibility is a dealbreaker.
Idios solves the payment and settlement privacy problem. Payment is locked in private escrow on Beam. The worker locks collateral. Settlement happens on chain with full privacy of amounts and parties. Beam's MimbleWimble protocol hides amounts and identities at the base layer. Idios is what you get when you build escrow on that foundation.
ERC-8183 standardises the same starting primitive on Ethereum, a Job with escrowed payment for AI agent work. Idios is a separate and more complete protocol on Beam, not a port of it. It adds worker collateral and working dispute resolution, neither of which ERC-8183 has today, and it settles privately with amounts and parties hidden. Idios uses its own roles: Requester, Worker, and Arbitrator.
Two settlement modes, picked per contract at creation time.
For deterministic work where the correct output is a specific hash known in advance.
No arbitrator involvement. Settlement is mechanical once hashes match.
For non deterministic or open ended work where the requester needs to review the output.
Funds always flow to the right party. Arbitrators decide who wins a dispute and earn the dispute fee for the work of judging it, but never touch the payment or collateral.
Idios uses a two phase claim pattern. Authorisation steps (approve, claim_after_timeout, and dispute resolution by M of N voting) set the contract status but never move funds. The beneficiary then calls claim to actually receive the payout, signed by their own key. This works around a Beam BVM constraint where a single kernel cannot cleanly sign for one party while routing funds to another.
Live on Beam mainnet ✅
Verified resolution paths (real funds on mainnet during development; the job IDs below are from the v5 and v6 deployments that preceded the in place M of N upgrade):
| Path | Status flow | Job |
|---|---|---|
| Mode A hash match | Open → Active → Closed (single tx) | 22224 |
| Mode B approve | Open → Active → AwaitingApproval → Settled → Closed | 11112, 33335 |
| Mode B dispute, resolved to worker | Open → Active → AwaitingApproval → Disputed → ResolvedToBob | 11113 |
| Mode B dispute, resolved to requester | Open → Active → AwaitingApproval → Disputed → ResolvedToAlice | 11114 |
| Mode B timeout | Open → Active → AwaitingApproval → Settled → Closed | 11115 |
| Mode B arbitrator timeout void | Open → Active → AwaitingApproval → Disputed → Voided | 20002 |
| Role | Description |
|---|---|
user | Requester (Alice) or worker (Bob) interacting with the contract lifecycle. Workers can also hold a reputation bond (v2). |
arbitrator | Member of the M of N arbitrator registry. Registers with a stake (BEAM only, 10 BEAM minimum, admin co signed in v2), votes on disputed contracts, and claims a reward share |
manager | Deploy and view contract params (one shot, used during contract setup) |
treasury | Protocol treasury, set at deploy from the deploying wallet. Collects forfeited worker collateral from Active refunds, dispute fees from voided disputes, and slashed worker bonds (v2) via sweep and slash_sweep. |
user actions
| Action | Description |
|---|---|
create_a | Create a Mode A contract (Hash verified Settlement). Locks payment. |
create_b | Create a Mode B contract (Reviewed Settlement). Locks payment, sets review window and dispute fee. |
commit | Worker locks collateral, status moves to Active. |
submit_delivery | Worker submits result hash. In Mode A, pays out atomically if the hash matches and the contract moves straight to Closed. In Mode B, sets AwaitingApproval. |
approve | Requester approves Mode B delivery, status moves to Settled (no funds yet). |
dispute | Requester disputes Mode B delivery, locks dispute fee, status moves to Disputed. |
claim_after_timeout | Worker claims after review window expires (Mode B), status moves to Settled. |
claim | Beneficiary collects funds (payment + collateral) from a Settled, ResolvedToBob, or ResolvedToAlice contract. A Settled claim moves the status to Closed. A Resolved contract keeps its 6/7 status forever; the winner_paid flag in view_dispute records the payout. Mode A contracts pay out automatically and cannot be claimed. |
refund | Requester reclaims their payment from an expired contract (Open or Active). On the Active path the worker's collateral is forfeited to the treasury. Status moves to Refunded. |
void_dispute | Permissionless. Anyone can void a dispute the arbitrator never resolved, once arbitrator_timeout_blocks have passed since it was filed. Status moves to Voided. |
void_claim_requester | Requester reclaims their payment from a Voided contract. |
void_claim_node | Worker reclaims their collateral from a Voided contract. |
view_job | Read current job state. |
view_dispute | Read the M of N dispute record for a job: frozen N and threshold, tallies, resolution, and whether the worker's bond is encumbered by it (v2). |
worker_register | Lock a standing reputation bond (v2). BEAM only, any amount, keyed to the worker's contract pubkey. Slashable: losing an arbitrated dispute forfeits the whole bond to the treasury. |
worker_deregister | Begin withdrawing the reputation bond. Starts the reclaim cooldown. |
worker_reclaim | Recover the bond in full after the cooldown (= arbitrator_timeout_blocks). Halts while any open dispute encumbers the bond, and forever if the bond was slashed. |
view_worker_bond | Read a worker bond: stake, state, encumbrance count. Defaults to your own key; pass worker_pk to inspect another worker's bond. |
get_key | Returns the user's pubkey for this contract. (Worker shares this with requester before create.) |
arbitrator actions (M of N, v2 hardened registry)
| Action | Description |
|---|---|
register | Join the global arbitrator registry, posting a stake. v2 gates: BEAM only, 10 BEAM minimum, and the kernel carries the protocol admin's co signature (registration is curated until arbitrator slashing ships). A fully exited identity may register again. Optional arb_index (default 0) derives a distinct key per slot. |
vote | Vote on a Disputed contract. side 0 awards the requester (Alice), 1 awards the worker (Bob). Resolves when M matching votes land. |
claim_reward | After a dispute resolves, a consensus voter claims their share of the dispute fee (dispute_fee / M, remainder swept to treasury). |
deregister | Leave the registry. Starts the stake reclaim cooldown. |
reclaim | Recover the stake after the cooldown (equal to arbitrator_timeout_blocks). |
view_arb | Read the registry: current arbitrator count and your assigned index. |
get_mofn_key | Returns the arbitrator pubkey for a given arb_index. |
get_key | Returns the arbitrator's base pubkey for this contract. |
treasury actions
| Action | Description |
|---|---|
sweep | Collects forfeited funds: worker collateral from a Refunded contract that went through the Active path, or the dispute fee from a Voided contract. |
slash_sweep | Collects a slashed worker reputation bond (v2). Waits until every open dispute that encumbered the bond has terminated. |
get_key | Returns the treasury's pubkey for this contract. |
The simplest way to use Idios is through a Beam wallet's DApp Store. Two wallets carry it:
Then, on either:
Create a wallet, sync to mainnet, and fund it with a small amount of BEAM.
Two unrelated coins share the name and ticker. Idios runs on Beam Mimblewimble (privacy chain, beam.mw, mainnet since 2019), NOT Beam Network (an unrelated Avalanche gaming subnet). Make sure you buy the Mimblewimble one.
Beam Mimblewimble is on MEXC, Gate, and CoinEx. It is not on Binance, Coinbase, or Kraken. For a quick swap from ETH to BEAM without an exchange account, buybeam.my is a community run service. Two limits: the swap has a minimum of $1 of BEAM, smaller amounts send nothing to your wallet, and a maximum of $100 per swap (its liquidity pool is small; for larger buys use an exchange).
Install the Idios dapp from the wallet's DApp Store. On desktop you can also sideload the latest .dapp file from releases.
Open Idios from your installed apps.
The dapp opens to a landing page with three entry points:
Note on expiry block: Beam mainnet produces a block roughly every 60 seconds. Set
expiry_blockto at leastcurrent_block + 200to give the create transaction time to confirm before expiry. For real contracts,current_block + 1440(~24 hours) is more typical.
The Beam CLI wallet drives the contract directly. Useful for scripting, building integrations, or any role beyond what the dapp exposes.
idios_app.wasm (downloadable from this repo or built from source, see Build)eu-node01.mainnet.beam.mw:8100.All examples use the live Idios contract on Beam Mimblewimble mainnet (cid=41ef8be50f0d727a919b5f5e64f7e66d5ec04442bb4f536f664e38b765e4921f) and a public node. The contract is v2, upgraded in place via Upgradable3 (v6 to M of N v1 on 21 June 2026, then to v2 on 8 July 2026), so the cid is unchanged and every user side call (create, commit, submit_delivery, approve, dispute, claim, refund) is byte identical to before. Substitute your own node or cid as needed.
The worker's pubkey is contract specific (because the CID is part of the key derivation). Before any create, the worker runs:
The output is the worker's node_pk for that contract. Send this to the requester.
Payment is in groth (1 BEAM = 100,000,000 groth). For example payment=5000000 is 0.05 BEAM.
The contract already knows the job's mode from its state; view_job reports it as 65 for Mode A (ASCII 'A') or 66 for Mode B (ASCII 'B').
Disputes resolve by M of N voting. Arbitrators join a global registry with a standing stake, vote on disputed contracts, and claim a reward share once consensus is reached. The stake is never slashed; it is sybil resistance and skin in the game. In v2 registration is gated: the bond must be BEAM, at least 10 BEAM (stake=1000000000), and the registration kernel must also carry the protocol admin's signature, so joining the registry is curated until arbitrator slashing ships (contact below to register). The single pre v2 registration on production is grandfathered. arb_index is optional on every arbitrator call and defaults to 0; each index derives a distinct key, so one wallet can run several indices. Stake is in groth (1 BEAM = 100,000,000 groth).
Each arbitrator slot has a distinct pubkey, derived via MofnArbKeyID { tag 'N', ctx 1, m_Idx }. Run action=get_mofn_key with the relevant arb_index to read yours.
A worker can lock a standing, slashable bond against their contract pubkey, the same key that takes jobs. The bond is the on chain half of Idios reputation: it costs nothing to hold if you work honestly (reclaimed in full on exit), and losing an arbitrated dispute forfeits the whole bond to the treasury. Any amount, BEAM only; an off chain score reader surfaces the bond size, so dust bonds advertise themselves. Any requester can verify a listed bond directly on chain, no funds needed: see docs/verify_worker_bond.md.
Mechanics: filing a dispute on a job whose worker holds a live bond encumbers the bond, which blocks reclaim until that dispute terminates, so a worker cannot deregister mid dispute and dodge a pending ruling. A quorum resolution to the requester slashes the whole bond (at most once); a resolution to the worker, or a dispute that voids on arbitrator timeout, releases the encumbrance and leaves the bond untouched. A bond registered after a dispute was filed is not at risk from that dispute. The full lifecycle, bond, encumbrance, slash, blocked reclaim, and treasury sweep, is proven with real funds on mainnet.
Worker bond states: 0 registered, 1 deregistering, 2 gone, 3 slashed. A slashed bond can never be reclaimed; the treasury collects it with role=treasury,action=slash_sweep,worker_pk=<PUBKEY> once every encumbering dispute has terminated, after which the identity may bond again from scratch (the slash stays visible in job history).
After a contract reaches Settled, ResolvedToAlice, or ResolvedToBob, the beneficiary calls claim. The contract reads payment and collateral from the job state, so no payout amount is passed.
The beneficiary receives payment + collateral in all three cases. Under M of N arbitration the dispute fee does not go to the winner of a dispute; it is split across the consensus voters via claim_reward (see the arbitrator section), with any remainder swept to treasury.
For an expired contract, Open or Active, once expiry_block has passed. On the Active path the worker's collateral is forfeited to the treasury.
The contract and app shaders are written in C++ and built with the Beam Shader SDK.
Produces idios_contract.wasm (~11 KB) and idios_app.wasm (~28 KB).
Two phase claim. Authorisation steps (approve, claim_after_timeout, and dispute resolution by M of N voting) set the contract status. The beneficiary then calls Method_15 Claim signed with their own key to actually receive the funds. This works around a Beam BVM constraint where one kernel can't cleanly sign for one party while routing funds to a different party.
Arbitrator contact. To reach the arbitrator for dispute resolution, message @tappyoak on Telegram. Include the contract ID, your role, and a brief description of the dispute.
Talking to the other party. Every party in a contract already runs a Beam wallet, and the wallet has private messaging built in, so requester, worker, and arbitrator can coordinate directly with no outside app. Open it from the account menu at the top right, then Beam Messenger. To start a chat click New chat, paste the other party's Beam messaging address into the Address field, give them a name, and add them. Type your message and press ctrl+enter, command+enter on a Mac, or click Send on the right, to send. Your own messaging address, the one you hand out so others can reach you, is the My address shown in that same New chat dialog. Messages travel wallet to wallet over Beam's SBBS layer and are never posted on chain. Dispute resolution still goes through the arbitrator above, this is for coordinating with your counterparty.
M of N arbitration (live). The contract holds a global arbitrator registry, each slot backed by a standing stake. Filing a dispute freezes N (the registry size at filing time) and M (= N/2 + 1) into that dispute, and only arbitrators registered at or before the filing block may vote. The contract resolves when M matching votes land. Consensus voters split the dispute fee (dispute_fee / M each, remainder to treasury); arbitrators never receive the winning party's funds. The arbitrator stake is never slashed; since v2, registration is gated (BEAM only, 10 BEAM minimum, admin co signed) so the registry cannot be captured by dust bonds.
Today N is 1, a single registered arbitrator (contact below). Registering more independent arbitrators is the immediate next step; registration takes a 10 BEAM stake and is admin co signed (curated) until arbitrator slashing ships, so reach out via the contact above to join. The MCP server and agent daemon are on the v2 surface (M of N payout amounts, worker bond tools, dispute view); voting itself is deliberately a human CLI action, never an agent tool, so an agent can never rule on a dispute. The dapp still carries the older single arbitrator console; since the escrow flow is byte identical across the upgrade nothing there breaks, and the dapp arbitrator rework (register, vote, claim_reward via UI) is deferred until external arbitrators need it. The CLI path above works today.
Worker reputation bond (v2). A worker can lock a standing slashable bond keyed to their contract pubkey. Filing a dispute encumbers a live bond (blocking reclaim until the dispute terminates), a quorum resolution against the worker slashes the whole bond to the treasury, and a resolution for the worker or a void releases it untouched. The treasury sweep of a slashed bond waits until every dispute that encumbered it has terminated, so an old dispute can never touch a freshly re registered bond. This is the on chain half of Idios reputation; the off chain score reader is the next piece.
Contract specific keys. Every party derives their pubkey using Env::DerivePk with the contract ID as part of the input. A worker's pubkey on contract A is different from their pubkey on contract B. Always run get_key on the target contract before passing node_pk into create.
Refund semantics. refund returns the requester's payment from an expired contract once expiry_block has passed, and it works in two cases. If no worker ever committed (status Open), the payment is simply returned. If a worker committed but never delivered (status Active), the requester still gets only the payment back and the worker's collateral is forfeited to the treasury, not returned to either side. This penalises a worker who locked in and then went silent, and it stops a requester from setting a tight expiry to grab the worker's stake, since the stake always goes to the treasury and never to the requester. A job that has been delivered cannot be refunded, it must complete a resolution path.
Void semantics. If a dispute is filed and the arbitrator never resolves it within arbitrator_timeout_blocks, anyone can call void_dispute after that window to move the contract to Voided. The requester then reclaims their payment with void_claim_requester, the worker reclaims their collateral with void_claim_node, and the treasury sweeps the dispute fee. This guarantees funds can never be trapped by an absent arbitrator.
No bridge, no cross chain. Idios runs entirely on Beam mainnet. No wrapped assets, no second chain.
idios-mcp-server/ exposes every contract action as MCP tools, so any MCP capable agent framework (Claude Code, LangGraph, CrewAI, AutoGen) can create, work, settle, and dispute private escrow contracts in plain language. Twenty six tools cover the full lifecycle: creation in both modes, collateral, delivery, approval, disputes with a live vote view, claims with a double claim guard, recovery paths, and the v2 worker reputation bond. Voting on disputes is deliberately not an agent tool, so an agent can never rule in its own favour.
Install it with pip install idios-mcp-server, or run it from this repo. Start with idios-mcp-server/QUICKSTART.md: from nothing to an agent settled contract on mainnet.
idios-agent-daemon/ in this repo is a small Python daemon that automates your role in an Idios contract. Polls the chain, watches your tracked contracts, fires the right contract call when the state machine advances. Run on your own machine alongside a Beam CLI wallet, type the password once at startup, walk away.
Supports the two party roles:
Both roles also void a stale dispute once the arbitrator timeout passes and reclaim their side from a Voided contract. There is no arbitrator role: dispute resolution is M of N voting by humans over the CLI, never automated.
The dapp's My Contracts page has an Automate this contract button on each tracked contract card that generates a daemon config snippet you can paste straight into the daemon's config. See idios-agent-daemon/README.md for setup and configuration.
This roadmap is partner driven. Phase 0 is live on mainnet. Phase 1 is the next planned release. Everything after depends on real world demand.
Phase 0 (shipped): live on mainnet
41ef8be5...), upgraded in place from v6 via Upgradable3 on 21 June 2026: global arbitrator registry, voting based dispute resolution, stake based sybil resistanceasset_idPhase 1 (next): real decentralization and reputation
Phase 2: payload delivery and larger deliverables
Phase 3+: future research (partner driven)
Idios is early and moving fast. If you're building on Beam and want to integrate, open an issue or reach out directly.