Skip to content

Commit e686d01

Browse files
authored
IPOR liquidity mining power up from contracts (#1559)
* IPOR liquidity mining power up from contracts * IPOR set new url * Set individual urls for each IPOR pool
1 parent 50850c4 commit e686d01

File tree

2 files changed

+86
-59
lines changed

2 files changed

+86
-59
lines changed

src/adaptors/ipor-derivatives/abiV2.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,34 @@ module.exports = {
6363
stateMutability: "view",
6464
type: "function"
6565
},
66+
{
67+
inputs: [
68+
{
69+
internalType: "address",
70+
name: "lpToken",
71+
type: "address"
72+
}
73+
],
74+
name: "getPoolPowerUpModifiers",
75+
outputs: [
76+
{
77+
"name": "pwTokenModifier",
78+
"type": "uint256",
79+
"internalType": "uint256"
80+
},
81+
{
82+
"name": "logBase",
83+
"type": "uint256",
84+
"internalType": "uint256"
85+
},
86+
{
87+
"name": "vectorOfCurve",
88+
"type": "uint256",
89+
"internalType": "uint256"
90+
}
91+
],
92+
stateMutability: "view",
93+
type: "function"
94+
},
6695
]
6796
}

src/adaptors/ipor-derivatives/index.js

Lines changed: 57 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,12 @@ const LP_STATS_ETHEREUM_URL =
66
'https://api.ipor.io/monitor/liquiditypool-statistics-1';
77
const LP_STATS_ARBITRUM_URL =
88
'https://api.ipor.io/monitor/liquiditypool-statistics-42161';
9-
const ARB_AIRDROP_URL = 'https://api.ipor.io/monitor/arb-airdrop';
10-
const WSTETH_AIRDROP_URL = 'https://api.ipor.io/monitor/arb-lido-airdrop';
119
const COIN_PRICES_URL = 'https://coins.llama.fi/prices/current';
1210

1311
const LM_ADDRESS_ETHEREUM = '0xCC3Fc4C9Ba7f8b8aA433Bc586D390A70560FF366';
1412
const LM_ADDRESS_ARBITRUM = '0xdE645aB0560E5A413820234d9DDED5f4a55Ff6dd';
1513
const IPOR_TOKEN_ETHEREUM = '0x1e4746dc744503b53b4a082cb3607b169a289090';
1614
const IPOR_TOKEN_ARBITRUM = '0x34229b3f16fbcdfa8d8d9d17c0852f9496f4c7bb';
17-
const ARB_TOKEN_ARBITRUM = '0x912ce59144191c1204e64559fe8253a0e49e6548';
18-
const WSTETH_TOKEN_ARBITRUM = '0x5979d7b546e38e414f7e9822514be443a4800529';
1915

2016
const BLOCKS_PER_YEAR = (365 * 24 * 3600) / 12;
2117

