Local Testnets – How to Create a Local USDT Testnet

dockererc-20go-ethereumtetherusdt

I want to create a local testnet on which I can move USDT (test coins) between wallets.

I managed to create a ETH testnet inside Docker. In the docker-compose.yml below, the lines between # ETH testnet setup (start) and # ETH testnet setup (end) are responsible for that.

version: '3'

services:
#
# BTC testnet setup (start)
#
  node:
    image: ulamlabs/bitcoind-custom-regtest:latest
  electrumx:
    image: lukechilds/electrumx:latest
    links:
      - node
    ports:
      - "51001:50001"
      - "51002:50002"
    environment:
      - NET=regtest
      - COIN=BitcoinSegwit
      - DAEMON_URL=http://test:test@node:19001
  explorer:
    image: ulamlabs/btc-rpc-explorer:latest
    links:
      - node
      - electrumx
    ports:
      - "3002:3002"
    environment:
      - BTCEXP_HOST=0.0.0.0
      - BTCEXP_BITCOIND_URI=http://test:test@node:19001
      - BTCEXP_ELECTRUMX_SERVERS=tls://electrumx:50002
      - BTCEXP_ADDRESS_API=electrumx
#
# BTC testnet setup (end)
#


#
# ETH testnet setup (start)
#
  geth:
    image: ulamlabs/geth-poa-testnet:latest
    environment:
      - ETH_PASSWORD=QfdxTYxkwASj
      - ETH_PRIVATE_KEY=0d0b4c455973c883bb0fa584f0078178aa90c571a8f1d40f28d2339f4e757dde
      - ETH_ADDRESS=0c56352F05De44C9b5BA8bcF9BDEc7e654993339
    ports:
      - 8178:8178
      - 8546:8546
    volumes:
      - ./genesis.json:/app/genesis.json

  postgres:
    image: postgres:12
    command: postgres -c 'max_connections=500'
    environment:
      - POSTGRES_HOST_AUTH_METHOD=trust

  blockscout:
    image: ulamlabs/blockscout:latest
    links:
      - geth
      - postgres
    ports:
      - 4000:4000
    environment:
      - DATABASE_URL=postgresql://postgres:@postgres:5432/postgres?ssl=false
      - ETHEREUM_JSONRPC_VARIANT=geth
      - ETHEREUM_JSONRPC_HTTP_URL=http://geth:8178
      - ETHEREUM_JSONRPC_WS_URL=ws://geth:8546
      - MIX_ENV=prod
      - BLOCKSCOUT_HOST=localhost
      - COIN=eth
      - NETWORK=POA
      - SUBNETWORK=Local Testnet

#
# ETH testnet setup (end)
#

The file ./genesis.json:/app/genesis.json contains the following:

{
    "config": {
        "chainId": 5555,
        "clique": {
            "period": 60,
            "epoch": 30000
        },
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "eip155Block": 0,
        "eip158Block": 0,
        "byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0,
        "muirGlacierBlock": 0
    },
    "extraData": "0x00000000000000000000000000000000000000000000000000000000000000000c56352F05De44C9b5BA8bcF9BDEc7e6549933390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "alloc": {
        "411167FeFecAD12Da17F9063143706C39528aa28": {
            "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
        }
    },
    "nonce": "0x0",
    "timestamp": "0x5eaa7b09",
    "gasLimit": "0x47b760",
    "difficulty": "0x1",
    "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "number": "0x0",
    "gasUsed": "0x0",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}

As far as I understand,

  • no USDT test coins are being mined in this testnet and
  • in order to have USDT test coins I need to add ERC20 support to the ETH (geth) testnet.

How do I need to modify the above docker-compose.yml and/or genesis.json files in order to add ERC20/USDT support to my ETH testnet?

Best Answer

I will try to answer as best as I can, although the question is not 100% clear to me.

Eth transfer

Transfer of Ether between accounts is handled natively by the blockchain. You do not need to deploy any smart contract to do so.

ERC-20 transfer

USDT and other ERC-20 tokens do not exist natively on the blockchain. Each ERC-20 token is a smart contract that was deployed by someone. For instance, this is the USDT contract address. You can also read the USDT contract code here.

USDT on testnet

To answer your question, you can test USDT on a testnet by deploying an exact copy of the USDT contract (linked above) on that testnet, then calling some functions like transfer() on the smart contract.

Note that you do not need to create your own testnet. You could use a public testnet like Ropsten, Kovan, Rinkeby, etc. You could also do a local fork of Ethereum mainnet using a tool like ganache-cli. With the latter, the USDT contract is already deployed and you can test it on your local fork of Ethereum mainnet. Ganache-cli also allows you to create a local testnet very easily.