YieldSignal
APY de préstamos USDC en tiempo real ponderado por riesgo en Aave, Compound, Morpho, Moonwell, Euler y Fluid en Base, pagado por llamada vía x402
Documentación
YieldSignal
Señales de rendimiento ponderadas por riesgo para agentes autónomos, pagadas por llamada mediante el protocolo x402 — sin clave API, sin registro. Cada ruta de producto es de pago: $0.10 señal, $0.25 analítica (durabilidad/capacidad/sensibilidad/exposición), $0.50 decisión, $1.00 persistencia. No hay nivel gratuito ni parámetro de omisión.
- Staking líquido de ETH (red principal de Ethereum) en Lido, Rocket Pool, Coinbase Wrapped Staked ETH, Frax Ether y Binance Staked ETH
- Préstamos de USDC y WETH (Base) en Aave, Compound, Morpho, Moonwell, Euler y Fluid
Siete productos: la señal bruta (qué paga mejor ahora mismo), la decisión (dado dónde ya está tu dinero, ¿merece la pena moverlo por el coste? — MOVE/HOLD con ganancia neta esperada y punto de equilibrio en días), el informe de durabilidad (cuánto de ese APY sobrevive si los incentivos se detienen), el informe de capacidad (¿puedes retirar realmente tu tamaño de ese mercado?), el informe de sensibilidad (qué tan cerca está el mercado del punto de inflexión donde las tasas de préstamo explotan), el informe de exposición (cuánto de tu cartera está detrás del mismo riesgo, sin importar en cuántos lugares esté distribuida), y el informe de persistencia (cuánto tiempo aguanta realmente una llamada aquí antes de que el líder cambie — medido a partir de las atestaciones on-chain de este propio servicio, que es por lo que ningún feed competidor puede producirlo).
En vivo: https://yieldsignal.vercel.app
GET https://yieldsignal.vercel.app/signal/eth-staking-yield
GET https://yieldsignal.vercel.app/signal/usdc-base-yield
GET https://yieldsignal.vercel.app/signal/weth-base-yield
GET https://yieldsignal.vercel.app/decision/eth-staking-yield?position=lido&amountUsd=25000&horizonDays=30
GET https://yieldsignal.vercel.app/durability/weth-base-yield
GET https://yieldsignal.vercel.app/capacity/usdc-base-yield?amountUsd=200000
GET https://yieldsignal.vercel.app/sensitivity/usdc-base-yield
GET https://yieldsignal.vercel.app/exposure/usdc-base-yield?positions=aave:200000,morpho:150000
GET https://yieldsignal.vercel.app/persistence/usdc-base-yield
Las formas simples /signal y /decision (sin activo) redirigen a la ruta de staking de ETH — el activo con el historial verificado más sólido. Formas cortas como /signal/usdc redirigen a la ruta canónica.
¿En qué activo deberías confiar?
No te fíes de nuestra palabra: GET /accuracy.json es gratuito y devuelve la tasa de acierto dentro de tolerancia por activo y el arrepentimiento medio en puntos básicos, calculado 1:1 a partir del historial público on-chain de EAS. Al momento de escribir esto, la señal de staking se mantiene mucho mejor que la de préstamos de USDC (el USDC de Base rota demasiado rápido para que una llamada siga siendo cierta) — que es exactamente por lo que el producto insignia es el staking. Los números se recalculan a partir de los datos de la cadena, no se afirman aquí, así que compruébalos tú mismo antes de pagar.
Si la llamas sin pago primero, recibirás un 402 Payment Required con el precio/activo/red exactos a pagar. Cualquier cliente compatible con x402 puede completar el pago automáticamente — por ejemplo con @x402/fetch:
import { wrapFetchWithPayment } from "@x402/fetch";
import { CdpX402Client } from "@coinbase/cdp-sdk/x402"; // or any other x402 client/signer
const client = new CdpX402Client(); // needs CDP_API_KEY_ID/SECRET/WALLET_SECRET + a funded wallet
const fetchWithPayment = wrapFetchWithPayment(fetch, client);
const res = await fetchWithPayment("https://yieldsignal.vercel.app/signal/usdc-base-yield");
console.log(await res.json());
// { bestProtocol: "compound", gapBps: 57, rates: [...], asOf: "..." }
MCP
También disponible como herramientas MCP de pago en https://yieldsignal.vercel.app/mcp — get_yield_signal y get_yield_decision, ambas con un asset opcional ("ETH_STAKING", "USDC" o "WETH"; por defecto "USDC" para compatibilidad con integraciones ya publicadas). La mayoría de los frameworks de agentes autónomos descubren/llaman herramientas vía MCP en lugar de clientes HTTP x402 hechos a mano. Usa el paquete oficial @x402/mcp; el pago se limita por llamada de herramienta (tools/list/initialize siguen siendo gratuitos, solo la llamada de herramienta requiere pago). También hay un plugin de elizaOS en el registro oficial.
Forma de la respuesta
Cada tasa está etiquetada con de dónde viene — onchain/api (Aave, Compound, Morpho — leído directamente del protocolo) o defillama (Moonwell, Euler, Fluid — vía la API de rendimientos de DefiLlama). Sin números estimados ni fabricados: una fuente que falla o devuelve datos inválidos se omite de la respuesta, nunca se adivina.
Cada tasa también se compara sobre una base explícita (apyBasis: "supply-apy-total-incl-rewards"): interés base más incentivos. Esto importa porque las fuentes brutas no coinciden en lo que significa "APY" — un liquidityRate/getSupplyRate on-chain es solo base, mientras que el agregado de DefiLlama y el netApy de Morpho ya incluyen tokens de recompensa. Clasificarlos lado a lado sin reconciliar eso compara cosas diferentes. Cada tasa detalla apyBaseBps/apyRewardBps donde la fuente los separa, y rewardBasis dice cómo se obtuvo el componente de incentivo (reported, inferred, included-not-itemized, unavailable). Cualquier protocolo cuyo incentivo no pudo establecerse en absoluto se lista en incompleteRewardData — su APY es un piso, no un veredicto.
{
"asset": "USDC",
"bestProtocol": "compound",
"gapBps": 150,
"rates": [
{ "protocol": "compound", "apyBps": 601, "apyBaseBps": 601, "apyRewardBps": 0, "rewardBasis": "reported", "tvlUsd": 8446455, "tvlBasis": "total-supplied", "weightedApyBps": 595, "source": "onchain", "asOf": "2026-07-30T..." },
{ "protocol": "moonwell", "apyBps": 434, "apyBaseBps": 403, "apyRewardBps": 31, "rewardBasis": "reported", "tvlUsd": 2643239, "tvlBasis": "aggregator-reported", "weightedApyBps": 382, "source": "defillama", "asOf": "..." }
],
"omittedProtocols": ["euler"],
"coverage": { "read": 5, "expected": 6 },
"apyBasis": "supply-apy-total-incl-rewards",
"incompleteRewardData": [],
"asOf": "2026-07-30T..."
}
Profundidad, y si el rendimiento es una campaña
Cada tasa también lleva tvlUsd con un tvlBasis que dice qué mide ese número — total-supplied cuando proviene de los libros propios del protocolo (Aave totalAToken, Comet totalSupply, Morpho totalAssetsUsd), aggregator-reported cuando proviene de DefiLlama, que reporta liquidez disponible para mercados de préstamo. No son la misma cantidad y el campo dice cuál recibiste. La profundidad importa porque la cima de un mercado delgado no es una tasa ejecutable para tamaño: al momento de escribir esto, la señal de WETH lidera con un mercado de $716k cuyo rendimiento es 59% campaña de incentivos.
Las rutas de decisión actúan sobre ambas: /decision/* devuelve gainDependsOnIncentives y positionShareOfDestinationPct, los expone en el reason legible por humanos, y reduce la confianza cuando tu posición sería una gran parte del destino. Una respuesta real:
MOVE, confianzamedium— "Mover aave → euler rinde +106bps ajustados por riesgo … Nota: toda la ganancia depende de la campaña de incentivos de euler (172bps de sus 291bps) — desaparece si la campaña termina. Nota: tus $200,000 serían el 27.9% del mercado de $716,897 de euler — lo suficientemente grande como para que entrar diluya la tasa por la que te mueves."
¿Es real el rendimiento? — /durability/*
Divide el APY de cada protocolo en interés base vs incentivo y reporta el piso post-incentivo: lo que conservas si la campaña de recompensas se detiene. En una lectura en vivo (2026-08-05), WETH en Base lideraba con euler a 299bps — 57.9% de ello incentivo, piso 126bps — mientras que los 153bps de aave eran completamente base. Sin incentivos, la clasificación se invierte. El endpoint de señal solo te habría apuntado a euler.
Dos reglas evitan que esto se convierta en un generador de falsas alarmas:
- Solo las fuentes detalladas se descomponen.
rewardBasis: "included-not-itemized"o"unavailable"significa que el piso es desconocido, y el protocolo se lista enundecomposable— nunca se trata como libre de incentivos. La ausencia de un incentivo reportado no es evidencia de ausencia. - Sin afirmación de clasificación cuando el líder es opaco. Si el mejor protocolo actual no puede descomponerse,
rankingChangesWithoutIncentivesesnull, nofalse. Aun así recibesbestVerifiableFloor— el mayor rendimiento demostrablemente independiente de incentivos — que es una afirmación completamente medida en cualquier caso.
Solo préstamos en Base (USDC/WETH). Verificado en vivo el 2026-08-05, las cinco fuentes de staking líquido reportan apyReward: null en DefiLlama — 0 de 5 descomponibles en cada llamada — así que una ruta de durabilidad de staking de ETH cobraría por "no se puede establecer". Que el rendimiento de staking sea libre de incentivos es plausible, pero un apyReward ausente no lo prueba, y esa es la misma inferencia que este servicio se niega a hacer para fluid/morpho en el lado de préstamos.
Deliberadamente no es una previsión de fecha. La fuente obvia para "cuándo termina esta campaña" es la API de Merkl (earliestCampaignEnd). Verificado en vivo el 2026-08-05 contra api.merkl.xyz/v4/opportunities?chainId=8453&status=LIVE: Aave, Compound, Euler y Fluid tienen cero campañas LEND allí, y Morpho/Moonwell aparecen solo como bóvedas MetaMorpho curadas que no son los mercados que este servicio lee. status=PAST devuelve marcas de tiempo nulas, así que el historial de renovación tampoco es medible. Cubrir 2 de 6 protocolos adivinando coincidencias de bóvedas — con la mayoría de campañas siendo semanales y auto-renovables — produciría un número de apariencia confiable que es incorrecto, que es lo opuesto a lo que este servicio vende.
¿Puedes salir realmente? — /capacity/*
Un mercado de préstamo al 99% de utilización paga maravillosamente y no te dejará retirar; la tasa alta es el síntoma. tvlUsd no puede distinguir los dos — $100M suministrados con $99M prestados y $100M suministrados con $10M prestados son el mismo número.
La utilización y la liquidez libre provienen de los libros propios del protocolo, en la misma llamada que ya obtuvo la tasa (Aave: la tupla getReserveData; Compound: getUtilization() + totalSupply()), así que esto cuesta cero RPC extra. Pasa ?amountUsd= y cada protocolo reporta si ese tamaño puede salir ahora (canExitNow), el ratio de cobertura, y qué parte del mercado sería.
Morpho y los protocolos con fuente DefiLlama no publican prestado-vs-suministrado, así que se marcan como measured: false y nunca se devuelven como bestProtocolExecutable. No medido no es lo mismo que líquido. Las cifras en USD son solo USDC — convertir un saldo de WETH necesitaría un oráculo de precios dentro de una ruta de respuesta de pago; WETH aún obtiene utilización, que no tiene unidades.
¿Qué tan cerca está el reprecio? — /sensitivity/*
Una tasa de préstamo no es un número, es una función de la utilización con un punto de inflexión. Por debajo, la tasa se arrastra; por encima, explota. Leído en vivo el 2026-08-05:
utilization kink headroom borrow APY at 90% → 93%
compound USDC 89.82% 90% 0.18pp 4.08% → 15.95%
aave USDC 86.16% 90% 3.84pp 4.60% → 7.79%
El mercado de USDC de Compound estaba a dieciocho centésimas de punto de la rodilla. El endpoint de señal solo muestra un APY de suministro saludable del 3.29% y no dice nada sobre eso.
El punto de inflexión y ambas pendientes se leen del contrato de tasa de interés propio de cada protocolo — para Compound, la curva reconstruida se verifica contra getBorrowRate(u), la función pura propia del contrato, y coincidió wei-por-wei al 50/85/90/93/99% de utilización; para Aave, la forma se verifica contra el techo que el propio contrato reporta (base + slope1 + slope2 == getMaxVariableBorrowRate). Si alguna verificación falla, el protocolo se descarta en lugar de servirse con un número derivado de una fórmula que cambió.
Esta es también la primera ruta que habla al prestatario en lugar del prestamista.
Solo Aave y Compound. El AdaptiveCurveIRM de Morpho falla en tres cuentas independientes, verificado en vivo: sus constantes de curva no están expuestas on-chain (CURVE_STEEPNESS, TARGET_UTILIZATION, ADJUSTMENT_SPEED y INITIAL_RATE_AT_TARGET son todos internal constant, así que usarlos significaría hardcodear números copiados de un repositorio); lo que sí es legible, rateAtTarget(id), es estado que deriva con el tiempo, no una curva estática, así que "la tasa al 95%" no tiene una respuesta fija allí; y este servicio lee una bóveda (Gauntlet USDC Prime, $429M en 5 mercados Blue con diferente colateral) cuyo curador reasigna a voluntad. Moonwell, Euler y Fluid provienen de DefiLlama sin acceso a curvas en absoluto. Todos ellos se reportan como measured: false — nunca como estables.
Un riesgo en tres envoltorios — /exposure/*
GET /exposure/usdc-base-yield?positions=aave:200000,compound:50000,morpho:150000
El mercado está lleno de detectores de eventos — alertas de depeg, alertas de hackeo, alertas de liquidación — y la mayoría son gratuitos. Ninguno responde la pregunta que realmente cuesta dinero: ¿estoy expuesto, y a través de qué camino?
En el colapso de Stream Finance, solo 1 de ~320 bóvedas MetaMorpho tenía el activo roto directamente ($700k de deuda incobrable), sin embargo $93M de pérdida se convirtieron en $285M de contagio porque la exposición llegó indirectamente. El evento fue público en horas; lo que lastimó a la gente fue no saber que estaban a dos saltos de distancia.
Una lectura real el 2026-08-06 para la cartera anterior:
$400k across 3 venues — $200k attributable
collateral cbBTC 81.0% via compound+morpho ← shared
curator 0x9e33fa… 75.0% via morpho
collateral WETH 13.4% via compound+morpho ← shared
parameter kink=9000 100.0% via aave+compound ← shared
unattributed: aave $200k
Tres lugares, y el 81% de lo que se puede atribuir está detrás de un solo colateral. La línea kink dice algo más: Aave y Compound ambos reprecian exactamente al 90% de utilización, así que dividir el capital entre ellos no compra ninguna protección contra un shock de utilización.
La atribución difiere por protocolo, porque las topologías de riesgo difieren, y el campo basis dice cuál recibiste:
- Morpho (
isolated-market) — cada mercado Blue está aislado con una única garantía, por lo que la atribución es exacta. - Compound (
collateral-basket) — un activo base frente a una cesta definida, ponderado por lo que realmente se publica (totalsCollateral× el propio feed de precios de Comet). Medido: cbBTC 43.1%, WETH 37.4%, tBTC 7.8%, cbETH 6.9%, wstETH 4.8%. - Aave — reportado sin atribuir, y no por falta de esfuerzo: un proveedor de v3 está expuesto a todo el conjunto de garantías del pool. Atribuirlo a un solo activo sería falso, y dividirlo entre todos implicaría una diversificación que no existe.
Los porcentajes son del capital atribuible, no del total — sobre el total se reducirían y se leerían como baja concentración cuando la verdad es baja visibilidad. coverage reporta ambos.
Esto mide la exposición compartida estructural — la afirmación factual "estas posiciones dependen de lo mismo" — no la correlación estadística. Decir cuánto se mueven juntas requeriría un historial de precios que este servicio no tiene, y sería una afirmación más débil disfrazada de una más fuerte.
La detección de garantías recursivas está deliberadamente ausente. Verificado en vivo en los 77 mercados Morpho activos en Base: cero ciclos y cero activos que sean a la vez garantía y activo de préstamo. Peor aún, la recursión que mató a Stream no estaba en el gráfico de préstamos en absoluto — estaba en la emisión del sintético (xUSD respaldado por posiciones financiadas con el USDC prestado). Un detector de ciclos habría reportado "todo claro" durante todo el colapso. La falsa seguridad es peor que una falsa alarma.
¿Cuánto tiempo se mantiene la respuesta? — /persistence/*
GET /persistence/usdc-base-yield
Cada otro endpoint aquí — y cada feed de rendimiento competidor — responde qué paga mejor ahora. Ninguno responde cuánto tiempo se mantiene eso, que es el número que decide si mover capital vale la pena el gas.
Este lo responde a partir de las atestaciones horarias propias de este servicio en Base. En 24 días y 439 atestaciones, los tres activos no son el mismo producto en absoluto:
| Activo | Cambios de liderazgo | Tiempo mediano en la cima | Vale la pena perseguir, por $10k, antes del gas |
|---|---|---|---|
| Préstamo de WETH | 0 | > 518h (piso, censurado) | $6.50 |
| Staking líquido de ETH | 10 | 26h | $0.018 |
| Préstamo de USDC | 167 | 2h | $0.011 |
La mitad de esos 167 cambios de USDC son un viaje de ida y vuelta entre los mismos dos protocolos (compound <-> fluid). Seguir esa señal literalmente cuesta más en gas de lo que vale la ventaja — y hasta que este endpoint existió, nada en el catálogo lo decía.
También resuelve, empíricamente, una suposición que casi todos hacen: una ventaja mayor no dura más. Spearman -0.04 en 177 períodos de liderazgo completados, con las bandas 0-24bps y >=300bps ambas en una mediana de 2h. El tamaño de la brecha no es un proxy utilizable para la confianza, y este es el único lugar donde se publica ese número — incluso cuando es desfavorable para el servicio que lo publica.
Las rutas /decision/* consumen esto internamente: la ganancia esperada se proyecta sobre el horizonte que pediste o la duración medida del liderazgo, lo que sea más corto. Una proyección de 30 días sobre una ventaja de 2h es exactamente cómo se recomienda un MOVE que solo paga gas.
Límites honestos, declarados en el payload en lugar de en una nota al pie: el intervalo de observación es de 1h, por lo que los liderazgos más cortos son invisibles; los activos cuyo liderazgo aún no ha cambiado reportan un piso con una bandera de censura, nunca una mediana; y cada cifra viaja con su tamaño de muestra, con null donde la muestra es demasiado pequeña. Cada entrada es un UID de atestación público — recalcula todo el informe desde base.easscan.org y obtienes los mismos números sin confiar en este servidor.
¿Cuánto tiempo es buena una señal?
GET /accuracy.json (gratis) lleva dos medidas independientes, ambas derivadas de las atestaciones públicas en cadena:
score— direccional: ¿el protocolo marcado seguía siendo el líder (o dentro de 25 pbs) cuando se evaluó contra el mercado ahora mismo?windowedScore— cada atestación juzgada sobre su propia ventana de validez, es decir, hasta que la siguiente atestación para ese activo la reemplazó.medianWindowHourses la respuesta práctica a "¿con qué frecuencia debería volver a comprobar?" y difiere marcadamente por mercado: en el registro al 2026-07-30, 13h para staking líquido de ETH y préstamo de WETH, 1h para préstamo de USDC en Base. USDC rota rápido; eso es una propiedad del mercado, no un defecto que el endpoint oculte.
El historial ahora cubre más que la señal
Todo el argumento de este servicio es verificable, no prometido — y hasta el 2026-08-06 el registro EAS cubría solo la señal. Los cuatro productos de analítica se vendieron apoyándose en la credibilidad que la señal había construido, no contribuyeron nada a ella y no podían ser evaluados.
SENSITIVITY_SCHEMA es el primero en cambiar eso, y la sensibilidad fue elegida para ir primero por una razón específica: es el único producto cuyo registro se convierte en una pregunta empírica más tarde. Con la utilización y el kink estampados en cadena en cada lectura, el historial eventualmente responde "mercados que se sentaron a medio punto del kink — ¿con qué frecuencia cruzaron, y qué tan rápido?" — y el número de margen deja de ser meramente descriptivo.
Solo las entradas medidas pueden ser atestadas (codificar una no medida lanza un error), y solo se escriben mercados dentro de 5 puntos porcentuales del kink: atestar todo en cada lectura no tiene techo de costo, y un mercado estacionado al 60% de utilización no produce información que un mes después no produciría.
Controlado por EAS_SENSITIVITY_SCHEMA_UID. Vacío significa que el disparador simplemente no se ejecuta — el mismo interruptor por omisión que usó la migración de señal v2. Registrarlo cuesta gas real y requiere un CONFIRM tipado a través de npm run register-schema.
Verificabilidad
Escrito completo con cada artefacto en cadena, el comando exacto para verificar cada uno y una lista honesta de lo que el stack no resuelve:
docs/verifiable-agent-trust.md.
Dos formas independientes de comprobar que una respuesta no fue manipulada o fabricada, ninguna requiere que confíes en el tiempo de actividad de este servidor en el momento de comprobar:
- Respuestas firmadas — cada respuesta REST/MCP está firmada (datos tipados EIP-712) por la misma dirección
payToque nombra el requisito de pago 402. El struct (asset,bestProtocol,weightedApyBps,gapBps,asOf,contentHash) refleja el esquema EAS en cadena a continuación, más uncontentHash(keccak256del cuerpo exacto de la respuesta) que lo vincula a la respuesta completa. REST: cabecerasX-Signal-Signature/X-Signal-Signer/X-Signal-Eip712-Payload. MCP: un bloque de contenido hermano. Verifica con elverifyTypedDatade viem — o simplemente llama agetSignalVerified()desde el paqueteyieldsignal-client, que hace ambas comprobaciones por ti. - Atestaciones en cadena (EAS, red principal de Base) — registros periódicos, públicos y permanentes de "en el tiempo T, el protocolo X pagó Y pbs, Z por delante del subcampeón," comprobables de forma independiente en easscan.org sin confiar en este servidor en absoluto. Misma dirección de atestador que las respuestas firmadas anteriores. Publicadas automáticamente cuando la señal cambia materialmente (el mejor protocolo cambia, o la brecha se mueve ≥25 pbs) o se vuelve obsoleta (>12h desde la última) — ver
src/attestation/autoAttest.tsyPOST /internal/auto-attest(disparado por cron, no en cada llamada pagada — eso no tendría techo de costo).npm run attesttodavía existe para publicación manual bajo demanda. Historial completo enGET /track-record(o/track-record.json). - Descubrimiento de agentes (ERC-8004, red principal de Base) —
GET /agent-card.jsones el archivo de registro; agentId59272ya acuñado enIdentityRegistry. Cualquier comprador REAL (una billetera distinta a la del propio servicio — el contrato bloquea la autoevaluación del propietario/operador) puede dejar comentarios verificables enReputationRegistryejecutandonpm run give-feedback— direcciones/ABI ensrc/attestation/erc8004.ts.
Arquitectura
Proyecto hermano de YieldPilot (un rebalanceador personal de Aave/Morpho/Compound), pero completamente separado: credenciales CDP propias, billetera receptora propia, sin código de runtime compartido. Ver CLAUDE.md y SECURITY.md para el escrito técnico completo y el modelo de amenazas.
src/expressApp.ts— la aplicación Express + puerta de pago x402 (createX402Server,@x402/express), reutilizada tanto por el servidor de desarrollo local (src/server.ts) como por el punto de entrada serverless de Vercel (api/index.ts). Registra una ruta protegida por pago por activo (RESOURCE_PATHS) más una comprobación de actividad/healthno pagada.src/signal/— la lógica de comparación pura y determinista (sin I/O, completamente probada por unidades).src/market-data/— el abastecimiento de datos de dos capas (lecturas directas + DefiLlama), parametrizado por activo (AssetId,USDC/WETH) a través delBASE_ASSETSdeconfig/networks.ts.src/wallet/walletLock.ts— fija la dirección de la billetera receptora (a través deEXPECTED_WALLET_ADDRESSen producción, ya que serverless no tiene disco persistente) para que una rotación de credenciales CDP se detecte ruidosamente en lugar de redirigir pagos silenciosamente.src/mcp.ts— la herramienta MCPget_yield_signal(parámetroassetopcional), controlada por llamada con elcreatePaymentWrapperde@x402/mcp(no el middleware Express de toda la ruta, que también pondría un muro de pago atools/list/initialize).src/market-data/cache.ts— TTL de 30s en cada lector de tasas (directo + DefiLlama), una instancia de caché por activo, para que una ráfaga de llamadas pagadas concurrentes no golpee los endpoints públicos de RPC/API.src/notify/paymentLog.ts— registra pagador/tx/red/monto para cada pago liquidado (onAfterSettle, tanto los servidores de pago REST como MCP) y alerta sobre un pago desde una billetera que no es la del propietario (una venta real).src/usage/— contadores de embudo duraderos (usageStore.ts+usageMiddleware.ts), legibles enGET /usage.json(se requiere autenticación). Cuenta 402s servidos, intentos pagados, liquidaciones, fallos y 404s por ruta/activo. Las etapas del lado de venta (paid_attempt/served/settled/failed) están exentas del presupuesto diario de eventos — el ruido de los rastreadores solía agotarlo antes del mediodía y borraba exactamente las filas que responden "¿esto se vende?". Existe porque los registros de runtime de la plataforma no son accesibles desde fuera, por lo que la única señal auditable solía ser los ingresos en cadena — que no pueden distinguir "nadie llega" de "llegan y no pagan". El backend es cualquier Redis con una API REST; el descubrimiento de credenciales coincide por sufijo de variable de entorno, por lo que una tienda conectada a través del panel de Vercel (que prefija las variables que inyecta) se recoge sin cambio de código. Sin tienda configurada, se degrada a contadores en memoria por instancia y reporta"durable": false.src/cli/withdraw.ts— barre el USDC acumulado a la billetera personal del propietario, se requiereCONFIRMmanual, nunca automático.src/wallet/signerAccount.ts— resuelve la misma billetera receptora consignMessage/signTypedData/sendTransactionexpuestos (createX402Serversolo expone la dirección); utilizado para firmar respuestas y atestación EAS.src/attestation/— definición de esquema EAS y codificación de calldata (pura, probada por unidades);publishAttestation.ts(lógica compartida de envío de tx),queryAttestations.ts(cliente GraphQL de EASScan + decodificador),autoAttest.ts(lógica de decisión pura + orquestación para el disparador automático),trackRecord.ts(comparación entonces-vs-ahora),erc8004.ts(direcciones/ABI del registro ERC-8004).src/cli/registerSchema.ts/src/cli/attestSignal.ts/src/cli/registerAgent.ts/src/cli/giveFeedback.ts— registro de esquema único, publicación manual por atestación, acuñación de identidad ERC-8004 única y comentarios de reputación del lado del comprador, mismo patrónCONFIRMquewithdraw.ts.giveFeedback.tses el único script que deliberadamente resuelve una billetera DIFERENTE awallet/signerAccount.ts— el contrato rechaza comentarios desde la propia dirección del servicio.
Desarrollo local
npm install
npm test # automated tests (market-data readers, signal logic, retry, wallet lock, usage funnel)
npm run signal # live signal, real data, zero credentials needed (`npm run signal -- ETH_STAKING` / `-- WETH` for the other assets)
npm run dev # local x402 server (reads X402_ENVIRONMENT from .env)
npm run test:paid # spins up a test buyer wallet, funds it via the CDP faucet, pays for real (testnet only, REST endpoint)
npm run withdraw # sweep accumulated USDC — asks for typed "CONFIRM"
npm run register-schema # one-time EAS schema registration (mainnet, real gas) — asks for typed "CONFIRM"
npm run attest # publish one on-chain attestation of the current signal (mainnet, real gas) — asks for typed "CONFIRM"
npm run register-agent # one-time ERC-8004 identity mint (mainnet, real gas) — asks for typed "CONFIRM"
npm run give-feedback # a REAL buyer leaves feedback on ReputationRegistry (mainnet, real gas) — asks for typed "CONFIRM". Fails with "Self-feedback not allowed" if run from the service's own wallet.
See .env.example para las variables requeridas. Genera tu propio proyecto/credenciales CDP dedicados en portal.cdp.coinbase.com — nunca reutilices el proyecto de otra persona.
Fuente
github.com/Stakemate369/yieldsignal — código abierto, CI ejecuta typecheck + suite de pruebas completa en cada push/PR.
Por qué Spark, Seamless y Silo no están en la lista de protocolos
Verificado contra yields.llama.fi/pools el 2026-07-16, filtrando chain=Base + symbol=USDC: Spark solo tiene un pool de USDS (no USDC) en Base; Seamless y Silo no tienen ningún pool indexado de Base en este momento. En lugar de inventar un número, estos tres se omiten hasta que exista un mercado real de USDC para ellos en Base — consulta el comentario en src/market-data/types.ts.
Por qué WETH pero no WBTC/cbBTC
Verificado en vivo contra yields.llama.fi/pools el 2026-07-17: no hay un mercado canónico de "WBTC" en Base, solo el cbBTC de Coinbase (un activo diferente), y donde sí tiene un mercado, su APY de suministro se sitúa en ~0-0.2% en los seis protocolos — una señal demasiado plana como para valer la pena venderla ("cuál es mejor" apenas importa cuando todos están empatados cerca de cero). WETH, en cambio, tiene un rendimiento real y distinto en los seis protocolos (0.66%-3.7%), por lo que es el activo que se añadió en su lugar.