@@ -6,16 +6,12 @@ const LP_STATS_ETHEREUM_URL =
6
6
'https://api.ipor.io/monitor/liquiditypool-statistics-1' ;
7
7
const LP_STATS_ARBITRUM_URL =
8
8
'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' ;
11
9
const COIN_PRICES_URL = 'https://coins.llama.fi/prices/current' ;
12
10
13
11
const LM_ADDRESS_ETHEREUM = '0xCC3Fc4C9Ba7f8b8aA433Bc586D390A70560FF366' ;
14
12
const LM_ADDRESS_ARBITRUM = '0xdE645aB0560E5A413820234d9DDED5f4a55Ff6dd' ;
15
13
const IPOR_TOKEN_ETHEREUM = '0x1e4746dc744503b53b4a082cb3607b169a289090' ;
16
14
const IPOR_TOKEN_ARBITRUM = '0x34229b3f16fbcdfa8d8d9d17c0852f9496f4c7bb' ;
17
- const ARB_TOKEN_ARBITRUM = '0x912ce59144191c1204e64559fe8253a0e49e6548' ;
18
- const WSTETH_TOKEN_ARBITRUM = '0x5979d7b546e38e414f7e9822514be443a4800529' ;
19
15
20
16
const BLOCKS_PER_YEAR = ( 365 * 24 * 3600 ) / 12 ;
21
17
@@ -24,12 +20,6 @@ const apy = async () => {
24
20
. assets ;
25
21
const assetsArbitrum = ( await superagent . get ( LP_STATS_ARBITRUM_URL ) ) . body
26
22
. 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
33
23
const coinKeys = assetsEthereum . map (
34
24
( assetData ) => 'ethereum:' + assetData . assetAddress
35
25
) ;
@@ -39,17 +29,12 @@ const apy = async () => {
39
29
40
30
coinKeys . push ( 'ethereum:' + IPOR_TOKEN_ETHEREUM ) ;
41
31
coinKeys . push ( ...coinKeysArbitrum ) ;
42
- coinKeys . push ( 'arbitrum:' + ARB_TOKEN_ARBITRUM ) ;
43
- coinKeys . push ( 'arbitrum:' + WSTETH_TOKEN_ARBITRUM ) ;
44
32
const coinPrices = (
45
33
await superagent . get (
46
34
`${ COIN_PRICES_URL } /${ coinKeys . join ( ',' ) . toLowerCase ( ) } `
47
35
)
48
36
) . body . coins ;
49
37
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 ;
53
38
54
39
const lpTokenEthereumAddresses = assetsEthereum . map (
55
40
( assetData ) => assetData . ipTokenAssetAddress
@@ -80,6 +65,26 @@ const apy = async () => {
80
65
] )
81
66
)
82
67
) ;
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
+ ) ;
83
88
84
89
const globalStatsArbitrum = new Map (
85
90
(
@@ -102,6 +107,26 @@ const apy = async () => {
102
107
] )
103
108
)
104
109
) ;
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
+ ) ;
105
130
106
131
const pools = [ ] ;
107
132
@@ -124,18 +149,23 @@ const apy = async () => {
124
149
const liquidityMiningGlobalStats = globalStatsEthereum . get (
125
150
asset . ipTokenAssetAddress . toLowerCase ( )
126
151
) ;
152
+ const vectorOfCurve = poolPowerUpModifiersEthereum . get (
153
+ asset . ipTokenAssetAddress . toLowerCase ( )
154
+ ) . vectorOfCurve / 1e18
127
155
const apyReward =
128
156
( ( ( liquidityMiningGlobalStats . rewardsPerBlock /
129
157
1e8 /
130
158
( liquidityMiningGlobalStats . aggregatedPowerUp / 1e18 ) ) *
131
- 0.2 * //base powerup
159
+ ( 0.2 + vectorOfCurve ) * //base powerup
132
160
BLOCKS_PER_YEAR *
133
161
iporTokenUsdPrice ) /
134
162
lpTokenPrice /
135
163
coinPrice /
136
164
2 ) * //50% early withdraw fee
137
165
100 ; //percentage
138
166
167
+ const url = `https://app.ipor.io/zap/ethereum/${ asset . asset . toLowerCase ( ) } ` ;
168
+
139
169
pools . push ( {
140
170
pool : asset . ipTokenAssetAddress + '-ethereum' ,
141
171
chain : 'Ethereum' ,
@@ -146,17 +176,12 @@ const apy = async () => {
146
176
apyReward : Number ( apyReward ) ,
147
177
underlyingTokens : [ asset . assetAddress ] ,
148
178
rewardTokens : [ IPOR_TOKEN_ETHEREUM ] ,
179
+ url : url ,
149
180
} ) ;
150
181
}
151
182
152
183
for ( const asset of assetsArbitrum ) {
153
184
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
- }
160
185
const lpApr = asset . periods . find (
161
186
( { period } ) => period === 'MONTH'
162
187
) . ipTokenReturnValue ;
@@ -175,51 +200,24 @@ const apy = async () => {
175
200
const liquidityMiningGlobalStats = globalStatsArbitrum . get (
176
201
asset . ipTokenAssetAddress . toLowerCase ( )
177
202
) ;
203
+ const vectorOfCurve = poolPowerUpModifiersArbitrum . get (
204
+ asset . ipTokenAssetAddress . toLowerCase ( )
205
+ ) . vectorOfCurve / 1e18 ;
178
206
const apyReward =
179
207
( ( ( liquidityMiningGlobalStats . rewardsPerBlock /
180
208
1e8 /
181
209
( liquidityMiningGlobalStats . aggregatedPowerUp / 1e18 ) ) *
182
- 0.2 * //base powerup
210
+ ( 0.2 + vectorOfCurve ) * //base powerup
183
211
BLOCKS_PER_YEAR *
184
212
iporTokenUsdPrice ) /
185
213
lpTokenPrice /
186
214
coinPrice /
187
215
2 ) * //50% early withdraw fee
188
216
100 ; //percentage
189
217
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 ( ) } ` ;
223
221
224
222
pools . push ( {
225
223
pool : asset . ipTokenAssetAddress + '-arbitrum' ,
@@ -228,9 +226,10 @@ const apy = async () => {
228
226
symbol : asset . asset ,
229
227
tvlUsd : lpBalance * coinPrice ,
230
228
apyBase : Number ( lpApr ) ,
231
- apyReward : Number ( apyReward + apyWstEthAirdrop + apyAirdrop ) ,
229
+ apyReward : Number ( apyReward ) ,
232
230
underlyingTokens : [ asset . assetAddress ] ,
233
231
rewardTokens : rewardsToken ,
232
+ url : url ,
234
233
} ) ;
235
234
}
236
235
@@ -239,6 +238,5 @@ const apy = async () => {
239
238
240
239
module . exports = {
241
240
timetravel : false ,
242
- apy : apy ,
243
- url : 'https://app.ipor.io/pools' ,
241
+ apy : apy
244
242
} ;
0 commit comments