Skip to content

Instantly share code, notes, and snippets.

@ParkYongGyu
Created April 25, 2019 12:49
Show Gist options
  • Save ParkYongGyu/d545f1f665d452d1f8658da4b48f28e4 to your computer and use it in GitHub Desktop.
Save ParkYongGyu/d545f1f665d452d1f8658da4b48f28e4 to your computer and use it in GitHub Desktop.
pragma solidity ^0.5.1;
/**
* @title BRRT Coin for brian trading-mining
* @author Brian Park
* See the manuals.
*/
/**
* @title ERC20 Standard Interface
* @dev https://github.com/ethereum/EIPs/issues/20
* removed functions : transferFrom, approve, allowance
* removed events : Approval
* Some functions are restricted.
*/
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address who) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
//function transferFrom(address from, address to, uint256 value) external returns (bool);
//function approve(address spender, uint256 value) external returns (bool);
//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);
}
/**
* @title BrptCoin implementation
* @author Brian Park
*/
contract BrrtCoin is IERC20 {
//using SafeMath for uint256; // unnecessary lib
string public name = "BRRT";
string public symbol = "BRRTCoin";
uint8 public decimals = 18;
uint256 _totalSupply;
mapping(address => uint256) balances;
// Admin Address
address public owner;
address public team;
// keep reserved coins in vault for each purpose
enum VaultEnum {mining, mkt, op, team, presale}
string[] VaultName = ["mining", "mkt", "op", "team", "presale"];
mapping(string => uint256) vault;
modifier isOwner {
require(owner == msg.sender);
_;
}
constructor() public {
uint256 discardCoins; // burning amount at initial time
owner = msg.sender;
team = 0x576bcF0f30eB9Ec69f727DD51c7B8e145422475b;
require(owner != team);
setVaultBalanceInDecimal(VaultEnum.mining, 10000000000); // 10 B
setVaultBalanceInDecimal(VaultEnum.mkt, 1000000000); // 1 B
setVaultBalanceInDecimal(VaultEnum.op, 2000000000); // 2 B
setVaultBalanceInDecimal(VaultEnum.team, 3000000000); // 3 B, time lock to 2019-12-22
setVaultBalanceInDecimal(VaultEnum.presale, 2999645274); // 2,999,645,274
discardCoins = convertToWei(1000354726); // 1,000,354,726
// total must be 20 B
_totalSupply =
getVaultBalance(VaultEnum.mining) +
getVaultBalance(VaultEnum.mkt) +
getVaultBalance(VaultEnum.op) +
getVaultBalance(VaultEnum.team) +
getVaultBalance(VaultEnum.presale) +
discardCoins;
require(_totalSupply == convertToWei(20000000000));
_totalSupply -= discardCoins; // delete unnecessary coins;
balances[owner] = _totalSupply;
emit Transfer(address(0), owner, balances[owner]);
}
/** @dev transfer mining coins to BRPT address
*/
function transferForMining(address to) external isOwner {
require(to != owner);
withdrawCoins(VaultName[uint256(VaultEnum.mining)], to);
}
/** @dev withdraw coins for marketing budget to specified address
*/
function withdrawForMkt(address to) external isOwner {
require(to != owner);
withdrawCoins(VaultName[uint256(VaultEnum.mkt)], to);
}
/** @dev withdraw coins for maintenance cost to specified address
*/
function withdrawForOp(address to) external isOwner {
require(to != owner);
withdrawCoins(VaultName[uint256(VaultEnum.op)], to);
}
/** @dev withdraw coins for BRPT team to reserved address after locked date
*/
function withdrawTeamFunds() external isOwner {
uint256 balance = getVaultBalance(VaultEnum.team);
require(balance > 0);
withdrawCoins(VaultName[uint256(VaultEnum.team)], team);
}
/** @dev transfer sold(pre-sale) coins to specified address
*/
function transferPresaleCoins(address to, uint256 amount) external isOwner {
require(to != owner);
require(balances[owner] >= amount);
require(getVaultBalance(VaultEnum.presale) >= amount);
balances[owner] -= amount;
balances[to] += amount;
vault[VaultName[uint256(VaultEnum.presale)]] -= amount;
emit Transfer(owner, to, amount);
}
function totalSupply() public view returns (uint) {
return _totalSupply;
}
function balanceOf(address who) public view returns (uint256) {
return balances[who];
}
function transfer(address to, uint256 value) public returns (bool success) {
require(msg.sender != to);
require(msg.sender != owner); // owner is not free to transfer
require(to != owner);
require(value > 0);
require( balances[msg.sender] >= value );
require( balances[to] + value >= balances[to] ); // prevent overflow
if(msg.sender == team) {
require(now >= 1576940400); // lock to 2019-12-22
}
balances[msg.sender] -= value;
balances[to] += value;
emit Transfer(msg.sender, to, value);
return true;
}
// burn holder's own coins
function burnCoins(uint256 value) public {
require(msg.sender != owner); // owner can't burn any coin
require(balances[msg.sender] >= value);
require(_totalSupply >= value);
balances[msg.sender] -= value;
_totalSupply -= value;
emit Transfer(msg.sender, address(0), value);
}
function vaultBalance(string memory vaultName) public view returns (uint256) {
return vault[vaultName];
}
// for check numbers
function getStat() public isOwner view returns (uint256 vaultTotal) {
uint256 totalVault =
getVaultBalance(VaultEnum.mining) +
getVaultBalance(VaultEnum.mkt) +
getVaultBalance(VaultEnum.op) +
getVaultBalance(VaultEnum.team) +
getVaultBalance(VaultEnum.presale);
return totalVault;
}
/** @dev implementation of withdrawal
* @dev it is available once for each vault
*/
function withdrawCoins(string memory vaultName, address to) private returns (uint256) {
uint256 balance = vault[vaultName];
require(balance > 0);
require(balances[owner] >= balance);
require(owner != to);
balances[owner] -= balance;
balances[to] += balance;
vault[vaultName] = 0;
emit Transfer(owner, to, balance);
return balance;
}
/** @dev private functions for manage vault
*/
function setVaultBalanceInDecimal(VaultEnum vaultNum, uint256 amount) private {
vault[VaultName[uint256(vaultNum)]] = convertToWei(amount);
}
function getVaultBalance(VaultEnum vaultNum) private view returns (uint256) {
return vault[VaultName[uint256(vaultNum)]];
}
function convertToWei(uint256 value) private view returns (uint256) {
return value * (10 ** uint256(decimals));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment