Code Monkey home page Code Monkey logo

kargolek / crypto-portfolio-microservices Goto Github PK

View Code? Open in Web Editor NEW
1.0 1.0 1.0 1.71 GB

The project was created and is being maintained to enhance knowledge about Spring Boot, microservices, unit testing, integration testing, system testing, and more – all for the sake of enjoyment.

License: Other

Java 79.57% TypeScript 4.97% HTML 1.56% SCSS 1.55% Dockerfile 0.08% Batchfile 0.25% Gherkin 12.01%
allure2 angular cicd cucumber e2e-testing github-actions integration-testing junit5 mysql selenium-java

crypto-portfolio-microservices's Introduction

Crypto-Portfolio Trello

codecov Build Status Full Test Regression Test Regression Test Regression Test

Crypto-Portfolio is an application that allows users to check the balances of their cryptocurrency portfolios for various tokens such as Ethereum, Matic, and Avalanche. It provides a convenient way to monitor multiple wallet addresses simultaneously.

Table of content

Features

  • Multi-Token Support: The application checks the balances of crypto wallets for different tokens, including Ethereum, Matic, and Avalanche. More tokens will be added in the future.
  • Multi-Wallet Check: Users can check the balances of up to 70 wallet addresses at once.
  • Balance Summation: The application calculates the total balances across all wallets and presents them to the user in both numerical and graphical (treemap chart) formats.
  • Historical Balance: The application provides the wallet balances for past durations such as 1 hour, 24 hours, 7 days, 30 days, 60 days, and 90 days, based on the historical prices and current wallet balances.
  • Current Token Prices: Users can access real-time prices of the most popular cryptocurrencies obtained from CoinmarketCap.
  • Frontend: Angular 15.1
  • Backend: Spring Boot 2.7 (Microservices Architecture)
  • Database: MySQL
  • Unit Testing, Integration Testing, and E2E Testing: The application provides comprehensive test coverage to ensure its stability and reliability.
  • Cross-Platform: The application is built to support both desktop and mobile browsers.

How to Use

Preconditions

  1. Create an account on the https://coinmarketcap.com/ and add API key "COIN_MARKET_CAP_API_KEY" to system env variable
  2. Create an account on the https://etherscan.io/ and add API key "ETHERSCAN_API_KEY" to system env variable
  3. Create an account on the https://snowtrace.io/ and add API key "AVALANCHE_API_KEY" to system env variable
  4. Create an account on the https://polygonscan.com/ and add API key "POLYGON_API_KEY" to system env variable
  5. Make sure you have Docker installed on your environment

Main Steps

  1. Clone repo
  2. Run cmd script for build and compose docker containers
start build_env.bat
  1. Navigate to

The app will start with preloaded data for Bitcoin, Ethereum, Matic, Avax tokens.

License

This project is licensed under the MIT LICENSE. See the LICENSE file for more information.

API Documentation

  1. crypto-price service
  2. wallet-service

Quality Assurance

  1. Unit & Integration tests for crypto-price-service
  2. Unit & Integration tests for wallet-service
  3. QA tests for API and UI

Examples

Desktop version

  • Input wallet view web_screen1

  • Portfolio view web_screen2 web_screen3 web_screen4

Mobile version

Screen_Recording_20230628_192908_Chrome.mp4

crypto-portfolio-microservices's People

Contributors

kargolek avatar

Stargazers

 avatar

Watchers

 avatar

crypto-portfolio-microservices's Issues

[Bug]: GET /api/v1/wallet/eth/balance request response data is split to the two parts if request query param wallets has more than 20 addresses

Severity

Major

Bug Category

Backend/DB

Frequency

Consistent (10/10)

Summary

  1. If we're using postman, the response json for GET request /api/v1/wallet/eth/balance will be divide on the two parts for single request. Method in controller provides return List, but if type of crypto is the same and wallet addresses are more than 20, response data should,t be divided.

How it looks like:

