ERC20TOKEN

EHT ERC20TOKEN 源码分享

pragma solidity ^0.5.1;

contract ERC20Standard {
using SafeMath for uint256;
uint256 public totalSupply;
string public name;
uint8 public decimals;
string public symbol;
address public owner;

mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;

constructor(uint256 _totalSupply, string memory _symbol, string memory _name, uint8 _decimals) public {
symbol = _symbol;
name = _name;
decimals = _decimals;
owner = msg.sender;
totalSupply = SafeMath.mul(_totalSupply ,(10 ** uint256(decimals)));
balances[owner] = totalSupply;
}
//Fix for short address attack against ERC20
modifier onlyPayloadSize(uint size) {
assert(msg.data.length == SafeMath.add(size,4));
_;
}

function balanceOf(address _owner) view public returns (uint256) {
	return balances[_owner];
}

//基础转账功能
function transfer(address _recipient, uint256 _value) onlyPayloadSize(2*32) public returns(bool){
require(_recipient!=address(0));
require(balances[msg.sender] >= _value && _value >= 0);
require(balances[_recipient].add(_value)>= balances[_recipient]);
balances[msg.sender] = balances[msg.sender].sub(_value) ;
balances[_recipient] = balances[_recipient].add(_value) ;
emit Transfer(msg.sender, _recipient, _value);
return true;
}
//权限许可转账功能
function transferFrom(address _from, address _to, uint256 _value) public returns(bool){
require(_to!=address(0));
require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value >= 0);
require(balances[_to].add(_value) >= balances[_to]);
balances[_to] = balances[_to].add(_value);
balances[_from] = balances[_from].sub(_value) ;
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value) ;
emit Transfer(_from, _to, _value);
return true;
}
//权限许可功能
function approve(address _spender, uint256 _value) public returns(bool){
require((_value==0)||(allowed[msg.sender][_spender]==0));
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}

function allowance(address _owner, address _spender) view public returns (uint256) {
	return allowed[_owner][_spender];
}

//Event which is triggered to log all transfers to this contract's event log
event Transfer(
	address indexed _from,
	address indexed _to,
	uint256 _value
	);
	
//Event which is triggered whenever an owner approves a new allowance for a spender.
event Approval(
	address indexed _owner,
	address indexed _spender,
	uint256 _value
	);

}
//安全计算功能
library SafeMath {
/**
* @dev Multiplies two unsigned integers, reverts on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring ‘a’ not being zero, but the
// benefit is lost if ‘b’ is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (a == 0) {
return 0;
}

    uint256 c = a * b;
    require(c / a == b, "SafeMath: multiplication overflow");

    return c;
}

/**
 * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
 */
function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, "SafeMath: division by zero");
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
}

/**
 * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
 */
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a, "SafeMath: subtraction overflow");
    uint256 c = a - b;

    return c;
}

/**
 * @dev Adds two unsigned integers, reverts on overflow.
 */
function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, "SafeMath: addition overflow");

    return c;
}

/**
 * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
 * reverts when dividing by zero.
 */
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0, "SafeMath: modulo by zero");
    return a % b;
}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ERC20是以太坊上的代币标准,Java可以通过以太坊的API(如web3j)来与以太坊进行交互,实现授权转账的代码如下: 1. 授权 ```java //导入web3j相关的类 import org.web3j.abi.datatypes.Address; import org.web3j.abi.datatypes.generated.Uint256; import org.web3j.protocol.Web3j; import org.web3j.protocol.core.DefaultBlockParameterName; import org.web3j.protocol.core.methods.response.TransactionReceipt; import org.web3j.tx.Contract; import org.web3j.tx.ManagedTransaction; import org.web3j.tx.TransactionManager; import org.web3j.tx.gas.DefaultGasProvider; //代币合约地址 String contractAddress = "0x12345..."; //代币转账地址 String fromAddress = "0xabcdef..."; //代币接收地址 String toAddress = "0x123456..."; //代币授权数量 BigInteger tokenAmount = BigInteger.valueOf(10000); //创建web3j实例 Web3j web3j = Web3j.build(new HttpService("https://ropsten.infura.io/v3/your-project-id")); //创建交易管理器 TransactionManager transactionManager = new RawTransactionManager(web3j, credentials); //创建代币合约实例 ERC20Token contract = ERC20Token.load(contractAddress, web3j, transactionManager, DefaultGasProvider.GAS_PRICE, DefaultGasProvider.GAS_LIMIT); //授权代币合约 TransactionReceipt approveReceipt = contract.approve(new Address(toAddress), new Uint256(tokenAmount)).send(); ``` 2. 转账 ```java //代币转账数量 BigInteger transferAmount = BigInteger.valueOf(100); //调用代币合约的transferFrom方法实现转账 TransactionReceipt transferReceipt = contract.transferFrom(new Address(fromAddress), new Address(toAddress), new Uint256(transferAmount)).send(); ``` 以上代码中,`ERC20Token`是自定义的Java类,用于与代币合约进行交互,需要根据代币合约的ABI文件生成。具体生成方法可以参考web3j的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值