mcpField
Y
YieldSignal

YieldSignal

远程服务
yieldsignal.vercel.app金融数据011 周前更新

关于 YieldSignal

YieldSignal 为评估 ETH 质押和 Base 借贷市场的自主 Agent 提供风险加权收益信号与分析。其接口涵盖收益、迁移或持有决策、激励可持续性、退出能力、利率敏感度、组合风险敞口和信号持续性,并通过 x402 按次付费。

主要功能

  1. 01比较 ETH 流动性质押收益
  2. 02比较 Base 上 USDC 和 WETH 借贷收益
  3. 03评估迁移或持有决策及净收益
  4. 04衡量激励可持续性与提现能力
  5. 05分析利率敏感度和组合风险敞口
  6. 06查看信号可持续的时间

适用场景

  1. 01分配 ETH 前比较质押服务
  2. 02比较 Base 协议的借贷收益
  3. 03评估指定规模的头寸能否退出
  4. 04重新配置前检查利率与共同风险敞口

MCP 相关

YieldSignal 在 `/mcp` 提供付费 MCP 工具,用于获取收益信号和决策。每次工具调用通过 x402 付费;发现工具和初始化不收费。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://yieldsignal.vercel.app/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

7
参数类型必填说明
assetenum否要获取的收益信号:Base 上的 USDC/WETH 借贷 APY,或 Ethereum 主网上的 ETH_STAKING 流动性质押 APY。默认为 USDC。ETH_STAKING | USDC | WETH

详细介绍

YieldSignal

CI

面向自主 Agent 的风险加权收益信号,通过 x402 协议按次付费——无需 API 密钥,也无需注册。所有产品路由均需付费:信号 $0.10,分析(耐久性/容量/敏感性/敞口)$0.25,决策 $0.50,持久性 $1.00。没有免费套餐,也没有绕过付费的参数。

  • ETH 流动性质押(Ethereum 主网),涵盖 Lido、Rocket Pool、Coinbase Wrapped Staked ETH、Frax Ether 和 Binance Staked ETH
  • USDC 和 WETH 借贷(Base),涵盖 Aave、Compound、Morpho、Moonwell、Euler 和 Fluid

七种产品:原始信号(当前收益最高的选项)、决策(根据资金当前所在位置,判断转移是否值得承担成本——给出 MOVE/HOLD 建议、预期净收益,以及达到盈亏平衡所需的天数)、耐久性报告(激励停止后,有多少 APY 仍能维持)、容量报告(能否从该市场实际提取相应规模的资金)、敏感性报告(距离借款利率暴涨的拐点还有多近)、敞口报告(无论投资分散到多少个场所,投资组合中有多少比例承担相同风险),以及持久性报告(此处的一次调用实际上能维持多久,才会出现领先者变化——根据本服务自身的链上证明记录测得,因此其他数据源都无法提供)。

在线地址: 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

不带资产的 /signal 和 /decision 会重定向到 ETH 质押路由——这是经验证记录最为可靠的资产。像 /signal/usdc 这样的简写形式会重定向到规范路径。

应该相信哪种资产?

别光听我们说:GET /accuracy.json 免费,会返回各资产在容差范围内的命中率和以 bps 为单位的平均遗憾值;这些数据直接根据公开的链上 EAS 记录逐条计算。撰写本文时,质押信号的表现远胜于 USDC 借贷信号(Base USDC 变动太快,导致信号难以保持准确)——这正是旗舰产品选择质押的原因。数据会根据链上数据重新计算,并非在此自行宣称,因此付费前请自行查验。

先尝试不付费调用,就会收到 402 Payment Required 响应,其中会列出确切的价格、资产和网络。任何兼容 x402 的客户端都可以自动完成支付——例如使用 @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

也可通过 https://yieldsignal.vercel.app/mcp 使用付费 MCP 工具:get_yield_signal 和 get_yield_decision,两者都支持可选的 asset("ETH_STAKING"、"USDC" 或 "WETH";默认值为 "USDC",以兼容已发布的集成)。大多数自主 Agent 框架通过 MCP 发现和调用工具,而非使用手动编写的 x402 HTTP 客户端。使用官方 @x402/mcp 包;付费门槛按工具调用设置(tools/list/initialize 仍免费,只有工具调用需要付费)。官方注册表中还提供 elizaOS 插件。

响应格式

