Ethernaut: puzzle wallet

nested delegatecall in a transaction array can lead to reuse of msg.value

		 	function deposit() external payable onlyWhitelisted {
	        require(address(this).balance <= maxBalance, "Max balance reached");
	        balances[msg.sender] += msg.value;
	    }
	    
	    
		 function multicall(bytes[] calldata data) external payable onlyWhitelisted {
        bool depositCalled = false;
        for (uint256 i = 0; i < data.length; i++) {
            bytes memory _data = data[i];
            bytes4 selector;
            assembly {
                selector := mload(add(_data, 32))
            }
            if (selector == this.deposit.selector) {
                require(!depositCalled, "Deposit can only be called once");
                // Protect against reusing msg.value
                depositCalled = true;
            }
            (bool success,) = address(this).delegatecall(data[i]);
            require(success, "Error while delegating call");
        }
    }