|
| 1 | +const { formatUnits } = require("ethers").utils; |
| 2 | +const { BigNumber } = require("ethers"); |
| 3 | +const { getBlock } = require("./block"); |
| 4 | +const { resolveAsset, resolveContract } = require("../utils/resolvers"); |
| 5 | +const { getSigner } = require("../utils/signers"); |
| 6 | +const { base } = require("../utils/addresses"); |
| 7 | + |
| 8 | +const snapAero = async ({ block }) => { |
| 9 | + const signer = await getSigner(); |
| 10 | + const blockTag = await getBlock(block); |
| 11 | + |
| 12 | + const weth = await resolveAsset("WETH"); |
| 13 | + const vault = await resolveContract("OETHBaseVaultProxy", "IVault"); |
| 14 | + const oeth = await resolveContract("OETHBaseProxy", "OETHBase"); |
| 15 | + const pool = await resolveContract(base.aerodromeOETHbWETHClPool, "ICLPool"); |
| 16 | + const aeroStrat = await resolveContract( |
| 17 | + `AerodromeAMOStrategyProxy`, |
| 18 | + "AerodromeAMOStrategy" |
| 19 | + ); |
| 20 | + const sugarHelper = await resolveContract(base.sugarHelper, "ISugarHelper"); |
| 21 | + |
| 22 | + const Q96 = BigNumber.from(2).pow(96); |
| 23 | + const sqrtRatioX96TickLower = await aeroStrat |
| 24 | + .connect(signer) |
| 25 | + .sqrtRatioX96TickLower({ blockTag }); |
| 26 | + const sqrtRatioX96TickHigher = await aeroStrat |
| 27 | + .connect(signer) |
| 28 | + .sqrtRatioX96TickHigher({ blockTag }); |
| 29 | + const lowerTick = await aeroStrat.connect(signer).lowerTick({ blockTag }); |
| 30 | + |
| 31 | + const { tick, sqrtPriceX96 } = await pool.connect(signer).slot0({ blockTag }); |
| 32 | + const { liquidityGross } = await pool |
| 33 | + .connect(signer) |
| 34 | + .ticks(lowerTick, { blockTag }); |
| 35 | + const { amount0: tickWethBalance, amount1: tickOethBalance } = |
| 36 | + await sugarHelper |
| 37 | + .connect(signer) |
| 38 | + .getAmountsForLiquidity( |
| 39 | + sqrtPriceX96, |
| 40 | + sqrtRatioX96TickLower, |
| 41 | + sqrtRatioX96TickHigher, |
| 42 | + liquidityGross, |
| 43 | + { blockTag } |
| 44 | + ); |
| 45 | + |
| 46 | + // Pool balances |
| 47 | + const poolPrice = sqrtPriceX96 |
| 48 | + .mul(sqrtPriceX96) |
| 49 | + .mul(10000000000) |
| 50 | + .div(Q96) |
| 51 | + .div(Q96); |
| 52 | + const poolWethBalance = await weth |
| 53 | + .connect(signer) |
| 54 | + .balanceOf(base.aerodromeOETHbWETHClPool, { blockTag }); |
| 55 | + const poolOethBalance = await oeth |
| 56 | + .connect(signer) |
| 57 | + .balanceOf(base.aerodromeOETHbWETHClPool, { blockTag }); |
| 58 | + const poolTotal = poolWethBalance.add(poolOethBalance); |
| 59 | + const poolWethPercentage = poolWethBalance.mul(10000).div(poolTotal); |
| 60 | + const poolOethPercentage = poolOethBalance.mul(10000).div(poolTotal); |
| 61 | + |
| 62 | + // Tick balances |
| 63 | + const tickTotal = tickWethBalance.add(tickOethBalance); |
| 64 | + const tickWethPercentage = tickWethBalance.mul(10000).div(tickTotal); |
| 65 | + const tickOethPercentage = tickOethBalance.mul(10000).div(tickTotal); |
| 66 | + const tickTotalPercentage = tickTotal.mul(10000).div(poolTotal); |
| 67 | + |
| 68 | + // Strategy's tick position |
| 69 | + const { |
| 70 | + _amountWeth: tickStratWethBalance, |
| 71 | + _amountOethb: tickStratOethBalance, |
| 72 | + } = await aeroStrat.getPositionPrincipal(); |
| 73 | + const tickStratTotal = tickStratWethBalance.add(tickStratOethBalance); |
| 74 | + const tickStratWethPercentage = tickStratWethBalance |
| 75 | + .mul(10000) |
| 76 | + .div(tickStratTotal); |
| 77 | + const tickStratOethPercentage = tickStratOethBalance |
| 78 | + .mul(10000) |
| 79 | + .div(tickStratTotal); |
| 80 | + const tickStratTotalOfTickPercentage = tickStratTotal |
| 81 | + .mul(10000) |
| 82 | + .div(tickTotal); |
| 83 | + const tickStratTotalOfPoolPercentage = tickStratTotal |
| 84 | + .mul(10000) |
| 85 | + .div(poolTotal); |
| 86 | + |
| 87 | + const checkBalance = await aeroStrat |
| 88 | + .connect(signer) |
| 89 | + .checkBalance(weth.address, { blockTag }); |
| 90 | + |
| 91 | + const vaultWethBalance = await weth |
| 92 | + .connect(signer) |
| 93 | + .balanceOf(vault.address, { blockTag }); |
| 94 | + |
| 95 | + // Pool balances |
| 96 | + console.log( |
| 97 | + `Pool price : ${formatUnits(poolPrice, 10)} OETHb/WETH, ${tick} tick` |
| 98 | + ); |
| 99 | + console.log( |
| 100 | + `Pool WETH : ${formatUnits(poolWethBalance)} (${formatUnits( |
| 101 | + poolWethPercentage, |
| 102 | + 2 |
| 103 | + )}%), ${poolWethBalance} wei (includes unclaimed WETH)` |
| 104 | + ); |
| 105 | + console.log( |
| 106 | + `Pool OETH : ${formatUnits(poolOethBalance)} (${formatUnits( |
| 107 | + poolOethPercentage, |
| 108 | + 2 |
| 109 | + )}%), ${poolOethBalance} wei` |
| 110 | + ); |
| 111 | + console.log(`Pool total : ${formatUnits(poolTotal)}`); |
| 112 | + |
| 113 | + // Tick balances |
| 114 | + console.log( |
| 115 | + `\nTick WETH : ${formatUnits(tickWethBalance)} (${formatUnits( |
| 116 | + tickWethPercentage, |
| 117 | + 2 |
| 118 | + )}%), ${tickWethBalance} wei` |
| 119 | + ); |
| 120 | + console.log( |
| 121 | + `Tick OETH : ${formatUnits(tickOethBalance)} (${formatUnits( |
| 122 | + tickOethPercentage, |
| 123 | + 2 |
| 124 | + )}%), ${tickOethBalance} wei` |
| 125 | + ); |
| 126 | + console.log( |
| 127 | + `Tick total : ${formatUnits(tickStratTotal)} ${formatUnits( |
| 128 | + tickTotalPercentage, |
| 129 | + 2 |
| 130 | + )}% of pool` |
| 131 | + ); |
| 132 | + |
| 133 | + // Strategy's tick position |
| 134 | + console.log( |
| 135 | + `\nTick strat WETH : ${formatUnits(tickStratWethBalance)} (${formatUnits( |
| 136 | + tickStratWethPercentage, |
| 137 | + 2 |
| 138 | + )}%), ${poolWethBalance} wei` |
| 139 | + ); |
| 140 | + console.log( |
| 141 | + `Tick strat OETH : ${formatUnits(tickStratOethBalance)} (${formatUnits( |
| 142 | + tickStratOethPercentage, |
| 143 | + 2 |
| 144 | + )}%), ${poolOethBalance} wei` |
| 145 | + ); |
| 146 | + console.log( |
| 147 | + `Tick strat total : ${formatUnits(tickStratTotal)} ${formatUnits( |
| 148 | + tickStratTotalOfTickPercentage, |
| 149 | + 2 |
| 150 | + )}% of tick, ${formatUnits(tickStratTotalOfPoolPercentage, 2)}% of pool` |
| 151 | + ); |
| 152 | + |
| 153 | + console.log( |
| 154 | + `\nStrategy balance : ${formatUnits( |
| 155 | + checkBalance |
| 156 | + )} ether, ${checkBalance} wei` |
| 157 | + ); |
| 158 | + console.log( |
| 159 | + `Vault WETH : ${formatUnits( |
| 160 | + vaultWethBalance |
| 161 | + )}, ${vaultWethBalance} wei` |
| 162 | + ); |
| 163 | +}; |
| 164 | + |
| 165 | +module.exports = { |
| 166 | + snapAero, |
| 167 | +}; |
0 commit comments