Search code examples
trufflethundercore

How do I use Truffle to deploy a contract on ThunderCore?


How do I use Truffle to deploy a contract on ThunderCore? Is it the same as using truffle on ethereum? how do I setup the config? Is there any document or resource to reference?


Solution

  • Set your Truffle project to:

    1. Use @truffle/hdwallet-provider and point it at https://mainnet-rpc.thundercore.com
    2. Set byzantium as the target EVM version for the Solidity compiler
      • See evnVersion in truffle-config.js below
      • ThunderCore supports byzantium as of April 2020

    Self-contained Project Template

    package.json

    {
      "name": "field-support",
      "version": "0.0.1",
      "main": "trufflej-config.js",
      "license": "LicenseRef-COPYING",
      "directories": {
        "test": "test"
      },
      "dependencies": {
        "json5": "^2.1.0",
        "truffle": "^5.1.22",
        "@truffle/hdwallet-provider": "^1.0.34"
      },
      "scripts": {
        "test": "truffle test",
        "migrate": "truffle migrate",
        "deploy": "truffle migrate",
        "compile": "truffle compile",
        "build": "truffle build",
        "lint": "solium -d contracts && eslint ."
      },
      "keywords": [
        "smart contract"
      ],
      "author": ""
    }
    

    truffle-config.js

    const HDWalletProvider = require("@truffle/hdwallet-provider");
    
    const fs = require("fs");
    
    const MAINNET_PROVIDER = "https://mainnet-rpc.thundercore.com";
    
    let privateKeys = null;
    let mnemonic = null;
    try {
      privateKeys = fs
        .readFileSync(".private-keys", { encoding: "ascii" })
        .split("\n")
        .filter(x => x.length > 0);
    } catch (err) {
      if (err.code !== "ENOENT") {
        throw err;
      }
    }
    
    if (!privateKeys) {
      try {
        mnemonic = fs.readFileSync(".mnemonic", { encoding: "ascii" }).trim();
      } catch (err) {
        if (err.code !== "ENOENT") {
          throw err;
        }
      }
    }
    
    module.exports = {
      networks: {
        // For `truffle develop`
        development: {
          host: "127.0.0.1", // Localhost (default: none)
          port: 9545, // Standard Ethereum port (default: none)
          network_id: "*" // Any network (default: none)
        },
        "thunder-mainnet": {
          provider: () => {
            if (privateKeys === null && mnemonic === null) {
              throw new Error("Please create a .private-keys or .mnemonic file");
            }
    
            return privateKeys
              ? new HDWalletProvider(
                  privateKeys,
                  MAINNET_PROVIDER,
                  0, // <- change address_index if you want to use non-first address
                  privateKeys.length
                )
              : new HDWalletProvider(
                  mnemonic,
                  MAINNET_PROVIDER,
                  0 // <- change address_index if you want to use non-first address
                );
          },
          network_id: "108"
        }
      },
    
      // Set default mocha options here, use special reporters etc.
      mocha: {
        // timeout: 100000
      },
    
      // Configure your compilers
      compilers: {
        solc: {
          version: "0.5.9", // Fetch exact version from solc-bin (default: truffle's version)
          settings: {
            // see the solidity docs for advice about optimization and evmversion
            optimizer: {
              enabled: true,
              runs: 200
            },
            evmVersion: "byzantium" // Current evm on ThunderCore fixed at "byzantium"
          }
        }
      }
    };
    
    

    contracts/SimplStorage.sol

    pragma solidity ^0.5;
    
    contract SimpleStorage {
      uint storedData;
    
      function set(uint x) public {
        storedData = x;
      }
    
      function get() public view returns (uint) {
        return storedData;
      }
    }
    

    migrations/2_deploy.js

    const SimpleStorage = artifacts.require('SimpleStorage');
    
    module.exports = function(deployer) {
      deployer.deploy(SimpleStorage);
    };
    

    Sample Session

    1. Create a wallet in Metamask
    2. Get Thunder Tokens (TT) through the ThunderCore Mainnet Faucet
    3. Export the private key and save it to a .private-keys file
    4. Run truffle migrate --network thunder-mainnet:
    $ truffle migrate --network thunder-mainnet
    
    Compiling your contracts...
    ===========================
    > Everything is up to date, there is nothing to compile.
    
    
    
    Starting migrations...
    ======================
    > Network name:    'thunder-mainnet'
    > Network id:      108
    > Block gas limit: 0x5f5e100
    
    
    1_initial_migration.js
    ======================
    
       Deploying 'Migrations'
       ----------------------
       > transaction hash:    0x4d943a338d683d7ba0dc4937417b4b795b4791849b4695aeddb8811bdb265183
       > Blocks: 5            Seconds: 6
       > contract address:    0xFAc8a9a57cb2C70059D603f393F4A4f830C43a34
    (...)
    
       > Saving migration to chain.
       > Saving artifacts
       -------------------------------------
       > Total cost:          0.00554924 ETH
    
    
    2_deploy.js
    ===========
    
       Deploying 'SimpleStorage'
       -------------------------
       > transaction hash:    0x8a6063fa9dd74935e0db262a03ffee38181e383e3d73dd408cc76730e79ac135
       > Blocks: 5            Seconds: 6
       > contract address:    0x75F89Ba793DDFFCA4b604Ae8B28E8DfD8Dbbe14a
    (...)
    
    

    You can find the code here in the simple-storage branch of the field-support repo.