Почему я получаю сообщение «Учетная запись отправителя не существует», когда отправляю токен ERC20 из новой учетной записи с токенами?

Я создаю свой кошелек так

      const wallet = ethers.Wallet.createRandom()

Я использую метамаску для отправки токенов RIF на публичный адрес. Я подтверждаю новый баланс счета, и он точен, транзакция ERC20 сработала.

Когда я пытаюсь отправить часть токена RIF из этого кошелька, например:

      const connectedWallet = await wallet.connect(provider)
const contract = new ethers.Contract(
      process.env.CONTRACT_ADDRESS,
      rifContractAbi,
      onlineWallet,
    )

await contract.transfer(to, tokens)

Я получаю следующую ошибку:

      error: Error: processing response error (body="{\"jsonrpc\":\"2.0\",\"id\":246,\"error\":{\"code\":-32010,\"message\":\"the sender account doesn't exist\"}}\n", error={"code":-32010}, requestBody="{\"method\":\"eth_sendRawTransaction\",\"params\":[\"0xf8a8808403e252e08290999419f64674d8a5b4e652319f5e239efd3bc969a1fe80b844a9059cbb00000000000000000000000010d158b42bfbf39641896ad8b8fd9cf7078d2f4e0000000000000000000000000000000000000000000000000de0b483f7abe82062a0175a2b6e35c1ff301ff45341bf5a63a3895a63404c78b6644cd2f8dee5b9a030a010fbbd608476a555bccd9f3ccf67ceac46183f1be4a82b14a46bbb78ba312fc9\"],\"id\":246,\"jsonrpc\":\"2.0\"}", requestMethod="POST", url="https://public-node.testnet.rsk.co", code=SERVER_ERROR, version=web/5.7.0) 

Как только я отправил несколько RBTC на этот счет, транзакция заработала.

1 ответ

Объяснение

Чтобы успешно передать токены ERC20, EOA, выполняющий транзакцию, должен будет выполнить 3 условия:

  1. Достаточный баланс токенов --> это то, что вы переводите
  2. Достаточный баланс RBTC --> для оплаты платы за газ
  3. Отправить действительную транзакцию --> переводы осуществляются только после добавления в блок, и этот блок добавляется в цепочку консенсуса

Воспроизведите проблему

      // assuming that values for `CONTRACT_ADDRESS` and `CONTRACT_ABI` are set

const wallet = ethers.Wallet.createRandom();
const fungibleToken = new ethers.Contract(
      CONTRACT_ADDRESS,
      CONTRACT_ABI,
      wallet,
    );

Если вы сделаете вышеописанное, а затем сразу же выполните следующее:


... вам еще предстоит выполнить условия (1) и (2) выше. Поэтому (3) также будет отклонено в результате.


Решение

Чтобы проверить, выполнили ли вы условие (1):

      const tokenCount = await fungibleToken.balanceOf(wallet.getAddress());
console.log('sufficient token balance:', tokenCount > transferAmount);

Если этого значения недостаточно, и вы находитесь в тестовой сети RSK, посетитеfaucet.rifos.orgчтобы получить некоторыеtRIFжетоны.

Чтобы проверить, выполнили ли вы условие (2):

      // assuming value of `ERC20_TRANSFER_GAS_ESTIMATE` is set

const rbtcBalance = await wallet.getBalance();
console.log('sufficient cryptocurrency balance:', rbtcBalance > ERC20_TRANSFER_GAS_ESTIMATE);

Установите значениеERC20_TRANSFER_GAS_ESTIMATEс помощью метода оценки газа или даже путем жесткого кодирования его значения до безопасного завышения (например,1e6)

Если этого значения недостаточно, и вы находитесь в тестовой сети RSK, посетитеfaucet.rsk.coчтобы получить некоторыеtRBTCкриптовалюта.

Удовлетворив вышеизложенное, вы впоследствии еще раз выполните следующее:

      // assuming that values for `toAddress` and `transferAmount` are set

await fungibleToken.transfer(toAddress, transferAmount);

... передача должна пройти успешно.

Другие вопросы по тегам