DeFi Scout
On-chain financial intelligence across Optimism and Base. Most scripts require no API keys. Exception: cmc-sentiment.js requires CMC_API_KEY (free tier at coinmarketcap.com).
Data Sources
| Source | What | Endpoint |
|---|
| CoinGecko | Token prices | INLINECODE2 |
| DeFiLlama |
Protocol TVL, yields |
api.llama.fi |
| Optimism RPC | Balances, gas |
mainnet.optimism.io |
| Base RPC | Balances, gas |
mainnet.base.org |
| Across API | Bridge quotes |
app.across.to/api/suggested-fees |
Core Scripts
All scripts output JSON. Run with node scripts/<name>.js.
| Script | Purpose |
|---|
| INLINECODE8 | ETH + ERC-20 balances on OP + Base |
| INLINECODE9 |
CoinGecko price for any token |
|
yields.js | Top yield pools on OP + Base from DeFiLlama |
|
gas.js | Current gas on Optimism and Base |
|
bridge-quote.js | Across Protocol bridge fee quote (no deps, 10s timeout) |
|
aave-position.js | Aave V3 health factor + collateral/debt on OP + Base |
|
swap-quote.js | Price-based swap estimate via CoinGecko (price math only — not a protocol-routed quote) |
|
cmc-sentiment.js | BTC dominance, ETH dominance, Fear & Greed index (CoinMarketCap) |
Script Details
aave-position.js
node scripts/aave-position.js <0x-address>
Queries Aave V3 Pool
getUserAccountData on both Optimism and Base via direct JSON-RPC
eth_call. Returns collateral, debt, available borrows, liquidation threshold, LTV, and health factor. Adds a
warning field if health factor < 1.2 (liquidation risk). 8-second timeout per RPC call.
swap-quote.js
node scripts/swap-quote.js <token_in> <token_out> <amount_in> [--chain optimism|base]
# Example: node scripts/swap-quote.js ETH USDC 1.5 --chain base
Fetches live prices from CoinGecko and computes estimated output =
(priceIn / priceOut) * amountIn * 0.997 (0.3% fee estimate). Supported tokens: ETH, WETH, USDC, USDT, OP, VELO, AERO, cbETH.
Not a real quote — use Aerodrome/Velodrome UI for execution.
Workflow
Wallet check: Run wallet-balances.js <address> → summarise balances + USD value.
Opportunity scan: Run yields.js → filter by chain, TVL >$1M, sort by APY. Flag stable pairs (no IL) and volatile pairs separately. Cross-reference gas cost vs position size before recommending entry.
Bridge quote: Run bridge-quote.js <amount_eth> [from_chain=10] [to_chain=8453] → returns fee, fill time, output amount.
Price check: Run token-price.js <coingecko_id> → price, 24h change.
Aave health check: Run aave-position.js <address> → health factor on both chains. Act immediately if < 1.2.
Swap estimate: Run swap-quote.js <tokenIn> <tokenOut> <amount> → rough output estimate for planning. Never use for execution.
Market sentiment: Run cmc-sentiment.js → BTC dom, ETH dom, Fear & Greed. Requires CMC_API_KEY env var. Caches results for 6h.
yields.js flags:
CODEBLOCK2
Error Handling
- - Bad address (
wallet-balances.js, aave-position.js): returns { error: "invalid address" } — always validate 0x format before passing - Unknown token (
swap-quote.js): returns { error: "Unsupported token: XYZ" } — supported list is in script header - RPC timeout: 8s timeout per call; on failure returns
{ error: "RPC timeout" } — retry once before surfacing to user - DeFiLlama offline:
yields.js returns empty array [] — surface as "yield data temporarily unavailable"
Key Addresses (verified)
See references/addresses.md for verified contract addresses on Optimism and Base.
Risk Rules
- - Never recommend pools with TVL < $1M
- Flag APY > 100% as high-risk / likely temporary incentive
- Always show gas cost as % of position before recommending entry
- Stable pairs (USDC-USDT, USDC-msUSD) = lower risk, note explicitly
DeFi Scout
覆盖Optimism和Base链上的链上金融情报。大多数脚本无需API密钥。例外:cmc-sentiment.js需要CMCAPIKEY(可在coinmarketcap.com免费获取)。
数据源
| 来源 | 数据内容 | 接口地址 |
|---|
| CoinGecko | 代币价格 | api.coingecko.com/api/v3/simple/price |
| DeFiLlama |
协议TVL、收益率 | api.llama.fi |
| Optimism RPC | 余额、Gas | mainnet.optimism.io |
| Base RPC | 余额、Gas | mainnet.base.org |
| Across API | 跨链桥报价 | app.across.to/api/suggested-fees |
核心脚本
所有脚本输出JSON格式。使用node scripts/<名称>.js运行。
| 脚本 | 用途 |
|---|
| wallet-balances.js | OP + Base链上ETH + ERC-20余额 |
| token-price.js |
任意代币的CoinGecko价格 |
| yields.js | DeFiLlama上OP + Base链的顶级收益池 |
| gas.js | Optimism和Base的当前Gas费用 |
| bridge-quote.js | Across Protocol跨链桥费用报价(无依赖,10秒超时) |
| aave-position.js | OP + Base链上Aave V3健康因子 + 抵押品/债务 |
| swap-quote.js | 基于CoinGecko价格的兑换估算(仅价格计算 — 非协议路由报价) |
| cmc-sentiment.js | BTC主导率、ETH主导率、恐惧与贪婪指数(CoinMarketCap) |
脚本详情
aave-position.js
bash
node scripts/aave-position.js <0x-地址>
通过直接JSON-RPC eth_call查询Optimism和Base链上的Aave V3 Pool getUserAccountData。返回抵押品、债务、可借额度、清算阈值、LTV和健康因子。若健康因子低于1.2(清算风险),则添加warning字段。每次RPC调用超时8秒。
swap-quote.js
bash
node scripts/swap-quote.js <输入代币> <输出代币> <输入数量> [--chain optimism|base]
示例:node scripts/swap-quote.js ETH USDC 1.5 --chain base
从CoinGecko获取实时价格,计算预估输出 = (priceIn / priceOut) amountIn 0.997(0.3%费用估算)。支持的代币:ETH、WETH、USDC、USDT、OP、VELO、AERO、cbETH。非真实报价 — 请使用Aerodrome/Velodrome界面执行交易。
工作流程
钱包检查: 运行wallet-balances.js <地址> → 汇总余额 + 美元价值。
机会扫描: 运行yields.js → 按链筛选,TVL > 100万美元,按APY排序。分别标记稳定币对(无无常损失)和波动币对。在推荐入场前交叉参考Gas费用与仓位规模。
跨链桥报价: 运行bridge-quote.js [来源链=10] [目标链=8453] → 返回费用、填充时间、输出数量。
价格检查: 运行token-price.js → 价格、24小时变化。
Aave健康检查: 运行aave-position.js <地址> → 两条链上的健康因子。若低于1.2立即行动。
兑换估算: 运行swap-quote.js <输入代币> <输出代币> <数量> → 用于规划的粗略输出估算。切勿用于执行交易。
市场情绪: 运行cmc-sentiment.js → BTC主导率、ETH主导率、恐惧与贪婪指数。需要CMCAPIKEY环境变量。结果缓存6小时。
yields.js参数:
bash
node scripts/yields.js # OP + Base,TVL > 100万美元,前20名
node scripts/yields.js --chain optimism # 仅OP链
node scripts/yields.js --chain base # 仅Base链
node scripts/yields.js --chain all --min-tvl 5000000 # 两条链,TVL > 500万美元
node scripts/yields.js --top 5 # 仅前5名结果
错误处理
- - 无效地址(wallet-balances.js、aave-position.js):返回{ error: invalid address } — 始终在传入前验证0x格式
- 未知代币(swap-quote.js):返回{ error: Unsupported token: XYZ } — 支持列表见脚本头部
- RPC超时:每次调用超时8秒;失败时返回{ error: RPC timeout } — 向用户展示前重试一次
- DeFiLlama离线:yields.js返回空数组[] — 显示为收益数据暂时不可用
关键地址(已验证)
已验证的Optimism和Base链上合约地址请参见references/addresses.md。
风险规则
- - 切勿推荐TVL < 100万美元的池子
- 标记APY > 100%为高风险/可能为临时激励
- 在推荐入场前始终显示Gas费用占仓位的百分比
- 稳定币对(USDC-USDT、USDC-msUSD)= 较低风险,需明确标注