Created
November 19, 2017 22:43
-
-
Save libasoles/2e96f7923ee7efc94800193fdc5710e9 to your computer and use it in GitHub Desktop.
Solidity exercise: projects loans contract
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
pragma solidity ^0.4.18; | |
contract owned { | |
function owned() public { owner = msg.sender; } | |
address owner; | |
modifier onlyOwner { | |
require(msg.sender == owner); | |
_; | |
} | |
} | |
contract BitCrowdFunding is owned { | |
User[] crowd; | |
Project[] projects; | |
struct User { | |
address wallet; | |
} | |
struct Project { | |
uint id; | |
string name; | |
address wallet; | |
bool approved; | |
address owner; | |
mapping (address => uint) pendingWithdrawals; // withdrawal pattern | |
} | |
modifier membersOnly { | |
for(uint i = 0; i < crowd.length; i++) { | |
if(crowd[i].wallet == msg.sender) { | |
_; | |
break; | |
} | |
} | |
} | |
modifier newcomers { | |
for(uint i = 0; i < crowd.length; i++) { | |
if(crowd[i].wallet == msg.sender) { | |
return; | |
} | |
} | |
_; | |
} | |
modifier ownsProject { | |
for(uint i = 0; i < projects.length; i++) { | |
if(projects[i].owner == msg.sender) { | |
_; | |
break; | |
} | |
} | |
} | |
function BitCrowdFunding() public { | |
joinIn(); | |
} | |
function joinIn() public newcomers { | |
crowd.push( User({wallet: msg.sender}) ); | |
} | |
function loan(uint project_id) public membersOnly payable { | |
for(uint i = 0; i < projects.length; i++) { | |
if(projects[i].id == project_id && projects[i].approved) { | |
projects[i].pendingWithdrawals[msg.sender] += msg.value; | |
break; | |
} | |
} | |
} | |
function withdrawLoans(uint project_id) public ownsProject { | |
for(uint i = 0; i < projects.length; i++) { | |
if(projects[i].id == project_id) { | |
uint amount = projects[i].pendingWithdrawals[msg.sender]; | |
projects[i].pendingWithdrawals[msg.sender] = 0; | |
msg.sender.transfer(amount); | |
break; | |
} | |
} | |
} | |
/** | |
* @return uint Project unique ID | |
* */ | |
function addProject(string name, address wallet) public membersOnly returns(uint) { | |
uint id = projects.length+1; | |
projects.push(Project({ | |
id: id, | |
name: name, | |
wallet: wallet, | |
owner: msg.sender, | |
approved: false | |
})); | |
return id; | |
} | |
/** | |
* Only owner can do this | |
* */ | |
function approveProject(uint id) public onlyOwner returns(bool) { | |
for(uint i = 0; i < projects.length; i++) { | |
if(projects[i].id == id) { | |
projects[i].approved = true; | |
return true; | |
} | |
} | |
return false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment