大螃嗨

好记性不如烂笔头

用户工具

站点工具


trc20

相关链接

安装命令

$ npm install -g tronbox
$ cd Workdir
$ tronbox init
# ... ... Edit Solidity ./contracts/xxx.sol
$ tronbox compile
# ... ... Edit config file ./tronbox.js
$ tronbox migrate

ERC20编译部署合约

官方Example项目

$ git clone https://github.com/sullof/metacoin-box.git
$ tronbox compile
#配置档内容参考下面
$ vi tronbox.js
$ source .env && tronbox migrate --network mainnet

tronbox.js配置档内容

const port = process.env.HOST_PORT || 9090
 
module.exports = {
  networks: {
    mainnet: {
      // Don't put your private key here:
      privateKey: process.env.PRIVATE_KEY_MAINNET,
      /*
Create a .env file (it must be gitignored) containing something like
 
  export PRIVATE_KEY_MAINNET=4E7FECCB71207B867C495B51A9758B104B1D4422088A87F4978BE64636656243
 
Then, run the migration with:
 
  source .env && tronbox migrate --network mainnet
 
*/
      userFeePercentage: 100,
      feeLimit: 1e8,
      fullHost: "https://api.trongrid.io",
      network_id: "1"
    },
    shasta: {
      privateKey: process.env.PRIVATE_KEY_SHASTA,
      userFeePercentage: 50,//这个参数非常重要,如果部署时候报500错误,就把这个值调整成1.参考这个页面的第一条解释https://cn.developers.tron.network/docs/best-practices
      //用户支付比率定义为智能合约用户应支付的费用比率。 因此,例如,如果用户支付比率设置为 60,则用户支付合同成本的 60%。 此参数将接受 0 到 100 之间的任何整数,包括 0 和 100。 但是,强烈建议设置 1 和 99 之间的值。 原因是保护自己,即合同开发者免受恶意无限循环超时攻击。
      feeLimit: 1e8,
      fullHost: "https://api.shasta.trongrid.io",
      network_id: "2"
    }
  }
}

生产环境下的ERC20

tronbox支持的Solidity版本为0.2.24

所以下载openzeppelin-solidity要下载历史版本,不能下载最新版,不然tronbox编译不通过

https://github.com/OpenZeppelin/openzeppelin-solidity/archive/v2.1.0-rc.1.zip

实际编写的代码如下:

pragma solidity ^0.4.24;
  
import "../node_modules/openzeppelin-solidity-2.1.0-rc.1/contracts/token/ERC20/ERC20.sol";
import "../node_modules/openzeppelin-solidity-2.1.0-rc.1/contracts/token/ERC20/ERC20Detailed.sol";

/**
 * @title SimpleToken
 * @dev Very simple ERC20 Token example, where all tokens are pre-assigned to the creator.
 * Note they can later distribute these tokens as they wish using `transfer` and other
 * `ERC20` functions.
 */
contract SimpleToken is ERC20, ERC20Detailed {

    /**
     * @dev Constructor that gives msg.sender all of existing tokens.
     */
    constructor (
    string _name,
    string _symbol,
    uint8 _decimals,
    uint256 _amount
) public ERC20Detailed(_name, _symbol, _decimals) {
        _mint(msg.sender, _amount * (10 ** uint256(decimals())));
    }
}

编译脚本如下migrations/1_initial_migration.js :

var TRACoin = artifacts.require("./TRACoin.sol");

module.exports = function(deployer) {
  deployer.deploy(TRACoin, "TRAToken", "TRA", 18, 100000000);
};

继承和调用关系

方法解释

所有的ERC20代币都是按照下面这些方法来定义的。

name

function name() constant returns (string name) 

返回string类型的ERC20代币的名字,例如:StatusNetwork

symbol

function symbol() constant returns (string symbol)

返回string类型的ERC20代币的符号,也就是代币的简称,例如:SNT。

decimals

function decimals() constant returns (uint8 decimals)

支持几位小数点后几位。如果设置为3。也就是支持0.001表示。

totalSupply

function totalSupply() constant returns (uint256 totalSupply)

发行代币的总量,可以通过这个函数来获取。所有智能合约发行的代币总量是一定的,totalSupply必须设置初始值。如果不设置初始值,这个代币发行就说明有问题。

balanceOf

function balanceOf(address _owner) constant returns (uint256 balance)

输入地址,可以获取该地址代币的余额。

transfer

function transfer(address _to, uint256 _value) returns (bool success)

调用transfer函数将自己的token转账给_to地址,_value为转账个数

approve

function approve(address _spender, uint256 _value) returns (bool success)

批准_spender账户从自己的账户转移_value个token。可以分多次转移。

transferFrom

function transferFrom(address _from, address _to, uint256 _value) returns (bool success)

与approve搭配使用,approve批准之后,调用transferFrom函数来转移token。

allowance

function allowance(address _owner, address _spender) constant returns (uint256 remaining)

返回_spender还能提取token的个数。 approve、transferFrom及allowance解释: 账户A有1000个ETH,想允许B账户随意调用100个ETH。A账户按照以下形式调用approve函数approve(B,100)。当B账户想用这100个ETH中的10个ETH给C账户时,则调用transferFrom(A, C, 10)。这时调用allowance(A, B)可以查看B账户还能够调用A账户多少个token。 Events

Transfer

event Transfer(address indexed _from, address indexed _to, uint256 _value)

当成功转移token时,一定要触发Transfer事件

Approval

event Approval(address indexed _owner, address indexed _spender, uint256 _value)

当调用approval函数成功时,一定要触发Approval事件 总结 如果项目方要在以太坊上发行代币来进行融资,一定会按照这个标准来实现相应的函数。

获取TRC20余额

curl -X POST https://api.trongrid.io/wallet/triggersmartcontract -d '{"contract_address":"41270b0f0be9add3057428aa43e8cbde6263fcab28","function_selector":"balanceOf(address)","parameter":"70a0823100000000000000000000004136dc7b96f385a7abed2420e6ec998698c01962e0","fee_limit":1000000,"call_value":0,"owner_address":"41af7968a0778d3a0446f8ed3f4ee9338fd588cec6"}'
 
{"result":{"result":true},"constant_result":["000000000000000000000000000000000000000142c0232e3b9fc712bd1369ee"],"transaction":{"ret":[{}],"visible":false,"txID":"860d4279d5d188f49884021c88704a9e4662db8a8b69d3daa8f0a4d4568f32a0","raw_data":{"contract":[{"parameter":{"value":{"data":"70a08231000000000000000000000041af7968a0778d3a0446f8ed3f4ee9338fd588cec6","owner_address":"41af7968a0778d3a0446f8ed3f4ee9338fd588cec6","contract_address":"41270b0f0be9add3057428aa43e8cbde6263fcab28"},"type_url":"type.googleapis.com/protocol.TriggerSmartContract"},"type":"TriggerSmartContract"}],"ref_block_bytes":"fe19","ref_block_hash":"c0750ce4305b43c6","expiration":1561260411000,"fee_limit":1000000,"timestamp":1561260353684},"raw_data_hex":"0a02fe192208c0750ce4305b43c640f890fd92b82d5a8e01081f1289010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412540a1541af7968a0778d3a0446f8ed3f4ee9338fd588cec6121541270b0f0be9add3057428aa43e8cbde6263fcab28222470a08231000000000000000000000041af7968a0778d3a0446f8ed3f4ee9338fd588cec67094d1f992b82d9001c0843d"}}
trc20.txt · 最后更改: 2019/06/23 05:43 由 螃蟹