Created
April 12, 2016 17:32
-
-
Save gkucmierz/9cbc39d05102268f0b95272cf988cdc1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 0xBa69e7C96E9541863f009E713CaF26d4Ad2241a0 | |
contract Managed { | |
address public currentManager; | |
function Managed() { | |
currentManager = msg.sender; | |
} | |
modifier onlyManager { | |
if (msg.sender != currentManager) throw; | |
_ | |
} | |
} | |
contract OfficialWebsite is Managed { | |
string officialWebsite; | |
function setOfficialWebsite(string url) onlyManager { | |
officialWebsite = url; | |
} | |
} | |
contract SmartRevshare is OfficialWebsite { | |
struct Investor { | |
address addr; | |
uint value; | |
uint lastDay; | |
uint8 leftPayDays; | |
} | |
Investor[] public investors; | |
uint payoutIdx = 0; | |
address public currentManager; | |
uint public balance; | |
// Events that will be fired on changes. | |
event Invest(address investor, uint value); | |
event Payout(address investor, uint value); | |
// simple manager function modifier | |
modifier manager { | |
if (msg.sender == currentManager) _ | |
} | |
function SmartRevshare() { | |
// set founder as current manager | |
currentManager = msg.sender; | |
// add some assets | |
balance += msg.value; | |
} | |
function found() onlyManager { | |
// let manager to add some revenue | |
balance += msg.value; | |
} | |
function() { | |
// 100 finey is minimum invest | |
if (msg.value < 100 finney) throw; | |
invest(); | |
payout(); | |
} | |
function invest() { | |
// add new investor | |
investors.push(Investor({ | |
addr: msg.sender, | |
value: msg.value, | |
leftPayDays: calculateROI(), | |
lastDay: getDay() | |
})); | |
// save 99% of sent value | |
balance += msg.value * 99 / 100; | |
// send 1% to current manager | |
currentManager.send(msg.value / 100); | |
// call Invest event | |
Invest(msg.sender, msg.value); | |
} | |
function payout() internal { | |
uint payoutValue; | |
uint currDay = getDay(); // store actual day | |
for (uint idx = payoutIdx; idx < investors.length; idx += 1) { | |
// calculate 1% of invested value | |
payoutValue = investors[idx].value / 100; | |
if (balance < payoutValue) { | |
// out of balance, do payuout next time | |
break; | |
} | |
if (investors[idx].lastDay >= currDay) { | |
// this investor was payed today | |
// payout next one | |
continue; | |
} | |
if (investors[idx].leftPayDays <= 0) { | |
// this investor is paidoff, check next one | |
payoutIdx = idx; | |
} | |
// the best part - payout | |
investors[idx].addr.send(payoutValue); | |
// update lastDay to actual day | |
investors[idx].lastDay = currDay; | |
// decrement leftPayDays | |
investors[idx].leftPayDays -= 1; | |
// decrement contract balance | |
balance -= payoutValue; | |
// call Payout event | |
Payout(investors[idx].addr, payoutValue); | |
} | |
} | |
// get number of current day since 1970 | |
function getDay() internal returns (uint) { | |
return now / 1 days; | |
} | |
// calculate ROI based on investor value | |
function calculateROI() internal returns (uint8) { | |
if (msg.value <= 1 ether) return 110; // 110% | |
if (msg.value <= 10 ether) return 120; // 120% | |
if (msg.value <= 100 ether) return 130; // 130% | |
return 0; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Do I get paid out if I put more then 100 ether in the contract?
also why does the first
if
usedcontinue
and the secondif
payoutIdx = idx;