1
0
mirror of https://github.com/JKorf/CryptoExchange.Net.git synced 2026-10-16 08:01:06 +00:00

Shared asset and symbol types

Added SpotSymbolCatalog to Shared ISpotSymbolRestClient interface
Added FuturesSymbolCatalog to Shared IFuturesSymbolRestClient interface
Added BaseAssetType, BaseAssetSubType, QuoteAssetType and QuoteAssetSubType to GetSymbolsRequest model
Added DisplayName to SharedSpotSymbol and SharedFuturesSymbol models
Added BaseAssetType, BaseAssetSubType, QuoteAssetType and QuoteAssetSubType to SharedSpotSymbol and SharedFuturesSymbol models
Added IsStableCoin, IsCommodity and IsEquity helper methods to LibraryHelpers
This commit is contained in:
Jan Korf
2026-07-20 13:40:58 +02:00
committed by GitHub
parent 3cffd67518
commit fcb36f7ee0
12 changed files with 465 additions and 16 deletions
@@ -1,4 +1,5 @@
using System;
using CryptoExchange.Net.Objects;
using System;
using System.Collections.Generic;
using System.Text;
@@ -15,5 +16,43 @@ namespace CryptoExchange.Net.SharedApis
public GetFuturesSymbolsOptions(string exchange, bool authenticated) : base(exchange, authenticated, nameof(IFuturesSymbolRestClient.GetFuturesSymbolsAsync))
{
}
/// <inheritdoc />
public override Error? ValidateRequest(GetSymbolsRequest request, IFuturesSymbolRestClient client)
{
if (request.BaseAssetType != null && request.BaseAssetSubType != null)
{
var error = ValidateAssetTypeCombination(request.BaseAssetType.Value, request.BaseAssetSubType.Value);
if (error != null)
return error;
}
if (request.QuoteAssetType != null && request.QuoteAssetSubType != null)
{
var error = ValidateAssetTypeCombination(request.QuoteAssetType.Value, request.QuoteAssetSubType.Value);
if (error != null)
return error;
}
return base.ValidateRequest(request, client);
}
private Error? ValidateAssetTypeCombination(SharedAssetType type, SharedAssetSubType subType)
{
if (type == SharedAssetType.Crypto
&& (subType == SharedAssetSubType.Commodity
|| (subType == SharedAssetSubType.Equity)))
{
return ArgumentError.Invalid(nameof(GetSymbolsRequest.BaseAssetSubType), $"Invalid combination of asset type filters: {type} and {subType}");
}
if (type == SharedAssetType.TradFi && subType == SharedAssetSubType.StableCoin)
return ArgumentError.Invalid(nameof(GetSymbolsRequest.BaseAssetSubType), $"Invalid combination of asset type filters: {type} and {subType}");
if (type == SharedAssetType.Fiat)
return ArgumentError.Invalid(nameof(GetSymbolsRequest.BaseAssetSubType), $"Invalid combination of asset type filters: {type} and {subType}");
return null;
}
}
}
@@ -1,4 +1,5 @@
using System;
using CryptoExchange.Net.Objects;
using System;
using System.Collections.Generic;
using System.Text;
@@ -15,5 +16,44 @@ namespace CryptoExchange.Net.SharedApis
public GetSpotSymbolsOptions(string exchange, bool authenticated) : base(exchange, authenticated, nameof(ISpotSymbolRestClient.GetSpotSymbolsAsync))
{
}
/// <inheritdoc />
public override Error? ValidateRequest(GetSymbolsRequest request, ISpotSymbolRestClient client)
{
if (request.BaseAssetType != null && request.BaseAssetSubType != null)
{
var error = ValidateAssetTypeCombination(request.BaseAssetType.Value, request.BaseAssetSubType.Value);
if (error != null)
return error;
}
if (request.QuoteAssetType != null && request.QuoteAssetSubType != null)
{
var error = ValidateAssetTypeCombination(request.QuoteAssetType.Value, request.QuoteAssetSubType.Value);
if (error != null)
return error;
}
return base.ValidateRequest(request, client);
}
private Error? ValidateAssetTypeCombination(SharedAssetType type, SharedAssetSubType subType)
{
if (type == SharedAssetType.Crypto
&& (subType == SharedAssetSubType.Commodity
|| (subType == SharedAssetSubType.Equity)))
{
return ArgumentError.Invalid(nameof(GetSymbolsRequest.BaseAssetSubType), $"Invalid combination of asset type filters: {type} and {subType}");
}
if (type == SharedAssetType.TradFi && subType == SharedAssetSubType.StableCoin)
return ArgumentError.Invalid(nameof(GetSymbolsRequest.BaseAssetSubType), $"Invalid combination of asset type filters: {type} and {subType}");
if (type == SharedAssetType.Fiat)
return ArgumentError.Invalid(nameof(GetSymbolsRequest.BaseAssetSubType), $"Invalid combination of asset type filters: {type} and {subType}");
return null;
}
}
}
@@ -5,13 +5,44 @@
/// </summary>
public record GetSymbolsRequest : SharedRequest
{
/// <summary>
/// Base asset type filter
/// </summary>
public SharedAssetType? BaseAssetType { get; }
/// <summary>
/// Base asset subtype filter
/// </summary>
public SharedAssetSubType? BaseAssetSubType { get; }
/// <summary>
/// Quote asset type filter
/// </summary>
public SharedAssetType? QuoteAssetType { get; }
/// <summary>
/// Quote asset subtype filter
/// </summary>
public SharedAssetSubType? QuoteAssetSubType { get; }
/// <summary>
/// ctor
/// </summary>
/// <param name="tradingMode">Trading mode filter</param>
/// <param name="baseAssetType">Filter by base asset type</param>
/// <param name="baseAssetSubType">Filter by base asset subtype</param>
/// <param name="quoteAssetType">Filter by quote asset type</param>
/// <param name="quoteAssetSubType">Filter by quote asset subtype</param>
/// <param name="exchangeParameters">Exchange specific parameters</param>
public GetSymbolsRequest(TradingMode? tradingMode = null, ExchangeParameters? exchangeParameters = null) : base(tradingMode, exchangeParameters)
public GetSymbolsRequest(
TradingMode? tradingMode = null,
SharedAssetType? baseAssetType = null,
SharedAssetSubType? baseAssetSubType = null,
SharedAssetType? quoteAssetType = null,
SharedAssetSubType? quoteAssetSubType = null,
ExchangeParameters? exchangeParameters = null) : base(tradingMode, exchangeParameters)
{
BaseAssetType = baseAssetType;
BaseAssetSubType = baseAssetSubType;
QuoteAssetType = quoteAssetType;
QuoteAssetSubType = quoteAssetSubType;
}
}
}
@@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
namespace CryptoExchange.Net.SharedApis
{
/// <summary>
/// Symbol and asset catalog for a shared client
/// </summary>
public class SharedSymbolCatalog
{
/// <summary>
/// Exchange name
/// </summary>
public string Exchange { get; set; } = string.Empty;
/// <summary>
/// Assets supported
/// </summary>
public IReadOnlyDictionary<string, SharedAssetInfo> Assets { get; set; } = new Dictionary<string, SharedAssetInfo>();
/// <summary>
/// Symbols supported
/// </summary>
public IReadOnlyDictionary<string, SharedSpotSymbol> Symbols { get; set; } = new Dictionary<string, SharedSpotSymbol>();
}
/// <summary>
/// Asset info
/// </summary>
[DebuggerDisplay("{DebugView,nq}")]
public class SharedAssetInfo
{
private string DebugView => $"{Name} - {Type}{(SubType == null ? "": $" {SubType}")}";
/// <summary>
/// Asset name
/// </summary>
public string Name { get; set; }
/// <summary>
/// Asset type
/// </summary>
public SharedAssetType Type { get; set; }
/// <summary>
/// Asset sub type
/// </summary>
public SharedAssetSubType? SubType { get; set; }
/// <summary>
/// ctor
/// </summary>
public SharedAssetInfo(string name, SharedAssetType type, SharedAssetSubType? subType)
{
Name = name;
Type = type;
SubType = subType;
}
}
}