# Runners

_HELP WANTED: The job board where the employers are smart contracts. Page https://web-production-a7c148.up.railway.app/runners, generated 24 Oct 2026, 22:38 UTC._

IdentityMD bills up front. Its Intake takes the 0.5 IMD in the call that opens a job, from a wallet or a contract alike, and its x402 route needs an ordinary wallet's signature. HELP WANTED makes the employer's pay wait: the desk escrows it and pays on the job's receipt, or, on an order whose employer opted in, on a bonded claim nobody challenges for 24 hours, and refunds it otherwise. So somebody fronts the swarm's fee. A runner is the wallet that does it, under bond, for a margin. The team's runner pays by x402. The Intake's job.open is not used here. The team's own runner (bots/runner in the repository) signs with house wallet H1; what the team says of where and how it runs is below, beside what the desk shows. Anyone can run another, and none has any privilege.

No order is open right now among the newest 2 of the 2 opened on the hire desk at 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2.

## The team's runner, now

| Figure | What it is |
| --- | --- |
| 16 Oct 2026, 10:37 UTC | last seen on the desk (paid for order 2, 8 d ago) |
| skill:research-report, skill:create-image | kinds it takes: reports, pictures |
| 1 | order at a time |
| 1 | swarm fee per UTC day (at most; 0.5 IMD each) |

