Ошибка: Транзакция отменена: не удалось выполнить вызов функции

#solidity #nft #hardhat

#прочность #nft #каска

Вопрос:

В настоящее время я работаю на рынке nft и хочу интегрировать комиссию в размере 2,5% с каждой продажи. Я прочитал и повторно изучил онлайн о том, как вычислить процент прочности, и добился успеха в этой части, но проблема в том, что в результате получается огромное число, т. е. 2,5 * 150/100 должно возвращать 3,75, но вместо этого я получаю эту цифру: 37500000000000000000000000000000000000000000000000000000000000000000000

Мой тест

 const auctionPrice = ethers.utils.parseUnits("1", "ether");  const [_, userAddress] = await ethers.getSigners();  let fee = (2.5 * auctionPrice) / 100;  const commission = ethers.utils.parseUnits(fee.toString(), "ether");  let commissionValue = commission.toString();   console.log(commission.toString());  console.log(fee);   await market  .connect(userAddress)  .createMarketSale(nftContractAddress, 1, commissionValue, {  value: auctionPrice,  });  

Результат

 250000000000000000000000000000000   1 failing   1) NFTMarket  Should create and execute market sales:  Error: Transaction reverted: function call failed to execute  at NFTMarket.createMarketSale (contracts/NFTMarket.sol:165)  at processTicksAndRejections (node:internal/process/task_queues:96:5)  at runNextTicks (node:internal/process/task_queues:65:3)  at listOnTimeout (node:internal/timers:526:9)  at processTimers (node:internal/timers:500:7)  at HardhatNode._mineBlockWithPendingTxs (node_moduleshardhatsrcinternalhardhat-networkprovidernode.ts:1602:23)  at HardhatNode.mineBlock (node_moduleshardhatsrcinternalhardhat-networkprovidernode.ts:435:16)  at EthModule._sendTransactionAndReturnHash (node_moduleshardhatsrcinternalhardhat-networkprovidermoduleseth.ts:1494:18)  

Итак, мой вопрос: есть ли способ превратить это число (375000000000000000000000000000000000000) в десятичное или целое число? Я искал, но не смог найти в Интернете ничего, что говорило бы об этом

Ответ №1:

На самом деле с вашим расчетом нет никаких проблем. Проблема заключается в использовании функции ethers.utils.parseUnits() .

Давайте сначала сделаем краткий обзор:

Под капотом все транзакции в Ethereum оплачиваются wei , то есть наименьшим номиналом эфира. Итак, если вы отправляете 1 ETH на какой-либо контракт, вы на самом деле отправляете 1 000 000 000 000 000 000 wei, потому что 1 ETH = 10^18 wei.

Ваш код

В тестах, когда вы используете эту функцию ethers.utils.parseUnits("1", "ether") , вы говорите: «Я хочу отправить 1 ETH, поэтому, пожалуйста, преобразуйте этот 1 ETH в wei, чтобы облегчить мне жизнь». Затем эта функция просто добавляет 18 нулей к вашей строке «1».

Наконец, когда вы выполняете свой расчет (2.5 * auctionPrice) / 100 , результат уже находится в правильном формате. Так что вам не придется звонить perseUnits снова, потому что вы добавляете еще 18 нулей! =D

Комментарии:

1. Но почему это происходит из-за ошибки, когда я хочу перевести эту сумму владельцу контракта « подлежащая оплате(владелец).перевод(цена перечисления); «