// Lists Euler v2 vaults for USDT / USDC / WETH on a chain, ranked by totalAssets, with their accepted collaterals. // Usage: RPC= FACTORY= node scripts/scan-vaults.mjs import fs from 'fs' import { Contract, JsonRpcProvider } from 'ethers' const p = new JsonRpcProvider(process.env.RPC) const factory = new Contract(process.env.FACTORY, ['function getProxyListLength() view returns (uint256)', 'function getProxyListSlice(uint256,uint256) view returns (address[])'], p) const want = { USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7', USDC: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', WETH: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2' } const n = Number(await factory.getProxyListLength()) const list = await factory.getProxyListSlice(0, n) const abi = ['function asset() view returns (address)', 'function totalAssets() view returns (uint256)', 'function totalBorrows() view returns (uint256)', 'function cash() view returns (uint256)', 'function name() view returns (string)', 'function governorAdmin() view returns (address)', 'function LTVList() view returns (address[])', 'function LTVBorrow(address) view returns (uint16)'] const out = [] for (let i = 0; i < list.length; i += 20) { await Promise.all(list.slice(i, i + 20).map(async a => { const v = new Contract(a, abi, p) try { const asset = (await v.asset()).toLowerCase() const sym = Object.keys(want).find(k => want[k].toLowerCase() === asset) if (!sym) return const [ta, tb, cash, name, gov, ltvs] = await Promise.all([v.totalAssets(), v.totalBorrows(), v.cash(), v.name(), v.governorAdmin(), v.LTVList()]) out.push({ sym, a, ta, tb, cash, name, gov, ltvs }) } catch (e) {} })) } console.error('scanned', n) out.sort((x, y) => (y.ta > x.ta ? 1 : -1)) for (const s of Object.keys(want)) { console.log('== ' + s) for (const o of out.filter(o => o.sym === s).slice(0, 6)) console.log(o.a, o.name, 'assets', o.ta.toString(), 'cash', o.cash.toString(), 'borrows', o.tb.toString(), 'gov', o.gov, 'collaterals', o.ltvs.length) } console.log(JSON.stringify(out.filter(o => o.ta > 0n).map(o => ({ sym: o.sym, a: o.a, name: o.name, cash: o.cash.toString(), ltvs: o.ltvs })), null, 0).slice(0, 200)) fs.writeFileSync(process.env.OUT || 'scan.json', JSON.stringify(out.map(o => ({ ...o, ta: o.ta.toString(), tb: o.tb.toString(), cash: o.cash.toString() })), null, 1))