Ethereum-Wallet-Dapp

乙太坊眾籌合約 Stuck Ether

  • January 18, 2018

我試著創建一個眾包契約。

在將我的自定義代幣發送到合約並通過將乙太幣發送到眾籌合約進行測試購買後,現在出現了一個問題,眾籌已經以資助的乙太幣結束,剩餘的自定義代幣仍在眾籌合約中並且沒有發送到受益人。我錯過了什麼嗎?

“資助的乙太幣和剩餘的 ICO 代幣卡在眾籌合約中”

下面是使用的程式碼。“來源 ethereum.org”


pragma solidity ^0.4.18;

interface token { 
   function transfer(address receiver, uint amount) public ;

}

contract Crowdsale {
   address public beneficiary;
   uint public fundingGoal;
   uint public amountRaised;
   uint public deadline;
   uint public price;
   token public tokenReward;
   mapping(address => uint256) public balanceOf;
   bool fundingGoalReached = false;
   bool crowdsaleClosed = false;

   event GoalReached(address recipient, uint totalAmountRaised);
   event FundTransfer(address backer, uint amount, bool isContribution);

   /**
    * Constrctor function
    *
    * Setup the owner
    */
   function Crowdsale(
       address ifSuccessfulSendTo,
       uint fundingGoalInEthers,
       uint durationInMinutes,
       uint etherCostOfEachToken,
       address addressOfTokenUsedAsReward
   ) public {
       beneficiary = ifSuccessfulSendTo;
       fundingGoal = fundingGoalInEthers * 1 ether;
       deadline = now + durationInMinutes * 1 minutes;
       price = etherCostOfEachToken * 0.0005 ether;
       tokenReward = token(addressOfTokenUsedAsReward);
   }

   /**
    * Fallback function
    *
    * The function without name is the default function that is called whenever anyone sends funds to a contract
    */
   function () private payable {
       require(!crowdsaleClosed);
       uint amount = msg.value;
       balanceOf[msg.sender] += amount;
       amountRaised += amount;
       tokenReward.transfer(msg.sender, amount / price);
       FundTransfer(msg.sender, amount, true);
   }

   modifier afterDeadline() { if (now >= deadline) _; }

   /**
    * Check if goal was reached
    *
    * Checks if the goal or time limit has been reached and ends the campaign
    */
   function checkGoalReached() private afterDeadline {
       if (amountRaised >= fundingGoal){
           fundingGoalReached = true;
           GoalReached(beneficiary, amountRaised);
       }
       crowdsaleClosed = true;
   }


   /**
    * Withdraw the funds
    *
    * Checks to see if goal or time limit has been reached, and if so, and the funding goal was reached,
    * sends the entire amount to the beneficiary. If goal was not reached, each contributor can withdraw
    * the amount they contributed.
    */
   function safeWithdrawal() private afterDeadline {
       if (!fundingGoalReached) {
           uint amount = balanceOf[msg.sender];
           balanceOf[msg.sender] = 0;
           if (amount > 0) {
               if (msg.sender.send(amount)) {
                   FundTransfer(msg.sender, amount, false);
               } else {
                   balanceOf[msg.sender] = amount;
               }
           }
       }

       if (fundingGoalReached && beneficiary == msg.sender) {
           if (beneficiary.send(amountRaised)) {
               FundTransfer(beneficiary, amountRaised, false);
           } else {
               //If we fail to send the funds to beneficiary, unlock funders balance
               fundingGoalReached = false;
           }
       }
   }
}

您只能在合約中使用私有功能,這意味著您標記為私有的所有功能(包括 safeWithdrawal)在您嘗試提取資金時都將不起作用。

如果你想從外部訪問它,你應該使用 public 修飾符而不是 private。

你在主網上試過嗎?在那種情況下,我很擔心您的資金將永遠失去。:(

引用自:https://ethereum.stackexchange.com/questions/36723