Solidity

聲明為應付款的函式在 Remix 中拋出 VMerror:revert

  • December 31, 2021

contributeMsgValue我試圖通過呼叫帶有參數["100000000000000000"]和值的支付方法來資助一個資金目標為 10000000000000000000 和資金上限 10000000000000000000 的活動,100000000000000000但我在 Remix 中收到此錯誤。

交易到 StandardCampaign.contributeMsgValue 錯誤:VM 錯誤:還原。revert 事務已恢復到初始狀態。

契約 廣告系列已擁有,廣告系列 {
列舉階段 {
眾籌運營,
眾籌失敗,
眾籌成功
}
修飾符 atStage(Stages _expectedStage) {
如果(階段()!= uint256(_expectedStage)){
扔;
} 別的 {
_;
}
}
修改有效貢獻(){
如果 (msg.value == 0
|| amountRaised + msg.value >fundingCap
|| amountRaised + msg.value = 到期
&& 早期成功 == 假
&& amountRaised = 到期 && amountRaised >=fundingGoal)
|| 早期成功 == 真
|| 籌集的金額 >= 資金上限){
return uint256(Stages.CrowdfundSuccess);
}
}
函式contributeMsgValue(uint256[] _amounts)
上市
應付
在Stage(Stages.CrowdfundOperational)
有效貢獻()
返回(uint256貢獻ID){
貢獻ID =貢獻.長度++;
貢獻[contributionID] = 貢獻({
發件人:msg.sender,
值:味精。值,
創建:block.number
});
貢獻者發送者[msg.sender].push(貢獻ID);
amountRaised += msg.value;
ContributionMade(msg.sender);
if (enhancer.notate(msg.sender, msg.value, block.number, _amounts)) {
早期成功=真;
}
}
函式 StandardCampaign(字元串 _name,
uint256 _expiry,
uint256 _fundingGoal,
uint256 _fundingCap,
地址_受益人,
地址_owner,
地址_enhancer)公共{
名稱 = _name;
到期=_到期;
資金目標 = _fundingGoal;
資金上限 = _fundingCap;
受益人=_受益人;
所有者=_所有者;
已創建 = 塊數;
增強器 = 增強器(_enhancer);
}
結構貢獻{
地址發件人;
uint256 值;
uint256 創建;
}
uint256[] 預設金額;
增強器公共增強器;
bool public earlySuccess;
地址公共所有者;
uint256 公共資金目標;
uint256 公共資金上限;
uint256 公開金額募集;
uint256 公共到期;
uint256 公共創建;
面向公眾受益人;
Contribution[] 公共捐款;
mapping(address => uint256[]) 公共貢獻BySender;
映射(uint256 => 地址)公共退款聲明地址;
映射(uint256 => bool)公開退款;
字元串公共名稱;
}

我是否在這裡遺漏了任何程式碼或以不正確的方式呼叫該函式?

你實際上可以在 remix 中調試你的事務,你會弄清楚為什麼不工作。不知何故,這兩個修飾符沒有通過,交易被還原。

如果您從函式中註釋這兩個修飾符,contributeMsgValue它將正常工作。

在Stage(Stages.CrowdfundOperational)
有效貢獻()

你只需要檢查修改器並修復它。

在初始狀態(部署後)contribution.length = 0。執行 contributionID = contributions.length++;返回值 0(將 contributionID 設置為 0),然後將數組的長度增加 1。這就是為什麼第一個貢獻 ID 將為 0。

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