https://www.youtube.com/watch?v=8WBvMEql6SQ&ab_channel=%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%94NomadCoders
Practice making smart contract with Nomad Coder.
펀딩 프로그램을 관장하는 스마트 컨트랙 만들기
-
프로젝트의 오너, 목표 금액, 프로젝트에 기부한 사람들의 목록, 그들의 구매금액, 기부금의 누적 총액, 데드라인
-
데드라인 도달 시 기부금 총액>=목표금액일 경우 돈은 프로젝트 오너에게 전달 -기부금 총액<목표금액일 경우 돈은 기부자들에게 환불
- Solidity types https://docs.soliditylang.org/en/v0.8.19/types.html#types
- Solidity iteration https://docs.soliditylang.org/en/v0.8.19/types.html#iterable-mappings
npm install -D hardhat npm install -D ethers npm install -D --legacy-peer-deps @nomiclabs/hardhat-ethers npm install -D --legacy-peer-deps @nomiclabs/hardhat-waffle
npx hardhat
- create an empty hardhat.config.js 선택
- hardhat.config.js 파일의 solidity 버전을 Fundraising.sol 상단 pragma solidity 버전에 맞추기
- hardhat.config.js 파일에 require("@nomiclabs/hardhat-waffle") 추가
컨트랙 배포 및 지갑에 기부된 돈 수령 위함
- MetaMask Extension 추가 https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn
- 새 지갑 생성 클릭 및 지갑 생성
- 설정 -> 고급 -> 테스트 네트워크 보기 기능 활성화
- All that Node Faucet으로 이동
https://www.allthatnode.com/faucet/ethereum.dsrv- 해당 사이트가 막혀서 아래 사이트에서 진행
https://goerlifaucet.com/
- 해당 사이트가 막혀서 아래 사이트에서 진행
- 메타마스크 주소 넣고 테스트이더 받기
-
Goerli RPC 복사해 hardhat.config.js에 추가
networks: {
goerli: {
url: "Goerli RPC 링크/API Key",
},
},
url에 Goerli RPC/API Key 형식으로 추가하면 된다.
현재는 MetaMask에서 지갑을 관리하고 있다. HardHat에서도 지갑을 관리할 수 있도록 해주자.
- MetaMask에서 계정 세부정보 - 비공개 키 내보내기 - 비밀번호 입력. 나온 Private Key 복사
- .env 파일 만들어 Private Key 저장 .env파일 만들기가 귀찮다면 아래와 같이 바로 붙여넣기 해도 작동은 한다. 보안상 추천하지 않는다.
이제 작성한 컨트랙 코드를 배포해보자.
- scripts폴더 만들고 안에 deploy.js 생성
- deploy.js에 아래 코드 작성
const { ethers } = require("hardhat");
async function main() {
const Fundraising = await ethers.getContractFactory("Fundraising"); //Fundraising 컨트랙을 가져와서 컴파일 한다.
const contract = await Fundraising.deploy(100); //100이라는 인자와 함께 배포한다. 해당 인자는 Fundraising 컨트랙에 전달된다. 이 프로젝트에서는 목표금액을 의미한다.
console.log("Contract address is: ", contract.address);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
1 Ether = 1,000,000,000,000,000,000 WEI
- 아래 코드 커맨드창에 입력
npx hardhat run scripts/deploy.js --network goerli
- 성공할 경우 콘솔 창에 contract address가 출력된다. 에러가 났을 경우 아래 ERRORS 참고
- 이제 메타마스크를 통해 Ether Scan에 들어가면 배포된 컨트랙을 확인할 수 있다.
보내기 누르고 컨트랙 주소 입력, 0.001ETH 전송
전송한 0.001ETH가 잘 들어와있는 것을 확인할 수 있다.
- hardhat.config.js에 아래 코드를 추가한다. abi값은 artifacts/contracts/Fundraising/Fundraising.json에서 찾을 수 있다.
task("check", "Check contract amounts", async () => {
const [developer] = await ethers.getSigners();
const contract = process.env.CONTRACT_ADDRESS;
const abi = [
'artifacts/contracts/Fundraising/Fundraising.json의 "abi":[]하고 나와있는 부분',
];
const fundraising = new ethers.Contract(contract, abi, developer);
console.log(
await fundraising.targetAmount(),
await fundraising.raisedAmount()
);
});
- 아래 명령어를 실행하자
npx hardhat check --network goerli
- targetAmount와 raisedAmount가 16진수로 출력되어서 10진수로 출력하기 위해 task를 조금 수정해주었다.
task("check", "Check contract amounts", async () => {
const [developer] = await ethers.getSigners();
const contract = process.env.CONTRACT_ADDRESS;
const abi = [
'artifacts/contracts/Fundraising/Fundraising.json의 "abi":[]하고 나와있는 부분',
];
const fundraising = new ethers.Contract(contract, abi, developer);
//여기서부터 수정된 코드
targetAmount = await fundraising.targetAmount();
raisedAmount = await fundraising.raisedAmount();
console.log(parseInt(targetAmount), parseInt(raisedAmount));
});
값이 16진수로 출력되고 있는 모습.
코드 수정 후 10진수로 출력되는 모습.
-
Error: insufficient funds for intrinsic transaction cost
컨트랙을 배포하기에 테스트 이더가 부족해서 발생하는 에러. 아래 사이트에서 테스트이더를 모을 수 있다.
https://goerli-faucet.pk910.de/ -
Error: overflow [ See: https://links.ethers.org/v5-errors-NUMERIC_FAULT-overflow ]
영상을 보고 100000000000000000000라는 숫자와 함께 배포했더니 아래 에러가 발생했다. 100으로 고쳐주었다. -
ProviderError: Too Many Requests error received from ethereum-goerli-rpc.allthatnode.com
All that Node 에서 현재 too many request라며 테스트 이더도 받을 수 없는 상태인데 말 그대로 너무 많은 요청이 와서 그런 것 같다. 잠시 뒤 실행하면 성공한다. 유저 문제가 아니다. -
TypeError: Cannot read properties of undefined (reading 'JsonRpcProvider')
이더리움 버전을 5.4이하로 낮추면 해결되는 오류이다. package.json에서 이더리움 버전을 5.4로 입력하고 npm install을 한 뒤 다시 시도해보자.
https://ethereum.stackexchange.com/questions/144451/typeerror-cannot-read-properties-of-undefined-reading-jsonrpcprovider