前提・実現したいこと
solidityを用いてクラウドファンディングを行うコントラクトを作っています。
「最低投資額を設定し、それに満たない投資額は弾く。目標額と現在の総額の差が最低額より小さい場合は差額と同じ投資額のみ受け付ける」という条件を付与したいのですが、上手く行きません。アドバイス頂きたいです。
発生している問題・エラーメッセージ
目標額に達し、締切の時間になっても、fundingと表示され、クラウドファンディングが終わらない。
最低投資額以下の金額でも通ってしまう。
該当のソースコード
solidity
1pragma solidity ^0.4.11; 2contract CrowdFunding { 3 // 投資家 4 struct Investor { 5 address addr; // 投資家のアドレス 6 uint amount; // 投資額 7 } 8 9 address public owner; // コントラクトのオーナー 10 uint public numInvestors; // 投資家の数 11 uint public deadline; // 締め切り(UnixTime) 12 string public status; // キャンペーンのステータス 13 bool public ended; // キャンペーンが終了しているかどうか 14 uint public goalAmount; // 目標額 15 uint public totalAmount; // 投資の総額 16 uint public minAmount; //最低投資額の設定 17 uint public difference; //目標額と現在の金額の差 18 mapping (uint => Investor) public investors; // 投資家管理用のマップ 19 20 modifier onlyOwner () { 21 require(msg.sender == owner); 22 _; 23 } 24 25 /// コンストラクタ 26 function CrowdFunding(uint _duration, uint _goalAmount, uint _minAmount) public { 27 owner = msg.sender; 28 29 // 締め切りをUnixTimeで設定 30 deadline = now + _duration; 31 32 goalAmount = _goalAmount; 33 status = "Funding"; 34 ended = false; 35 36 numInvestors = 0; 37 totalAmount = 0; 38 } 39 40 /// 投資する際に呼び出される関数 41 function fund() public payable { 42 // キャンペーンが終わっていれば処理を中断する 43 require(!ended); 44 45 Investor storage inv = investors[numInvestors++]; 46 inv.addr = msg.sender; 47 inv.amount = msg.value; 48 totalAmount += inv.amount; 49 } 50 51 /// 目標額に達したかを確認する 52 /// また、キャンペーンの成功/失敗に応じたetherの送金を行う 53 function checkGoalReached() public onlyOwner { 54 // キャンペーンが終わっていれば処理を中断する 55 require(!ended); 56 57 // 締め切り前の場合は処理を中断する 58 require(now >= deadline); 59 60 if(totalAmount >= goalAmount) { // キャンペーンに成功した場合 61 status = "Campaign Succeeded"; 62 ended = true; 63 // オーナーにコントラクト内のすべてのetherを送金する 64 if(!owner.send(this.balance)) { 65 revert(); 66 } 67 } else { // キャンペーンに失敗した場合 68 uint i = 0; 69 status = "Campaign Failed"; 70 ended = true; 71 72 // 投資家毎にetherを返金する 73 while(i <= numInvestors) { 74 if(!investors[i].addr.send(investors[i].amount)) { 75 revert(); 76 } 77 i++; 78 } 79 } 80 } 81 82 ///最低投資額に満たない投資を弾く関数 83 //目標額と現在額の差が最低投資額より小さかった場合はその金額のみ許可 84 function setMinAmount() public payable { 85 difference = goalAmount - totalAmount; 86 if(difference >= minAmount) { 87 require(msg.value < minAmount); 88 } 89 else { 90 require(msg.value != difference); 91 } 92 } 93 94 /// コントラクトを破棄するための関数 95 function kill() public onlyOwner { 96 selfdestruct(owner); 97 } 98} 99
試したこと
set.minAmountのpayableを消してみたり、コントラクタ内にminAmountの定義を試みたりしました。
補足情報(FW/ツールのバージョンなど)
mist wallet上でデプロイしてます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/09 08:56