From 8df40cd3f9ed6e9e591aa708cbc7a953ff481ecc Mon Sep 17 00:00:00 2001 From: Antonio Guilherme Ferreira Viggiano Date: Thu, 2 Jan 2025 07:36:11 -0300 Subject: [PATCH 1/9] Add types directory with Pool interface --- src/types/Pool.d.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/types/Pool.d.ts diff --git a/src/types/Pool.d.ts b/src/types/Pool.d.ts new file mode 100644 index 0000000000..d3fb6d7994 --- /dev/null +++ b/src/types/Pool.d.ts @@ -0,0 +1,19 @@ +export interface Pool { + pool: string; + chain: string; + project: string; + symbol: string; + tvlUsd: number; // for lending protocols: tvlUsd = totalSupplyUsd - totalBorrowUsd + apyBase?: number; + apyReward?: number; + rewardTokens?: Array; + underlyingTokens?: Array; + poolMeta?: string; + url?: string; + // optional lending protocol specific fields: + apyBaseBorrow?: number; + apyRewardBorrow?: number; + totalSupplyUsd?: number; + totalBorrowUsd?: number; + ltv?: number; // btw [0, 1] +} \ No newline at end of file From b8fb20078e038d32505165aacaad102711dd4866 Mon Sep 17 00:00:00 2001 From: Antonio Guilherme Ferreira Viggiano Date: Fri, 3 Jan 2025 14:09:52 -0300 Subject: [PATCH 2/9] Add Size Credit --- src/adaptors/aave-v3/index.js | 1 + src/adaptors/size-credit/api.ts | 132 ++++++++++++++++++++++++++++++ src/adaptors/size-credit/index.ts | 61 ++++++++++++++ 3 files changed, 194 insertions(+) create mode 100755 src/adaptors/size-credit/api.ts create mode 100755 src/adaptors/size-credit/index.ts diff --git a/src/adaptors/aave-v3/index.js b/src/adaptors/aave-v3/index.js index 9e62b19b8c..7ba51a7a09 100755 --- a/src/adaptors/aave-v3/index.js +++ b/src/adaptors/aave-v3/index.js @@ -250,4 +250,5 @@ const apy = async () => { module.exports = { apy, + protocolDataProviders }; diff --git a/src/adaptors/size-credit/api.ts b/src/adaptors/size-credit/api.ts new file mode 100755 index 0000000000..2ba71dc09a --- /dev/null +++ b/src/adaptors/size-credit/api.ts @@ -0,0 +1,132 @@ +import type Fetch from 'node-fetch'; +const fetch = require('node-fetch') as typeof Fetch; + +export interface Market { + id: string; + name: string; + api_base_url: string; + documentation_url: string; + chain: string; + base_symbol: string; + quote_symbol: string; + collateral_token: { + address: string; + decimals: number; + }; + debt_token: { + address: string; + decimals: number; + }; + data_params: { + weth: string; + underlying_collateral_token: string; + underlying_borrow_token: string; + variable_pool: string; + borrow_a_token_v1_5: string; + }; + fee_config: { + swap_fee_apr: number; + fragmentation_fee: number; + liquidation_reward_percent: number; + overdue_collateral_protocol_percent: number; + collateral_protocol_percent: number; + fee_recipient: string; + }; + risk_config: { + cr_opening: number; + cr_liquidation: number; + minimum_credit_borrow_a_token: number; + borrow_a_token_cap: number; + min_tenor: number; + max_tenor: number; + }; + oracle_params: { + price_feed: string; + variable_pool_borrow_rate_stale_rate_interval: number; + }; +} + +interface GetMarketsResponse { + available_markets: Market[]; +} + +interface GetTvlResponse { + total_tvl_usd: number; + collateral_tvl: number; + collateral_tvl_usd: number; + debt_tvl: number; + debt_tvl_usd: number; + borrow_tvl: number; + borrow_tvl_usd: number; +} + +interface GetBestRateResponse { + tenors: number[]; + aprs: Array; + contributing_curves: + { + curve: { + curve_relative_time_aprs: number[]; + curve_relative_time_market_rate_multipliers: number[]; + curve_relative_time_tenors: number[]; + id: string; + block_number: number; + block_timestamp: string; + transaction_hash: string; + transfer_from: string; + max_due_date: number; + user_address: string; + depth: number; + }, + apr: number; + depth_used_borrow_token: number; + depth_used_collateral_token: number; + }[][] +} + +const ENDPOINT = 'https://api.size.credit'; + +export async function getMarkets(): Promise { + const getMarketsResponse: GetMarketsResponse = await fetch(`${ENDPOINT}/`).then((res) => res.json()); + return getMarketsResponse.available_markets; +} + +export async function getTvl(market: Market): Promise { + const getTvlResponse: GetTvlResponse = await fetch(`${ENDPOINT}${market.api_base_url}/market-tvl`).then((res) => res.json()); + return getTvlResponse; +} + +export async function lendingAPR(market: Market, tenor: number, depth: number): Promise { + const getBestRateResponse: GetBestRateResponse = await fetch(`${ENDPOINT}${market.api_base_url}/best-rate-for-tenors-scl/`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ tenors: [tenor], depth }), + }).then((res) => res.json()); + const apr18decimals = getBestRateResponse.aprs[0]; + if (typeof apr18decimals === 'string') { + return undefined; + } + return apr18decimals / 1e16; +} + +export async function borrowingAPR(market: Market, tenor: number, depth: number): Promise { + const getBestRateResponse: GetBestRateResponse = await fetch(`${ENDPOINT}${market.api_base_url}/best-rate-for-tenors-bcl/`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ tenors: [tenor], depth }), + }).then((res) => res.json()); + const apr18decimals = getBestRateResponse.aprs[0]; + if (typeof apr18decimals === 'string') { + return undefined; + } + return apr18decimals / 1e16; +} + +export type GetMarkets = typeof getMarkets; +export type GetTvl = typeof getTvl; +export type LendingAPR = typeof lendingAPR; +export type BorrowingAPR = typeof borrowingAPR; diff --git a/src/adaptors/size-credit/index.ts b/src/adaptors/size-credit/index.ts new file mode 100755 index 0000000000..8fdab3a1c3 --- /dev/null +++ b/src/adaptors/size-credit/index.ts @@ -0,0 +1,61 @@ +import type { Pool } from "../../types/Pool"; +import type { BorrowingAPR, GetMarkets, LendingAPR, GetTvl } from "./api"; +const { borrowingAPR, getMarkets, lendingAPR, getTvl } = require('./api') as { + borrowingAPR: BorrowingAPR; + getMarkets: GetMarkets; + lendingAPR: LendingAPR; + getTvl: GetTvl; +}; +const sdk = require('@defillama/sdk'); +const { protocolDataProviders: AaveProtocolDataProvider } = require('../aave-v3'); +const AaveV3Pool = require('../aave-v3/poolAbi'); + +const TENORS_SECONDS = 60 * 60 * 24 * 3 + +const DEPTH_BORROW_TOKEN = 10; + +function uppercaseFirst(str: string): string { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +export async function apy(): Promise { + const markets = await getMarkets(); + + return Promise.all( + markets.map(async (market) => { + const tvl = await getTvl(market); + let apyBase = await lendingAPR(market, TENORS_SECONDS, DEPTH_BORROW_TOKEN) + if (apyBase === undefined) { // no limit borrow offers available, use Aave v3 as a variable-rate lending pool + const { output: getReserveData } = await sdk.api.abi.call({ + target: AaveProtocolDataProvider[market.chain], + abi: AaveV3Pool.find((m) => m.name === 'getReserveData'), + params: [market.debt_token.address], + chain: market.chain, + }) + apyBase = getReserveData.liquidityRate / 10 ** 25 + } + return { + pool: market.id, + chain: uppercaseFirst(market.chain), + project: 'size-credit', + symbol: market.quote_symbol, + tvlUsd: tvl.total_tvl_usd, // does not include borrows + apyBase, + apyReward: 0, + underlyingTokens: [market.debt_token.address], + rewardTokens: [], + url: `https://app.size.credit/borrow?action=market&type=lend&market_id=${market.id}`, + apyBaseBorrow: await borrowingAPR(market, TENORS_SECONDS, DEPTH_BORROW_TOKEN), + apyRewardBorrow: 0, + totalSupplyUsd: tvl.debt_tvl_usd, + totalBorrowUsd: tvl.borrow_tvl_usd, + ltv: 1e20 / market.risk_config.cr_liquidation, + }; + }), + ); +}; + +module.exports = { + timetravel: false, + apy, +}; From d2e11fde6f595c454ddf528388ad7373b80720ec Mon Sep 17 00:00:00 2001 From: Antonio Guilherme Ferreira Viggiano Date: Tue, 7 Jan 2025 09:45:51 -0300 Subject: [PATCH 3/9] Update PR --- src/adaptors/aave-v3/index.js | 1 - src/adaptors/size-credit/index.ts | 24 ++++++++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/adaptors/aave-v3/index.js b/src/adaptors/aave-v3/index.js index 7ba51a7a09..9e62b19b8c 100755 --- a/src/adaptors/aave-v3/index.js +++ b/src/adaptors/aave-v3/index.js @@ -250,5 +250,4 @@ const apy = async () => { module.exports = { apy, - protocolDataProviders }; diff --git a/src/adaptors/size-credit/index.ts b/src/adaptors/size-credit/index.ts index 8fdab3a1c3..6b191835ff 100755 --- a/src/adaptors/size-credit/index.ts +++ b/src/adaptors/size-credit/index.ts @@ -7,10 +7,26 @@ const { borrowingAPR, getMarkets, lendingAPR, getTvl } = require('./api') as { getTvl: GetTvl; }; const sdk = require('@defillama/sdk'); -const { protocolDataProviders: AaveProtocolDataProvider } = require('../aave-v3'); const AaveV3Pool = require('../aave-v3/poolAbi'); -const TENORS_SECONDS = 60 * 60 * 24 * 3 +const AaveProtocolDataProvider = { + ethereum: '0x41393e5e337606dc3821075Af65AeE84D7688CBD', + optimism: '0x7F23D86Ee20D869112572136221e173428DD740B', + arbitrum: '0x7F23D86Ee20D869112572136221e173428DD740B', + polygon: '0x7F23D86Ee20D869112572136221e173428DD740B', + fantom: '0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654', + avax: '0x374a2592f0265b3bb802d75809e61b1b5BbD85B7', + metis: '0xC01372469A17b6716A38F00c277533917B6859c0', + base: '0xd82a47fdebB5bf5329b09441C3DaB4b5df2153Ad', + xdai: '0x57038C3e3Fe0a170BB72DE2fD56E98e4d1a69717', + bsc: '0x23dF2a19384231aFD114b036C14b6b03324D79BC', + scroll: '0xe2108b60623C6Dcf7bBd535bD15a451fd0811f7b', + era: '0x5F2A704cE47B373c908fE8A29514249469b52b99', + lido: '0x08795CFE08C7a81dCDFf482BbAAF474B240f31cD', // on ethereum + etherfi: '0xE7d490885A68f00d9886508DF281D67263ed5758', // on ethereum +}; + +const TENOR_SECONDS = 60 * 60 * 24 * 3 const DEPTH_BORROW_TOKEN = 10; @@ -24,7 +40,7 @@ export async function apy(): Promise { return Promise.all( markets.map(async (market) => { const tvl = await getTvl(market); - let apyBase = await lendingAPR(market, TENORS_SECONDS, DEPTH_BORROW_TOKEN) + let apyBase = await lendingAPR(market, TENOR_SECONDS, DEPTH_BORROW_TOKEN) if (apyBase === undefined) { // no limit borrow offers available, use Aave v3 as a variable-rate lending pool const { output: getReserveData } = await sdk.api.abi.call({ target: AaveProtocolDataProvider[market.chain], @@ -45,7 +61,7 @@ export async function apy(): Promise { underlyingTokens: [market.debt_token.address], rewardTokens: [], url: `https://app.size.credit/borrow?action=market&type=lend&market_id=${market.id}`, - apyBaseBorrow: await borrowingAPR(market, TENORS_SECONDS, DEPTH_BORROW_TOKEN), + apyBaseBorrow: await borrowingAPR(market, TENOR_SECONDS, DEPTH_BORROW_TOKEN), apyRewardBorrow: 0, totalSupplyUsd: tvl.debt_tvl_usd, totalBorrowUsd: tvl.borrow_tvl_usd, From 4208984e0b6e104af17b42ab7819dc1a6b6e7669 Mon Sep 17 00:00:00 2001 From: Antonio Guilherme Ferreira Viggiano Date: Fri, 10 Jan 2025 08:48:48 -0300 Subject: [PATCH 4/9] Use js instead of ts --- src/adaptors/size-credit/{api.ts => api.js} | 77 ++++++++++++------- .../size-credit/{index.ts => index.js} | 35 ++++----- 2 files changed, 65 insertions(+), 47 deletions(-) rename src/adaptors/size-credit/{api.ts => api.js} (59%) rename src/adaptors/size-credit/{index.ts => index.js} (76%) diff --git a/src/adaptors/size-credit/api.ts b/src/adaptors/size-credit/api.js similarity index 59% rename from src/adaptors/size-credit/api.ts rename to src/adaptors/size-credit/api.js index 2ba71dc09a..4d7c187903 100755 --- a/src/adaptors/size-credit/api.ts +++ b/src/adaptors/size-credit/api.js @@ -1,6 +1,6 @@ -import type Fetch from 'node-fetch'; -const fetch = require('node-fetch') as typeof Fetch; +const fetch = require('node-fetch'); +/* export interface Market { id: string; name: string; @@ -47,7 +47,7 @@ export interface Market { } interface GetMarketsResponse { - available_markets: Market[]; + markets_by_chain: Record } interface GetTvlResponse { @@ -83,27 +83,39 @@ interface GetBestRateResponse { depth_used_collateral_token: number; }[][] } +*/ const ENDPOINT = 'https://api.size.credit'; -export async function getMarkets(): Promise { - const getMarketsResponse: GetMarketsResponse = await fetch(`${ENDPOINT}/`).then((res) => res.json()); - return getMarketsResponse.available_markets; +async function getMarkets() /*: Promise*/ { + const getMarketsResponse /*: GetMarketsResponse*/ = await fetch( + `${ENDPOINT}/` + ).then((res) => res.json()); + return Object.values(getMarketsResponse.markets_by_chain).flat(); } -export async function getTvl(market: Market): Promise { - const getTvlResponse: GetTvlResponse = await fetch(`${ENDPOINT}${market.api_base_url}/market-tvl`).then((res) => res.json()); +async function getTvl(market /*: Market*/) /*: Promise*/ { + const getTvlResponse /*: GetTvlResponse*/ = await fetch( + `${ENDPOINT}${market.api_base_url}/market-tvl` + ).then((res) => res.json()); return getTvlResponse; } -export async function lendingAPR(market: Market, tenor: number, depth: number): Promise { - const getBestRateResponse: GetBestRateResponse = await fetch(`${ENDPOINT}${market.api_base_url}/best-rate-for-tenors-scl/`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ tenors: [tenor], depth }), - }).then((res) => res.json()); +async function lendingAPR( + market /*: Market*/, + tenor /*: number*/, + depth /*: number*/ +) /*: Promise*/ { + const getBestRateResponse /*: GetBestRateResponse*/ = await fetch( + `${ENDPOINT}${market.api_base_url}/best-rate-for-tenors-scl/`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ tenors: [tenor], depth }), + } + ).then((res) => res.json()); const apr18decimals = getBestRateResponse.aprs[0]; if (typeof apr18decimals === 'string') { return undefined; @@ -111,14 +123,21 @@ export async function lendingAPR(market: Market, tenor: number, depth: number): return apr18decimals / 1e16; } -export async function borrowingAPR(market: Market, tenor: number, depth: number): Promise { - const getBestRateResponse: GetBestRateResponse = await fetch(`${ENDPOINT}${market.api_base_url}/best-rate-for-tenors-bcl/`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ tenors: [tenor], depth }), - }).then((res) => res.json()); +async function borrowingAPR( + market /*: Market*/, + tenor /*: number*/, + depth /*: number*/ +) /*: Promise*/ { + const getBestRateResponse /*: GetBestRateResponse*/ = await fetch( + `${ENDPOINT}${market.api_base_url}/best-rate-for-tenors-bcl/`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ tenors: [tenor], depth }), + } + ).then((res) => res.json()); const apr18decimals = getBestRateResponse.aprs[0]; if (typeof apr18decimals === 'string') { return undefined; @@ -126,7 +145,9 @@ export async function borrowingAPR(market: Market, tenor: number, depth: number) return apr18decimals / 1e16; } -export type GetMarkets = typeof getMarkets; -export type GetTvl = typeof getTvl; -export type LendingAPR = typeof lendingAPR; -export type BorrowingAPR = typeof borrowingAPR; +module.exports = { + getMarkets, + getTvl, + lendingAPR, + borrowingAPR, +}; diff --git a/src/adaptors/size-credit/index.ts b/src/adaptors/size-credit/index.js similarity index 76% rename from src/adaptors/size-credit/index.ts rename to src/adaptors/size-credit/index.js index 6b191835ff..1ff81f3cac 100755 --- a/src/adaptors/size-credit/index.ts +++ b/src/adaptors/size-credit/index.js @@ -1,11 +1,4 @@ -import type { Pool } from "../../types/Pool"; -import type { BorrowingAPR, GetMarkets, LendingAPR, GetTvl } from "./api"; -const { borrowingAPR, getMarkets, lendingAPR, getTvl } = require('./api') as { - borrowingAPR: BorrowingAPR; - getMarkets: GetMarkets; - lendingAPR: LendingAPR; - getTvl: GetTvl; -}; +const { borrowingAPR, getMarkets, lendingAPR, getTvl } = require('./api'); const sdk = require('@defillama/sdk'); const AaveV3Pool = require('../aave-v3/poolAbi'); @@ -26,29 +19,30 @@ const AaveProtocolDataProvider = { etherfi: '0xE7d490885A68f00d9886508DF281D67263ed5758', // on ethereum }; -const TENOR_SECONDS = 60 * 60 * 24 * 3 +const TENOR_SECONDS = 60 * 60 * 24 * 3; const DEPTH_BORROW_TOKEN = 10; -function uppercaseFirst(str: string): string { +function uppercaseFirst(str /*: string*/) /*: string*/ { return str.charAt(0).toUpperCase() + str.slice(1); } -export async function apy(): Promise { +async function apy() /*: Promise*/ { const markets = await getMarkets(); return Promise.all( markets.map(async (market) => { const tvl = await getTvl(market); - let apyBase = await lendingAPR(market, TENOR_SECONDS, DEPTH_BORROW_TOKEN) - if (apyBase === undefined) { // no limit borrow offers available, use Aave v3 as a variable-rate lending pool + let apyBase = await lendingAPR(market, TENOR_SECONDS, DEPTH_BORROW_TOKEN); + if (apyBase === undefined) { + // no limit borrow offers available, use Aave v3 as a variable-rate lending pool const { output: getReserveData } = await sdk.api.abi.call({ target: AaveProtocolDataProvider[market.chain], abi: AaveV3Pool.find((m) => m.name === 'getReserveData'), params: [market.debt_token.address], chain: market.chain, - }) - apyBase = getReserveData.liquidityRate / 10 ** 25 + }); + apyBase = getReserveData.liquidityRate / 10 ** 25; } return { pool: market.id, @@ -61,17 +55,20 @@ export async function apy(): Promise { underlyingTokens: [market.debt_token.address], rewardTokens: [], url: `https://app.size.credit/borrow?action=market&type=lend&market_id=${market.id}`, - apyBaseBorrow: await borrowingAPR(market, TENOR_SECONDS, DEPTH_BORROW_TOKEN), + apyBaseBorrow: await borrowingAPR( + market, + TENOR_SECONDS, + DEPTH_BORROW_TOKEN + ), apyRewardBorrow: 0, totalSupplyUsd: tvl.debt_tvl_usd, totalBorrowUsd: tvl.borrow_tvl_usd, ltv: 1e20 / market.risk_config.cr_liquidation, }; - }), + }) ); -}; +} module.exports = { - timetravel: false, apy, }; From 7291eadc91788922eafda1c0aae32448d7d5c22d Mon Sep 17 00:00:00 2001 From: Antonio Guilherme Ferreira Viggiano Date: Mon, 13 Jan 2025 08:11:49 -0300 Subject: [PATCH 5/9] Fix issues with PR --- src/adaptors/size-credit/api.js | 22 ++++++++++++++++++++-- src/adaptors/size-credit/index.js | 20 ++++++++++++-------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/adaptors/size-credit/api.js b/src/adaptors/size-credit/api.js index 4d7c187903..be81c7b429 100755 --- a/src/adaptors/size-credit/api.js +++ b/src/adaptors/size-credit/api.js @@ -56,8 +56,8 @@ interface GetTvlResponse { collateral_tvl_usd: number; debt_tvl: number; debt_tvl_usd: number; - borrow_tvl: number; - borrow_tvl_usd: number; + total_borrow: number; + total_borrow_usd: number; } interface GetBestRateResponse { @@ -83,6 +83,16 @@ interface GetBestRateResponse { depth_used_collateral_token: number; }[][] } + +interface GetMarketsLiquidityResponse { + [market_id: string]: { + total_liquidity_usd: number; + sell_side_liquidity_usd: number; + buy_side_liquidity_usd: number; + sell_liquidity: number; + buy_liquidity: number; + }; +} */ const ENDPOINT = 'https://api.size.credit'; @@ -94,6 +104,13 @@ async function getMarkets() /*: Promise*/ { return Object.values(getMarketsResponse.markets_by_chain).flat(); } +async function getMarketsLiquidity(market /*: Market*/) /*: Promise*/ { + const getMarketsLiquidityResponse /*: GetMarketsLiquidityResponse*/ = await fetch( + `${ENDPOINT}/markets-liquidity` + ).then((res) => res.json()); + return getMarketsLiquidityResponse; +} + async function getTvl(market /*: Market*/) /*: Promise*/ { const getTvlResponse /*: GetTvlResponse*/ = await fetch( `${ENDPOINT}${market.api_base_url}/market-tvl` @@ -150,4 +167,5 @@ module.exports = { getTvl, lendingAPR, borrowingAPR, + getMarketsLiquidity, }; diff --git a/src/adaptors/size-credit/index.js b/src/adaptors/size-credit/index.js index 1ff81f3cac..420803ee93 100755 --- a/src/adaptors/size-credit/index.js +++ b/src/adaptors/size-credit/index.js @@ -1,4 +1,4 @@ -const { borrowingAPR, getMarkets, lendingAPR, getTvl } = require('./api'); +const { borrowingAPR, getMarkets, lendingAPR, getTvl, getMarketsLiquidity } = require('./api'); const sdk = require('@defillama/sdk'); const AaveV3Pool = require('../aave-v3/poolAbi'); @@ -28,7 +28,10 @@ function uppercaseFirst(str /*: string*/) /*: string*/ { } async function apy() /*: Promise*/ { - const markets = await getMarkets(); + const [markets, marketsLiquidity] = await Promise.all([ + getMarkets(), + getMarketsLiquidity(), + ]); return Promise.all( markets.map(async (market) => { @@ -49,21 +52,22 @@ async function apy() /*: Promise*/ { chain: uppercaseFirst(market.chain), project: 'size-credit', symbol: market.quote_symbol, - tvlUsd: tvl.total_tvl_usd, // does not include borrows + tvlUsd: marketsLiquidity[market.id].buy_side_liquidity_usd, apyBase, - apyReward: 0, underlyingTokens: [market.debt_token.address], - rewardTokens: [], url: `https://app.size.credit/borrow?action=market&type=lend&market_id=${market.id}`, apyBaseBorrow: await borrowingAPR( market, TENOR_SECONDS, DEPTH_BORROW_TOKEN ), - apyRewardBorrow: 0, totalSupplyUsd: tvl.debt_tvl_usd, - totalBorrowUsd: tvl.borrow_tvl_usd, - ltv: 1e20 / market.risk_config.cr_liquidation, + totalBorrowUsd: tvl.total_borrow_usd, + ltv: 1e18 / market.risk_config.cr_liquidation, + poolMeta: JSON.stringify({ + depth: DEPTH_BORROW_TOKEN, + tenor: TENOR_SECONDS, + }), }; }) ); From 60e50b3862364512c3ae0dd2536c9ce2f3f10de0 Mon Sep 17 00:00:00 2001 From: Antonio Guilherme Ferreira Viggiano Date: Mon, 13 Jan 2025 09:18:32 -0300 Subject: [PATCH 6/9] Make poolMeta human readable --- src/adaptors/size-credit/api.js | 9 +++++---- src/adaptors/size-credit/index.js | 24 ++++++++++++++++-------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/adaptors/size-credit/api.js b/src/adaptors/size-credit/api.js index be81c7b429..5e9e2f270d 100755 --- a/src/adaptors/size-credit/api.js +++ b/src/adaptors/size-credit/api.js @@ -104,10 +104,11 @@ async function getMarkets() /*: Promise*/ { return Object.values(getMarketsResponse.markets_by_chain).flat(); } -async function getMarketsLiquidity(market /*: Market*/) /*: Promise*/ { - const getMarketsLiquidityResponse /*: GetMarketsLiquidityResponse*/ = await fetch( - `${ENDPOINT}/markets-liquidity` - ).then((res) => res.json()); +async function getMarketsLiquidity( + market /*: Market*/ +) /*: Promise*/ { + const getMarketsLiquidityResponse /*: GetMarketsLiquidityResponse*/ = + await fetch(`${ENDPOINT}/markets-liquidity`).then((res) => res.json()); return getMarketsLiquidityResponse; } diff --git a/src/adaptors/size-credit/index.js b/src/adaptors/size-credit/index.js index 420803ee93..5de60e4d32 100755 --- a/src/adaptors/size-credit/index.js +++ b/src/adaptors/size-credit/index.js @@ -1,4 +1,10 @@ -const { borrowingAPR, getMarkets, lendingAPR, getTvl, getMarketsLiquidity } = require('./api'); +const { + borrowingAPR, + getMarkets, + lendingAPR, + getTvl, + getMarketsLiquidity, +} = require('./api'); const sdk = require('@defillama/sdk'); const AaveV3Pool = require('../aave-v3/poolAbi'); @@ -19,7 +25,8 @@ const AaveProtocolDataProvider = { etherfi: '0xE7d490885A68f00d9886508DF281D67263ed5758', // on ethereum }; -const TENOR_SECONDS = 60 * 60 * 24 * 3; +const TENOR_DAYS = 3; +const DAYS_TO_SECONDS = 24 * 60 * 60; const DEPTH_BORROW_TOKEN = 10; @@ -36,7 +43,11 @@ async function apy() /*: Promise*/ { return Promise.all( markets.map(async (market) => { const tvl = await getTvl(market); - let apyBase = await lendingAPR(market, TENOR_SECONDS, DEPTH_BORROW_TOKEN); + let apyBase = await lendingAPR( + market, + TENOR_DAYS * DAYS_TO_SECONDS, + DEPTH_BORROW_TOKEN + ); if (apyBase === undefined) { // no limit borrow offers available, use Aave v3 as a variable-rate lending pool const { output: getReserveData } = await sdk.api.abi.call({ @@ -58,16 +69,13 @@ async function apy() /*: Promise*/ { url: `https://app.size.credit/borrow?action=market&type=lend&market_id=${market.id}`, apyBaseBorrow: await borrowingAPR( market, - TENOR_SECONDS, + TENOR_DAYS * DAYS_TO_SECONDS, DEPTH_BORROW_TOKEN ), totalSupplyUsd: tvl.debt_tvl_usd, totalBorrowUsd: tvl.total_borrow_usd, ltv: 1e18 / market.risk_config.cr_liquidation, - poolMeta: JSON.stringify({ - depth: DEPTH_BORROW_TOKEN, - tenor: TENOR_SECONDS, - }), + poolMeta: `Fixed-rate loans with a ${TENOR_DAYS}-day maturity date and a ${DEPTH_BORROW_TOKEN} ${market.quote_symbol} borrowing amount.`, }; }) ); From bded99aa3b099a33a9b82b908af7bd6547d9e043 Mon Sep 17 00:00:00 2001 From: Antonio Guilherme Ferreira Viggiano Date: Mon, 13 Jan 2025 09:26:16 -0300 Subject: [PATCH 7/9] Update poolMeta --- src/adaptors/size-credit/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/adaptors/size-credit/index.js b/src/adaptors/size-credit/index.js index 5de60e4d32..3122957977 100755 --- a/src/adaptors/size-credit/index.js +++ b/src/adaptors/size-credit/index.js @@ -43,6 +43,7 @@ async function apy() /*: Promise*/ { return Promise.all( markets.map(async (market) => { const tvl = await getTvl(market); + const uppercaseChain = uppercaseFirst(market.chain); let apyBase = await lendingAPR( market, TENOR_DAYS * DAYS_TO_SECONDS, @@ -75,7 +76,7 @@ async function apy() /*: Promise*/ { totalSupplyUsd: tvl.debt_tvl_usd, totalBorrowUsd: tvl.total_borrow_usd, ltv: 1e18 / market.risk_config.cr_liquidation, - poolMeta: `Fixed-rate loans with a ${TENOR_DAYS}-day maturity date and a ${DEPTH_BORROW_TOKEN} ${market.quote_symbol} borrowing amount.`, + poolMeta: `APR information based on a ${TENOR_DAYS}-day maturity, ${DEPTH_BORROW_TOKEN} ${market.quote_symbol} fixed-rate loan using ${market.base_symbol} as collateral on ${uppercaseChain}.`, }; }) ); From 405ceac575156129562358d7a5ae7d178ac85285 Mon Sep 17 00:00:00 2001 From: Antonio Guilherme Ferreira Viggiano Date: Mon, 13 Jan 2025 09:29:51 -0300 Subject: [PATCH 8/9] Use APY instead of APR --- src/adaptors/size-credit/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adaptors/size-credit/index.js b/src/adaptors/size-credit/index.js index 3122957977..e5d0eab898 100755 --- a/src/adaptors/size-credit/index.js +++ b/src/adaptors/size-credit/index.js @@ -76,7 +76,7 @@ async function apy() /*: Promise*/ { totalSupplyUsd: tvl.debt_tvl_usd, totalBorrowUsd: tvl.total_borrow_usd, ltv: 1e18 / market.risk_config.cr_liquidation, - poolMeta: `APR information based on a ${TENOR_DAYS}-day maturity, ${DEPTH_BORROW_TOKEN} ${market.quote_symbol} fixed-rate loan using ${market.base_symbol} as collateral on ${uppercaseChain}.`, + poolMeta: `APY information based on a ${TENOR_DAYS}-day maturity, ${DEPTH_BORROW_TOKEN} ${market.quote_symbol} fixed-rate loan using ${market.base_symbol} as collateral on ${uppercaseChain}.`, }; }) ); From 0925b0b8b487481cbee5e685abc737fb21209e25 Mon Sep 17 00:00:00 2001 From: Antonio Guilherme Ferreira Viggiano Date: Mon, 13 Jan 2025 10:17:25 -0300 Subject: [PATCH 9/9] Update poolMeta --- src/adaptors/size-credit/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/adaptors/size-credit/index.js b/src/adaptors/size-credit/index.js index e5d0eab898..24f24ab26d 100755 --- a/src/adaptors/size-credit/index.js +++ b/src/adaptors/size-credit/index.js @@ -63,7 +63,7 @@ async function apy() /*: Promise*/ { pool: market.id, chain: uppercaseFirst(market.chain), project: 'size-credit', - symbol: market.quote_symbol, + symbol: market.base_symbol, tvlUsd: marketsLiquidity[market.id].buy_side_liquidity_usd, apyBase, underlyingTokens: [market.debt_token.address], @@ -76,7 +76,7 @@ async function apy() /*: Promise*/ { totalSupplyUsd: tvl.debt_tvl_usd, totalBorrowUsd: tvl.total_borrow_usd, ltv: 1e18 / market.risk_config.cr_liquidation, - poolMeta: `APY information based on a ${TENOR_DAYS}-day maturity, ${DEPTH_BORROW_TOKEN} ${market.quote_symbol} fixed-rate loan using ${market.base_symbol} as collateral on ${uppercaseChain}.`, + poolMeta: `${TENOR_DAYS}-day maturity`, }; }) );