Comment déployer un contrat intelligent ICO sur TomoChain

Création d'une pile de jetons TRC-20 avec Truffle et OpenZeppelin

Cet article vous guide tout au long du processus de création d'un ICO de base sur TomoChain - vous vendez vos propres jetons TRC-20 à vos investisseurs!

Dans ce tutoriel, nous couvrirons:

  • Qu'est-ce qu'un ICO?
  • Quelques concepts importants tels que TRC-20, offre totale, liste blanche, ...
  • Utilisation des frameworks Truffle et OpenZeppelin
  • Rédaction d'un contrat intelligent de jeton TRC-20 (TomoChain)
  • Rédaction d'un contrat intelligent Crowdsale
  • Déploiement de votre contrat intelligent ICO sur TomoChain testnet ou Ethereum / Ropsten (totalement compatible!)
  • Achat des nouveaux jetons ICO

Un ICO (Initial Coin Offer) est un nouveau moyen de collecter des fonds pour les startups. C'est l'équivalent de la crypto-monnaie d'une introduction en bourse dans le monde de l'investissement traditionnel. Une entreprise qui cherche à créer une nouvelle pièce de monnaie, une nouvelle application ou un nouveau service lance un ICO. Les investisseurs achètent le nouveau jeton ICO, généralement avec des jetons numériques préexistants tels que TOMO. La société qui détient l'ICO utilise les fonds des investisseurs pour atteindre ses objectifs, lancer son produit ou lancer sa monnaie numérique. Les rondes ICO sont similaires aux rondes de capital-risque (VC).

Les jetons sont essentiellement des contrats intelligents utilisant la blockchain de TomoChain. La norme de jeton TRC-20 définit une liste commune de règles à suivre pour tous les jetons TomoChain, similaire à la norme ERC-20 dans Ethereum.

