public void Resolve(AssetsResponse response)
        {
            AssetResponse asset = null;

            for (int i = 0; i < response.assets.Length; i++)
            {
                asset = response.assets[i];
                if (asset.token_id == tokenId && String.Equals(asset.asset_contract.address, assetContractAddress, StringComparison.OrdinalIgnoreCase))
                {
                    if (OpenSeaRequestController.VERBOSE)
                    {
                        Debug.Log($"Request: resolved {this.ToString()}");
                    }
                    assetResponse = asset;
                    break;
                }
            }
            if (assetResponse == null)
            {
                error = $"asset {assetContractAddress}/{tokenId} not found in api response";
                if (OpenSeaRequestController.VERBOSE)
                {
                    Debug.Log($"Request: for {assetContractAddress}/{tokenId} not found {JsonUtility.ToJson(response)}");
                }
            }
            resolved = true;
        }
        void IRequestHandler.SetApiResponse(string responseJson, Action onSuccess, Action <string> onError)
        {
            AssetsResponse response = null;

            try
            {
                response = Utils.FromJsonWithNulls <AssetsResponse>(responseJson);
            }
            catch (Exception e)
            {
                onError?.Invoke(e.Message);
            }

            if (response == null)
            {
                return;
            }

            RequestAssetInBatch request = null;
            AssetResponse       asset   = null;

            int batchCount = requests.Count;

            for (int i = batchCount - 1; i >= 0; i--)
            {
                request = requests[i];
                for (int j = 0; j < response.assets.Length; j++)
                {
                    asset = response.assets[j];
                    bool isMatch = asset.token_id == request.tokenId &&
                                   String.Equals(asset.asset_contract.address, request.contractAddress, StringComparison.OrdinalIgnoreCase);

                    if (isMatch)
                    {
                        if (VERBOSE)
                        {
                            Debug.Log($"BatchAssetsRequestHandler: ({GetHashCode()}) resolved {request.contractAddress}/{request.tokenId}");
                        }

                        request.Resolve(asset);
                        requests.RemoveAt(i);
                        break;
                    }
                }
            }

            // Retry possible unresolved requests
            if (requests.Count > 0)
            {
                RetryBatch(requests);
            }

            onSuccess?.Invoke();
        }