```\n    for (uint32 index = 0; index < params.length; index++) {\n        OpenTradeParams memory currentParams = params[index];\n        QueuedTrade memory queuedTrade = queuedTrades[\n            currentParams.queueId\n        ];\n        bool isSignerVerifed = _validateSigner(\n            currentParams.timestamp,\n            currentParams.asset,\n            currentParams.price,\n            currentParams.signature\n        );\n        // Silently fail if the signature doesn't match\n        if (!isSignerVerifed) {\n            emit FailResolve(\n                currentParams.queueId,\n                "Router: Signature didn't match"\n            );\n            continue;\n        }\n        if (\n            !queuedTrade.isQueued ||\n            currentParams.timestamp != queuedTrade.queuedTime\n        ) {\n            // Trade has already been opened or cancelled or the timestamp is wrong.\n            // So ignore this trade.\n            continue;\n        }\n\n        // If the opening time is much greater than the queue time then cancel the trad\n        if (block.timestamp - queuedTrade.queuedTime <= MAX_WAIT_TIME) {\n            _openQueuedTrade(currentParams.queueId, currentParams.price);\n        } else {\n            _cancelQueuedTrade(currentParams.queueId);\n            emit CancelTrade(\n                queuedTrade.user,\n                currentParams.queueId,\n                "Wait time too high"\n            );\n        }\n\n        // Track the next queueIndex to be processed for user\n        userNextQueueIndexToProcess[queuedTrade.user] =\n            queuedTrade.userQueueIndex +\n            1;\n    }\n```\n