【问题标题】:Web3 | TransferFrom() transactions always Failed网络3 | TransferFrom() 交易总是失败
【发布时间】:2018-08-31 11:53:44
【问题描述】:

我正在尝试使用 Web3.js 的 transferFrom() 函数将自定义 ERC20 令牌发送到所有者钱包地址

但是所有的交易都失败了。在 Remix IDE 上也会出现同样的问题。 这里关于 stackOverflow 的一些答案说,approve() 需要在 transferFrom() 函数之前首先调用。所以,我首先尝试了 Remix,但我遇到了同样的问题。然后尝试使用如下 Web3.js。

const myContract = new web3.eth.Contract(abi);
const amount = sendAmount;
let address = myAddress;
myContract.options.address = contractAddress;
myContract.options.from = TokenOwner;
let options = myContract.options;
let data1 = myContract.methods.approve(address, amount).encodeABI();
let data2 = myContract.methods.transferFrom(address, TokenOwner, amount).encodeABI();

const ethAccount = fromPrivateKey(toBuffer("0x..."));
const fromPrivateKeyBuffer = ethAccount.getPrivateKey();

web3.eth.getTransactionCount(TokenOwner, (err, count) => {
  if (err) return;

  const txData = {
    chainId: 0x03,
    gasPrice: web3.utils.toHex(42000000000),
    gasLimit: web3.utils.toHex(90000),
    to: contractAddress,
    from: TokenOwner,
    value: 0x0,
    nonce: web3.utils.toHex(count),
    data: data1
  };
  const tx = new ethTx(txData);
  tx.sign(fromPrivateKeyBuffer);
  const serializedTx = tx.serialize().toString("hex");
  if (!serializedTx) {
    return;
  } else {
    web3.eth.sendSignedTransaction(`0x${serializedTx}`, (err, MuiTXHash) => {
      console.log("err : ", err, "Data1-MuiTXHash : ", MuiTXHash);
      // START DATA2
      web3.eth.getTransactionCount(TokenOwner, (err, count) => {
        if (err) return;

        const txData2 = {
          chainId: 0x03,
          gasPrice: web3.utils.toHex(42000000000),
          gasLimit: web3.utils.toHex(90000),
          to: contarctAddress,
          from: TokenOwner,
          value: 0x0,
          nonce: web3.utils.toHex(count + 1),
          data: data2
        };
        const tx2 = new ethTx(txData2);
        tx2.sign(fromPrivateKeyBuffer);
        const serializedTx2 = tx2.serialize().toString("hex");
        if (!serializedTx2) {
          return;
        } else {
          web3.eth.sendSignedTransaction(`0x${serializedTx2}`, (err, MuiTXHash2) => {
            console.log("err : ", err, "Data2-MuiTXHash : ", MuiTXHash2);
          });
        }
      });
      // END DATA2
    });
  }
});

};

我得到了两个 Transaction Hash 返回数据,TransactionFrom() 事务再次失败。 问题是什么? 我怎样才能使它成功?我必须将自定义 ERC20 代币从特定地址撤回给所有者。所以我必须使用 transferFrom() 交易。 请让我知道该怎么做。谢谢。

【问题讨论】:

    标签: solidity web3js web3


    【解决方案1】:

    我猜 Remix 上的编译有一些错误,所以我创建了新的 Solidity 文件,上面有相同的代码并部署了它。新的智能合约运行良好,没有出现错误。错误与我的代码无关。如果有人遇到这样的问题,那么创建一个新的合约地址,我不建议在 Remix 上使用“At Address”。这根本无法正常工作。

    【讨论】:

      【解决方案2】:

      我尝试过 appove() + transferFrom () ,在 Solidity 上的allowance() 运行良好,但在 web3 上却没有和你一样的错误

      【讨论】:

        【解决方案3】:

        我猜 transferFrom 函数应该由支出者调用(即 TokenOwner 已批准支出的地址)。所以,

        const txData2 = {
              chainId: 0x03,
              gasPrice: web3.utils.toHex(42000000000),
              gasLimit: web3.utils.toHex(90000),
              to: contarctAddress,
              from: address, // spender's address
              value: 0x0,
              nonce: web3.utils.toHex(count + 1),
              data: data2
            };
        

        别忘了在getTransactionCount中使用spender的privateKey签署txnspender的地址 在这里阅读:Ethereum Wiki 希望能帮助到你。 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-11
          • 2014-04-09
          • 2015-04-18
          • 2013-11-02
          • 1970-01-01
          • 1970-01-01
          • 2015-08-27
          • 1970-01-01
          相关资源
          最近更新 更多