pull/754/head
Dominik Muhs 6 years ago
parent e11e916f55
commit a053cfd330
  1. 154
      tests/testdata/input_contracts/rubixi.sol

@ -1,5 +1,7 @@
contract Rubixi { pragma solidity 0.5.0;
contract Rubixi {
//Declare variables for storage critical to contract //Declare variables for storage critical to contract
uint private balance = 0; uint private balance = 0;
uint private collectedFees = 0; uint private collectedFees = 0;
@ -7,146 +9,144 @@ contract Rubixi {
uint private pyramidMultiplier = 300; uint private pyramidMultiplier = 300;
uint private payoutOrder = 0; uint private payoutOrder = 0;
address private creator; address payable private creator;
//Sets creator
function DynamicPyramid() {
creator = msg.sender;
}
modifier onlyowner { modifier onlyowner {
if (msg.sender == creator) _; if (msg.sender == creator) _;
} }
struct Participant { struct Participant {
address etherAddress; address payable etherAddress;
uint payout; uint payout;
} }
Participant[] private participants;
//Fallback function //Fallback function
function() { function() external payable {
init(); init();
} }
//init function run on fallback //Sets creator
function init() private { function dynamicPyramid() public {
//Ensures only tx with value of 1 ether or greater are processed and added to pyramid creator = msg.sender;
if (msg.value < 1 ether) {
collectedFees += msg.value;
return;
}
uint _fee = feePercent;
//50% fee rebate on any ether value of 50 or greater
if (msg.value >= 50 ether) _fee /= 2;
addPayout(_fee);
} }
//Function called for valid tx to the contract Participant[] private participants;
function addPayout(uint _fee) private {
//Adds new address to participant array
participants.push(Participant(msg.sender, (msg.value * pyramidMultiplier) / 100));
//These statements ensure a quicker payout system to later pyramid entrants, so the pyramid has a longer lifespan
if (participants.length == 10) pyramidMultiplier = 200;
else if (participants.length == 25) pyramidMultiplier = 150;
// collect fees and update contract balance
balance += (msg.value * (100 - _fee)) / 100;
collectedFees += (msg.value * _fee) / 100;
//Pays earlier participiants if balance sufficient
while (balance > participants[payoutOrder].payout) {
uint payoutToSend = participants[payoutOrder].payout;
participants[payoutOrder].etherAddress.send(payoutToSend);
balance -= participants[payoutOrder].payout;
payoutOrder += 1;
}
}
//Fee functions for creator //Fee functions for creator
function collectAllFees() onlyowner { function collectAllFees() public onlyowner {
if (collectedFees == 0) throw; require(collectedFees == 0);
creator.transfer(collectedFees);
creator.send(collectedFees);
collectedFees = 0; collectedFees = 0;
} }
function collectFeesInEther(uint _amt) onlyowner { function collectFeesInEther(uint _amt) public onlyowner {
_amt *= 1 ether; _amt *= 1 ether;
if (_amt > collectedFees) collectAllFees(); if (_amt > collectedFees) collectAllFees();
if (collectedFees == 0) throw; require(collectedFees == 0);
creator.send(_amt); creator.transfer(_amt);
collectedFees -= _amt; collectedFees -= _amt;
} }
function collectPercentOfFees(uint _pcent) onlyowner { function collectPercentOfFees(uint _pcent) public onlyowner {
if (collectedFees == 0 || _pcent > 100) throw; require(collectedFees == 0 || _pcent > 100);
uint feesToCollect = collectedFees / 100 * _pcent; uint feesToCollect = collectedFees / 100 * _pcent;
creator.send(feesToCollect); creator.transfer(feesToCollect);
collectedFees -= feesToCollect; collectedFees -= feesToCollect;
} }
//Functions for changing variables related to the contract //Functions for changing variables related to the contract
function changeOwner(address _owner) onlyowner { function changeOwner(address payable _owner) public onlyowner {
creator = _owner; creator = _owner;
} }
function changeMultiplier(uint _mult) onlyowner { function changeMultiplier(uint _mult) public onlyowner {
if (_mult > 300 || _mult < 120) throw; require(_mult > 300 || _mult < 120);
pyramidMultiplier = _mult; pyramidMultiplier = _mult;
} }
function changeFeePercentage(uint _fee) onlyowner { function changeFeePercentage(uint _fee) public onlyowner {
if (_fee > 10) throw; require(_fee > 10);
feePercent = _fee; feePercent = _fee;
} }
//Functions to provide information to end-user using JSON interface or other interfaces //Functions to provide information to end-user using JSON interface or other interfaces
function currentMultiplier() constant returns(uint multiplier, string info) { function currentMultiplier() public returns (uint multiplier, string memory info) {
multiplier = pyramidMultiplier; multiplier = pyramidMultiplier;
info = 'This multiplier applies to you as soon as transaction is received, may be lowered to hasten payouts or increased if payouts are fast enough. Due to no float or decimals, multiplier is x100 for a fractional multiplier e.g. 250 is actually a 2.5x multiplier. Capped at 3x max and 1.2x min.'; info = "This multiplier applies to you as soon as transaction is received, may be lowered to hasten payouts or increased if payouts are fast enough. Due to no float or decimals, multiplier is x100 for a fractional multiplier e.g. 250 is actually a 2.5x multiplier. Capped at 3x max and 1.2x min.";
} }
function currentFeePercentage() constant returns(uint fee, string info) { function currentFeePercentage() public returns (uint fee, string memory info) {
fee = feePercent; fee = feePercent;
info = 'Shown in % form. Fee is halved(50%) for amounts equal or greater than 50 ethers. (Fee may change, but is capped to a maximum of 10%)'; info = "Shown in % form. Fee is halved(50%) for amounts equal or greater than 50 ethers. (Fee may change, but is capped to a maximum of 10%)";
} }
function currentPyramidBalanceApproximately() constant returns(uint pyramidBalance, string info) { function currentPyramidBalanceApproximately() public returns (uint pyramidBalance, string memory info) {
pyramidBalance = balance / 1 ether; pyramidBalance = balance / 1 ether;
info = 'All balance values are measured in Ethers, note that due to no decimal placing, these values show up as integers only, within the contract itself you will get the exact decimal value you are supposed to'; info = "All balance values are measured in Ethers, note that due to no decimal placing, these values show up as integers only, within the contract itself you will get the exact decimal value you are supposed to";
} }
function nextPayoutWhenPyramidBalanceTotalsApproximately() constant returns(uint balancePayout) { function nextPayoutWhenPyramidBalanceTotalsApproximately() public returns (uint balancePayout) {
balancePayout = participants[payoutOrder].payout / 1 ether; balancePayout = participants[payoutOrder].payout / 1 ether;
} }
function feesSeperateFromBalanceApproximately() constant returns(uint fees) { function feesSeperateFromBalanceApproximately() public returns (uint fees) {
fees = collectedFees / 1 ether; fees = collectedFees / 1 ether;
} }
function totalParticipants() constant returns(uint count) { function totalParticipants() public returns (uint count) {
count = participants.length; count = participants.length;
} }
function numberOfParticipantsWaitingForPayout() constant returns(uint count) { function numberOfParticipantsWaitingForPayout() public returns (uint count) {
count = participants.length - payoutOrder; count = participants.length - payoutOrder;
} }
function participantDetails(uint orderInPyramid) constant returns(address Address, uint Payout) { function participantDetails(uint orderInPyramid) public returns (address addr, uint payout) {
if (orderInPyramid <= participants.length) { if (orderInPyramid <= participants.length) {
Address = participants[orderInPyramid].etherAddress; addr = participants[orderInPyramid].etherAddress;
Payout = participants[orderInPyramid].payout / 1 ether; payout = participants[orderInPyramid].payout / 1 ether;
}
}
//init function run on fallback
function init() private {
//Ensures only tx with value of 1 ether or greater are processed and added to pyramid
if (msg.value < 1 ether) {
collectedFees += msg.value;
return;
}
uint _fee = feePercent;
// 50% fee rebate on any ether value of 50 or greater
if (msg.value >= 50 ether) _fee /= 2;
addPayout(_fee);
}
//Function called for valid tx to the contract
function addPayout(uint _fee) private {
//Adds new address to participant array
participants.push(Participant(msg.sender, (msg.value * pyramidMultiplier) / 100));
// These statements ensure a quicker payout system to
// later pyramid entrants, so the pyramid has a longer lifespan
if (participants.length == 10) pyramidMultiplier = 200;
else if (participants.length == 25) pyramidMultiplier = 150;
// collect fees and update contract balance
balance += (msg.value * (100 - _fee)) / 100;
collectedFees += (msg.value * _fee) / 100;
//Pays earlier participiants if balance sufficient
while (balance > participants[payoutOrder].payout) {
uint payoutToSend = participants[payoutOrder].payout;
participants[payoutOrder].etherAddress.transfer(payoutToSend);
balance -= participants[payoutOrder].payout;
payoutOrder += 1;
} }
} }
} }

Loading…
Cancel
Save