Code has been added to clipboard!
Solidity Reference Types Example 6
Example
pragma solidity ^0.4.11;
contract crowdFund {
// Defines a new struct type that has two fields.
struct Backer {
address addr;
uint fundAmount;
}
struct crowdFundingCampaign {
address beneficiaryAddress;
uint fundGoal;
uint numBacker;
uint fundAmount;
mapping (uint => Backer) backers;
}
uint numCrowdFundingCampaigns;
mapping (uint => crowdFundingCampaign) crowdFundingCampaigns;
function newCrowdFundingCampaign(address beneficiaryAddress, uint goal) returns (uint crowdFundingCampaignID) {
crowdFundingCampaignID = numCrowdFundingCampaigns++; // crowdFundingCampaignID is a return variable
// Create new struct and save in storage, leaving out the mapping type.
crowdFundingCampaigns[crowdFundingCampaignID] = crowdFundingCampaign(beneficiaryAddress, goal, 0, 0);
}
function contribute(uint crowdFundingCampaignID) payable {
crowdFundingCampaign storage c = crowdFundingCampaigns[crowdFundingCampaignID];
// Create a new temporary memory struct, initialise with values that are given
// and copy it over to storage.
// Note that you can also use Backer(msg.sender, msg.value) for initializing.
c.backers[c.numBacker++] = Backer({addr: msg.sender, fundAmount: msg.value});
c.fundAmount += msg.value;
}
function checkGoalReach(uint crowdFundingCampaignID) returns (bool reached) {
crowdFundingCampaign storage c = crowdFundingCampaigns[crowdFundingCampaignID];
if (c.fundAmount < c.fundGoal)
return false;
uint fundAmount = c.fundAmount;
c.fundAmount = 0;
c.beneficiaryAddress.transfer(fundAmount);
return true;
}
}