체인의정석

스마트컨트렉트 배포 프로그램 고도화 및 오류해결) Top-level 'await' expressions are only allowed when the 'module' option is set to 'esnext' or 'system', and the 'target' option is set to 'es2017' or higher 본문

개발/backend

스마트컨트렉트 배포 프로그램 고도화 및 오류해결) Top-level 'await' expressions are only allowed when the 'module' option is set to 'esnext' or 'system', and the 'target' option is set to 'es2017' or higher

체인의정석 2022. 4. 26. 14:42
728x90
반응형

https://www.youtube.com/channel/UCHsRy47P2KlE749oAAjb0Yg

 

체인의정석

약력 현) 블록체인 개발자 前 블록워터 테크놀로지, 스마트컨트렉트 개발자 前 위데이터랩(주) 기획,마케팅 팀장 , 블록체인팀 선임연구원 홍익대학교 경영학 전공, 컴공 부전공 서강대학교 정

www.youtube.com

 

해당 에러가 발생한 계기는 현재 ts 파일 하나당 하나의 트랜잭션으로 분리하여 운영중인데, 이를 상위 1개 폴더에서 inquirer 를 사용하여 한번에 배포를 관리할 수 있는 프로그램을 만들 때 발생하였다.

 

해당 에러의 경우 해결을 위해서는 ts config파일에서 지원하는 모듈 버전을 올려주거나 아니면 문법을 바꾸어야 했다.

https://github.com/pnp/pnpjs/issues/1278

 

Typescript error: Top-level 'await' expressions are only allowed when the 'module' option is set to 'esnext'... · Issue #1278

Hello, thanks for creating this, I´m trying to test the library on a project build with yeoman, react, and typescript, but I get the following TS error that blocks me Top-level 'await' expr...

github.com

설정값을 바꾸고 나니 에러가 많이 발생하였으며, 현재 사용중인 모듈이나 환경 또한 hardhat + waffle 이였기 때문에 케이스가 별로 없다. 따라서 다른 부분에 영향을 주지 않고서도 이를 동기화 시켜서 이전 동작이 완료되기 전까지는 다음 트랜잭션이 일어나지 않도록 하였다. 

import { deploy_a } from "./deploy_A";
import { deploy_b } from "./deploy_B";
const deployAll = async () => {
  const aAddress =  await deploy_a(process.env.EXAMPLE_CONTRACT_ADDRESS!)
  const bAddress =  await deploy_b(aAddress)
  console.log(bridgeAddress);
}

이런식으로 각각 파일에서 export를 정의해온 배포 / 세팅 스크립트를 불러올 수 있었다.

이제 여기에 inquirer를 만들면 파일 하나만 실행하면 콘솔에서 관리자가 선택적으로 데이터를 체크해가면서 안정적인 검토 후 자동화 배포가 가능하게 된다.

import { run, ethers } from "hardhat";

export async function deploy_A(aAddress:string) {
  await run("compile");

  if(process.env.GAS_FIXED == "fixed") {
    const a = await ethers.getContractFactory("ERC721Custody");
    const A = await a.deploy(bridgeAddress,{gaslimit: process.env.GAS_LIMIT, gasPrice: process.env.GAS_PRICE});
    await A.deployed();
    console.log(`export const A_CONTRACT_ADDRESS = "${A.address}";`);

    const setTx = await A.setTx(A.address,{gasLimit: 100000,  gasPrice: '10000000'});
    console.log(await setTx.wait());
    return erc721Custody.address;
  } else {
.
.
.
  }
}

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
const aAddress = process.env.A_ADDRESS!;
deploy_custody(aAddress)
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

해당 파일은 위와 같이 각각 만들면된다. 

 

이렇게하면 총 2가지 방안으로 배포/운영이 가능하다.

 

1. 파일 실행시 함수가 실행되어 각각 단계별 실행 가능

2. export로 정의해둔 함수를  상위 파일에서 불러와서 한번에 동기식으로 배포.

3. inquirer를 중간에 추가하여서 관리자가 직접 데이터를 체크해 가면서 상황에 맞게 배포

4. direnv를 통해 각 경로별로 서로 다른 변수를 관리

 

=> 이런식으로 관리하면 크로스체인 환경의 컨트렉트를 계속해서 배포 및 운영하기 용이하다.

나중엔 이런걸 관리해주는 툴이 나올수도 있겠지만, 아직은 없으므로 이러한 프로그램을 자체적으로 만드는 것은 여태까지 만들어본 배포 프로세스중에 가장 깔끔한 방법인거 같다.

728x90
반응형
Comments