Solidity
聲明為應付款的函式在 Remix 中拋出 VMerror:revert
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。