Не запускается скрипт для Клейма Токенов

Рейтинг: 0Ответов: 1Опубликовано: 19.03.2023
import os
from web3 import Web3
from dotenv import load_dotenv

load_dotenv()

# подключаемся к сети Arbitrum
w3 = Web3(Web3.HTTPProvider(os.getenv('WEB3_PROVIDER_URL')))

# адрес контракта
contract_address = Web3.toChecksumAddress(
    '0x67a24ce4321ab3af51c2d0a4801c3e111d88c9d9')

# аби-интерфейс контракта
contract_abi = [
    {
        "inputs": [],
        "name": "claimTokens",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "inputs": [],
        "name": "tokenBalance",
        "outputs": [
            {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
            }
        ],
        "stateMutability": "view",
        "type": "function"
    }
]

# создаем экземпляр контракта
contract = w3.eth.contract(address=contract_address, abi=contract_abi)

# адрес биржи, на который будут отправлены токены после клейма
exchange_address = Web3.toChecksumAddress(
    '0x0000000000000000000000000000000000000000')

# адрес кошелька, с которого будет производиться клейминг токенов
wallet_address = Web3.toChecksumAddress(os.getenv('WALLET_ADDRESS'))

# приватный ключ кошелька, с которого будет производиться клейминг токенов
wallet_private_key = os.getenv('WALLET_PRIVATE_KEY')

# газ-лимит для транзакции
gas_limit = 300000

# функция для автоматического определения цены за газ


def get_gas_price():
    # получаем текущую цену за газ с помощью API провайдера
    gas_price = w3.eth.gas_price
    # устанавливаем цену за газ в 1.5 раза выше текущей средней цены
    return gas_price * 1.5

# клеймим токены и отправляем их на адрес биржи


def claim_and_send_tokens():
    # получаем баланс токенов на контракте
    token_balance = contract.functions.tokenBalance().call()
    # если баланс равен 0, то выводим сообщение и завершаем выполнение функции
    if token_balance == 0:
        print('Token balance is 0, nothing to claim.')
        return
    # создаем транзакцию для клейма токенов
    tx = contract.functions.claimTokens().buildTransaction({
        'from': wallet_address,
        'nonce': w3.eth.getTransactionCount(wallet_address),
        'gas': gas_limit,
        'gasPrice': get_gas_price()
    })
    # подписываем транзакцию с помощью приватного ключа
    signed_tx = w3.eth.account.sign_transaction
    # подписываем транзакцию с помощью приватного ключа

    signed_tx = w3.eth.account.sign_transaction(
        tx, private_key=wallet_private_key)


    # отправляем транзакцию на сеть
    tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
    print(f'Transaction sent, hash: {Web3.toHex(tx_hash)}')
    # ожидаем подтверждения транзакции
    receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
    print(f'Transaction confirmed, gas used: {receipt.gasUsed}')
    # создаем транзакцию для отправки токенов на биржу
    send_tx = w3.eth.contract(address=contract_address, abi=contract_abi).functions.transfer(exchange_address, token_balance).buildTransaction({
        'from': wallet_address,
        'nonce': w3.eth.getTransactionCount(wallet_address),
        'gas': gas_limit,
        'gasPrice': get_gas_price()
    })
    # подписываем транзакцию с помощью приватного ключа
    signed_send_tx = w3.eth.account.sign_transaction(
        send_tx, private_key=wallet_private_key)
    # отправляем транзакцию на сеть
    send_tx_hash = w3.eth.send_raw_transaction(signed_send_tx.rawTransaction)
    print(f'Tokens sent, hash: {Web3.toHex(send_tx_hash)}')
    # ожидаем подтверждения транзакции
    send_receipt = w3.eth.wait_for_transaction_receipt(send_tx_hash)
    print(f'Tokens sent, gas used: {send_receipt.gasUsed}')
    #вызываем функцию для клейма и отправки токенов
    claim_and_send_tokens()

Ответы

▲ 0

Функция get_gas_price() должна возвращать значение int, а не float.
Будет ошибка при создании транзакции.