文件 1 的 15:ERC20.sol
pragma solidity ^0.5.2;
import "./IERC20.sol";
import "./SafeMath.sol";
contract ERC20 is IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowed;
uint256 private _totalSupply;
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) {
_approve(msg.sender, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public returns (bool) {
_transfer(from, to, value);
_approve(from, msg.sender, _allowed[from][msg.sender].sub(value));
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
_approve(msg.sender, spender, _allowed[msg.sender][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
_approve(msg.sender, spender, _allowed[msg.sender][spender].sub(subtractedValue));
return true;
}
function _transfer(address from, address to, uint256 value) internal {
require(to != address(0));
_balances[from] = _balances[from].sub(value);
_balances[to] = _balances[to].add(value);
emit Transfer(from, to, value);
}
function _mint(address account, uint256 value) internal {
require(account != address(0));
_totalSupply = _totalSupply.add(value);
_balances[account] = _balances[account].add(value);
emit Transfer(address(0), account, value);
}
function _burn(address account, uint256 value) internal {
require(account != address(0));
_totalSupply = _totalSupply.sub(value);
_balances[account] = _balances[account].sub(value);
emit Transfer(account, address(0), value);
}
function _approve(address owner, address spender, uint256 value) internal {
require(spender != address(0));
require(owner != address(0));
_allowed[owner][spender] = value;
emit Approval(owner, spender, value);
}
function _burnFrom(address account, uint256 value) internal {
_burn(account, value);
_approve(account, msg.sender, _allowed[account][msg.sender].sub(value));
}
}
文件 2 的 15:ERC20Burnable.sol
pragma solidity ^0.5.2;
import "./ERC20.sol";
contract ERC20Burnable is ERC20 {
function burn(uint256 value) public {
_burn(msg.sender, value);
}
function burnFrom(address from, uint256 value) public {
_burnFrom(from, value);
}
}
文件 3 的 15:ERC20Capped.sol
pragma solidity ^0.5.2;
import "./ERC20Mintable.sol";
contract ERC20Capped is ERC20Mintable {
uint256 private _cap;
constructor (uint256 cap) public {
require(cap > 0);
_cap = cap;
}
function cap() public view returns (uint256) {
return _cap;
}
function _mint(address account, uint256 value) internal {
require(totalSupply().add(value) <= _cap);
super._mint(account, value);
}
}
文件 4 的 15:ERC20Detailed.sol
pragma solidity ^0.5.2;
import "./IERC20.sol";
contract ERC20Detailed is IERC20 {
string private _name;
string private _symbol;
uint8 private _decimals;
constructor (string memory name, string memory symbol, uint8 decimals) public {
_name = name;
_symbol = symbol;
_decimals = decimals;
}
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public view returns (uint8) {
return _decimals;
}
}
文件 5 的 15:ERC20Mintable.sol
pragma solidity ^0.5.2;
import "./ERC20.sol";
import "./MinterRole.sol";
contract ERC20Mintable is ERC20, MinterRole {
function mint(address to, uint256 value) public onlyMinter returns (bool) {
_mint(to, value);
return true;
}
}
文件 6 的 15:ERC20Pausable.sol
pragma solidity ^0.5.2;
import "./ERC20.sol";
import "./Pausable.sol";
contract ERC20Pausable is ERC20, Pausable {
function transfer(address to, uint256 value) public whenNotPaused returns (bool) {
return super.transfer(to, value);
}
function transferFrom(address from, address to, uint256 value) public whenNotPaused returns (bool) {
return super.transferFrom(from, to, value);
}
function approve(address spender, uint256 value) public whenNotPaused returns (bool) {
return super.approve(spender, value);
}
function increaseAllowance(address spender, uint addedValue) public whenNotPaused returns (bool success) {
return super.increaseAllowance(spender, addedValue);
}
function decreaseAllowance(address spender, uint subtractedValue) public whenNotPaused returns (bool success) {
return super.decreaseAllowance(spender, subtractedValue);
}
}
文件 7 的 15:IERC20.sol
pragma solidity ^0.5.2;
interface IERC20 {
function transfer(address to, uint256 value) external returns (bool);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
function totalSupply() external view returns (uint256);
function balanceOf(address who) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 8 的 15:MinterRole.sol
pragma solidity ^0.5.2;
import "./Roles.sol";
contract MinterRole {
using Roles for Roles.Role;
event MinterAdded(address indexed account);
event MinterRemoved(address indexed account);
Roles.Role private _minters;
constructor () internal {
_addMinter(msg.sender);
}
modifier onlyMinter() {
require(isMinter(msg.sender));
_;
}
function isMinter(address account) public view returns (bool) {
return _minters.has(account);
}
function addMinter(address account) public onlyMinter {
_addMinter(account);
}
function renounceMinter() public {
_removeMinter(msg.sender);
}
function _addMinter(address account) internal {
_minters.add(account);
emit MinterAdded(account);
}
function _removeMinter(address account) internal {
_minters.remove(account);
emit MinterRemoved(account);
}
}
文件 9 的 15:Ownable.sol
pragma solidity ^0.5.2;
contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () internal {
_owner = msg.sender;
emit OwnershipTransferred(address(0), _owner);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(isOwner());
_;
}
function isOwner() public view returns (bool) {
return msg.sender == _owner;
}
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0));
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 10 的 15:Pausable.sol
pragma solidity ^0.5.2;
import "./PauserRole.sol";
contract Pausable is PauserRole {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor () internal {
_paused = false;
}
function paused() public view returns (bool) {
return _paused;
}
modifier whenNotPaused() {
require(!_paused);
_;
}
modifier whenPaused() {
require(_paused);
_;
}
function pause() public onlyPauser whenNotPaused {
_paused = true;
emit Paused(msg.sender);
}
function unpause() public onlyPauser whenPaused {
_paused = false;
emit Unpaused(msg.sender);
}
}
文件 11 的 15:PauserRole.sol
pragma solidity ^0.5.2;
import "./Roles.sol";
contract PauserRole {
using Roles for Roles.Role;
event PauserAdded(address indexed account);
event PauserRemoved(address indexed account);
Roles.Role private _pausers;
constructor () internal {
_addPauser(msg.sender);
}
modifier onlyPauser() {
require(isPauser(msg.sender));
_;
}
function isPauser(address account) public view returns (bool) {
return _pausers.has(account);
}
function addPauser(address account) public onlyPauser {
_addPauser(account);
}
function renouncePauser() public {
_removePauser(msg.sender);
}
function _addPauser(address account) internal {
_pausers.add(account);
emit PauserAdded(account);
}
function _removePauser(address account) internal {
_pausers.remove(account);
emit PauserRemoved(account);
}
}
文件 12 的 15:RaeMintContract.sol
pragma solidity 0.5.7;
import "./RaeToken.sol";
import "Ownable.sol";
contract RaeMintContract is Ownable {
using SafeMath for uint256;
RaeToken private _token;
uint256 constant _pct = 28;
constructor(RaeToken token) Ownable() public
{
_token = token;
}
function bulkMintAggregator(address[] memory addresses, uint256[] memory values, address[] memory aggregators) public onlyOwner returns (bool)
{
if(_token.period() != 0)
{
uint256 totalSent = 0;
require(addresses.length > 0);
require(addresses.length == values.length);
require(addresses.length == aggregators.length);
uint256 addrSize = addresses.length;
uint256 size = addrSize.add(addrSize);
address[] memory bulkAddresses = new address[](size);
uint256[] memory bulkValues = new uint256[](size);
uint256 j = 0;
for(uint256 i = 0; i < addresses.length; ++i)
{
uint256 aggregatorReward = values[i].mul(_pct).div(100);
uint256 creatorReward = values[i].sub(aggregatorReward);
totalSent = totalSent.add(aggregatorReward + creatorReward);
bulkAddresses[j] = addresses[i];
bulkValues[j] = creatorReward;
bulkAddresses[j+1] = aggregators[i];
bulkValues[j+1] = aggregatorReward;
j = j + 2;
}
require(totalSent <= _token.remainingInPeriod());
_token.mintBulk(bulkAddresses, bulkValues);
return true;
}
else
{
_bulkMintFirstPeriod(addresses, values);
return true;
}
}
function _bulkMintFirstPeriod(address[] memory addresses, uint256[] memory values) internal returns (bool) {
require(_token.period() == 0);
require(addresses.length != 0);
require(addresses.length == values.length);
uint256 totalSent = 0;
for(uint256 i =0; i < addresses.length; ++i) totalSent = totalSent.add(values[i]);
require(totalSent <= _token.remainingInPeriod());
_token.mintBulk(addresses, values);
return true;
}
function addMinter(address addr) external onlyOwner returns (bool)
{
_token.addMinter(addr);
return true;
}
function renounceMintingRole() external onlyOwner returns (bool)
{
_token.renounceMinter();
return true;
}
function period() external view returns (uint256){
return _token.period();
}
function mintAmount() external view returns (uint256){
return _token.mintAmount();
}
function tokensRemainingInPeriod() external view returns (uint256) {
return _token.remainingInPeriod();
}
function tokensInPeriod() external view returns (uint256) {
return _token.totalInPeriod();
}
function token() external view returns (address)
{
return address(_token);
}
}
文件 13 的 15:RaeToken.sol
pragma solidity 0.5.7;
import "./ERC20Detailed.sol";
import "./ERC20Burnable.sol";
import "./ERC20Capped.sol";
import "./ERC20Pausable.sol";
contract RaeToken is ERC20Detailed, ERC20Capped, ERC20Burnable, ERC20Pausable {
uint256 private _mintAmount = 216000e18;
uint256 private _mintPeriods = 0;
uint256 private _totalInPeriod = 0;
uint256 constant private _halveEvery = 1700;
mapping (address => uint256) private _balances;
constructor(string memory name, string memory symbol, uint8 decimals, uint256 cap)
ERC20Burnable()
ERC20Mintable()
ERC20Capped(cap)
ERC20Detailed(name, symbol, decimals)
ERC20Pausable()
ERC20()
public
{
_mint(msg.sender, 84000e18);
}
function mintBulk(address[] calldata addresses, uint256[] calldata values) external whenNotPaused onlyMinter returns (bool) {
require(addresses.length > 0);
require(addresses.length == values.length);
for(uint256 i = 0; i < addresses.length; ++i) {
_totalInPeriod = _totalInPeriod.add(values[i]);
_mint(addresses[i], values[i]);
}
require(_totalInPeriod <= _mintAmount);
if( _totalInPeriod == _mintAmount) _updateMintParams();
return true;
}
function period() external view returns (uint256){
return _mintPeriods;
}
function mintAmount() external view returns (uint256){
return _mintAmount;
}
function _updateMintParams() internal returns (bool) {
if(_mintPeriods == 0) _mintAmount = 10000e18;
_mintPeriods = _mintPeriods.add(1);
if(_mintPeriods % _halveEvery == 0) _mintAmount = _mintAmount.div(2);
_totalInPeriod = 0;
return true;
}
function remainingInPeriod() external view returns (uint256) {
return _mintAmount - _totalInPeriod;
}
function totalInPeriod() external view returns (uint256) {
return _totalInPeriod;
}
function mint(address to, uint256 value) public whenNotPaused onlyMinter returns (bool) {
revert();
}
function burn(uint256 value) public whenNotPaused {
super.burn(value);
}
function burnFrom(address from, uint256 value) public whenNotPaused {
super.burnFrom(from, value);
}
}
文件 14 的 15:Roles.sol
pragma solidity ^0.5.2;
library Roles {
struct Role {
mapping (address => bool) bearer;
}
function add(Role storage role, address account) internal {
require(account != address(0));
require(!has(role, account));
role.bearer[account] = true;
}
function remove(Role storage role, address account) internal {
require(account != address(0));
require(has(role, account));
role.bearer[account] = false;
}
function has(Role storage role, address account) internal view returns (bool) {
require(account != address(0));
return role.bearer[account];
}
}
文件 15 的 15:SafeMath.sol
pragma solidity ^0.5.2;
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0);
uint256 c = a / b;
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
uint256 c = a - b;
return c;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0);
return a % b;
}
}
{
"compilationTarget": {
"RaeMintContract.sol": "RaeMintContract"
},
"evmVersion": "byzantium",
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"constant":true,"inputs":[],"name":"mintAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceMintingRole","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[]"},{"name":"values","type":"uint256[]"},{"name":"aggregators","type":"address[]"}],"name":"bulkMintAggregator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"addMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokensInPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensRemainingInPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"period","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]