체인의정석

hardhat 사용법 정리 02- ERC721 배포해보기 본문

블록체인/NFT & BRIDGE

hardhat 사용법 정리 02- ERC721 배포해보기

체인의정석 2022. 1. 18. 14:24
728x90
반응형

이어서 하드햇과 오픈제플린 라이브러리를 연결하는 부분부터 진행을 하도록 한다.

 

https://docs.openzeppelin.com/upgrades-plugins/1.x/hardhat-upgrades

 

Using with Hardhat - OpenZeppelin Docs

You can also use the plugin’s functions from your Hardhat tests, in case you want to add tests for upgrading your contracts (which you should!). The API is the same as in scripts. Proxies const { expect } = require("chai"); describe("Box", function() { i

docs.openzeppelin.com

Error HH411: The library @openzeppelin-solidity/contracts, imported from contracts/exampleERC721.sol, is not installed. Try installing it using npm.

위를 참고하여 시키는 대로 npm install을 해주고 config파일에도 조건을 추가해주엇다. 그러나 위와 같은 에러가 발생한다.

 

https://ethereum.stackexchange.com/questions/103785/error-hh411-the-library-openzeppelin-solidity-is-not-installed-try-installing

 

Error HH411: The library openzeppelin-solidity is not installed. Try installing it using npm (for old 0.5.0 solidity code)

I have solidity project with files like pragma solidity ^0.5.0; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; When I try to compile, I get error on not installed libra...

ethereum.stackexchange.com

구글 검색을 통해 에러를 확인해보았더니 오픈제플린을 임포트해오는 구문의 문제라고 한다.

다시한번 2.2.0 버전으로 설치를 하고 

npm i openzeppelin-solidity@2.2.0

노드모듈에서 @openzeppelin을 들어가서 버전과 경로를 확인 한 후 

import "@openzeppelin/contracts/token/ERC721/ERC721Full.sol";
import "@openzeppelin/contracts/ownership/Ownable.sol";
import "hardhat/console.sol";

이렇게 경로명을 수정하였다.

 

경로가 openzeppelin-solidity로 되어 있었는데 다른 소스코드를 참고하다보니 이부분이 수정이 안되어서 에러가 난것 같다.

 

npx hardhatcompile

 

Compiling 17 files with 0.5.0
Compilation finished successfully

 

이러한 메세지가 뜨면서 컴파일 성공, 이제 작성된 스크립트대로 배포를 테스트 할 차례이다.

 

cmd 창을 하나 더 띄우고 

(base)  % npx hardhat node
Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/

Accounts
========

WARNING: These accounts, and their private keys, are publicly known.
Any funds sent to them on Mainnet or any other live network WILL BE LOST.

Account #0: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 (10000 ETH)
Private Key: 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80

Account #1: 0x70997970c51812dc3a010c7d01b50e0d17dc79c8 (10000 ETH)
Private Key: 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d

이렇게 내부적으로 지원하는 프라이빗 네트워크 먼저 구동시킨다. 

 

(base) lambda256@ethan nftBridge % npx hardhat run --network localhost scripts/sample-script.js
Greeter deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3
Error: too many arguments:  in Contract constructor (count=3, expectedCount=1, code=UNEXPECTED_ARGUMENT, version=contracts/5.5.0)

 

파일 이름은 sample-script에서 나중에 deploy이름으로 바꿀 예정이고 일단 생성자의 인자값 부터 알려주어야 하는 상황이다.

 

(base) @ nftBridge % npx hardhat run --network localhost scripts/sample-script.js
Greeter deployed to: 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0
exampleERC721 deployed to: 0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9

일단 인자값을 맞추주니 다음과 같이 배포에 성공하였다.

 

이제 성공한 배포코드를 따로 파서 deploy.js를 만들어 보도록 하겠다.

 

// We require the Hardhat Runtime Environment explicitly here. This is optional
// but useful for running the script in a standalone fashion through `node <script>`.
//
// When running the script with `npx hardhat run <script>` you'll find the Hardhat
// Runtime Environment's members available in the global scope.
const hre = require("hardhat");

async function main() {
  // Hardhat always runs the compile task when running scripts with its command
  // line interface.
  //
  // If this script is run directly using `node` you may want to call compile
  // manually to make sure everything is compiled
  // await hre.run('compile');

  // We get the contract to deploy
  const ExampleERC721 = await hre.ethers.getContractFactory("exampleERC721");
  const exampleERC721URI = "http://babyapeclub.io/SecretFolderWithMetadata/1.json"
  const exampleERC721 = await ExampleERC721.deploy("ExampleNFT","ENFT",exampleERC721URI);

  await exampleERC721.deployed();

  console.log("exampleERC721 deployed to:", exampleERC721.address);
}

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

기본적으로 제공되는 템플릿에 그냥 오픈씨에 있는 아무 메타데이터나 집어와서 만들어 보았다.

이 부분을 빼서 deploy 스크립트를 넣으니 배포가 잘 됨이 확인이 되었다.

(base)   % npx hardhat run --network localhost scripts/deploy_exampleERC721.js
exampleERC721 deployed to: 0x5FC8d32690cc91D4c39d9d3abcBD16989F875707

배포를 하고 나니 artifacts에 ABI도 따로 관리가 됨을 볼 수 있었다.

이렇게 json에 ABI 정보가 담겨있다.

 

그리고 이전에 띄워놓았던 창을 보면 컨트렉트가 배포됨을 확인할 수 있다.

728x90
반응형
Comments