プロキシ コントラクトがあり、基になる実装コントラクトを置き換えたいと考えています。
私はすでにスマート コントラクトの abi とバイトコード (アーティファクト フォルダーから取得) を持っているので、次のようにしました。
const NFTv2 = await ethers.getContractFactory(upgradedContract.abi, upgradedContract.bytecode);
contract = await upgrades.upgradeProxy(proxyContract.address, NFTv2);
正常に動作しますが、コントラクトを自分のフォルダーに存在させたくないので、コントラクトをcontracts
削除してnpx hardhat compile
再度実行しました。
このデプロイ スクリプトを再度実行しようとすると、hardhat は次のエラーをスローし続けます。
Error: The requested contract was not found. Make sure the source code is available for compilation
at getContractNameAndRunValidation (node_modules/@openzeppelin/upgrades-core/src/validate/query.ts:46:11)
at Object.getStorageLayout (node_modules/@openzeppelin/upgrades-core/src/validate/query.ts:54:41)
at Object.deployImpl (node_modules/@openzeppelin/hardhat-upgrades/src/utils/deploy-impl.ts:30:18)
at Proxy.upgradeProxy (node_modules/@openzeppelin/hardhat-upgrades/src/upgrade-proxy.ts:36:22)
いくつかの試行錯誤の後、キャッシュフォルダーに関連しているようです。キャッシュフォルダー内の関連するメタデータが消えると、このエラーが表示されます。それ以外の場合は表示されません。
誰かがこの問題について私を案内してもらえますか?また、コントラクトをcontracts
フォルダー内に残さずに、avi & バイトコードのみでコントラクトをデプロイするにはどうすればよいですか?
ありがとうございました!:)
アップグレードされた契約のコードは次のとおりです。
// SPDX-License-Identifier: Apache2.0
pragma solidity ^0.8.4;
import "@openzeppelin/contracts-upgradeable/token/ERC1155/presets/ERC1155PresetMinterPauserUpgradeable.sol";
contract Test is ERC1155PresetMinterPauserUpgradeable {
string private _uri;
event upgradeEvent(string);
function uri(uint256) public view virtual override returns (string memory) {
return string(abi.encodePacked(_uri, "/new"));
}
function seturi(string memory uri) public {
emit upgradeEvent("this is an upgraded contract");
_uri = uri;
}
}