1.业务逻辑
2.整体结构
pragma solidity^0.4.24;
contract FundingFactory {
address public platformManager;
address[] fundingsAarry;
mapping(address => address[]) creatorFundingsArray;
SupporterFunding supporterFunding;
constructor() {
platformManager = msg.sender;
supporterFunding = new SupporterFunding();
}
function createFunding(string _projectName, uint256 _supportMoney, uint256 _targetMoney, uint256 _durationTime) {
address funding = new Funding(_projectName, _supportMoney, _targetMoney,
_durationTime, msg.sender, supporterFunding);
fundingsAarry.push(funding);
creatorFundingsArray[msg.sender].push(funding);
}
function getAllFundings() public view returns(address[]) {
return fundingsAarry;
}
function getCreatorFundings() public view returns(address[]) {
return creatorFundingsArray[msg.sender];
}
function getSupporterFundings() public view returns(address[]) {
return supporterFunding.getFunding(msg.sender);
}
}
contract SupporterFunding {
mapping(address => address[]) supportFundingsArray;
function joinFunding(address addr, address funding) {
supportFundingsArray[addr].push(funding);
}
function getFunding(address addr) public returns (address[]) {
return supportFundingsArray[addr];
}
}
contract Funding {
address public manager;
string public projectName;
uint256 public supportMoney;
uint256 public targetMoney;
uint256 endTime;
mapping(address=> bool) supporterExistMap;
SupporterFunding supporterFunding;
constructor(string _projectName, uint256 _supportMoney, uint256 _targetMoney,
uint256 _durationTime, address _creator, SupporterFunding _supporterFunding) public {
manager = _creator;
projectName = _projectName;
supportMoney = _supportMoney;
targetMoney = _targetMoney;
endTime = now + _durationTime;
supporterFunding = _supporterFunding;
}
address[] supporters;
function support() public payable {
require(msg.value == supportMoney);
supporters.push(msg.sender);
supporterExistMap[msg.sender] = true;
supporterFunding.joinFunding(msg.sender, this);
}
function refund() onlyManager public {
for (uint256 i = 0; i< supporters.length; i ++) {
supporters[i].transfer(supportMoney);
}
}
enum RequestStatus { Voting, Approved, Completed}
struct Request {
string purpose;
address seller;
uint256 cost;
uint256 approveCount;
mapping(address => bool) voteStatus;
RequestStatus status;
}
Request[] public requests;
function createRequest(string _purpose, address _seller, uint256 _cost) onlyManager public {
Request memory req = Request({purpose: _purpose, seller: _seller, cost: _cost, approveCount: 0, status : RequestStatus.Voting});
requests.push(req);
}
function approveRequest(uint256 index) public {
require(supporterExistMap[msg.sender]);
Request storage req = requests[index];
require(req.status == RequestStatus.Voting);
require(req.voteStatus[msg.sender] == false);
req.approveCount++;
req.voteStatus[msg.sender] = true;
}
function finalizeReqeust(uint256 index) onlyManager public {
Request storage req = requests[index];
require(address(this).balance >= req.cost);
require(req.approveCount *2 > supporters.length);
req.seller.transfer(req.cost);
req.status = RequestStatus.Completed;
}
modifier onlyManager {
require(msg.sender == manager);
_;
}
function getBalance() public view returns(uint256) {
return address(this).balance;
}
function getSupporters() public view returns(address[]) {
return supporters;
}
}
3.重要函数