#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. Но почему это происходит из-за ошибки, когда я хочу перевести эту сумму владельцу контракта « подлежащая оплате(владелец).перевод(цена перечисления); «