Hi @andrei,
I recommend reading the documentation on ERC20 and Crowdsales
The following are simple examples of a token and a crowdsale. (based on examples: https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/examples)
Deploy both contracts (setting the required rate, wallet address and token address in the crowdsale) and then transfer the required tokens to the crowdsale.
For experimenting in a test environment you could set the rate to 1.
To calculate required rates, please see the documentation: https://docs.openzeppelin.com/contracts/2.x/crowdsales#crowdsale-rate
I haven’t tested the code below other than manually deploying in truffle console.
Any such contracts need thorough and appropriate testing and auditing.
For testing, I recommend following: Test smart contracts like a rockstar
Before an audit I recommend following this checklist: https://blog.openzeppelin.com/follow-this-quality-checklist-before-an-audit-8cc6a0e44845/
OpenZeppelin can perform audits: https://openzeppelin.com/security-audits/
SimpleToken
pragma solidity ^0.5.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol";
/**
* @title SimpleToken
* @dev Very simple ERC20 Token example, where all tokens are pre-assigned to the creator.
* Note they can later distribute these tokens as they wish using `transfer` and other
* `ERC20` functions.
*/
contract SimpleToken is Context, ERC20, ERC20Detailed {
/**
* @dev Constructor that gives _msgSender() all of existing tokens.
*/
constructor () public ERC20Detailed("SimpleToken", "SIM", 18) {
_mint(_msgSender(), 1000000 * (10 ** uint256(decimals())));
}
}
SimpleCrowdsale
pragma solidity ^0.5.0;
import "@openzeppelin/contracts/crowdsale/Crowdsale.sol";
/**
* @title SimpleCrowdsale
* @dev This is an example of a fully fledged crowdsale.
*/
contract SimpleCrowdsale is Crowdsale {
constructor (
uint256 rate,
address payable wallet,
IERC20 token
)
public
Crowdsale(rate, wallet, token)
{
}
}