Performance update:
Authentication
Added Ed25519 signing support for NET8.0 and newer
Added static methods on ApiCredentials to create credentials of a specific type
Added static ApiCredentials.ReadFromFile method to read a key from file
Added required abstract SupportedCredentialTypes property on AuthenticationProvider base class
General Performance
Added checks before logging statements to prevent overhead of building the log string if logging is not needed
Added ExchangeHelpers.ProcessQueuedAsync method to process updates async
Replaced locking object types from object to Lock in NET9.0 and newer
Replaced some Task response types with ValueTask to prevent allocation overhead on hot paths
Updated Json ArrayConverter to reduce some allocation overhead
Updated Json BoolConverter to prevent boxing
Updated Json DateTimeConverter to prevent boxing
Updated Json EnumConverter caching to reduce lookup overhead
Updated ExtensionMethods.CreateParamString to reduce allocations
Updated ExtensionMethods.AppendPath to reduce overhead
REST
Refactored REST message processing to separate IRestMessageHandler instance
Split RestApiClient.PrepareAsync into CheckTimeSync and RateLimitAsync
Updated IRequest.Accept type from string to MediaTypeWithQualityHeaderValue to prevent creation on each request
Updated IRequest.GetHeaders response type from KeyValuePair<string, string[]>[] to HttpRequestHeaders to prevent additional mapping
Updated IResponse.ResponseHeaders type from KeyValuePair<string, string[]>[] to HttpResponseHeaders to prevent additional mapping
Updated WebCallResult RequestHeaders and ResponseHeaders types to HttpRequestHeaders and HttpResponseHeaders
Removed unnecessary empty dictionary initializations for each request
Removed CallResult creation in internal methods to prevent having to create multiple versions for different result types
Socket
Added HighPerformance websocket client implementation which significantly reduces memory overhead and improves speed but with certain limitations
Added MaxIndividualSubscriptionsPerConnection setting in SocketApiClient to limit the number of individual stream subscriptions on a connection
Added SocketIndividualSubscriptionCombineTarget option to set the target number of individual stream subscriptions per connection
Added new websocket message handling logic which is faster and reduces memory allocation
Added UseUpdatedDeserialization option to toggle between updated deserialization and old deserialization
Added Exchange property to DataEvent to prevent additional mapping overhead for Shared apis
Refactored message callback to be sync instead of async to prevent async overhead
Refactored CryptoExchangeWebSocketClient.IncomingKbps calculation to significantly reduce overhead
Moved websocket client creation from SocketApiClient to SocketConnection
Removed DataEvent.As and DataEvent.ToCallResult methods in favor of single ToType method
Removed DataEvent creation on lower levels to prevent having to create multiple versions for different result types
Removed Subscription<TSubResponse, TUnsubResponse> as its no longer used
Other
Added null check to ParameterCollection for required parameters
Added Net10.0 target framework
Updated dependency versions
Updated Shared asset aliases check to be culture invariant
Updated Error string representation
Updated some namespaces
Updated SymbolOrderBook processing of buffered updates to prevent additional allocation
Removed ExchangeEvent type which is no longer needed
Removed unused usings
Added LibraryHelpers.CreateHttpClientMessageHandle to standardize HttpMessageHandler creation
Added REST client option for selecting HTTP protocol version
Added REST client option for HTTP client keep alive interval
Added HttpVersion to WebCallResult responses
Updated request logic to default to using HTTP version 2.0 for dotnet core
* Added support for Native AOT compilation
* Updated all IEnumerable response types to array response types
* Added Pass support for ApiCredentials, removing the need for most implementations to add their own ApiCredentials type
* Added KeepAliveTimeout setting setting ping frame timeouts for SocketApiClient
* Added IBookTickerRestClient Shared interface for requesting book tickers
* Added ISpotTriggerOrderRestClient Shared interface for managing spot trigger orders
* Added ISpotOrderClientIdClient Shared interface for managing spot orders by client order id
* Added IFuturesTriggerOrderRestClient Shared interface for managing futures trigger orders
* Added IFuturesOrderClientIdClient Shared interface for managing futures orders by client order id
* Added IFuturesTpSlRestClient Shared interface for setting TP/SL on open futures positions
* Added GenerateClientOrderId to ISpotOrderRestClient and IFuturesOrderRestClient interface
* Added OptionalExchangeParameters and Supported properties to EndpointOptions
* Refactor Shared interfaces quantity parameters and properties to use SharedQuantity
* Added SharedSymbol property to Shared interface models returning a symbol
* Added TriggerPrice, IsTriggerOrder, TakeProfitPrice, StopLossPrice and IsCloseOrder to SharedFuturesOrder response model
* Added MaxShortLeverage and MaxLongLeverage to SharedFuturesSymbol response model
* Added StopLossPrice and TakeProfitPrice to SharedPosition response model
* Added TriggerPrice and IsTriggerOrder to SharedSpotOrder response model
* Added QuoteVolume property to SharedSpotTicker response model
* Added AssetAlias configuration models
* Added static ExchangeSymbolCache for tracking symbol information from exchanges
* Added static CallResult.SuccessResult to be used instead of constructing success CallResult instance
* Added static ApplyRules, RandomHexString and RandomLong helper methods to ExchangeHelpers class
* Added AsErrorWithData To CallResult
* Added OriginalData property to CallResult
* Added support for adjusting the rate limit key per call, allowing for ratelimiting depending on request parameters
* Added implementation for integration testing ISymbolOrderBook instances
* Added implementation for integration testing socket subscriptions
* Added implementation for testing socket queries
* Updated request cancellation logging to Debug level
* Updated logging SourceContext to include the client type
* Updated some logging logic, errors no longer contain any data, exception are not logged as string but instead forwarded to structured logging
* Fixed warning for Enum parsing throwing exception and output warnings for each object in a response to only once to prevent slowing down execution
* Fixed memory leak in AsyncAutoRestEvent
* Fixed logging for ping frame timeout
* Fixed warning getting logged when user stops SymbolOrderBook instance
* Fixed socket client `UnsubscribeAll` not unsubscribing dedicated connections
* Fixed memory leak in Rest client cache
* Fixed integers bigger than int16 not getting correctly parsed to enums
* Fixed issue where the default options were overridden when using SetApiCredentials
* Removed Newtonsoft.Json dependency
* Removed legacy Rest client code
* Removed legacy ISpotClient and IFuturesClient support
* Fix memory leak in AsyncAutoResetEvent
CancellationTokenRegistration MUST be disposed, as the CancellationToken passed is saved for the lifetime of the Client, and registrations build up forever.
Added support for IOptions injection, allowing options to be read from IConfiguration
Small refactor on client options internals
Updated HttpClient to be static field to be
Fix for intermittently failing rate limiting test
Added ConnectionId to RequestDefinition to correctly handle connection and path rate limiting configuration
Added ValidateMessage method to websocket Query object to filter messages even though it is matched to the query based on the ListenIdentifier
Added KlineTracker and TradeTracker implementation