Отправка токенов при успешной оплате монетными платежами с помощью Web3py - PullRequest
0 голосов
/ 28 марта 2020

Я пишу приложение Django и хочу отправить токены с помощью Web3, как только Coinpayments отправит мне ответный звонок об успешной оплате. Проблема в том, что Coinpayments отправляет несколько обратных вызовов одновременно, и только в одном случае токены отправляются, другие обратные вызовы получают replacement transaction underpriced error. Я уже пытался использовать такие решения, как добавление +1 к 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 Ответ

0 голосов
/ 31 марта 2020

Хорошо, дайте Интернету знать ответ и решение, которое я нашел самостоятельно

Каждая транзакция должна иметь уникальный одноразовый номер, поэтому я заметил, что если я сделаю все oop для отправки транзакций и установлю nonce как w3.eth.getTransactionCount(WALLET_ADDRESS) + index, то все транзакции отправляются без ошибок. Поэтому я удалил мгновенную отправку монет (даже удалил waitForTransactionReceipt, чтобы ускорить ее) и сделал команду управления, в которой я обрабатываю все выплаты, и если она была успешно отправлена, я присваиваю ее tx_hash и запускаю ее каждые 10 минут с помощью Heroku Scheduler

...