使用 Web3py 在 coinpayments 成功付款时发送令牌
Sending tokens out on coinpayments success payment using Web3py
我正在编写 Django 应用程序,并希望在 Coinpayments 向我发送有关成功付款的回调后使用 Web3 发送令牌。问题是 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})
P.S。我已经在 Ethereum StackExchange 上问过了,但没有人回答或评论它:https://ethereum.stackexchange.com/questions/80961/sending-tokens-out-on-coinpayments-success-payment-using-web3py
好吧,让网络知道我自己找到的答案和解决方案
每个交易都应该有唯一的随机数,所以我注意到如果我做一个发送交易的循环并将 nonce
设置为 w3.eth.getTransactionCount(WALLET_ADDRESS) + index
然后它发送所有交易而不会出现任何错误。所以我删除了即时硬币发送(甚至删除了 waitForTransactionReceipt
以加快它),并制作了我处理所有支出的管理命令,如果发送成功,我分配它的 tx_hash
和 运行每 10 分钟使用 Heroku Scheduler
我正在编写 Django 应用程序,并希望在 Coinpayments 向我发送有关成功付款的回调后使用 Web3 发送令牌。问题是 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})
P.S。我已经在 Ethereum StackExchange 上问过了,但没有人回答或评论它:https://ethereum.stackexchange.com/questions/80961/sending-tokens-out-on-coinpayments-success-payment-using-web3py
好吧,让网络知道我自己找到的答案和解决方案
每个交易都应该有唯一的随机数,所以我注意到如果我做一个发送交易的循环并将 nonce
设置为 w3.eth.getTransactionCount(WALLET_ADDRESS) + index
然后它发送所有交易而不会出现任何错误。所以我删除了即时硬币发送(甚至删除了 waitForTransactionReceipt
以加快它),并制作了我处理所有支出的管理命令,如果发送成功,我分配它的 tx_hash
和 运行每 10 分钟使用 Heroku Scheduler