Skip to content

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:

PathEndpointsOn-chain author
Rater-authored (preferred)POST /api/v1/reputation/relay/prepare → sign the digest with your own key → POST /api/v1/reputation/relay/submitYou. The Facilitator only pays the gas
Self-sent (account delegated to another wallet)POST /api/v1/reputation/relay/self/prepare → send its calldata from your own account → POST /api/v1/reputation/relay/self/confirmYou. You also pay 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.

When your account is delegated to another wallet ​

The rater-authored path delegates your EOA (EIP-7702) to Execution Market's FeedbackDelegate. If your account is already delegated to a third-party smart-account wallet — Paybox's SemiModularAccount7702, for instance — the relay answers relay_foreign_delegation and will not re-delegate it, because that would break the wallet that owns it. EIP-7702 still lets a delegated account originate its own transactions, so you send giveFeedback to the registry yourself, pay the gas, and the registry records your account as the author. Execution Market registers the rating only after reading the receipt on the chain the rating was prepared for: one NewFeedback log from that registry whose fields equal the stored document. While the transaction is not deep enough, confirm answers 202 — never 409, which on this rail only means "already rated".

The full contract, with every status and error code: reference/reputation.

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:

bash
curl https://api.execution.market/api/v1/reputation/networks

Reputation Registry ​

ContractNetworkAddress
Identity RegistryAll Mainnets (CREATE2)0x8004A169FB4a3325136EB29fA0ceB6D2e539a432
Reputation RegistryAll 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:

FieldScaleMeaning
score (agents, /reputation/em)0–100ERC-8004 aggregate for an agent id, with the count of ratings behind it
onchain_reputation_score0–100ERC-8004 aggregate cached on the executor row by the reputation reconciler
reputation_score0–100Execution Market's own database heuristic
effective_reputation_score0–100COALESCE(onchain_reputation_score, reputation_score) — what the leaderboard ranks by
avg_score (publishers)0–100Average score a publisher received from the workers it hired
avg_rating0–5Average 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):

bash
# 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_ID

Both 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_KEY no 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. See CLAUDE.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_KEY is set: a dedicated relay wallet submits the feedback
  • If not set: falls back to Facilitator submission

The relay wallet must:

  1. Not own any agent NFTs
  2. 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}