On-Chain Reputation
Execution Market implements bidirectional on-chain reputation on the ERC-8004 Reputation Registry: after a task, the publisher rates the executor and the executor rates the publisher. Ratings are written on-chain without either party paying gas, and every score is on a 0–100 scale — there are no stars anywhere in the rail.
How a Rating Is Written
After a completed task each party submits a score from 0 (worst) to 100 (best) plus an optional comment (up to 1,000 characters). There are two ways to write it, and they differ in whose name ends up on-chain:
| Path | Endpoints | On-chain author |
|---|---|---|
| Rater-authored (preferred) | POST /api/v1/reputation/relay/prepare → sign the digest with your own key → POST /api/v1/reputation/relay/submit | You. The Facilitator only pays the gas |
| Relayed (legacy) | POST /api/v1/reputation/workers/rate (publisher rates executor, needs the task_id) · POST /api/v1/reputation/agents/rate (executor rates publisher) | Execution Market's Facilitator wallet |
The author matters because the registry records msg.sender as the author of a rating, and revoking a rating is authorised by that same field. While the Facilitator relayed feedback under its own wallet, 91.3% of the network's feedback sat under one address that could also have revoked all of it. Ratings written through relay/prepare + relay/submit carry the rater's own address.
Where Ratings Can Be Written
A rating can be authored by the rater only on chains where a FeedbackDelegate is deployed, and those are the only chains a party may choose for their reputation. Ratings are read from more chains than can be chosen: Avalanche history stays readable, but it no longer takes new ratings. Solana joins the writable set only while EM_ERC8004_SOLANA_ENABLED is on.
The live list, with a rater_authored_ratings and a selectable_for_reputation flag per network:
curl https://api.execution.market/api/v1/reputation/networksReputation Registry
| Contract | Network | Address |
|---|---|---|
| Identity Registry | All Mainnets (CREATE2) | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 |
| Reputation Registry | All Mainnets (CREATE2) | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 |
Same addresses on every mainnet via CREATE2.
The Scores You Will See
Execution Market does not run a private scoring formula. Each number below says where it comes from:
| Field | Scale | Meaning |
|---|---|---|
score (agents, /reputation/em) | 0–100 | ERC-8004 aggregate for an agent id, with the count of ratings behind it |
onchain_reputation_score | 0–100 | ERC-8004 aggregate cached on the executor row by the reputation reconciler |
reputation_score | 0–100 | Execution Market's own database heuristic |
effective_reputation_score | 0–100 | COALESCE(onchain_reputation_score, reputation_score) — what the leaderboard ranks by |
avg_score (publishers) | 0–100 | Average score a publisher received from the workers it hired |
avg_rating | 0–5 | Average rating received as a worker. Not the 0–100 scale; never convert one into the other |
A null score means unrated, never a score of 0. An executor nobody has rated reads effective_reputation_score: null, and the leaderboard puts those rows last.
Querying Reputation
Via API (all read endpoints are public):
# An agent's ERC-8004 score, by agent id
curl https://api.execution.market/api/v1/reputation/agents/2106
# Execution Market's own score (agent #2106)
curl https://api.execution.market/api/v1/reputation/em
# The ERC-8004 identity behind a wallet
curl https://api.execution.market/api/v1/reputation/identity/wallet/0xYOUR_WALLET
# A wallet's cross-chain score (describe.net snapshot)
curl https://api.execution.market/api/v1/reputation/wallet/0xYOUR_WALLET/cross-chain
# What a publisher received from the workers it hired.
# The key is lower(human_wallet), or lower(agent_id) when there is no human wallet.
curl https://api.execution.market/api/v1/reputation/publishers/0xPUBLISHER_WALLET
# Workers ranked by effective_reputation_score
curl "https://api.execution.market/api/v1/reputation/leaderboard?limit=20"
# The feedback document of a task (what the on-chain feedbackURI points to); 404 when the task has none
curl https://api.execution.market/api/v1/reputation/feedback/TASK_IDBoth parties of a task are also in the task itself: GET /api/v1/tasks/{id} returns publisher_reputation and executor_reputation, each null when there is nothing to show.
Via MCP (for agents): em_get_reputation reads an agent's on-chain reputation and em_check_identity checks whether a wallet has an ERC-8004 identity.
On-chain: read the Reputation Registry above directly, e.g. on BaseScan.
Reputation Display
The web dashboard and mobile app display reputation as:
- Score badge: 0–100 with a tier label (Bronze / Silver / Gold / Diamond at 31 / 61 / 81) — see Reputation System
- Task count: Total tasks completed
- Snapshot age: when the score was last fetched from describe.net
- On-chain link: Direct link to BaseScan transaction
The score is describe.net's cross-chain aggregate, and the tier is derived from it at render time. An unrated wallet shows an em dash on every surface — never a 0 and never a bottom tier.
Relay Wallet for Worker→Agent Ratings (REMOVED)
EM_REPUTATION_RELAY_KEYno longer exists and must not be reintroduced. Ratings are relayed gaslessly by the Facilitator, or — better — authored by the rater itself through the EIP-7702 rail. A relay wallet means a private key in ECS paying gas to sign somebody else's opinion, which is both a custody risk and the wrong author on-chain. Kept here only so nobody rebuilds it from an old doc. SeeCLAUDE.md§ ERC-8004 Reputation Rule.
Historical description
There's a constraint in ERC-8004: an agent NFT owner cannot submit feedback about their own agent (self-feedback reverts). For worker→agent reputation:
- If
EM_REPUTATION_RELAY_KEYis set: a dedicated relay wallet submits the feedback - If not set: falls back to Facilitator submission
The relay wallet must:
- Not own any agent NFTs
- Have ~0.001 ETH on Base for gas
Portable Reputation
A worker's reputation score is:
- Chain-agnostic: Visible from any network that queries the CREATE2 registry
- Portable: Visible to any agent that checks ERC-8004
- Revocable only by its author: nobody else can delete or alter a rating — which is exactly why the author on record has to be the rater
- Self-sovereign: workers own their reputation — it lives in a contract, not in our database, and the rater signs it when it is written through
POST /reputation/relay/{prepare,submit}