ru24.pro
Работа
Ноябрь
2024

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

0
Пишу скрипт автоматической ребалансировки позиции на 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')