Отправка токенов при успешной оплате Coinpayments с помощью Web3py
Я пишу приложение Django и хочу отправить токены с помощью Web3, как только Coinpayments отправит мне обратный вызов об успешной оплате. Проблема в том, что Coinpayments отправляет сразу несколько обратных вызовов, и только в одном случае отправляются токены, а другие обратные вызовы получаютreplacement transaction underpriced error
. Я уже пробовал использовать такие решения, как добавить +1 кnonce
или удалите этот параметр, но это мне не помогает, потому что транзакции по-прежнему создаются с тем же значением nonce. Как это можно исправить или что я делаю не так?
class CoinpaymentsIPNPaymentView(BaseCoinpaymentsIPNView):
def post(self, request, order_id, *args, **kwargs):
status = int(request.POST.get('status'))
order = Order.objects.get(id=order_id)
order.status = request.POST.get("status_text")
if not status >= 100:
order.save()
return JsonResponse({"status": status})
amount = Decimal(request.POST.get('amount1'))
record = Record.objects.create(
user=order.user,
type='i',
amount=amount,
)
order.record = record
order.save()
gold_record = GoldRecord.objects.get(from_record=record)
contract = w3.eth.contract(address=CONTRACT_ADDRESS, abi=ABI_JSON)
transaction = contract.functions.transfer(order.user.wallet.address, int(gold_record.amount * 10 ** 18)).buildTransaction({
'chainId': 1,
'gas': 70000,
'nonce': w3.eth.getTransactionCount(WALLET_ADDRESS) # address where all tokens are stored
})
signed_tx = w3.eth.account.signTransaction(transaction, WALLET_PRIVATE_KEY) # signing with wallet's above private key
tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction)
print(tx_hash.hex())
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)
return JsonResponse({"status": status})
PS Я уже спрашивал об этом на Ethereum StackExchange, но никто не ответил и не прокомментировал это: https://ethereum.stackexchange.com/questions/80961/sending-tokens-out-on-coinpayments-success-payment-using-web3py
1 ответ
Хорошо, дайте Интернету знать ответ и решение, которые я нашел сам
Каждая транзакция должна иметь уникальный одноразовый номер, поэтому я заметил, что если я выполняю цикл для отправки транзакций и устанавливаю nonce
как w3.eth.getTransactionCount(WALLET_ADDRESS) + index
затем он отправляет все транзакции без ошибок. Поэтому я убрал мгновенную отправку монет (даже убралwaitForTransactionReceipt
чтобы ускорить его) и сделал команду управления, в которой я обрабатываю все выплаты, и если она была отправлена успешно, я назначаю ее tx_hash
и запускать каждые 10 минут с помощью Heroku Scheduler