Priors

Registros de crédito para agentes de IA na Robinhood Chain: verifique o registro de um agente, pague APIs x402 em USDG, tome emprestado e pague de volta.

Servidor MCP hospedado

npx add-mcp 'https://mcp.priors.trade/mcp'

Instala no Claude Code, Codex, Cursor e outros

Documentação

Priors

@priors/mcp on npm @priors/x402 on npm hosted MCP ci license: MIT MCP Badge

Reputação para agentes de IA que é conquistada, pública e recomputável: cada ponto é dinheiro real em risco por tempo real, e qualquer pessoa pode reconstruir o número a partir dos eventos.

Avaliações são fáceis de falsificar. O Priors mantém um registro público construído a partir de reembolsos on-chain, e o Score v2 conta apenas dívidas que outra pessoa colocou em risco. Não é infalsificável: a própria página do score lista quanto custa cada ataque e o que ainda passa.

  • O que é: um pool de crédito on-chain na Robinhood Chain onde ERC-8004 agentes de IA tomam emprestado USDG, reembolsam e constroem um registro de crédito público e um score que qualquer pessoa pode consultar. Este repositório contém os contratos, o SDK e a CLI, um servidor MCP, auxiliares de pagamento x402 e uma skill para agentes.
  • Para quem é: para construtores de agentes que pagam por coisas (x402, USDG) e para qualquer pessoa que decida se confia, paga ou empresta a um agente.
  • Conecte o MCP hospedado (somente leitura, sem chave, sem transação): claude mcp add --transport http priors https://mcp.priors.trade/mcp, ou adicione https://mcp.priors.trade/mcp a qualquer cliente MCP (outros clientes).
  • Veja um agente usando: agent001, um agente de código aberto com sua própria carteira e linha de crédito Priors.
  • Contrate um agente por minuto: agent002, agentes de trabalho que vendem seu tempo por minuto, pagos em USDG via x402 ou em $PRIORS.

priors.trade · um prior é o que você acredita sobre um agente antes de lidar com ele. Este é respaldado por dinheiro.

Um pequeno pool de crédito on-chain empresta USDG sem garantia ($5 a $500) para agentes registrados em ERC-8004. Cada linha é respaldada, dólar por dólar, por alguém que colocou dinheiro atrás daquele agente. Cada reembolso e cada inadimplência é um evento público. A partir desses eventos, você obtém um score de confiança respaldado por crédito que qualquer pessoa pode consultar antes de confiar em um agente, e um registro público de quais agentes pagam suas dívidas.

Avaliações são fáceis de falsificar. Dívida reembolsada não é.

Status: Priors v2 está ativo na Robinhood Chain

Pool v2 (CreditPoolV2) e tesouraria v4 estão ativos na mainnet da Robinhood Chain (chain 4663) desde o bloco 71.702.460, e o cofre de assentos (SeatVaultV3) desde 2026-09-25. Os endereços vêm de deployments/4663.v2.json, então npx priors-v2 status e o SDK os resolvem sem configuração. O pool v1 está pausado; cada registro de reembolso v1 foi importado para o v2, então os agentes mantiveram seu histórico. Um segundo cofre de assentos para linhas maiores, o cofre de assentos de crescimento (SeatVaultV4, linhas de $50), está ativo desde 2026-09-29 e não aceita novos assentos desde 2026-10-09. SeatVaultV5 está ativo desde 2026-10-09 com respaldo somente do proprietário (reimplantado em 2026-10-11 com as correções de GHSA-g626 e GHSA-8pxr): o proprietário de um agente aposta seus próprios $PRIORS para abrir a linha do agente, que a raiz do V5 respalda 100% em USDG. Passou por revisões internas, sem auditoria externa.

O que o v2 muda. O v1 emprestava crédito conquistado que ninguém respaldava, e todas as descobertas difíceis do v1 viviam lá. O v2 elimina isso: cada linha é 100% respaldada por ações bloqueadas do pool de um fiador, uma inadimplência queima as ações desse fiador no valor do principal e da taxa, e os credores nunca sofrem perda de empréstimo. As linhas precisam do consentimento assinado do proprietário do agente, os agentes podem mudar de patrocinador entre empréstimos, e o proprietário do pool é o PoolSteward, que somente o timelock pode acionar.

O atraso do timelock vai de 48 horas para zero. O proprietário decidiu em 2026-10-09: o Safe agendou updateDelay(0), executável a partir de 2026-10-11 19:49 UTC. Até lá, toda operação do timelock espera 48 horas, e as já agendadas mantêm seus horários de prontidão. A partir de então, o Safe (2-de-3) pode agendar e executar no mesmo bloco: o proprietário do pool chama através do steward (cujos limites de política ainda se aplicam), a devolução do steward, uma atualização do cofre de ações e as configurações com timelock dos motores e do SeatVaultV5. Cada uma ainda é pública na chain, mas não há tempo para reagir antes de ser executada.

Quatro maneiras de entrar no registro. Um convite da tesouraria (uma linha de $5 da tesouraria v4, financiada por taxas de criador de $PRIORS), um assento (alguém coloca cerca de cinco vezes o valor da linha em $PRIORS atrás do seu agente e o cofre de assentos de crescimento respalda uma linha de $50, após 10 empréstimos reembolsados), um fiador que aposta USDG e atesta por você diretamente, ou, desde 2026-09-28, uma linha de ações (você deposita tokens de ações da Robinhood e o cofre de ações respalda uma linha contra eles). Credores depositam USDG e ganham 50% de cada taxa.

O que foi encontrado antes do lançamento e corrigido. Um loop de auto-respaldo que tomava o rendimento do credor (corrigido com um bloqueio de taxa), um congelamento do limite de utilização (limite definido em 100%), uma recompensa de keeper explorável (definida em 0) e três problemas do cofre de assentos (ofertas vinculadas ao proprietário, assentos ociosos expiram, um portão de histórico além de um assento com preço muito acima da linha que abre). docs/SECURITY-v2.md lista cada descoberta com seu teste e o que permanece.

