/eth-erc20-token-sale

ERC20 Token Sales

Primary LanguageTypeScriptMIT LicenseMIT

Ethereum ERC20 Token Sale PRs Welcome Add to Homescreen

made for ethereum to the moon MIT license

I think the Initial Coin Offering (ICO) is the first use case every Solidity developer need to get familiar with even the ICO mania is behind us.

The token known as Fluwix with symbol FWX, as I assumed whatever I learned here will be integrated into another project of the same name in the future. The exchange rate of ETH to FWX is 1 to 1. For example, for 0.001 ETH you will get 0.001 FWX in return.

The project is created by referred to an excellent tutorial published by Thomas Wiesner.

The key feature of the project is whitelisting. Only the address of user accounts being whitelisted by the owner (the deployer of the contract) can buy the token.

The project is using the following third party libraries to simplify codes:

  • Use @openzeppelin/contracts@4.3.1 for implementation of ERC20
  • Reuse the code of Crowdsale.sol from @openzeppelin/contracts@2.3.0.
  • Use @openzeppelin/test-helpers@0.5.13 for writing unit tests.

It is tested with MetaMask Chrome extension and Android. I think it is good idea to test out the dApps (or on Skynet) yourself before looking into the code.

The dApps is interacting with smart contracts running on Rinkeby testnet, hence you need some ETH in your wallet. If you don't have any, you can request some ETH from Rinkeby Faucet.

Smart Contract Development

The project is bootstrapped with Truffle using truffle init command.

Steps to run the smart contracts locally:

  1. Clone the github repository. This also takes care of installing the necessary dependencies.

    git clone git@github.com:limcheekin/eth-erc20-token-sale.git
  2. Create a .env file with configuration data for the token, for example:

    TOKEN_NAME=Your_Token_Name
    TOKEN_SYMBOL=Your_Symbol
    INITIAL_TOKEN_SUPPLY=1000000000
    
  3. Install dependencies in the root directory.

    npm i
    # or
    yarn
  4. Install Truffle globally.

    npm install -g truffle
  5. Run the development console in the root directory of the project.

    truffle develop
  6. Compile and migrate the smart contracts. Note inside the development console we don't preface commands with truffle.

    compile
    migrate

    Please note down the contract address of the deployed smart contracts. We will need to update it in the front-end's .env.local.

  7. Truffle can run tests written in Solidity or JavaScript against your smart contracts. Note the command varies slightly if you're in or outside of the development console.

    // If inside the development console.
    test
    
    // If outside the development console.
    truffle test
  8. Deploy smart contract to Rinkeby testnet

    • Add the configuration of Infura Project ID and private key of your Rinkeby account to the .env file, for example:

      INFURA_PROJECT_ID=Your_Infura_Project_Id
      RINKEBY_PRIVATE_KEY=Your_Rinkeby_Private_Key
      
    • Run the truffle migrate --network rinkeby command to deploy smart contract to Rinkeby network.

dApps Front End

The front-end code of the dApps is located in client directory. It is a Next.js project bootstrapped with create-next-app.

The client is created by derived/adapted the codes from the following excellence articles:

Steps to run the client locally:

  1. Install dependencies.

    npm i
    # or
    yarn
  2. Create the .env.local file in the client directory and define the following environment variables:

    NEXT_PUBLIC_FLUWIX_TOKEN_CONTRACT_ADDRESS=0x...
    NEXT_PUBLIC_KYC_CONTRACT_ADDRESS=0x...
    NEXT_PUBLIC_FLUWIX_TOKEN_SALE_CONTRACT_ADDRESS=0x..
    

    As the .env.local file is not stored in the repo:

    • For deployment to Vercel, you need to configure the environment variables there.
    • For deployment to Skynet, you need to add the content of the .env.local file as DOT_ENV_DOT_LOCAL secret.
  3. Run the development server

    npm run dev
    # or
    yarn dev

    Open http://localhost:3000 with your browser, you will see the screen of the React client:

    Main Screen

  4. Run with MetaMask

    As truffle develop exposes the blockchain onto port 9545, you'll need to add a Custom RPC network of http://localhost:9545 in your MetaMask to make it work.

Continuous Integration

The repository setup Continuous Integration build pipeline with GitHub Actions. If you use it as your project template, the first build will fail upon project creation. To fix it, you need to setup the CC_SECRET encrypted secret for Codechecks and DOT_COVERALLS_YML encrypted secret for Coveralls. Please refer to Continuous Integration Setup for more information.