Контракт не был развернут в обнаруженной сети (несоответствие сети/артефакта)

#blockchain #solidity #truffle #metamask

Вопрос:

У меня возникли некоторые проблемы с определением и подключением к правильной сети MetaMask.

В Ganache мой сервер RPC-127.0.0.1.7545, а идентификатор сети-5777. Однако, когда я пытаюсь создать пользовательский RPC в MetaMask с этой информацией, я получаю следующую ошибку:

 The endpoint returned a different chain ID: 1337
 

Это мое truffle-config.js:

 module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*" // Match any network id
    },
    develop: {
      port: 8545
    }
  }
};
 

Я надеюсь, что это будет соответствовать любому сетевому идентификатору, как я указал, но консоль показывает следующую ошибку:

 Contract has not been deployed to detected network (network/artifact mismatch)
 

Я уже пытался truffle migrate --reset , но безуспешно. Я также попытался создать явную сеть для testrpc в truffle-config.js — это тоже не сработало.

Любая помощь будет очень признательна!

Ответ №1:

Вы видите эту ошибку, потому что ваш контракт развернут в Ganache, но вы подключены к другой сети.

Код, который вы пишете для загрузки контракта, должен находиться внутри try/catch блока.

внутренняя логика загрузки контракта:

 export const loadContract = async (name, provider) => {
  // Load the contract

  // set the provider

  let deployedContract = null;
  try {
    // Get the contract
    deployedContract = await _contract.deployed();
  } catch {
    console.error("You are connected to the wrong network");
  }

  return deployedContract;
};
 

В компоненте , который вы используете loadContract , вызовите его внутри useEffect .

 useEffect(() => {
      // Detect Provider

      if (provider) {
        // contract should be loaded when provider exists
        const contract = await loadContract("ContractName", provider);
       rLoaded: true,
       // Add More logic
      } else {
        console.error("Please, install Metamask.");
      }
    };
  }, []);
 

Теперь вам нужно убедиться, что если вы не подключены к Ganache, отключите кнопку, чтобы ваше приложение не вышло из строя. для этого создайте переменную состояния

  // You probably already have logic to get account and contract
  const canConnectToContract = account amp;amp; contract;
 

теперь напишите правильный пользовательский интерфейс:

 {!canConnectToContract amp;amp; (
    <h2>Connect to Ganache</h2>
  )}

  <button
    disabled={!canConnectToContract}
 
  >
    Donate 1 Ethreum
  </button>