0

プロキシ コントラクトがあり、基になる実装コントラクトを置き換えたいと考えています。

私はすでにスマート コントラクトの 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;
    }
}
4

0 に答える 0