Learn Solidity - Build Decentralized Application in Ethereum

Learn Solidity: Complete Example: Voting Ballot Smart Contract

In this post, we will go through the complete example of a Voting Ballot smart contract. This is a fully working smart contract for voting. [pastacode lang=”javascript” manual=”pragma%20solidity%20%5E0.4.9%3B%0A%0A%2F%2F%2F%20%40title%20Voting%20with%20delegation.%0Acontract%20Ballot%20%7B%0A%20%20%20%20%2F%2F%20This%20declares%20a%20new%20complex%20type%20which%20will%0A%20%20%20%20%2F%2F%20be%20used%20for%20variables%20later.%0A%20%20%20%20%2F%2F%20It%20will%20represent%20a%20single%20voter.%0A%20%20%20%20struct%20Voter%20%7B%0A%20%20%20%20%20%20%20%20uint%20weight%3B%20%2F%2F%20weight%20is%20accumulated%20by%20delegation%0A%20%20%20%20%20%20%20%20bool%20voted%3B%20%20%2F%2F%20if%20true%2C%20that%20person%20already%20voted%0A%20%20%20%20%20%20%20%20address%20delegate%3B%20%2F%2F%20person%20delegated%20to%0A%20%20%20%20%20%20%20%20uint%20vote%3B%20%20%20%2F%2F%20index%20of%20the%20voted%20proposal%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20This%20is%20a%20type%20for%20a%20single%20proposal.%0A%20%20%20%20struct%20Proposal%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20bytes32%20name%3B%20%20%20%2F%2F%20short%20name%20(up%20to%2032%20bytes)%0A%20%20%20%20%20%20%20%20uint%20voteCount%3B%20%2F%2F%20number%20of%20accumulated%20votes%0A%20%20%20%20%7D%0A%0A%20%20%20%20address%20public%20chairperson%3B%0A%0A%20%20%20%20%2F%2F%20This%20declares%20a%20state%20variable%20that%0A%20%20%20%20%2F%2F%20stores%20a%20%60Voter%60%20struct%20for%20each%20possible%20address.%0A%20%20%20%20mapping(address%20%3D%3E%20Voter)%20public%20voters%3B%0A%0A%20%20%20%20%2F%2F%20A%20dynamically-sized%20array%20of%20%60Proposal%60%20structs.%0A%20%20%20%20Proposal%5B%5D%20public%20proposals%3B%0A%0A%20%20%20%20%2F%2F%2F%20Create%20a%20new%20ballot%20to%20choose%20one%20of%20%60proposalNames%60.%0A%20%20%20%20function%20Ballot(bytes32%5B%5D%20proposalNames)%20%7B%0A%20%20%20%20%20%20%20%20chairperson%20%3D%20msg.sender%3B%0A%20%20%20%20%20%20%20%20voters%5Bchairperson%5D.weight%20%3D%201%3B%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20For%20each%20of%20the%20provided%20proposal%20names%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20create%20a%20new%20proposal%20object%20and%20add%20it%0A%20%20%20%20%20%20%20%20%2F%2F%20to%20the%20end%20of%20the%20array.%0A%20%20%20%20%20%20%20%20for%20(uint%20i%20%3D%200%3B%20i%20%3C%20proposalNames.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%60Proposal(%7B…%7D)%60%20creates%20a%20temporary%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Proposal%20object%20and%20%60proposals.push(…)%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20appends%20it%20to%20the%20end%20of%20%60proposals%60.%0A%20%20%20%20%20%20%20%20%20%20%20%20proposals.push(Proposal(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20proposalNames%5Bi%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20voteCount%3A%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D))%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Give%20%60voter%60%20the%20right%20to%20vote%20on%20this%20ballot.%0A%20%20%20%20%2F%2F%20May%20only%20be%20called%20by%20%60chairperson%60.%0A%20%20%20%20function%20giveRightToVote(address%20voter)%20%7B%0A%20%20%20%20%20%20%20%20if%20(msg.sender%20!%3D%20chairperson%20%7C%7C%20voters%5Bvoter%5D.voted)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%60throw%60%20terminates%20and%20reverts%20all%20changes%20to%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20the%20state%20and%20to%20Ether%20balances.%20It%20is%20often%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20a%20good%20idea%20to%20use%20this%20if%20functions%20are%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20called%20incorrectly.%20But%20watch%20out%2C%20this%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20will%20also%20consume%20all%20provided%20gas.%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20voters%5Bvoter%5D.weight%20%3D%201%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%2F%20Delegate%20your%20vote%20to%20the%20voter%20%60to%60.%0A%20%20%20%20function%20delegate(address%20to)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20assigns%20reference%0A%20%20%20%20%20%20%20%20Voter%20sender%20%3D%20voters%5Bmsg.sender%5D%3B%0A%20%20%20%20%20%20%20%20if%20(sender.voted)%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%3B%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20Forward%20the%20delegation%20as%20long%20as%0A%20%20%20%20%20%20%20%20%2F%2F%20%60to%60%20also%20delegated.%0A%20%20%20%20%20%20%20%20%2F%2F%20In%20general%2C%20such%20loops%20are%20very%20dangerous%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20because%20if%20they%20run%20too%20long%2C%20they%20might%0A%20%20%20%20%20%20%20%20%2F%2F%20need%20more%20gas%20than%20is%20available%20in%20a%20block.%0A%20%20%20%20%20%20%20%20%2F%2F%20In%20this%20case%2C%20the%20delegation%20will%20not%20be%20executed%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20but%20in%20other%20situations%2C%20such%20loops%20might%0A%20%20%20%20%20%20%20%20%2F%2F%20cause%20a%20contract%20to%20get%20%22stuck%22%20completely.%0A%20%20%20%20%20%20%20%20while%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20voters%5Bto%5D.delegate%20!%3D%20address(0)%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20voters%5Bto%5D.delegate%20!%3D%20msg.sender%0A%20%20%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20to%20%3D%20voters%5Bto%5D.delegate%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20We%20found%20a%20loop%20in%20the%20delegation%2C%20not%20allowed.%0A%20%20%20%20%20%20%20%20if%20(to%20%3D%3D%20msg.sender)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20Since%20%60sender%60%20is%20a%20reference%2C%20this%0A%20%20%20%20%20%20%20%20%2F%2F%20modifies%20%60voters%5Bmsg.sender%5D.voted%60%0A%20%20%20%20%20%20%20%20sender.voted%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20sender.delegate%20%3D%20to%3B%0A%20%20%20%20%20%20%20%20Voter%20delegate%20%3D%20voters%5Bto%5D%3B%0A%20%20%20%20%20%20%20%20if%20(delegate.voted)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20If%20the%20delegate%20already%20voted%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20directly%20add%20to%20the%20number%20of%20votes%0A%20%20%20%20%20%20%20%20%20%20%20%20proposals%5Bdelegate.vote%5D.voteCount%20%2B%3D%20sender.weight%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20If%20the%20delegate%20did%20not%20vote%20yet%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20add%20to%20her%20weight.%0A%20%20%20%20%20%20%20%20%20%20%20%20delegate.weight%20%2B%3D%20sender.weight%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%2F%20Give%20your%20vote%20(including%20votes%20delegated%20to%20you)%0A%20%20%20%20%2F%2F%2F%20to%20proposal%20%60proposals%5Bproposal%5D.name%60.%0A%20%20%20%20function%20vote(uint%20proposal)%20%7B%0A%20%20%20%20%20%20%20%20Voter%20sender%20%3D%20voters%5Bmsg.sender%5D%3B%0A%20%20%20%20%20%20%20%20if%20(sender.voted)%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%3B%0A%20%20%20%20%20%20%20%20sender.voted%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20sender.vote%20%3D%20proposal%3B%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20If%20%60proposal%60%20is%20out%20of%20the%20range%20of%20the%20array%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20this%20will%20throw%20automatically%20and%20revert%20all%0A%20%20%20%20%20%20%20%20%2F%2F%20changes.%0A%20%20%20%20%20%20%20%20proposals%5Bproposal%5D.voteCount%20%2B%3D%20sender.weight%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%2F%20%40dev%20Computes%20the%20winning%20proposal%20taking%20all%0A%20%20%20%20%2F%2F%2F%20previous%20votes%20into%20account.%0A%20%20%20%20function%20winningProposal()%20constant%0A%20%20%20%20%20%20%20%20%20%20%20%20returns%20(uint%20winningProposal)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20uint%20winningVoteCount%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for%20(uint%20p%20%3D%200%3B%20p%20%3C%20proposals.length%3B%20p%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(proposals%5Bp%5D.voteCount%20%3E%20winningVoteCount)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20winningVoteCount%20%3D%20proposals%5Bp%5D.voteCount%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20winningProposal%20%3D%20p%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Calls%20winningProposal()%20function%20to%20get%20the%20index%0A%20%20%20%20%2F%2F%20of%20the%20winner%20contained%20in%20the%20proposals%20array%20and%20then%0A%20%20%20%20%2F%2F%20returns%20the%20name%20of%20the%20winner%0A%20%20%20%20function%20winnerName()%20constant%0A%20%20%20%20%20%20%20%20%20%20%20%20returns%20(bytes32%20winnerName)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20winnerName%20%3D%20proposals%5BwinningProposal()%5D.name%3B%0A%20%20%20%20%7D%0A%7D” message=”” highlight=”” provider=”manual”/]…
Read More
Learn Solidity - Build Decentralized Application in Ethereum

Learn Solidity: Complete Example: Crowd Funding Smart Contract

In this post, we will go through the complete example of a sample crowd funding smart contract. This is a fully working smart contract for crowd sale. [pastacode lang=”javascript” manual=”pragma%20solidity%200.4.8%3B%0A%0Acontract%20CrowdFunder%20%7B%0A%20%20%20%20%0A%20%20%20%20address%20public%20creator%3B%0A%20%20%20%20address%20public%20fundRecipient%3B%20%2F%2F%20creator%20may%20be%20different%20than%20recipient%0A%20%20%20%20uint%20public%20minimumToRaise%3B%20%2F%2F%20required%20to%20reach%20at%20least%20this%20much%2C%20else%20everyone%20gets%20refund%0A%20%20%20%20string%20campaignUrl%3B%20%0A%20%20%20%20byte%20constant%20version%20%3D%201%3B%0A%0A%20%20%20%20%2F%2F%20Data%20structures%0A%20%20%20%20enum%20State%20%7B%0A%20%20%20%20%20%20%20%20Fundraising%2C%0A%20%20%20%20%20%20%20%20ExpiredRefund%2C%0A%20%20%20%20%20%20%20%20Successful%2C%0A%20%20%20%20%20%20%20%20Closed%0A%20%20%20%20%7D%0A%0A%20%20%20%20struct%20Contribution%20%7B%0A%20%20%20%20%20%20%20%20uint%20amount%3B%0A%20%20%20%20%20%20%20%20address%20contributor%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20State%20variables%0A%20%20%20%20State%20public%20state%20%3D%20State.Fundraising%3B%20%2F%2F%20initialize%20on%20create%0A%20%20%20%20uint%20public%20totalRaised%3B%0A%20%20%20%20uint%20public%20currentBalance%3B%0A%20%20%20%20uint%20public%20raiseBy%3B%0A%20%20%20%20uint%20public%20completeAt%3B%0A%20%20%20%20Contribution%5B%5D%20contributions%3B%0A%0A%20%20%20%20event%20LogFundingReceived(address%20addr%2C%20uint%20amount%2C%20uint%20currentTotal)%3B%0A%20%20%20%20event%20LogWinnerPaid(address%20winnerAddress)%3B%0A%20%20%20%20event%20LogFunderInitialized(%0A%20%20%20%20%20%20%20%20address%20creator%2C%0A%20%20%20%20%20%20%20%20address%20fundRecipient%2C%0A%20%20%20%20%20%20%20%20string%20url%2C%0A%20%20%20%20%20%20%20%20uint%20_minimumToRaise%2C%20%0A%20%20%20%20%20%20%20%20uint256%20raiseby%0A%20%20%20%20)%3B%0A%0A%20%20%20%20modifier%20inState(State%20_state)%20%7B%0A%20%20%20%20%20%20%20%20if%20(state%20!%3D%20_state)%20throw%3B%0A%20%20%20%20%20%20%20%20_%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20modifier%20isCreator()%20%7B%0A%20%20%20%20%20%20%20%20if%20(msg.sender%20!%3D%20creator)%20throw%3B%0A%20%20%20%20%20%20%20%20_%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Wait%201%20hour%20after%20final%20contract%20state%20before%20allowing%20contract%20destruction%0A%20%20%20%20modifier%20atEndOfLifecycle()%20%7B%0A%20%20%20%20%20%20%20%20if(!((state%20%3D%3D%20State.ExpiredRefund%20%7C%7C%20state%20%3D%3D%20State.Successful)%20%26%26%20completeAt%20%2B%201%20hours%20%3C%20now))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20_%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20CrowdFunder(%0A%20%20%20%20%20%20%20%20uint%20timeInHoursForFundraising%2C%0A%20%20%20%20%20%20%20%20string%20_campaignUrl%2C%0A%20%20%20%20%20%20%20%20address%20_fundRecipient%2C%0A%20%20%20%20%20%20%20%20uint%20_minimumToRaise)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20creator%20%3D%20msg.sender%3B%0A%20%20%20%20%20%20%20%20fundRecipient%20%3D%20_fundRecipient%3B%0A%20%20%20%20%20%20%20%20campaignUrl%20%3D%20_campaignUrl%3B%0A%20%20%20%20%20%20%20%20minimumToRaise%20%3D%20_minimumToRaise%20*%201000000000000000000%3B%20%2F%2Fconvert%20to%20wei%0A%20%20%20%20%20%20%20%20raiseBy%20%3D%20now%20%2B%20(timeInHoursForFundraising%20*%201%20hours)%3B%0A%20%20%20%20%20%20%20%20currentBalance%20%3D%200%3B%0A%20%20%20%20%20%20%20%20LogFunderInitialized(%0A%20%20%20%20%20%20%20%20%20%20%20%20creator%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fundRecipient%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20campaignUrl%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20minimumToRaise%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20raiseBy)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20contribute()%0A%20%20%20%20public%0A%20%20%20%20inState(State.Fundraising)%20payable%20returns%20(uint256)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20contributions.push(%0A%20%20%20%20%20%20%20%20%20%20%20%20Contribution(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20amount%3A%20msg.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contributor%3A%20msg.sender%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%20%2F%2F%20use%20array%2C%20so%20can%20iterate%0A%20%20%20%20%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20%20%20%20%20totalRaised%20%2B%3D%20msg.value%3B%0A%20%20%20%20%20%20%20%20currentBalance%20%3D%20totalRaised%3B%0A%20%20%20%20%20%20%20%20LogFundingReceived(msg.sender%2C%20msg.value%2C%20totalRaised)%3B%0A%0A%20%20%20%20%20%20%20%20checkIfFundingCompleteOrExpired()%3B%0A%20%20%20%20%20%20%20%20return%20contributions.length%20-%201%3B%20%2F%2F%20return%20id%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20checkIfFundingCompleteOrExpired()%20%7B%0A%20%20%20%20%20%20%20%20if%20(totalRaised%20%3E%20minimumToRaise)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20state%20%3D%20State.Successful%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20payOut()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20could%20incentivize%20sender%20who%20initiated%20state%20change%20here%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(%20now%20%3E%20raiseBy%20)%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20state%20%3D%20State.ExpiredRefund%3B%20%2F%2F%20backers%20can%20now%20collect%20refunds%20by%20calling%20getRefund(id)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20completeAt%20%3D%20now%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20function%20payOut()%0A%20%20%20%20%20%20%20%20public%0A%20%20%20%20%20%20%20%20inState(State.Successful)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(!fundRecipient.send(this.balance))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20throw%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20state%20%3D%20State.Closed%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20currentBalance%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20LogWinnerPaid(fundRecipient)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20function%20getRefund(uint256%20id)%0A%20%20%20%20%20%20%20%20public%0A%20%20%20%20%20%20%20%20inState(State.ExpiredRefund)%20%0A%20%20%20%20%20%20%20%20returns%20(bool)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(contributions.length%20%3C%3D%20id%20%7C%7C%20id%20%3C%200%20%7C%7C%20contributions%5Bid%5D.amount%20%3D%3D%200%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20throw%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20uint%20amountToRefund%20%3D%20contributions%5Bid%5D.amount%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20contributions%5Bid%5D.amount%20%3D%200%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if(!contributions%5Bid%5D.contributor.send(amountToRefund))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contributions%5Bid%5D.amount%20%3D%20amountToRefund%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20totalRaised%20-%3D%20amountToRefund%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20currentBalance%20%3D%20totalRaised%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20function%20removeContract()%0A%20%20%20%20%20%20%20%20public%0A%20%20%20%20%20%20%20%20isCreator()%0A%20%20%20%20%20%20%20%20atEndOfLifecycle()%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20selfdestruct(msg.sender)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20creator%20gets%20all%20money%20that%20hasn’t%20be%20claimed%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20function%20()%20%7B%20throw%3B%20%7D%0A%20%20%20%20%7D” message=””…
Read More
Learn Solidity - Build Decentralized Application in Ethereum

Learn Solidity: Exceptions in Solidity

In this post, we will learn how Exceptions work in Solidity Language. [pastacode lang=”javascript” manual=”pragma%20solidity%200.4.8%3B%0A%0A%20%20%20%20%2F*%0A%20%20%20%20*%20%40title%20A%20Simple%20Example%0A%20%20%20%20*%20%40author%20Toshendra%20Sharma%0A%20%20%20%20*%20%40notice%20Example%20for%20the%20Solidity%20Course%0A%20%20%20%20*%20%0A%20%20%20%20*%2F%0A%0A%2F%2F%20There%20are%20some%20cases%20where%20exceptions%20are%20thrown%20automatically.%20%0A%2F%2F%20Otherwise%20You%20can%20use%20the%20throw%20instruction%20to%20throw%20an%20exception%20manually.%20%0A%2F%2F%20The%20effect%20of%20an%20exception%20is%20that%20the%20currently%20executing%20call%20is%20%0A%2F%2F%20stopped%20and%20reverted.%20It%20means%20all%20changes%20to%20the%20state%20and%20balances%20are%20undone%20%0A%2F%2F%20and%20the%20exception%20is%20also%20%E2%80%9Cbubbled%20up%E2%80%9D%20through%20Solidity%20function%20calls%20%0A%2F%2F%20when%20exceptions%20are%20send%20all%20the%20low-level%20functions%20call%2C%20delegate%20calls%20and%20call%20code%2C%20%0A%2F%2F%20will%20return%20false.%0A%0A%2F%2F%20It%20is%20interesting%20to%20note%20that%20Catching%20exceptions%20is%20not%20yet%20possible.%0A%0A%2F%2F%20Lets%20see%20an%20example%2C%20to%20know%20how%20a%20throw%20can%20be%20used%20to%20easily%20revert%20%0A%2F%2F%20an%20Ether%20transfer%20and%20also%20how%20to%20check%20the%20return%20value%20of%20send.%20%0A%0Acontract%20Sharer%20%7B%0A%20%20%20%20function%20sendHalf(address%20addr)%20payable%20returns%20(uint%20balance)%20%7B%0A%20%20%20%20%20%20%20%20if%20(!addr.send(msg.value%20%2F%202))%20%2F%2F%20send%20half%20of%20the%20ether%20to%20the%20addr%20mentioned%20in%20the%20call.%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%3B%20%2F%2F%20here%20throw%20is%20a%20User%20Generated%20Exception%20and%20it%20also%20reverts%20the%20transfer%20to%20Sharer%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20assert(condition)%20can%20also%20generate%20a%20User%20Exception%20%20%0A%20%20%20%20%20%20%20%20return%20this.balance%3B%0A%20%20%20%20%7D%0A%7D%0A%0A%20%20%0A%0A%2F%2F%20Currently%2C%20Solidity%20automatically%20generates%20a%20runtime%20exception%20in%20the%20following%20situations%3A%0A%0A%2F%2F%20If%20you%20access%20an%20array%20at%20a%20too%20large%20or%20negative%20index%20(i.e.%20x%5Bi%5D%20where%20i%20%3E%3D%20x.length%20or%20i%20%3C%200).%0A%0A%2F%2F%20If%20you%20access%20a%20fixed-length%20bytesN%20at%20a%20too%20large%20or%20negative%20index.%0A%0A%2F%2F%20If%20you%20call%20a%20function%20via%20a%20message%20call%20but%20it%20does%20not%20finish%20properly%20%0A%2F%2F%20(i.e.%20it%20runs%20out%20of%20gas%2C%20has%20no%20matching%20function%2C%20or%20throws%20an%20exception%20itself)%2C%20%0A%2F%2F%20except%20when%20a%20low%20level%20operation%20call%2C%20send%2C%20delegatecall%20or%20callcode%20is%20used.%20%0A%2F%2F%20The%20low%20level%20operations%20never%20throw%20exceptions%20but%20indicate%20failures%20by%20returning%20false.%0A%0A%2F%2F%20If%20you%20create%20a%20contract%20using%20the%20new%20keyword%20but%20the%20contract%20creation%20does%20not%20%0A%2F%2F%20finish%20properly%20(see%20above%20for%20the%20definition%20of%20%E2%80%9Cnot%20finish%20properly%E2%80%9D).%0A%0A%2F%2F%20If%20you%20divide%20or%20modulo%20by%20zero%20(e.g.%205%20%2F%200%20or%2023%20%25%200).%0A%0A%2F%2F%20If%20you%20shift%20by%20a%20negative%20amount.%0A%0A%2F%2F%20If%20you%20convert%20a%20value%20too%20big%20or%20negative%20into%20an%20enum%20type.%0A%0A%2F%2F%20If%20you%20perform%20an%20external%20function%20call%20targeting%20a%20contract%20that%20contains%20no%20code.%0A%0A%2F%2F%20If%20your%20contract%20receives%20Ether%20via%20a%20public%20function%20without%20payable%20modifier%20%0A%2F%2F%20(including%20the%20constructor%20and%20the%20fallback%20function).%0A%0A%2F%2F%20If%20your%20contract%20receives%20Ether%20via%20a%20public%20getter%20function.%0A%0A%2F%2F%20If%20you%20call%20a%20zero-initialized%20variable%20of%20internal%20function%20type.%0A%0A%2F%2F%20If%20a%20.transfer()%20fails.” message=”” highlight=”” provider=”manual”/]
Read More
Learn Solidity - Build Decentralized Application in Ethereum

Learn Solidity: Events & Logging in Solidity

In this post, we will learn how to declare & use events for logging in Solidity Language. [pastacode lang=”javascript” manual=”pragma%20solidity%200.4.8%3B%0A%0A%0A%2F%2F%20Events%20are%20the%20way%20to%20inform%20external%20monitoring%20entities%20about%20the%20%0A%2F%2F%20cenrtain%20activities%20in%20the%20smart%20contracts%0A%2F%2F%20they%20can%20also%20be%20used%20as%20a%20log%20in%20the%20system.%0A%0A%2F%2F%20lets%20checkout%20out%20this%20coin%20example%20where%20we%20will%20jump%20deeper%0A%2F%2F%20in%20the%20next%20lecture.%0A%0A%0A%0Acontract%20Coin%20%7B%0A%20%20%20%20%2F*%0A%20%20%20%20*%20%40title%20A%20Simple%20Subcurrency%20Example%0A%20%20%20%20*%20%40author%20Toshendra%20Sharma%0A%20%20%20%20*%20%40notice%20Example%20for%20the%20Solidity%20Course%0A%20%20%20%20*%20%40dev%20This%20is%20only%20for%20demo%20the%20simple%20Coin%20example%0A%20%20%20%20*%20%0A%20%20%20%20*%2F%0A%20%20%20%20address%20public%20minter%3B%0A%20%20%20%20uint%20public%20totalCoins%3B%0A%0A%0A%20%20%20%20event%20LogCoinsMinted(address%20deliveredTo%2C%20uint%20amount)%3B%0A%20%20%20%20event%20LogCoinsSent(address%20sentTo%2C%20uint%20amount)%3B%0A%0A%20%20%20%20%2F%2F%20Please%20note%20the%20caps%20lock.%20Your%20mist%20walled%20will%20you%20capital%20letters%20%0A%20%20%20%20%2F%2F%20to%20seperate%20th%20event%20name%20into%20a%20meaningful%20name.%20%0A%0A%20%20%20%20%2F%2F%20As%20I%20said%20Events%20allow%20the%20convenient%20usage%20of%20the%20EVM%20logging%20facilities.%20%0A%20%20%20%20%2F%2F%20Events%20are%20inheritable%20members%20of%20contracts.%20When%20they%20are%20called%2C%20%0A%20%20%20%20%2F%2F%20they%20cause%20the%20arguments%20to%20be%20stored%20in%20the%20transaction’s%20log.%20%0A%20%20%20%20%2F%2F%20Up%20to%20three%20parameters%20can%20receive%20the%20attribute%20indexed%20which%20%0A%20%20%20%20%2F%2F%20will%20cause%20the%20respective%20arguments%20to%20be%20treated%20as%20log%20topics%20%0A%20%20%20%20%2F%2F%20instead%20of%20data.%20The%20hash%20of%20the%20signature%20of%20the%20event%20is%20one%20of%20%0A%20%20%20%20%2F%2F%20the%20topics%20except%20you%20declared%20the%20event%20with%20anonymous%20specifier.%20%0A%20%20%20%20%2F%2F%20All%20non-indexed%20arguments%20will%20be%20stored%20in%20the%20data%20part%20of%20the%20log.%20%0A%0A%20%20%20%20mapping%20(address%20%3D%3E%20uint)%20balances%3B%0A%20%20%20%20function%20Coin(uint%20initialCoins)%20%7B%0A%20%20%20%20%20%20%20%20minter%20%3D%20msg.sender%3B%0A%20%20%20%20%20%20%20%20totalCoins%20%3D%20initialCoins%3B%0A%20%20%20%20%20%20%20%20balances%5Bminter%5D%20%3D%20initialCoins%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%2F%20%40notice%20Mint%20the%20coins%0A%20%20%20%20%2F%2F%2F%20%40dev%20This%20does%20not%20return%20any%20value%0A%20%20%20%20%2F%2F%2F%20%40param%20owner%20address%20of%20the%20coin%20owner%2C%20amount%20amount%20of%20coins%20to%20be%20delivered%20to%20owner%0A%20%20%20%20%2F%2F%2F%20%40return%20Nothing%0A%20%20%20%20function%20mint(address%20owner%2C%20uint%20amount)%20%7B%0A%20%20%20%20%20%20%20%20if%20(msg.sender%20!%3D%20minter)%20return%3B%0A%20%20%20%20%20%20%20%20balances%5Bowner%5D%20%2B%3D%20amount%3B%0A%20%20%20%20%20%20%20%20totalCoins%20%2B%3D%20amount%3B%0A%20%20%20%20%20%20%20%20LogCoinsMinted(owner%2C%20amount)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20send(address%20receiver%2C%20uint%20amount)%20%7B%0A%20%20%20%20%20%20%20%20if%20(balances%5Bmsg.sender%5D%20%3C%20amount)%20return%3B%0A%20%20%20%20%20%20%20%20balances%5Bmsg.sender%5D%20-%3D%20amount%3B%0A%20%20%20%20%20%20%20%20balances%5Breceiver%5D%20%2B%3D%20amount%3B%0A%20%20%20%20%20%20%20%20LogCoinsSent(receiver%2C%20amount)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20queryBalance(address%20addr)%20constant%20returns%20(uint%20balance)%20%7B%0A%20%20%20%20%20%20%20%20return%20balances%5Baddr%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20killCoin()%20returns%20(bool%20status)%20%7B%0A%20%20%20%20%20%20%20%20if%20(msg.sender%20!%3D%20minter)%20throw%3B%0A%20%20%20%20%20%20%20%20selfdestruct(minter)%3B%0A%20%20%20%20%7D%0A%7D” message=”” highlight=”” provider=”manual”/]  
Read More