This proposal lets a third party, a backer, stand behind a lender's credit line to an identity of an ERC-721 identity registry, such as the Identity Registry of ERC-8004, and absorb the line's losses. It extends the Agent Credit Lines draft, in which a lender lends an ERC-20 token to such identities. With the identity owner's signed consent, a backer puts itself behind a line of a given size. The lender then asks the backer before each draw (canBorrow), tells it of each draw (onBorrow), takes the principal of each defaulted loan from the backer's balance and tells it (onDefault), and tells it when part of the line is no longer its concern (onRelease). A backer can refuse a draw. It cannot stop a repayment, a default or the end of its backing. After a default, the backer, or anyone for it, can pay in a part of its charge it left unpaid (payLoss), and money paid toward the defaulted loan (recover) goes first to that part, then back to the backer, credited to it until anyone pays it out (payBacker), then to the lender's fee.
ERC-8467 · draft under review
Agent Credit Backers
Third parties stand behind a lender's line to an agent identity and take its loss, through lender hooks.
StatusPriors runs the model, not the interface
Guided in the app: Back an agent.
- Pull request
- ethereum/ERCs #2111 (the text under review)
- Text pinned at
ERCS/erc-8467.mdat 75cfd37
75cfd375e4b70861c3b56e0f07fae5f819406357- Discussion
- Its thread on Ethereum Magicians
- Reference
- priors-agents/erc-credit-backer-hooks at 62f4612
62f461234e68e1e09570d5f4a792f71f3d3c1ba0 - Markdown
- /erc/8467.md
What it is
Specification headings
- Interfaces
- What the Agent Credit Lines draft provides
- Terms
- Owner consent
- Setting a backer
- Removing a backer
- Revoking consents
- Drawing
- Repaying
- Defaults
- After a default
- Releases
- Notifications
- The backer
The abstract and headings above are the text at 75cfd37, CC0. Read the full text at that commit.
Live at Priors, mainnet read-only
Mainnet, read-only
Priors runs this model on mainnet under its own contracts and interface, which do not conform to this draft. These panels read Robinhood Chain mainnet (4663) and change nothing. Nothing here sends a mainnet transaction.
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
Wallet
Not connected. Any browser wallet works: the lab switches it to Robinhood Chain testnet (46630) and sends nothing on another chain.
- 2
Test ETH
For the testnet's network fees. The lab's drip sends a little to a connected wallet once a day.
- 3
Test dollars
The Lab Test Dollar (no value) that lines lend and launches pair with.
- 4
Testnet identity
An ERC-8004 identity on the testnet registry, for the forms that take an agent id.
The testnet contracts
| Contract | Address on testnet (46630) |
|---|---|
| The lab's normal backed credit line (BackedCreditLine) | 0x575f245a79D24Ca3C486c0F97d8F395398E0c292 |
| The lab's fast backed credit line (BackedCreditLine, a 5-minute grace) | 0xD543D6bacA011C7DAA4Ba6d817Fa494a7976512d |
| The lab's test dollar (LabTestDollar) | 0x64A419191369E6a79d562A65336073ec1bfbf4BD |
Actions
Reads
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.
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-8467
lab_erc(8467)- 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(8467, "consent", { agent_id, backer, line, deadline, backed_line, contract })- The EIP-712 BackerConsent the identity's owner signs (chain 46630).
lab_read(8467, "backing", { agent_id, backed_line, contract })- An identity's backer and line.
lab_read(8467, "loan", { loan_id, backed_line, contract })- A backed loan, and its loss.
lab_read(8467, "backer", { backer, backed_line, contract })- A StakeBacker: its manager, stake and lines.
lab_read(8467, "backer_line", { backer, agent_id, backed_line, contract })- A StakeBacker's record of one backing.
lab_prepare(8467, "stake", { backer, amount })- Stake test dollars in your backer. Who signs: the backer's manager
lab_prepare(8467, "back", { backer, agent_id, line, deadline, owner_consent, backed_line, lender })- Back an identity's line, with its owner's signed consent. Who signs: the backer's manager
lab_prepare(8467, "leave", { backer, agent_id, backed_line, lender })- Stop backing an identity. Who signs: the backer's manager
lab_prepare(8467, "withdraw_stake", { backer, to, amount })- Withdraw stake no line holds. Who signs: the backer's manager
lab_prepare(8467, "sync", { backer, agent_id, backed_line, lender })- Sync a backing with the lender. Who signs: anyone
lab_prepare(8467, "approve_repay", { amount, backed_line, contract })- Let the backed line take a repayment or a loss payment. Who signs: the payer
lab_prepare(8467, "borrow", { agent_id, amount, term, to, max_fee, backed_line, contract })- Borrow on the backed line. Who signs: the identity's owner or its delegate
lab_prepare(8467, "repay", { loan_id, max_due, backed_line, contract })- Repay a backed loan. Who signs: anyone
lab_prepare(8467, "mark_default", { loan_id, backed_line, contract })- Mark a backed loan defaulted (the backer pays). Who signs: anyone, after due plus grace
lab_prepare(8467, "pay_loss", { loan_id, amount, backed_line, contract })- Pay what a backer left unpaid of its charge. Who signs: anyone
lab_prepare(8467, "recover", { loan_id, amount, backed_line, contract })- Pay toward a defaulted loan (recovery). Who signs: anyone
lab_prepare(8467, "pay_backer", { backer, backed_line, contract })- Pay a backer what recoveries credited it. Who signs: anyone
lab_prepare(8467, "remove_backer", { agent_id, backed_line, contract })- End an identity's backing. Who signs: its backer or its owner, with no active backed loan
lab_prepare(8467, "revoke_consents", { agent_id, backed_line, contract })- Void every unused consent. Who signs: the identity's owner
lab_prepare(8467, "set_delegate", { agent_id, delegate, backed_line, contract })- Name a delegate who may borrow for the identity. Who signs: the identity's owner
lab_prepare(8467, "fund_line", { amount, contract })- Fund your own backed line with test dollars. Who signs: the lender
lab_deploy_prepare(8467, "stake_backer", { manager, asset })- Your own StakeBacker: you are its manager.
lab_deploy_prepare(8467, "backed_line", { fee_bps, grace, max_term, asset, registry })- Your own BackedCreditLine: you lend.
lab_check_contract(8467, chain, address)- The conformance read of any contract, on testnet or mainnet: supportsInterface and the views.
lab_feedback_draft(8467, note, txHash?)- The report text and the thread and issue links. It posts nothing.
HTTP
GET https://lab.priors.trade/api/lab/erc/8467GET https://lab.priors.trade/api/lab/read/8467/consent?agent_id=<agent_id>&backer=<backer>&line=<line>&deadline=<deadline>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/read/8467/backing?agent_id=<agent_id>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/read/8467/loan?loan_id=<loan_id>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/read/8467/backer?backer=<backer>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/read/8467/backer_line?backer=<backer>&agent_id=<agent_id>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/prepare/8467/stake?backer=<backer>&amount=<amount>GET https://lab.priors.trade/api/lab/prepare/8467/back?backer=<backer>&agent_id=<agent_id>&line=<line>&deadline=<deadline>&owner_consent=<owner_consent>&backed_line=<backed_line>&lender=<lender>GET https://lab.priors.trade/api/lab/prepare/8467/leave?backer=<backer>&agent_id=<agent_id>&backed_line=<backed_line>&lender=<lender>GET https://lab.priors.trade/api/lab/prepare/8467/withdraw_stake?backer=<backer>&to=<to>&amount=<amount>GET https://lab.priors.trade/api/lab/prepare/8467/sync?backer=<backer>&agent_id=<agent_id>&backed_line=<backed_line>&lender=<lender>GET https://lab.priors.trade/api/lab/prepare/8467/approve_repay?amount=<amount>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/prepare/8467/borrow?agent_id=<agent_id>&amount=<amount>&term=<term>&to=<to>&max_fee=<max_fee>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/prepare/8467/repay?loan_id=<loan_id>&max_due=<max_due>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/prepare/8467/mark_default?loan_id=<loan_id>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/prepare/8467/pay_loss?loan_id=<loan_id>&amount=<amount>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/prepare/8467/recover?loan_id=<loan_id>&amount=<amount>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/prepare/8467/pay_backer?backer=<backer>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/prepare/8467/remove_backer?agent_id=<agent_id>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/prepare/8467/revoke_consents?agent_id=<agent_id>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/prepare/8467/set_delegate?agent_id=<agent_id>&delegate=<delegate>&backed_line=<backed_line>&contract=<contract>GET https://lab.priors.trade/api/lab/prepare/8467/fund_line?amount=<amount>&contract=<contract>GET https://lab.priors.trade/api/lab/deploy/8467/stake_backer?manager=<manager>&asset=<asset>GET https://lab.priors.trade/api/lab/deploy/8467/backed_line?fee_bps=<fee_bps>&grace=<grace>&max_term=<max_term>&asset=<asset>®istry=<registry>GET https://lab.priors.trade/api/lab/check/8467/<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/8467.md. Try ERC-8467, Agent Credit Backers (a draft under review). Start with lab_setup for my testnet address to see my test ETH, test dollars and identities, then stake test dollars in your backer, then back an identity's line, with its owner's signed consent, then stop backing an identity, then withdraw stake no line holds, then sync a backing with the lender, then let the backed line take a repayment or a loss payment with lab_prepare(8467, <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 IBackedCreditLine 0x9a4b754b, IAgentCreditLine 0x34fe3856, ICreditBacker 0xf9e9ae69 (computed from the pinned interfaces) 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.