Priors lab

ERC-8461 · draft under review

Agent Default Registry

Lenders record defaults of loans to agent identities, and anyone counts them against the reporters it trusts.

StatusTestnet only

Guided in the app: Report and cure a default.

Pull request
ethereum/ERCs #2105 (the text under review)
Text pinned at
ERCS/erc-8461.md at 7bf377e
7bf377e5fb727a61bedfeea1d9dd640b2c2c8124
Discussion
Its thread on Ethereum Magicians
Reference
priors-agents/erc-agent-default-registry at eb26be8
eb26be80a4aed99f440f92c5ca59c6c6641d44ff
Markdown
/erc/8461.md

What it is

This proposal defines one contract where lenders record the defaults of loans they made to identities of an ERC-721 identity registry, such as the Identity Registry of ERC-8004. Each record names the identity, the owner address the loan recorded, the asset, the principal and the lender's reference to the loan, and can later be marked cured with the amount recovered, or voided within a short window if it was made by mistake. A lender that reports from several addresses names one of them its primary, and its records count under that primary. Anyone may record, and a record counts only for a reader that trusts the primary it is stored under: a contract asks how many open, cured and still provisional defaults an identity, or an owner address, has according to the lenders it names, at a cost that grows with that list alone.

Specification headings

  1. Interface
  2. Primaries
  3. Records
  4. Counting
  5. Listing

The abstract and headings above are the text at 7bf377e, CC0. Read the full text at that commit.

Nothing at Priors runs this draft. Its reference contracts go on the testnet only.

Try it

On Robinhood Chain testnet (46630), with the reference contracts at their pinned commits and test tokens of no value. Each action shows the call it prepares before your wallet signs it, and each send is simulated first.

Set up

Four steps, once: your wallet on Robinhood Chain testnet, a little test ETH for its fees, test dollars of no value, and a testnet identity. The forms below fill from them.

  1. 1

    Wallet

    Not connected. Any browser wallet works: the lab switches it to Robinhood Chain testnet (46630) and sends nothing on another chain.

  2. 2

    Test ETH

    For the testnet's network fees. The lab's drip sends a little to a connected wallet once a day.

  3. 3

    Test dollars

    The Lab Test Dollar (no value) that lines lend and launches pair with.

  4. 4

    Testnet identity

    An ERC-8004 identity on the testnet registry, for the forms that take an agent id.

The testnet contracts

ContractAddress on testnet (46630)
The lab's default registry (AgentDefaultRegistry)0x8845f144F5dEFef80fc2C1d0be3A48a11DEceDE9
The lab's line granter and default reporter (LabLineGranter)0x7932F9FE3182C79B8Fc9eC5aB66540d49B816A13
The lab's normal credit line (SimpleCreditLine)0x370fAf15c0D3F877eBfFb6A5377C350AEb291B02
The lab's fast credit line (SimpleCreditLine, a 5-minute grace)0xE2f95B3f9eD0C680E6e3c4B15a4480F98390b02F
The lab's normal backed credit line (BackedCreditLine)0x575f245a79D24Ca3C486c0F97d8F395398E0c292
The lab's fast backed credit line (BackedCreditLine, a 5-minute grace)0xD543D6bacA011C7DAA4Ba6d817Fa494a7976512d

Actions

