如何批准用于支出的令牌Uniswap 路由器合同

问题描述

我正在尝试批准,然后通过 web3py 代码在 uniswap 上交换我的令牌。我也在使用 infura,而不是我自己的节点。但是,在交换和批准中,我都遇到了solidityErrors。问题是即使我签署了 tx 并将我的私钥传递给它,web3 也无法识别我的帐户。关于如何让 web3 识别我的钱包的任何想法?

这是我的批准功能代码

def approve(self,token_name):

    my_token = token(token_name)
    contract = my_token.createContract()
    spender = uni_router_address
    max_amount = web3.toWei(2**64-1,'ether')
    nonce = web3.eth.getTransactionCount(account)

    tx = contract.functions.approve(spender,max_amount).buildTransaction({'nonce': nonce})
    signed_tx = web3.eth.account.signTransaction(tx,self.pkey)
    gas = signed_tx.estimateGas()
    print(gas)

    return

我正在估算gas,所以我在发送之前就知道要使用多少gas。我知道我需要将 sendRawTransaction 用于本地私钥。关于如何与现有智能合约的本地私钥进行交互,文档并不十分清楚。

解决方法

def approve(token,spender_address,wallet_address,private_key):

  spender = spender_address
  max_amount = web3.toWei(2**64-1,'ether')
  nonce = web3.eth.getTransactionCount(wallet_address)

  tx = token.functions.approve(spender,max_amount).buildTransaction({
      'from': wallet_address,'nonce': nonce
      })
    
  signed_tx = web3.eth.account.signTransaction(tx,private_key)
  tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)

  return web3.toHex(tx_hash)

使用您的私钥签名后,您需要将原始交易发送出去以将其广播到区块链。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...