ソルソコード
この記事では、独自のトークンを簡単に作成する方法を紹介します。
pragma solidity ^0.4.25;
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/math/SafeMath.sol";
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
contract MarkusToken is IERC20, ERC20Detailed {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowed;
uint256 private _totalSupply;
constructor() public ERC20Detailed("Markus Xamuel Viola", "MXV", 18) {
_balances[msg.sender] = 50000000000;
_totalSupply = 60000000000;
}
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
function balanceOf(address owner) public view returns (uint256) {
return _balances[owner];
}
function allowance(address owner, address spender) public view returns (uint256)
{
return _allowed[owner][spender];
}
function transfer(address to, uint256 value) public returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function approve(address spender, uint256 value) public returns (bool) {
require(spender != address(0));
_allowed[msg.sender][spender] = value;
emit Approval(msg.sender, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value)
public
returns (bool)
{
require(value <= _allowed[from][msg.sender]);
_allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
_transfer(from, to, value);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public returns (bool)
{
require(spender != address(0));
_allowed[msg.sender][spender] = (
_allowed[msg.sender][spender].add(addedValue));
emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool)
{
require(spender != address(0));
_allowed[msg.sender][spender] = (
_allowed[msg.sender][spender].sub(subtractedValue));
emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
return true;
}
function _transfer(address from, address to, uint256 value) internal {
require(value <= _balances[from]);
require(to != address(0));
_balances[from] = _balances[from].sub(value);
_balances[to] = _balances[to].add(value);
emit Transfer(from, to, value);
}
}
討論
このセクションでは、独自のERC20トークンを作成するために、コードスニペットについて説明します。コーディングを始めよう!
ライブラリ
トークンを作成するために3つのライブラリを追加しました。
- IERC20:ERC20トークン標準テンプレート用。
- ERC20Detailed:あなたのトークンをプロファイリングするためのものです。
- SafeMath:最適化された安全な数学演算用。
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/math/SafeMath.sol";
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
コンストラクタと変数
このセクションでは、3つのプライベート変数を設定しました。
- Balance: ウォレット残高の場合。
- Allowed: 転送制限です。
- Total Supply:トークンの供給量です。
コンストラクターでは、ERC20Detailedに契約を延長して必要な情報を追加しました。
- Name: 通貨の作成者です。
- Symbol: 通貨の名前です。
- Decimal:トークンディバイダ。
コンストラクタは1回だけ実行されるので、私は自分が望む量にバランスを設定できます。 総供給量と同じです。
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowed;
uint256 private _totalSupply;
constructor() public ERC20Detailed("Markus Xamuel Viola", "MXV", 18) {
_balances[msg.sender] = 50000000000;
_totalSupply = 60000000000;
}
基本
- balanceOf: Ethereumアドレスのトークンバランスを返します。
- transfer: 選択した住所に金額を振り替える。
- approve: 指定されたアドレスが費やすことができるトークンの量を設定します。
- allowance:私たちに代わってどれくらいの住所が費やされるかを確認する。
- transferFrom: そのアドレスがいくつかのトークンを使うことを許可されている場合、そこから転送するアドレスを指定します。
- event Transfer & event Approval: 出力イベントをブロックチェーンに記録します。
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
function balanceOf(address owner) public view returns (uint256) {
return _balances[owner];
}
function allowance(address owner, address spender) public view returns (uint256)
{
return _allowed[owner][spender];
}
function transfer(address to, uint256 value) public returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function approve(address spender, uint256 value) public returns (bool) {
require(spender != address(0));
_allowed[msg.sender][spender] = value;
emit Approval(msg.sender, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public returns (bool) {
require(value <= _allowed[from][msg.sender]);
_allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
_transfer(from, to, value);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public returns (bool)
{
require(spender != address(0));
_allowed[msg.sender][spender] = (
_allowed[msg.sender][spender].add(addedValue));
emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool)
{
require(spender != address(0));
_allowed[msg.sender][spender] = (
_allowed[msg.sender][spender].sub(subtractedValue));
emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
return true;
}
function _transfer(address from, address to, uint256 value) internal {
require(value <= _balances[from]);
require(to != address(0));
_balances[from] = _balances[from].sub(value);
_balances[to] = _balances[to].add(value);
emit Transfer(from, to, value);
}
確認する
コードは完成したので、Ethereum Remixでこれを試すことができます。 自分でデプロイしてテストする。
https://remix.ethereum.org/
Contract Address:
0xf88cfe808bdc2fcc50715f08143bae84e4563f3f
My Wallet:
0xda1f876435f34756acda6492b1e061c31d1ae52d (新しいトークンを送ってください!)