Report a lab loan past due plus grace (marked defaulted and recorded by the lab's reporter)

Who signsanyone, once the loan is past due plus grace

Record a default (as a reporter)

Who signsa lender's reporter

Record a cure

Who signsthe record's reporter

Void a record within the void window

Who signsthe record's reporter or its primary

Propose a primary (as a reporter)

Who signsa reporter

Accept a reporter (as its primary)

Who signsthe proposed primary

Drop a reporter (as its primary)

Who signsthe reporter's primary

Reads

An identity's defaults, counted against trusted primaries

Read on the testnet once its fields are filled.

An owner's defaults, counted against trusted primaries

Read on the testnet once its fields are filled.

Whether a lab loan's default was recorded, and its record

Read on the testnet once its fields are filled.

An identity's records

Read on the testnet once its fields are filled.

One record

Read on the testnet once its fields are filled.

A reporter's primary

Read on the testnet once its fields are filled.

Deploy your own

Deploy the reference contract from its pinned commit with your own wallet, on the testnet: you become its lender, launchpad or backer. Its address shows once the receipt is in, and Check a contract below reads it.

Your own AgentDefaultRegistry

Who signsanyone

With an agent

Your agent gets the same lab through the MCP server at https://lab.priors.trade/mcp or the HTTP API described by /openapi.json. It reads, and gets back unsigned testnet transactions to sign with its own testnet key. The lab holds no key of its own for you and never asks for one.

MCP tools for ERC-8461

lab_erc(8461)
What the draft does on the lab, its contracts and an agent's next calls.
lab_setup(address)
Test ETH, test dollars and the testnet identities of an address, with the calls to register one and mint test dollars.
lab_read(8461, "agent_defaults", { agent_id, trusted, contract })
An identity's defaults, counted against trusted primaries.
lab_read(8461, "owner_defaults", { owner, trusted, contract })
An owner's defaults, counted against trusted primaries.
lab_read(8461, "reported", { loan_id, line })
Whether a lab loan's default was recorded, and its record.
lab_read(8461, "records_of_agent", { agent_id, start, limit, contract })
An identity's records.
lab_read(8461, "record", { record_id, contract })
One record.
lab_read(8461, "primary_of", { reporter, contract })
A reporter's primary.
lab_prepare(8461, "report_default", { loan_id, line })
Report a lab loan past due plus grace (marked defaulted and recorded by the lab's reporter). Who signs: anyone, once the loan is past due plus grace
lab_prepare(8461, "record_default", { agent_id, owner, asset, principal, loan_ref, contract })
Record a default (as a reporter). Who signs: a lender's reporter
lab_prepare(8461, "record_cure", { record_id, recovered, contract })
Record a cure. Who signs: the record's reporter
lab_prepare(8461, "void_record", { record_id, contract })
Void a record within the void window. Who signs: the record's reporter or its primary
lab_prepare(8461, "set_primary", { primary, contract })
Propose a primary (as a reporter). Who signs: a reporter
lab_prepare(8461, "accept_primary", { reporter, contract })
Accept a reporter (as its primary). Who signs: the proposed primary
lab_prepare(8461, "drop_reporter", { reporter, contract })
Drop a reporter (as its primary). Who signs: the reporter's primary
lab_deploy_prepare(8461, "registry", { identity_registry })
Your own AgentDefaultRegistry.
lab_check_contract(8461, chain, address)
The conformance read of any contract, on testnet or mainnet: supportsInterface and the views.
lab_feedback_draft(8461, note, txHash?)
The report text and the thread and issue links. It posts nothing.

HTTP

  • GET https://lab.priors.trade/api/lab/erc/8461
  • GET https://lab.priors.trade/api/lab/read/8461/agent_defaults?agent_id=<agent_id>&trusted=<trusted>&contract=<contract>
  • GET https://lab.priors.trade/api/lab/read/8461/owner_defaults?owner=<owner>&trusted=<trusted>&contract=<contract>
  • GET https://lab.priors.trade/api/lab/read/8461/reported?loan_id=<loan_id>&line=<line>
  • GET https://lab.priors.trade/api/lab/read/8461/records_of_agent?agent_id=<agent_id>&start=<start>&limit=<limit>&contract=<contract>
  • GET https://lab.priors.trade/api/lab/read/8461/record?record_id=<record_id>&contract=<contract>
  • GET https://lab.priors.trade/api/lab/read/8461/primary_of?reporter=<reporter>&contract=<contract>
  • GET https://lab.priors.trade/api/lab/prepare/8461/report_default?loan_id=<loan_id>&line=<line>
  • GET https://lab.priors.trade/api/lab/prepare/8461/record_default?agent_id=<agent_id>&owner=<owner>&asset=<asset>&principal=<principal>&loan_ref=<loan_ref>&contract=<contract>
  • GET https://lab.priors.trade/api/lab/prepare/8461/record_cure?record_id=<record_id>&recovered=<recovered>&contract=<contract>
  • GET https://lab.priors.trade/api/lab/prepare/8461/void_record?record_id=<record_id>&contract=<contract>
  • GET https://lab.priors.trade/api/lab/prepare/8461/set_primary?primary=<primary>&contract=<contract>
  • GET https://lab.priors.trade/api/lab/prepare/8461/accept_primary?reporter=<reporter>&contract=<contract>
  • GET https://lab.priors.trade/api/lab/prepare/8461/drop_reporter?reporter=<reporter>&contract=<contract>
  • GET https://lab.priors.trade/api/lab/deploy/8461/registry?identity_registry=<identity_registry>
  • GET https://lab.priors.trade/api/lab/check/8461/<chain>/<address>
  • GET https://lab.priors.trade/api/lab/setup/<address>

Connect it, for example in Claude Code: claude mcp add --transport http priors-lab https://lab.priors.trade/mcp

A prompt to copy

Use the Priors lab on Robinhood Chain testnet (chain id 46630), where every token is a test token of no value. Its MCP server is https://lab.priors.trade/mcp and this draft's page is https://lab.priors.trade/erc/8461.md. Try ERC-8461, Agent Default Registry (a draft under review). Start with lab_setup for my testnet address to see my test ETH, test dollars and identities, then report a lab loan past due plus grace (marked defaulted and recorded by the lab's reporter), then record a default (as a reporter), then record a cure, then void a record within the void window, then propose a primary (as a reporter), then accept a reporter (as its primary) with lab_prepare(8461, <action>, params). Each prepare returns an unsigned transaction { chainId: 46630, to, data, value }: sign and send it yourself with a testnet key, and refuse any other chain. Never ask me for a key. After each transaction, read the result back with lab_read and tell me what changed. If the draft or its reference code looks wrong, draft a report with lab_feedback_draft.

Check a contract

Paste any contract on either chain: the lab reads supportsInterface for IAgentDefaultRegistry 0x95030b12 (computed from the pinned interface) and ERC-165's own, then calls each view. It only reads, so another implementer can test conformance with nothing signed.

Feedback

What you found goes where the draft is worked on: the discussion of the text in its thread on Ethereum Magicians, a bug in the reference code in its repository's issues. You post it under your own account. The lab posts nothing for anyone.