Dans le contrat intelligent, vous pouvez configurer des caractéristiques de jetons générales telles que le taux de TOMO par jeton (le nombre de jetons que l'utilisateur obtient pour son TOMO qui peut changer avec le temps), la date de début et de fin de l'ICO, les bonus temporels…

L'offre totale est la quantité totale de jetons qui existeront. Par exemple, l’offre totale de TomoChain est de 100 millions de jetons, mais il n’ya actuellement que 58 à 60 millions de jetons en circulation. Les jetons restants sont verrouillés à des fins différentes, telles que la réserve d'équipe, les partenariats, les récompenses de masternode et de jalonnement, les récompenses de communauté, etc., et entreront en circulation au cours des prochaines années.

Les ICO peuvent avoir un ou plusieurs tours. Par exemple, un tour de prévente pour les investisseurs privés avec un bonus, et plus tard un Crowdsale public.

Certains ICO utilisent une liste blanche. Cela signifie que les participants doivent s'inscrire à l'avance pour participer à la vente d'ICO. Les listes blanches limitent généralement le nombre de points et / ou l’achat initial minimum / maximum. Les investisseurs peuvent avoir besoin de s'inscrire auprès de certains documents pour se conformer à la réglementation de certains pays, KYC / AML…

Outre la loi, vous devez prendre en compte le problème de sécurité de vos contrats intelligents. Essayez de rendre vos contrats aussi simples que possible (la sécurité est simple).

L'idée d'une vente de crowdsale, d'un ICO ou d'une vente symbolique est simple. Vous pouvez automatiser l'échange de vos jetons contre la crypto-monnaie de base (telle que ETH ou TOMO), et ce, avec un contrat intelligent.

Le contrat intelligent que nous utilisons dans ce tutoriel est très simple et ne sert qu’à des fins éducatives. En fait, le scénario pour un ICO est plus compliqué et vous devez tester et auditer pour prévenir les bugs et vous devez également vous conformer à la loi et aux réglementations du pays où vous vendez votre jeton.

Dans ce tutoriel, je vous expliquerai les étapes de configuration de votre compte jusqu'à l'émission de votre contrat ICO sur le réseau TomoChain à l'aide de simples contrats intelligents et de MetaMask.

Pour ce tutoriel, nous utilisons:

  • Truffle, un environnement de développement de classe mondiale, une infrastructure de test et un portefeuille d’actifs pour les chaînes de blocs utilisant la machine virtuelle Ethereum (EVM), vise à faciliter la vie des développeurs.
  • OpenZeppelin, un framework de contrats intelligents réutilisables testé pour la bataille pour Ethereum et d'autres blockchains EVM.

Étapes à suivre (aperçu)

  1. Rédiger des contrats intelligents Solidity
  2. Déployer localement (nœud Eth local / Ganache / Ropsten / etc) et le tester
  3. Déployer sur TomoChain TestNet et le tester
  4. Déployer sur TomoChain MainNet

0. Prérequis

Pour commencer à construire votre contrat intelligent ICO, vous aurez besoin des éléments suivants:

  • Installez Node.js & npm (“Node.js Package Manager”)
  • Installer la truffe
npm installer -g truffe

1. Créer un nouveau projet

Créez un nouveau répertoire dans le dossier de développement de votre choix, puis déplacez-vous à l'intérieur. Puis lancez un nouveau projet Truffle:

mkdir trc20-crowdsale-tutorial
cd trc20-crowdsale-tutorial
initiation à la truffe

Maintenant, nous installons OpenZeppelin dans ce dossier:

npm installer openzeppelin-solidity

2. Préparer votre portefeuille TOMO

Vous aurez besoin d'une adresse de portefeuille et de quelques jetons. Nous vous montrerons comment procéder à la fois sur TomoChain Testnet et Mainnet.

2.1 Créer un portefeuille TOMO et enregistrer votre Mnemonic

Vous pouvez créer un nouveau portefeuille TOMO à l'aide de l'application mobile TomoWallet pour Android ou iOS. Sous Paramètres, allez à Paramètres avancés, vous pouvez choisir Réseau et sélectionner TomoChain TestNet ou TomoChain [mainnet].

Allez dans le menu Paramètres, sélectionnez Portefeuille de sauvegarde, puis Continuer. Ici, vous pouvez voir la clé privée de votre portefeuille et la phrase de récupération de 12 mots. Écrivez la phrase de récupération de 12 mots.

TomoWallet

Vous pouvez également créer un nouveau portefeuille TomoChain avec MetaMask, MyEtherWallet ou TrustWallet. Par exemple, pour le réseau principal, vous pouvez accéder à MyEtherWallet et sélectionner TOMO (tomochain.com) au lieu de Ethereum. Entrez un mot de passe, puis créez un nouveau portefeuille. Écrivez votre phrase de récupération.

Pour ce tutoriel, mon adresse de portefeuille (testnet) est la suivante:

0xc9b694877acd4e2e100e095788a591249c38b9c5

Ma phrase de récupération (mnémonique de 12 mots) est la suivante:

mythe à venir spin corne minute tag esprit ... caméra

Écrivez-les. Cela sera nécessaire plus tard. Notez que votre adresse de portefeuille et votre phrase de récupération seront différentes des miennes.

Important! Gardez toujours votre clé privée et votre phrase de récupération secrètes!

2.2 Obtenir des fonds TOMO

Nous aurons besoin de jetons pour le déploiement de contrats intelligents et pour tester plus tard nos contrats intelligents ICO.

Testnet: recevez 15 jetons TOMO testnet gratuits à l’aide du robinet de TomoChain.

Mainnet: Vous avez besoin de vrais jetons TOMO provenant d’échanges.

Aller au robinet et collecter 60 TOMO. Votre portefeuille a maintenant suffisamment d’équilibre pour tout faire dans ce didacticiel, alors… allons-y!

2.3 L'explorateur de blocs

Pour vérifier le solde d'une adresse de portefeuille, vous pouvez également utiliser TomoScan.

Testnet: https://scan.testnet.tomochain.com/

Mainnet: https://scan.tomochain.com/

Remarque: créez 2 portefeuilles TOMO différents, tous deux avec des jetons. Le premier portefeuille consiste à déployer le portefeuille intelligent de contrat ou de déploiement ICO, le second étant utilisé pour le tester ou le portefeuille d’acheteur.

3. Rédaction des contrats intelligents

3.1 MyToken

Nous utilisons et étendons les contrats OpenZeppelin pour créer plus de dapps sécurisés en moins de temps. OpenZeppelin est livré avec un large éventail de contrats intelligents pour diverses fonctions importantes.

Nous allons maintenant étendre les contrats de jetons pour créer notre propre jeton conforme à ERC20 (TRC20).

  1. Accédez au répertoire contracts / et créez un nouveau fichier appelé MyToken.sol ou le nom de votre choix.
  2. Copiez le code suivant
solidité du pragma ^ 0.5.2;
importer "openzeppelin-solidity / contracts / token / ERC20 / ERC20.sol";
importer "openzeppelin-solidity / contracts / token / ERC20 / ERC20Detailed.sol";
importer "openzeppelin-solidity / contracts / property / Ownable.sol";
/ **
 * @title jeton ERC20Detailed
 * @dev Les décimales servent uniquement à la visualisation.
 * Toutes les opérations sont effectuées en utilisant la plus petite unité indivisible,
 * Comme sur Ethereum, toutes les opérations sont effectuées en wei.
 * /
contrat MyToken est ERC20, ERC20Detailed, Ownable {
  
  constructeur(
    chaîne mémoire _nom,
    mémoire de chaîne _symbol,
    uint8 _decimals,
    uint256 _initialSupply
  )
    ERC20Detailed (_name, _symbol, _decimals)
    Publique
  {
    _mint (msg.sender, _initialSupply * 10 ** uint256 (_decimals));
  }
}

C'est tout. Vraiment.

Attendez une minute… Êtes-vous en train de me dire qu'il s'agit du code complet d'un jeton ERC-20 / TRC-20? Exactement. C’est la beauté de l’héritage et de l’extension des contrats intelligents OpenZeppelin. Actuellement, voir les premières lignes? Tous les codes inclus dans openzeppelin-solidity / contracts / token / ERC20 / ERC20.sol et openzeppelin-solidity / contracts / token / ERC20 / ERC20Detailed peuvent être utilisés et étendus (mise à jour / écrasement) par ce jeton.

Nous étendons les contrats intelligents ERC20, ERC20Detailed et Ownable, par OpenZeppelin. Cela signifie que nous aurons toutes les fonctionnalités de ces contrats intelligents plus le code que nous ajoutons à notre fichier MyToken.sol.

Ce code initialisera les valeurs de jeton telles que nom, symbole, décimales (pour ce faire, nous utilisons ERC20Detailed). Avec l'instruction _mint (), nous pré-monnayons (créons) tout l'offre initialeSupply (la quantité totale de jetons qui seront créés). Tous les jetons seront envoyés à l'adresse de portefeuille du contrat MyToken. Nous fournissons la totalité de l’alimentation à l’adresse du compte déployé.

_mint (msg.sender, _initialSupply * 10 ** uint256 (_decimals));
Important: tous les calculs de devise sont effectués dans la plus petite unité de cette devise, qui n'est pas ETH (ou TOMO) mais wei. 1 ETH = 10¹⁸ wei

Plus tard, nous accorderons l'accès à ces fonds au contrat intelligent MyTokenCrowdsale. Pour transférer la propriété ou approuver un autre portefeuille accédant à nos fonds de contrats intelligents, nous avons hérité du contrat intelligent Ownable.

3.2 MyTokenCrowdsale

Nous allons maintenant écrire notre contrat intelligent Crowdsale.

  1. Dans le dossier contracts /, ajoutez un nouveau fichier appelé MyTokenCrowdsale (ou le nom de votre choix).
  2. Ouvrez le fichier et collez ce code:
solidité du pragma ^ 0.5.2;
importer "openzeppelin-solidity / contracts / token / ERC20 / ERC20.sol";
importer "openzeppelin-solidity / contracts / crowdsale / Crowdsale.sol";
importer "openzeppelin-solidity / contracts / crowdsale / emission / AllowanceCrowdsale.sol";
contrat MyTokenCrowdsale est Crowdsale, AllowanceCrowdsale {
  constructeur(
    uint256 _rate,
    adresse payable _ portefeuille,
    ERC20 _token,
    adresse _tokenWallet
  )
    Crowdsale (_rate, _wallet, _token)
    AllowanceCrowdsale (_tokenWallet)
    Publique
  {
  }
}

Encore une fois, un contrat intelligent très simple.

Nous avons étendu Crowdsale et AllowanceCrowdsale de base d’OpenZeppelin. Crowdsale fonctionne avec rate, wallet (adresse du contrat MyTokenCrowdsale) et jeton (le jeton TRC-20).

Nous avons prolongé AllowanceCrowdsale pour que ce contrat puisse accéder aux jetons stockés dans un autre portefeuille et les envoyer, une fois approuvés par le propriétaire des jetons, à savoir MyToken.

4. Configuration des migrations

4.1 Créer les scripts de migration

Dans le répertoire migrations /, créez un nouveau fichier appelé2_deploy_contracts.js et ajoutez le contenu suivant:

const MyToken = artifacts.require ("./ MyToken.sol");
const MyTokenCrowdsale = artifacts.require ("./ MyTokenCrowdsale.sol");
const web3 = require ("web3-utils");
module.exports = (déployeur, réseau, [propriétaire]) => {
  const _nom = "Mon jeton TRC20";
  const _symbol = "MYT";
  const _decimals = 18;
  const _initialSupply = 16000000;
  const _rate = 500;
  const _crowdsaleTokens = web3.toWei ("8000000", "ether");
   
  retour déployer
    .then (() => deployer.deploy (MyToken, _name, _symbol, _decimals, _initialSupply))
    .then (() => deployer.deploy (MyTokenCrowdsale, _rate, owner, MyToken.address, owner))
    .then (() => MyToken.deployed ())
    .then (token => token.approve (MyTokenCrowdsale.address, _crowdsaleTokens));
};

Nous allons expliquer brièvement ce qui se passe ici:

Nous avons sélectionné le nom de notre jeton: My Token TRC20. Nous avons choisi le symbole MYT pour ce jeton. Nous attribuons 18 décimales, ce qui est la norme.

Nous allons également créer la réserve initiale: 16 000 000 jetons. Mais nous ne vendrons que la moitié (50%) d’entre eux à la Crowdsale.

Nous avons d'abord déployé MyToken, créant ainsi le stock initial: 16 000 000 MYT. Ensuite, nous déployons MyTokenCrowdsale. Ensuite, nous demandons à MyToken d’approuver l’adresse de MyTokenCrowdsale pour l’accès à 8 000 000 MYT. C'est le max que nous allons vendre dans notre Crowdsale.

Une dernière chose. Pour que cela fonctionne, nous devons installer web3-utils. Nous l'utilisons pour les grands nombres comme la fonction web3.toWei (), car nous avons besoin de 8'000'000 suivis de 18 zéros. Il suffit d’exécuter ceci sur la console:

npm installe web3-utils

4.2 Configurer truffle.js

Avant de commencer la migration, nous devons spécifier la blockchain sur laquelle nous voulons déployer nos contrats intelligents, spécifier l'adresse à déployer - le portefeuille que nous venons de créer et éventuellement le prix du gaz, du prix du gaz, etc.

1. Installez HDWalletProvider de Truffle, un package npm distinct permettant de rechercher et de signer des transactions pour des adresses dérivées d’une mnémonique de 12 mots.

npm installer le fournisseur de truffle-hdwallet

2. Ouvrez le fichier truffle.js (truffle-config.js sous Windows). Vous pouvez modifier ici les paramètres de migration: réseaux, identifiants de chaîne, gaz ... Vous avez plusieurs réseaux pour migrer votre ICO, vous pouvez le déployer: localement, en ganache, en réseau de test public Ropsten (ETH), en TomoChain (testnet), en TomoChain (Mainnet), etc…

La documentation officielle de TomoChain - Réseaux est très pratique. Les configurations réseau Testnet et Mainnet y sont décrites. Nous avons besoin du point de terminaison RPC, de l'ID de chaîne et du chemin de dérivation HD.

Remplacez le fichier truffle.js par ce nouveau contenu:

/ **
 * Utilisez ce fichier pour configurer votre projet de truffe. Il est ensemencé
 * paramètres communs pour différents réseaux et fonctionnalités telles que les migrations,
 * compilation et test. Décommentez ceux dont vous avez besoin ou modifiez-les
 * les adapter à votre projet si nécessaire.
 *
 * Plus d'informations sur la configuration peuvent être trouvées à:
 *
 * truffleframework.com/docs/advanced/configuration
 *
 * Pour déployer via Infura, vous aurez besoin d'un fournisseur de portefeuille (comme truffle-hdwallet-provider).
 * pour signer vos transactions avant qu'elles ne soient envoyées à un nœud public distant. API Infura
 * Les clés sont disponibles gratuitement sur: infura.io/register
 *
 * Vous aurez également besoin d'un mnémonique - la phrase de douze mots utilisée par le portefeuille pour générer
 * paires de clés publique / privée. Si vous publiez votre code sur GitHub, assurez-vous de charger cette
 * phrase d'un fichier que vous avez .gitignored afin qu'il ne devienne pas accidentellement public.
 *
 * /
const HDWalletProvider = require ('fournisseur de truffle-hdwallet');
const infuraKey = "a93ffc ... ";
// const fs = require ('fs');
// const mnemonic = fs.readFileSync (". secret"). toString (). trim ();
const mnemonic = '<';
module.exports = {
  / **
   * Les réseaux définissent le mode de connexion à votre client Ethereum et vous permettent de définir
   * par défaut, Web3 utilise pour envoyer des transactions. Si vous ne spécifiez pas une truffe
   * créera une blockchain de développement pour vous sur le port 9545 lorsque vous
   * lancer `develop` ou` test`. Vous pouvez demander à une commande truffe d’utiliser un
   * réseau à partir de la ligne de commande, par exemple
   *
   * $ test de truffe --network 
   * /
  réseaux: {
    // Utile pour les tests. Le nom de `développement` est spécial - truffle l'utilise par défaut
    // s'il est défini ici et qu'aucun autre réseau n'est spécifié sur la ligne de commande.
    // Vous devez exécuter un client (comme ganache-cli, geth ou parité) dans un terminal séparé
    // onglet si vous utilisez ce réseau et que vous devez également définir les paramètres `host`,` port` et `network_id`
    // options ci-dessous à une certaine valeur.
    
    développement: {
      hôte: "127.0.0.1", // hôte local (par défaut: aucun)
      port: 8545, // port Ethereum standard (par défaut: aucun)
      network_id: "*", // N'importe quel réseau (par défaut: aucun)
    },
    // Un autre réseau avec des options plus avancées ...
    // Avancée: {
      // port: 8777, // port personnalisé
      // network_id: 1342, // réseau personnalisé
      // gas: 8500000, // gaz envoyé avec chaque transaction (par défaut: ~ 6700000)
      // gasPrice: 20000000000, // 20 gwei (en wei) (par défaut: 100 gwei)
      // depuis: , // compte à partir duquel envoyer les tx (par défaut: comptes [0])
      // websockets: true // Activer l'interface EventEmitter pour web3 (par défaut: false)
    //},
    // Utile pour le déploiement sur un réseau public.
    // NB: Il est important d'encapsuler le fournisseur en tant que fonction.
    ropsten: {
      // fournisseur: () => nouveau HDWalletProvider (mnemonic, `https://ropsten.infura.io/$ {infuraKey}`),
      provider: () => new HDWalletProvider (
        mnémonique,
        `https://ropsten.infura.io/$ {infuraKey}`,
        0
        1,
        vrai,
        "m / 44 '/ 889' / 0 '/ 0 /", // connexion avec HDPath identique à TOMO
      ),
      network_id: 3, // id de Ropsten
      gas: 5500000, // Ropsten a une limite de bloc inférieure à celle du réseau principal
      // confirmations: 2, // # de confs à attendre entre les déploiements. (par défaut: 0)
      // timeoutBlocks: 200, // # de blocs avant l'expiration d'un déploiement (minimum / par défaut: 50)
      // skipDryRun: true // Ignorer les essais avant les migrations? (valeur par défaut: false pour les réseaux publics)
    },
    // Utile pour le déploiement sur TomoChain testnet
    tomotestnet: {
      provider: () => new HDWalletProvider (
        mnémonique,
        "https://testnet.tomochain.com",
        0
        1,
        vrai,
        "m / 44 '/ 889' / 0 '/ 0 /",
      ),
      network_id: "89",
      gaz: 2000000,
      gasPrice: 10000000000000, // TomoChain nécessite au minimum 10 TOMO pour se déployer afin de lutter contre les attaques de spam
    },
    // Utile pour le déploiement sur le réseau principal TomoChain
    tomomainnet: {
      provider: () => new HDWalletProvider (
        mnémonique,
        "https://rpc.tomochain.com",
        0
        1,
        vrai,
        "m / 44 '/ 889' / 0 '/ 0 /",
      ),
      network_id: "88",
      gaz: 2000000,
      gasPrice: 10000000000000, // TomoChain requiert un minimum de 10 TOMO pour se déployer afin de lutter contre les attaques de spam
    },
    // Utile pour les réseaux privés
    // private: {
      // fournisseur: () => nouveau HDWalletProvider (mnémonique, `https: // network.io`),
      // network_id: 2111, // Ce réseau vous appartient, dans le cloud.
      // production: true // Traite ce réseau comme s'il s'agissait d'un réseau public. (par défaut: false)
    //}
  },
  // Définissez les options par défaut de moka ici, utilisez des rapporteurs spéciaux, etc.
  moka: {
    // délai d'attente: 100000
  },
  // Configurez vos compilateurs
  compilateurs: {
    solc: {
      version: "0.5.2", // Récupère la version exacte de solc-bin (par défaut: version de truffle)
      // docker: true, // utilisez "0.5.1" que vous avez installé localement avec docker (par défaut: false)
      // settings: {// Consultez la documentation Solidity pour obtenir des conseils sur l'optimisation et evmVersion.
      // optimiseur: {
      // activé: false,
      // pistes: 200
      //},
      // evmVersion: "byzantium"
      //}
    }
  }
}

3. N'oubliez pas de mettre à jour le fichier truffle.js en utilisant votre propre phrase de récupération de portefeuille. Copiez les 12 mots obtenus précédemment et collez-les comme valeur de la variable mnémonique.

const mnemonic = '<';

Si vous souhaitez utiliser Ropsten (Ethereum) pour le déploiement, vous devez mettre à jour votre infuraKey. Sinon, vous pouvez ignorer cette ligne:

const infuraKey = "a93ffc ... ";
Notre code Solidity fonctionne parfaitement sur Ethereum (déploiement sur Ropsten) et le même code fonctionne également sur TomoChain. - Agréable! Totalement compatible!
Avertissement: en production, nous vous recommandons vivement de stocker le mnémonique dans un autre fichier secret (chargé à partir de variables d'environnement ou d'un système de gestion de secret sécurisé), afin de réduire le risque que le mnémonique soit connu. Si quelqu'un connaît votre mnémonique, il a toutes vos adresses et clés privées!

En outre, l'utilisation de la variable d'environnement pour les mnémoniques est une bonne pratique si plusieurs développeurs travaillent sur le même code stocké sur un référentiel distant et qu'ils peuvent utiliser leurs différentes mnémoniques pour tester / déployer le contrat.

Vous pouvez essayer avec le paquet npm dotenv de charger une variable d’environnement à partir d’un fichier .env, puis mettez à jour votre fichier truffle.js pour utiliser ce code mnémonique secret.

5. Déploiement

5.1 Démarrer la migration

Votre contrat intelligent devrait déjà être compilé. Sinon, c’est le bon moment pour le faire avec la compilation de truffes.

De retour dans notre terminal, migrez le contrat vers le réseau testnet de TomoChain (rappelez-vous qu'il vous faut du testnet TOMO sur votre portefeuille):

migration de la truffe - réseau tomotestnet

Déployer sur TomoChain Mainnet est très similaire:

migration de la truffe - réseau tomomainnet

Vous pouvez également migrer le contrat vers Ropsten (mais vous avez d’abord besoin d’un portefeuille Ropsten avec du Ropsten ETH - vous pouvez le faire sur Metamask avec un robinet).

truffe migrate --network ropsten
Le déploiement est maintenant plus rapide sur TomoChain!

Les migrations commencent…

Commencer des migrations ...
=======================
> Nom du réseau: 'tomotestnet'
> Identifiant réseau: 89
> Limite d’essence en bloc: 84000000
1_initialisation_migration.js
=======================
Déploiement de 'Migrations'
   ----------------------
   > transaction hash: 0xb04b1a80cfedbcb8248817301c0c9384ee41099a4c25266a61ce87c76cafc05
   > Blocs: 2 secondes: 5
   > adresse du contrat: 0xf227316d891D0D83a04d5C6EE0A745585DdAE1a7
   > compte: 0x169397F515Af9E93539e0F483f8A6FC115de660C
   > solde: 46.26451
   > gaz utilisé: 273162
   > prix du gaz: 10000 gwei
   > valeur envoyée: 0 ETH
   > coût total: 2.73162 ETH
> Sauvegarde de la migration en chaîne.
   > Sauvegarde d'artefacts
   -------------------------------------
   > Coût total: 2,73162 ETH
2_deploy_contracts.js
======================
Déploiement de 'MyToken'
   -------------------
   > transaction hash: 0xd084fcd12c9e05397abfffc78e680a2415f061d0d36d3a13ac416b798f4d0f19
   > Blocs: 0 secondes: 0
   > adresse du contrat: 0xd2e70E8386C9E3DeCA6583686a12F8da62b59969
   > compte: 0x169397F515Af9E93539e0F483f8A6FC115de660C
   > solde: 29.38373
   > gaz utilisé: 1646050
   > prix du gaz: 10000 gwei
   > valeur envoyée: 0 ETH
   > coût total: 16.4605 ETH
Déploiement de 'MyTokenCrowdsale'
   ----------------------------
   > transaction hash: 0x3f375af43846307544d7d7652994f2bb9264a743aa064f7b8c1c92e68530502c
   > Blocs: 0 secondes: 0
   > adresse du contrat: 0xD102e777e893f30cb9630a32A9370ED6d575226B
   > compte: 0x169397F515Af9E93539e0F483f8A6FC115de660C
   > solde: 21.24818
   > gaz utilisé: 813555
   > prix du gaz: 10000 gwei
   > valeur envoyée: 0 ETH
   > coût total: 8.13555 ETH
> Sauvegarde de la migration en chaîne.
   > Sauvegarde d'artefacts
   -------------------------------------
   > Coût total: 24.59605 ETH
Sommaire
=======
> Total des déploiements: 3
> Coût final: 27.32767 ETH

Toutes nos félicitations! Vous avez déjà déployé vos contrats intelligents ICO auprès de TomoChain. Les frais de déploiement ont coûté 27,32 TOMO.

Lisez attentivement et notez le texte affiché à l'écran:

  • L'adresse du contrat MyToken est:
0xd2e70E8386C9E3DeCA6583686a12F8da62b59969
  • L'adresse du contrat MyTokenCrowdsale est:
0x169397F515Af9E93539e0F483f8A6FC115de660C

*** Dépannage ***

  • Erreur: le coût de création d'un contrat intelligent est sous indemnité. Pourquoi? L'augmentation des frais de transaction pour la création de contrats intelligents est l'un des moyens proposés par TomoChain pour se défendre contre les attaques de spam. Solution: modifiez le fichier truffle.js et ajoutez plus de gaz / gaz à déployer.
  • Erreur: fonds insuffisants pour le gaz * prix + valeur. Pourquoi? Vous n’avez pas assez de jetons dans votre portefeuille pour les frais d’essence. Solution: vous avez besoin de plus de fonds dans votre portefeuille pour être déployés, allez au robinet et obtenez plus de jetons.

5.3 Vérifier les contrats de déploiement

Si vous souhaitez vérifier que vos contrats ont été déployés avec succès, vous pouvez vérifier sur TomoScan testnet (ou mainnet). Dans le champ de recherche, tapez l'adresse du contrat que vous voulez voir.

Voici les résultats de nos migrations:

Ropsten:

  • Jeton: 0x1679808c30FE76bA30AD9D8AdCDff92f67aa8f3B
  • Crowdsale: 0xe38C915d87b22FBafb72CE8c39Da8d0c57284c90

TomoChain testnet:

  • Jeton: 0xd2e70e8386c9e3deca6583686a12f8da62b59969
  • Crowdsale: 0xD102e777e893f30cb9630a32A9370ED6d575226B
Contrat MyTokenCrowdsale

Toutes nos félicitations! Vous avez déployé votre contrat intelligent ICO et votre jeton TRC-20 sur TomoChain à l'aide de Truffle et OpenZeppelin. Il est temps d’interagir maintenant avec notre contrat intelligent ICO pour nous assurer qu’il fait ce que nous voulons.

6. Tester les contrats intelligents

Le code utilisé dans ce tutoriel est uniquement destiné à l'apprentissage. Lors de la rédaction de vos contrats ICO, il faut du temps pour tester et auditer votre propre code, écrire des tests unitaires sur test / dossier et auditer votre code pour éviter les bugs ou les piratages.

7. Test de l'OIC

La dernière étape consiste à tester notre ICO. Nous allons acheter des jetons MYT avec TOMO!

Pour cela, nous enverrons directement des jetons TOMO à l'adresse du contrat Crowdsale, et le contrat intelligent doit renvoyer le nouveau jeton TRC-20 que nous avons créé, MYT.

Le taux de conversion est de 500. Donc, si nous envoyons 20 TOMO, nous devrions recevoir 20 * 500 = 10 000 MYT dans notre portefeuille d'acheteurs.

7.1 Installer MetaMask

  1. Installez l’extension de navigateur MetaMask dans Chrome ou FireFox.
  2. Une fois installé, l’icône Renard MetaMask apparaît à côté de votre barre d’adresses. Cliquez sur l'icône et MetaMask s'ouvrira.
  3. Crée un nouveau mot de passe. Ensuite, écrivez la phrase de sauvegarde secrète et acceptez les conditions. Par défaut, MetaMask créera une nouvelle adresse Ethereum pour vous.
Lancer le méta-masque

4. Nous sommes maintenant connectés au réseau Ethereum, avec un tout nouveau portefeuille.

7.2 Config MetaMask pour se connecter à TomoChain

Connectons maintenant MetaMask à TomoChain (testnet).

1. Cliquez sur le menu contenant “Réseau Ethereum principal” et sélectionnez Custom RPC. Utilisez les données de réseaux de TomoChain (testnet) et cliquez sur Enregistrer.

Connexion de MetaMask à TomoChain (testnet)

2. Le nom du réseau en haut changera pour dire «TomoChain testnet». Maintenant que nous sommes sur le réseau TomoChain, nous pouvons importer des portefeuilles TomoChain.

N’utilisez pas le portefeuille de déploiement que vous avez précédemment utilisé sur truffle.js. Mieux, créez un nouveau portefeuille TOMO, pour séparer les rôles. Créez votre portefeuille d’acheteur, si ce n’est déjà fait, allez au robinet et ajoutez 30 TOMO.

3. Copiez la clé privée de votre portefeuille d'acheteur. Retour à MetaMask, cliquez sur le cercle en haut à droite et sélectionnez Importer un compte. Collez la clé privée et le tour est joué! Votre portefeuille TOMO est chargé dans MetaMask.

Importer un portefeuille

7.3 Achat de jetons ICO (envoi de TOMO à l'adresse ICO)

Nous allons maintenant acheter des MyToken (MYT) du contrat ICO Crowdsale.

1. Copiez l'adresse du contrat Crowdsale. Voici l'adresse dans notre exemple (votre adresse Crowdsale sera différente)

0xD102e777e893f30cb9630a32A9370ED6d575226B

2. Allez sur MetaMask, connectez-vous à TomoChain testnet et utilisez votre portefeuille clients avec suffisamment de fonds. Cliquez sur le bouton Envoyer.

3. Collez l'adresse Crowdsale. Définissez le montant de 20 TOMO que vous souhaitez envoyer. Sélectionnez les frais de transaction (essence, prix de l'essence) et cliquez sur Suivant. Après quelques secondes, votre transaction sera confirmée avec succès.

Envoi de TOMO à l'adresse Crowdsale

Vous pouvez voir la transaction d'achat Crowdsale. 20 TOMO ont été envoyés et le contrat a renvoyé 10 000 MYT au portefeuille de l'acheteur. Voici la transaction de ce tutoriel sur TomoScan.

Vous pouvez maintenant consulter la liste des détenteurs de jetons. Vous trouverez deux détenteurs:

  • L'équipe / ICO: a 15'990'000 MYT
  • Notre portefeuille acheteur: a 10'000 MYT
Porte-jetons MYT

Pour voir vos nouveaux jetons sur MetaMask, cliquez sur l'icône Menu en haut à gauche (sous la face Fox). Cliquez sur Ajouter un jeton. Sélectionnez le jeton personnalisé, collez l'adresse du jeton et cliquez sur Suivant.

Vous verrez vos jetons MYT.

Vous pouvez voir les jetons 10'000 MYT sur MetaMask

Toutes nos félicitations! Le Crowdsale fonctionne! Nous avons envoyé 20 TOMO et nous sommes revenus à 10'000 MYT.

Et après?

Vous pouvez et devez personnaliser ces deux contrats intelligents MyToken et MyTokenCrowdsale en fonction de vos besoins. Par exemple, vous pouvez:

  • ajoutez une heure d'ouverture et une heure de fermeture à votre crowdsale
  • définir un taux différent ou des bonus avec des dates (exemple: taux: 600 pendant la première semaine (bonus de 20%) et taux: 500 la deuxième semaine).
  • fixez un plafond à votre vente virtuelle, annulant tout achat dépassant ce plafond (exemple: vendez 70% des jetons et le reste, aux équipes, aux conseillers,…)
  • fixer un minimum et un maximum de contributions individuelles
  • créer différentes rondes (comme: PreSale et Crowdsale)
  • Autorisez uniquement les participants inscrits sur la liste blanche à acheter des jetons. Utile pour mettre votre liste blanche KYC / AML sur la chaîne!
  • et plus… (lien de visite ci-dessous)

Plus ici: En savoir plus sur OpenZeppelin Crowdsales.

Vous voudrez peut-être également créer un site Web ICO avec toutes les informations sur les dates, les taux, les plafonds, etc.

Code source

Le code source de ce tutoriel est disponible sur Github.