O que isso não compra: o v2 passou por várias revisões adversariais internas e uma revisão de segundo modelo das correções, mas nenhuma auditoria de terceiros. Nenhum caminho para o principal do credor foi encontrado, e isso ainda não é uma prova. Os tamanhos de lançamento permanecem pequenos exatamente por esse motivo. Leia, execute, integre; dimensione sua exposição como alguém que sabe que uma auditoria não aconteceu.

Participe: priors.trade tem uma página Participar (depósitos, assentos, raízes), /agent e /invite. docs/PARTICIPATE.md é o mesmo para código.


Dê ao seu agente um histórico de crédito na mainnet

git clone --recurse-submodules https://github.com/priors-agents/priors && cd priors
npm install
export PRIORS_KEY=0x…                    # the key that owns (or will own) the agent; env or .env only
npx priors-v2 join                       # registers an ERC-8004 identity for this key, prints its id
#   ask for an invite for that id at https://priors.trade/invite, then:
npx priors-v2 join --invite <code>       # treasury v4 opens a $5 line (you sign the pool consent)
npx priors-v2 borrow 5 --days 7          # $5 lands in your wallet
#   ... the agent does its work ...
npx priors-v2 repay --all                # principal + fee
npx priors-v2 status                     # line, loans, record

Execute os comandos npx dentro do clone: lá eles executam a CLI deste próprio repositório. Fora dele, npx priors é um pacote npm não relacionado e priors-v2 no npm é apenas um espaço reservado que imprime estas instruções, então nunca os execute com PRIORS_KEY definido em qualquer outro lugar.

A carteira precisa de um pouco de gás nativo, USDG suficiente para pagar a taxa (cerca de $0,012 em $5 por 7 dias) e, para um convite de autoatendimento, o título de 5 USDG (passo 2 abaixo). Um agente totalmente novo não pode ocupar um assento: npx priors-v2 join --seat <staker> aceita a oferta de assento de um staker somente depois que o agente reembolsou 10 empréstimos (novos assentos vão para o cofre de assentos de crescimento; os 10 assentos do SeatVaultV3 foram todos ocupados em 2026-09-29). Sem um convite, uma primeira linha vem de um fiador ou de uma linha de ações.

Ou assista em uma chain local descartável primeiro

git clone --recurse-submodules https://github.com/priors-agents/priors && cd priors
npm install
npm run quickstart

Isso inicia uma chain local, implanta os contratos v1 com mocks e percorre uma identidade ERC-8004 nova por todo o registro — registrar, aceitar a linha de $5 da tesouraria, tomar emprestado, manter, reembolsar, pontuar. O devnet local não migrou para o v2 ainda; o fluxo e o score têm o mesmo formato, as regras de respaldo diferem (a "capacidade conquistada" do v1 abaixo não existe no v2):

1. identity
   ERC-8004 agentId 2, owned by 0xEe7f…eeFf

2. first line
   line $5 from sponsor #1 — nobody approved this, it is a rule

3. borrow, hold, repay
   quote $5 for 7d: fee $0.011666, qualifies
   loanId 1 — $5 is in 0xEe7f…eeFf now
   … did work …

4. the record
   score 38/1000 · repaid 1 (1 qualified) · 35 dollar-days · fees paid $0.011666
   earned capacity $2.5 of its own, line now $7.5

Requer Foundry e Node 20+.

Registros sobrevivem a migrações

O passo a passo v1 foi executado de verdade na Robinhood Chain com USDG real, do início ao fim, através da CLI neste repositório, e seus registros já foram movidos duas vezes.

O agente #437 é o interessante, porque seu registro sobreviveu à migração para o contrato corrigido. Ele reembolsou duas vezes no pool original; esses dois empréstimos foram transportados por importRecords, e desde então ele tomou emprestado e reembolsou novamente no novo:

passotransação
tomar $5 emprestado por 8 dias, no novo pool0xff8c3e1f…
reembolsar principal + taxa0x0cfc083c…

npx priors report 437 leu o resultado de volta do pool v1: 3 empréstimos reembolsados, $15 de volume, $0,036665 de taxas pagas, sem inadimplências. Na transição para o v2, cada registro v1 foi importado novamente (importFromV1), e no v2 o agente #437 ainda mostra seus 3 empréstimos reembolsados — o objetivo de carregar histórico em vez de reiniciá-lo. O agente #443 veio pelo mesmo caminho.

Um registro e uma linha de crédito são coisas separadas, e uma migração carrega apenas o registro: capacidade não é importada, então após uma transição um agente mostra seu histórico completo com uma linha $0 e sem patrocinador até pedir um à tesouraria (firstLine, que somente o controlador da própria identidade pode chamar). É por isso que um agente recém-migrado aparece como sponsor #0 por um tempo. No v2, ele pede à tesouraria v4 (um convite), a um staker (um assento) ou a um fiador por uma nova linha.

Não há modo de demonstração em nada disso — mesmos contratos, mesmo registro ERC-8004, mesmo USDG.

Entregue ao seu agente de codificação em vez disso

Este repositório entrega o procedimento como uma skill de agente, então você não precisa ler nada disso:

# Claude Code
mkdir -p ~/.claude/skills && cp -r skills/priors ~/.claude/skills/priors

Então diga: "dê ao meu agente um histórico de crédito no Priors". A skill conhece os passos, em qual chain e pool está, o que fazer quando o limite de época da tesouraria é atingido, e que não deve afirmar que um agente está registrado quando não está. Codex e outros harnesses leem AGENTS.md na raiz do repositório, que carrega as mesmas instruções.

Plugin do Claude Code

A skill e o servidor MCP hospedado em uma única instalação. No Claude Code:

/plugin marketplace add priors-agents/priors
/plugin install priors@priors-agents

A skill roda como /priors:priors, e o servidor somente leitura conecta como plugin:priors:priors-read, sem chave. Para pagar, tomar emprestado e reembolsar com a carteira do próprio agente, adicione também o servidor local: skills/README.md tem o comando, que mantém a chave no seu ambiente.

Ou conecte via MCP

Somente leitura, hospedado, sem chave: adicione https://mcp.priors.trade/mcp (Streamable HTTP) a qualquer cliente MCP.

claude mcp add --transport http priors https://mcp.priors.trade/mcp    # Claude Code
codex mcp add priors --url https://mcp.priors.trade/mcp                 # Codex (terminal, IDE, ChatGPT desktop)

No Claude (web, desktop, celular), este link abre o formulário Adicionar conector personalizado com Priors preenchido. O VS Code o instala a partir de vscode:mcp/install?{"name":"priors","type":"http","url":"https://mcp.priors.trade/mcp"} (codificado em URL) ou code --add-mcp '{"name":"priors","type":"http","url":"https://mcp.priors.trade/mcp"}', e o Cursor a partir de cursor://anysphere.cursor-deeplink/mcp/install?name=priors&config= mais o base64 de {"url":"https://mcp.priors.trade/mcp"}. O ChatGPT o aceita no modo desenvolvedor (Configurações, Segurança e login), na página de plugins, sem autenticação.

Ele responde sobre o registro e o score de um agente, os números do pool, empréstimos recentes e os serviços do facilitador, e não pode assinar ou enviar nada. Também é um MCP App: em hosts que renderizam MCP Apps (Claude, ChatGPT, VS Code, Cursor, Goose), suas respostas vêm com uma visualização Priors, e request_borrow / request_repay preparam um empréstimo ou um reembolso como dois links onde o proprietário do agente confirma: Modo Go (go.priors.trade), com sua própria conta, ou o console do agente em priors.trade, com a carteira que possui o agente. Para pagar URLs x402, tomar emprestado e reembolsar com a carteira do próprio agente, execute o servidor local em packages/mcp (a chave permanece no seu ambiente). Ambos os pacotes estão no npm: npx -y @priors/mcp executa o servidor local, e npm i @priors/x402 instala o pagador. A partir de um clone, npm install na raiz os vincula em vez disso. O servidor local também está no Registro MCP oficial como io.github.priors-agents/priors, e o hospedado como io.github.priors-agents/priors-read. Desde 0.5.0, a carteira também pode manter USDG ocioso em poupança (um cofre USDG no Morpho: o dinheiro do próprio agente, com os riscos do cofre; veja packages/x402), e um empréstimo em uma linha SeatVaultV5 o atualiza primeiro. O Autopay (reembolsar cada empréstimo em dia a partir da carteira do agente) está nos pacotes e se recusa a rodar até que o AutoRepay v2 seja implantado. 0.2.11 carrega as correções de segurança da 0.5.0 para aqueles que permanecem na linha 0.2.

Ou pague por chamada

O mesmo registro é um endpoint x402 v2 pago: https://api.priors.trade/v1/report/{id} e /v1/score/{id}, 0,03 USDG cada na Robinhood Chain, liquidado via https://facilitator.priors.trade. Uma chamada não paga responde com 402 e os requisitos no cabeçalho PAYMENT-REQUIRED; packages/x402 paga (createPayer({ signer }).pay(url)). Comerciantes podem se cadastrar para o facilitador por conta própria em https://x402.priors.trade/merchants. Um comerciante também pode verificar quem está pagando antes de atender. recordGate em @priors/x402 lê o registro Priors do pagador antes de o facilitador ver o pagamento, e pode recusar inadimplentes, pedir empréstimos quitados ou precificar por registro. Um pagamento recusado não move nada (packages/x402).

As quatro etapas (v2)

1identidaderegister(uri) no registro ERC-8004, uma vez. Seu NFT é sua identidade. Já tem um id? Pule esta etapa (defina PRIORS_AGENT_ID se for anterior à v2 ou foi transferido para você). O pool nunca vê suas chaves, apenas o id.
2uma linhaConvite do tesouro: em priors.trade/invite você deposita um título de 5 USDG em InviteBond da carteira que possui o agente, prova ao bot do Telegram que é o dono, e o bot assina o convite do tesouro v4 para o seu id na hora; você o resgata com o consentimento do seu pool → $5 (no máximo $25 de novas linhas do tesouro por semana). O título volta assim que o agente quitar 3 empréstimos qualificados sem nenhum em aberto, ou após 4 dias se nunca receber uma linha; uma inadimplência o envia para a Safe, então pegar uma primeira linha e ir embora não rende nada. Assento: um staker oferece um assento de $PRIORS no seu id e você aceita → $50 no vault de assentos de crescimento, empréstimos de no máximo 7 dias (seu agente precisa de 10 empréstimos quitados primeiro). Avalista: uma raiz avaliza qualquer tamanho com seu consentimento assinado. Linha de ações: você deposita tokens de ações aceitos da Robinhood e o vault de ações garante uma linha contra eles (veja "Linhas de ações" abaixo).
3pegar emprestado, manter, pagarquoteFee → cerca de $0,011666 para $5 em 7 dias. borrow → USDG na sua carteira. Faça o trabalho. repay → principal + taxa. Pagar antes de 7 dias funciona, mas não conta: dias-dólar são a pontuação.
4crescerTesouro v4 raise(agentId) → $25, após 3 empréstimos qualificados, 14 dias, pontuação ≥ 100 e um registro limpo: em espera desde 2026-10-12 (a Safe definiu minQualified para 1.000.000). Além disso, as linhas crescem encontrando um avalista maior: a v2 não tem crédito "ganho" sem garantia.
npx priors-v2 join [--invite <code> | --seat <staker>]   # identity, then a line
npx priors-v2 borrow <amount> [--days N]
npx priors-v2 repay [--all]
npx priors-v2 status
npx priors score <agentId>        # v1 CLI, still reads the paused v1 pool's history
npx priors report <agentId>

Ou a partir de JavaScript, no ethers v6, dentro do clone (os imports priors/… resolvem para este repositório lá; não é publicado no npm com esse nome):

import { resolveV2 } from "priors/env";          // deployments/<chainId>.v2.json, RPC_URL, PRIORS_KEY
const { priors } = await resolveV2();
await priors.redeemInvite(agentId, inviteCode);  // priors-invite:<id>:<expiry>:<signature>
const { loanId } = await priors.borrow(agentId, 5, 7 * 86400);
await priors.repay(loanId, { agentId });
await priors.status(agentId);
// x402: pay per call, borrowing only the shortfall from the line (docs/FLOAT.md)
await priors.pay("https://merchant.example/api", { agentId, maxBorrow: 5_000000n });

docs/PARTICIPATE.md cobre todos os papéis (credor, staker, avalista, agente); docs/FLOAT.md cobre pagamentos x402 a crédito e o facilitador público em https://facilitator.priors.trade; docs/AGENTS.md é o guia para construtores de agentes.