每个利率都标明了数据来源——onchain/api(Aave、Compound、Morpho——直接从协议读取)或 defillama(Moonwell、Euler、Fluid——通过 DefiLlama yields API 获取)。不使用估算或编造的数据:如果数据源失败或返回无效数据,就会从响应中省略,绝不猜测。

每个利率也都按照一个明确的基准进行比较(apyBasis: "supply-apy-total-incl-rewards"):基础利息加上激励。这一点很重要,因为原始数据源对“APY”的定义并不一致——链上的 liquidityRate/getSupplyRate 仅包含基础利息,而 DefiLlama 的汇总值和 Morpho 的 netApy 已包含奖励代币。如果不统一口径就直接并列排名,比较的便不是同一回事。对于数据源能分别提供基础利息和激励的情况,每个利率都会逐项列出 apyBaseBps/apyRewardBps;rewardBasis 则说明激励部分的获取方式(reported、inferred、included-not-itemized、unavailable)。如果某个协议的激励完全无法确认,就会列在 incompleteRewardData 中——其 APY 只是下限,并非最终结论。

{
  "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..."
}
深度,以及收益是否来自活动

每个利率还包含 tvlUsd,并通过 tvlBasis 说明该数值的衡量口径——如果来自协议自己的账目,则为 total-supplied(Aave totalAToken、Comet totalSupply、Morpho totalAssetsUsd);如果来自 DefiLlama,则为 aggregator-reported。DefiLlama 报告的是借贷市场的可用流动性。两者衡量的并非同一数量,字段会说明你拿到的是哪种口径。深度很重要,因为流动性不足的市场即使收益率排在首位,也不代表大额资金能够按此利率成交:截至撰写本文时,WETH 的领先收益来自一个规模为 $716k 的市场,其收益中有 59% 来自激励活动。

