Правильно обработать транзакцию Uniswap v3

Цена договорная
29 ноября 2024, 13:29 • 1 отклик • 18 просмотров
Пишу скрипт автоматической ребалансировки позиции на Uniswap v3. Вот функция минта новой позиции, с которой у меня основные проблемы.

def add_liquidity(web3, wallet_address, private_key, new_range_lower, new_range_upper, token_id, amount0=None,
amount1=None):
"""
Добавляет ликвидность в новый диапазон.
:param web3: Экземпляр Web3 для взаимодействия с блокчейном.
:param wallet_address: Адрес кошелька.
:param private_key: Приватный ключ кошелька.
:param new_range_lower: Новая нижняя граница диапазона.
:param new_range_upper: Новая верхняя граница диапазона.
:param amount0: Количество первого токена для добавления.
:param amount1: Количество второго токена для добавления.
:param token_id: ID позиции NFT на Uniswap.
"""
token0 = TOKEN0 # WETH
token1 = TOKEN1 # USDC

logger = setup_logger(wallet_address)
logger.info(f"Добавление ликвидности в диапазон {new_range_lower} - {new_range_upper} начато.")

tick_lower, tick_upper = price_to_tick(new_range_lower), price_to_tick(new_range_upper)
price_ticked_lower, price_ticked_upper = tick_to_price(tick_lower), tick_to_price(tick_upper)

try:
# Если amount0 не передано, вычисляем их динамически
if amount0 is None:
amount0, amount1 = AMOUNT0, AMOUNT1
logger.info(f"Вычислены значения для кошелька {wallet_address}: amount0 = {amount0}, amount1 = {amount1}")
else:
amount1 = eth_to_usdc(price_ticked_lower, price_ticked_upper, get_eth_price(), amount0)
logger.info(f"Используются переданные значения для кошелька {wallet_address}: amount0 = {amount0}, amount1 = {amount1}")
# Получаем контракт
position_manager = get_contract(POSITION_MANAGER_ADDRESS, POSITION_MANAGER_ABI_PATH)

params = (
Web3.to_checksum_address(token0),
Web3.to_checksum_address(token1),
3000,
tick_lower,
tick_upper,
Web3.to_wei(amount0, 'ether'),
int(amount1 * (10**6)),
0,
0,
Web3.to_checksum_address(wallet_address),
int(time.time()) + 60
)
print(Web3.to_checksum_address(token0),
Web3.to_checksum_address(token1),
3000,
tick_lower,
tick_upper,
Web3.to_wei(amount0, 'ether'),
int(amount1 * (10**6)),
0,
0,
Web3.to_checksum_address(wallet_address),
int(time.time()) + 60)
add_liquidity_txn = position_manager.functions.mint(params).build_transaction({
"from": wallet_address,
"value": 0,
"gasPrice": int(web3.eth.gas_price * GAS_PRICE_MULTIPLIER),
"nonce": web3.eth.get_transaction_count(wallet_address),
})

# Оценка газа для mint
estimated_gas = web3.eth.estimate_gas(add_liquidity_txn)
add_liquidity_txn['gas'] = int(estimated_gas * 1.2) # Добавляем запас 20%
signed_tx = web3.eth.account.sign_transaction(add_liquidity_txn, private_key=private_key)

tx_hash = web3.eth.send_raw_transaction(signed_tx.raw_transaction)

logger.info(f"Ликвидность успешно добавлена для кошелька {wallet_address}. Хэш транзакции: {tx_hash}")
except Exception as e:
logger.error(f"Ошибка при добавлении ликвидности для кошелька {wallet_address}: {e}")
Вот, что лежит в params 0x4200000000000000000000000000000000000006 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 3000 -194630 -194351 100000000000000 379277 0 0 0xdb9733BE614A69a62ad717f3158BBA383b2F740B 1732838297

Проблема в том, что при таких параметрах вечно получаю ошибку

2024-11-29 02:57:18,546 - ERROR - Ошибка при добавлении ликвидности для кошелька 0xdb9733BE614A69a62ad717f3158BBA383b2F740B: ('execution reverted', 'no data')

Когда меняю тики, то выходит

0xdb9733BE614A69a62ad717f3158BBA383b2F740B: ('execution reverted: STF', '0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000035354460000000000000000000000000000000000000000000000000000000000')