Um agente completo em vez disso: agent001 possui sua própria carteira, entra no Priors, pega emprestado e paga antes do vencimento por conta própria, vende um serviço via x402 e conversa a partir de um terminal ou Telegram. Seus movimentos de dinheiro passam por @priors/mcp. agent001 sandbox executa o loop completo em um fork local com dinheiro fictício. Também carrega uma habilidade Priors para OpenClaw e Hermes Agent (skills/priors; no Hermes, hermes skills install priors-agents/agent001/skills/priors): verifique o registro de um agente antes de pagá-lo, e pague, pegue emprestado e quite com as ferramentas MCP.

Linhas de ações

Desde 2026-09-28 o vault de ações (StockVault, raiz #6424) garante uma linha com os tokens de ações da Robinhood do próprio agente. O dono do agente deposita um dos 35 tokens aceitos (listados com seus feeds Chainlink em deployments/stock-assets.4663.json) e o vault avaliza uma linha com o loan-to-value desse token: 25-50% do valor do depósito, mais até 15 pontos por um registro de quitação de crédito do tesouro, no máximo $250. Empréstimos nela são empréstimos comuns do pool, com a mesma taxa, termos e regras de inadimplência. Cada novo empréstimo é verificado contra o valor da garantia no momento, então uma queda de preço reduz o que pode ser sacado, e novo crédito espera durante uma pausa de empréstimos (um movimento brusco de preço, uma mudança de multiplicador como um split, um token pausado ou bloqueado). O encerramento devolve cada token, de uma vez sem empréstimo em aberto, caso contrário com o último pagamento; uma linha sem uso por 30 dias (7 se nunca sacada) pode ser encerrada por qualquer pessoa. Uma inadimplência confisca o depósito inteiro.

import { resolveV2 } from "priors/env";
const { priors } = await resolveV2();                    // the vault's address comes from deployments/4663.v2.json
await priors.stockAssets();                              // each token's price, whether the vault lends now, its LTV
await priors.openStockLine(agentId, spyToken, "0.05");   // deposit 0.05 SPY and open the line (signs the consent)
const { loanId } = await priors.borrow(agentId, 5, 7 * 86400);
await priors.repay(loanId, { agentId });
await priors.closeStockLine(agentId);                    // every token back to the depositor

status(agentId) mostra os tokens por trás de uma linha de ações. @priors/mcp (stock_assets, stock_position) e os auxiliares de crédito de @priors/x402 também leem o vault, desde 0.2.0; 0.2.1 traz as correções de segurança dos relatórios privados. Uma linha de ações conta como dinheiro próprio do tomador no Priors Score v2 (pesos 2.0.1). Os tokens são da Robinhood, sob seus próprios termos (incluindo onde podem ser mantidos), e seu emissor pode pausar, bloquear, queimar ou atualizá-los. O vault é o único contrato Priors atualizável: o que seu dono, a Safe, pode e não pode fazer está em docs/SECURITY-v2.md.

O que encerra

Perder um vencimento por mais de três dias e qualquer pessoa pode marcar o empréstimo como inadimplente. O registro é marcado como inadimplente para sempre, a identidade nunca mais pode pegar emprestado ou avalizar ninguém, e o endereço do dono também é marcado. O patrocinador paga: as ações bloqueadas de um avalista (ou do tesouro) são queimadas pelo principal e pela taxa; em um assento, metade dos $PRIORS do staker é queimada. Seu galho queima no bosque em priors.trade, em público, e permanece queimado.

Não há apelação. É por isso que a pontuação significa algo.

Como funciona

  • Toda linha é 100% garantida. A capacidade vem apenas do USDG de um avalista, bloqueado como ações do pool. Ações bloqueadas ganham rendimento de credor como qualquer outra e garantem as linhas que sua raiz avaliza, 1:1. Uma inadimplência queima as ações do avalista no valor de principal e taxa, então o preço da ação nunca cai e credores nunca têm perda de empréstimo.
  • Consentimento e transferência. Uma linha precisa do consentimento EIP-712 do dono do agente, então ninguém é patrocinado contra sua vontade. Sem empréstimo em aberto, um agente pode mudar para outro patrocinador, então nenhum patrocinador fica preso para sempre.
  • Quatro tipos de avalista. Tesouro v4 (raiz #6228) é financiado por taxas de criador de $PRIORS e avaliza por regra: $5 contra um convite, $25 uma vez experiente, no máximo $100 de novas linhas por semana, linhas ociosas reivindicadas após 30 dias. O vault de assentos (SeatVaultV3, raiz #6234) garante uma linha de $5 atrás de um agente com 3 empréstimos quitados que um staker coloca um assento de $PRIORS; seus 10 assentos foram todos ocupados em 2026-09-29, então novos assentos vão para o vault de assentos de crescimento (abaixo). Stakers ganham a parcela do patrocinador das taxas desse agente e perdem metade do assento em uma inadimplência. O vault de ações (StockVault, raiz #6424) garante uma linha contra os tokens de ações do próprio agente e os confisca em uma inadimplência. Qualquer pessoa pode operar uma raiz com $10+ de participação e avalizar com consentimento, com um prêmio de até 2% por 30 dias. O vault de assentos de crescimento (SeatVaultV4, raiz #6466) está ativo desde 2026-09-29: os mesmos assentos para uma linha de $50, para agentes com 10 empréstimos quitados, em empréstimos de no máximo 7 dias (docs/PRIORS-GROWTH-SEATS.md).
  • Um único loop de dinheiro. As taxas de empréstimo dividem 50 / 25 / 25 entre credores, o patrocinador e a reserva.
  • Uma pontuação que é uma função pura do registro. score(agentId) e creditReport(agentId) em CreditLensV2, a mesma fórmula da v1, e cada entrada é um evento que você pode recalcular por conta própria. A pontuação v1 é dias-dólar: principal × quanto tempo você realmente manteve (limitado ao prazo contratado), somado sobre empréstimos quitados — até 400 pontos. Mais empréstimos qualificados (prazo ≥ 7 dias, 20 pontos cada, até 200), garantia (até 150), idade (até 150). Sua própria inadimplência é 0, sempre. O caminho mais barato para uma pontuação alta é o honesto: pegue um valor significativo emprestado, mantenha por semanas, pague.
  • Priors Score v2, fora da cadeia e aberto. Ativo desde 2026-09-27 em https://priors.trade/api/score-v2, na API paga e em ambos os servidores MCP: conta apenas risco que outra pessoa assumiu, atrasos, renda x402 de pagadores que não são o próprio agente, e degraus de confiança que precisam de tempo. Motor, pesos e testes estão em sdk/ e scripts/; como funciona e o que impede jogar com ele: docs/SCORE-v2.md. A pontuação on-chain acima está inalterada.
  • Verifique um agente antes de lidar com ele. https://priors.trade/api/check?agent=<id> ou ?address=<0x…>: grátis, sem chave, CORS aberto. Retorna o registro de pagamento e a pontuação do agente, e um selo README em https://priors.trade/api/badge/<id>.svg. Veja docs/CHECK-API.md.
  • Leia a pontuação na cadeia, com suas evidências. Priors publica a pontuação v2 de cada agente no registro de reputação ERC-8004; desde 2026-10-05 cada nota carrega seu próprio arquivo (a linha em um bloco, pagamentos pontuais com suas transações, o pagamento do pool ao agente), com hash na cadeia. node scripts/verify-attestation.mjs <agentId> verifica um apenas da cadeia: docs/ATTESTATION-v2.md.

docs/DESIGN.md tem a matemática e ataques da v1; docs/SECURITY-v2.md os achados da v2.

Os parâmetros, como os contratos os definem

Tamanho do empréstimo$5 – $500
Prazo1 – 30 dias
Taxa1% por 30 dias, pro rata, mais o prêmio do patrocinador (0 em linhas do tesouro e assentos)
Divisão da taxa50% credores · 25% patrocinador · 25% reserva
Período de retenção do credor7 dias. Sacar antes deixa 0,5% para os credores que ficaram
Período de carência antes de alguém marcar você como inadimplente3 dias
Conta como empréstimo qualificado em7 dias
maxUtilizationBps · keeperBounty10000 · 0
Tesouro v4primeira linha $5 · aumento para $25 · $100 de novas linhas por época de 7 dias · ocioso após 30 dias
Assentos (SeatVaultV3, raiz #6234)assento ≈ $25 de $PRIORS (12.000 em 2026-09-25, redimensionado com o preço pelo SeatSizer) · linha $5 · 50% queimado em inadimplência · agente precisa de 3 empréstimos quitados · assento expira após 30 dias ociosos · $50 de novas linhas por época de 7 dias
Assentos de crescimento (SeatVaultV4, raiz #6466; ativo desde 2026-09-29)assento ≈ 5 linhas de $PRIORS (120.000 na implantação, redimensionado por seu próprio SeatSizer dentro de [110.000, 20.000.000]) · linha $50 · 50% queimado em inadimplência · agente precisa de 10 empréstimos quitados · empréstimos de no máximo 7 dias · 20 assentos abertos · assento expira após 30 dias ociosos · $1.000 de novas linhas por época de 7 dias · assentos de protocolo fechados
Linhas de ações (StockVault, raiz #6424)35 tokens de ações · linha 25-50% do valor do depósito por token, mais até 15 pontos por um registro de crédito do tesouro quitado, nunca acima de 70% · no máximo $250 por linha · $1.000 de novas linhas por época de 7 dias · $1.000 de linhas abertas por token ($500 em CRCL, CRWV, NBIS, RGTI, SNDK, USAR) · depósito inteiro confiscado em inadimplência · ocioso após 30 dias (7 se nunca sacado)
Participação mínima da raiz$10
Dono do poolPoolSteward desde 2026-10-06 (sem dono, não atualizável), que apenas o TimelockController pode chamar (a Safe propõe e executa, sem admin; um atraso de 48 h, nenhum desde 2026-10-11 19:49 UTC), dentro de uma política fixa: patrocinador ≤ 25%, reserva ≤ 40%, credores ≥ 35%, taxa ≤ 2% por 30 dias; a Safe é guardiã (pausa ≤ 14 dias, saídas nunca pausam)

Robinhood Chain

A cadeia alvo é Robinhood Chain mainnet (id 4663).

Endereço
CreditPoolV2 (ativo)0x281210097f0de7A8FB6F87310AF0f089c9C8DE21
CreditLensV2 (visualizações de pontuação e relatório)0x9d7035722bd42C551f82FEB9FDDd17453AEF3D9B
TreasurySponsorV4 (ativo, raiz #6228, com convite)0x0c5091235A25bBFD3F5a009cBe04120D0CBAD573
SeatVaultV3 (ativo desde 2026-09-25, raiz #6234)0x59D155C42A9263fA7596867b992bB3e84dF680a9
SeatVaultV2 (aposentado e pausado, raiz #6229; substituído pelo V3 para auditoria V-2)0x6D934C07a33E7285cE691A9B258cdB53F18e6B5F
PoolSteward (dono do pool desde 2026-10-06; apenas o timelock pode chamá-lo)0x6D9D4135417E0AB2aafc69Fc842525Af279a5Da8
TimelockController (controla o PoolSteward; atraso de 48 h, nenhum desde 2026-10-11 19:49 UTC)0x5d984C274035F81BB327d532897a902C5125F87c
SeatSizer (dono do seat vault desde 2026-09-26; redimensiona o seat a partir do preço de $PRIORS, dentro dos limites)0xd24B6484f4E68d72Fd2d3AF7bD036560B2ed5E61
SeatVaultV4, o seat vault de crescimento (ativo desde 2026-09-29, raiz #6466)0xb1c3a04496238D62E3c93118C297163855e22192
SeatSizer do seat vault de crescimento (dono dele; o Safe é dono do sizer)0x97C4e594D458f8BBE961d5384Bbd8a9Cc2D18777
SeatVaultV5 (ativo desde 2026-10-11, raiz #8762; lastro somente do proprietário; substituiu a implantação de 2026-10-09, 0xdE29D3A627d77CFA13c5331C1B7B181a4C5B752E, raiz #8641, que nunca teve um livro e cujo USDG da raiz foi movido para ele)0xC999014C6218EC41f0aE412d49AE8f2aA4c539fD
Bibliotecas vinculadas do SeatVaultV5 (src/v5/; V5 as chama por DELEGATECALL)V5Pos 0xd2d393Daf7bABE6ac090a97765407256673Bf9Bc, V5Steps 0x3a4B951E0eae25DD327224395ecE0C6fD6345f94, V5Book 0x90992387BbfBcF6aB179B33535d283FEE2d832F4, V5Records 0x23C3660Cd36401F6adE16f51f81F629a6aE6d826, V5Exit 0x0BB0CF27E9a0f5DB38a3F58fc31b1f90D784CbC7, V5Auto 0x22914DF387771bCB167Bfd1777678887D1AB1375, V5Sync 0x2FE6cC16DA24694D48BbDD8C83d4732ca23276F4, V5View 0xE5175D7C9C30E210197D23A45A3e0bbe66cF1846, V5Lens 0x294a483e54aBE64d2037df370974304C0F3B09F7
StockVault (ativo desde 2026-09-28, raiz #6424; linhas contra tokens de ações; um proxy Transparent, StockVaultProxy)0xbEcd07EC689988e16b870C121756C4c2C8cb02B6
Implementação do StockVault (atrás do proxy; desde 2026-10-11)0x796FCcBdab6d473Ab22728D246AcAea0905b8E0B
ProxyAdmin do StockVault (a única forma de atualizar o vault; de propriedade do timelock desde 2026-10-07, antes do Safe; sem atraso desde 2026-10-11 19:49 UTC)0x5174A18550a295cd25aF59416a56B7e4c38C8Afc
Safe (2-de-3; propõe ao timelock, é dono do treasury v4 e de ambos os SeatSizers, portanto de todos os outros poderes de seat vault, e das configurações do stock vault)0x20c6816B2419616238772591965E6E9AbE493fD5
RevenueRouter (o sweep do steward e as taxas dos vaults vão para cá)0xb2E217C5841a968C48Eee41DCbF7D2a03cCA4F43
BuyAndBack (motor 1)0xEe40675aBEC90E52211526845433C10c80fD569E
PriorsLiquidity (motor 2)0xbEC159832D05749557F3f972c4823979C8dC8451
SwapLimiter (guarda de profundidade dos motores)0x4535b1d92ebBe8176463dE4b58Ca9B66A231eb0E
KeeperHelper (keeper do SeatSizerV4 desde 2026-10-06; o único ponto de entrada da chave do keeper)0x3Ba233d2ac1C6233C5fA954C2DaaD83fcCFE5372
InviteBond (o vínculo que um convite automático precisa; sem administrador)0x8BE478c754D9124D11e78dB20F5bf4dA45403275
Registro de Identidade ERC-80040x8004A169FB4a3325136EB29fA0ceB6D2e539a432
USDG (dólar de 6 decimais da Robinhood, o ativo do pool)0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
Token $PRIORS (Pons V2)0xeDBf91223639800BCd5756815CAf908Df3b890bE
Facilitador x402https://facilitator.priors.trade (cadastro de comerciante: https://x402.priors.trade/merchants)
MCP hospedado (somente leitura)https://mcp.priors.trade/mcp
API paga (x402 v2, 0.03 USDG)https://api.priors.trade
RPC (oficial; o único que atende eth_getLogs)https://rpc.mainnet.chain.robinhood.com
Backups de RPC, para chamadas simpleshttps://robinhood-rpc.publicnode.com, https://rpc.ordofi.network
Explorerhttps://robinhoodchain.blockscout.com
CreditPool v1 (pausado, substituído pelo v2; histórico importado)0x0259889e6EBab1a18CeE7e62Bc5B9648FB6C44e5
TreasurySponsor v3 (pool v1, substituído pelo v4, patrocinador #486)0x59f212317b42D308E81EaF8C078fc8189E2a77Df
TreasurySponsor v2 (pool v1, substituído, patrocinador #461)0x9338d18b5E7faC5ce06a6AD1Af33Db68fE0b4daC
ReserveFunder (v1)0x32349B1Ad07513B5Fa6dCC3dbDC0B5ed17FcB72d
CreditPool (pools v1 mais antigos, pausados, não usar)0x4B9fb2dE6BE54aF037683A75F3C82c81C3EEd122, 0xd970472b2904D5923882af034cea4067AF0AaC95

Os endereços são resolvidos a partir de deployments/4663.v2.json (v2) e deployments/4663.json (v1, mantido para histórico e marcado como pausado), então nada acima precisa ser copiado à mão. Os contratos substituídos são listados apenas para que um link antigo seja reconhecível como morto, em vez de misterioso.

Por que os credores têm um período de retenção

A fatia do credor de uma taxa chega ao preço da ação no momento em que um empréstimo é pago, então quem quer que detenha ações naquele instante a coleta. Uma auditoria mostrou as duas formas de abuso: um bot depositando antes de um pagamento e saindo logo depois levou $2,70 de uma taxa de credor de $3, deixando $0,30 para o credor que havia carregado trinta dias de risco de inadimplência — e um tomador poderia envolver seu próprio pagamento em um depósito e uma retirada, em uma única transação, e recuperar 54% da sua própria taxa.

Sair dentro de 7 dias agora deixa 0,5% para trás, que permanece no pool para os credores que não saíram. Isso é suficiente para fazer uma posição de duração zero perder dinheiro: o sanduíche do tomador custa $549,54 contra os $505,00 que ele devia. É uma constante no contrato, não um parâmetro, tanto no v1 quanto no v2 — uma taxa de saída ajustável pelo proprietário seria uma alavanca para confiscar depósitos, e o proprietário não pode alcançar o principal do credor aqui. Mantenha por mais de 7 dias e é zero.

RPC_URL aceita uma lista separada por vírgulas e tenta em ordem — a primeira entrada primeiro, a próxima apenas quando aquela falhar ou se recusar a atender a solicitação:

RPC_URL=https://rpc.mainnet.chain.robinhood.com,https://robinhood-rpc.publicnode.com,https://rpc.ordofi.network

Vale a pena fazer: o endpoint oficial limita a taxa sob carga, e um 429 lá é, de outra forma, o fim da leitura. Os backups aceitam chamadas simples de boa vontade, mas não podem servir histórico de eventos — publicnode responde 403 Archive requests require a personal token e ordofi responde -32005 the network is busy — então qualquer coisa que leia logs ainda precisa do endpoint oficial acessível. O SDK conhece a diferença: um nó que se recusa a servir move para a próxima entrada, enquanto um revert é retornado como está, porque um revert é a resposta da cadeia e idêntico em todos os lugares.

Repositório

src/CreditPoolV2.sol         v2 pool: lenders, backers (roots), consent, handoff, fee lock, 100% backing
src/libraries/PoolV2Lib.sol  v2 pool's linked library (hooks, consent digest)
src/CreditLensV2.sol         v1-shaped score and credit-report views on the v2 pool
src/TreasurySponsorV4.sol    the $PRIORS treasury as a v2 root: invite + consent opens a line, rules size it
src/SeatVaultV3.sol          $PRIORS seats: a staker's tokens behind an agent, the vault backs its line (live)
src/SeatVaultV4.sol          growth seats: V3 plus the slash split, protocol seats, a loan-term cap (live; no new seats)
src/SeatVaultV5.sol          the owner's own $PRIORS behind its agent's line, the root's USDG backing it (live, owner-only)
src/v5/                      SeatVaultV5's linked libraries (V5Book, V5Records, V5Exit, ...) and its storage, types, math
src/SeatSizer.sol            owns a seat vault: keeps the seat at ~5 lines of $PRIORS from the pool price (live)
src/SeatVaultV2.sol          the previous seat vault (retired; V3 closes audit V-2)
src/InviteBond.sol           the bond behind an automatic invite: back after seasoning, to the Safe on default
src/StockVault.sol           lines against Robinhood stock tokens: per-token LTV, lending holds, seizure on default (live)
src/StockVaultProxy.sol      the stock vault's Transparent proxy; its ProxyAdmin (the timelock's since 2026-10-07) alone upgrades it
src/PoolSteward.sol          the pool's owner since 2026-10-06: the timelock's calls against a fixed policy, the daily sweep
src/RevenueRouter.sol        where the sweep and the vaults' fees go, and their split
src/BuyAndBack.sol           engine 1: buys $PRIORS on its Pons pool
src/PriorsLiquidity.sol      engine 2: $PRIORS liquidity
src/SwapLimiter.sol          the engines' depth guard (src/libraries/PoolDepth.sol, EngineMath.sol)
src/KeeperHelper.sol         the keeper key's one entry point: SeatSizerV4's price and the limiter's depth snapshot
src/GuardianPause.sol        the guardian pause the engines share
src/CreditPool.sol           v1 pool (paused; its records were imported into v2)
src/TreasurySponsor.sol      v1 treasury (v3)
src/ReserveFunder.sol        v1 creator-fee sweep into the reserve
src/libraries/ScoreLib.sol   the trust score (shared by v1 and the v2 lens)
src/mocks/                   MockUSDC (6 decimals), MockIdentityRegistry, MockPonsFeeEscrow
test/                        1,066 tests: v2 units, invariants, audit PoCs and fixes (audit-v2/, audit-final/,
                             review-v2/, audit-v4/, audit-r2/, audit-sizer/), the stock vault's (StockVault*), the growth seat
                             vault's (SeatVaultV4*), SeatVaultV5's (v5/), and the v1 suite
script/DeployV2.s.sol        deploys the v2 set under a 48 h timelock (the live one's delay is 0 from 2026-10-11 19:49 UTC),
                             writes deployments/<chainId>.v2.json
script/Deploy.s.sol          v1 deploy (mocks on dev chains), writes deployments/<chainId>.json
sdk/priors-v2.mjs            the v2 client on ethers v6, ABIs included
sdk/stock-vault.mjs          stock-vault reads: accepted tokens, prices, holds, a line's collateral
sdk/float.mjs                x402 pay() that borrows only the shortfall; sdk/x402.mjs has the payload constants
sdk/priors.mjs               the v1 client
sdk/env.mjs                  resolves chain, deployment record (v1 and v2) and signer
packages/x402/               @priors/x402: x402 v2 USDG preset for Robinhood Chain, facilitator config, a payer that
                             borrows the gap, the merchant's record gate, savings and Autopay helpers
packages/mcp/                @priors/mcp: local MCP server with the agent's wallet (pay_url, borrow, repay, savings,
                             Autopay, reads)
bin/priors-v2.mjs            the v2 CLI (`npx priors-v2`)
bin/priors.mjs               the v1 CLI (`npx priors`), for v1 history and the local devnet
scripts/devnet.mjs           local v1 chain, deployed and bootstrapped so firstLine() actually works
scripts/quickstart.mjs       devnet + one agent through the entire record
skills/priors/SKILL.md       the agent skill
skills/.claude-plugin/       skills/ is also the Claude Code plugin `priors`: the skill and the hosted MCP (skills/.mcp.json)
.claude-plugin/              the Claude Code marketplace `priors-agents` that lists it
docs/PARTICIPATE.md          lenders, stakers, backers and agents on v2
docs/FLOAT.md                credit as float: x402 payments on a line
docs/SECURITY-v2.md          every known v2 finding, its fix or residual, and its test
docs/AGENTS.md               guide for agent builders
docs/CHECK-API.md            the free check API and badge: an agent's record by id or address
docs/ATTESTATION-v2.md       the registry note's file and how to verify it (scripts/verify-attestation.mjs)
docs/DESIGN.md               the v1 math, the attacks, the parameters
SECURITY.md                  how to report a vulnerability, what is in scope, what is already fixed
BOUNTY.md                    what a finding pays, what is in scope on chain, and the safe harbour

Encontrou algo? SECURITY.md — use o relatório privado de vulnerabilidades deste repositório, e por favor não coloque detalhes em uma issue pública. BOUNTY.md diz o que vale; o teto é pequeno e dizemos isso de antemão, em vez de depois que você passou uma semana.

Trabalhando nisso

forge test                     # 1,066 tests, all green (fork-only tests skip without FORK_RPC)
npm test                       # SDK, CLI and publish-guard checks (needs Foundry for the v1 end-to-end run)
npm run test:v2                # the v2 SDK and x402 client, network-free
npm run devnet                 # local chain + deployed, bootstrapped v1 pool
npm run quickstart             # devnet + the full agent flow
bash scripts/check-public.sh   # fails if a credential ever reached a tracked file

CreditPoolV2 compila com via-IR em optimizer_runs = 1 para caber no limite de 24 KB (uma restrição por arquivo em foundry.toml); todo o resto compila como antes. Os contratos não são atualizáveis, exceto o stock vault: uma mudança de código só chega aos usuários através de uma nova implantação, ou, para StockVault, uma atualização através do seu ProxyAdmin, que o timelock possui desde 2026-10-07 (o Safe agenda em público; roda 48 horas depois, no mínimo, até 2026-10-11 19:49 UTC, e a partir daí no bloco em que é agendado). src/StockVault.sol permanece byte-idêntico ao código verificado na cadeia, então forge fmt o ignora.

Riscos honestos

  • A demanda é inicial. Os agentes precisam principalmente de dinheiro para inferência e chamadas de API. Os volumes são reais, mas pequenos.
  • Os patrocinadores carregam o risco de crédito. No v2, esse é o ponto: uma inadimplência custa ao seu patrocinador, não aos credores. Patrocine agentes aos quais você emprestaria você mesmo.
  • Os seats são precificados em um token volátil. Um seat impede uma linha roubada apenas enquanto metade dele vale muito mais do que a linha. Se $PRIORS colapsar, o tamanho do seat precisa mudar (veja docs/SECURITY-v2.md, X-3).
  • Isto não é uma auditoria. O v2 passou por revisões adversariais internas, não uma auditoria de terceiros. O v1 foi lançado com um defeito de perda de credor que os invariantes randomizados não pegaram. Assuma que há outro.

v1: o que aconteceu antes

O pool v1 rodou na Robinhood Chain até a transição para o v2, e agora está pausado. Este é o seu registro, como foi escrito enquanto o v1 estava ativo; é mantido porque é a história sobre a qual o v2 foi construído.

status do v1: o que encontramos e o que fizemos a respeito

Uma revisão encontrou uma maneira de os credores perderem principal: markDefault() liberou o todo do lastro delegado de um agente no seu primeiro default, então um segundo default do mesmo agente não encontrou nada para cobrar. Escrevemos o contraexemplo como um teste, o commitamos falhando, e o deixamos público enquanto ainda estava quebrado.

Está corrigido. Um default agora consome apenas a fatia responsável da delegação por empréstimo; o resto continua lastreando os outros empréstimos abertos desse agente e é liberado quando o último fecha, e o crédito ganho é baixado contra dívida ruim e aposentado na liquidação. O teste que provou o bug ainda está na suíte, e passa:

forge test --match-test test_multipleDefaultsKeepLendersWholeWithoutEarnedExposure -vv

test/DefaultAccounting.t.sol adiciona os casos que fazem a correção significar algo: defaults parciais, pagamento após default, múltiplos filhos, recurso de sub-patrocinador por default, um patrocinador morto, defaults de raiz, e o bloqueio de reserva. forge test é 97 passados, 0 falhas, invariantes incluídos.

O que isso não compra: nenhuma revisão independente da economia foi feita, e invariantes randomizados passaram direto pelo bug original — um fuzzer que nunca dá default no mesmo agente duas vezes reporta verde para sempre. Os limites de lançamento permanecem pequenos exatamente por esse motivo. Leia, execute, integre contra; dimensione sua exposição como alguém que sabe que uma auditoria não aconteceu.

O pool está ativo na mainnet da Robinhood Chain (cadeia 4663), semeado pequeno de propósito: 150 USDG de liquidez de credores, 75 na reserva de primeira perda, 65 apostados pelo tesouro. Os endereços vêm de deployments/<chainId>.json, então npx priors doctor o resolve sem configuração. npm run quickstart ainda constrói uma cadeia local descartável em cerca de trinta segundos se você preferir não tocar na mainnet.

Um segundo defeito foi encontrado após o lançamento, e agora foi corrigido e reimplantado. Um patrocinador raiz podia avalizar stake + earned; quando a delegação deu default, markDefault limitou a responsabilidade da raiz ao seu stake e cobrou o déficit da reserva — mas nunca aposentou o earned da raiz. O mesmo crédito ganho então lastreou uma delegação inadimplente e permaneceu como capacidade de empréstimo da própria raiz: a reserva pagou duas vezes, reserve >= totalEarned quebrou, e os credores perderam principal. Vale ser preciso sobre o que não estava errado: vouch() permitir que uma raiz delegasse mais do que seu ganho. O stake de uma raiz é dinheiro, então essa delegação é lastreada; exigir delegatedOut <= earned para raízes quebraria o tesouro, que avaliza cada linha a partir do stake com earned = 0. A permissão estava certa — a contabilidade no default estava incompleta.

test/ReviewPoC_RootEarnedDoubleSpend.t.sol é a prova de conceito original, agora invertida no guarda de regressão: executa o ataque movimento por movimento e afirma a contenção. Reverta a correção e ela falha nomeando o invariante quebrado. O pool foi migrado para o bytecode corrigido, carregando o registro de pagamento de cada agente — veja importRecords e test/HistoryImport.t.sol — e o bloqueio minStake que havia sido usado como substituto da correção é levantado, então patrocinadores raiz de terceiros funcionam novamente.

O pool antigo está pausado e abandonado. $10 de stake estão presos nele para sempre, atrás de duas linhas de crédito que já foram dadas: unvouch é onlyController(sponsor) e o TreasurySponsor não expõe nenhuma, então uma linha não pode ser retirada. Isso é uma propriedade de design, não um acidente, e é exatamente a razão pela qual o onboarding é finito.

Consequência prática: o onboarding é finito. O tesouro avaliza $5 por agente a partir de seus próprios 65 USDG de stake, então o beta acomoda treze agentes no total. A capacidade cresce apenas quando as taxas de criador de $PRIORS são varridas para o tesouro — manualmente durante o beta. Não confie nessa contagem quando ela tiver um dia de idade: priors.trade mostra quantas primeiras linhas restam, lidas ao vivo da cadeia, e o mesmo faz npx priors report 445 (available ÷ $5).

Licença

MIT