Skip to content

Instantly share code, notes, and snippets.

@libasoles
Created November 19, 2017 22:43
Show Gist options
  • Save libasoles/2e96f7923ee7efc94800193fdc5710e9 to your computer and use it in GitHub Desktop.
Save libasoles/2e96f7923ee7efc94800193fdc5710e9 to your computer and use it in GitHub Desktop.
Solidity exercise: projects loans contract
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