Solidity智能合约编译报错:ParserError: Expected '(' but got identifier
问题排查与解决
编译错误根源
你遇到的ParserError: Expected '(' but got identifier错误,本质是前面的getIndex函数存在语法错误,导致Solidity解析器无法正确解析后续代码,错误提示定位到availableToWithdraw函数是因为解析器在错误位置之后的代码逻辑完全混乱了。
具体错误在getIndex函数的if判断行:
if(kids[i].walletAddress == walletAddress){{
这里多写了一个左大括号{{,属于语法不匹配。
修复步骤
1. 修复getIndex函数的语法错误
将错误行修改为:
if(kids[i].walletAddress == walletAddress){
去掉多余的左大括号,确保大括号配对正确。
2. 修复其他潜在逻辑问题(可选但重要)
除了编译错误,你的合约还有几个逻辑问题需要修正:
availableToWithdraw函数里误写了kids[1].releaseTime,应该是kids[i].releaseTime,否则永远只判断第二个孩子的解锁时间:if (block.timestamp > kids[i].releaseTime)withdraw函数不需要payable修饰符(该函数是转出资金,不是接收),同时建议增加canWithdraw的判断,避免未到时间就提现:function withdraw(address payable walletAddress) public{ uint i = getIndex(walletAddress); require(kids[i].canWithdraw, "Cannot withdraw yet"); kids[i].walletAddress.transfer(kids[i].amount); // 提现后重置状态,避免重复提现 kids[i].canWithdraw = false; kids[i].amount = 0; }getIndex函数如果找不到对应地址返回999,可能导致数组越界,建议改用revert抛出错误:function getIndex(address walletAddress) view private returns(uint){ for (uint i = 0; i < kids.length; i++){ if(kids[i].walletAddress == walletAddress){ return i; } } revert("Kid not found"); }
修复后的完整合约代码
// SPDX-License-Identifier: Unlicensed pragma solidity ^0.8.7; contract CryptoKids { //Define Dad address owner; constructor(){ owner = msg.sender; } //Define Kid struct Kid{ address payable walletAddress; string firstName; string LastName; uint releaseTime; uint amount; bool canWithdraw; } Kid[] public kids; //add kid to contract function addKids(address payable walletAddress,string memory firstName,string memory LastName,uint releaseTime,uint amount,bool canWithdraw) public{ kids.push(Kid(walletAddress,firstName,LastName,releaseTime,amount,canWithdraw)); } //deposit funds to contract, specifically to kids contract function deposit(address walletAddress) payable public { addToKidsBalance(walletAddress); } function balanceOf() public view returns(uint){ return address(this).balance; } function addToKidsBalance(address walletAddress) private{ for (uint i = 0; i < kids.length; i++){ if(kids[i].walletAddress == walletAddress){ kids[i].amount += msg.value; } } } function getIndex(address walletAddress) view private returns(uint){ for (uint i = 0; i < kids.length; i++){ if(kids[i].walletAddress == walletAddress){ return i; } } revert("Kid not found"); } //kid checks if can withdraw function availableToWithdraw(address walletAddress) public returns(bool) { uint i = getIndex(walletAddress); if (block.timestamp > kids[i].releaseTime) { kids[i].canWithdraw = true; return true; } else { return false; } } //if can withdraw money function withdraw(address payable walletAddress) public{ uint i = getIndex(walletAddress); require(kids[i].canWithdraw, "Cannot withdraw yet"); kids[i].walletAddress.transfer(kids[i].amount); kids[i].canWithdraw = false; kids[i].amount = 0; } }
内容的提问来源于stack exchange,提问作者Tristee
相关产品推荐
相关产品推荐

