簡體   English   中英

如何使用合約交互從 web3.py 獲取未簽名的交易數據

[英]How to get an unsigned transaction data from web3.py using contract interaction

目前我正在做一個項目,我有以下流程:

  1. 用戶想要進行交易,他們選擇chaintoken
  2. 從數據庫中檢索合同(可能是代理合同)和其他數據
  3. 我計算要在對 Metamask 的前端調用中使用的data鍵、值對
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( .call().transact() 它們都適用於以太坊鏈。 但是,當我將這些調用應用於 Polygon 或 BSC 鏈上的合約時,它們會報告錯誤,例如:

錯誤 1: BEP20: transfer to zero address - 我什至不明白這是怎么可能的,因為我四倍檢查了我沒有將零地址輸入 function,但是它仍然在沒有“to”參數的情況下報告此錯誤即使在 function 調用中定義收件人時也是如此。

錯誤 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"]

我想到的解決方案是在返回數據 hash 之前跳過 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)])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM