1 Prepare project
npm install -g truffle
mkdir MyToken && cd MyToken
truffle init
npm init -y
2 Programming ERC-20?
pragma solidity ^0.5.16;
import './SafeMath.sol';
contract Token {
? ? using SafeMath for uint;
? ? event Transfer(
? ? ? ? address indexed _from,
? ? ? ? address indexed _to,
? ? ? ? uint256 _value
? ? );
? ? event Approval(
? ? ? ? address indexed _owner,
? ? ? ? address indexed _spender,
? ? ? ? uint256 _value
? ? );
? ? string public symbol;
? ? string public name;
? ? uint8 public decimals;
? ? uint public totalSupply;
? ? mapping(address => uint) balances;
? ? mapping(address => mapping(address => uint)) allowed;
? ? constructor() public {
? ? ? ? symbol = 'XXX';
? ? ? ? name = 'XXX Token';
? ? ? ? decimals = 18;
? ? ? ? totalSupply = 1000000000 * 10**uint(decimals);
? ? ? ? balances[msg.sender] = totalSupply;
? ? ? ? emit Transfer(address(0), msg.sender, totalSupply);
? ? }
? ? function balanceOf(address _owner)
? ? ? ? public
? ? ? ? view
? ? ? ? returns (uint balance)
? ? {
? ? ? ? return balances[_owner];
? ? }
? ? function transfer(address _to, uint _value) public returns (bool success) {
? ? ? ? balances[msg.sender] = balances[msg.sender].sub(_value);
? ? ? ? balances[_to] = balances[_to].add(_value);
? ? ? ? emit Transfer(msg.sender, _to, _value);
? ? ? ? return true;
? ? }
? ? function transferFrom(address _from, address _to, uint _value)
? ? ? ? public
? ? ? ? returns (bool success)
? ? {
? ? ? ? balances[_from] = balances[_from].sub(_value);
? ? ? ? allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
? ? ? ? balances[_to] = balances[_to].add(_value);
? ? ? ? emit Transfer(_from, _to, _value);
? ? ? ? return true;
? ? }
? ? function approve(address _spender, uint _value)
? ? ? ? public
? ? ? ? returns (bool success)
? ? {
? ? ? ? allowed[msg.sender][_spender] = _value;
? ? ? ? emit Approval(msg.sender, _spender, _value);
? ? ? ? return true;
? ? }
? ? function allowance(address _owner, address _spender)
? ? ? ? public
? ? ? ? view
? ? ? ? returns (uint remaining)
? ? {
? ? ? ? return allowed[_owner][_spender];
? ? }
}
3 Config truffle-config.js
const mnemonic = 'your 12 words';
const HDWalletProvider = require('@truffle/hdwallet-provider');
module.exports = {
? networks: {
? ? // Useful for testing. The `development` name is special - truffle uses it by default
? ? // if it's defined here and no other network is specified at the command line.
? ? // You should run a client (like ganache-cli, geth or parity) in a separate terminal
? ? // tab if you use this network and you must also set the `host`, `port` and `network_id`
? ? // options below to some value.
? ? //
? ? // development: {
? ? //? host: "127.0.0.1",? ? // Localhost (default: none)
? ? //? port: 8545,? ? ? ? ? ? // Standard Ethereum port (default: none)
? ? //? network_id: "*",? ? ? // Any network (default: none)
? ? // },
? ? // Another network with more advanced options...
? ? // advanced: {
? ? ? // port: 8777,? ? ? ? ? ? // Custom port
? ? ? // network_id: 1342,? ? ? // Custom network
? ? ? // gas: 8500000,? ? ? ? ? // Gas sent with each transaction (default: ~6700000)
? ? ? // gasPrice: 20000000000,? // 20 gwei (in wei) (default: 100 gwei)
? ? ? // from: <address>,? ? ? ? // Account to send txs from (default: accounts[0])
? ? ? // websockets: true? ? ? ? // Enable EventEmitter interface for web3 (default: false)
? ? // },
? ? // Useful for deploying to a public network.
? ? // NB: It's important to wrap the provider as a function.
? ? ropsten: {
? ? ? provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR_PROJECT_ID`),
? ? ? network_id: 3,? ? ? // Ropsten's id
? ? ? gas: 5500000,? ? ? ? // Ropsten has a lower block limit than mainnet
? ? ? confirmations: 0,? ? // # of confs to wait between deployments. (default: 0)
? ? ? timeoutBlocks: 50,? // # of blocks before a deployment times out? (minimum/default: 50)
? ? ? skipDryRun: true? ? // Skip dry run before migrations? (default: false for public nets )
? ? },
? ? // Useful for private networks
? ? // private: {
? ? ? // provider: () => new HDWalletProvider(mnemonic, `https://network.io`),
? ? ? // network_id: 2111,? // This network is yours, in the cloud.
? ? ? // production: true? ? // Treats this network as if it was a public net. (default: false)
? ? // }
? },
? // Set default mocha options here, use special reporters etc.
? mocha: {
? ? // timeout: 100000
? },
? // Configure your compilers
? compilers: {
? ? solc: {
? ? ? // version: "0.5.1",? ? // Fetch exact version from solc-bin (default: truffle's version)
? ? ? // docker: true,? ? ? ? // Use "0.5.1" you've installed locally with docker (default: false)
? ? ? // settings: {? ? ? ? ? // See the solidity docs for advice about optimization and evmVersion
? ? ? //? optimizer: {
? ? ? //? ? enabled: false,
? ? ? //? ? runs: 200
? ? ? //? },
? ? ? //? evmVersion: "byzantium"
? ? ? // }
? ? }
? }
}
4 Add 2_deploy_contracts.js
const Token = artifacts.require('Token');
module.exports = (deployer) => {
? deployer.deploy(Token);
};
5 Deploy contracts
truffle migrate --network ropsten (--reset)