[
{
"name": "Ethereum",
"symbol": "ETH",
"balance": [wallets data... (up to 20 wallet addresses)]
},
{
"name": "Ethereum",
"symbol": "ETH",
"balance": [....next wallets data]
}

Reproduction steps

  1. Make a shot to /api/v1/wallet/eth/balance and set query param wallets = more than 20 addresses

Actual Results

  1. Response body is split on the two parts (two list elements) for the same type of cryptocurrency

Expected Results

  1. For the same type of cryptocurrency it should be one item with multiple wallet addresses and balances

Code affected

No response

Relevant log output

[
    {
        "name": "Ethereum",
        "symbol": "ETH",
        "balance": [
            {
                "walletAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
                "quantity": 302190.82797634804993784,
                "balance": 464365994.57,
                "balance1h": 465516867.36,
                "balance24h": 468601689.21,
                "balance7d": 433636982.92,
                "balance30d": 503115779.57,
                "balance60d": 532675567.14,
                "balance90d": 572374766.43
            },
            {
                "walletAddress": "0x5A0b54D5dc17e0AadC383d2db43B0a0D3E029c4c",
                "quantity": 38.701262140697819864,
                "balance": 59470.87,
                "balance1h": 59618.26,
                "balance24h": 60013.33,
                "balance7d": 55535.44,
                "balance30d": 64433.51,
                "balance60d": 68219.21,
                "balance90d": 73303.44
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            }
        ]
    },
    {
        "name": "Ethereum",
        "symbol": "ETH",
        "balance": [
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            },
            {
                "walletAddress": "0x95f071372891ec292124408802a5397eb8838478",
                "quantity": 621.268383351140853969,
                "balance": 954681.23,
                "balance1h": 957047.29,
                "balance24h": 963389.31,
                "balance7d": 891506.04,
                "balance30d": 1034346.18,
                "balance60d": 1095117.58,
                "balance90d": 1176734.41
            }
        ]
    }
]

[Bug]: Etherscan api key is not hidden in application.yml for wallet-service

Severity

Blocker

Bug Category

Backend/DB

Frequency

Consistent (10/10)

Summary

Need to hide and generate new on API key for etherscan service.

Reproduction steps

  1. wallet-service
  2. application.yml
  3. verify that api key for etherscan is hidden

Actual Results

  1. API key is not hidden. Everyone can get it.

Expected Results

  1. API key should be hidden as env property

Code affected

No response

Relevant log output

No response

[Bug]: Execution of integration test sometimes hang on the CI

Severity

Minor

Bug Category

Freeze/Hangs

Frequency

Occasional (5/10)

Summary

Sometimes when push branch to the repo CI test execution hangs and stucks in the below tests
[INFO] +--pl.kargolek.cryptopriceservice.service.PriceServiceIntegrationTest - 19.696s
[INFO] | +-- [OK] whenUpdatePricesByNotExistPrice_thenThrowPriceNotFoundExc - 0.4s
[INFO] | +-- [OK] whenUpdatePricesByEmptyList_thenReturnEmptyEntitiesList - 0.028s
[INFO] | '-- [OK] whenUpdatePrice_thenPriceShouldUpdatedSuccessful - 0.085s
[INFO] +--pl.kargolek.cryptopriceservice.service.PriceUpdateServiceIntegrationTest - 2.562s

The issue occurs occasionaly and any error isn't thrown. It didn't happen on the local machine even once. Need to find root cause.

Reproduction steps

  1. Push changes to the repo
  2. Open Actions
  3. Click on the build_test
  4. Observe ongoing build project

Actual Results

  1. Tests are stucked during execution, without thrown any error.

Expected Results

  1. Test should be executed to the end
  2. If error occurrs, it should be thrown.

Code affected

No response

Relevant log output

[INFO] +--pl.kargolek.cryptopriceservice.service.PriceServiceIntegrationTest - 19.696s
[INFO] |  +-- [OK] whenUpdatePricesByNotExistPrice_thenThrowPriceNotFoundExc - 0.4s
[INFO] |  +-- [OK] whenUpdatePricesByEmptyList_thenReturnEmptyEntitiesList - 0.028s
[INFO] |  '-- [OK] whenUpdatePrice_thenPriceShouldUpdatedSuccessful - 0.085s
[INFO] +--pl.kargolek.cryptopriceservice.service.PriceUpdateServiceIntegrationTest - 2.562s

Expression of interest in creating a Kubernetes Version of the crypto-portfolio-microservices

Hello Orlowicz,
I hope this message finds you well.
I recently came across the crypto-portfolio-microservice application on your git-hub repository, and I must say that I find the project very interesting! The functionality and structure you have implemented are truly impressive.
I am writing to express my interest in contributing further to this project. Specifically, I would like to take on the task of creating a kubernetes version of the microservice using Helm. I believe this would enhance its deployment flexibility and scalability, allowing for a more streamlined and manageable application environment.

please let me know your thoughts on this. I am eager to contribute and enhance your already outstanding project. I look forward to your response.

