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
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 adicionehttps://mcp.priors.trade/mcpa 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 dedeployments/4663.v2.json, entãonpx priors-v2 statuse 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.SeatVaultV5está 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.mdlista 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:
| passo | transação |
|---|---|
| tomar $5 emprestado por 8 dias, no novo pool | 0xff8c3e1f… |
| reembolsar principal + taxa | 0x0cfc083c… |
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)
| 1 | identidade | register(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. |
| 2 | uma linha | Convite 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). |
| 3 | pegar emprestado, manter, pagar | quoteFee → 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. |
| 4 | crescer | Tesouro 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)ecreditReport(agentId)emCreditLensV2, 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 emsdk/escripts/; 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 emhttps://priors.trade/api/badge/<id>.svg. Vejadocs/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 |
| Prazo | 1 – 30 dias |
| Taxa | 1% por 30 dias, pro rata, mais o prêmio do patrocinador (0 em linhas do tesouro e assentos) |
| Divisão da taxa | 50% credores · 25% patrocinador · 25% reserva |
| Período de retenção do credor | 7 dias. Sacar antes deixa 0,5% para os credores que ficaram |
| Período de carência antes de alguém marcar você como inadimplente | 3 dias |
| Conta como empréstimo qualificado em | 7 dias |
maxUtilizationBps · keeperBounty | 10000 · 0 |
| Tesouro v4 | primeira 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 pool | PoolSteward 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-8004 | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 |
| USDG (dólar de 6 decimais da Robinhood, o ativo do pool) | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
| Token $PRIORS (Pons V2) | 0xeDBf91223639800BCd5756815CAf908Df3b890bE |
| Facilitador x402 | https://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 simples | https://robinhood-rpc.publicnode.com, https://rpc.ordofi.network |
| Explorer | https://robinhoodchain.blockscout.com |
0x0259889e6EBab1a18CeE7e62Bc5B9648FB6C44e5 | |
#486) | 0x59f212317b42D308E81EaF8C078fc8189E2a77Df |
#461) | 0x9338d18b5E7faC5ce06a6AD1Af33Db68fE0b4daC |
0x32349B1Ad07513B5Fa6dCC3dbDC0B5ed17FcB72d | |
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.soladiciona 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ãonpx priors doctoro resolve sem configuração.npm run quickstartainda 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,markDefaultlimitou a responsabilidade da raiz ao seu stake e cobrou o déficit da reserva — mas nunca aposentou oearnedda 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 >= totalEarnedquebrou, 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; exigirdelegatedOut <= earnedpara raízes quebraria o tesouro, que avaliza cada linha a partir do stake comearned = 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 — vejaimportRecordsetest/HistoryImport.t.sol— e o bloqueiominStakeque 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