0

问题

为了在 EVM 上成功交易,我需要进行哪些更改?我在下面的代码中哪里出错了。

我做了什么

我正在尝试使用 Web3 将代币从我的钱包地址发送到另一个钱包地址。以下是我尝试执行此操作的方法,但我的交易从未成功。

初始化我的令牌 web3 和 ABI 代码

//TestAccount01
const TA1 = {
   address: '0x57ece112876fb585c6a2b37114c91be752b7578c',
   privateKey:
      'privatekey',
};

const Web3 = require('web3');
const web3 = new Web3(
   'https://rinkeby.infura.io/v3/api_endpint_url_id'
);

let minABI = [
   // transfer
   {
      constant: false,
      inputs: [
         {
            name: '_to',
            type: 'address',
         },
         {
            name: '_value',
            type: 'uint256',
         },
      ],
      name: 'transfer',
      outputs: [
         {
            name: '',
            type: 'bool',
         },
      ],
      type: 'function',
   },
];

将令牌 TXN 发送到地址的函数

async function sendToken() {
   let contract = new web3.eth.Contract(
      minABI,
      //contract address
      '0xD92E713d051C37EbB2561803a3b5FBAbc4962431'
   );

   let tx = await contract.methods.transfer(TA1.address, 1000);

   let data = tx.encodeABI();
   let gas = 61963;
   let gasPrice = 1649999980;

   console.log('creating transaction');
   let transaction = await web3.eth.accounts.signTransaction(
      {
         data,
         gas,
         gasPrice,
      },
      'my private key'
   );

   console.log('sending transaction');
   let recipt = await web3.eth
      .sendSignedTransaction(transaction.rawTransaction)
      .catch(err => {
         console.log('error in sending tx');
         console.error(err);
      });

   console.log(recipt);
}

await sendToken();

这给了我错误Error: Transaction has been reverted by the EVM: 和一个女巫的交易哈希,你可以在https://rinkeby.etherscan.io/tx/0x7f0ca267163219d2c8c783e9fdc8ec3a4c1d1c0c1c52d6a405c3763cac240d9c0x7f0ca267163219d2c8c783e9fdc8ec3a4c1d1c0c1c52d6a405c3763cac240d9c看到自己

我尝试更改许多变量(尤其是 gas 和 Ga),试图让代币从我的地址发送到,TA1.address但交易不断被 EVM 还原

另一件事。我注意到,无论我设置的 gas 限制有多高,Etherscan 都表示它已经使用了 100%。我已经为非常高的数字设置了气体限制,但使用率始终是 100%。

任何帮助将不胜感激。谢谢。

4

1 回答 1

0

我设法通过以下解决方案将 TUSDT 令牌从一个地址发送到另一个地址

这个错误很小,但仍然可能像我一样绊倒你。

创建合约时,我将对象中的发件人地址指定为第三个属性

let contract = new web3.eth.Contract(
      minABI,
      '0xD92E713d051C37EbB2561803a3b5FBAbc4962431',
      {
         from: '0x28BD22dA90A884e1F7fD6bad50564Bc1646707d2',
      }
   );

在创建交易对象时,我增加了发送的 wei 数量。像这样。

let tx = await contract.methods.transfer(TA1.address, 1000000);

我做了很多气体。(不是最佳数量)

let gasPrice = 1649999980;
   let gas = 61963;

然后我像这样创建了交易

let transaction = await web3.eth.accounts.signTransaction(
      {
         to: '0xD92E713d051C37EbB2561803a3b5FBAbc4962431',
         data, // dat is just tx.encodeABI()
         gas,
         gasPrice,
      },
      'My private key here'
   );

这个答案只是突出了我从最初的问题中所做的更改。我相信通过在创建交易时指定发件人地址并在签名时指定收件人地址,我解决了问题。我不确定为什么会这样,因为根据文档,我的问题中的代码似乎是有效的 web3js 代码。似乎在 web3js 中有许多明显的方法可以做同样的事情,但其中只有少数可能是正确的。无论如何,如果你们确切地知道我做错了什么并且想提供比我提供的更好的答案,我会全神贯注。

于 2022-02-04T01:08:06.283 回答