이더리움 ICO - 발행 크라우드세일

원래 출판된 here 👈

이전 post ERC20 토큰에 관한 것이었습니다. 이제 이 토큰에 대한 Crowdsale을 준비하겠습니다. 여기에서 이 Crowdsale을 간단하게 유지하겠습니다.

크라우드세일



기본 crowdsale 생성은 토큰 생성과 동일한 단계를 따릅니다. 여기서 상속은 Solidity에서 새로운 것을 빠르게 만들 때 축복입니다(1주 Solidity 개발자 의견 알림 😜).

pragma solidity 0.5.5;

contract BonkTokenCrowdsale is Crowdsale {
   constructor(
        uint256 _rate, 
        address payable _wallet, 
        IERC20 _token,
    )
    Crowdsale(_rate, _wallet, _token)
    public 
    {
    }

}



테스트에는 더 많은 마법이 있습니다. 새 파일 내에서 자금을 모으기 위해 적절한 토큰, eth에 대한 비율 및 지갑 주소를 사용하여 Crowdsale 생성을 테스트해 보겠습니다.

contract('BonkTokenCrowdsale', function ([_, wallet, investor_1, investor_2]) {

    beforeEach(async function () {

        this.name = 'BonkToken';
        this.symbol = 'BNK';
        this.decimals = new BN(2);

        this.token = await BonkToken.new(
            this.name,
            this.symbol,
            this.decimals
        );


        this.rate = new BN(10);
        this.wallet = wallet;

        this.crowdsale = await BonkTokenCrowdsale.new(
            this.rate,
            this.wallet,
            this.token.address,
        );

    });

    describe('crowdsale', function () {

        it('tracks the rate', async function () {
            expect(await this.crowdsale.rate()).
                to.be.bignumber.equal(this.rate);
        });

        it('tracks the wallet', async function () {
            expect(await this.crowdsale.wallet()).
                to.equal(this.wallet);
        });

        it('tracks the token', async function () {
            expect(await this.crowdsale.token()).
                to.equal(this.token.address);
        });
    });

    describe('accepting payments', function () {
        it('should accept payments', async function () {
            await this.crowdsale.sendTransaction({ value: ether("1"), from: investor_1 }).should.be.fulfilled; 
            await this.crowdsale.buyTokens(investor_1, { value: ether("1"), from: investor_2 }).should.be.fulfilled;
        });
    });



여기서 무슨 일이 일어나고 있습니까?
  • 새로운 BonkToken을 생성하고 그것으로 Crowdsale을 생성합니다. 속도는 10으로 설정되어 있지만 무엇을 의미합니까?

  • How many token units a buyer gets per wei. The rate is the conversion between wei and the smallest and indivisible token unit. So, if you are using a rate of 1 with a ERC20Detailed token with 3 decimals called TOK, 1 wei will give you 1 unit, or 0.001 TOK.



    따라서 우리는 테스트에서 16자리 토큰을 사용하고 있으며 속도를 원합니다.

    1000 BNK <-> 1 ETH <-> 1000000000000000000 WEI.

    비율 1은 0.0000000000000001 BNK를 제공합니다. 우리는 1 BNK <-> 0.0001 ETH <-> 1 000 000 000 000 000 WEI를 원하기 때문에 1 WEI(0.0000000000000010 BNK <-> 1 WEI)에 대해 BNK의 가장 작은 단위 10개가 필요하므로 비율은 10이어야 합니다.

    그래서:

    0.0000000000000010 BNK <-> 1 WEI 및 1 ETH <-> 1000000000000000000 WEI. 계산기 사용 🤔.

    0.000000000000001 * 10000~~00000000000000~~ = 1000


  • 다음 세 가지 검사는 적절한 매개변수를 생성자에 전달하는 것에 관한 것입니다. 자세한 내용은 다루지 않겠습니다.
  • 마지막은 거래 가능성에 관한 것입니다. 모든 약속이 이행되었는지 확인하십시오.

  • 발행된 크라우드세일



    이전에 말했듯이: 다음 기능, 다음 상속. MintedCrowdsale을 BonkTokenCrowdsale에 추가해 봅시다.

    MintedCrowdsale 계약에 뛰어들 때 _deliverToken( ) 메서드만 있습니다. 생성자 변경을 고려할 필요가 없습니다.

    pragma solidity 0.5.5;
    
    contract BonkTokenCrowdsale is Crowdsale, MintedCrowdsale {
       constructor(
            uint256 _rate, 
            address payable _wallet, 
            IERC20 _token,
        )
        Crowdsale(_rate, _wallet, _token)
        public 
        {
        }
    
    }
    
    


    변경해야 할 것은 BonkToken입니다. Crowdsale이 우리의 토큰을 발행할 것이기 때문에 토큰을 소유하고 발행할 수 있어야 합니다. 여기에 Ownable 계약과 ERC20Mintable 계약이 있습니다.

    Ownable은 토큰에 액세스 제어 메커니즘을 추가합니다. 상속 후 일부 기능은 소유자만 실행할 수 있도록 제한됩니다.

    ERC20Mintable은 dev 문서에서 매우 잘 설명하고 있습니다.

    Extension of {ERC20} that adds a set of accounts with the {MinterRole}, which have permission to mint (create) new tokens as they see fit. At construction, the deployer of the contract is the only minter.



    변경 후 토큰은 다음과 같습니다.

    // SPDX-License-Identifier: MIT
    pragma solidity 0.5.5;
    
    import "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol";
    import "@openzeppelin/contracts/token/ERC20/ERC20Mintable.sol";
    import "@openzeppelin/contracts/token/ERC20/ERC20Pausable.sol";
    import "@openzeppelin/contracts/ownership/Ownable.sol";
    
    contract BonkToken is ERC20Mintable, ERC20Detailed, Ownable{
    
        constructor(string memory _name, string memory _symbol, uint8 _decimals) 
            ERC20Detailed(_name, _symbol, _decimals)
            public
        {
    
        }
    }
    


    Crowdsale에서 토큰 발행 테스트를 시작하기 전에 토큰 소유권을 새로 생성된 Crowdsale로 이전해야 합니다.

    // create token 
    ... 
    
    // create Crowdsale 
    ... 
    
    await this.token.addMinter(this.crowdsale.address);
    await this.token.transferOwnership(this.crowdsale.address);
    


    그 이후로 발행을 위한 몇 가지 테스트를 추가할 수 있습니다.

        describe('minted crowdsale', function () {
            it('mints token after purchase', async function () {
                const originalTotalSupply = await this.token.totalSupply();
                await this.crowdsale.sendTransaction({ value: ether("1"), from: investor_1 });
                const newTotalSupply = await this.token.totalSupply();
    
                expect(newTotalSupply > originalTotalSupply).to.be.true;
            });
        });
    
    


    이 테스트는 새 토큰을 발행하는 것입니다. Crowdsale에서 이루어지는 모든 거래에서 BonkToken의 총 공급량이 증가해야 합니다.

    좋은 웹페이지 즐겨찾기