Ethereum ICO -鋳造されたクラウンセール


元来here👈
前のpostはERC 20トークンについてでした.さあ、このトークンのためにCrowdsaleを準備しましょう.私は、このCrowdsaleをここで単純にしておきます.

群衆販売


基本的なCrowdsaleの作成は、トークンを作るのと同じ手順に従います.ここでの継承はすぐに新しいものを作成する際の祝福です😜).
pragma solidity 0.5.5;

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

}

テストで作るより多くの魔法があります.新しいファイルの中で、適切なトークン、ATHへのレート、およびいくつかの資金を調達するウォレットアドレスで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を与える.BNK <-> 0.0001 eth <-> 1 000 000 000 000 Weiを持っていたいので、1のWI ( 0.000000000000000010 BNK <-> 1 Wei )に対して10個のSnallest単位が必要です.
    それで
    0 . 0000000000000010 BNK <-> 1 Weiと1 eth <-> 1000000000000000000 Wei電卓を使用🤔.

    0.000000000000001 * 10000~~00000000000000~~ = 1000

  • 次の3つのチェックは、コンストラクタに適切なパラメータを渡すだけです.私は詳細に飛び込むつもりはない.
  • 最後に取引を行う可能性についてです.すべての約束が満たされるかどうかチェックするだけです.
  • ミントクラウン


    次の機能、次の継承.BonkTokenRowdSalesにMinteCrowdsaleを加えましょう.
    MinterCrowdSlider契約へのダイビング時には、RunDeliVerToken ()メソッドのみです.コンストラクタの変更を考慮する必要はありません.
    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契約とerc 20 mintable契約は、ここに来ます.
    Ownableは、我々のトークンにアクセス制御機構を加えます.継承後、いくつかの関数は所有者だけで実行されるように制限されます.
    erc 20 mintableはdev docsでとてもよく説明されています:

    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
        {
    
        }
    }
    
    クラウディングセールでトークンをテストする前に、トークンの所有権を転送する必要があります.
    // 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で行われたすべてのトランザクションでは、bonktokensの合計供給が増加する必要があります.