Работа над демонстрацией 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, которую я не использовал. Ой.
Спасибо всем за то, что прочитали эту ветку моей ошибки в простой проблеме.