如何使用合约交互从web3.py获取未签名的交易数据



目前我正在进行一个项目,其中我有以下流程:

  1. 用户想要进行交易,他们选择chaintoken
  2. 从数据库中检索合同(可能是代理合同(和其他数据
  3. 我计算data密钥,值对,以便在对Metamask的前端调用中使用
transaction = await ethereum.request({
method: 'eth_sendTransaction',
params: [
{
to: '{{ paymentrequest.paymentaddress }}',
from: ethereum.selectedAddress,
data: '{{ paymentrequest.transhex }}',
chainId: '{{ paymentrequest.chain.chainid }}'
}],
});
  1. 用户会得到一个元任务弹出窗口,其中包含上面的数据,要求他们进行交易

步骤3是我遇到问题的地方。为了通过web3.py从计算的tx中获得数据属性,我必须使用.call().transact()。这两个都适用于以太坊链。但当我对Polygon或BSC链上的合同进行这些调用时,他们会报告错误,例如:

错误1:BEP20: transfer to zero address-我甚至不明白这是怎么可能的,因为我四次检查了我没有向函数中输入零地址,但它仍然报告了这个错误,没有"0";至";参数,即使在函数调用中定义接收方时也是如此。

错误2:BEP20: transfer amount exceeds balance-我不想使用一个包含其他人的一堆令牌的地址来绕过这个错误。我想远离别人钱包里有一堆硬币的限制。

这是我使用的代码:

def bnbTXCompute(paymentrequest, tokenamount, contractaddress, tokenaddress):
w3 = Web3(Web3.HTTPProvider(paymentrequest.chain.rpc, request_kwargs={'timeout': 60}))
w3.middleware_onion.inject(geth_poa_middleware, layer=0)
contract = w3.eth.contract(address=contractaddress, abi=paymentrequest.token.abi)
txn = contract.functions.transfer(paymentrequest.wallet,
tokenamount * pow(10, paymentrequest.token.decimals)).call({"to": tokenaddress, "from": "0xbunchoflettersandnumbers"}, )
# I have tried to remove both the "to" and "from" parameters, but they both result in either error 1 or 2
return txn["data"]
def polyTXCompute(paymentrequest, tokenamount, contractaddress, tokenaddress):
w3 = Web3(Web3.HTTPProvider(paymentrequest.chain.rpc, request_kwargs={'timeout': 60}))
w3.middleware_onion.inject(geth_poa_middleware, layer=0)
contract = w3.eth.contract(address=contractaddress, abi=paymentrequest.token.abi)
txn = contract.functions.transfer(paymentrequest.wallet,
tokenamount * pow(10, paymentrequest.token.decimals)).transact({"to": tokenaddress, "from": "0xbunchoflettersandnumbers"})
return txn["data"]
def ethTXCompute(paymentrequest, tokenamount, contractaddress):
w3 = Web3(Web3.HTTPProvider(paymentrequest.chain.rpc, request_kwargs={'timeout': 60}))
w3.middleware_onion.inject(geth_poa_middleware, layer=0)
contract = w3.eth.contract(address=contractaddress, abi=paymentrequest.token.abi)
txn = contract.functions.transfer(paymentrequest.wallet,
tokenamount * pow(10, paymentrequest.token.decimals)).transact()
return txn["data"]

我想到的解决方案是在返回数据哈希之前跳过web3.py正在进行的所有这些检查。然而,我就是做不到这样的事。感谢您的帮助。

web3.py文档:https://web3py.readthedocs.io/en/latest/

和往常一样,开发人员应该读得更好:

替换:

txn = contract.functions.transfer(paymentrequest.wallet, tokenamount * pow(10, paymentrequest.token.decimals)).call({"to": tokenaddress, "from": "0xbunchoflettersandnumbers"}, )

带有:

txn = contract.encodeABI(fn_name="transfer", args=[paymentrequest.wallet, tokenamount * pow(10, paymentrequest.token.decimals)])

最新更新