Как при интеграции metamask брать количество токенов из инпута?

У меня есть следующий блок: введите сюда описание изображения

к нему подключен код из примера Metamask:

    const ethereumButton = document.querySelector('.enableEthereumButton');
const sendEthButton = document.querySelector('.sendEthButton');

let accounts = [];

//Sending Ethereum to an address
sendEthButton.addEventListener('click', () => {
  ethereum
    .request({
      method: 'eth_sendTransaction',
      params: [
        {
          from: accounts[0],
          to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970',
          value: '0x29a2241af62c0000',
          gasPrice: '0x09184e72a000',
          gas: '0x2710',
        },
      ],
    })
    .then((txHash) => console.log(txHash))
    .catch((error) => console.error);
});

ethereumButton.addEventListener('click', () => {
  getAccount();
});

async function getAccount() {
  accounts = await ethereum.request({ method: 'eth_requestAccounts' });
}

Мне надо что бы пользователь мог вводить в форму количество токенов и после нажатия кнопки покупки, в переводе уже было выбранное кол-во токенов

Вопрос: Как это сделать?


Ответы (1 шт):

Автор решения: Neakit

В документации все указано ссылка

sendEthButton.addEventListener('click', () => {
        const decimals = 18; // decimals для ETH
        const amount = 2; // кол-во эфира, которое нужно отправить
        const amountWithDecimals = amount * Math.pow(10, decimals) // кол-во токенов с учетом decimals
        const value = amountWithDecimals.toString(16); // превращаем в Hex
        window.ethereum
            .request({
                method: 'eth_sendTransaction',
                params: [
                    {
                        from: accounts[0],
                        to: '0x104017c4B28fBFd4A789d2B8b0E872562E3139f5',
                        value: value,
                        gasPrice: '0x09184e72a000',
                        gas: '0x2710',
                    },
                ],
            })
            .then((txHash) => console.log(txHash))
            .catch((error) => console.error);
    });

Важные замечания на будущее:

  1. Для мат расчетов (кол-ва монет, перерасчет в USD и т.д.) лучше использовать библиотеку BN.js, чтобы исключить ошибок типа 0.1 + 0.2 = 0.30000004 в js. Либо другую на выбор BigNumber например.
  2. Посмотрите в сторону библиотеки web3.js. В будущем будет проще масштабировать приложение.
  3. Формулу amount * Math.pow(10, decimals) можно использовать для любых токенов, помимо ETH. Правда, для этого вам нужен готовый смарт контракт
→ Ссылка