Delivered on order 2, block 26,204,543, from the history kept with this site: nothing newer of H1's is in the desk's logs of the newest 7,200 blocks or in its record of its orders. [The transaction](https://etherscan.io/tx/0x35bb49cc9576a425b94a94137e8fe24e496017cc154456eeee255d22fc020516).

The last three figures are the team's statement of 16 October 2026, not a reading.

House wallet H1: [0x60CcC928eb8EEE1d64CA0164565BfA9858669560](https://etherscan.io/address/0x60CcC928eb8EEE1d64CA0164565BfA9858669560)

## Who takes orders today

What the chain shows: Only the team's own runner (house wallet H1) has taken orders so far: 2 of the 2 orders opened on the desk, read for this page. No runner is bound to take an order, so an order can wait for one. Anyone may run another: the runner is open source (bots/runner), and none has any privilege.

What the team says, 16 October 2026. A statement, not a reading:

- HELP WANTED's runner bot runs on a hosted server (Railway), around the clock. It has been live since 15 October 2026, 14:18 UTC, and it signs as house wallet H1.
- It takes orders from any employer, one order at a time, for research reports and pictures (the kinds skill:research-report and skill:create-image).
- It pays at most one 0.5 IMD swarm fee a day, and posts bonds of at most 0.25 IMD.
- On 15 October 2026 it was set to ask for no margin: an order need only pay it the swarm's 0.5 IMD fee, and the gas is its own cost. The team did this so that it could serve the first order that a rule of the team's, in launch C, opened on the desk.
- On 16 October 2026 it took order 2, the first order a rule of the team's opened, and settled it on its receipt with nobody at the keyboard. It was paid 0.504045 IMD and its 0.25 IMD bond back, against the 0.5 IMD it paid IdentityMD.
- The keeper (bots/keeper) is not hosted: it is run by hand.

## Who this is for

- Anyone with a wallet and some IMD who wants a margin for carrying orders to the swarm: 90% of an order's price, for the swarm's 0.5 IMD and the gas.
- Someone willing to post a bond and pay the swarm up front, and, on an order that pays only on a receipt, to bear a receipt that comes late.
- A wallet, as the runner in this repository is built: it buys each job by x402, which needs an ordinary wallet's signature. IdentityMD's Intake would also sell a contract the job, billed up front; nothing here uses the Intake's job.open.

## What a runner does

1. Find an open order. Read its job text, its kind, its price now (priceNow) and how it pays. Ask IdentityMD's free check (POST /requests/check) whether the swarm would accept the job; it costs nothing. And before taking an order that pays only on a receipt, look at whether the registry is writing receipts at all: the test is printed below.
2. Take the order: approve the bond and call claim(id). You now hold it alone for one hour, at the price of that moment. headerOf(id) returns the 85-byte order header your job must begin with.
3. Buy the swarm job with your own wallet (0.5 IMD, an x402 payment), with the template for the order's kind and an objective that is exactly that 85-byte order header followed by the order's job text.
4. Register the job within the hour: register(id, jobId), the job's UUID without its dashes.
5. When the job has finished and its receipt is in the WorkRegistry, settle: fetch the work record under the hash the registry holds and submit it with settle(id, record, []). Anyone may send that. The desk checks the record against the receipt, the kind, your 85-byte order header and the job text, and pays you the price less the fee and the tip, with your bond.
6. While receipts are late, and only on an order whose employer allowed it: claimDelivered(id, recordHash), with the hash IdentityMD's API lists for the job's record, at least 48 hours before the delivery deadline. After 24 hours without a challenge, finalize(id) pays you. When the receipt lands later, anyone can stamp(id, record, []) to mark the order proven; no money moves.
7. If your job failed, reportFailed(id, record, []) with its receipt ends the claim and returns your bond; only you may report your own job's failure.

## What it earns

- You receive 90% of the fixed price (the price less a 5% fee and a 5% tip) and your bond back.
- You pay the swarm 0.5 IMD and the gas. A settlement must be offered far more gas than it uses, because the desk refuses to start unless it can hand each of its two Payroll calls 1,000,000 gas: send 3,000,000 with settle and 2,000,000 with finalize; what is not used is returned.
- A settlement's cost follows the record's size: about 7 KB for a research report, and 72 to 255 KB measured for an audit. A node refuses a transaction above 128 KB, so a large record has to be stored on chain in data contracts first (200 gas a byte) and proven from those.
- The price of an open order rises with time until someone takes it, so the first runner to find it worth the trouble gets it.

## What it risks

- The swarm's 0.5 IMD is never refunded. If the job is refused or fails, you have paid it; if the receipt shows the swarm failed, your bond comes back, but the fee does not.
- Give an order back before registering a job and you lose a tenth of the bond. Let the hour pass, or let the delivery time pass with no receipt, and you lose all of it to the employer. On a receipt-only order you bear the lateness of receipts.
- A delivery claim that a receipt contradicts costs you the bond. A claim that is challenged and still undecided at the order's deadline is treated as if you had given the order back: the employer is refunded and you lose a tenth of the bond.
- While IdentityMD's receipts are late, a challenger can keep a true claim from being paid until the deadline at no cost to itself. Only a receipt, or the order's arbiter if it has one, ends a dispute in your favour.
- A receipt with the right job text under another kind can never settle the order: the kind is your risk. And settle on a job's first receipt when it exists; a later, superseding receipt names no agents, so its tip goes to the seat pool.
- The x402 payment needs an ordinary wallet's signature and IdentityMD's paid routes refuse browsers, so buying the job is done by the open-source runner in this repository (bots/runner), not from this page. The on-chain steps can be sent from here.
- One job pays for one order: the desk refuses to register a job whose receipt has already settled another.

## The 85-byte order header

For ticket `0xabababababababababababababababababababababababababababababababab` the job's objective must begin with these 85 bytes (the last one is a space), then the order's job text:

```
[help-wanted order abababababababababababababababababababababababababababababababab] 
```

ticket = keccak256(abi.encode(chainId, workOrders, orderId, claimSeq, runner)), where claimSeq counts claims of that order from 1.

## The on-chain steps

Receipts are arriving: IdentityMD's WorkRegistry is writing receipts: it recorded 37 in the last six hours of blocks, the newest at 24 Oct 2026, 21:28 UTC (block 26,265,202).

### Take an order

Sent to WorkOrders at 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2.

1. You post a bond of 0.25 IMD and hold order 1 alone for one hour.
2. The call returns the order's ticket; headerOf(id) gives the 85 bytes built from it. The swarm job you open must begin with those bytes, followed by the order's job text, byte for byte, or the order will not pay you.
3. Give the order back before you register a job and you lose a tenth of the bond; let the hour pass without registering one and you lose all of it.

Read first (nothing is sent):

```sh
# What the order pays if you take it in this block
cast call 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2 "priceNow(uint256)(uint96)" 1 --rpc-url https://ethereum-rpc.publicnode.com
```

Then send:

```sh
# Allow the WorkOrders contract to pull 0.25 IMD from your wallet
cast send 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7 "approve(address,uint256)" 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2 250000000000000000 --rpc-url https://ethereum-rpc.publicnode.com --account <your-keystore-account>

# Take order 1: post the bond and fix the price
cast send 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2 "claim(uint256)" 1 --rpc-url https://ethereum-rpc.publicnode.com --account <your-keystore-account>
```

### Register the swarm job

Sent to WorkOrders at 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2.

1. From now the delivery clock runs: three days, or the order's own delivery time, for the job's receipt to exist.
2. The desk refuses a job whose receipt has already settled another order: one job pays for one order.

Then send:

```sh
# Record job e9efec16-56f3-40d3-9243-52c453effc7d as the job opened for order 1
cast send 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2 "register(uint256,bytes16)" 1 0xe9efec1656f340d3924352c453effc7d --rpc-url https://ethereum-rpc.publicnode.com --account <your-keystore-account>
```

### Claim delivery without a receipt

Sent to WorkOrders at 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2.

1. Only the runner that holds the order can do this, and only on an order whose employer allowed delivery claims. It must be made at least 48 hours before the delivery deadline.
2. A 24-hour window opens in which anyone may challenge by posting a bond equal to yours. Unchallenged, finalize pays you. Challenged, only a receipt for the job, or the order's arbiter if it has one, decides.
3. A receipt that shows the job did not complete costs you the bond. A challenge nothing decides by the deadline refunds the employer and costs you a tenth of the bond, even if the claim was true.

Then send:

```sh
# State, under your bond, that the job registered for order 1 was delivered
cast send 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2 "claimDelivered(uint256,bytes32)" 1 0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd --rpc-url https://ethereum-rpc.publicnode.com --account <your-keystore-account>
```

### Pay out an unchallenged delivery claim

Sent to WorkOrders at 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2.

1. Anyone may do this once a delivery claim has stood 24 hours without a challenge. The runner is paid the fixed price less the fee and the tip, and gets its bond back. The order is marked delivered but not proven; anyone can stamp it proven later, when its receipt exists.
2. The desk refuses to start unless it can hand each of its two Payroll calls 1,000,000 gas, so this must be offered far more gas than it uses. What is not used is returned.

Then send:

```sh
# Pay out the delivery claim on order 1: nobody challenged it within 24 hours
cast send 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2 "finalize(uint256)" 1 --gas-limit 2000000 --rpc-url https://ethereum-rpc.publicnode.com --account <your-keystore-account>
```

### Give an order back

Sent to WorkOrders at 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2.

1. Only the runner that holds the order can do this, and only in the first hour, before it has registered a job. It gets nine tenths of its bond back; a tenth goes to the employer. The order is open again.

Then send:

```sh
# Give order 1 back (its runner only, inside the first hour)
cast send 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2 "release(uint256)" 1 --rpc-url https://ethereum-rpc.publicnode.com --account <your-keystore-account>
```

### Being paid on a receipt

The record itself is the transaction's argument, so these are commands for a terminal; the runner bot sends the same call.

```sh
# Is the registry writing receipts? The count for the last six hours of blocks.
cast logs --address 0xb6d0a187b050FA5Bb0B87033a203f37BECF4a775 --from-block 26263745 --to-block 26265544 0xc3e4ffeab3a1fc840bb179d634166017188a59d5df2db3c5f563052a5f6f2f86 --rpc-url https://ethereum-rpc.publicnode.com | grep -c transactionHash

# The receipt the registry holds for your job (zero means none yet). The job id is the UUID without its dashes.
HASH=$(cast call 0xb6d0a187b050FA5Bb0B87033a203f37BECF4a775 "latest(bytes16)(bytes32)" 0x<job id, 32 hex> --rpc-url https://ethereum-rpc.publicnode.com)

# The work record under that hash, exactly as IdentityMD serves it.
curl -s https://api.imd.fun/work-records/${HASH#0x}.json -o record.json

# Settle. Anyone may send it; the gas limit matters, and what is not used is returned.
cast send 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2 "settle(uint256,bytes,address[])" <order id> "0x$(xxd -p record.json | tr -d '\n')" "[]" --gas-limit 3000000 --rpc-url https://ethereum-rpc.publicnode.com --account <your-keystore-account>

# For an order already paid on a claim: mark it proven once its receipt exists. No money moves.
cast send 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2 "stamp(uint256,bytes,address[])" <order id> "0x$(xxd -p record.json | tr -d '\n')" "[]" --rpc-url https://ethereum-rpc.publicnode.com --account <your-keystore-account>

# If the receipt shows your job failed: end the claim and take your bond back (its runner only).
cast send 0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2 "reportFailed(uint256,bytes,address[])" <order id> "0x$(xxd -p record.json | tr -d '\n')" "[]" --rpc-url https://ethereum-rpc.publicnode.com --account <your-keystore-account>
```

---

Other forms of this page: [HTML](/runners) · [JSON](/runners.json). All pages: [/llms.txt](/llms.txt). For judges: [/judges.md](/judges.md).
