Работа над демонстрацией Brownie FundMe Chainlink и скриптом, взаимодействующим с контрактом, работает на Rinkeby, но не на Ganache

Это сводит меня с ума. Я прохожу этот удобный курс денди Solidity

https://www.youtube.com/watch?v=M576WGiDBdQ

Я нахожусь в отметке времени 5:45:11, где я пишу сценарий для взаимодействия с контрактом FundMe, и он отлично работает на Ринкеби, чтобы вызвать функцию getEntranceFee() или любую функцию, которую я хочу вызвать, но она не работает на ганаше-локальном. Я получаю такую ​​ошибку:

      File "brownie/_cli/run.py", line 49, in main
    return_value, frame = run(
  File "brownie/project/scripts.py", line 103, in run
    return_value = f_locals[method_name](*args, **kwargs)
  File "./scripts/fund_and_withdraw.py", line 17, in main
    fund()
  File "./scripts/fund_and_withdraw.py", line 9, in fund
    entrance_fee = fund_me.getEntranceFee()
  File "brownie/network/multicall.py", line 115, in _proxy_call
    result = ContractCall.__call__(*args, **kwargs)  # type: ignore
  File "brownie/network/contract.py", line 1729, in __call__
    return self.call(*args, block_identifier=block_identifier)
  File "brownie/network/contract.py", line 1533, in call
    raise VirtualMachineError(e) from None
VirtualMachineError: revert 

Я заметил, что в течение некоторого времени у меня были проблемы со скриптами, которые нормально развертывают и запускают контракты в тестовых сетях. Но когда я запускаю сценарий, который развертывает и взаимодействует с контрактами в моей локальной цепочке ганаша, он компилируется и развертывается корректно, но никакое взаимодействие с ним не работает. Как мне отладить эту проблему? Я здесь в полной растерянности. Я что-то не так сделал при настройке цепочки ганаша? Я думал, что это подключи и работай.

1 ответ

Я понял ответ на эту ошибку. Оказывается, я развертывал с использованием определенного адреса MockV3Aggregator, а затем у меня был другой скрипт для взаимодействия с контрактом, но я использовал другой адрес MockV3Aggregator, что давало мне эту ошибку. В частности, в моей функции deploy.py

          account = get_account()
    # pass the price feed address to our fundme contract's constructor
    # if we are on Rinkeby Network, use said address
    if network.show_active() not in LOCAL_BLOCKCHAIN_ENVIRONMENTS:
        price_feed_address = config["networks"][network.show_active()][
            "eth_usd_price_feed"
        ]
    else:
        deploy_mocks()
        price_feed_address = MockV3Aggregator[-1].address  # gets the latest address

    fund_me = FundMe.deploy(
        "0x8A753747A1Fa494EC906cE90E9f37563A8AF630e", # this should be price_feed_address
        {"from": account},
        publish_source=config["networks"][network.show_active()].get("verify"),
    )
    print(f"Contract deployed to {fund_me.address}")

Этим адресом должна была быть переменная price_feed_address, которую я не использовал. Ой.

Спасибо всем за то, что прочитали эту ветку моей ошибки в простой проблеме.

Другие вопросы по тегам