/**
* Source Code first verified at https://etherscan.io on Friday, May 3, 2019
(UTC) */
pragma solidity ^0.5.7;
// Voken Team Fund
// Freezed till 2021-06-30 23:59:59, (timestamp 1625039999).
// Release 10% per 3 months.
//
// More info:
// https://vision.network
// https://voken.io
//
// Contact us:
// [email protected]
// [email protected]
/**
* @title SafeMath
* @dev Unsigned math operations with safety checks that revert on error.
*/
library SafeMath {
/**
* @dev Adds two unsigned integers, reverts on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
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) {
assert(b <= a);
return a - b;
}
/**
* @dev Multiplies two unsigned integers, reverts on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
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) {
assert(b > 0);
uint256 c = a / b;
assert(a == b * c + a % b);
return a / b;
}
/**
* @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);
return a % b;
}
}
/**
* @title Ownable
*/
contract Ownable {
address internal _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract
* to the sender account.
*/
constructor () internal {
_owner = msg.sender;
emit OwnershipTransferred(address(0), _owner);
}
/**
* @return the address of the owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == _owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0));
_owner = newOwner;
emit OwnershipTransferred(_owner, newOwner);
}
/**
* @dev Withdraw Ether
*/
function withdrawEther(address payable to, uint256 amount) external onlyOwner {
require(to != address(0));
uint256 balance = address(this).balance;
require(balance >= amount);
to.transfer(amount);
}
}
/**
* @title ERC20 interface
* @dev see https://eips.ethereum.org/EIPS/eip-20
*/
interface IERC20{
function balanceOf(address owner) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
}
/**
* @title Voken Team Fund
*/
contract VokenTeamFund is Ownable{
using SafeMath for uint256;
IERC20 public VOKEN;
uint256 private _till = 1625039999;
uint256 private _vokenAmount = 4200000000000000; // 4.2 billion
uint256 private _3mo = 2592000; // Three months: 2,592,000 seconds
uint256[10] private _freezedPct = [
100, // 100%
90, // 90%
80, // 80%
70, // 70%
60, // 60%
50, // 50%
40, // 40%
30, // 30%
20, // 20%
10 // 10%
];
event Donate(address indexed account, uint256 amount);
/**
* @dev constructor
*/
constructor() public {
VOKEN = IERC20(0x82070415FEe803f94Ce5617Be1878503e58F0a6a);
}
/**
* @dev Voken freezed amount.
*/
function vokenFreezed() public view returns (uint256) {
uint256 __freezed;
if (now > _till) {
uint256 __qrPassed = now.sub(_till).div(_3mo);
if (__qrPassed >= 10) {
__freezed = 0;
}
else {
__freezed = _vokenAmount.mul(_freezedPct[__qrPassed]).div(100);
}
return __freezed;
}
return _vokenAmount;
}
/**
* @dev Donate
*/
function () external payable {
emit Donate(msg.sender, msg.value);
}
/**
* @dev transfer Voken
*/
function transferVoken(address to, uint256 amount) external onlyOwner {
uint256 __freezed = vokenFreezed();
uint256 __released = VOKEN.balanceOf(address(this)).sub(__freezed);
require(__released >= amount);
assert(VOKEN.transfer(to, amount));
}
/**
* @dev Rescue compatible ERC20 Token, except "Voken"
*
* @param tokenAddr ERC20 The address of the ERC20 token contract
* @param receiver The address of the receiver
* @param amount uint256
*/
function rescueTokens(address tokenAddr, address receiver, uint256 amount) external onlyOwner {
IERC20 _token = IERC20(tokenAddr);
require(VOKEN != _token);
require(receiver != address(0));
uint256 balance = _token.balanceOf(address(this));
require(balance >= amount);
assert(_token.transfer(receiver, amount));
}
}