@Did_Inside

Как взаимодействовать со смартконтрактом?

У меня есть простой лендинг который используется для взаимодействия со смартконтрактом..
Я подключил ММ к сайту, и через кнопку могу логиниться
Но есть проблема з созданием контракта..
Задача такая что бы с помощью инпута вводить нужное значение, и по клику по кнопке випадало окно ММ с подверждением транзакции..
Я написал код, но не работает.. Логи мне не ничего не говорят к сожалению.. Подключение делаю первый раз.. Туторы все пересмотрел.. Но найти ошибки в коде не могу.. Либо я вообще делаю не то.. Кому не сложно подскажите как правильно сделать...Ибо жопка уже хрустит.. Заранее Буду рот ваш целовать
<button class="main_btn btn" id="connectWallet">
 <button class="btn" id="buyTkn">Buy Tokens</button>

const { ethers } = require("ethers");

let provider = null;
let web3 = null;
let signer = null;

const contractAddress = "Adress";
const contractABI = 'ABI'
async function connectWallet() {
  if (window.ethereum) {
    provider = window.ethereum;
    try {
      await window.ethereum.request({ method: "eth_requestAccounts" });
    } catch (e) {
      console.error(e);
      if (e.code === 4001) return;
    }
  } else if (window.web3) {
    provider.web3.currentProvider;
  }
  if (provider) {
    web3 = new ethers.providers.Web3Provider(provider, "any");
  }
}
document
  .getElementById("connectWallet")
  .addEventListener("click", connectWallet);

async function mint() {
  const tokenAmount = document.getElementById("tokenAmount").value;
  const paymentOption = document.getElementById("paymentOption").value;
  provider = new ethers.providers.JsonRpcProvider(
    "https://bsc-dataseed1.binance.org:443"
  );
  const signer = provider.getSigner();
  const contract = new ethers.Contract(contractAddress, contractABI, signer);
  console.log(contract);
  if (paymentOption === "BNB") {
    // Approve BNB spending by contract
    await ethers.sendTransaction({
      to: contractAddress,
      from: signer,
      value: ethers.utils.toWei(tokenAmount, "ether"),
    });
  } else if (paymentOption === "BUSDT") {
    // Assume BUSDT token has the approve() function for spending
    const busdtTokenAddress = "0x55d398326f99059ff775485246999027b3197955"; // Replace with actual BUSDT token address
    const busdtContract = new ethers.Contract(
      contractABI,
      busdtTokenAddress,
      signer
    );
    const busdtDecimals = await busdtContract.methods.decimals().call();
    const busdtAmount = tokenAmount * Math.pow(10, busdtDecimals);
    await busdtContract.methods.approve(contractAddress, busdtAmount).send({
      from: address,
    });
    console.log(busdtContract);
  }
  await contract.methods.transfer(tokenAmount).send({
    from: address,
  });

  alert("Tokens purchased successfully!");
}
document.getElementById("buyTkn").addEventListener("click", mint);
  • Вопрос задан
  • 41 просмотр
Пригласить эксперта
Ответы на вопрос 1
meusov11
@meusov11
Вижу "window.ethereum" и "window.web3" для получения провайдера, но не установлено значение переменной signer, почему? Или в этом есть логика

При вызове функции mint() - отсутствует переменная address
При вызове функции ethers.sendTransaction() для отправки BNB, у вас неправильно указан параметр from. Вместо from: signer используйте from: await signer.getAddress()
При вызове функции busdtContract.methods.approve() для отправки BUSDT, вы использовали address вместо await signer.getAddress() в параметре from
Отсутствует определение переменной address, которая является адресом отправителя
Вы подключены к провайдер Metamask?

Ошибок много. Рекомендую оф. документацию ethers.js читать, там все с объяснениями, если используете провайдер (Metamask) то доку по нему читать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы