相关链接
波场USDT:https://tron.network/usdt?lng=zh
合约费用计算器:https://tronstation.io/calculator
发币教程:https://coin.wiki/index.php?title=How_to_create_your_own_TRC20_token_on_Tron
安装命令
$ npm install -g tronbox $ cd Workdir $ tronbox init # ... ... Edit Solidity ./contracts/xxx.sol $ tronbox compile # ... ... Edit config file ./tronbox.js $ tronbox migrate
ERC20编译部署合约
$ 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"}}