Hardhat klaytn 네트워크 사용 관련 문의드립니다

안녕하세요.

제가 하고자 하는것은
컨트랙트 관련 정보(contractAddress, contractCode, compile option 등)을 입력받아서
체인상에 배포되어있는 contract와 일치하는지 etherscan의 code verify 와 같은 기능을 만들고자 합니다.

harthat 을 이용하여 하려고하는데 체인 설정에 어려움이 있어 문의 드립니다.

hardhat.config.ts 는

import "@nomiclabs/hardhat-ethers";
import "@nomicfoundation/hardhat-toolbox";
import { HardhatUserConfig } from "hardhat/config";

/** @type import('hardhat/config').HardhatUserConfig */
const config: HardhatUserConfig = {
  solidity: "0.8.24",
  sourcify: {
    enabled: false,
  },
  networks: {
    cypress: {
      url: "https://public-node-api.klaytnapi.com/v1/cypress",
      chainId: 8217,
    },
  },
  etherscan: {},
};

export default config;

이렇게 했고,

코드매치 부분은

  public async run(contractInfo: ContractInfo) {
    let hre: HardhatRuntimeEnvironment = hardhat;

    // 사용할 컨트랙트 정보
    const contractAddress = CommonUtils.buffer2HexAddress(contractInfo.contractAddress); // 검증할 컨트랙트 주소
    const constructorArgs = [
      /* 생성자 인수 배열 */
    ]; // 생성자 인수 배열

    // 컨트랙트 소스 코드 읽기
    const contractSource = contractInfo.contractSource;

    // 컨트랙트 검증 실행
    await this.verifyContract(hre, contractAddress, contractSource, constructorArgs);
  }

  private async verifyContract(hre: HardhatRuntimeEnvironment, contractAddress: string, contractSourceCode: string, constructorArgs: any[]) {
    // 이것은 Hardhat의 Task Context를 설정합니다.
    const taskArgs = {
      network: "cypress",
      address: contractAddress,
      constructorArguments: constructorArgs,
      contract: contractSourceCode,
      libraries: {},
    };

    // TASK_VERIFY_CONTRACT를 실행합니다.
    try {
      const result = await hre.run("verify:verify", taskArgs);

      // 결과를 확인하고 적절한 작업을 수행합니다.
      if (result) {
        console.log("Verification successful!");
      } else {
        console.error("Verification failed.");
      }
    } catch (err) {
      console.error("ERROR", err);
    }
  }

이런식으로 되어있습니다.

npx를 사용할 것이 아니라서 .env 에 HARDHAT_NETWORK=cypress 이것도 추가했고요.

그런데 verifyContract 의 try/catch 구문에서 다음과 같은 에러가 발생하더라고요.

'Trying to verify a contract in a network with chain id 8217, but the plugin doesn't recognize it as a supported chain.

You can manually add support for it by following these instructions: https://hardhat.org/verify-custom-networks

To see the list of supported networks, run this command:

  npx hardhat verify --list-networks'

다음 페이지에서 다른분들이 하신 것 처럼 똑같이 한 것 같은데 어떤 부분이 문제인지 알 수 있을까요?

<자답>

import "@nomiclabs/hardhat-ethers";
import "@nomicfoundation/hardhat-toolbox";
import { HardhatUserConfig } from "hardhat/config";

/** @type import('hardhat/config').HardhatUserConfig */
const config: HardhatUserConfig = {
  solidity: "0.8.24",
  sourcify: {
    enabled: false,
  },
  networks: {
    klaytn: {
      url: "https://public-node-api.klaytnapi.com/v1/cypress",
      chainId: 8217,
    },
  },
  etherscan: {
    apiKey: "**************************",
    customChains: [
      {
        network: "klaytn",
        chainId: 8217,
        urls: {
          apiURL: "",
          browserURL: "https://klaytnscope.com",
        },
      },
    ],
  },
};

export default config;

이렇게 하면 네트워크 문제는 없어지긴합니다.

안녕하세요
@nomiclabs/hardhat-etherscan이 지원하는 네트워크에 klaytn이 존재하지 않기 때문에 발생합니다. 따라서 후첨해주신 것처럼 customChains 항목에 cypress를 추가해주셔야합니다.

답변 감사합니다. 실례지만 혹시 코드레벨에서 harthat 사용하는법도 아실까요?

hardhat.config.ts 수정해서 customChain으로 클레이튼 체인사용하게 하는것까지는 했는데

hre.run(“verify:verify”) 이거 사용할때 컨트랙트 코드가 없다고 에러가 발생하는데 어떻게 해야할지 모르겠어서요.

ContractNotFoundError: The contract contracts/MultiBalanceChecker.sol:MultiBalanceChecker is not present in your project.

taskArgs 에 컨트랙트 코드를 넣어서 verify 하려고하는데 잘 안되네요.

다른 문서들 찾아보면 대부분 npx로 compile 하고나서 바로 verify 하는 방법에 대한 설명만 있고 소스코드로 독단적으로 verify만 하는 것과 관련된 얘기는 없더라고요.

public async run(contractInfo: ContractInfo) {
    let hre: HardhatRuntimeEnvironment = hardhat;

    // 사용할 컨트랙트 정보
    const contractAddress = CommonUtils.buffer2HexAddress(contractInfo.contractAddress); // 검증할 컨트랙트 주소
    const constructorArgs = [
      /* 생성자 인수 배열 */
    ]; // 생성자 인수 배열

    // 컨트랙트 소스 코드 읽기
    const contractSource = contractInfo.contractSource;

    // 컨트랙트 검증 실행
    await this.verifyContract(hre, contractAddress, contractSource, constructorArgs);
  }

  private async verifyContract(hre: HardhatRuntimeEnvironment, contractAddress: string, contractSourceCode: string, constructorArgs: any[]) {
    // 이것은 Hardhat의 Task Context를 설정합니다.
    const taskArgs = {
      network: "cypress",
      address: contractAddress,
      constructorArguments: constructorArgs,
      contract: contractSourceCode,
      libraries: {},
    };

    // TASK_VERIFY_CONTRACT를 실행합니다.
    try {
      const result = await hre.run("verify:verify", taskArgs);

      // 결과를 확인하고 적절한 작업을 수행합니다.
      if (result) {
        console.log("Verification successful!");
      } else {
        console.error("Verification failed.");
      }
    } catch (err) {
      console.error("ERROR", err);
    }
  }

자문자답합니다.

Hardhat verify 자체에는 verify 하는 기능이 없고 외부 API (etherscan, sourcify 등) 과 상호작용하기만 합니다.

1개의 좋아요