尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Kollat helps you borrow against crypto without selling it: compare rates, limits and liquidation prices across Aave, Spark, Compound, Morpho, Fluid, Euler and Moonwell on six networks. Wallet-signed borrowing is in testing; Kollat never holds your keys or funds.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Read-only comparison of crypto-backed USDC borrowing across Aave v3, Spark, Compound v3, Morpho Blue, Fluid, Euler v2 and Moonwell on Ethereum, Base, Arbitrum, Optimism, Polygon and Avalanche. Paste an address, see what it could borrow on each protocol, at what rate, and where it would be liquidated. Existing positions are shown with the protocol's own health factor.
Non-custodial by construction: there is no wallet connection, no signing, no write path. Every number comes from the protocol's own contracts (or, for Morpho and Euler market discovery, their public APIs) via server-side RPC.檢視完整 README ↗Read-only comparison of crypto-backed USDC borrowing across Aave v3, Spark, Compound v3, Morpho Blue, Fluid, Euler v2 and Moonwell on Ethereum, Base, Arbitrum, Optimism, Polygon and Avalanche. Paste an address, see what it could borrow on each protocol, at what rate, and where it would be liquidated. Existing positions are shown with the protocol's own health factor.
Non-custodial by construction: there is no wallet connection, no signing, no write path. Every number comes from the protocol's own contracts (or, for Morpho and Euler market discovery, their public APIs) via server-side RPC.
npm install
cp .env.example .env.local # optional: private RPC URLs
npm run dev # http://localhost:3000 (homepage) · /borrow (the app)
| Command | What |
|---|---|
npm run dev | Dev server |
npm run build && npm start | Production build |
npm test | Unit tests for the risk math (lib/math/health.ts) |
npm run verify -- <address> [--chain 1|8453] [--protocol <id>] | Print every adapter's markets, rates, capacity and positions for an address, to check against the protocol front-ends |
API routes: GET /api/markets?chain=1,8453, GET /api/account/<address-or-ens>?chain=…, POST /api/decide ({ policy, proposal } → policy decision; see policy.example.json), GET /api/health.
Successful results carry fetchedAt, stale, block, and provenance; failures carry an error. block is the observed head, not proof of an exact-block snapshot. Provenance distinguishes observed heads from fixture contract-read pins and retains cached market dependencies. Dependent reads inherit the oldest market timestamp and any stale flag. Public discovery APIs are not block-pinned.
Every snapshot carries completeness — top-level reads attempted / ok / stale / failed, observed block ranges (including market dependencies), and each failure's code. blockSemantics explicitly labels these ranges as observations, not exact state. Completeness does not count undiscovered markets. A consumer should treat failed > 0 or stale > 0 as "not the whole picture".
With DATABASE_URL configured, decisions, full policy values, complete market/account inputs, and linked snapshot rows commit atomically. A failed write returns HTTP 503 with allow: false; without a database the read-only demo explicitly returns persisted: false. Full audit history at GET /api/decisions?address=… now requires Authorization: Bearer <CRON_SECRET> because it includes policy and account evidence. Legacy records are retained but cannot be made complete retroactively.
See reliability and verification and monitor/webhook setup. npm test includes offline Postgres transaction/outbox tests using test-only in-memory PGlite. The four archive-RPC fixtures remain opt-in via RPC_URL_MAINNET; their API-based market discovery is not an offline fixture.
lib/protocols/types.ts LendingProtocol adapter contract (the product)
lib/protocols/base.ts caching, error-to-value, default capacity calc
lib/protocols/<name>.ts one adapter per protocol
lib/protocols/registry.ts the list of live (protocol, chain) instances
lib/math/health.ts HF, max borrow, liquidation price, cost delta
lib/snapshot.ts joins all adapters into one response for the UI
app/(site)/ marketing homepage (/) — persistent WebGL sphere behind the sections
app/borrow/ the comparison app (/borrow)
components/scene/ particle sphere, starfield, scroll-driven camera
components/site/ homepage sections
components/Rail.tsx borrow simulator (pure over lib/math/health.ts)
scripts/verify.ts CLI cross-check tool
Discovery is deliberately narrow; a position outside it is not shown and a market outside it is not compared. Anyone consuming the API should treat these as the contract:
| Protocol | What is listed | What is not |
|---|---|---|
| Aave v3 / Spark | Every reserve that can collateralise USDC | Positions with non-USDC debt still show, with all debt legs |
| Compound v3 | Native-USDC Comets only | USDC.e Comets (Polygon), bridged-USDbC Comet (Base) |
| Morpho Blue | USDC-loan markets with ≥ $250k supplied; one market per collateral (most liquidity) | Smaller markets, and positions in any market not chosen |
| Fluid | USDC-debt vaults; one vault per collateral (most borrowable) | Smart-collateral / smart-debt vaults, and positions in vaults not chosen |
| Euler v2 | Top 4 USDC vaults by size; one collateral vault per token | Other vaults; positions on sub-accounts whose controller is elsewhere are listed but not folded into simulations |
| Moonwell | Comptroller core markets | Positions in unlisted markets (a note is added when one is detected) |
Simulations fold an existing position into the new borrow only when they share a health factor: the same account-level protocol, the same isolated market, or the same Euler debt vault.
Every protocol is normalised into (collateral → debt) markets with ltv, liquidationThreshold, liquidationPenalty and oracle prices, so one formula computes capacity, health factor and liquidation price for all of them.
ProtocolId in lib/protocols/types.ts.lib/protocols/<name>.ts extending BaseLendingProtocol and implement the three reads: fetchMarkets, fetchRates, fetchPositions. Throw on failure; the base class turns it into a Result error value. Override getBorrowCapacity only if the default (markets × wallet balances) is wrong for the protocol.lib/protocols/registry.ts and add an entry to PROTOCOL_META (name, close factor, app URL).npm run verify -- <address> --protocol <id> against a known position and compare with the protocol's UI before trusting it.Rules: adapters are read-only, no method may build or sign a transaction, and no API keys reach client code.