@@ -24,12 +20,6 @@ const apy = async () => {
2420
.assets;
2521
const assetsArbitrum = (await superagent.get(LP_STATS_ARBITRUM_URL)).body
2622
.assets;
27-
const arbAidrdop = (await superagent.get(ARB_AIRDROP_URL)).body;
28-
const arbAirdropLastEpochFinished =
29-
Date.parse(arbAidrdop.epochEnd) < Date.now(); //epochEnd will be date in past when last airdrop epoch will be finished
30-
const wstEthAirdrop = (await superagent.get(WSTETH_AIRDROP_URL)).body;
31-
const wstEthAirdropLastEpochFinished =
32-
Date.parse(wstEthAirdrop.epochEnd) < Date.now(); //epochEnd will be date in past when last airdrop epoch will be finished
3323
const coinKeys = assetsEthereum.map(
3424
(assetData) => 'ethereum:' + assetData.assetAddress
3525
);
@@ -39,17 +29,12 @@ const apy = async () => {
3929

4030
coinKeys.push('ethereum:' + IPOR_TOKEN_ETHEREUM);
4131
coinKeys.push(...coinKeysArbitrum);
42-
coinKeys.push('arbitrum:' + ARB_TOKEN_ARBITRUM);
43-
coinKeys.push('arbitrum:' + WSTETH_TOKEN_ARBITRUM);
4432
const coinPrices = (
4533
await superagent.get(
4634
`${COIN_PRICES_URL}/${coinKeys.join(',').toLowerCase()}`
4735
)
4836
).body.coins;
4937
const iporTokenUsdPrice = coinPrices['ethereum:' + IPOR_TOKEN_ETHEREUM].price;
50-
const arbTokenUsdPrice = coinPrices['arbitrum:' + ARB_TOKEN_ARBITRUM].price;
51-
const wstethTokenUsdPrice =
52-
coinPrices['arbitrum:' + WSTETH_TOKEN_ARBITRUM].price;
5338

5439
const lpTokenEthereumAddresses = assetsEthereum.map(
5540
(assetData) => assetData.ipTokenAssetAddress
@@ -80,6 +65,26 @@ const apy = async () => {
8065
])
8166
)
8267
);
68+
const poolPowerUpModifiersEthereum = new Map(
69+
(
70+
await sdk.api.abi.multiCall({
71+
chain: 'ethereum',
72+
abi: liquidityMiningV2Abi.find(
73+
({ name }) => name === 'getPoolPowerUpModifiers'
74+
),
75+
calls: lpTokenEthereumAddresses.map(lpTokenEthereumAddress => {
76+
return {
77+
target: LM_ADDRESS_ETHEREUM,
78+
params: [lpTokenEthereumAddress]
79+
};
80+
}
81+
),
82+
})
83+
).output.map((response) => [
84+
response.input.params[0].toLowerCase(),
85+
response.output,
86+
])
87+
);
8388

8489
const globalStatsArbitrum = new Map(
8590
(
@@ -102,6 +107,26 @@ const apy = async () => {
102107
])
103108
)
104109
);
110+
const poolPowerUpModifiersArbitrum = new Map(
111+
(
112+
await sdk.api.abi.multiCall({
113+
chain: 'arbitrum',
114+
abi: liquidityMiningV2Abi.find(
115+
({ name }) => name === 'getPoolPowerUpModifiers'
116+
),
117+
calls: lpTokenArbitrumAddresses.map(lpTokenEthereumAddress => {
118+
return {
119+
target: LM_ADDRESS_ARBITRUM,
120+
params: [lpTokenEthereumAddress]
121+
};
122+
}
123+
),
124+
})
125+
).output.map((response) => [
126+
response.input.params[0].toLowerCase(),
127+
response.output,
128+
])
129+
);
105130

106131
const pools = [];
107132

