Skip to content

Commit 58515e8

Browse files
authored
Merge pull request #2163 from Avant-Protocol/master
APY adapter for avUSD, avBTC and avETH
2 parents 9cfdc95 + add6efe commit 58515e8

File tree

4 files changed

+182
-0
lines changed

4 files changed

+182
-0
lines changed

src/adaptors/avant-avbtc/index.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const { getData } = require('../avant-aveth/shared')
2+
3+
// Avalanche tokens
4+
const avBTC = '0xfd2c2A98009d0cBed715882036e43d26C4289053'
5+
const savBTC = '0x649342c6bff544d82DF1B2bA3C93e0C22cDeBa84' // Staked avBTC (ERC-4626)
6+
7+
async function apy() {
8+
const savBTCData = await getData('avax', savBTC, avBTC)
9+
10+
return [
11+
{
12+
pool: `${savBTC}-avax`,
13+
chain: 'avax',
14+
project: 'avant-avbtc',
15+
symbol: 'savBTC',
16+
tvlUsd: savBTCData.tvlUsd,
17+
apyBase: savBTCData.apyBase,
18+
underlyingTokens: [avBTC],
19+
poolMeta: 'ERC-4626: savBTC → avBTC',
20+
url: 'https://www.avantprotocol.com',
21+
},
22+
]
23+
}
24+
25+
module.exports = {
26+
timetravel: false,
27+
apy,
28+
url: 'https://www.avantprotocol.com',
29+
}

src/adaptors/avant-aveth/index.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const { getData } = require('./shared')
2+
3+
// Ethereum tokens
4+
const avETH = '0x9469470C9878bf3d6d0604831d9A3A366156f7EE'
5+
const savETH = '0xDA06eE2dACF9245Aa80072a4407deBDea0D7e341' // Staked avETH (ERC-4626)
6+
const wETH = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'
7+
8+
async function apy() {
9+
const savETHData = await getData('ethereum', savETH, avETH, wETH)
10+
11+
return [
12+
{
13+
pool: `${savETH}-ethereum`,
14+
chain: 'ethereum',
15+
project: 'avant-aveth',
16+
symbol: 'savETH',
17+
tvlUsd: savETHData.tvlUsd,
18+
apyBase: savETHData.apyBase,
19+
underlyingTokens: [avETH],
20+
poolMeta: 'ERC-4626: savETH → avETH',
21+
url: 'https://www.avantprotocol.com',
22+
},
23+
]
24+
}
25+
26+
module.exports = {
27+
timetravel: false,
28+
apy,
29+
url: 'https://www.avantprotocol.com',
30+
}

src/adaptors/avant-aveth/shared.js

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
const sdk = require('@defillama/sdk')
2+
const axios = require('axios')
3+
const utils = require('../utils')
4+
5+
const abi = {
6+
convertToAssets: { "inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function" },
7+
totalAssets: { "inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"" ,"type":"uint256"}],"stateMutability":"view","type":"function" },
8+
}
9+
10+
const DAY = 86_400
11+
const SCALE = BigInt(1e18)
12+
const SHARES = BigInt(1e18)
13+
14+
async function getBlockAtTimestamp(chain, ts) {
15+
const { data } = await axios.get(`https://coins.llama.fi/block/${chain}/${ts}`)
16+
return { block: data.height || data.number, ts: data.timestamp || ts }
17+
}
18+
19+
async function readShareToAssetRatio(chain, blockNumber, vault) {
20+
const { output } = await sdk.api.abi.call({
21+
target: vault,
22+
abi: abi.convertToAssets,
23+
params: [SHARES.toString()],
24+
chain,
25+
block: blockNumber,
26+
})
27+
return BigInt(output)
28+
}
29+
30+
function ratioToDaily(rNow, rPrev, secondsBigOrNum) {
31+
if (rPrev === 0n || rNow === 0n) return 0
32+
const qFP = (rNow * SCALE) / rPrev
33+
const q = Number(qFP) / Number(SCALE)
34+
if (!(q > 0) || !isFinite(q)) return 0
35+
const seconds = Number(secondsBigOrNum) || 1
36+
const exp = DAY / seconds
37+
return Math.pow(q, exp) - 1
38+
}
39+
40+
async function computeApyBase(chain, vault) {
41+
const nowTs = Math.floor(Date.now() / 1e3)
42+
const WEEK = 7 * DAY
43+
44+
const [{ block: bNow, ts: tNow }, { block: bPast, ts: tPast }] = await Promise.all([
45+
getBlockAtTimestamp(chain, nowTs),
46+
getBlockAtTimestamp(chain, nowTs - WEEK),
47+
])
48+
49+
const [rNow, rPast] = await Promise.all([
50+
readShareToAssetRatio(chain, bNow, vault),
51+
readShareToAssetRatio(chain, bPast, vault)
52+
])
53+
if (rNow === 0n || rPast === 0n || rNow === rPast) return 0
54+
55+
const daily = ratioToDaily(rNow, rPast, Math.max(1, tNow - tPast))
56+
if (!daily) return 0
57+
58+
const aprBase = daily * 365 * 100
59+
return utils.aprToApy(aprBase, 365) // number
60+
}
61+
62+
async function getPrice(chain, token, tokenSubstitute) {
63+
async function _getPrice(chain, tokenAddress) {
64+
const priceKey = `${chain}:${tokenAddress}`
65+
const { data } = await axios.get(`https://coins.llama.fi/prices/current/${priceKey}`)
66+
price = data.coins?.[priceKey]?.price ?? 0
67+
return price
68+
}
69+
const price = await _getPrice(chain, token)
70+
if (price) {
71+
return price
72+
} else if (tokenSubstitute) {
73+
return await _getPrice(chain, tokenSubstitute)
74+
}
75+
return 1
76+
}
77+
78+
async function getData(chain, vault, underlying, underlyingSubstitute = undefined) {
79+
const { output: totalAssetsBn } = await sdk.api.abi.call({
80+
target: vault,
81+
abi: abi.totalAssets,
82+
chain,
83+
})
84+
85+
const price = await getPrice(chain, underlying, underlyingSubstitute)
86+
const tvlUsd = (Number(totalAssetsBn) / 1e18) * price
87+
const apyBase = await computeApyBase(chain, vault)
88+
89+
return { tvlUsd, apyBase }
90+
}
91+
92+
module.exports = {
93+
getData,
94+
}

src/adaptors/avant-avusd/index.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const { getData } = require('../avant-aveth/shared')
2+
3+
// Avalanche tokens
4+
const avUSD = '0x24dE8771bC5DdB3362Db529Fc3358F2df3A0E346'
5+
const savUSD = '0x06d47F3fb376649c3A9Dafe069B3D6E35572219E' // Staked avUSD (ERC-4626)
6+
7+
async function apy() {
8+
const savUSDData = await getData('avax', savUSD, avUSD)
9+
10+
return [
11+
{
12+
pool: `${savUSD}-avax`,
13+
chain: 'avax',
14+
project: 'avant-avusd',
15+
symbol: 'savUSD',
16+
tvlUsd: savUSDData.tvlUsd,
17+
apyBase: savUSDData.apyBase,
18+
underlyingTokens: [avUSD],
19+
poolMeta: 'ERC-4626: savUSD → avUSD',
20+
url: 'https://www.avantprotocol.com',
21+
},
22+
]
23+
}
24+
25+
module.exports = {
26+
timetravel: false,
27+
apy,
28+
url: 'https://www.avantprotocol.com',
29+
}

0 commit comments

Comments
 (0)