BLOCKCHAIN/Ethereum

[Ethereum] Ethereum Project Infrastructure

yuujoeng 2022. 9. 9. 20:02

1 Single Run Compilation

 

2 Test File Setup

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();

  /* 팩토리 계약 인스턴스 배포, JSON으로 파싱 */
  factory = await new web3.eth.Contract(JSON.parse(compiledFactory.interface))
    .deploy({ data: compiledFactory.bytecode })
    .send({ from: accounts[0], gas: '1000000' });

  /* 데이터를 수정하기 위한 트랜잭션 보내기 - Factory 없이는 결과를 return 받지 못함 */
  await factory.methods.createCampaign('100').send({
    /* accounts가 0인 계정은 관리자 계정*/
    from: accounts[0],
    gas: '1000000',
  });

  /* 실제 인스턴스 생성, 위까진 캠페인이 로컬 블록체인에 존재 */
  [campaignAddress] = await factory.methods.getDeployedCampaigns().call();
  campaign = await new web3.eth.Contract(
    JSON.parse(compiledCampaign.interface),
    campaignAddress
  );
});

/* json 파일의 test */
describe("Campaigns", () => {
  it("deploys a factory and a campaign", () => {
    assert.ok(factory.options.address);
    assert.ok(campaign.options.address);
  });

/* 매핑에 접근, 캠패인에서 manager 메서드를 호출하면 주소 비교 */
  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);
  });

  /* Minimum에 대한 확인 */
  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"),
    });

    /* 10ehter를 수령했을 때 request를 생성 */
    await campaign.methods
    /* 송금에 적절한 금액을 설정 - 5ether */
      .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",
    });

    /* web3에서 모든 계정을 검색 + 현재 잔액 */
    let balance = await web3.eth.getBalance(accounts[1]);
    balance = web3.utils.fromWei(balance, "ether");
    /* balnce 값을 Float로 변환 */
    balance = parseFloat(balance);
    console.log(balance);
    assert(balance > 104);
  });
});