PBL Ⅲ/Ethereum and Solidity
Section6 : Ethereum Project Infrastructure
myejinni
2022. 9. 9. 19:56
144. project setup
145. Directory Structure
atom 열기
디렉토리 & 파일 구조는 위와 같음
146. A Better Compile Script - 147. Single Run Compilation
[compile.js]
const path = require('path');
const solc = require('solc');
const fs = require('fs-extra'); //improve version of fs module
const buildPath = path.resolve(__dirname,'build');
fs.removeSync(buildPath);
const campaignPath = path.resolve(__dirname, 'contracts', 'Campaign.sol');
const source = fs.readFileSync(campaignPath,'utf8');
const output=solc.compile(source,1).contracts;
fs.ensureDirSync(buildPath); //build 폴더 생성하는 코드
for(let contract in output){
fs.outputJsonSync(
path.resolve(buildPath, contract + '.json'),
output[contract]
);
}
$ node compile.js
-> * window users will get an Error: ENOENT: no such file or directory
148. More on Compile
path.resolve(buildPath, contract.replace(':','') + '.json'),
-> 라인 추가 후 $ node compile.js 실행
-> 에러 해결
-> 실행결과 = build folder 밑에 json 파일 두 개 생성됨
149. Test File Setup
[Campaign.test.js]
const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
const web3 = new Web3(ganache.provider());
const compiledFactory = require('../ethereum/build/CampaignFactory.json');
const compiledCampaign = require('../ethereum/build/Campaign.json');
let accounts;
let factory;
let campaignAddress;
let campaign;
beforeEach(async()=>{
accounts = await web3.eth.getAccounts();
factory = await new web3.eth.Contract(JSON.parse(compiledFactory.interface))
.deploy({ data: compiledFactory.bytecode })
.send({ from: accounts[0], gas:'1000000' });
});
150. Creating Campaign Instances - 151. Testing WarmUp
+ 추가
152. Accessing Mappings ~ 157. Refactoring Deployment
[Campaign.test.js]
*full code
const assert = require("assert");
const ganache = require("ganache-cli");
const Web3 = require("web3");
const web3 = new Web3(ganache.provider());
const compiledFactory = require("../ethereum/build/CampaignFactory.json");
const compiledCampaign = require("../ethereum/build/Campaign.json");
let accounts;
let factory;
let campaignAddress;
let campaign;
beforeEach(async () => {
accounts = await web3.eth.getAccounts();
factory = await new web3.eth.Contract(JSON.parse(compiledFactory.interface))
.deploy({ data: compiledFactory.bytecode })
.send({ from: accounts[0], gas: "1000000" });
await factory.methods.createCampaign("100").send({
from: accounts[0],
gas: "1000000",
});
[campaignAddress] = await factory.methods.getDeployedCampaigns().call();
campaign = await new web3.eth.Contract(
JSON.parse(compiledCampaign.interface),
campaignAddress
);
});
describe("Campaigns", () => {
it("deploys a factory and a campaign", () => {
assert.ok(factory.options.address);
assert.ok(campaign.options.address);
});
it("marks caller as the campaign manager", async () => {
const manager = await campaign.methods.manager().call();
assert.equal(accounts[0], manager);
});
it("allows people to contribute money and marks them as approvers", async () => {
await campaign.methods.contribute().send({
value: "200",
from: accounts[1],
});
const isContributor = await campaign.methods.approvers(accounts[1]).call();
assert(isContributor);
});
it("requires a minimum contribution", async () => {
try {
await campaign.methods.contribute().send({
value: "5",
from: accounts[1],
});
assert(false);
} catch (err) {
assert(err);
}
});
it("allows a manager to make a payment request", async () => {
await campaign.methods
.createRequest("Buy batteries", "100", accounts[1])
.send({
from: accounts[0],
gas: "1000000",
});
const request = await campaign.methods.requests(0).call();
assert.equal("Buy batteries", request.description);
});
it("processes requests", async () => {
await campaign.methods.contribute().send({
from: accounts[0],
value: web3.utils.toWei("10", "ether"),
});
await campaign.methods
.createRequest("A", web3.utils.toWei("5", "ether"), accounts[1])
.send({ from: accounts[0], gas: "1000000" });
await campaign.methods.approveRequest(0).send({
from: accounts[0],
gas: "1000000",
});
await campaign.methods.finalizeRequest(0).send({
from: accounts[0],
gas: "1000000",
});
let balance = await web3.eth.getBalance(accounts[1]);
balance = web3.utils.fromWei(balance, "ether");
balance = parseFloat(balance);
console.log(balance);
assert(balance > 104);
});
});