@ 1delta/ 边际- fetcher
多protocol出借数据采集器,支持Morpho Blue, Aave V2/V3, 化合物 V2/V3,欧拉,伊尼特,利斯塔·达奥和莫尔福·米德尼特. 提供公共市场数据 (比率、TVL、配置)和每个用户的位置数据(余额、股份、抵押品) 统一格式.
Morpho Blue 是如何工作的
议定书概览
摩福蓝是一个 孤立市场 贷款协议。 不同于集合协议 (ave,化合物),所有资产共用一个池,每个Morpho市场是一个 独立对 由五个参数定义:
| 参数 | 说明 |
|---|---|
loanToken | 可提供和出借的资产 |
collateralToken | 以抵押形式交存的资产 |
oracle | 配对的价格预告 |
irm | 利率示范合同 |
lltv | 贷款与收入之比(18-十进制) |
这五个参数被散成 uniqueKey (字节32),表示
市场链.
利率模式
Morpho使用一个 适应曲线 IRM 根据利用率调整费率 相对于90%的目标:
utilization = totalBorrowAssets / totalSupplyAssets
If utilization > 90%: rateAtTarget increases over time (via exponential adjustment)
If utilization < 90%: rateAtTarget decreases over time
borrowRate = curve(rateAtTarget, utilization)
supplyRate = borrowRate * utilization * (1 - fee)
曲线使用4x的陡度因子,表示在充分利用时速为: 4x的速率目标。 速率按每秒WAD值和复合值存储 持续.
密钥常数 :
- 目标利用: 90% (单位:千美元)
- 曲线陡峭度编号: 4x
- 目标负率:~0.1% APY
- 目标最大比率: ~200 % APY (韩语)
- 调整速度: 50x/年(责任)
股份制会计
位置通过 份额 而不是原始资产。 允许 不按用户更新存储的利息累积 :
assets = shares * (totalAssets + 1) / (totalShares + VIRTUAL_SHARES)
何处 VIRTUAL_SHARES = 1e6 防止股本通膨.
市场数据说明
每个莫福市场生产 两个条目 在常态输出中:
-
贷款入帐 ——可借款资产
- 有过
borrowingEnabled: true, (中文(简体) ),collateralActive: false - 包括存款/借款
- 奖励(MORPHO标志性奖励)
- 有过
-
担保项 ——抵押资产
- 有过
borrowingEnabled: false, (中文(简体) ),collateralActive: true - LTV 市场因素
lltv - 没有利率(担保在莫尔福没有收益)
- 有过
白名单对未上市市场
恶毒的市场可能是 白名单 (经检验,可见于Morpho UI)或
未列出 (从治所除名). 这个 includeUnlistedMorphoMarkets 旗帜
控制是否从 API 获取未列出的市场。 未上市的市场是
标记为 isListed: false 编辑 MorphoMarket 参数.
建筑
数据获取策略
获取器使用 混合办法 引导每个贷款人到一个API 或链上路径 :
getLenderPublicDataAll(chainId, lenders, ...)
├── lenderCanUseApi(lender, chainId)?
│ ├── YES → getLenderPublicDataViaApi() → Morpho GraphQL API
│ └── NO → getLenderPublicData() → On-chain multicall via Morpho Lens
└── Promise.all([onChain, api]) → merged result
Morpho Blue 使用 API 软件 在大多数铁链上。 链回落用于 没有API支持的链(OP Mainnet, Soneium, Hemi, Berachain, Sei).
API 路径 (GraphQL)
获取从 https://blue-api.morpho.org/graphql数字 :
fetchMorphoMarkets(chainId, includeUnlisted)
→ GraphQL query (paginated: 200/page, 2 pages for Ethereum mainnet)
→ GetMarketsResponse
→ convertMarketsToMorphoResponse()
→ { [marketId]: MorphoGeneralPublicResponse }
API提供预先计算的APY、USD值和奖励数据。 业余活动 在正常化期间实行转换.
链上路径( Morpho Lens)
使用自定义的镜头合同,该合同将返回紧凑的二进制编码市场数据:
buildMorphoCall(chainId)
→ multicall to MORPHO_LENS.getMarketDataCompact(morpho, marketHashes[])
→ chunks of 50 markets per call (calldata size limit)
→ raw bytes response
getMorphoMarketDataConverter()
→ decodeMarkets(bytes) // 256-byte records → Market[]
→ MathLib.getBorrowApy(...) // compute rates from rateAtTarget + utilization
→ MathLib.getSupplyApy(...)
→ { [marketId]: MorphoGeneralPublicResponse }
二进制编码(每个市场256字节)
Offset Size Field
0 20 loanToken (address)
20 20 collateralToken (address)
40 20 oracle (address)
60 20 irm (address)
80 16 lltv (uint128)
96 32 price (uint256) — collateral/loan exchange rate in WAD
128 32 rateAtTarget (uint256) — per-second interest rate
160 16 totalSupplyAssets (uint128)
176 16 totalSupplyShares (uint128)
192 16 totalBorrowAssets (uint128)
208 16 totalBorrowShares (uint128)
224 16 lastUpdate (uint128) — timestamp
240 16 fee (uint128)
用户数据路径
buildMorphoUserCallWithLens(chainId, account, lender, marketIds)
→ MORPHO_LENS.getUserDataCompact(marketHashes[], account, morpho)
→ chunks of 100 markets per call
decodePackedMorphoUserDataset(hex)
→ [uint16 count] + [130-byte records × count]
→ BalanceInfo[] { index, supplyShares, borrowShares, supplyAssets, borrowAssets, collateral }
getMorphoUserDataConverterWithLens()
→ map balances to market IDs via index
→ separate loan positions (supply/borrow) from collateral positions
→ format to UserData with USD values
文件结构
src/lending/
├── public-data/
│ ├── fetchLenderAll.ts # Hybrid router (API vs on-chain)
│ ├── fetchLender.ts # On-chain multicall dispatcher
│ ├── fetchLenderExt.ts # API dispatcher
│ └── morpho/
│ ├── fetchPublic.ts # GraphQL query + fetch logic
│ ├── convertPublic.ts # API response → normalized format
│ ├── publicCallBuild.ts # Morpho Lens call builder
│ ├── getMarketsFromChain.ts # On-chain response → normalized format
│ └── utils/
│ ├── evmParser.ts # Binary decoder (256-byte records)
│ ├── mathLib.ts # WAD math, rate calculations
│ └── parsers.ts # LTV parsing, number formatting
├── user-data/
│ └── morpho/
│ ├── userCallBuild.ts # User position call builder
│ ├── decoder.ts # User data binary decoder
│ ├── userCallParse.ts # Balance → UserData conversion
│ ├── morphoLib.ts # Share ↔ asset conversion
│ └── types.ts # Parameter position enums
└── ...
src/types/lender/
└── morpho-types.ts # GetMarketsResponse, MorphoMarket, MorphoGeneralPublicResponse
Lista DAO 扩展名
Lista是一款有额外的每个市场田地的Morpho Blue分叉. 使用357字节 二进制记录而不是256:
| 额外字段 | 类型 | 说明 |
|---|---|---|
minLoan | 宾特128 | 最低贷款额 |
hasWhitelist | 嘘 | 市场是否有准入控制 |
loanProvider | 地址 | 贷款代号的 Yield 来源 |
collateralProvider | 地址 | 抵押品的 Yield 来源 |
broker | 地址 | 核准的经纪人合同 |
用户数据还包括在余额之前准备的每个市场白名单旗 记录.
定期经纪人LendingBroker(中文(简体) )
一些Lista市场注册a LendingBroker 强制性债务方
摩诃叉市场之门户. 抵押品供应/抽水仍无进展
通过正常的摩拉道,但 借钱还钱,通过经纪人, (中文(简体) ),
在原始的Moolah位置之上,它覆盖了一个更丰富的债务模式。 这个
链上经纪人是 ERC-1967 代理(例如 BNB) 0x1Fa2…8b54 - 冲动
0xb680…58bb),经核实的来源 LendingBroker.sol 编号 : BrokerMath.sol获取器
生活补助
lending/public-data/lista/listaBroker.ts· ;
编曲编码器 contracts-delegation (单位:千美元)ListaBrokerLending.sol, (中文(简体) ),
CalldataLib.encodeListaBroker*) (中文(简体) ).
每个用户有两个债务桶. 一个中介市场 无弹性/可变 借款 在Moolah层
- N 定期职位 ——每个
{posId, principal, apr, start, end, …}带有 a 的分档 锁定 APR和一个成熟。 已确认posId。 。 。 . - 一个动态位置 ——可变速率位置,"接通"桶.
目标在于哨兵的还款
posId == type(uint128).max(单位:千美元)LISTA_BROKER_DYNAMIC_POS) (中文(简体) ).
broker.getUserTotalDebt(user) 是权威总计(固定+动态+)
(所有利息).
借款
作曲家打电话 borrow(amount, termId, user, receiver)。 。 。 . user (单位:千美元)
职位拥有者)是 总是认证的呼叫者 并且必须获得授权
莫奥拉的作曲家setAuthorization——债务永远无法针对
别人 经纪人从Moolah那里借了钱,把贷款抵押给
receiver。 。 。 .
原生 : 经纪人 能够 取消WBNB BNB,但只保留其EOA直接
borrow(amount)编号 :borrow(amount, termId)负担过重msg.sender。 。 。 . 这个receiver- 作曲家必须使用的变种(Moolah需要receiver == broker当经纪人注册时) 总是发送ERC20 WBNB, 永远不是本地人提供本地BNB, 连锁在借款后的未包装步骤.
偿还
encodeListaBrokerRepay(loanToken, assets, native, broker, posId, onBehalf) →
repay(amount, posId, onBehalf) (固定)或 repay(amount, onBehalf) (动力学,
发送器 posId) (中文(简体) ).
- 先是利息,然后是校长.
onBehalf直接取自调用数据( 恰好像 Morpho 的回报)onBehalfOf() ——只偿还债务并退还超额 作曲家,这样 二分之一的回报是无权限的。必须是非零(经纪人) 返回数ZeroAddress)),没有呼叫者退后.assets == 0偿还作曲家的完整余额( e)balanceOf编号 :selfbalance);经纪人退还任何超额. 干净的"关闭它" 模式:略微多出资金,用assets == 0,取出尘.- 原生 : 两者的偿还超载都是
payable并包装msg.value内部 (关于LOAN_TOKEN == WBNB,则NativeNotSupported) (中文(简体) ). 那个作曲家 本地路径向上转发值并跳过 ERC20 批准 。 超额退款作为 原生 BNB 给作曲家(未按明确数量进行洗刷).
提前还款处罚
偿还固定职位 校长之前 end 罚款
(单位:千美元)BrokerMath.getPenaltyForFixedPosition:
penalty = ceil( ceil(repayPrincipal × aprPerSecond / RATE_SCALE) × timeLeft / 2 )
≈ 其余的本金仍为利息的一半
任期它从本金上省了下来 供应到Moolah金库
作为收入,所以它是 添加剂 - 在顶部 outstanding + accruedInterest。 。 。 .
惩罚是 0 已成熟 (单位:千美元)block.timestamp > end) (中文(简体) ). 拾取者把它浮出水面
每笔贷款 earlyRepayPenalty (对 全额未付本金· ;
部分的线性缩放)。 用经纪人的
previewRepayFixedLoanPosition(user, amount, posId) 准确的
(interest, penalty, principal) 分页.
成熟度和再融资
一个固定位置 利息冻结时间 end
(单位:千美元)getAccruedInterestForFixedPosition 上限为 position.end; 成熟后它会
累积的利息不再有固定利息,不处罚.
refinanceMaturedFixedPositions(user, posIds) 是一个 只有机器人 函数
(单位:千美元)onlyRole(BOT))——用户和作曲家 无法 调用它,所以它是 没有
被曝光为SDK/组合对手. 它将成熟的固定位置迁移到
活性桶:净本金+已冻结利息在当下正常化
动态速率并加入动态位置,固定位置是
删除。成熟和机器人呼叫之间的窗口是无息的
(协议吸收它).
迟付
| 何时 | 目标 | 费用 |
|---|---|---|
在此之前 end | 已固定 posId | 本金+应计利息+ 提前处罚 |
之后 end在机器人再融资之前 | 已固定 posId | 特等+ 冻结 利息, 无处罚 - 最便宜的 |
| 机器人再融资后 | 动态 发送器 | 本金+再融资所得利息+ 动态利率利息 |
再融资是一种种族. 以成熟者为目标的回报
posId返回数 (单位:千美元)position not found如果机器人首先重新融资; 回到动态 报答。 成熟但尚未筹资的窗口(isMatured: true, (中文(简体) ),earlyRepayPenalty: '0')是最便宜的报答时间.
数据形状
中间商市场喷出 无可变债务 - 这个职位是 debt 实值 0,则
权威总数 debtStable,每笔固定贷款按项目分列
terms[] 数组( r)ListaTermLoan:
| 外地 | 说明 |
|---|---|
loanId | posId - 偿还目标 LISTA_BROKER_REPAY 编曲操作 |
debt | 未偿(主要+应计利息)贷款单位 |
aprFraction | 锁定固定的 APR 分数 |
maturity 编号 : termDays | unix 到期时间戳/ 任期长度 |
accruedInterest | 未清应计利息 |
earlyRepayPenalty | 立即关闭贷款; 0 已到期 |
isMatured | now >= end |
说明:
terms[]目前只逐项列出固定贷款。 动态位置 (后再融资)列入debtStable总计但尚未浮出 其可偿还期限.
午夜延长时间
Morpho Midnight 只是一个基地, 固定比率/固定成熟度 借贷协议
建于一个 链外签名报价单 (零息信贷/债务)
(单位) 不是莫福蓝叉因此它被模拟为自己的
'midnight' 提供者(Lender.MORPHO_MIDNIGHT, (中文(简体) ), isMidnight(没有)
isMorphoType。没有池和利用率曲线:
从每个报价 tick 价格及其时间与成熟度,只能通过
API (英语). 每个成熟度都是自己孤立的市场,按键
MORPHO_MIDNIGHT_<marketId>。 。 。 .
API 第一次获取
与Morpho Blue的GraphQL-then-on-chain杂交不同,午夜公共数据是
仅限 API ——无链上公众退缩 fetchLenderAll编辑
捡取者住在
lending/public-data/midnight/数字 :
apiClient编号 :fetchPublic- 一个ApiBookSource读取顺序书 市场GET /books/{id}从午夜API。 基础 URL 解析 覆盖 ~ 配置 ~ 主机默认( )https://api.morpho.org/v0/midnight; 计 数 工人们可以把它指向dev API通过MIDNIGHT_API_BASE(见data-sdksetMidnightApiBase) (中文(简体) ).math.ts- 移植TickLib(单位:千美元)tickToApr)等),比特校验对@morpho-org/midnight-sdk。 。 。 .convertPublic——将本作规范化为MorphoGeneralPublicResponse键MORPHO_MIDNIGHT_<id>,排放固定借款/供应APR和a 单身params.market.terms[](单位:千美元){termId, durationSecs, durationDays, apr}具有成熟度的——所以 成熟度流经相同的通用terms[]路径作为 Lista 的固定贷款. 单位在 贷款代号的小数 (不是18个):assets = units × price / WAD这样units ≈ assets。 。 。 .
用户职位({credit, debt, collateral[128], collateralBitmap}改为:
通过多点呼叫
lending/user-data/midnight/,一个 UserData
每个市场.
范围: 获取者和直接现场行动(供应担保/ 借过
take/还/取)有线. 由作曲者引导的杠杆和 推迟原生乙型六氯环己烷——见calldata-sdk/src/generic/midnight/COMPOSER.md。 。 。 .