决策路由会同时考虑这两个因素:/decision/* 会返回 gainDependsOnIncentives 和 positionShareOfDestinationPct,并在易读的 reason 中说明这些信息;如果你的仓位在目标市场中占比较大,也会降低置信度。以下是一条实际响应:

MOVE,置信度为 medium——“从 aave 转到 euler,风险调整后收益提高 +106bps……注意:全部收益都依赖 euler 的激励活动(291bps 中有 172bps 来自激励)——如果活动结束,这部分收益就会消失。注意:你的 $200,000 将占 euler $716,897 市场的 27.9%——占比足以让你进场后稀释你想要获得的利率。”

收益率是真的吗?— /durability/*

将每个协议的 APY 拆分为基础利息和激励,并报告激励结束后的底线收益率:如果奖励活动停止,你还能保留多少收益。在 2026-08-05 的实时数据中,Base 上的 WETH 以 euler 的 299 个基点位居榜首,其中 57.9% 来自激励,底线收益率为 126 个基点;而 aave 的 153 个基点则全部来自基础利息。不考虑激励时,排名会反转。单看信号端点,你会选中 euler。

两条规则可以避免误报:

  • 仅拆分有明细的来源。 rewardBasis: "included-not-itemized" 或 "unavailable" 表示底线收益率未知,该协议会列在 undecomposable 中——绝不会被视为没有激励。没有报告激励,不代表没有激励。
  • 领先者信息不透明时,不作排名判断。 如果当前收益最高的协议无法拆分,rankingChangesWithoutIncentives 会是 null,而不是 false。你仍会得到 bestVerifiableFloor——经证实不依赖激励的最高收益率;无论哪种情况,这都是完全基于测量结果的结论。

仅限基础借贷(USDC/WETH)。 在 2026-08-05 检查实时数据时,所有五个流动性质押来源在 DefiLlama 上的 apyReward: null,每次调用中可拆分的来源均为 0/5,因此 ETH 质押收益的耐久性路由会因“无法确认”而收费。质押收益不受激励影响,这种说法或许合理,但缺少 apyReward 并不能证明这一点;本服务在借贷方面拒绝对 fluid/morpho 作出同样的推断。

刻意不预测日期。 要查询“这项活动何时结束”,最直接的数据源是 Merkl 的 API(earliestCampaignEnd)。在 2026-08-05 检查 api.merkl.xyz/v4/opportunities?chainId=8453&status=LIVE 的实时数据时,Aave、Compound、Euler 和 Fluid 在那里都没有任何 LEND 活动;Morpho/Moonwell 仅以精选的 MetaMorpho 金库形式出现,而这些并不是本服务读取的市场。status=PAST 返回的时间戳为空,因此也无法衡量续期历史。通过猜测金库匹配来覆盖 6 个协议中的 2 个——而且大多数活动按周开展并自动续期——会得出一个看似确定却错误的数字,这与本服务的宗旨背道而驰。

真的能退出吗?— /capacity/*

利用率达到 99% 的借贷市场收益很高,却不让你提现吗;高利率本身就是这一现象的征兆。tvlUsd 无法区分两者——供应额为 $100M、借款额为 $99M,与供应额为 $100M、借款额为 $10M,数值是一样的。

利用率和可用流动性来自协议自己的账本,并在获取利率的同一次调用中读取(Aave:getReserveData 元组;Compound:getUtilization() + totalSupply()),因此不需要额外的 RPC。传入 ?amountUsd= 后,每个协议都会报告该规模现在能否退出(canExitNow)、覆盖率,以及它占市场的份额。

Morpho 和数据来自 DefiLlama 的协议不会公布借款量与供应量,因此会标记为 measured: false,绝不会作为 bestProtocolExecutable 返回。未测量不等于流动性充足。美元数值仅针对 USDC——在付费响应路径中转换 WETH 余额需要价格预言机;WETH 仍会提供利用率,因为利用率没有单位。

距离重新定价还有多近?— /sensitivity/*

借贷利率不是一个数字,而是利用率的函数,中间有一个拐点。低于拐点时,利率缓慢上升;高于拐点后,利率则急剧上升。以下是 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%

Compound 的 USDC 市场距离拐点仅差0.18 个百分点。单看信号端点,只会看到健康的 3.29% 供应 APY,对此只字未提。

拐点和两段斜率均从各协议自身的利率合约中读取。对于 Compound,重建出的曲线会与 getBorrowRate(u)(合约自身的纯函数)进行核对,并且在利用率为 50/85/90/93/99% 时逐 wei 完全匹配;对于 Aave,则会根据合约自身报告的上限检查曲线形状(base + slope1 + slope2 == getMaxVariableBorrowRate)。如果任一检查未通过,就会剔除该协议,而不会提供根据已变更公式推导出的数值。

这也是此服务首条面向借款人而非贷款方的路由。

仅支持 Aave 和 Compound。 Morpho 的 AdaptiveCurveIRM 有三项彼此独立的问题,均已通过实时检查确认:其曲线常数未在链上公开(CURVE_STEEPNESS、TARGET_UTILIZATION、ADJUSTMENT_SPEED 和 INITIAL_RATE_AT_TARGET 都是 internal constant,因此使用它们就意味着硬编码从代码库复制的数值);可读取的 rateAtTarget(id) 是随时间变化的状态,而非静态曲线,因此“利用率为 95% 时的利率”没有固定答案;此外,此服务读取的是一个金库(Gauntlet USDC Prime,5 个抵押品不同的 Blue 市场合计 4.29 亿美元),其策展人可随时重新分配资金。Moonwell、Euler 和 Fluid 的数据来自 DefiLlama,完全无法读取曲线。所有这些协议都会标记为 measured: false,绝不会标记为稳定。

三种封装,同一种风险 — /exposure/*
GET /exposure/usdc-base-yield?positions=aave:200000,compound:50000,morpho:150000

市场上充斥着事件检测器——脱锚警报、黑客攻击警报、清算警报——而且大多数都是免费的。但没有一个能回答真正会让人亏钱的问题:我是否暴露于风险之中?风险通过什么路径传导?

在 Stream Finance 崩盘事件中,约 320 个 MetaMorpho 金库中只有 1 个直接持有出问题的资产(70 万美元坏账),但由于风险是间接传导的,9,300 万美元的损失最终演变成 2.85 亿美元的传染性损失。事件在数小时内就已公开;真正伤害人们的,是他们不知道自己距离风险只有两跳。

以上投资组合在 2026-08-06 的实际读数:

$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

三个交易场所中,可归因部分的 81% 都集中在一种抵押品上。kink 一行说明了另一件事:Aave 和 Compound 都恰好在 90% 利用率时重新定价,因此把资金分散到两者之间,对冲利用率冲击毫无作用。

不同协议的归因方式各不相同,因为风险拓扑各异,而 basis 字段会说明你得到的是哪种归因:

  • Morpho(isolated-market)——每个 Blue 市场都采用单一抵押品并彼此隔离,因此归因准确。
  • Compound(collateral-basket)——一个基础资产对应一个定义好的抵押品篮子,按实际存入的抵押品加权(totalsCollateral × Comet 自身的价格馈送)。测得:cbBTC 43.1%、WETH 37.4%、tBTC 7.8%、cbETH 6.9%、wstETH 4.8%。
  • Aave ——报告为无法归因,并非因为我们没有尽力:v3 的供应方会暴露于整个资金池的抵押品集合。将其归因到单一资产是不准确的,而将其拆分到所有资产上,又会让人误以为存在实际上并不存在的多元化。

百分比是相对于可归因资金计算的,而非总资金——若按总资金计算,比例会更低,显得集中度不高,但事实是可见性不足。coverage 会同时报告这两种数据。

这衡量的是结构性共同风险敞口——即“这些仓位依赖同一个东西”这一事实——而非统计相关性。要说明它们的联动程度,需要本服务并不具备的价格历史数据,而且那也只是把较弱的结论包装成较强的说法。

**刻意不提供递归抵押品检测。**我们对 Base 上 77 个仍在运行的 Morpho 市场进行了实时检查:没有发现循环,也没有发现同时作为抵押品和借贷资产的资产。更糟的是,导致 Stream 崩盘的递归关系根本不在借贷图谱中——而是在合成资产的发行中(xUSD 由使用借入的 USDC 融资的仓位作为支持)。在整个崩盘过程中,循环检测器都会报告“一切正常”。虚假的安全感比误报更糟糕。

答案能维持多久?——/persistence/*
GET /persistence/usdc-base-yield

这里的其他所有端点,以及所有竞品收益数据源,回答的都是现在什么收益最高。没有一个能回答这种情况能持续多久,而这才是决定是否值得花费 Gas 转移资金的关键数字。

此端点根据该服务在 Base 上每小时发布的证明数据,给出了答案。过去 24 天的 439 条证明显示,这三种资产根本不是同一种产品:

资产领先者变更次数领跑时长中位数每 $10k 值得追逐的金额,未扣除 Gas
WETH 借贷0> 518h(下限,已删失)$6.50
ETH 流动性质押1026h$0.018
USDC 借贷1672h$0.011

这 167 次 USDC 切换中,有一半是在同两个协议之间往返切换(compound <-> fluid)。照着这个信号行动,花在 Gas 上的钱比收益还多——而在此端点出现之前,目录里没有任何内容说明这一点。

它还用实证解决了几乎所有人都会做出的一个假设:**领先幅度越大,不代表持续时间越长。**在 177 段已结束的领先期中,Spearman 相关系数为 -0.04;0-24bps 和 >=300bps 两个区间的中位数都为 2h。差距大小不能作为可靠的信心指标,而这个数字只在此处公布——即便它对发布数据的服务不利,也照样公布。

/decision/* 路由会在内部使用这些数据:预期收益按你指定的时间范围或实测领先时长进行预测,取两者中较短者。根据一个只持续 2h 的优势做 30 天预测,正是导致系统建议执行只能赚回 Gas 费的 MOVE 的原因。

限制如实写入载荷,而非藏在脚注里:观测间隔为 1h,因此短于此时长的领先期不可见;尚未发生领先者变更的资产会报告带有删失标记的下限,绝不会报告中位数;每项数据都会附带样本量,样本太小时则为 null。每个输入都是公开的证明 UID——从 base.easscan.org 重新计算整份报告,无需信任此服务,即可得到相同的数据。

信号有效期有多长?

GET /accuracy.json(免费)提供两项独立指标,均根据公开的链上证明数据得出:

  • score — 方向性指标:按当前市场情况评分时,被标记的协议是否仍是领跑者(或落后不超过 25bps)。
  • windowedScore — 根据每条证明自身的有效窗口进行评估,即直到该资产的下一条证明将其替代为止。medianWindowHours 给出了“应该多久重新检查一次?”这一问题的实用答案,而且不同市场之间差异显著:截至 2026-07-30 的记录显示,ETH 流动性质押和 WETH 借贷为 13h,Base 上的 USDC 借贷为 1h。USDC 轮换很快;这是市场本身的特性,并非端点刻意隐瞒的缺陷。
业绩记录如今涵盖的不只是信号

这项服务的核心论点是可验证,而非空口承诺——在 2026-08-06 之前,EAS 记录仅涵盖信号。四款分析产品借助信号建立的信誉进行销售,却没有为信号贡献任何内容,也无法评估其表现。

SENSITIVITY_SCHEMA 是第一个改变这一状况的产品。选择敏感度作为首个产品有一个具体原因:它是唯一一个其记录日后会转化为实证问题的产品。每次读取时,利用率和拐点都会上链记录,历史数据最终便能回答这个问题:“距离拐点不到 0.5 个百分点的市场,有多大概率突破拐点?突破得有多快?”——而可用空间数值也不再只是描述性数据。

只有实测条目才能获得证明(对非实测条目进行编码会报错),且只会写入距离拐点 5 个百分点以内的市场:每次读取都为所有市场生成证明没有成本上限,而且利用率停留在 60% 的市场,一个月后也不会产生任何新信息。

由 EAS_SENSITIVITY_SCHEMA_UID 控制。值为空时不会运行触发器——这与 v2 信号迁移采用的通过省略来切换的方式相同。注册需要实际支付 Gas,并且必须通过 npm run register-schema 输入并确认 CONFIRM。

可验证性

完整说明涵盖所有链上产物、验证每项产物的确切命令,以及对这套技术栈无法解决的问题的坦诚清单:docs/verifiable-agent-trust.md。

有两种相互独立的方式可以检查响应是否遭到篡改或伪造;检查时都不需要信任该服务当时是否在线:

  • 签名响应——每个 REST/MCP 响应都由 payTo 地址(与 402 支付要求中指定的地址相同)使用 EIP-712 类型化数据签名。结构体(asset、bestProtocol、weightedApyBps、gapBps、asOf、contentHash)与下方的链上 EAS schema 相对应,另外还包含一个 contentHash(对完整响应正文执行 keccak256 得出),用于将签名绑定到完整响应。REST:X-Signal-Signature/X-Signal-Signer/X-Signal-Eip712-Payload 标头。MCP:额外的内容块。可以使用 viem 的 verifyTypedData 进行验证,也可以直接调用 yieldsignal-client 包中的 getSignalVerified(),它会替你完成这两项检查。
  • 链上证明(EAS,Base 主网)——定期发布的公开永久记录,记载“在时间 T,协议 X 支付了 Y bps,比第二名高出 Z”,可在 easscan.org 上独立验证,无需信任该服务。证明地址与上述签名响应使用的地址相同。信号发生重大变化时(最佳协议发生切换,或差距变动 ≥25bps),或信号过期时(距离上次证明超过 12 小时),会自动发布——参见 src/attestation/autoAttest.ts 和 POST /internal/auto-attest(由 cron 触发,不会在每次付费调用时触发——否则就没有成本上限)。npm run attest 仍可用于手动按需发布。完整历史记录见 GET /track-record(或 /track-record.json)。
  • Agent 发现(ERC-8004,Base 主网)——GET /agent-card.json 是注册文件;agentId 59272 已在 IdentityRegistry 上铸造。任何真实买家(钱包地址必须与服务自身不同——合约会阻止所有者/运营者自我反馈)都可以运行 npm run give-feedback,在 ReputationRegistry 留下可验证的反馈——地址/ABI 见 src/attestation/erc8004.ts。

架构

与 YieldPilot(个人 Aave/Morpho/Compound 再平衡工具)的兄弟项目,但完全独立:使用自己的 CDP 凭据、自己的接收钱包,不共享运行时代码。完整技术说明和威胁模型请参阅 CLAUDE.md 和 SECURITY.md。

  • src/expressApp.ts — Express 应用和 x402 付款门控(createX402Server、@x402/express),由本地开发服务器(src/server.ts)和 Vercel 无服务器入口(api/index.ts)共同复用。为每种资产注册一个受付款保护的路由(RESOURCE_PATHS),另提供无需付款的 /health 存活检查。
  • src/signal/ — 纯粹、确定性的比较逻辑(无 I/O,已进行完整的单元测试)。
  • src/market-data/ — 两层数据来源(直接读取 + DefiLlama),通过 config/networks.ts 的 BASE_ASSETS 按资产(AssetId、USDC/WETH)参数化。
  • src/wallet/walletLock.ts — 固定接收钱包地址(生产环境通过 EXPECTED_WALLET_ADDRESS 设置,因为无服务器环境没有持久磁盘),确保 CDP 凭据轮换时会发出明显警报,而不是悄悄重定向付款。
  • src/mcp.ts — get_yield_signal MCP 工具(asset 参数可选),通过 @x402/mcp 的 createPaymentWrapper 对每次调用实施付款门控(而非使用保护整个路由的 Express 中间件,后者也会对 tools/list/initialize 收费)。
  • src/market-data/cache.ts — 为每个利率读取器(直接读取 + DefiLlama)设置 30 秒 TTL,每种资产各用一个缓存实例,避免大量并发付费调用给公共 RPC/API 端点造成过大负载。
  • src/notify/paymentLog.ts — 记录每笔已结算付款的付款方、交易、网络和金额(通过 REST 和 MCP 付款服务的 onAfterSettle),并在收到非所有者钱包的付款(实际销售)时发出警报。
  • src/usage/ — 持久化漏斗计数器(usageStore.ts + usageMiddleware.ts),可通过 GET /usage.json 查看(需要身份验证)。按路由/资产统计已返回的 402、付费尝试、结算、失败和 404。销售环节的阶段(paid_attempt/served/settled/failed)不计入每日事件预算——爬虫噪声过去会在中午前耗尽预算,恰好抹去回答“这能卖出去吗?”所需的记录。之所以需要这些计数器,是因为无法从外部访问平台运行时日志,过去唯一可审计的信号是链上收入,而它无法区分“无人访问”和“有人访问但没有付款”。后端可以是任何提供 REST API 的 Redis;凭据发现按环境变量后缀匹配,因此通过 Vercel 仪表板连接的存储(其注入的变量会带前缀)无需改动代码即可识别。未配置存储时,会降级为每个实例各自的内存计数器,并报告 "durable": false。
  • src/cli/withdraw.ts — 将累积的 USDC 转至所有者的个人钱包;必须手动输入 CONFIRM,绝不自动执行。
  • src/wallet/signerAccount.ts — 使用公开的 signMessage/signTypedData/sendTransaction 解析同一接收钱包(createX402Server 仅公开地址);用于响应签名和 EAS 证明。
  • src/attestation/ — EAS 架构定义和调用数据编码(纯逻辑,已进行单元测试);publishAttestation.ts(共享交易发送逻辑)、queryAttestations.ts(EASScan GraphQL 客户端和解码器)、autoAttest.ts(用于自动触发的纯决策逻辑和编排)、trackRecord.ts(当时与现在的对比)、erc8004.ts(ERC-8004 注册表地址/ABI)。
  • src/cli/registerSchema.ts / src/cli/attestSignal.ts / src/cli/registerAgent.ts / src/cli/giveFeedback.ts — 分别用于一次性架构注册、手动发布每条证明、一次性铸造 ERC-8004 身份,以及买方反馈信誉;采用与 withdraw.ts 相同的 CONFIRM 模式。giveFeedback.ts 是唯一一个会刻意解析不同于 wallet/signerAccount.ts 的钱包的脚本——合约会拒绝来自服务自身地址的反馈。

本地开发

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.

所需变量请参阅 .env.example。请在 portal.cdp.coinbase.com 创建专用的 CDP 项目和凭据,切勿重复使用其他项目的凭据。

源代码

github.com/Stakemate369/yieldsignal — 开源项目,每次推送或提交 PR 时,CI 都会运行类型检查和完整测试套件。

为什么协议列表中没有 Spark、Seamless 和 Silo

截至 2026-07-16,已通过 yields.llama.fi/pools 查询,并筛选 chain=Base 和 symbol=USDC:Spark 在 Base 上只有 USDS 池(没有 USDC 池);Seamless 和 Silo 目前在 Base 上都没有已索引的池。我们不会编造数据,因此在 Base 上出现真实的 USDC 市场之前,这三者都会被排除在外——请参阅 src/market-data/types.ts 中的注释。

为什么有 WETH,但没有 WBTC/cbBTC

截至 2026-07-17,已通过 yields.llama.fi/pools 查询实时数据:Base 上没有名为“WBTC”的规范市场,只有 Coinbase 的 cbBTC(另一种资产);而且在有市场的情况下,其供应 APY 在全部六个协议中都约为 0-0.2%——这个信号过于平淡,不值得推荐(当所有人的收益率都接近零时,“哪个最好”几乎无关紧要)。相比之下,WETH 在全部六个协议中都有实际且各不相同的收益率(0.66%-3.7%),因此我们添加了这种资产。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。