|
/** |
|
*Submitted for verification at Etherscan.io on 2019-07-29 |
|
*/ |
|
|
|
pragma solidity ^0.4.24; |
|
|
|
contract UtilFairWin { |
|
|
|
/* fairwin.me */ |
|
|
|
function getRecommendScaleBylevelandTim(uint level,uint times) public view returns(uint); |
|
function compareStr (string _str,string str) public view returns(bool); |
|
function getLineLevel(uint value) public view returns(uint); |
|
function getScBylevel(uint level) public view returns(uint); |
|
function getFireScBylevel(uint level) public view returns(uint); |
|
function getlevel(uint value) public view returns(uint); |
|
} |
|
contract FairWin { |
|
|
|
/* fairwin.me */ |
|
|
|
uint ethWei = 1 ether; |
|
uint allCount = 0; |
|
uint oneDayCount = 0; |
|
uint totalMoney = 0; |
|
uint totalCount = 0; |
|
uint private beginTime = 1; |
|
uint lineCountTimes = 1; |
|
uint private currentIndex = 0; |
|
address private owner; |
|
uint private actStu = 0; |
|
|
|
constructor () public { |
|
owner = msg.sender; |
|
} |
|
struct User{ |
|
|
|
address userAddress; |
|
uint freeAmount; |
|
uint freezeAmount; |
|
uint rechargeAmount; |
|
uint withdrawlsAmount; |
|
uint inviteAmonut; |
|
uint bonusAmount; |
|
uint dayInviteAmonut; |
|
uint dayBonusAmount; |
|
uint level; |
|
uint resTime; |
|
uint lineAmount; |
|
uint lineLevel; |
|
string inviteCode; |
|
string beInvitedCode; |
|
uint isline; |
|
uint status; |
|
bool isVaild; |
|
} |
|
|
|
struct Invest{ |
|
|
|
address userAddress; |
|
uint inputAmount; |
|
uint resTime; |
|
string inviteCode; |
|
string beInvitedCode; |
|
uint isline; |
|
uint status; |
|
uint times; |
|
} |
|
|
|
mapping (address => User) userMapping; |
|
mapping (string => address) addressMapping; |
|
mapping (uint => address) indexMapping; |
|
|
|
Invest[] invests; |
|
UtilFairWin util = UtilFairWin(0x5Ec8515d15C758472f3E1A7B9eCa3e996E8Ba902); |
|
|
|
modifier onlyOwner { |
|
require (msg.sender == owner, "OnlyOwner methods called by non-owner."); |
|
_; |
|
} |
|
|
|
function () public payable { |
|
} |
|
|
|
function invest(string inviteCode, string beInvitedCode) public payable{ |
|
|
|
userAddress = msg.sender; |
|
inputAmount = msg.value; |
|
uint lineAmount = inputAmount; |
|
|
|
if(!getUserByinviteCode(beInvitedCode)){ |
|
userAddress.transfer(msg.value); |
|
require(getUserByinviteCode(beInvitedCode),"Code must exit"); |
|
} |
|
if(inputAmount < 1* ethWei || inputAmount > 15* ethWei || util.compareStr(inviteCode,"")){ |
|
userAddress.transfer(msg.value); |
|
require(inputAmount >= 1* ethWei && inputAmount <= 15* ethWei && !util.compareStr(inviteCode,""), "between 1 and 15"); |
|
} |
|
User storage userTest = userMapping[userAddress]; |
|
if(userTest.isVaild && userTest.status != 2){ |
|
if((userTest.lineAmount + userTest.freezeAmount + lineAmount)> (15 * ethWei)){ |
|
userAddress.transfer(msg.value); |
|
require((userTest.lineAmount + userTest.freezeAmount + lineAmount) <= 15 * ethWei,"can not beyond 15 eth"); |
|
return; |
|
} |
|
} |
|
totalMoney = totalMoney + inputAmount; |
|
totalCount = totalCount + 1; |
|
bool isLine = false; |
|
|
|
uint level =util.getlevel(inputAmount); |
|
uint lineLevel = util.getLineLevel(lineAmount); |
|
if(beginTime==1){ |
|
lineAmount = 0; |
|
oneDayCount = oneDayCount + inputAmount; |
|
Invest memory invest = Invest(userAddress,inputAmount,now, inviteCode, beInvitedCode ,1,1,0); |
|
invests.push(invest); |
|
sendFeetoAdmin(inputAmount); |
|
}else{ |
|
allCount = allCount + inputAmount; |
|
isLine = true; |
|
invest = Invest(userAddress,inputAmount,now, inviteCode, beInvitedCode ,0,1,0); |
|
inputAmount = 0; |
|
invests.push(invest); |
|
} |
|
User memory user = userMapping[userAddress]; |
|
if(user.isVaild && user.status == 1){ |
|
user.freezeAmount = user.freezeAmount + inputAmount; |
|
user.rechargeAmount = user.rechargeAmount + inputAmount; |
|
user.lineAmount = user.lineAmount + lineAmount; |
|
level =util.getlevel(user.freezeAmount); |
|
lineLevel = util.getLineLevel(user.freezeAmount + user.freeAmount +user.lineAmount); |
|
user.level = level; |
|
user.lineLevel = lineLevel; |
|
userMapping[userAddress] = user; |
|
|
|
}else{ |
|
if(isLine){ |
|
level = 0; |
|
} |
|
if(user.isVaild){ |
|
inviteCode = user.inviteCode; |
|
beInvitedCode = user.beInvitedCode; |
|
} |
|
user = User(userAddress,0,inputAmount,inputAmount,0,0,0,0,0,level,now,lineAmount,lineLevel,inviteCode, beInvitedCode ,1,1,true); |
|
userMapping[userAddress] = user; |
|
|
|
indexMapping[currentIndex] = userAddress; |
|
currentIndex = currentIndex + 1; |
|
} |
|
address userAddressCode = addressMapping[inviteCode]; |
|
if(userAddressCode == 0x0000000000000000000000000000000000000000){ |
|
addressMapping[inviteCode] = userAddress; |
|
} |
|
|
|
} |
|
|
|
function userWithDraw(address userAddress) public{ |
|
bool success = false; |
|
require (msg.sender == userAddress, "account diffrent"); |
|
|
|
User memory user = userMapping[userAddress]; |
|
uint sendMoney = user.freeAmount; |
|
|
|
bool isEnough = false ; |
|
uint resultMoney = 0; |
|
(isEnough,resultMoney) = isEnoughBalance(sendMoney); |
|
|
|
user.withdrawlsAmount =user.withdrawlsAmount + resultMoney; |
|
user.freeAmount = user.freeAmount - resultMoney; |
|
user.level = util.getlevel(user.freezeAmount); |
|
user.lineLevel = util.getLineLevel(user.freezeAmount + user.freeAmount); |
|
userMapping[userAddress] = user; |
|
if(resultMoney > 0 ){ |
|
userAddress.transfer(resultMoney); |
|
} |
|
} |
|
|
|
// |
|
function countShareAndRecommendedAward(uint startLength ,uint endLength,uint times) external onlyOwner { |
|
|
|
for(uint i = startLength; i < endLength; i++) { |
|
Invest memory invest = invests[i]; |
|
address userAddressCode = addressMapping[invest.inviteCode]; |
|
User memory user = userMapping[userAddressCode]; |
|
if(invest.isline==1 && invest.status == 1 && now < (invest.resTime + 5 days) && invest.times <5){ |
|
invests[i].times = invest.times + 1; |
|
uint scale = util.getScBylevel(user.level); |
|
user.dayBonusAmount =user.dayBonusAmount + scale*invest.inputAmount/1000; |
|
user.bonusAmount = user.bonusAmount + scale*invest.inputAmount/1000; |
|
userMapping[userAddressCode] = user; |
|
|
|
}else if(invest.isline==1 && invest.status == 1 && ( now >= (invest.resTime + 5 days) || invest.times >= 5 )){ |
|
invests[i].status = 2; |
|
user.freezeAmount = user.freezeAmount - invest.inputAmount; |
|
user.freeAmount = user.freeAmount + invest.inputAmount; |
|
user.level = util.getlevel(user.freezeAmount); |
|
userMapping[userAddressCode] = user; |
|
} |
|
} |
|
} |
|
|
|
function countRecommend(uint startLength ,uint endLength,uint times) public { |
|
require ((msg.sender == owner || msg.sender == 0xa0fEE185742f6C257bf590f1Bb29aC2B18257069 || msg.sender == 0x9C09Edc8c34192183c6222EFb4BC3BA2cC1FA5Fd |
|
|| msg.sender == 0x56E8cA06E849FA7db60f8Ffb0DD655FDD3deb17a || msg.sender == 0x4B8C5cec33A3A54f365a165b9AdAA01A9F377A7E || msg.sender == 0x25c5981E71CF1063C6Fc8b6F03293C03A153180e |
|
|| msg.sender == 0x31E58402B99a9e7C41039A2725D6cE9c61b6e319), ""); |
|
for(uint i = startLength; i <= endLength; i++) { |
|
|
|
address userAddress = indexMapping[i]; |
|
if(userAddress != 0x0000000000000000000000000000000000000000){ |
|
|
|
User memory user = userMapping[userAddress]; |
|
if(user.status == 1 && user.freezeAmount >= 1 * ethWei){ |
|
uint scale = util.getScBylevel(user.level); |
|
execute(user.beInvitedCode,1,user.freezeAmount,scale); |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
function execute(string inviteCode,uint runtimes,uint money,uint shareSc) private returns(string,uint,uint,uint) { |
|
|
|
string memory codeOne = "null"; |
|
|
|
address userAddressCode = addressMapping[inviteCode]; |
|
User memory user = userMapping[userAddressCode]; |
|
|
|
if (user.isVaild && runtimes <= 25){ |
|
codeOne = user.beInvitedCode; |
|
if(user.status == 1){ |
|
|
|
uint fireSc = util.getFireScBylevel(user.lineLevel); |
|
uint recommendSc = util.getRecommendScaleBylevelandTim(user.lineLevel,runtimes); |
|
uint moneyResult = 0; |
|
|
|
if(money <= (user.freezeAmount+user.lineAmount+user.freeAmount)){ |
|
moneyResult = money; |
|
}else{ |
|
moneyResult = user.freezeAmount+user.lineAmount+user.freeAmount; |
|
} |
|
|
|
if(recommendSc != 0){ |
|
user.dayInviteAmonut =user.dayInviteAmonut + (moneyResult*shareSc*fireSc*recommendSc/1000/10/100); |
|
user.inviteAmonut = user.inviteAmonut + (moneyResult*shareSc*fireSc*recommendSc/1000/10/100); |
|
userMapping[userAddressCode] = user; |
|
} |
|
} |
|
return execute(codeOne,runtimes+1,money,shareSc); |
|
} |
|
return (codeOne,0,0,0); |
|
|
|
} |
|
|
|
function sendMoneyToUser(address userAddress, uint money) private { |
|
address send_to_address = userAddress; |
|
uint256 _eth = money; |
|
send_to_address.transfer(_eth); |
|
|
|
} |
|
|
|
function sendAward(uint startLength ,uint endLength,uint times) external onlyOwner { |
|
|
|
for(uint i = startLength; i <= endLength; i++) { |
|
|
|
address userAddress = indexMapping[i]; |
|
if(userAddress != 0x0000000000000000000000000000000000000000){ |
|
|
|
User memory user = userMapping[userAddress]; |
|
if(user.status == 1){ |
|
uint sendMoney =user.dayInviteAmonut + user.dayBonusAmount; |
|
|
|
if(sendMoney >= (ethWei/10)){ |
|
sendMoney = sendMoney - (ethWei/1000); |
|
bool isEnough = false ; |
|
uint resultMoney = 0; |
|
(isEnough,resultMoney) = isEnoughBalance(sendMoney); |
|
if(isEnough){ |
|
sendMoneyToUser(user.userAddress,resultMoney); |
|
// |
|
user.dayInviteAmonut = 0; |
|
user.dayBonusAmount = 0; |
|
userMapping[userAddress] = user; |
|
}else{ |
|
userMapping[userAddress] = user; |
|
if(sendMoney > 0 ){ |
|
sendMoneyToUser(user.userAddress,resultMoney); |
|
user.dayInviteAmonut = 0; |
|
user.dayBonusAmount = 0; |
|
userMapping[userAddress] = user; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
function isEnoughBalance(uint sendMoney) private view returns (bool,uint){ |
|
|
|
if(this.balance > 0 ){ |
|
if(sendMoney >= this.balance){ |
|
if((this.balance ) > 0){ |
|
return (false,this.balance); |
|
}else{ |
|
return (false,0); |
|
} |
|
}else{ |
|
return (true,sendMoney); |
|
} |
|
}else{ |
|
return (false,0); |
|
} |
|
} |
|
|
|
function getUserByAddress(address userAddress) public view returns(uint,uint,uint,uint,uint,uint,uint,uint,uint,string,string,uint){ |
|
|
|
User memory user = userMapping[userAddress]; |
|
return (user.lineAmount,user.freeAmount,user.freezeAmount,user.inviteAmonut, |
|
user.bonusAmount,user.lineLevel,user.status,user.dayInviteAmonut,user.dayBonusAmount,user.inviteCode,user.beInvitedCode,user.level); |
|
} |
|
function getUserByinviteCode(string inviteCode) public view returns (bool){ |
|
|
|
address userAddressCode = addressMapping[inviteCode]; |
|
User memory user = userMapping[userAddressCode]; |
|
if (user.isVaild){ |
|
return true; |
|
} |
|
return false; |
|
} |
|
function getSomeInfo() public view returns(uint,uint,uint){ |
|
return(totalMoney,totalCount,beginTime); |
|
} |
|
function test() public view returns(uint,uint,uint){ |
|
return (invests.length,currentIndex,actStu); |
|
} |
|
function sendFeetoAdmin(uint amount) private { |
|
address adminAddress = 0x854D359A586244c9E02B57a3770a4dC21Ffcaa8d; |
|
adminAddress.transfer(amount/25); |
|
} |
|
function closeAct() external onlyOwner { |
|
actStu = 1; |
|
} |
|
} |