#javascript #ethereum #metamask
Вопрос:
Я просто пытаюсь получить доступ toWei
к функции utils на интерфейсном веб-сайте на JavaScript.
Поскольку мы удалили наш window.web3, MetaMask больше не перезагружает страницу автоматически при изменении цепочки / сети.
(Источник: https://docs.metamask.io/guide/provider-migration.html#summary-of-breaking-changes )
Итак, я использую window.ethereum
то, что до сих пор было в порядке. Но я не могу найти, даже при значительном поиске в Google, прямой пример использования window.ethereum
для доступа .toWei(..)
к функции.
Например, я бы хотел что-то вроде:
var weiVal = window.ethereum.toWei(String(eth_float), 'ether');
Но этот конкретный вызов функции не существует. Как я могу это сделать?
Ответ №1:
toWei()
Функция была частью удаленного web3
модуля и больше не является частью расширения браузера MetaMask.
В настоящее время 0 результатов в коде: https://github.com/MetaMask/metamask-extension/search ?q = toWei
Однако вы можете импортировать пакет web3 JS в свой интерфейс и использовать функцию отсюда.
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
<script>
const web3 = new Web3();
const weiAmount = web3.utils.toWei("1", "ether");
console.log(weiAmount);
</script>
Источник уменьшенного пакета: официальный web3.js репо — https://github.com/ChainSafe/web3.js
Комментарии:
1. Спасибо за информативный ответ! Приветствия
Ответ №2:
Преобразование из ethereum в wei — это просто умножение на 10 ^ -18 (и наоборот на 10 ^ 18). Вот демонстрация:
function e2w() {
val = document.getElementById("numberInput").value;
console.log("Wei: " val * 10 ** 18);
}
function w2e() {
val = document.getElementById("numberInput").value;
console.log("Ethereum: " val * 10 ** -18);
}
<form>
<label for="numberInput">Enter value</label><br>
<input type="number" step="any" id="numberInput"><br>
<button onclick="e2w()">Eth --> Wei</button>
<button onclick="w2e()">Wei --> Eth</button>
</form>
Более общее решение для преобразования единиц измерения среди всех единиц Ethereum здесь:
BigNumber.config({
DECIMAL_PLACES: 50
});
const units = {
"wei": 1,
"kwei": 10 ** 3,
"mwei": 10 ** 6,
"gwei": 10 ** 9,
"microether": 10 ** 12,
"milliether": 10 ** 15,
"ether": 10 ** 18,
}
function unitConverter() {
fromUnit = document.getElementById("from").value;
toUnit = document.getElementById("to").value;
inputNumber = document.getElementById("inputNumber").value;
result = new BigNumber(inputNumber).times(units[fromUnit]).div(units[toUnit]).toString(10);
document.getElementById("outputNumber").innerHTML = resu<
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/9.0.1/bignumber.min.js"></script>
<label for="from">from:</label>
<select id="from" name="fromUnits" onchange="unitConverter()">
<option value="wei">Wei</option>
<option value="kwei">Kwei (babbage)</option>
<option value="mwei">Mwei (lovelace)</option>
<option value="gwei">Gwei (shannon)</option>
<option value="microether">microether (szabo)</option>
<option value="milliether">milliether (finney)</option>
<option value="ether">Ether</option>
</select>
<p>
<label for="to">to:</label>
<select id="to" name="toUnits" onchange="unitConverter()">
<option value="wei">Wei</option>
<option value="kwei">Kwei (babbage)</option>
<option value="mwei">Mwei (lovelace)</option>
<option value="gwei">Gwei (shannon)</option>
<option value="microether">microether (szabo)</option>
<option value="milliether">milliether (finney)</option>
<option value="ether">Ether</option>
</select>
<p>
<label>Input</label>
<input id="inputNumber" type="number" placeholder="Input:" value=1 oninput="unitConverter()" onchange="unitConverter()">
<p>
<p>Output: <span id="outputNumber">1</span></p>