pragma solidity ^0.4.16;
contract ShpingCoin {
string public name = "Shping Coin";
string public symbol = "SHPING";
uint8 public decimals = 18;
uint256 public coinsaleDeadline = 1521845940; // 23/03/2018, 22:59:00 GMT | 23/03/2018, 23:59:00 CET | Saturday, 24 March 2018 9:59:00 AM GMT+11:00
uint256 public totalSupply;
mapping(address => uint256) balances;
mapping(address => mapping (address => uint256)) allowed;
mapping(address => mapping(string => bool)) platinumUsers;
mapping(address => mapping(string => uint256)) campaigns; // Requests for a campaign activation
mapping(address => uint256) budgets; // Account budget for rewards campaigns
address public owner;
address public operator;
function ShpingCoin() public {
owner = msg.sender;
totalSupply = 10000000000 * (10 ** uint256(decimals));
balances[msg.sender] = totalSupply;
operator = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
modifier onlyOperator() {
require(msg.sender == operator);
_;
}
function changeOperator(address newOperator) public onlyOwner {
require(newOperator != address(0));
require(newOperator != operator);
require(balances[newOperator]+balances[operator] >= balances[newOperator]);
require(budgets[newOperator]+budgets[operator] >= budgets[newOperator]);
if (operator != owner) {
balances[newOperator] += balances[operator];
budgets[newOperator] += budgets[operator];
NewBudget(newOperator, budgets[newOperator]);
Transfer(operator, newOperator, balances[operator]);
balances[operator] = 0;
budgets[operator] = 0;
NewBudget(operator, 0);
}
operator = newOperator;
}
//Permanent platinum level
function isPlatinumLevel(address user, string hashedID) public constant returns (bool) {
return platinumUsers[user][hashedID];
}
function setPermanentPlatinumLevel(address user, string hashedID) public onlyOwner returns (bool) {
require(!isPlatinumLevel(user, hashedID));
platinumUsers[user][hashedID] = true;
return true;
}
//Rewards campaigns
function activateCampaign(string campaign, uint256 budget) public returns (bool) {
require(campaigns[msg.sender][campaign] == 0);
require(budget != 0);
require(balances[msg.sender] >= budgets[msg.sender]);
require(balances[msg.sender] - budgets[msg.sender] >= budget);
campaigns[msg.sender][campaign] = budget;
Activate(msg.sender, budget, campaign);
return true;
}
function getBudget(address account) public constant returns (uint256) {
return budgets[account];
}
function rejectCampaign(address account, string campaign) public onlyOperator returns (bool) {
require(account != address(0));
campaigns[account][campaign] = 0;
Reject(account, campaign);
return true;
}
function setBudget(address account, string campaign) public onlyOperator returns (bool) {
require(account != address(0));
require(campaigns[account][campaign] != 0);
require(balances[account] >= budgets[account]);
require(balances[account] - budgets[account] >= campaigns[account][campaign]);
require(budgets[account] + campaigns[account][campaign] > budgets[account]);
budgets[account] += campaigns[account][campaign];
campaigns[account][campaign] = 0;
NewBudget(account, budgets[account]);
return true;
}
function releaseBudget(address account, uint256 budget) public onlyOperator returns (bool) {
require(account != address(0));
require(budget != 0);
require(budgets[account] >= budget);
require(balances[account] >= budget);
require(balances[operator] + budget > balances[operator]);
budgets[account] -= budget;
balances[account] -= budget;
balances[operator] += budget;
Released(account, budget);
NewBudget(account, budgets[account]);
return true;
}
function clearBudget(address account) public onlyOperator returns (bool) {
budgets[account] = 0;
NewBudget(account, 0);
return true;
}
event Activate(address indexed account, uint256 indexed budget, string campaign);
event NewBudget(address indexed account, uint256 budget);
event Reject(address indexed account, string campaign);
event Released(address indexed account, uint256 value);
//ERC20 interface
function balanceOf(address account) public constant returns (uint256) {
return balances[account];
}
function transfer(address to, uint256 value) public returns (bool) {
require(msg.sender == owner || msg.sender == operator || now > coinsaleDeadline);
require(balances[msg.sender] - budgets[msg.sender] >= value);
require(balances[to] + value >= balances[to]);
balances[msg.sender] -= value;
balances[to] += value;
Transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public returns (bool) {
require(from == owner || from == operator || msg.sender == owner || msg.sender == operator || now > coinsaleDeadline);
require(balances[from] - budgets[from] >= value);
require(allowed[from][msg.sender] >= value);
require(balances[to] + value >= balances[to]);
balances[from] -= value;
allowed[from][msg.sender] -= value;
balances[to] += value;
Transfer(from, to, value);
return true;
}
function approve(address spender, uint256 value) public returns (bool) {
allowed[msg.sender][spender] = value;
Approval(msg.sender, spender, value);
return true;
}
function allowance(address account, address spender) public constant returns (uint256) {
return allowed[account][spender];
}
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
{
"compilationTarget": {
"ShpingCoin.sol": "ShpingCoin"
},
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"changeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"getBudget","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"coinsaleDeadline","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"},{"name":"hashedID","type":"string"}],"name":"setPermanentPlatinumLevel","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"campaign","type":"string"},{"name":"budget","type":"uint256"}],"name":"activateCampaign","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"},{"name":"hashedID","type":"string"}],"name":"isPlatinumLevel","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"budget","type":"uint256"}],"name":"releaseBudget","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"campaign","type":"string"}],"name":"setBudget","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"clearBudget","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"campaign","type":"string"}],"name":"rejectCampaign","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":true,"name":"budget","type":"uint256"},{"indexed":false,"name":"campaign","type":"string"}],"name":"Activate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"budget","type":"uint256"}],"name":"NewBudget","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"campaign","type":"string"}],"name":"Reject","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}]