Web3 | TransferFrom()事务总是失败

时间:2018-03-22 06:29:43

标签: solidity web3js web3

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

但是所有交易都失败了。在Remix IDE上出现同样的问题。 stackOverflow上的一些答案表示在approve()函数之前需要先调用transferFrom()。所以,我试过Remix frist但是我遇到了同样的问题。然后尝试使用如下的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返回数据,并且TransferFrom()事务再次失败。 问题是什么? 我怎样才能成功?我必须将自定义ERC20令牌从特定地址撤回到所有者。所以我必须使用transferFrom()事务。 请让我知道怎么做。感谢。

3 个答案:

答案 0 :(得分:0)

我想Remix上的编译有一些错误所以我创建了新的可靠性文件,并在其上部署了相同的代码。新的智能合约运作良好,没有发生任何错误。错误与我的代码无关。如果某人有这样的问题,那么创建一个新的合同地址,我不建议在Remix上使用“At Address”。这根本不适用。

答案 1 :(得分:0)

在Solidity上,我尝试了appove()+ transferFrom()和allowance()正常工作,但在web3上却无法正常工作

答案 2 :(得分:0)

我猜想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 签名txn spender的地址 在这里阅读:Ethereum Wiki 希望能帮助到你。 :)