У меня вопрос о том, как получить агрегированные токены WETH в Uniswap v3. В настоящее время я получаю объединенный WETH, читая `slot0.sqrtPriceX96` и `liquidity()` пула Uniswap V3, сопоставляя активную ликвидность (L) в текущем ценовом диапазоне с эквивалентной парой количества токенов/WETH, чтобы получить виртуальные резервы. Однако иногда значение отличается от фактического объединенного WETH. Есть ли другие способы получить это значение?
private void calculateV3ReservesAndPriceForMultiCall(Token token, BigInteger blockNumber, MultiCallPreResponse preResponse,String poolAddr) throws Exception {
Web3j web3j = Web3jFactory.getNeedHistoryWeb3j(token.getChainId(), blockNumber);
IUniswapV3Pool v3Pool = IUniswapV3Pool.load(poolAddr, web3j, new ReadonlyTransactionManager(web3j, poolAddr), new DefaultGasProvider());
Tuple7 slot0 = v3Pool.slot0().send();
BigInteger P = slot0.component1(); // sqrtPriceX96
BigInteger liquidity = v3Pool.liquidity().send();
if (P == null || P.signum() == 0 || liquidity == null || liquidity.signum() == 0) {
log.warn("V3 pool data is invalid.: sqrtPriceX96={}, liquidity={}", P, liquidity);
return;
}
BigDecimal L = new BigDecimal(liquidity);
BigDecimal Q96 = new BigDecimal(BigInteger.ONE.shiftLeft(96));
// ===== Correct V3 reserve calculation =====
// amount0 = L / sqrtPrice = L * Q96 / sqrtPriceX96
// amount1 = L * sqrtPrice = L * sqrtPriceX96 / Q96
BigDecimal amount0 = L.multiply(Q96).divide(new BigDecimal(P), 0, RoundingMode.DOWN);
BigDecimal amount1 = L.multiply(new BigDecimal(P)).divide(Q96, 0, RoundingMode.DOWN);
boolean isToken0 = Boolean.TRUE.equals(token.getIsToken0());
BigInteger tokenAmountAtoms;
BigInteger wethAmountAtoms;
if (isToken0) {
tokenAmountAtoms = amount0.toBigIntegerExact();
wethAmountAtoms = amount1.toBigIntegerExact();
} else {
tokenAmountAtoms = amount1.toBigIntegerExact();
wethAmountAtoms = amount0.toBigIntegerExact();
}
preResponse.setTokenReverse(tokenAmountAtoms, wethAmountAtoms);
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... uniswap-v3
Как получить объединенные средства токена в Uniswap v3? ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1770022209
Anonymous
У меня вопрос о том, как получить агрегированные токены WETH в Uniswap v3. В настоящее время я получаю объединенный WETH, читая `slot0.sqrtPriceX96` и `liquidity()` пула Uniswap V3, сопоставляя активную ликвидность (L) в текущем ценовом диапазоне с эквивалентной парой количества токенов/WETH, чтобы получить виртуальные резервы. Однако иногда значение отличается от фактического объединенного WETH. Есть ли другие способы получить это значение?
private void calculateV3ReservesAndPriceForMultiCall(Token token, BigInteger blockNumber, MultiCallPreResponse preResponse,String poolAddr) throws Exception {
Web3j web3j = Web3jFactory.getNeedHistoryWeb3j(token.getChainId(), blockNumber);
IUniswapV3Pool v3Pool = IUniswapV3Pool.load(poolAddr, web3j, new ReadonlyTransactionManager(web3j, poolAddr), new DefaultGasProvider());
Tuple7 slot0 = v3Pool.slot0().send();
BigInteger P = slot0.component1(); // sqrtPriceX96
BigInteger liquidity = v3Pool.liquidity().send();
if (P == null || P.signum() == 0 || liquidity == null || liquidity.signum() == 0) {
log.warn("V3 pool data is invalid.: sqrtPriceX96={}, liquidity={}", P, liquidity);
return;
}
BigDecimal L = new BigDecimal(liquidity);
BigDecimal Q96 = new BigDecimal(BigInteger.ONE.shiftLeft(96));
// ===== Correct V3 reserve calculation =====
// amount0 = L / sqrtPrice = L * Q96 / sqrtPriceX96
// amount1 = L * sqrtPrice = L * sqrtPriceX96 / Q96
BigDecimal amount0 = L.multiply(Q96).divide(new BigDecimal(P), 0, RoundingMode.DOWN);
BigDecimal amount1 = L.multiply(new BigDecimal(P)).divide(Q96, 0, RoundingMode.DOWN);
boolean isToken0 = Boolean.TRUE.equals(token.getIsToken0());
BigInteger tokenAmountAtoms;
BigInteger wethAmountAtoms;
if (isToken0) {
tokenAmountAtoms = amount0.toBigIntegerExact();
wethAmountAtoms = amount1.toBigIntegerExact();
} else {
tokenAmountAtoms = amount1.toBigIntegerExact();
wethAmountAtoms = amount0.toBigIntegerExact();
}
preResponse.setTokenReverse(tokenAmountAtoms, wethAmountAtoms);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79880927/how-to-obtain-the-pooled-funds-of-a-token-in-uniswap-v3[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия