Closed zed-wong closed 4 months ago
The latest updates on your projects. Learn more about Vercel for Git ↗︎
Name | Status | Preview | Comments | Updated (UTC) |
---|---|---|---|---|
mr-market | ✅ Ready (Inspect) | Visit Preview | 💬 Add feedback | Mar 20, 2024 0:35am |
This PR is being deployed to Railway 🚅
Mr.Market: ◻️ REMOVED
PR Description updated to latest commit (https://github.com/Hu-Fi/Mr.Market/commit/cd2efefdb8895208cbe180152630f541ef79e607)
⏱️ Estimated effort to review [1-5] | 5, due to the extensive amount of new functionality, changes across multiple modules, and the introduction of new entities and services. The PR adds significant features related to the Mixin exchange service, message handling, custom configurations, and various listeners for handling specific events. The complexity is further increased by the integration with external services like CCXT for cryptocurrency exchange operations and the need to ensure proper error handling, security considerations, especially around authentication and authorization, and the overall architectural fit within the existing system. The review requires a thorough understanding of the system's design, the Mixin API, and the CCXT library. |
🧪 Relevant tests | No |
🔍 Possible issues | Possible Bug: The `handleReleaseTokenEvent` method in `MixinListener` does not await the result of `readMixinReleaseHistory` before checking its value, which may lead to race conditions or incorrect logic flow. |
Security Concern: The `validateUser` method in `AuthService` uses SHA3-256 for password hashing, which, while secure, might not align with the latest recommendations for password storage strategies such as bcrypt or Argon2. | |
Performance Concern: The `fetchAndProcessSnapshots` method in `SnapshotsService` fetches all snapshots and processes them in a loop without any form of pagination or rate limiting, which could lead to performance issues with a large number of snapshots. | |
🔒 Security concerns | JWT Secret Exposure: The `AuthService` retrieves the JWT secret directly from the environment variables without any form of encryption or secure storage, which might expose the secret in logs or to unauthorized access on the server. |
relevant file | server/src/modules/mixin/listeners/mixin.listener.ts |
suggestion | Await the result of `readMixinReleaseHistory` before proceeding with the condition check to avoid potential race conditions or logic errors. [important] |
relevant line | if (!this.exchangeService.readMixinReleaseHistory(e.orderId)) { |
relevant file | server/src/modules/auth/auth.service.ts |
suggestion | Consider using a more secure password storage strategy like bcrypt or Argon2 for hashing passwords instead of SHA3-256 to enhance security. [important] |
relevant line | const hashedSuppliedPassword = createHash('sha3-256') |
relevant file | server/src/modules/mixin/snapshots/snapshots.service.ts |
suggestion | Implement pagination or rate limiting in `fetchAndProcessSnapshots` to handle large volumes of snapshots efficiently and avoid potential performance bottlenecks. [medium] |
relevant line | snapshots.forEach(async (snapshot: SafeSnapshot) => { |
relevant file | server/src/modules/auth/auth.service.ts |
suggestion | Securely manage the JWT secret used in `AuthService` by implementing encryption or a secure storage solution to prevent potential exposure. [important] |
relevant line | this.secret = this.configService.get |
Utilizing extra instructionsThe `review` tool can be configured with extra instructions, which can be used to guide the model to a feedback tailored to the needs of your project. Be specific, clear, and concise in the instructions. With extra instructions, you are the prompter. Specify the relevant sub-tool, and the relevant aspects of the PR that you want to emphasize. Examples for extra instructions: ``` [pr_reviewer] # /review # extra_instructions=""" In the 'possible issues' section, emphasize the following: - Does the code logic cover relevant edge cases? - Is the code logic clear and easy to understand? - Is the code logic efficient? ... """ ``` Use triple quotes to write multi-line instructions. Use bullet points to make the instructions more readable. |
How to enable\disable automation- When you first install PR-Agent app, the [default mode](https://pr-agent-docs.codium.ai/usage-guide/automations_and_usage/#github-app-automatic-tools-when-a-new-pr-is-opened) for the `review` tool is: ``` pr_commands = ["/review", ...] ``` meaning the `review` tool will run automatically on every PR, with the default configuration. Edit this field to enable/disable the tool, or to change the used configurations |
Auto-labelsThe `review` tool can auto-generate two specific types of labels for a PR: - a `possible security issue` label, that detects possible [security issues](https://github.com/Codium-ai/pr-agent/blob/tr/user_description/pr_agent/settings/pr_reviewer_prompts.toml#L136) (`enable_review_labels_security` flag) - a `Review effort [1-5]: x` label, where x is the estimated effort to review the PR (`enable_review_labels_effort` flag) |
Extra sub-toolsThe `review` tool provides a collection of possible feedbacks about a PR. It is recommended to review the [possible options](https://pr-agent-docs.codium.ai/tools/review/#enabledisable-features), and choose the ones relevant for your use case. Some of the feature that are disabled by default are quite useful, and should be considered for enabling. For example: `require_score_review`, `require_soc2_ticket`, `require_can_be_split_review`, and more. |
Auto-approve PRsBy invoking: ``` /review auto_approve ``` The tool will automatically approve the PR, and add a comment with the approval. To ensure safety, the auto-approval feature is disabled by default. To enable auto-approval, you need to actively set in a pre-defined configuration file the following: ``` [pr_reviewer] enable_auto_approval = true ``` (this specific flag cannot be set with a command line argument, only in the configuration file, committed to the repository) You can also enable auto-approval only if the PR meets certain requirements, such as that the `estimated_review_effort` is equal or below a certain threshold, by adjusting the flag: ``` [pr_reviewer] maximal_review_effort = 5 ``` |
More PR-Agent commands> To invoke the PR-Agent, add a comment using one of the following commands: > - **/review**: Request a review of your Pull Request. > - **/describe**: Update the PR title and description based on the contents of the PR. > - **/improve [--extended]**: Suggest code improvements. Extended mode provides a higher quality feedback. > - **/ask \ |
Category | Suggestions |
Best practice |
Remove or replace
___
**It's generally not a good practice to use |
Validate URL formats to ensure they are correct.___ **When defining constants that represent URLs, it's a good practice to validate the URLformat to prevent typos and ensure the URLs are valid. Consider adding URL validation for AppURL and HUMAN_PROTOCOL_GROUP_URL .**
[interface/src/lib/helpers/constants.ts [5]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-1d9500711f0f58654b9e0e95aa0e7fdc798a0b74f1c2310b09e52123e52d6bf2R5-R5)
```diff
-export const AppURL = env.PUBLIC_APP_URL || "https://mr-market-one.vercel.app"
+// Example URL validation (simplified)
+const isValidUrl = (url) => {
+ try {
+ new URL(url);
+ return true;
+ } catch (_) {
+ return false;
+ }
+};
+export const AppURL = isValidUrl(env.PUBLIC_APP_URL) ? env.PUBLIC_APP_URL : "https://mr-market-one.vercel.app";
```
| |
Disable TypeORM synchronize in production for safer database management.___ **Consider settingsynchronize to false for production environments to avoid unintended database alterations. Use migrations to manage database changes more safely.** [server/src/app.module.ts [77]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-4e8033eb0f9fd87924c445b7ac0f1c1192d4890fc1589b2fad2679797d4f4ce0R77-R77) ```diff -synchronize: true, +synchronize: process.env.NODE_ENV !== 'production', ``` | |
Use more descriptive mock variable names for JWT and its secret.___ **Use a more descriptive variable name thanmock-jwt and mock-jwt-secret to reflect the purpose or context of the JWT and its secret in the tests, enhancing readability and maintainability.** [server/src/modules/auth/auth.service.spec.ts [19-26]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-a4aa529fbd3004f2485112cc226be5de73cf024074d5bc13c9a546b6bd307d68R19-R26) ```diff -sign: jest.fn(() => 'mock-jwt'), +sign: jest.fn(() => 'testAdminJwtToken'), ... -if (key === 'admin.jwt_secret') return 'mock-jwt-secret'; +if (key === 'admin.jwt_secret') return 'testJwtSecretForAdmin'; ``` | |
Add a teardown step to reset mocks after each test.___ **Consider adding a teardown step after each test or at the end of your test suite to resetthe mocks. This ensures that the state from one test does not inadvertently affect another, maintaining test isolation.** [server/src/modules/auth/auth.service.spec.ts [12-36]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-a4aa529fbd3004f2485112cc226be5de73cf024074d5bc13c9a546b6bd307d68R12-R36) ```diff -beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ - AuthService, - ... - ], - }).compile(); - ... +afterEach(() => { + jest.resetAllMocks(); }); ``` | |
Enhancement |
Use descriptive error messages for better error handling.___ **Instead of throwing a generic error, it's more helpful to provide a specific error messageor create a custom error class. This can improve error handling and debugging. Consider creating a custom error class or using a more descriptive error message.** [interface/src/lib/helpers/hufi/coin.ts [41]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-256a64b9ed50e82ac22104895399dbc403c4aae9a4b3901816b45b49d91e499cR41-R41) ```diff -throw error('fetchOHLCV:', r.status) +throw new Error(`fetchOHLCV failed with status: ${r.status}`) ``` |
Use a generic error page for unsupported exchanges or pairs instead of hardcoding a specific market page.___ **Instead of hardcoding the redirection URL to a specific pair and exchange, consider usinga more generic approach or redirecting to a generic error page. This would improve the user experience by not redirecting users to a potentially irrelevant market page.** [interface/src/routes/(secondary)/(candle)/market/candle/[exchange]/[pair]/+page.ts [19-24]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-cdcb797b71f48041884c0c2f0fa520b8d3aa611082a0b0b315bd6aa862a706ceR19-R24) ```diff -goto('/market/candle/okx/BTC-USDT') +goto('/error/unsupported-exchange-or-pair') ``` | |
Add type definition for the
___
**Consider adding a type definition for the | |
Improve the robustness of
___
**Consider mocking | |
Add a test case for unexpected but valid password inputs.___ **Add a test case to verify the behavior ofvalidateUser when a valid but unexpected password is provided. This ensures that your authentication logic behaves correctly across a wider range of inputs.** [server/src/modules/auth/auth.service.spec.ts [49-52]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-a4aa529fbd3004f2485112cc226be5de73cf024074d5bc13c9a546b6bd307d68R49-R52) ```diff -it('should throw an error if password is incorrect', async () => { - await expect(service.validateUser('incorrectpassword')).rejects.toThrow( +it('should throw an error if password is unexpected but valid format', async () => { + await expect(service.validateUser('unexpectedvalidpassword')).rejects.toThrow( UnauthorizedException, ); }); ``` | |
Security |
Ensure safer methods for opening external links to prevent security vulnerabilities.___ **Directly manipulating the window's URL for opening links can lead to securityvulnerabilities such as URL redirection attacks. Consider using a safer method to open external links, such as Svelte's built-in navigation functions or ensuring URL validation.** [interface/src/lib/helpers/hufi/socket.ts [39-43]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-69db56c5a1c3cee6870c22a54beed50d9fb897bca96979680cc4f2875eb43971R39-R43) ```diff -window.open(`mixin://send?category=app_card&data=${encodeURIComponent(btoa(JSON.stringify(data)))}`) -window.open(`mixin://pay?recipient=${BOT_ID}&asset=${p.asset_id}&amount=${p.amount}&memo=${p.memo}&trace=${p.trace_id}`) +// Ensure URL validation or use safer methods for opening external links ``` |
Avoid storing sensitive information directly in the interface.___ **For better security practices, consider not storing sensitive information likeapi_key and secret directly within the SuccessResponse interface. Instead, use environment variables or a secure vault service.** [server/src/common/types/exchange/exchange.ts [5-6]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-fb2181e873d268634613c516f1ad31287f1419ed32814bdbda79725c36d62084R5-R6) ```diff -api_key: string; -secret: string; +// Consider using environment variables or a secure vault service for sensitive information ``` | |
Use environment variables for sensitive configuration values.___ **Ensure that sensitive configuration values likeJWT_SECRET , MIXIN_SESSION_PRIVATE_KEY , and API keys are not hardcoded or committed to version control. Use environment variables to inject these values securely at runtime.** [server/src/config/configuration.ts [34]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-c2fef21ac50b82ee2bfddd0f8d6a23979cb586b4cff283642d567ac926bc1823R34-R34) ```diff -jwt_secret: process.env.JWT_SECRET, +// Ensure environment variables are used and not exposed or hardcoded ``` | |
Bug |
Correctly handle promises with async/await or promise chaining.___ **Usingawait inside a non-async function will not work as expected. Ensure that the function handling the promise is marked as async or use promise chaining with .then() and .catch() for proper error handling and response processing.**
[interface/src/lib/helpers/hufi/socket.ts [118]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-69db56c5a1c3cee6870c22a54beed50d9fb897bca96979680cc4f2875eb43971R118-R118)
```diff
-return await fetchCandleChartData();
+// Correctly handle the promise
+fetchCandleChartData().then(data => {
+ // Handle data
+}).catch(error => {
+ // Handle error
+ CandleLoadingFailed.set(true);
+ console.error(error);
+});
```
|
Add parameters to the load function to access URL parameters.___ **Theload function is missing its parameter. If the function intends to use URL parameters, it should include {params} in its definition to access them.**
[interface/src/routes/(secondary)/(grow)/grow/arbitrage/[id]/+page.ts [4]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-28c632ace78a947611a63fdfbf33141c8bf9a9c42d91e46a97b285762f5a619cR4-R4)
```diff
-export async function load() {
+export async function load({params}) {
```
| |
Correct the typo in the import statement from
___
**There's a typo in the import statement | |
Maintainability |
Rename the file to correct the typo in the file name.___ **The file namemixin-message.eneity.ts seems to be a typo. Consider renaming it to mixin-message.entity.ts to maintain consistency and avoid confusion.**
[server/src/common/entities/mixin-message.eneity.ts [1-47]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-284cd024599e53bbc106bb7b202a1a20aa6997f2c35d5803ede3e29b945e4b9aR1-R47)
```diff
-export class MixinMessage {
+// File renamed to mixin-message.entity.ts
```
|
Define and export validation functions explicitly for better readability.___ **Instead of exporting individual functions directly from an array, consider defining andexporting them explicitly. This improves readability and maintainability.** [server/src/common/helpers/checks/spotChecks.ts [29-31]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-149a7f6a722ed2b5d682d3cb8c1e228d5664c2540841e5056dc063ae9f3c754aR29-R31) ```diff -export const isTradingTypeValid = validators[0]; -export const isSpotOrderTypeValid = validators[1]; -export const isExchangeIndexValid = validators[2]; +export const isTradingTypeValid = (tradingType: string): boolean => { + const validTradingTypes: TradingType[] = Object.keys(TARDING_TYPE_MAP); + return validTradingTypes.includes(tradingType as TradingType); +}; +export const isSpotOrderTypeValid = (spotOrderType: string): boolean => { + const validSpotOrderTypes: SpotOrderType[] = Object.keys(SPOT_ORDER_TYPE_MAP); + return validSpotOrderTypes.includes(spotOrderType as SpotOrderType); +}; +export const isExchangeIndexValid = (exchangeIndex: string): boolean => { + const validExchangeIndexes: ExchangeIndex[] = Object.keys(SPOT_EXCHANGE_MAP); + return validExchangeIndexes.includes(exchangeIndex as ExchangeIndex); +}; ``` | |
Remove or uncomment unused code to maintain code cleanliness.___ **Uncomment or remove the commented-out code related toconfigService if it's not being used in the tests to keep the codebase clean and maintainable.** [server/src/modules/auth/auth.service.spec.ts [36]](https://github.com/Hu-Fi/Mr.Market/pull/79/files#diff-a4aa529fbd3004f2485112cc226be5de73cf024074d5bc13c9a546b6bd307d68R36-R36) ```diff -// configService = module.get | |
Performance |
Optimize the
___
**The |
Enabling\disabling automationWhen you first install the app, the [default mode](https://pr-agent-docs.codium.ai/usage-guide/automations_and_usage/#github-app-automatic-tools-when-a-new-pr-is-opened) for the improve tool is: ``` pr_commands = ["/improve --pr_code_suggestions.summarize=true", ...] ``` meaning the `improve` tool will run automatically on every PR, with summarization enabled. Delete this line to disable the tool from running automatically. |
Utilizing extra instructionsExtra instructions are very important for the `improve` tool, since they enable to guide the model to suggestions that are more relevant to the specific needs of the project. Be specific, clear, and concise in the instructions. With extra instructions, you are the prompter. Specify relevant aspects that you want the model to focus on. Examples for extra instructions: ``` [pr_code_suggestions] # /improve # extra_instructions=""" Emphasize the following aspects: - Does the code logic cover relevant edge cases? - Is the code logic clear and easy to understand? - Is the code logic efficient? ... """ ``` Use triple quotes to write multi-line instructions. Use bullet points to make the instructions more readable. |
A note on code suggestions quality- While the current AI for code is getting better and better (GPT-4), it's not flawless. Not all the suggestions will be perfect, and a user should not accept all of them automatically. - Suggestions are not meant to be simplistic. Instead, they aim to give deep feedback and raise questions, ideas and thoughts to the user, who can then use his judgment, experience, and understanding of the code base. - Recommended to use the 'extra_instructions' field to guide the model to suggestions that are more relevant to the specific needs of the project, or use the [custom suggestions :gem:](https://pr-agent-docs.codium.ai/tools/custom_suggestions/) tool - With large PRs, best quality will be obtained by using 'improve --extended' mode. |
More PR-Agent commands> To invoke the PR-Agent, add a comment using one of the following commands: > - **/review**: Request a review of your Pull Request. > - **/describe**: Update the PR title and description based on the contents of the PR. > - **/improve [--extended]**: Suggest code improvements. Extended mode provides a higher quality feedback. > - **/ask \ |
User description
Add initial version of spot module and tests. Add message handler, controller, and tests. Add OKX and Gate.io in the market data module. Add a decoder that decodes different exchange data formats. Add a custom config module for dynamic configurations. Add JWT auth guard and tests for admin and protected endpoints. Add a withdrawal fee comparer for the withdrawal gateway. Add a skeleton loader and failure page for the candlestick page. Add a failure retry component for the home page. Add a message page for the admin page. Fix the NestJS socket gateway CORS error and combine listening ports.
Type
enhancement, bug_fix
Description
ExchangeService
with methods for handling exchange operations including API key loading, balance checking, and order placement.SUPPORTED_PAIRS
to include OKX and additional exchanges, addedPAIRS_MAP
andSYMBOL_ASSET_ID_MAP
for memo decoding and asset ID mapping.MixinListener
,ExchangeListener
,SpotOrderListener
,SnapshotsService
,MessageService
,AuthService
, andWithdrawalService
.SnapshotsService
for handling Mixin snapshots, processing them, and refunding.MessageService
for handling Mixin messages, including sending, broadcasting, and managing messages.main.ts
, updated global request logging setup.MixinListener
for handling Mixin events, including token release and snapshot processing.UserService
for managing Mixin users, including user addition, removal, and existence checking.CustomConfigRepository
for managing custom configurations, including reading and modifying spot fees and max balances.AdminController
to use JWT authentication guard, added endpoints for admin and config data retrieval.Changes walkthrough
23 files
exchange.service.ts
Implement Exchange Service for Trading Operations
server/src/modules/mixin/exchange/exchange.service.ts
ExchangeService
with methods for handling exchange operations.functionalities.
pairs.ts
Update Supported Pairs and Add Exchange Mapping
server/src/common/constants/pairs.ts
SUPPORTED_PAIRS
to include OKX and additional exchanges.PAIRS_MAP
andSYMBOL_ASSET_ID_MAP
for memo decoding and asset IDmapping.
snapshots.service.ts
Implement Snapshots Service for Mixin Integration
server/src/modules/mixin/snapshots/snapshots.service.ts
SnapshotsService
for handling Mixin snapshots.socket.ts
Update Socket Connections and Handlers for Market Data
interface/src/lib/helpers/hufi/socket.ts
candlestick pages.
message.service.ts
Implement Message Service for Mixin Messaging
server/src/modules/mixin/message/message.service.ts
MessageService
for handling Mixin messages.helpers.ts
Update Helper Functions and Add New Exchange Icons
interface/src/lib/helpers/helpers.ts
exchange.listener.ts
Implement ExchangeListener for Exchange Event Handling
server/src/modules/mixin/listeners/exchange.listener.ts
ExchangeListener
for handling exchange-related events.processing.
utils.ts
Add Utility Functions for Memo Decoding and Timestamp Handling
server/src/common/helpers/utils.ts
memos, and handling timestamps.
main.ts
Simplify Main Application Setup and Update Logging
server/src/main.ts
configuration.
mixin.listener.ts
Implement MixinListener for Mixin Event Handling
server/src/modules/mixin/listeners/mixin.listener.ts
MixinListener
for handling Mixin events.user.service.ts
Implement UserService for Mixin User Management
server/src/modules/mixin/user/user.service.ts
UserService
for managing Mixin users.customConfig.repository.ts
Implement CustomConfigRepository for Configuration Management
server/src/modules/customConfig/customConfig.repository.ts
CustomConfigRepository
for managing custom configurations.marketDataDecoder.ts
Update Market Data Decoder Functions
interface/src/lib/helpers/hufi/marketDataDecoder.ts
candlestick, and ticker data.
admin.controller.ts
Update AdminController to Use JWT Authentication
server/src/modules/admin/admin.controller.ts
AdminController
to use JWT authentication guard.marketdata.service.ts
Update MarketdataService to Include More Exchanges
server/src/modules/marketdata/marketdata.service.ts
MarketdataService
to include OKX and Gate.io exchanges.auth.service.ts
Implement AuthService for Authentication Handling
server/src/modules/auth/auth.service.ts
AuthService
for handling authentication and JWT tokengeneration.
bigone.ts
Define Types for BigOne Withdrawal Fee Responses
server/src/common/types/withdrawal/bigone.ts - Defined types for handling BigOne withdrawal fee responses.
logger.service.ts
Update CustomLogger with Debug Logging and Refined Setup
server/src/modules/logger/logger.service.ts
CustomLogger
to include debug logging and refined file loggingsetup.
states.ts
Define Mappings for Spot Order States and Codes
server/src/common/types/orders/states.ts - Defined mappings for spot order states and codes.
memo.ts
Add Functions for Decoding Spot and Swap Memos
server/src/common/helpers/mixin/memo.ts - Added functions for decoding spot and swap memos.
constants.ts
Update Supported Pairs and Add Configuration Variables
interface/src/lib/helpers/constants.ts
application configuration.
spot.event.ts
Define Event Classes for Spot Order and Mixin Events
server/src/modules/mixin/events/spot.event.ts
mixin release token events.
exchange.dto.ts
Define DTO for Exchange Place Spot Event
server/src/modules/mixin/exchange/exchange.dto.ts - Defined DTO for exchange place spot event.
8 files
mixin.listener.spec.ts
Add Unit Tests for MixinListener
server/src/modules/mixin/listeners/mixin.listener.spec.ts
MixinListener
to cover various scenariosincluding asset ID validation and release token handling.
exchange.listener.spec.ts
Add Unit Tests for ExchangeListener
server/src/modules/mixin/listeners/exchange.listener.spec.ts
ExchangeListener
to verify spot order placementand API key selection.
spot.listener.spec.ts
Add Unit Tests for SpotOrderListener
server/src/modules/mixin/listeners/spot.listener.spec.ts
SpotOrderListener
to validate spot order creationand event handling.
snapshots.service.spec.ts
Add Unit Tests for SnapshotsService
server/src/modules/mixin/snapshots/snapshots.service.spec.ts
SnapshotsService
to cover snapshot fetching andprocessing.
message.service.spec.ts
Add Unit Tests for MessageService
server/src/modules/mixin/message/message.service.spec.ts
MessageService
to cover message handling andrepository interactions.
auth.service.spec.ts
Add Unit Tests for AuthService
server/src/modules/auth/auth.service.spec.ts
AuthService
to cover user validation and JWTgeneration.
withdrawal.service.spec.ts
Add Unit Tests for WithdrawalService
server/src/modules/mixin/withdrawal/withdrawal.service.spec.ts
WithdrawalService
to compare fees between BigOneand Mixin for various assets.
marketdata.service.spec.ts
Add Mock Implementations for Exchanges in Unit Tests
server/src/modules/marketdata/marketdata.service.spec.ts
tests.