所有用户都可以参与众筹
规定时间内筹得资金则成功,反之失败
众筹的钱存放在合约里,发起众筹的人想花费合约中的钱的时候需要提交申请,投资者投票过半,申请才可以通过
-投资者对申请只能投一次票
花费申请成功时,可以获得花费的权力
pragma solidity ^0.4.26;
contract Funding{
string public pro_name;
uint256 public endtime;
uint256 public need_money;
uint256 public peo_money;
address public launch;
constructor(string pro_name1,uint256 endtime1,uint256 need_money1,uint256 peo_money1) public {
launch = msg.sender;//谁调用这个合约谁就是项目发起人
pro_name = pro_name1;
endtime = block.timestamp + endtime1;
peo_money = peo_money1;
need_money = need_money1;
}
function getName() public view returns (string){
return pro_name;
}
}
function invest() public payable{
require(msg.value == 1000);
investors.push(msg.sender);
}
function getContractBalance() public view returns (uint256){
return address(this).balance;
}
function getInvestors() public view returns (address[]){
return investors;
}
enum AppliStatue{
//正在进行中,已赞成,已结束
voting, approved, finish
}
struct Application{
//花费的请求
string spendReason;
//商家的地址
address seller;
//请求的状态
appliStatue statue;
//赞成的数量
uint256 approve;
//请求花费多少
uint256 cost;
//每个投资者的投资状况
mapping(address=>bool) isVotedMap;
}
function refund() public {
require(msg.sender == launch);
for (uint256 i = 0;i < investors.length; i ++){
investors[i].transfer(supportMoney);
}
delete investors;
}
//创建花费请求
function createEat(string _spendReason, address _seller,uint256 _cost ) public {
Application memory myRequest = Application({
spendReason : _spendReason,
seller : _seller,
statue : AppliStatue.voting,
approve : 0,
cost :_cost
});
allApplication.push(myRequest);
}
//投资人对花费请求进行批准
function voteRequest(uint256 i) public{
//判断投资人是否据有投资资格
require(isVoter[msg.sender] == true);
//这里一定是storage 类型
Application storage app = allApplication[i];
//判断是否已经投过票
require(app.isVotedMap[msg.sender] == false);
app.approve = app.approve+ 1;
app.isVotedMap[msg.sender] == true;
}
//执行花费动作
function startSpend(uint256 i) public{
Application storage app = allApplication[i];
//判断投票是否过半
require(app.approve * 2 > investors.length);
//判断合约的钱是否大于请求的钱
require(address(this).balance > app.cost);
//将花费的钱转给商家
app.seller.transfer(app.cost);
//更新花费申请的状态
app.statue = AppliStatue.finish;
}
//权限控制
modifier onlyManager(){
//只有投资者才拥有的权限
require(msg.sender == launch);
_;
}
//获取投资人的数量
function getInvestNum() public view returns (uint256){
return investors.length;
}
//返回众筹剩余时间
function leftTime() public view returns (uint256){
return endtime - block.timestamp;
}
//申请请求详细信息,可以返回自定义的枚举类型
function detailApplication(uint256 i) public view returns (string, address, uint256, uint256, AppliStatue){
Application storage app = allApplication[i];
return (app.spendReason, app.seller, app.cost, app.approve, app.statue);
}
mapping (address=>bool) isVoter;
pragma solidity ^0.4.26;
contract Funding{
string public pro_name;
uint256 public endtime;
uint256 public need_money;
uint256 public peo_money;
address public launch;
mapping (address=>bool) isVoter;
address[] investors;
uint256 supportMoney;
constructor(string pro_name1,uint256 endtime1,uint256 need_money1,uint256 peo_money1) public {
launch = msg.sender;
pro_name = pro_name1;
endtime = block.timestamp + endtime1;
peo_money = peo_money1;
need_money = need_money1;
supportMoney = peo_money;
}
enum AppliStatue{
//正在进行中,已赞成,已结束
voting, approved, finish
}
struct Application{
//花费的请求
string spendReason;
//商家的地址
address seller;
//请求的状态
AppliStatue statue;
//赞成的数量
uint256 approve;
//请求花费多少
uint256 cost;
//每个投资者的投资状况
mapping(address=>bool) isVotedMap;
}
Application[] allApplication;
//众筹失败,返回钱,只能项目发起者退回
function invest() public payable{
require(msg.value == 1000);
investors.push(msg.sender);
}
function getName() public view returns (string){
return pro_name;
}
function getContracbalance() public view returns(uint256){
return address(this).balance;
}
function getInvestors() public view returns (address[]){
return investors;
}
function createEat(string _spendReason, address _seller,uint256 _cost ) public {
Application memory myRequest = Application({
spendReason : _spendReason,
seller : _seller,
statue : AppliStatue.voting,
approve : 0,
cost :_cost
});
allApplication.push(myRequest);
}
//投资人对花费请求进行批准
function voteRequest(uint256 i) public{
//判断投资人是否据有投资资格
require(isVoter[msg.sender] == true);
//这里一定是storage 类型
Application storage app = allApplication[i];
//判断是否已经投过票
require(app.isVotedMap[msg.sender] == false);
app.approve = app.approve+ 1;
app.isVotedMap[msg.sender] == true;
}
function startSpend(uint256 i) public{
Application storage app = allApplication[i];
//判断投票是否过半
require(app.approve * 2 > investors.length);
//判断合约的钱是否大于请求的钱
require(address(this).balance > app.cost);
//将花费的钱转给商家
app.seller.transfer(app.cost);
//更新花费申请的状态
app.statue = AppliStatue.finish;
}
modifier onlyManager(){
//只有投资者才拥有的权限
require(msg.sender == launch);
_;
}
function getInvestNum() public view returns (uint256){
return investors.length;
}
function leftTime() public view returns (uint256){
return endtime - block.timestamp;
}
//可以返回自定义的枚举类型
function detailApplication(uint256 i) public view returns (string, address, uint256, uint256, AppliStatue){
Application storage app = allApplication[i];
return (app.spendReason, app.seller, app.cost, app.approve, app.statue);
}
function refund() public{
require(msg.sender == launch);
for (uint256 i = 0;i < investors.length; i++){
investors[i].transfer(supportMoney);
}
delete investors;
}
}
//众筹项目工厂管理者
address public FactoryManager;
//所有的众筹项目
address [] public allCrowdFunding;
//用户创建的众筹项目
mapping(address=>address[]) ownCrowdFunding;
//用户参与的众筹项目
mapping(address=>address[]) joinCrowdFunding;
//中间合约,负责用户参与的所有众筹项目
SupportFunding public supportFunnding;
constructor() public{
FactoryManager = msg.sender;
//supportFunnding相当于维护了一个去全局变量
supportFunnding = new SupportFunding();
}
//创建众筹项目
function createCrowdFunding(string pro_name1,uint256 endtime1,uint256 need_money1,uint256 supportMoney1, SupportFunding supportFunding) public {
address funding = new Funding(pro_name1,endtime1,need_money1,supportMoney1,supportFunding);
allCrowdFunding.push(funding);
ownCrowdFunding[msg.sender].push(funding);
}
//得到所有的众筹项目的地址
function getAllFunding() public view returns(address[]){
return allCrowdFunding;
}
//得到一个用户发起的所有众筹项目
function getAllCreatefunding() public view returns(address[]){
return ownCrowdFunding[msg.sender];
}
//得到用户参与的所有的众筹项目
function getAllJoinFunding() public view returns (address[]){
return supportFunnding.getJoinFunding(msg.sender);
}
pragma solidity ^0.4.26;
contract SupportFunding{
mapping(address=>address[]) public joinFunding;
//获取用户参与的所有众筹项目
function getJoinFunding(address _user) public view returns (address[]){
return joinFunding[_user];
}
//将用户加入的众筹项目
function setJoinFunding(address _user, address _fund) public {
joinFunding[_user].push(_fund);
}
}
//创建众筹项目
function createCrowdFunding(string pro_name1,uint256 endtime1,uint256 need_money1,uint256 supportMoney1, SupportFunding supportFunding) public {
address funding = new Funding(pro_name1,endtime1,need_money1,supportMoney1,supportFunding);
allCrowdFunding.push(funding);
ownCrowdFunding[msg.sender].push(funding);
}
constructor(string pro_name1,uint256 endtime1,uint256 need_money1,uint256 peo_money1,SupportFunding _supportFunnding) public {
launch = msg.sender;
pro_name = pro_name1;
endtime = block.timestamp + endtime1;
peo_money = peo_money1;
need_money = need_money1;
supportMoney = peo_money;
supportFunnding = _supportFunnding;
}
pragma solidity ^0.4.26;
import './SupportFunding.sol';
contract Funding{
SupportFunding supportFunnding;
string public pro_name;
uint256 public endtime;
uint256 public need_money;
uint256 public peo_money;
address public launch;
mapping (address=>bool) isVoter;
address[] investors;
uint256 supportMoney;
constructor(string pro_name1,uint256 endtime1,uint256 need_money1,uint256 peo_money1,SupportFunding _supportFunnding) public {
launch = msg.sender;
pro_name = pro_name1;
endtime = block.timestamp + endtime1;
peo_money = peo_money1;
need_money = need_money1;
supportMoney = peo_money;
supportFunnding = _supportFunnding;
}
enum AppliStatue{
//正在进行中,已赞成,已结束
voting, approved, finish
}
struct Application{
//花费的请求
string spendReason;
//商家的地址
address seller;
//请求的状态
AppliStatue statue;
//赞成的数量
uint256 approve;
//请求花费多少
uint256 cost;
//每个投资者的投资状况
mapping(address=>bool) isVotedMap;
}
Application[] allApplication;
//众筹失败,返回钱,只能项目发起者退回
function invest() public payable{
require(msg.value == 1000);
investors.push(msg.sender);
isVoter[msg.sender] = true;
//this表示当前合约
supportFunnding.setJoinFunding(msg.sender, this);
}
function getName() public view returns (string){
return pro_name;
}
function getContracbalance() public view returns(uint256){
return address(this).balance;
}
function getInvestors() public view returns (address[]){
return investors;
}
function createEat(string _spendReason, address _seller,uint256 _cost ) public {
Application memory myRequest = Application({
spendReason : _spendReason,
seller : _seller,
statue : AppliStatue.voting,
approve : 0,
cost :_cost
});
allApplication.push(myRequest);
}
//投资人对花费请求进行批准
function voteRequest(uint256 i) public{
//判断投资人是否据有投资资格
require(isVoter[msg.sender] == true);
//这里一定是storage 类型
Application storage app = allApplication[i];
//判断是否已经投过票
require(app.isVotedMap[msg.sender] == false);
app.approve = app.approve+ 1;
app.isVotedMap[msg.sender] == true;
}
function startSpend(uint256 i) public{
Application storage app = allApplication[i];
//判断投票是否过半
require(app.approve * 2 > investors.length);
//判断合约的钱是否大于请求的钱
require(address(this).balance > app.cost);
//将花费的钱转给商家
app.seller.transfer(app.cost);
//更新花费申请的状态
app.statue = AppliStatue.finish;
}
modifier onlyManager(){
//只有投资者才拥有的权限
require(msg.sender == launch);
_;
}
function getInvestNum() public view returns (uint256){
return investors.length;
}
function leftTime() public view returns (uint256){
return endtime - block.timestamp;
}
//可以返回自定义的枚举类型
function detailApplication(uint256 i) public view returns (string, address, uint256, uint256, AppliStatue){
Application storage app = allApplication[i];
return (app.spendReason, app.seller, app.cost, app.approve, app.statue);
}
function refund() public{
require(msg.sender == launch);
for (uint256 i = 0;i < investors.length; i++){
investors[i].transfer(supportMoney);
}
delete investors;
}
}
pragma solidity ^0.4.26;
import './Fundding.sol';
import './SupportFunding.sol';
contract FactoryFundingContract{
//众筹项目工厂管理者
address public FactoryManager;
//所有的众筹项目
address [] public allCrowdFunding;
//用户创建的众筹项目
mapping(address=>address[]) ownCrowdFunding;
//用户参与的众筹项目
mapping(address=>address[]) joinCrowdFunding;
SupportFunding supportFunnding;
constructor() public{
FactoryManager = msg.sender;
//supportFunnding相当于维护了一个去全局变量
supportFunnding = new SupportFunding();
}
//创建众筹项目
function createCrowdFunding(string pro_name1,uint256 endtime1,uint256 need_money1,uint256 supportMoney1, SupportFunding supportFunding) public {
address funding = new Funding(pro_name1,endtime1,need_money1,supportMoney1,supportFunding);
allCrowdFunding.push(funding);
ownCrowdFunding[msg.sender].push(funding);
}
function getAllFunding() public view returns(address[]){
return allCrowdFunding;
}
function getAllCreatefunding() public view returns(address[]){
return ownCrowdFunding[msg.sender];
}
function getAllJoinFunding() public view returns (address[]){
return supportFunnding.getJoinFunding(msg.sender);
}
}
pragma solidity ^0.4.26;
contract SupportFunding{
mapping(address=>address[]) public joinFunding;
function getJoinFunding(address _user) public view returns (address[]){
return joinFunding[_user];
}
function setJoinFunding(address _user, address _fund) public {
joinFunding[_user].push(_fund);
}
}