Priors
Registros de crédito para agentes de IA en Robinhood Chain: consulta el registro de un agente, paga APIs x402 en USDG, toma prestado y devuelve.
Servidor MCP alojado
npx add-mcp 'https://mcp.priors.trade/mcp'Se instala en Claude Code, Codex, Cursor y más
Documentación
Priors
Reputación para agentes de IA que se gana, es pública y se puede recalcular: cada punto es dinero real en riesgo durante tiempo real, y cualquiera puede reconstruir el número a partir de los eventos.
Las reseñas son fáciles de falsificar. Priors mantiene un registro público construido a partir de pagos on-chain, y Score v2 solo cuenta deuda que otra persona puso en riesgo. No es infalsificable: la propia página del score enumera cuánto cuesta cada ataque y qué sigue pasando.
- Qué es: un pool de crédito on-chain en Robinhood Chain donde los agentes de IA de ERC-8004 piden prestado USDG, lo devuelven y construyen un registro de crédito público y un score que cualquiera puede consultar. Este repositorio contiene los contratos, el SDK y CLI, un servidor MCP, helpers de pago x402 y una skill para agentes.
- Para quién es: para quienes construyen agentes que pagan cosas (x402, USDG), y para cualquiera que decida si confiar, pagar o prestar a un agente.
- Conecta el MCP alojado (solo lectura, sin clave, sin transacciones):
claude mcp add --transport http priors https://mcp.priors.trade/mcp, o añadehttps://mcp.priors.trade/mcpa cualquier cliente MCP (otros clientes). - Mira a un agente usarlo: agent001, un agente open-source con su propia wallet y línea de crédito de Priors.
- Contrata un agente por minuto: agent002, agentes trabajadores que venden su tiempo por minuto, pagados en USDG vía x402 o en $PRIORS.
priors.trade · un prior es lo que crees sobre un agente antes de tratar con él. Este está respaldado por dinero.
Un pequeño pool de crédito on-chain presta USDG sin garantía ($5 a $500) a agentes registrados en ERC-8004. Cada línea está respaldada, dólar por dólar, por alguien que puso dinero detrás de ese agente. Cada pago y cada impago es un evento público. De esos eventos obtienes un score de confianza respaldado por crédito que cualquiera puede consultar antes de confiar en un agente, y un registro público de qué agentes pagan sus deudas.
Las reseñas son fáciles de falsificar. La deuda pagada no lo es.
Estado: Priors v2 está en vivo en Robinhood Chain
Pool v2 (
CreditPoolV2) y treasury v4 están en vivo en Robinhood Chain mainnet (chain 4663) desde el bloque 71,702,460, y la bóveda de asientos (SeatVaultV3) desde 2026-09-25. Las direcciones provienen dedeployments/4663.v2.json, así quenpx priors-v2 statusy el SDK las resuelven sin configuración. El pool v1 está pausado; cada registro de pago de v1 fue importado a v2, así que los agentes conservaron su historial. Una segunda bóveda de asientos para líneas más grandes, la bóveda de asientos de crecimiento (SeatVaultV4, líneas de $50), está en vivo desde 2026-09-29 y no acepta nuevos asientos desde 2026-10-09.SeatVaultV5está en vivo desde 2026-10-09 con respaldo solo del propietario (redesplegado el 2026-10-11 con las correcciones de GHSA-g626 y GHSA-8pxr): el propietario de un agente apuesta sus propios $PRIORS para abrir la línea del agente, que la raíz de V5 respalda al 100% en USDG. Ha tenido revisiones internas, sin auditoría externa.Qué cambia v2. v1 prestaba crédito ganado que nadie respaldaba, y todos los hallazgos duros de v1 vivían ahí. v2 lo elimina: cada línea está 100% respaldada por las acciones bloqueadas del pool de un respaldador, un impago quema las acciones de ese respaldador por el valor del principal y la tarifa, y los prestamistas nunca asumen pérdidas de préstamo. Las líneas requieren el consentimiento firmado del propietario del agente, los agentes pueden cambiar de patrocinador entre préstamos, y el propietario del pool es el PoolSteward, que solo el timelock puede controlar.
El retraso del timelock pasa de 48 horas a ninguna. El propietario lo decidió el 2026-10-09: el Safe programó
updateDelay(0), ejecutable desde 2026-10-11 19:49 UTC. Hasta entonces cada operación del timelock espera 48 horas, y las ya programadas mantienen sus tiempos de ejecución. Desde entonces el Safe (2-de-3) puede programar y ejecutar en el mismo bloque: el propietario del pool llama a través del steward (cuyos límites de política siguen aplicando), la devolución del steward, una actualización de la bóveda de acciones, y los ajustes con timelock de los motores y SeatVaultV5. Cada uno sigue siendo público en la cadena, pero no hay tiempo para reaccionar antes de que se ejecute.Cuatro formas de entrar al libro mayor. Una invitación del treasury (una línea de $5 del treasury v4, financiada por tarifas de creador de $PRIORS), un asiento (alguien pone alrededor de cinco líneas de $PRIORS detrás de tu agente y la bóveda de asientos de crecimiento respalda una línea de $50, después de 10 préstamos pagados), un respaldador que apuesta USDG y responde por ti directamente, o, desde 2026-09-28, una línea de acciones (depositas tokens de acciones de Robinhood y la bóveda de acciones respalda una línea contra ellos). Los prestamistas depositan USDG y ganan el 50% de cada tarifa.
Lo que se encontró antes del lanzamiento y se corrigió. Un bucle de auto-respaldo que tomaba el rendimiento de los prestamistas (corregido con un bloqueo de tarifas), un congelamiento por límite de utilización (límite fijado al 100%), una recompensa explotable para keepers (fijada a 0), y tres problemas de la bóveda de asientos (ofertas vinculadas al propietario, asientos inactivos que expiran, una puerta de historial más un asiento con precio muy por encima de la línea que abre).
docs/SECURITY-v2.mdenumera cada hallazgo con su prueba y lo que queda.Lo que eso no compra: v2 ha tenido varias revisiones adversariales internas y una revisión de segundo modelo de las correcciones, pero sin auditoría de terceros. No se encontró ningún camino al principal de los prestamistas, y eso sigue sin ser una prueba. Los tamaños de lanzamiento se mantienen pequeños precisamente por esa razón. Léelo, ejecútalo, integra contra él; dimensiona tu exposición como alguien que sabe que no ha ocurrido una auditoría.
Participa: priors.trade tiene una página de Participación (depósitos, asientos, raíces), /agent y /invite.
docs/PARTICIPATE.mdes lo mismo para código.
Dale a tu agente un historial de crédito en 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
Ejecuta los comandos npx dentro del clon: ahí ejecutan el CLI de este repositorio. Fuera de él, npx priors es un
paquete npm no relacionado y priors-v2 en npm es solo un marcador de posición que imprime estas instrucciones, así que nunca los
ejecutes con PRIORS_KEY configurado en ningún otro lugar.
La wallet necesita un poco de gas nativo, suficiente USDG para pagar la tarifa (alrededor de $0.012 por $5 durante 7 días) y, para una
invitación de autoservicio, el bono de 5 USDG (paso 2 abajo). Un agente completamente nuevo no puede tomar un asiento:
npx priors-v2 join --seat <staker> acepta la oferta de asiento de un staker solo después de que el agente haya pagado 10 préstamos (los nuevos asientos van
a la bóveda de asientos de crecimiento; los 10 asientos de SeatVaultV3 fueron todos tomados al 2026-09-29). Sin una invitación, una primera línea proviene
de un respaldador o una línea de acciones.
O míralo en una cadena local desechable primero
git clone --recurse-submodules https://github.com/priors-agents/priors && cd priors
npm install
npm run quickstart
Eso inicia una cadena local, despliega los contratos v1 con mocks, y recorre una identidad ERC-8004 nueva a través de todo el registro — registrarse, tomar la línea de $5 del treasury, pedir prestado, mantener, pagar, score. El devnet local no se ha movido a v2 todavía; el flujo y el score tienen la misma forma, las reglas de respaldo difieren (la "capacidad ganada" de v1 abajo no existe en 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
Requiere Foundry y Node 20+.
Los registros sobreviven a las migraciones
El recorrido de v1 se ejecutó de verdad en Robinhood Chain con USDG real, de principio a fin, a través del CLI en este repositorio, y sus registros se han movido dos veces.
El agente #437 es el interesante, porque su registro sobrevivió la migración al contrato
corregido. Pagó dos veces en el pool original; esos dos préstamos fueron trasladados por
importRecords, y desde entonces ha pedido prestado y pagado de nuevo en el nuevo:
| paso | transacción |
|---|---|
| pedir prestado $5 por 8 días, en el nuevo pool | 0xff8c3e1f… |
| pagar principal + tarifa | 0x0cfc083c… |
npx priors report 437 leyó el resultado del pool v1: 3 préstamos pagados, $15 de volumen,
$0.036665 de tarifas pagadas, sin impagos. En el corte de v2 cada registro de v1 fue importado de nuevo
(importFromV1), y en v2 el agente #437 todavía muestra sus 3 préstamos pagados — el punto de llevar
historial en lugar de reiniciarlo. El agente #443 pasó por lo mismo.
Un registro y una línea de crédito son cosas separadas, y una migración lleva solo el registro: la capacidad
no se importa, así que después de un corte un agente muestra su historial completo con una línea $0 y sin
patrocinador hasta que le pide uno al treasury (firstLine, que solo el controlador de la propia identidad
puede llamar). Por eso un agente recién migrado se lee como sponsor #0 por un tiempo. En v2 le pide al treasury v4 (una
invitación), a un staker (un asiento) o a un respaldador una nueva línea.
No hay modo demo en nada de eso — mismos contratos, mismo registro ERC-8004, mismo USDG.
Entrégaselo a tu agente de código en su lugar
Este repositorio incluye el procedimiento como una skill de agente, para que no tengas que leer nada de esto:
# Claude Code
mkdir -p ~/.claude/skills && cp -r skills/priors ~/.claude/skills/priors
Luego di: "dale a mi agente un historial de crédito en Priors". La skill conoce los pasos, en qué cadena y pool está,
qué hacer cuando el límite de época del treasury está agotado, y que no debe afirmar que un agente está registrado cuando
no lo está. Codex y otros harnesses leen AGENTS.md en la raíz del repositorio, que lleva las mismas
instrucciones.
Plugin de Claude Code
La skill y el servidor MCP alojado en una sola instalación. En Claude Code:
/plugin marketplace add priors-agents/priors
/plugin install priors@priors-agents
La skill se ejecuta como /priors:priors, y el servidor de solo lectura se conecta como plugin:priors:priors-read, sin clave. Para
pagar, pedir prestado y pagar con la wallet del propio agente, añade también el servidor local: skills/README.md
tiene el comando, que mantiene la clave en tu entorno.
O conéctalo vía MCP
Solo lectura, alojado, sin clave: añade https://mcp.priors.trade/mcp (Streamable HTTP) a cualquier 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)
En Claude (web, escritorio, teléfono), este enlace
abre el formulario Añadir conector personalizado con Priors ya completado. VS Code lo instala desde
vscode:mcp/install?{"name":"priors","type":"http","url":"https://mcp.priors.trade/mcp"} (codificado en URL) o
code --add-mcp '{"name":"priors","type":"http","url":"https://mcp.priors.trade/mcp"}', y Cursor desde
cursor://anysphere.cursor-deeplink/mcp/install?name=priors&config= más el base64 de {"url":"https://mcp.priors.trade/mcp"}.
ChatGPT lo acepta en modo desarrollador (Configuración, Seguridad e inicio de sesión), en su página de plugins, sin autenticación.
Responde el registro y score de un agente, las cifras del pool, préstamos recientes y los servicios del facilitador, y no
puede firmar ni enviar nada. También es una MCP App: en hosts que renderizan MCP Apps (Claude, ChatGPT, VS Code, Cursor,
Goose) sus respuestas vienen con una vista de Priors, y request_borrow / request_repay preparan un préstamo o un pago como
dos enlaces donde el propietario del agente lo confirma: modo Go (go.priors.trade), con su propia cuenta, o la consola de agente
en priors.trade, con la wallet que posee el agente. Para pagar URLs x402, pedir prestado y pagar con la wallet del propio agente, ejecuta el servidor local en
packages/mcp (la clave permanece en tu entorno). Ambos paquetes están en npm:
npx -y @priors/mcp ejecuta el servidor local, y npm i @priors/x402 instala el pagador. Desde un clon,
npm install en la raíz los enlaza en su lugar. El servidor local también está en el Registro MCP oficial como
io.github.priors-agents/priors, y el alojado como io.github.priors-agents/priors-read. Desde 0.5.0 la wallet
también puede mantener USDG inactivo en ahorros (una bóveda de USDG en Morpho: el propio dinero del agente, con los riesgos de la bóveda; ver
packages/x402), y un préstamo en una línea de SeatVaultV5 lo refresca primero. El pago automático (pagar cada préstamo a
tiempo desde la wallet del agente) está en los paquetes y se niega a ejecutarse hasta que AutoRepay v2 esté desplegado. 0.2.11 lleva
las correcciones de seguridad de 0.5.0 para quienes se quedan en la línea 0.2.
O paga por llamada
El mismo registro es un endpoint x402 v2 de pago: https://api.priors.trade/v1/report/{id} y /v1/score/{id}, 0.03 USDG
cada uno en Robinhood Chain, liquidado a través de https://facilitator.priors.trade. Una llamada no pagada responde con 402 y los
requisitos en su cabecera PAYMENT-REQUIRED; packages/x402 lo paga (createPayer({ signer }).pay(url)).
Los comerciantes pueden registrarse ellos mismos como facilitador en https://x402.priors.trade/merchants. Un comerciante también puede
comprobar quién paga antes de atenderlo. recordGate en @priors/x402 lee el registro de Priors del pagador antes de que el
facilitador vea el pago, y puede rechazar a morosos, pedir préstamos reembolsados o fijar precio según el registro. Un pago rechazado
no mueve nada (packages/x402).
Los cuatro pasos (v2)
| 1 | identidad | register(uri) en el registro ERC-8004, una vez. Tu NFT es tu identidad. ¿Ya tienes una id? Omite esto (establece PRIORS_AGENT_ID si es anterior a v2 o te fue transferida). El pool nunca ve tus claves, solo la id. |
| 2 | una línea | Invitación del Tesoro: en priors.trade/invite publicas un bono de 5 USDG en InviteBond desde la wallet que posee el agente, demuestras al bot de Telegram que eres su dueño, y el bot firma la invitación del tesoro v4 para tu id al instante; la canjeas con tu consentimiento del pool → $5 (máximo $25 de nuevas líneas del tesoro por semana). El bono regresa una vez que el agente ha reembolsado 3 préstamos calificados sin ninguno abierto, o después de 4 días si nunca obtiene una línea; un impago lo envía a la Safe, así que tomar una primera línea y marcharse no produce nada. Asiento: un staker ofrece un asiento de $PRIORS sobre tu id y lo aceptas → $50 en la bóveda de asientos de crecimiento, préstamos de máximo 7 días (tu agente necesita 10 préstamos reembolsados primero). Avalista: una raíz avala cualquier tamaño con tu consentimiento firmado. Línea de acciones: depositas tokens de acciones de Robinhood aceptados y la bóveda de acciones respalda una línea contra ellos (ver "Líneas de acciones" abajo). |
| 3 | pedir prestado, mantener, reembolsar | quoteFee → aproximadamente $0.011666 por $5 en 7 días. borrow → USDG en tu wallet. Haz el trabajo. repay → principal + comisión. Reembolsar antes de 7 días está bien pero no cuenta: los dólares-día son la puntuación. |
| 4 | crecer | Tesoro v4 raise(agentId) → $25, después de 3 préstamos calificados, 14 días, puntuación ≥ 100 y un historial limpio: en pausa desde 2026-10-12 (la Safe estableció minQualified a 1,000,000). Más allá de eso, las líneas crecen encontrando un avalista mayor: v2 no tiene crédito "ganado" sin respaldo. |
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>
O desde JavaScript, en ethers v6, dentro del clon (las importaciones priors/… se resuelven a este repositorio allí; no está
publicado en npm con ese nombre):
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 cubre cada rol (prestamista, staker, avalista, agente);
docs/FLOAT.md cubre pagos x402 a crédito y el facilitador público en
https://facilitator.priors.trade; docs/AGENTS.md es la guía para constructores de agentes.
Un agente completo en su lugar: agent001 tiene su propia wallet, se une a Priors,
pide prestado y reembolsa antes de la fecha de vencimiento por sí mismo, vende un servicio a través de x402, y habla desde una terminal o Telegram. Sus
movimientos de dinero pasan por @priors/mcp. agent001 sandbox ejecuta todo el bucle en una bifurcación local con dinero ficticio. También
lleva una habilidad de Priors para OpenClaw y Hermes Agent (skills/priors;
en Hermes, hermes skills install priors-agents/agent001/skills/priors): comprueba el registro de un agente antes de pagarle, y
paga, pide prestado y reembolsa con las herramientas MCP.
Líneas de acciones
Desde 2026-09-28 la bóveda de acciones (StockVault, raíz #6424) respalda una línea con los tokens de acciones de Robinhood del propio agente.
El dueño del agente deposita uno de los 35 tokens aceptados (listados con sus feeds de Chainlink en
deployments/stock-assets.4663.json) y la bóveda avala una línea del
préstamo-valor de ese token: 25-50% del valor del depósito, más hasta 15 puntos por un historial de reembolso de crédito del tesoro,
como máximo $250. Los préstamos sobre ella son préstamos ordinarios del pool, con la misma comisión, términos y reglas de impago. Cada nuevo préstamo se
comprueba contra el valor de la garantía en ese momento, así que un precio en caída reduce lo que se puede retirar, y el nuevo crédito espera durante
una pausa de préstamos (un movimiento brusco de precio, un cambio de multiplicador como un split, un token pausado o bloqueado). El cierre devuelve
cada token, de una vez sin préstamo abierto, o con el último reembolso; una línea sin usar durante 30 días (7 si nunca se retiró) puede ser cerrada por cualquiera. Un impago confisca todo el depósito.
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) muestra los tokens detrás de una línea de acciones. @priors/mcp (stock_assets, stock_position) y
los ayudantes de crédito de @priors/x402 también leen la bóveda, desde 0.2.0; 0.2.1 lleva las
correcciones de seguridad de los informes privados. Una línea de acciones cuenta como dinero propio del prestatario en Priors
Score v2 (pesos 2.0.1). Los tokens son de Robinhood, bajo sus propios términos (incluyendo dónde pueden mantenerse), y
su emisor puede pausarlos, bloquearlos, quemarlos o actualizarlos. La bóveda es el único contrato de Priors actualizable: lo que su dueño,
la Safe, puede y no puede hacer está en docs/SECURITY-v2.md.
Qué lo termina
Supera una fecha de vencimiento por más de tres días y cualquiera puede marcar el préstamo como impago. El registro se marca como impago para siempre, la identidad nunca puede pedir prestado ni avalar a nadie de nuevo, y la dirección del dueño también se marca. El patrocinador paga: las acciones bloqueadas de un avalista (o del tesoro) se queman por el principal y la comisión; en un asiento, la mitad de los $PRIORS del staker se quema. Tu rama se quema en el bosque en priors.trade, en público, y permanece quemada.
No hay apelación. Por eso la puntuación significa algo.
Cómo funciona
- Cada línea está 100% respaldada. La capacidad proviene solo del USDG de un avalista, bloqueado como acciones del pool. Las acciones bloqueadas ganan rendimiento de prestamista como cualquier otra y respaldan las líneas que su raíz avala, 1:1. Un impago quema las acciones del avalista por valor de principal y comisión, así que el precio de la acción nunca cae y los prestamistas nunca sufren pérdidas por préstamo.
- Consentimiento y traspaso. Una línea necesita el consentimiento EIP-712 del dueño del agente, así que nadie es patrocinado contra su voluntad. Sin préstamo abierto, un agente puede moverse a otro patrocinador, así que ningún patrocinador queda atrapado para siempre.
- Cuatro tipos de avalista. Tesoro v4 (raíz #6228) se financia con comisiones de creador de $PRIORS y avala por regla:
$5 contra una invitación, $25 una vez experimentado, como máximo $100 de nuevas líneas por semana, líneas inactivas reclamadas después de 30 días.
La bóveda de asientos (SeatVaultV3, raíz #6234) respalda una línea de $5 detrás de un agente con 3 préstamos reembolsados sobre el que un staker pone un asiento
de $PRIORS; sus 10 asientos estaban todos ocupados al 2026-09-29, así que los nuevos asientos van a la bóveda de asientos de crecimiento (abajo). Los stakers ganan
la parte del patrocinador de las comisiones de ese agente y pierden la mitad del asiento en un impago. La bóveda de acciones (StockVault, raíz
#6424) respalda una línea contra los tokens de acciones del propio agente y los confisca en un impago. Cualquiera puede ejecutar una raíz con
$10+ de participación y avalar con consentimiento, con una prima de hasta 2% por 30 días. La bóveda de asientos de crecimiento (SeatVaultV4,
raíz #6466) está activa desde 2026-09-29: los mismos asientos para una línea de $50, para agentes con 10 préstamos reembolsados, en préstamos de
como máximo 7 días (
docs/PRIORS-GROWTH-SEATS.md). - Un solo bucle de dinero. Las comisiones de préstamo se dividen 50 / 25 / 25 entre prestamistas, patrocinador y reserva.
- Una puntuación que es una función pura del registro.
score(agentId)ycreditReport(agentId)enCreditLensV2, la misma fórmula que v1, y cada entrada es un evento que puedes recalcular tú mismo. La puntuación v1 es dólares-día: principal × cuánto tiempo realmente lo mantuviste (limitado al plazo contratado), sumado sobre préstamos reembolsados — hasta 400 puntos. Más préstamos calificados (plazo ≥ 7 días, 20 puntos cada uno, hasta 200), respaldo (hasta 150), antigüedad (hasta 150). Tu propio impago es 0, siempre. El camino más barato a una puntuación alta es el honesto: pedir prestada una cantidad significativa, mantenerla durante semanas, reembolsar. - Priors Score v2, fuera de cadena y abierto. Activo desde 2026-09-27 en
https://priors.trade/api/score-v2, en la API de pago y en ambos servidores MCP: cuenta solo el riesgo que otros asumieron, retrasos, ingresos x402 de pagadores que no son el propio agente, y peldaños de confianza que requieren tiempo. Motor, pesos y pruebas están ensdk/yscripts/; cómo funciona y qué evita que se manipule:docs/SCORE-v2.md. La puntuación en cadena anterior no cambia. - Comprueba un agente antes de tratar con él.
https://priors.trade/api/check?agent=<id>o?address=<0x…>: gratis, sin clave, CORS abierto. Devuelve el registro de reembolso y la puntuación del agente, y una insignia README enhttps://priors.trade/api/badge/<id>.svg. Verdocs/CHECK-API.md. - Lee la puntuación en cadena, con su evidencia. Priors publica la puntuación v2 de cada agente en el registro de reputación
ERC-8004; desde 2026-10-05 cada nota lleva su propio archivo (la línea en un bloque, reembolsos a tiempo con sus
transacciones, el pago del pool al agente), con hash en cadena.
node scripts/verify-attestation.mjs <agentId>comprueba uno solo desde la cadena:docs/ATTESTATION-v2.md.
docs/DESIGN.md tiene las matemáticas y ataques de v1; docs/SECURITY-v2.md los
hallazgos de v2.
Los parámetros, según los establecen los contratos
| Tamaño del préstamo | $5 – $500 |
| Plazo | 1 – 30 días |
| Comisión | 1% por 30 días, prorrateada, más la prima del patrocinador (0 en líneas de tesoro y asiento) |
| División de comisión | 50% prestamistas · 25% patrocinador · 25% reserva |
| Período de retención del prestamista | 7 días. Retirar antes deja 0.5% atrás para los prestamistas que se quedaron |
| Gracia antes de que cualquiera pueda declararte en impago | 3 días |
| Cuenta como préstamo calificado a los | 7 días |
maxUtilizationBps · keeperBounty | 10000 · 0 |
| Tesoro v4 | primera línea $5 · aumento a $25 · $100 de nuevas líneas por época de 7 días · inactivo después de 30 días |
Asientos (SeatVaultV3, raíz #6234) | asiento ≈ $25 de $PRIORS (12,000 al 2026-09-25, redimensionado con el precio por el SeatSizer) · línea $5 · 50% quemado en impago · el agente necesita 3 préstamos reembolsados · el asiento expira después de 30 días inactivos · $50 de nuevas líneas por época de 7 días |
Asientos de crecimiento (SeatVaultV4, raíz #6466; activos desde 2026-09-29) | asiento ≈ 5 líneas de $PRIORS (120,000 en el despliegue, redimensionado por su propio SeatSizer dentro de [110,000, 20,000,000]) · línea $50 · 50% quemado en impago · el agente necesita 10 préstamos reembolsados · préstamos de máximo 7 días · 20 asientos abiertos · el asiento expira después de 30 días inactivos · $1,000 de nuevas líneas por época de 7 días · asientos de protocolo cerrados |
Líneas de acciones (StockVault, raíz #6424) | 35 tokens de acciones · línea 25-50% del valor del depósito por token, más hasta 15 puntos por un historial de crédito del tesoro reembolsado, nunca por encima del 70% · como máximo $250 por línea · $1,000 de nuevas líneas por época de 7 días · $1,000 de líneas abiertas por token ($500 en CRCL, CRWV, NBIS, RGTI, SNDK, USAR) · depósito completo confiscado en impago · inactivo después de 30 días (7 si nunca se retiró) |
| Participación mínima de raíz | $10 |
| Dueño del pool | PoolSteward desde 2026-10-06 (sin dueño, no actualizable), que solo el TimelockController puede llamar (la Safe propone y ejecuta, sin administrador; un retraso de 48 h, ninguno desde 2026-10-11 19:49 UTC), dentro de una política fija: patrocinador ≤ 25%, reserva ≤ 40%, prestamistas ≥ 35%, comisión ≤ 2% por 30 días; la Safe es guardián (pausa ≤ 14 días, las salidas nunca pausan) |
Robinhood Chain
La cadena objetivo es Robinhood Chain mainnet (id 4663).
| Dirección | |
|---|---|
| CreditPoolV2 (en vivo) | 0x281210097f0de7A8FB6F87310AF0f089c9C8DE21 |
| CreditLensV2 (vistas de puntuación e informes) | 0x9d7035722bd42C551f82FEB9FDDd17453AEF3D9B |
TreasurySponsorV4 (en vivo, raíz #6228, con invitación) | 0x0c5091235A25bBFD3F5a009cBe04120D0CBAD573 |
SeatVaultV3 (en vivo desde 2026-09-25, raíz #6234) | 0x59D155C42A9263fA7596867b992bB3e84dF680a9 |
SeatVaultV2 (retirado y en pausa, raíz #6229; reemplazado por V3 para la auditoría V-2) | 0x6D934C07a33E7285cE691A9B258cdB53F18e6B5F |
| PoolSteward (posee el pool desde 2026-10-06; solo el timelock puede llamarlo) | 0x6D9D4135417E0AB2aafc69Fc842525Af279a5Da8 |
| TimelockController (controla el PoolSteward; retraso de 48 h, ninguno desde 2026-10-11 19:49 UTC) | 0x5d984C274035F81BB327d532897a902C5125F87c |
| SeatSizer (posee la bóveda de asientos desde 2026-09-26; redimensiona el asiento según el precio de $PRIORS, dentro de los límites) | 0xd24B6484f4E68d72Fd2d3AF7bD036560B2ed5E61 |
SeatVaultV4, la bóveda de asientos de crecimiento (en vivo desde 2026-09-29, raíz #6466) | 0xb1c3a04496238D62E3c93118C297163855e22192 |
| SeatSizer de la bóveda de asientos de crecimiento (la posee; el Safe posee el sizer) | 0x97C4e594D458f8BBE961d5384Bbd8a9Cc2D18777 |
SeatVaultV5 (en vivo desde 2026-10-11, raíz #8762; respaldo solo del propietario; reemplazó el despliegue de 2026-10-09, 0xdE29D3A627d77CFA13c5331C1B7B181a4C5B752E, raíz #8641, que nunca tuvo un libro y cuyo USDG de la raíz se movió a él) | 0xC999014C6218EC41f0aE412d49AE8f2aA4c539fD |
Bibliotecas vinculadas de SeatVaultV5 (src/v5/; V5 las llama mediante DELEGATECALL) | V5Pos 0xd2d393Daf7bABE6ac090a97765407256673Bf9Bc, V5Steps 0x3a4B951E0eae25DD327224395ecE0C6fD6345f94, V5Book 0x90992387BbfBcF6aB179B33535d283FEE2d832F4, V5Records 0x23C3660Cd36401F6adE16f51f81F629a6aE6d826, V5Exit 0x0BB0CF27E9a0f5DB38a3F58fc31b1f90D784CbC7, V5Auto 0x22914DF387771bCB167Bfd1777678887D1AB1375, V5Sync 0x2FE6cC16DA24694D48BbDD8C83d4732ca23276F4, V5View 0xE5175D7C9C30E210197D23A45A3e0bbe66cF1846, V5Lens 0x294a483e54aBE64d2037df370974304C0F3B09F7 |
StockVault (en vivo desde 2026-09-28, raíz #6424; líneas contra tokens de acciones; un proxy Transparent, StockVaultProxy) | 0xbEcd07EC689988e16b870C121756C4c2C8cb02B6 |
| Implementación de StockVault (detrás del proxy; desde 2026-10-11) | 0x796FCcBdab6d473Ab22728D246AcAea0905b8E0B |
| ProxyAdmin de StockVault (la única forma de actualizar la bóveda; propiedad del timelock desde 2026-10-07, antes del Safe; sin retraso desde 2026-10-11 19:49 UTC) | 0x5174A18550a295cd25aF59416a56B7e4c38C8Afc |
| Safe (2-de-3; propone al timelock, posee el tesoro v4 y ambos SeatSizers, por lo que tiene todos los demás poderes de la bóveda de asientos y la configuración de la bóveda de acciones) | 0x20c6816B2419616238772591965E6E9AbE493fD5 |
| RevenueRouter (el barrido del administrador y las tarifas de las bóvedas van aquí) | 0xb2E217C5841a968C48Eee41DCbF7D2a03cCA4F43 |
| BuyAndBack (motor 1) | 0xEe40675aBEC90E52211526845433C10c80fD569E |
| PriorsLiquidity (motor 2) | 0xbEC159832D05749557F3f972c4823979C8dC8451 |
| SwapLimiter (el guardián de profundidad de los motores) | 0x4535b1d92ebBe8176463dE4b58Ca9B66A231eb0E |
| KeeperHelper (el guardián de SeatSizerV4 desde 2026-10-06; el único punto de entrada de la clave del guardián) | 0x3Ba233d2ac1C6233C5fA954C2DaaD83fcCFE5372 |
| InviteBond (el bono que necesita una invitación automática; sin administrador) | 0x8BE478c754D9124D11e78dB20F5bf4dA45403275 |
| Registro de Identidad ERC-8004 | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 |
| USDG (el dólar de 6 decimales de Robinhood, el activo del pool) | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
| Token $PRIORS (Pons V2) | 0xeDBf91223639800BCd5756815CAf908Df3b890bE |
| Facilitador x402 | https://facilitator.priors.trade (registro de comerciante: https://x402.priors.trade/merchants) |
| MCP alojado (solo lectura) | https://mcp.priors.trade/mcp |
| API de pago (x402 v2, 0.03 USDG) | https://api.priors.trade |
RPC (oficial; el único que sirve eth_getLogs) | https://rpc.mainnet.chain.robinhood.com |
| Copias de seguridad de RPC, para llamadas simples | https://robinhood-rpc.publicnode.com, https://rpc.ordofi.network |
| Explorador | https://robinhoodchain.blockscout.com |
0x0259889e6EBab1a18CeE7e62Bc5B9648FB6C44e5 | |
#486) | 0x59f212317b42D308E81EaF8C078fc8189E2a77Df |
#461) | 0x9338d18b5E7faC5ce06a6AD1Af33Db68fE0b4daC |
0x32349B1Ad07513B5Fa6dCC3dbDC0B5ed17FcB72d | |
0x4B9fb2dE6BE54aF037683A75F3C82c81C3EEd122, 0xd970472b2904D5923882af034cea4067AF0AaC95 |
Las direcciones se resuelven desde deployments/4663.v2.json (v2) y deployments/4663.json (v1, conservado por historial y
marcado como en pausa), por lo que nada de lo anterior necesita copiarse a mano. Los contratos superados se enumeran solo para que un enlace antiguo sea
reconocible como muerto en lugar de misterioso.
Por qué los prestamistas tienen un período de retención
La parte del prestamista de una tarifa se aplica al precio de la acción en el momento en que se reembolsa un préstamo, por lo que quien tenga acciones en ese instante la cobra. Una auditoría mostró ambas formas en que se abusó: un bot que depositaba antes de un reembolso y se iba justo después se llevó $2.70 de una tarifa de prestamista de $3, dejando $0.30 para el prestamista que había soportado treinta días de riesgo de incumplimiento — y un prestatario podía envolver su propio reembolso en un depósito y un retiro, en una sola transacción, y recuperar el 54% de su propia tarifa.
Salir dentro de 7 días ahora deja un 0.5% atrás, que permanece en el pool para los prestamistas que no se fueron. Eso es suficiente para que una posición de duración cero pierda dinero: el sándwich del prestatario cuesta $549.54 contra los $505.00 que debía. Es una constante en el contrato, no un parámetro, tanto en v1 como en v2 — una tarifa de salida ajustable por el propietario sería una palanca para confiscar depósitos, y el propietario no puede alcanzar el principal del prestamista aquí. Mantén más de 7 días y es cero.
RPC_URL acepta una lista separada por comas y la prueba en orden — primero la primera entrada, la siguiente solo
cuando esa falla o se niega a servir la solicitud:
RPC_URL=https://rpc.mainnet.chain.robinhood.com,https://robinhood-rpc.publicnode.com,https://rpc.ordofi.network
Vale la pena hacerlo: el endpoint oficial limita la velocidad bajo carga, y un 429 allí es de otro modo el fin de la
lectura. Las copias de seguridad aceptan llamadas simples de buena gana pero no pueden servir historial de eventos — publicnode responde 403
Archive requests require a personal token y ordofi responde -32005 the network is busy — por lo que cualquier cosa que
lea registros aún necesita el endpoint oficial accesible. El SDK conoce la diferencia: un nodo que se niega
a servir pasa a la siguiente entrada, mientras que un revert se devuelve tal cual, porque un revert es la respuesta de la cadena
e idéntico en todas partes.
Repositorio
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
¿Encontraste algo? SECURITY.md — usa el informe de vulnerabilidad privado de este repositorio, y por favor no pongas detalles en un issue público. BOUNTY.md dice cuánto vale; el techo es pequeño y lo decimos de antemano en lugar de después de que hayas pasado una semana.
Trabajando en ello
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 con via-IR en optimizer_runs = 1 para caber en el límite de 24 KB (una restricción por archivo en
foundry.toml); todo lo demás compila como antes. Los contratos no son actualizables, excepto la bóveda de acciones: un
cambio de fuente solo llega a los usuarios a través de un nuevo despliegue, o, para StockVault, una actualización a través de su ProxyAdmin,
que el timelock posee desde 2026-10-07 (el Safe lo programa en público; se ejecuta 48 horas después como mínimo
hasta 2026-10-11 19:49 UTC, y desde entonces en el bloque en que se programa). src/StockVault.sol permanece byte-idéntico a la fuente verificada en cadena, por lo que forge fmt lo omite.
Riesgos honestos
- La demanda es temprana. Los agentes necesitan dinero principalmente para inferencia y llamadas API. Los volúmenes son reales pero pequeños.
- Los patrocinadores asumen el riesgo crediticio. En v2 ese es el punto: un incumplimiento cuesta a su patrocinador, no a los prestamistas. Patrocina agentes a los que tú mismo prestarías.
- Los asientos se valoran en un token volátil. Un asiento disuade una línea robada solo mientras la mitad de él valga mucho más
que la línea. Si $PRIORS colapsa, el tamaño del asiento tiene que moverse (ver
docs/SECURITY-v2.md, X-3). - Esto no es una auditoría. v2 ha tenido revisiones adversarias internas, no una auditoría de terceros. v1 se lanzó con un defecto de pérdida de prestamista que los invariantes aleatorios no detectaron. Asume que hay otro.
v1: lo que pasó antes
El pool v1 funcionó en Robinhood Chain hasta la transición a v2, y ahora está en pausa. Este es su registro, como se escribió mientras v1 estaba en vivo; se conserva porque es la historia sobre la que se construyó v2.
Estado de v1: lo que encontramos y lo que hicimos al respecto
Una revisión encontró una forma en que los prestamistas podían perder principal:
markDefault()liberaba el respaldo delegado completo de un agente en su primer incumplimiento, por lo que un segundo incumplimiento del mismo agente no encontraba nada que cobrar. Escribimos el contraejemplo como una prueba, lo confirmamos fallando, y lo dejamos público mientras aún estaba roto.Está arreglado. Un incumplimiento ahora consume solo la parte responsable de la delegación por préstamo; el resto sigue respaldando los otros préstamos abiertos de ese agente y se libera cuando el último se cierra, y el crédito ganado se cancela contra deuda incobrable y se retira en la liquidación. La prueba que demostró el error sigue en el conjunto, y pasa:
forge test --match-test test_multipleDefaultsKeepLendersWholeWithoutEarnedExposure -vv
test/DefaultAccounting.t.solagrega los casos que hacen que el arreglo signifique algo: incumplimientos parciales, reembolso después del incumplimiento, múltiples hijos, recurso de sub-patrocinador por incumplimiento, un patrocinador muerto, incumplimientos de raíz, y el bloqueo de reserva.forge testes 97 aprobados, 0 fallidos, invariantes incluidos.Lo que eso no compra: no ha ocurrido una revisión independiente de la economía, y los invariantes aleatorios pasaron directamente a través del error original — un fuzzer que nunca incumple al mismo agente dos veces reporta verde para siempre. Los límites de lanzamiento se mantienen pequeños exactamente por esa razón. Léelo, ejecútalo, intégralo; dimensiona tu exposición como alguien que sabe que una auditoría no ha ocurrido.
El pool está en vivo en Robinhood Chain mainnet (cadena 4663), sembrado pequeño a propósito: 150 USDG de liquidez de prestamistas, 75 en la reserva de primera pérdida, 65 apostados por el tesoro. Las direcciones provienen de
deployments/<chainId>.json, por lo quenpx priors doctorlo resuelve sin configuración.npm run quickstartaún te construye una cadena local desechable en unos treinta segundos si prefieres no tocar mainnet.Se encontró un segundo defecto después del lanzamiento, y ahora se ha arreglado y redesplegado. Un patrocinador raíz podía avalar
stake + earned; cuando la delegación incumplía,markDefaultlimitaba la responsabilidad de la raíz a su participación y cobraba el déficit a la reserva — pero nunca retiraba elearnedde la raíz. El mismo crédito ganado entonces respaldaba una delegación incumplida y seguía siendo la capacidad de préstamo propia de la raíz: la reserva pagaba dos veces,reserve >= totalEarnedse rompía, y los prestamistas perdían principal. Vale la pena ser preciso sobre lo que no estaba mal:vouch()permitir que una raíz delegara más de lo ganado. La participación de una raíz es efectivo, por lo que esa delegación está respaldada; requerirdelegatedOut <= earnedpara raíces rompería el tesoro, que avala cada línea fuera de la participación conearned = 0. El permiso era correcto — la contabilidad en el incumplimiento estaba incompleta.
test/ReviewPoC_RootEarnedDoubleSpend.t.soles la prueba de concepto original, ahora invertida en el guardián de regresión: ejecuta el ataque movimiento por movimiento y afirma la contención. Revierte el arreglo y falla nombrando el invariante roto. El pool se migró al bytecode arreglado, llevando el registro de reembolso de cada agente a través — verimportRecordsytest/HistoryImport.t.sol— y el bloqueominStakeque había servido como arreglo se levanta, por lo que los patrocinadores raíz de terceros funcionan de nuevo.El pool antiguo está en pausa y abandonado. $10 de participación están varados en él para siempre, detrás de dos líneas de crédito que ya se habían otorgado:
unvouchesonlyController(sponsor)y el TreasurySponsor no expone ninguna, por lo que una línea no puede retirarse. Esa es una propiedad de diseño, no un accidente, y es toda la razón por la que la incorporación es finita.Consecuencia práctica: la incorporación es finita. El tesoro avala $5 por agente de sus propios 65 USDG de participación, por lo que la beta admite trece agentes en total. La capacidad crece solo cuando las tarifas de creador de $PRIORS se barren al tesoro — a mano durante la beta. No confíes en ese conteo una vez que tenga un día de antigüedad: priors.trade muestra cuántas primeras líneas quedan, leídas en vivo de la cadena, y también lo hace
npx priors report 445(available÷ $5).
Licencia
MIT