[Bug]: Wallet service incorrect counts balances from the past time, when we call get API request api/v1/wallet/eth/balance

Severity

Blocker

Bug Category

Functional

Frequency

Consistent (10/10)

Summary

  1. When we call get request for eth balances system rerurn in json data wrong value.
    Example:
    GET api/v1/wallet/eth/balance
    ...
    "balance": 64526.92,
    ...
    "balance60d": 90863.39,
    ....

but coinmarket API return:
...
"percent_change_60d": 40.58207356,
...

In above example balance60d return value that is ~40% higher than current balance. As we can see coinmarketAPI return "percent_change_60d": 40.58207356, so balance60d should be lower by 40%

Reproduction steps

  1. call GET api/v1/wallet/eth/balance
  2. check response body balances for past time 1h, 24h... etc.

Actual Results

  1. Wrong count values for the past time 1h, 24h...

Expected Results

  1. System should correctly count values for these fields

Code affected

No response

Relevant log output

coinMarket API:
{
    "status": {
        "timestamp": "2023-02-17T12:24:25.395Z",
        "error_code": 0,
        "error_message": null,
        "elapsed": 29,
        "credit_count": 1,
        "notice": null
    },
    "data": {
        "1": {
            "id": 1,
            "name": "Bitcoin",
            "symbol": "BTC",
            "slug": "bitcoin",
            "num_market_pairs": 9984,
            "date_added": "2013-04-28T00:00:00.000Z",
            "tags": [
                {
                    "slug": "mineable",
                    "name": "Mineable",
                    "category": "OTHERS"
                },
                {
                    "slug": "pow",
                    "name": "PoW",
                    "category": "ALGORITHM"
                },
                {
                    "slug": "sha-256",
                    "name": "SHA-256",
                    "category": "ALGORITHM"
                },
                {
                    "slug": "store-of-value",
                    "name": "Store Of Value",
                    "category": "CATEGORY"
                },
                {
                    "slug": "state-channel",
                    "name": "State Channel",
                    "category": "CATEGORY"
                },
                {
                    "slug": "coinbase-ventures-portfolio",
                    "name": "Coinbase Ventures Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "three-arrows-capital-portfolio",
                    "name": "Three Arrows Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "polychain-capital-portfolio",
                    "name": "Polychain Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "binance-labs-portfolio",
                    "name": "Binance Labs Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "blockchain-capital-portfolio",
                    "name": "Blockchain Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "boostvc-portfolio",
                    "name": "BoostVC Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "cms-holdings-portfolio",
                    "name": "CMS Holdings Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "dcg-portfolio",
                    "name": "DCG Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "dragonfly-capital-portfolio",
                    "name": "DragonFly Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "electric-capital-portfolio",
                    "name": "Electric Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "fabric-ventures-portfolio",
                    "name": "Fabric Ventures Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "framework-ventures-portfolio",
                    "name": "Framework Ventures Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "galaxy-digital-portfolio",
                    "name": "Galaxy Digital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "huobi-capital-portfolio",
                    "name": "Huobi Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "alameda-research-portfolio",
                    "name": "Alameda Research Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "a16z-portfolio",
                    "name": "a16z Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "1confirmation-portfolio",
                    "name": "1Confirmation Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "winklevoss-capital-portfolio",
                    "name": "Winklevoss Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "usv-portfolio",
                    "name": "USV Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "placeholder-ventures-portfolio",
                    "name": "Placeholder Ventures Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "pantera-capital-portfolio",
                    "name": "Pantera Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "multicoin-capital-portfolio",
                    "name": "Multicoin Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "paradigm-portfolio",
                    "name": "Paradigm Portfolio",
                    "category": "CATEGORY"
                }
            ],
            "max_supply": 21000000,
            "circulating_supply": 19293700,
            "total_supply": 19293700,
            "is_active": 1,
            "platform": null,
            "cmc_rank": 1,
            "is_fiat": 0,
            "self_reported_circulating_supply": null,
            "self_reported_market_cap": null,
            "tvl_ratio": null,
            "last_updated": "2023-02-17T12:22:00.000Z",
            "quote": {
                "USD": {
                    "price": 23799.1419639994,
                    "volume_24h": 39768800331.75675,
                    "volume_change_24h": 11.2232,
                    "percent_change_1h": 0.14946738,
                    "percent_change_24h": -2.97929733,
                    "percent_change_7d": 9.28414198,
                    "percent_change_30d": 12.01562969,
                    "percent_change_60d": 42.06966595,
                    "percent_change_90d": 42.90753094,
                    "market_cap": 459173505310.8152,
                    "market_cap_dominance": 42.1463,
                    "fully_diluted_market_cap": 499781981243.99,
                    "tvl": null,
                    "last_updated": "2023-02-17T12:22:00.000Z"
                }
            }
        },
        "1027": {
            "id": 1027,
            "name": "Ethereum",
            "symbol": "ETH",
            "slug": "ethereum",
            "num_market_pairs": 6467,
            "date_added": "2015-08-07T00:00:00.000Z",
            "tags": [
                {
                    "slug": "pos",
                    "name": "PoS",
                    "category": "ALGORITHM"
                },
                {
                    "slug": "smart-contracts",
                    "name": "Smart Contracts",
                    "category": "CATEGORY"
                },
                {
                    "slug": "ethereum-ecosystem",
                    "name": "Ethereum Ecosystem",
                    "category": "PLATFORM"
                },
                {
                    "slug": "coinbase-ventures-portfolio",
                    "name": "Coinbase Ventures Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "three-arrows-capital-portfolio",
                    "name": "Three Arrows Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "polychain-capital-portfolio",
                    "name": "Polychain Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "binance-labs-portfolio",
                    "name": "Binance Labs Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "blockchain-capital-portfolio",
                    "name": "Blockchain Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "boostvc-portfolio",
                    "name": "BoostVC Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "cms-holdings-portfolio",
                    "name": "CMS Holdings Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "dcg-portfolio",
                    "name": "DCG Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "dragonfly-capital-portfolio",
                    "name": "DragonFly Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "electric-capital-portfolio",
                    "name": "Electric Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "fabric-ventures-portfolio",
                    "name": "Fabric Ventures Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "framework-ventures-portfolio",
                    "name": "Framework Ventures Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "hashkey-capital-portfolio",
                    "name": "Hashkey Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "kenetic-capital-portfolio",
                    "name": "Kenetic Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "huobi-capital-portfolio",
                    "name": "Huobi Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "alameda-research-portfolio",
                    "name": "Alameda Research Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "a16z-portfolio",
                    "name": "a16z Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "1confirmation-portfolio",
                    "name": "1Confirmation Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "winklevoss-capital-portfolio",
                    "name": "Winklevoss Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "usv-portfolio",
                    "name": "USV Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "placeholder-ventures-portfolio",
                    "name": "Placeholder Ventures Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "pantera-capital-portfolio",
                    "name": "Pantera Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "multicoin-capital-portfolio",
                    "name": "Multicoin Capital Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "paradigm-portfolio",
                    "name": "Paradigm Portfolio",
                    "category": "CATEGORY"
                },
                {
                    "slug": "injective-ecosystem",
                    "name": "Injective Ecosystem",
                    "category": "PLATFORM"
                }
            ],
            "max_supply": null,
            "circulating_supply": 122373866.2178,
            "total_supply": 122373866.2178,
            "is_active": 1,
            "platform": null,
            "cmc_rank": 2,
            "is_fiat": 0,
            "self_reported_circulating_supply": null,
            "self_reported_market_cap": null,
            "tvl_ratio": null,
            "last_updated": "2023-02-17T12:22:00.000Z",
            "quote": {
                "USD": {
                    "price": 1666.2120273504036,
                    "volume_24h": 11650903433.709044,
                    "volume_change_24h": -1.9538,
                    "percent_change_1h": -0.00397995,
                    "percent_change_24h": -0.93419934,
                    "percent_change_7d": 8.14618619,
                    "percent_change_30d": 5.5261198,
                    "percent_change_60d": 40.58207356,
                    "percent_change_90d": 37.82347024,
                    "market_cap": 203900807725.46762,
                    "market_cap_dominance": 18.7137,
                    "fully_diluted_market_cap": 203900807725.47,
                    "tvl": null,
                    "last_updated": "2023-02-17T12:22:00.000Z"
                }
            }
        }
    }
}

our system data:
[
    {
        "name": "Ethereum",
        "symbol": "ETH",
        "balance": [
            {
                "walletAddress": "0x5A0b54D5dc17e0AadC383d2db43B0a0D3E029c4c",
                "quantity": 38.701262140697819864,
                "balance": 64526.92,
                "balance1h": 64611.54,
                "balance24h": 64036.11,
                "balance7d": 69815.47,
                "balance30d": 68173.71,
                "balance60d": 90863.39,
                "balance90d": 88957.00
            }
        ]
    }
]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.