You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:05:28