Skip to content

Commit 0a2a958

Browse files
committed
IPOR liquidity mining power up from contracts
1 parent d1b792d commit 0a2a958

File tree

2 files changed

+78
-49
lines changed

2 files changed

+78
-49
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: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,6 @@ const apy = async () => {
2424
.assets;
2525
const assetsArbitrum = (await superagent.get(LP_STATS_ARBITRUM_URL)).body
2626
.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
3327
const coinKeys = assetsEthereum.map(
3428
(assetData) => 'ethereum:' + assetData.assetAddress
3529
);
@@ -80,6 +74,26 @@ const apy = async () => {
8074
])
8175
)
8276
);
77+
const poolPowerUpModifiersEthereum = new Map(
78+
(
79+
await sdk.api.abi.multiCall({
80+
chain: 'ethereum',
81+
abi: liquidityMiningV2Abi.find(
82+
({ name }) => name === 'getPoolPowerUpModifiers'
83+
),
84+
calls: lpTokenEthereumAddresses.map(lpTokenEthereumAddress => {
85+
return {
86+
target: LM_ADDRESS_ETHEREUM,
87+
params: [lpTokenEthereumAddress]
88+
};
89+
}
90+
),
91+
})
92+
).output.map((response) => [
93+
response.input.params[0].toLowerCase(),
94+
response.output,
95+
])
96+
);
8397

8498
const globalStatsArbitrum = new Map(
8599
(
@@ -102,6 +116,26 @@ const apy = async () => {
102116
])
103117
)
104118
);
119+
const poolPowerUpModifiersArbitrum = new Map(
120+
(
121+
await sdk.api.abi.multiCall({
122+
chain: 'arbitrum',
123+
abi: liquidityMiningV2Abi.find(
124+
({ name }) => name === 'getPoolPowerUpModifiers'
125+
),
126+
calls: lpTokenArbitrumAddresses.map(lpTokenEthereumAddress => {
127+
return {
128+
target: LM_ADDRESS_ARBITRUM,
129+
params: [lpTokenEthereumAddress]
130+
};
131+
}
132+
),
133+
})
134+
).output.map((response) => [
135+
response.input.params[0].toLowerCase(),
136+
response.output,
137+
])
138+
);
105139

106140
const pools = [];
107141

@@ -124,11 +158,14 @@ const apy = async () => {
124158
const liquidityMiningGlobalStats = globalStatsEthereum.get(
125159
asset.ipTokenAssetAddress.toLowerCase()
126160
);
161+
const vectorOfCurve = poolPowerUpModifiersEthereum.get(
162+
asset.ipTokenAssetAddress.toLowerCase()
163+
).vectorOfCurve / 1e18
127164
const apyReward =
128165
(((liquidityMiningGlobalStats.rewardsPerBlock /
129166
1e8 /
130167
(liquidityMiningGlobalStats.aggregatedPowerUp / 1e18)) *
131-
0.2 * //base powerup
168+
(0.2 + vectorOfCurve) * //base powerup
132169
BLOCKS_PER_YEAR *
133170
iporTokenUsdPrice) /
134171
lpTokenPrice /
@@ -151,12 +188,6 @@ const apy = async () => {
151188

152189
for (const asset of assetsArbitrum) {
153190
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-
}
160191
const lpApr = asset.periods.find(
161192
({ period }) => period === 'MONTH'
162193
).ipTokenReturnValue;
@@ -175,60 +206,29 @@ const apy = async () => {
175206
const liquidityMiningGlobalStats = globalStatsArbitrum.get(
176207
asset.ipTokenAssetAddress.toLowerCase()
177208
);
209+
const vectorOfCurve = poolPowerUpModifiersArbitrum.get(
210+
asset.ipTokenAssetAddress.toLowerCase()
211+
).vectorOfCurve / 1e18;
178212
const apyReward =
179213
(((liquidityMiningGlobalStats.rewardsPerBlock /
180214
1e8 /
181215
(liquidityMiningGlobalStats.aggregatedPowerUp / 1e18)) *
182-
0.2 * //base powerup
216+
(0.2 + vectorOfCurve) * //base powerup
183217
BLOCKS_PER_YEAR *
184218
iporTokenUsdPrice) /
185219
lpTokenPrice /
186220
coinPrice /
187221
2) * //50% early withdraw fee
188222
100; //percentage
189223

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;
223-
224224
pools.push({
225225
pool: asset.ipTokenAssetAddress + '-arbitrum',
226226
chain: 'Arbitrum',
227227
project: 'ipor-derivatives',
228228
symbol: asset.asset,
229229
tvlUsd: lpBalance * coinPrice,
230230
apyBase: Number(lpApr),
231-
apyReward: Number(apyReward + apyWstEthAirdrop + apyAirdrop),
231+
apyReward: Number(apyReward),
232232
underlyingTokens: [asset.assetAddress],
233233
rewardTokens: rewardsToken,
234234
});

0 commit comments

Comments
 (0)