이더리움 ICO - 발행 크라우드세일
이전 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;
});
});
여기서 무슨 일이 일어나고 있습니까?
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의 총 공급량이 증가해야 합니다.
Reference
이 문제에 관하여(이더리움 ICO - 발행 크라우드세일), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kuba_szw/ethereum-ico-minted-crowdsale-117h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)