@@ -124,18 +149,23 @@ const apy = async () => {
124149
const liquidityMiningGlobalStats = globalStatsEthereum.get(
125150
asset.ipTokenAssetAddress.toLowerCase()
126151
);
152+
const vectorOfCurve = poolPowerUpModifiersEthereum.get(
153+
asset.ipTokenAssetAddress.toLowerCase()
154+
).vectorOfCurve / 1e18
127155
const apyReward =
128156
(((liquidityMiningGlobalStats.rewardsPerBlock /
129157
1e8 /
130158
(liquidityMiningGlobalStats.aggregatedPowerUp / 1e18)) *
131-
0.2 * //base powerup
159+
(0.2 + vectorOfCurve) * //base powerup
132160
BLOCKS_PER_YEAR *
133161
iporTokenUsdPrice) /
134162
lpTokenPrice /
135163
coinPrice /
136164
2) * //50% early withdraw fee
137165
100; //percentage
138166

167+
const url = `https://app.ipor.io/zap/ethereum/${asset.asset.toLowerCase()}`;
168+
139169
pools.push({
140170
pool: asset.ipTokenAssetAddress + '-ethereum',
141171
chain: 'Ethereum',
@@ -146,17 +176,12 @@ const apy = async () => {
146176
apyReward: Number(apyReward),
147177
underlyingTokens: [asset.assetAddress],
148178
rewardTokens: [IPOR_TOKEN_ETHEREUM],
179+
url: url,
149180
});
150181
}
151182

152183
for (const asset of assetsArbitrum) {
153184
const rewardsToken = [IPOR_TOKEN_ARBITRUM];
154-
if (asset.asset === 'wstETH' && !wstEthAirdropLastEpochFinished) {
155-
rewardsToken.push(WSTETH_TOKEN_ARBITRUM);
156-
}
157-
if (!arbAirdropLastEpochFinished) {
158-
rewardsToken.push(ARB_TOKEN_ARBITRUM);
159-
}
160185
const lpApr = asset.periods.find(
161186
({ period }) => period === 'MONTH'
162187
).ipTokenReturnValue;
@@ -175,51 +200,24 @@ const apy = async () => {
175200
const liquidityMiningGlobalStats = globalStatsArbitrum.get(
176201
asset.ipTokenAssetAddress.toLowerCase()
177202
);
203+
const vectorOfCurve = poolPowerUpModifiersArbitrum.get(
204+
asset.ipTokenAssetAddress.toLowerCase()
205+
).vectorOfCurve / 1e18;
178206
const apyReward =
179207
(((liquidityMiningGlobalStats.rewardsPerBlock /
180208
1e8 /
181209
(liquidityMiningGlobalStats.aggregatedPowerUp / 1e18)) *
182-
0.2 * //base powerup
210+
(0.2 + vectorOfCurve) * //base powerup
183211
BLOCKS_PER_YEAR *
184212
iporTokenUsdPrice) /
185213
lpTokenPrice /
186214
coinPrice /
187215
2) * //50% early withdraw fee
188216
100; //percentage
189217

190-
let apyWstEthAirdrop = 0;
191-
if (asset.asset === 'wstETH' && !wstEthAirdropLastEpochFinished) {
192-
const rewardsWstEthIporRatio = wstEthAirdrop.pools.find(
193-
(assetData) => assetData.asset === asset.asset
194-
).rewardsArbIporRatio;
195-
apyWstEthAirdrop =
196-
(((liquidityMiningGlobalStats.rewardsPerBlock /
197-
1e8 /
198-
(liquidityMiningGlobalStats.aggregatedPowerUp / 1e18)) *
199-
0.2 * //base powerup
200-
BLOCKS_PER_YEAR *
201-
wstethTokenUsdPrice *
202-
rewardsWstEthIporRatio) /
203-
lpTokenPrice /
204-
coinPrice) *
205-
100; //percentage
206-
}
207-
208-
const rewardsArbIporRatio = arbAidrdop.pools.find(
209-
(assetData) => assetData.asset === asset.asset
210-
).rewardsArbIporRatio;
211-
const apyAirdrop = !arbAirdropLastEpochFinished
212-
? (((liquidityMiningGlobalStats.rewardsPerBlock /
213-
1e8 /
214-
(liquidityMiningGlobalStats.aggregatedPowerUp / 1e18)) *
215-
0.2 * //base powerup
216-
BLOCKS_PER_YEAR *
217-
arbTokenUsdPrice *
218-
rewardsArbIporRatio) /
219-
lpTokenPrice /
220-
coinPrice) *
221-
100 //percentage
222-
: 0;
218+
const url = asset.asset === 'USDM'
219+
? `https://app.ipor.io/deposit/arbitrum/${asset.asset.toLowerCase()}`
220+
: `https://app.ipor.io/zap/arbitrum/${asset.asset.toLowerCase()}`;
223221

224222
pools.push({
225223
pool: asset.ipTokenAssetAddress + '-arbitrum',
@@ -228,9 +226,10 @@ const apy = async () => {
228226
symbol: asset.asset,
229227
tvlUsd: lpBalance * coinPrice,
230228
apyBase: Number(lpApr),
231-
apyReward: Number(apyReward + apyWstEthAirdrop + apyAirdrop),
229+
apyReward: Number(apyReward),
232230
underlyingTokens: [asset.assetAddress],
233231
rewardTokens: rewardsToken,
232+
url: url,
234233
});
235234
}
236235

@@ -239,6 +238,5 @@ const apy = async () => {
239238

240239
module.exports = {
241240
timetravel: false,
242-
apy: apy,
243-
url: 'https://app.ipor.io/pools',
241+
apy: apy
244242
};

0 commit comments

Comments
 (0)