Contract-Development

部署在測試網上的眾籌無法從另一個測試賬戶接收乙太幣

  • October 2, 2017

我為眾籌部署了一個智能合約,它具有 receiveETH() 函式:

function receiveETH(address beneficiary) internal {      
   uint coinToSend = bonus(msg.value.mul(COIN_PER_ETHER).div(1 ether)); // Compute the number to send
   Backer backer = backers[beneficiary];
   coin.transfer(beneficiary, coinToSend); // Transfer right now 
   backer.coinSent = backer.coinSent.add(coinToSend);
   backer.weiReceived = backer.weiReceived.add(msg.value); // Update the total wei collected during the crowdfunding for this backer    
   etherReceived = etherReceived.add(msg.value); // Update the total wei collected during the crowdfunding
   coinSentToEther = coinSentToEther.add(coinToSend);
   // Send events
   LogCoinsEmited(msg.sender ,coinToSend);
   LogReceivedETH(beneficiary, etherReceived); 
}

我已經在測試網上部署了這個合約,但它無法接收乙太幣。例如,我使用一些測試賬戶向部署的智能合約地址發送乙太幣,每次在etherscan上顯示成功並扣除Tx費用,而乙太幣沒有成功轉移,智能合約乙太幣數量保持為0。連結在此處輸入圖像描述

我想知道這裡有什麼問題?眾籌合約是否具有每次新轉賬時觸發的功能?

PS剛剛注意到我定義了備份功能:

function() stopInEmergency respectTimeFrame payable {
   receiveETH(msg.sender);
}

它對我來說看起來很完美,但是當我嘗試發送給它時,我的合約仍然沒有收到乙太幣。這裡還有什麼問題?

自己解決了這個問題,這是因為我沒有將我的代幣合約所有權轉移到我的眾籌合約中。

關鍵字意味著您的internal函式只能從合約或從它派生的合約中呼叫。你不能公開稱呼它。

如果您希望此函式可從合約外部呼叫,則應更改internalpublic.

如果您計劃通過此函式呼叫發送任何乙太坊,您確實需要添加。payable

要解決此問題,請將您更改internalpublic payable,這應該使該函式可以公開呼叫,並使其能夠與交易一起發送到乙太坊。

眾籌合約是否具有每次新轉賬時觸發的功能?

對於轉移乙太坊,是的。這將是備份功能。雖然,只有 2300 氣體可用。目前沒有呼叫 ERC20 代幣轉賬的函式。

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