From 66a599e29181797b48699c103ad4ead62ec89185 Mon Sep 17 00:00:00 2001 From: Shubhorup Biswas Date: Fri, 24 Aug 2018 12:09:43 +0530 Subject: [PATCH 1/3] Added pyramid scheme solidity file --- pyramid.sol | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 pyramid.sol diff --git a/pyramid.sol b/pyramid.sol new file mode 100644 index 0000000..1822217 --- /dev/null +++ b/pyramid.sol @@ -0,0 +1,59 @@ +pragma solidity ^0.4.24; +contract Pyramid { + + ///Constants + uint constant public ticketPriceInWei = 10 ** 18; + uint constant public ticketSaleFeePercentage = 1; + uint constant public ticketRedemptionFeePercentage = 10; + address public owner; + + ///bookkeeping + address[] public listOfTicketOwners; + mapping (address => uint) public ticketsOwnedBy; + mapping (address => uint) public balanceOf; + uint public totalTickets = 0; + + //Create a new contract + constructor() public { + owner = msg.sender; + } + + //Assign ticket to sender + //Payout owner their fee + //Update balance of every token owner + function buyTicket() public payable { + require(msg.value == ticketPriceInWei); + totalTickets++; + ticketsOwnedBy[msg.sender]++; + //Add message sender to list of token owners + bool isContainedInArray = false; + uint arrayLength = listOfTicketOwners.length; + for(uint i = 0; i < arrayLength; i++) { + if (listOfTicketOwners[i] == msg.sender) { + isContainedInArray = true; + } + } + if (!isContainedInArray) { + listOfTicketOwners.push(msg.sender); + } + //Pay owner's fee + owner.transfer(ticketSaleFeePercentage/100*ticketPriceInWei); + + //Increase balance of every token owner + arrayLength = listOfTicketOwners.length; + for(uint j = 0; j < arrayLength; j++) { + address ownerAddress = listOfTicketOwners[j]; + balanceOf[ownerAddress] += ticketsOwnedBy[ownerAddress]*(100 - ticketSaleFeePercentage)*ticketPriceInWei/100/totalTickets; + } + } + + //Pay owner the fee + //Pay sender their balance minus fee + //+Bookkeeping + function redeemAllTickets() public { + owner.transfer(ticketRedemptionFeePercentage*balanceOf[msg.sender]/100); + msg.sender.transfer((100 - ticketRedemptionFeePercentage)*balanceOf[msg.sender]/100); + balanceOf[msg.sender] = 0; + ticketsOwnedBy[msg.sender] = 0; + } +} From 8f6eb26c4334bb96b8761447302d42e3117f60ae Mon Sep 17 00:00:00 2001 From: Shubhorup Biswas Date: Fri, 24 Aug 2018 12:48:13 +0530 Subject: [PATCH 2/3] 1. Allowing sale of multiple tickets at a time; returning remainder to sender 2. Corrected ticket sale fee calculation which was returning 0 --- pyramid.sol | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pyramid.sol b/pyramid.sol index 1822217..e582081 100644 --- a/pyramid.sol +++ b/pyramid.sol @@ -18,13 +18,14 @@ contract Pyramid { owner = msg.sender; } - //Assign ticket to sender + //Increase ticket ownership count, return remainder to sender //Payout owner their fee //Update balance of every token owner function buyTicket() public payable { - require(msg.value == ticketPriceInWei); totalTickets++; - ticketsOwnedBy[msg.sender]++; + ticketsOwnedBy[msg.sender] += msg.value/ticketPriceInWei; + //Send back remainder + msg.sender.transfer(msg.value%ticketPriceInWei); //Add message sender to list of token owners bool isContainedInArray = false; uint arrayLength = listOfTicketOwners.length; @@ -37,7 +38,7 @@ contract Pyramid { listOfTicketOwners.push(msg.sender); } //Pay owner's fee - owner.transfer(ticketSaleFeePercentage/100*ticketPriceInWei); + owner.transfer(ticketSaleFeePercentage*ticketPriceInWei/100); //Increase balance of every token owner arrayLength = listOfTicketOwners.length; @@ -56,4 +57,4 @@ contract Pyramid { balanceOf[msg.sender] = 0; ticketsOwnedBy[msg.sender] = 0; } -} +} \ No newline at end of file From 8fe719af2701f71c8d4cb5813811a3b50ae1044a Mon Sep 17 00:00:00 2001 From: Shubhorup Biswas Date: Fri, 24 Aug 2018 14:58:27 +0530 Subject: [PATCH 3/3] Corrections; introduced numTicketsBought --- pyramid.sol | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pyramid.sol b/pyramid.sol index e582081..f024d3c 100644 --- a/pyramid.sol +++ b/pyramid.sol @@ -22,8 +22,9 @@ contract Pyramid { //Payout owner their fee //Update balance of every token owner function buyTicket() public payable { - totalTickets++; - ticketsOwnedBy[msg.sender] += msg.value/ticketPriceInWei; + uint numTicketsBought = msg.value/ticketPriceInWei; + totalTickets +=numTicketsBought; + ticketsOwnedBy[msg.sender] += numTicketsBought; //Send back remainder msg.sender.transfer(msg.value%ticketPriceInWei); //Add message sender to list of token owners @@ -38,13 +39,13 @@ contract Pyramid { listOfTicketOwners.push(msg.sender); } //Pay owner's fee - owner.transfer(ticketSaleFeePercentage*ticketPriceInWei/100); + owner.transfer(ticketSaleFeePercentage*ticketPriceInWei*numTicketsBought/100); //Increase balance of every token owner arrayLength = listOfTicketOwners.length; for(uint j = 0; j < arrayLength; j++) { address ownerAddress = listOfTicketOwners[j]; - balanceOf[ownerAddress] += ticketsOwnedBy[ownerAddress]*(100 - ticketSaleFeePercentage)*ticketPriceInWei/100/totalTickets; + balanceOf[ownerAddress] += ticketsOwnedBy[ownerAddress]*(100 - ticketSaleFeePercentage)*ticketPriceInWei*numTicketsBought/100/totalTickets; } }