pragma solidity ^0.4.24;
/*
*
*
*/
contract DailyDivsCardGame {
/*=================================
= MODIFIERS =
=================================*/
modifier onlyOwner(){
require(msg.sender == dev);
_;
}
/*==============================
= EVENTS =
==============================*/
event oncardPurchase(
address customerAddress,
uint256 incomingEthereum,
uint256 card,
uint256 newPrice
);
event onWithdraw(
address customerAddress,
uint256 ethereumWithdrawn
);
// ERC20
event Transfer(
address from,
address to,
uint256 card
);
/*=====================================
= CONFIGURABLES =
=====================================*/
string public name = "DIVIDEND CARDS";
string public symbol = "DIVCARD";
uint8 constant public cardsDivRate = 10;
uint8 constant public ownerDivRate = 50;
uint8 constant public distDivRate = 40;
uint8 constant public referralRate = 5;
uint8 constant public decimals = 18;
uint public totalCardValue = 9.75 ether; // Make sure this is sum of constructor values
uint public precisionFactor = 9;
/*================================
= DATASETS =
================================*/
mapping(uint => address) internal cardOwner;
mapping(uint => uint) public cardPrice;
mapping(uint => uint) internal cardPreviousPrice;
mapping(address => uint) internal ownerAccounts;
mapping(uint => uint) internal totalCardDivs;
uint cardPriceIncrement = 110;
uint totalDivsProduced = 0;
uint public totalCards;
bool allowReferral = true;
address dev;
address promoter;
address promoter2;
address promoter3;
address supporter1;
address ddtDivsAddr;
/*=======================================
= PUBLIC FUNCTIONS =
=======================================*/
/*
* -- APPLICATION ENTRY POINTS --
*/
constructor()
public
{
dev = msg.sender;
promoter = 0x3C0119B400834a5e9c24b6B654B85bF77283f9e5;
promoter2 = 0x642e0ce9ae8c0d8007e0acaf82c8d716ff8c74c1;
promoter3 = 0x4A42500b817439cF9B10b4d3edf68bb63Ed0A89B;
supporter1 = 0x12b353d1a2842d2272ab5a18c6814d69f4296873;
ddtDivsAddr = 0x93c5371707D2e015aEB94DeCBC7892eC1fa8dd80;
totalCards = 12;
cardOwner[0] = dev;
cardPrice[0] = 4 ether;
cardPreviousPrice[0] = cardPrice[0];
cardOwner[1] = dev;
cardPrice[1] = 2 ether;
cardPreviousPrice[1] = cardPrice[1];
cardOwner[2] = promoter3;
cardPrice[2] = 1 ether;
cardPreviousPrice[2] = cardPrice[2];
cardOwner[3] = promoter2;
cardPrice[3] = 0.9 ether;
cardPreviousPrice[3] = cardPrice[3];
cardOwner[4] = dev;
cardPrice[4] = 0.75 ether;
cardPreviousPrice[4] = cardPrice[4];
cardOwner[5] = promoter;
cardPrice[5] = 0.50 ether;
cardPreviousPrice[5] = cardPrice[5];
cardOwner[6] = supporter1;
cardPrice[6] = 0.25 ether;
cardPreviousPrice[6] = cardPrice[6];
cardOwner[7] = dev;
cardPrice[7] = 0.12 ether;
cardPreviousPrice[7] = cardPrice[7];
cardOwner[8] = dev;
cardPrice[8] = 0.08 ether;
cardPreviousPrice[8] = cardPrice[8];
cardOwner[9] = dev;
cardPrice[9] = 0.05 ether;
cardPreviousPrice[9] = cardPrice[9];
cardOwner[10] = dev;
cardPrice[10] = 0.05 ether;
cardPreviousPrice[10] = cardPrice[10];
cardOwner[11] = dev;
cardPrice[11] = 0.05 ether;
cardPreviousPrice[11] = cardPrice[11];
}
function addtotalCardValue(uint _new, uint _old)
internal
{
uint newPrice = SafeMath.div(SafeMath.mul(_new,cardPriceIncrement),100);
totalCardValue = SafeMath.add(totalCardValue, SafeMath.sub(newPrice,_old));
}
function buy(uint _card, address _referrer)
public
payable
{
require(_card < totalCards);
require(msg.value == cardPrice[_card]);
require(msg.sender != cardOwner[_card]);
addtotalCardValue(msg.value, cardPreviousPrice[_card]);
uint _newPrice = SafeMath.div(SafeMath.mul(msg.value, cardPriceIncrement), 100);
//Determine the total dividends
uint _baseDividends = SafeMath.sub(msg.value, cardPreviousPrice[_card]);
totalDivsProduced = SafeMath.add(totalDivsProduced, _baseDividends);
uint _cardsDividends = SafeMath.div(SafeMath.mul(_baseDividends, cardsDivRate),100);
uint _ownerDividends = SafeMath.div(SafeMath.mul(_baseDividends, ownerDivRate), 100);
totalCardDivs[_card] = SafeMath.add(totalCardDivs[_card], _ownerDividends);
_ownerDividends = SafeMath.add(_ownerDividends, cardPreviousPrice[_card]);
uint _distDividends = SafeMath.div(SafeMath.mul(_baseDividends, distDivRate), 100);
if (allowReferral && (_referrer != msg.sender) && (_referrer != 0x0000000000000000000000000000000000000000)) {
uint _referralDividends = SafeMath.div(SafeMath.mul(_baseDividends, referralRate), 100);
_distDividends = SafeMath.sub(_distDividends, _referralDividends);
ownerAccounts[_referrer] = SafeMath.add(ownerAccounts[_referrer], _referralDividends);
}
//distribute dividends to accounts
address _previousOwner = cardOwner[_card];
address _newOwner = msg.sender;
ownerAccounts[_previousOwner] = SafeMath.add(ownerAccounts[_previousOwner], _ownerDividends);
ddtDivsAddr.transfer(_cardsDividends);
distributeDivs(_distDividends);
//Increment the card Price
cardPreviousPrice[_card] = msg.value;
cardPrice[_card] = _newPrice;
cardOwner[_card] = _newOwner;
emit oncardPurchase(msg.sender, msg.value, _card, SafeMath.div(SafeMath.mul(msg.value, cardPriceIncrement), 100));
}
function distributeDivs(uint _distDividends) internal{
for (uint _card=0; _card < totalCards; _card++){
uint _divShare = SafeMath.div(SafeMath.div(SafeMath.mul(cardPreviousPrice[_card], 10 ** (precisionFactor + 1)), totalCardValue) + 5, 10);
uint _cardDivs = SafeMath.div(SafeMath.mul(_distDividends, _divShare), 10 ** precisionFactor);
ownerAccounts[cardOwner[_card]] += _cardDivs;
totalCardDivs[_card] = SafeMath.add(totalCardDivs[_card], _cardDivs);
}
}
function withdraw()
public
{
address _customerAddress = msg.sender;
require(ownerAccounts[_customerAddress] >= 0.001 ether);
uint _dividends = ownerAccounts[_customerAddress];
ownerAccounts[_customerAddress] = 0;
_customerAddress.transfer(_dividends);
emit onWithdraw(_customerAddress, _dividends);
}
/*---------- ADMINISTRATOR ONLY FUNCTIONS ----------*/
function setName(string _name)
onlyOwner()
public
{
name = _name;
}
function setSymbol(string _symbol)
onlyOwner()
public
{
symbol = _symbol;
}
function setcardPrice(uint _card, uint _price) //Allow the changing of a card price owner if the dev owns it
onlyOwner()
public
{
require(cardOwner[_card] == dev);
cardPrice[_card] = _price;
}
function addNewcard(uint _price)
onlyOwner()
public
{
cardPrice[totalCards-1] = _price;
cardOwner[totalCards-1] = dev;
totalCardDivs[totalCards-1] = 0;
totalCards = totalCards + 1;
}
function setAllowReferral(bool _allowReferral)
onlyOwner()
public
{
allowReferral = _allowReferral;
}
/*---------- HELPERS AND CALCULATORS ----------*/
/**
* Method to view the current Ethereum stored in the contract
* Example: totalEthereumBalance()
*/
function getMyBalance()
public
view
returns(uint)
{
return ownerAccounts[msg.sender];
}
function getOwnerBalance(address _cardOwner)
public
view
returns(uint)
{
return ownerAccounts[_cardOwner];
}
function getcardPrice(uint _card)
public
view
returns(uint)
{
require(_card < totalCards);
return cardPrice[_card];
}
function getcardOwner(uint _card)
public
view
returns(address)
{
require(_card < totalCards);
return cardOwner[_card];
}
function gettotalCardDivs(uint _card)
public
view
returns(uint)
{
require(_card < totalCards);
return totalCardDivs[_card];
}
function getTotalDivsProduced()
public
view
returns(uint)
{
return totalDivsProduced;
}
function getCardDivShare(uint _card)
public
view
returns(uint)
{
require(_card < totalCards);
return SafeMath.div(SafeMath.div(SafeMath.mul(cardPreviousPrice[_card], 10 ** (precisionFactor + 1)), totalCardValue) + 5, 10);
}
function getCardDivs(uint _card, uint _amt)
public
view
returns(uint)
{
uint _share = getCardDivShare(_card);
return SafeMath.div(SafeMath.mul( _share, _amt), 10 ** precisionFactor);
}
function gettotalCardValue()
public
view
returns(uint)
{
return totalCardValue;
}
function totalEthereumBalance()
public
view
returns(uint)
{
return address (this).balance;
}
function gettotalCards()
public
view
returns(uint)
{
return totalCards;
}
}
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Substracts two numbers, throws 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 Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
{
"compilationTarget": {
"DailyDivsCardGame.sol": "DailyDivsCardGame"
},
"evmVersion": "byzantium",
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"constant":true,"inputs":[{"name":"_card","type":"uint256"}],"name":"getCardDivShare","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_card","type":"uint256"}],"name":"getcardPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_card","type":"uint256"}],"name":"getcardOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cardPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_card","type":"uint256"},{"name":"_price","type":"uint256"}],"name":"setcardPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getMyBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_card","type":"uint256"},{"name":"_amt","type":"uint256"}],"name":"getCardDivs","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cardsDivRate","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_card","type":"uint256"}],"name":"gettotalCardDivs","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalEthereumBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_allowReferral","type":"bool"}],"name":"setAllowReferral","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_card","type":"uint256"},{"name":"_referrer","type":"address"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_cardOwner","type":"address"}],"name":"getOwnerBalance","outputs":[{"name":"","type":"uint256"}],"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":"_price","type":"uint256"}],"name":"addNewcard","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"precisionFactor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"referralRate","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDivsProduced","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalCardValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"string"}],"name":"setSymbol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gettotalCards","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"distDivRate","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gettotalCardValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalCards","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ownerDivRate","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"customerAddress","type":"address"},{"indexed":false,"name":"incomingEthereum","type":"uint256"},{"indexed":false,"name":"card","type":"uint256"},{"indexed":false,"name":"newPrice","type":"uint256"}],"name":"oncardPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"customerAddress","type":"address"},{"indexed":false,"name":"ethereumWithdrawn","type":"uint256"}],"name":"onWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"card","type":"uint256"}],"name":"Transfer","type":"event"}]