文件 1 的 1:RPGTokenWithProtection.sol
pragma solidity 0.5.17;
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
}
contract BurnRole {
using Roles for Roles.Role;
event BurnerAdded(address indexed account);
event BurnerRemoved(address indexed account);
Roles.Role private _burners;
constructor () internal {
_addBurner(msg.sender);
}
modifier onlyBurner() {
require(isBurner(msg.sender));
_;
}
function isBurner(address account) public view returns (bool) {
return _burners.has(account);
}
function addBurner(address account) public onlyBurner {
_addBurner(account);
}
function renounceBurner() public {
_removeBurner(msg.sender);
}
function _addBurner(address account) internal {
_burners.add(account);
emit BurnerAdded(account);
}
function _removeBurner(address account) internal {
_burners.remove(account);
emit BurnerRemoved(account);
}
}
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;
}
}
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);
}
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);
}
}
contract ERC20Burnable is ERC20, BurnRole{
function burn(uint256 value) public onlyBurner returns (bool){
_burn(msg.sender, value);
return true;
}
}
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) external 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);
}
}
contract ERC20Mintable is ERC20, MinterRole{
function mint(address to, uint256 value) external onlyMinter returns (bool) {
_mint(to, value);
return true;
}
}
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);
}
}
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;
}
}
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;
}
}
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];
}
}
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require((value == 0) || (token.allowance(address(this), spender) == 0));
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function callOptionalReturn(IERC20 token, bytes memory data) private {
require(address(token).isContract());
(bool success, bytes memory returndata) = address(token).call(data);
require(success);
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)));
}
}
}
contract RPGBurn is Ownable {
using Address for address;
using SafeMath for uint256;
ERC20Burnable private _token;
constructor(ERC20Burnable token) public {
_token = token;
}
function burn(uint256 value) onlyOwner public {
_token.burn(value);
}
}
contract RPG is
ERC20,
ERC20Detailed,
ERC20Burnable,
ERC20Capped,
Ownable
{
using Address for address;
uint256 public constant INITIAL_SUPPLY = 21000000 * (10**18);
mapping(address => uint8) public limit;
RPGBurn public burnContract;
constructor(string memory name, string memory symbol)
public
Ownable()
ERC20Capped(INITIAL_SUPPLY)
ERC20Burnable()
ERC20Detailed(name, symbol, 18)
ERC20()
{
_mint(msg.sender, INITIAL_SUPPLY);
burnContract = new RPGBurn(this);
addBurner(address(burnContract));
}
function setTransferLimit(address addr, uint8 mode) public onlyOwner {
require(mode == 0 || mode == 1 || mode == 2);
if (mode == 0) {
delete limit[addr];
} else {
limit[addr] = mode;
}
}
function transfer(address to, uint256 value) public returns (bool) {
require(limit[msg.sender] != 1, 'from address is limited.');
require(limit[to] != 2, 'to address is limited.');
_transfer(msg.sender, to, value);
return true;
}
function burnFromContract(uint256 value) onlyBurner public {
burnContract.burn(value);
}
}
contract RPGVesting is Ownable {
using Address for address;
using SafeMath for uint256;
RPG private _token;
RPGVestingA private _investors = RPGVestingA(0);
RPGVestingB private _incubator_adviser;
RPGVestingC private _development;
RPGVestingD private _community;
RPGVestingE private _fund;
uint256 public INITIAL_SUPPLY;
event event_debug(uint256 amount);
constructor() public {
}
function init(
RPG token,RPGVestingA investors_addr,RPGVestingB incubator_adviser_addr,RPGVestingC development_addr,RPGVestingD community_addr,RPGVestingE fund_addr,
address[] memory investors,
uint256[] memory investors_number,
address[] memory incubator_advisers,
uint256[] memory incubator_advisers_number,
address developments,
address community,
address[3] memory fund
) public onlyOwner {
require(address(_investors) == address(0));
require(address(token) != address(0));
require(address(investors_addr) != address(0));
require(address(incubator_adviser_addr) != address(0));
require(address(development_addr) != address(0));
require(address(community_addr) != address(0));
require(address(fund_addr) != address(0));
require(investors.length == investors_number.length);
require(incubator_advisers.length == incubator_advisers_number.length);
require(developments != address(0));
require(community != address(0));
require(fund[0] != address(0));
require(fund[1] != address(0));
require(fund[2] != address(0));
_token = token;
_investors = investors_addr;
_incubator_adviser = incubator_adviser_addr;
_development = development_addr;
_community = community_addr;
_fund = fund_addr;
INITIAL_SUPPLY = _token.INITIAL_SUPPLY();
require(_token.balanceOf(address(this)) == INITIAL_SUPPLY);
require(_investors.init(_token,INITIAL_SUPPLY.mul(10).div(100),investors,investors_number));
require(_incubator_adviser.init(_token,INITIAL_SUPPLY.mul(7).div(100),incubator_advisers,incubator_advisers_number));
require(_development.init(_token,developments,INITIAL_SUPPLY.mul(14).div(100)));
require(_community.init(_token,community,INITIAL_SUPPLY.mul(49).div(100)));
require(_fund.init(_token,fund,INITIAL_SUPPLY.mul(20).div(100)));
_token.transfer(address(_investors) , _investors.total());
_token.transfer(address(_incubator_adviser) , _incubator_adviser.total());
_token.transfer(address(_development) , _development.total());
_token.transfer(address(_community) , _community.total());
_token.transfer(address(_fund) , _fund.total());
}
function StartIDO(uint256 start) public onlyOwner {
require(start >= block.timestamp);
_investors.setStart(start);
_fund.setStart(start);
}
function StartMainnet(uint256 start) public onlyOwner {
require(start >= block.timestamp);
require(start >= _investors.start());
_incubator_adviser.setStart(start);
_development.setStart(start);
_community.setStart(start);
}
function StartInvestorsClaim() public onlyOwner {
require(_investors.start() > 0 && _investors.start() < block.timestamp);
_investors.setcanclaim();
}
function investors() public view returns (address) {
return address(_investors);
}
function incubator_adviser() public view returns (address) {
return address(_incubator_adviser);
}
function development() public view returns (address) {
return address(_development);
}
function community() public view returns (address) {
return address(_community);
}
function fund() public view returns (address) {
return address(_fund);
}
function unlocked_investors_vesting(address user) public view returns(uint256) {
return _investors.calcvesting(user);
}
function unlocked_incubator_adviser_vesting(address user) public view returns(uint256) {
return _incubator_adviser.calcvesting(user);
}
function unlocked_development_vesting() public view returns(uint256) {
return _development.calcvesting();
}
function unlocked_community_vesting() public view returns(uint256) {
return _community.calcvesting();
}
function claimed_investors(address user) public view returns(uint256){
return _investors.claimed(user);
}
function claimed_incubator_adviser(address user) public view returns(uint256){
return _incubator_adviser.claimed(user);
}
function claimed_development() public view returns(uint256){
return _development.claimed();
}
function claimed_community() public view returns(uint256){
return _community.claimed();
}
function investors_changeaddress(address oldaddr,address newaddr) onlyOwner public{
require(newaddr != address(0));
_investors.changeaddress(oldaddr,newaddr);
}
function incubator_adviser_changeaddress(address oldaddr,address newaddr) onlyOwner public{
require(newaddr != address(0));
_incubator_adviser.changeaddress(oldaddr,newaddr);
}
function community_changeaddress(address newaddr) onlyOwner public{
require(newaddr != address(0));
_community.changeaddress(newaddr);
}
}
contract RPGVestingA {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using Address for address;
address _vestingaddr;
IERC20 private _token;
uint256 private _total;
uint256 private _start = 0;
bool private _canclaim = false;
address[] private _beneficiarys;
uint256 constant _duration = 86400;
uint256 constant _releasealldays = 400;
mapping(address => uint256) private _beneficiary_total;
mapping(address => uint256) private _released;
event event_set_can_claim();
event event_claimed(address user,uint256 amount);
event event_change_address(address oldaddr,address newaddr);
constructor(address addr) public {
require(addr != address(0));
_vestingaddr = addr;
}
function init(IERC20 token, uint256 total,address[] memory beneficiarys,uint256[] memory amounts) public returns(bool) {
require(_vestingaddr == msg.sender);
require(_beneficiarys.length == 0);
require(address(token) != address(0));
require(total > 0);
require(beneficiarys.length == amounts.length);
_token = token;
_total = total;
uint256 all = 0;
for(uint256 i = 0 ; i < amounts.length; i++)
{
all = all.add(amounts[i]);
}
require(all == _total);
_beneficiarys = beneficiarys;
for(uint256 i = 0 ; i < _beneficiarys.length; i++)
{
_beneficiary_total[_beneficiarys[i]] = amounts[i];
_released[_beneficiarys[i]] = 0;
}
return true;
}
function setStart(uint256 newStart) public {
require(_vestingaddr == msg.sender);
require(newStart > 0 && _start == 0);
_start = newStart;
}
function start() public view returns (uint256) {
return _start;
}
function beneficiary() public view returns (address[] memory) {
return _beneficiarys;
}
function beneficiarytotal(address addr) public view returns (uint256) {
require(_beneficiary_total[addr] != 0,'not in beneficiary list');
return _beneficiary_total[addr];
}
function total() public view returns (uint256) {
return _total;
}
function canclaim() public view returns (bool) {
return _canclaim;
}
function setcanclaim() public {
require(_vestingaddr == msg.sender);
require(!_canclaim,'_canclaim is not false!');
_canclaim = true;
emit event_set_can_claim();
}
function calcvesting(address user) public view returns(uint256) {
require(_start > 0);
require(block.timestamp >= _start);
require(_beneficiary_total[user] > 0);
uint256 daynum = block.timestamp.sub(_start).div(_duration);
if(daynum <= _releasealldays)
{
return _beneficiary_total[user].mul(daynum).div(_releasealldays);
}
else
{
return _beneficiary_total[user];
}
}
function claim() public returns(uint256) {
require(_start > 0);
require(_beneficiary_total[msg.sender] > 0);
require(_canclaim,'claim not allowed!');
uint256 amount = calcvesting(msg.sender).sub(_released[msg.sender]);
if(amount > 0)
{
_released[msg.sender] = _released[msg.sender].add(amount);
_token.safeTransfer(msg.sender,amount);
emit event_claimed(msg.sender,amount);
}
return amount;
}
function claimed(address user) public view returns(uint256) {
require(_start > 0);
return _released[user];
}
function changeaddress(address oldaddr,address newaddr) public {
require(_beneficiarys.length > 0);
require(_beneficiary_total[newaddr] == 0);
if(msg.sender == _vestingaddr)
{
for(uint256 i = 0 ; i < _beneficiarys.length; i++)
{
if(_beneficiarys[i] == oldaddr)
{
_beneficiarys[i] = newaddr;
_beneficiary_total[newaddr] = _beneficiary_total[oldaddr];
_beneficiary_total[oldaddr] = 0;
_released[newaddr] = _released[oldaddr];
_released[oldaddr] = 0;
emit event_change_address(oldaddr,newaddr);
return;
}
}
}
else
{
require(msg.sender == oldaddr);
for(uint256 i = 0 ; i < _beneficiarys.length; i++)
{
if(_beneficiarys[i] == msg.sender)
{
_beneficiarys[i] = newaddr;
_beneficiary_total[newaddr] = _beneficiary_total[msg.sender];
_beneficiary_total[msg.sender] = 0;
_released[newaddr] = _released[msg.sender];
_released[msg.sender] = 0;
emit event_change_address(msg.sender,newaddr);
return;
}
}
}
}
}
contract RPGVestingB {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using Address for address;
address _vestingaddr;
IERC20 private _token;
address[] private _beneficiarys;
uint256 private _total;
uint256 private _start = 0;
uint256 constant _duration = 86400;
uint256 constant _releaseperiod = 180;
mapping(address => uint256) private _beneficiary_total;
mapping(address => uint256) private _released;
event event_claimed(address user,uint256 amount);
event event_change_address(address oldaddr,address newaddr);
constructor(address addr) public {
require(addr != address(0));
_vestingaddr = addr;
}
function init(IERC20 token,uint256 total,address[] memory beneficiarys,uint256[] memory amounts) public returns(bool) {
require(_vestingaddr == msg.sender);
require(_beneficiarys.length == 0);
require(address(token) != address(0));
require(total > 0);
require(beneficiarys.length == amounts.length);
_token = token;
_total = total;
uint256 all = 0;
for(uint256 i = 0 ; i < amounts.length; i++)
{
all = all.add(amounts[i]);
}
require(all == _total);
_beneficiarys = beneficiarys;
for(uint256 i = 0 ; i < _beneficiarys.length; i++)
{
_beneficiary_total[_beneficiarys[i]] = amounts[i];
_released[_beneficiarys[i]] = 0;
}
return true;
}
function beneficiary() public view returns (address[] memory) {
return _beneficiarys;
}
function beneficiarytotal(address addr) public view returns (uint256) {
require(_beneficiary_total[addr] != 0,'not in beneficiary list');
return _beneficiary_total[addr];
}
function total() public view returns (uint256) {
return _total;
}
function start() public view returns (uint256) {
return _start;
}
function setStart(uint256 newStart) public {
require(_vestingaddr == msg.sender);
require(newStart > 0 && _start == 0);
_start = newStart;
}
function calcvesting(address user) public view returns(uint256) {
require(_start > 0);
require(block.timestamp >= _start);
require(_beneficiary_total[user] > 0);
uint256 daynum = block.timestamp.sub(_start).div(_duration);
uint256 counts180 = daynum.div(_releaseperiod);
uint256 dayleft = daynum.mod(_releaseperiod);
uint256 amount180 = 0;
uint256 thistotal = _beneficiary_total[user].mul(8).div(100);
for(uint256 i = 0; i< counts180; i++)
{
amount180 = amount180.add(thistotal);
thistotal = thistotal.mul(92).div(100);
}
return amount180.add(thistotal.mul(dayleft).div(_releaseperiod));
}
function claim() public returns(uint256) {
require(_start > 0);
require(_beneficiary_total[msg.sender] > 0);
uint256 amount = calcvesting(msg.sender).sub(_released[msg.sender]);
if(amount > 0)
{
_released[msg.sender] = _released[msg.sender].add(amount);
_token.safeTransfer(msg.sender,amount);
emit event_claimed(msg.sender,amount);
}
return amount;
}
function claimed(address user) public view returns(uint256) {
require(_start > 0);
return _released[user];
}
function changeaddress(address oldaddr,address newaddr) public {
require(_beneficiarys.length > 0);
require(_beneficiary_total[newaddr] == 0);
if(msg.sender == _vestingaddr)
{
for(uint256 i = 0 ; i < _beneficiarys.length; i++)
{
if(_beneficiarys[i] == oldaddr)
{
_beneficiarys[i] = newaddr;
_beneficiary_total[newaddr] = _beneficiary_total[oldaddr];
_beneficiary_total[oldaddr] = 0;
_released[newaddr] = _released[oldaddr];
_released[oldaddr] = 0;
emit event_change_address(oldaddr,newaddr);
return;
}
}
}
else
{
require(msg.sender == oldaddr);
for(uint256 i = 0 ; i < _beneficiarys.length; i++)
{
if(_beneficiarys[i] == msg.sender)
{
_beneficiarys[i] = newaddr;
_beneficiary_total[newaddr] = _beneficiary_total[msg.sender];
_beneficiary_total[msg.sender] = 0;
_released[newaddr] = _released[msg.sender];
_released[msg.sender] = 0;
emit event_change_address(msg.sender,newaddr);
return;
}
}
}
}
}
contract RPGVestingC {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using Address for address;
address _vestingaddr;
event event_claimed(address user,uint256 amount);
IERC20 private _token;
uint256 private _total;
uint256 constant _duration = 86400;
uint256 constant _releaseperiod = 180;
uint256 private _released = 0;
address private _beneficiary = address(0);
uint256 private _start = 0;
constructor (address addr) public {
require(addr != address(0));
_vestingaddr = addr;
}
function init(IERC20 token,address beneficiary, uint256 total) public returns(bool){
require(_vestingaddr == msg.sender);
require(_beneficiary == address(0));
require(address(token) != address(0));
require(beneficiary != address(0));
require(total > 0);
_token = token;
_beneficiary = beneficiary;
_total = total;
return true;
}
function beneficiary() public view returns (address) {
return _beneficiary;
}
function start() public view returns (uint256) {
return _start;
}
function total() public view returns (uint256) {
return _total;
}
function setStart(uint256 newStart) public {
require(_vestingaddr == msg.sender);
require(newStart > 0 && _start == 0);
_start = newStart;
}
function calcvesting() public view returns(uint256) {
require(_start > 0);
require(block.timestamp >= _start);
uint256 daynum = block.timestamp.sub(_start).div(_duration);
uint256 counts180 = daynum.div(_releaseperiod);
uint256 dayleft = daynum.mod(_releaseperiod);
uint256 amount180 = 0;
uint256 thistotal = _total.mul(8).div(100);
for(uint256 i = 0; i< counts180; i++)
{
amount180 = amount180.add(thistotal);
thistotal = thistotal.mul(92).div(100);
}
return amount180.add(thistotal.mul(dayleft).div(_releaseperiod));
}
function claim() public returns(uint256) {
require(_start > 0);
uint256 amount = calcvesting().sub(_released);
if(amount > 0)
{
_released = _released.add(amount);
_token.safeTransfer(_beneficiary,amount);
emit event_claimed(msg.sender,amount);
}
return amount;
}
function claimed() public view returns(uint256) {
require(_start > 0);
return _released;
}
}
contract RPGVestingD {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using Address for address;
address _vestingaddr;
event event_claimed(address user,uint256 amount);
IERC20 private _token;
uint256 private _total;
uint256 constant _duration = 86400;
uint256 constant _releaseperiod = 180;
uint256 private _released = 0;
address private _beneficiary = address(0);
uint256 private _start = 0;
constructor (address addr) public {
require(addr != address(0));
_vestingaddr = addr;
}
function init(IERC20 token,address beneficiary, uint256 total) public returns(bool){
require(_vestingaddr == msg.sender);
require(_beneficiary == address(0));
require(address(token) != address(0));
require(beneficiary != address(0));
require(total > 0);
_token = token;
_beneficiary = beneficiary;
_total = total;
return true;
}
function beneficiary() public view returns (address) {
return _beneficiary;
}
function start() public view returns (uint256) {
return _start;
}
function total() public view returns (uint256) {
return _total;
}
function setStart(uint256 newStart) public {
require(_vestingaddr == msg.sender);
require(newStart > 0 && _start == 0);
_start = newStart;
}
function calcvesting() public view returns(uint256) {
require(_start > 0);
require(block.timestamp >= _start);
uint256 daynum = block.timestamp.sub(_start).div(_duration);
uint256 counts180 = daynum.div(_releaseperiod);
uint256 dayleft = daynum.mod(_releaseperiod);
uint256 amount180 = 0;
uint256 thistotal = _total.mul(8).div(100);
for(uint256 i = 0; i< counts180; i++)
{
amount180 = amount180.add(thistotal);
thistotal = thistotal.mul(92).div(100);
}
return amount180.add(thistotal.mul(dayleft).div(_releaseperiod));
}
function claim() public returns(uint256) {
require(_start > 0);
uint256 amount = calcvesting().sub(_released);
if(amount > 0)
{
_released = _released.add(amount);
_token.safeTransfer(_beneficiary,amount);
emit event_claimed(_beneficiary,amount);
}
return amount;
}
function claimed() public view returns(uint256) {
require(_start > 0);
return _released;
}
function changeaddress(address newaddr) public {
require(_beneficiary != address(0));
require(msg.sender == _vestingaddr);
_token.safeTransferFrom(_beneficiary,newaddr,_token.balanceOf(_beneficiary));
_beneficiary = newaddr;
}
}
contract RPGVestingE {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using Address for address;
address _vestingaddr;
event event_claimed(address user,uint256 amount);
IERC20 private _token;
uint256 private _total;
address[3] private _beneficiarys;
uint256 private _start = 0;
constructor (address addr) public {
require(addr != address(0));
_vestingaddr = addr;
}
function init(IERC20 token,address[3] memory beneficiarys, uint256 total) public returns(bool){
require(_vestingaddr == msg.sender);
require(_beneficiarys[0] == address(0),'Initialize only once!');
require(address(token) != address(0));
require(beneficiarys[0] != address(0));
require(beneficiarys[1] != address(0));
require(beneficiarys[2] != address(0));
require(total > 0);
_token = token;
_beneficiarys = beneficiarys;
_total = total;
return true;
}
function beneficiary() public view returns (address[3] memory) {
return _beneficiarys;
}
function start() public view returns (uint256) {
return _start;
}
function total() public view returns (uint256) {
return _total;
}
function setStart(uint256 newStart) public {
require(_vestingaddr == msg.sender);
require(newStart > 0 && _start == 0);
_start = newStart;
}
function claim() public returns(uint256){
require(_start > 0);
_token.safeTransfer(_beneficiarys[0], _total.mul(8).div(20));
emit event_claimed(_beneficiarys[0],_total.mul(8).div(20));
_token.safeTransfer(_beneficiarys[1], _total.mul(7).div(20));
emit event_claimed(_beneficiarys[1],_total.mul(7).div(20));
_token.safeTransfer(_beneficiarys[2], _total.mul(5).div(20));
emit event_claimed(_beneficiarys[2],_total.mul(5).div(20));
return _total;
}
function claimed() public view returns(uint256) {
require(_start > 0);
uint256 amount0 = _token.balanceOf(_beneficiarys[0]);
uint256 amount1 = _token.balanceOf(_beneficiarys[1]);
uint256 amount2 = _token.balanceOf(_beneficiarys[2]);
return amount0.add(amount1).add(amount2);
}
}
contract RPGVestingF is Ownable{
using SafeMath for uint256;
using SafeERC20 for IERC20;
using Address for address;
IERC20 private _token;
uint256 private _total;
uint256 private _start = 0;
address[] private _beneficiarys;
uint256 constant _duration = 86400;
uint256 _releasealldays;
mapping(address => uint256) private _beneficiary_total;
mapping(address => uint256) private _released;
event event_set_can_claim();
event event_claimed(address user,uint256 amount);
event event_change_address(address oldaddr,address newaddr);
constructor(uint256 releasealldays) public {
require(releasealldays > 0);
_releasealldays = releasealldays;
}
function init(IERC20 token, uint256 total,address[] calldata beneficiarys,uint256[] calldata amounts) external onlyOwner returns(bool) {
require(_beneficiarys.length == 0);
require(address(token) != address(0));
require(total > 0);
require(beneficiarys.length == amounts.length);
_token = token;
_total = total;
uint256 all = 0;
for(uint256 i = 0 ; i < amounts.length; i++)
{
all = all.add(amounts[i]);
}
require(all == _total);
_beneficiarys = beneficiarys;
for(uint256 i = 0 ; i < _beneficiarys.length; i++)
{
_beneficiary_total[_beneficiarys[i]] = amounts[i];
_released[_beneficiarys[i]] = 0;
}
return true;
}
function setStart(uint256 newStart) external onlyOwner{
require(newStart > block.timestamp && _start == 0);
_start = newStart;
}
function start() public view returns (uint256) {
return _start;
}
function beneficiary() public view returns (address[] memory) {
return _beneficiarys;
}
function beneficiarytotal(address addr) public view returns (uint256) {
require(_beneficiary_total[addr] != 0,'not in beneficiary list');
return _beneficiary_total[addr];
}
function total() public view returns (uint256) {
return _total;
}
function calcvesting(address user) public view returns(uint256) {
require(_start > 0);
require(block.timestamp >= _start);
require(_beneficiary_total[user] > 0);
uint256 daynum = block.timestamp.sub(_start).div(_duration);
if(daynum <= _releasealldays)
{
return _beneficiary_total[user].mul(daynum).div(_releasealldays);
}
else
{
return _beneficiary_total[user];
}
}
function claim() external returns(uint256) {
require(_start > 0);
require(_beneficiary_total[msg.sender] > 0);
uint256 amount = calcvesting(msg.sender).sub(_released[msg.sender]);
if(amount > 0)
{
_released[msg.sender] = _released[msg.sender].add(amount);
_token.safeTransfer(msg.sender,amount);
emit event_claimed(msg.sender,amount);
}
return amount;
}
function claimed(address user) public view returns(uint256) {
require(_start > 0);
return _released[user];
}
function changeaddress(address oldaddr,address newaddr) external {
require(newaddr != address(0));
require(_beneficiarys.length > 0);
require(_beneficiary_total[newaddr] == 0);
if(isOwner())
{
for(uint256 i = 0 ; i < _beneficiarys.length; i++)
{
if(_beneficiarys[i] == oldaddr)
{
_beneficiarys[i] = newaddr;
_beneficiary_total[newaddr] = _beneficiary_total[oldaddr];
_beneficiary_total[oldaddr] = 0;
_released[newaddr] = _released[oldaddr];
_released[oldaddr] = 0;
emit event_change_address(oldaddr,newaddr);
return;
}
}
}
else
{
require(msg.sender == oldaddr);
for(uint256 i = 0 ; i < _beneficiarys.length; i++)
{
if(_beneficiarys[i] == msg.sender)
{
_beneficiarys[i] = newaddr;
_beneficiary_total[newaddr] = _beneficiary_total[msg.sender];
_beneficiary_total[msg.sender] = 0;
_released[newaddr] = _released[msg.sender];
_released[msg.sender] = 0;
emit event_change_address(msg.sender,newaddr);
return;
}
}
}
}
}
pragma solidity 0.5.17;
interface IPLPS {
function LiquidityProtection_beforeTokenTransfer(
address _pool, address _from, address _to, uint _amount) external;
function isBlocked(address _pool, address _who) external view returns(bool);
function unblock(address _pool, address[] calldata _whos) external;
}
pragma solidity 0.5.17;
library UniswapV2Library {
function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
}
function pairFor(bytes32 initCodeHash, address factory, address tokenA, address tokenB) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(uint160(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0, token1)),
initCodeHash
)))));
}
}
pragma solidity 0.5.17;
library UniswapV3Library {
bytes32 internal constant POOL_INIT_CODE_HASH = 0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54;
struct PoolKey {
address token0;
address token1;
uint24 fee;
}
function getPoolKey(
address tokenA,
address tokenB,
uint24 fee
) internal pure returns (PoolKey memory) {
if (tokenA > tokenB) (tokenA, tokenB) = (tokenB, tokenA);
return PoolKey({token0: tokenA, token1: tokenB, fee: fee});
}
function computeAddress(address factory, PoolKey memory key) internal pure returns (address pool) {
require(key.token0 < key.token1);
pool = address(
uint160(
uint256(
keccak256(
abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encode(key.token0, key.token1, key.fee)),
POOL_INIT_CODE_HASH
)
)
)
)
);
}
}
pragma solidity 0.5.17;
contract UsingLiquidityProtectionService {
bool private unProtected = false;
IPLPS private plps;
uint64 internal constant HUNDRED_PERCENT = 1e18;
bytes32 internal constant UNISWAP = 0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f;
bytes32 internal constant PANCAKESWAP = 0x00fb7f630766e6a796048ea87d01acd3068e8ff67d078148a3fa3f4a84f69bd5;
bytes32 internal constant QUICKSWAP = 0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f;
enum UniswapVersion {
V2,
V3
}
enum UniswapV3Fees {
_005,
_03,
_1
}
modifier onlyProtectionAdmin() {
protectionAdminCheck();
_;
}
constructor (address _plps) public {
plps = IPLPS(_plps);
}
function LiquidityProtection_setLiquidityProtectionService(IPLPS _plps) external onlyProtectionAdmin() {
plps = _plps;
}
function token_transfer(address from, address to, uint amount) internal;
function token_balanceOf(address holder) internal view returns(uint);
function protectionAdminCheck() internal view;
function uniswapVariety() internal pure returns(bytes32);
function uniswapVersion() internal pure returns(UniswapVersion);
function uniswapFactory() internal pure returns(address);
function counterToken() internal pure returns(address) {
return 0xdAC17F958D2ee523a2206206994597C13D831ec7;
}
function uniswapV3Fee() internal pure returns(UniswapV3Fees) {
return UniswapV3Fees._03;
}
function protectionChecker() internal view returns(bool) {
return ProtectionSwitch_manual();
}
function lps() private view returns(IPLPS) {
return plps;
}
function LiquidityProtection_beforeTokenTransfer(address _from, address _to, uint _amount) internal {
if (protectionChecker()) {
if (unProtected) {
return;
}
lps().LiquidityProtection_beforeTokenTransfer(getLiquidityPool(), _from, _to, _amount);
}
}
function revokeBlocked(address[] calldata _holders, address _revokeTo) external onlyProtectionAdmin() {
require(isProtected(), 'UsingLiquidityProtectionService: protection removed');
bool unProtectedOld = unProtected;
unProtected = true;
address pool = getLiquidityPool();
for (uint i = 0; i < _holders.length; i++) {
address holder = _holders[i];
if (lps().isBlocked(pool, holder)) {
token_transfer(holder, _revokeTo, token_balanceOf(holder));
}
}
unProtected = unProtectedOld;
}
function LiquidityProtection_unblock(address[] calldata _holders) external onlyProtectionAdmin() {
require(protectionChecker(), 'UsingLiquidityProtectionService: protection removed');
address pool = getLiquidityPool();
lps().unblock(pool, _holders);
}
function disableProtection() external onlyProtectionAdmin() {
unProtected = true;
}
function isProtected() public view returns(bool) {
return not(unProtected);
}
function ProtectionSwitch_manual() internal view returns(bool) {
return isProtected();
}
function ProtectionSwitch_timestamp(uint _timestamp) internal view returns(bool) {
return not(passed(_timestamp));
}
function ProtectionSwitch_block(uint _block) internal view returns(bool) {
return not(blockPassed(_block));
}
function blockPassed(uint _block) internal view returns(bool) {
return _block < block.number;
}
function passed(uint _timestamp) internal view returns(bool) {
return _timestamp < block.timestamp;
}
function not(bool _condition) internal pure returns(bool) {
return !_condition;
}
function feeToUint24(UniswapV3Fees _fee) internal pure returns(uint24) {
if (_fee == UniswapV3Fees._03) return 3000;
if (_fee == UniswapV3Fees._005) return 500;
return 10000;
}
function getLiquidityPool() public view returns(address) {
if (uniswapVersion() == UniswapVersion.V2) {
return UniswapV2Library.pairFor(uniswapVariety(), uniswapFactory(), address(this), counterToken());
}
require(uniswapVariety() == UNISWAP, 'LiquidityProtection: uniswapVariety() can only be UNISWAP for V3.');
return UniswapV3Library.computeAddress(uniswapFactory(),
UniswapV3Library.getPoolKey(address(this), counterToken(), feeToUint24(uniswapV3Fee())));
}
}
pragma solidity 0.5.17;
contract RPGTokenWithProtection is
UsingLiquidityProtectionService(0xb00C8c4967e0D6aa30F8E35872ba8Bb0608466BA),
RPG
{
constructor(string memory _name, string memory _symbol) RPG(_name, _symbol) public {
}
function token_transfer(address _from, address _to, uint _amount) internal {
_transfer(_from, _to, _amount);
}
function token_balanceOf(address _holder) internal view returns(uint) {
return balanceOf(_holder);
}
function protectionAdminCheck() internal view onlyOwner {}
function uniswapVariety() internal pure returns(bytes32) {
return UNISWAP;
}
function uniswapVersion() internal pure returns(UniswapVersion) {
return UniswapVersion.V2;
}
function uniswapFactory() internal pure returns(address) {
return 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
}
function _transfer(address _from, address _to, uint _amount) internal {
LiquidityProtection_beforeTokenTransfer(_from, _to, _amount);
super._transfer(_from, _to, _amount);
}
function protectionChecker() internal view returns(bool) {
return ProtectionSwitch_timestamp(1636675199);
}
function counterToken() internal pure returns(address) {
return 0xdAC17F958D2ee523a2206206994597C13D831ec7;
}
}