Developing the ERC-20 Token

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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容