Merge branch 'economics_menu_upgrade' of https://github.com/JerBouma/GamestonkTerminal into economics_menu_upgrade

This commit is contained in:
Jeroen Bouma
2022-03-14 19:00:06 +01:00
12 changed files with 474 additions and 4 deletions

View File

@@ -152,3 +152,6 @@ API_BITQUERY_KEY = os.getenv("GT_API_BITQUERY_KEY") or "REPLACE_ME"
# https://terra.smartstake.io/
API_SMARTSTAKE_KEY = os.getenv("GT_API_SMARTSTAKE_KEY") or "REPLACE_ME"
API_SMARTSTAKE_TOKEN = os.getenv("GT_API_SMARTSTAKE_TOKEN") or "REPLACE_ME"
# https://messari.io/
API_MESSARI_KEY = os.getenv("GT_API_MESSARI_KEY") or "REPLACE_ME"

View File

@@ -23,6 +23,8 @@ from gamestonk_terminal.cryptocurrency.due_diligence import (
glassnode_model,
glassnode_view,
pycoingecko_view,
messari_model,
messari_view,
)
from gamestonk_terminal.decorators import log_start_end
from gamestonk_terminal.helper_funcs import (
@@ -71,12 +73,14 @@ class DueDiligenceController(CryptoBaseController):
"balance",
],
"cb": ["cbbook", "trades", "stats"],
"mes": ["mcapdom"],
}
DD_VIEWS_MAPPING = {
"cg": pycoingecko_view,
"cp": coinpaprika_view,
"bin": binance_view,
"mes": messari_view,
}
PATH = "/crypto/dd/"
@@ -132,6 +136,9 @@ class DueDiligenceController(CryptoBaseController):
choices["twitter"]["-s"] = {
c: None for c in coinpaprika_view.TWEETS_FILTERS
}
choices["mcapdom"]["-i"] = {
c: None for c in messari_model.INTERVALS_TIMESERIES
}
choices["ps"]["--vs"] = {c: None for c in coinpaprika_view.CURRENCIES}
self.completer = NestedCompleter.from_nested_dict(choices)
@@ -174,7 +181,9 @@ class DueDiligenceController(CryptoBaseController):
[src]Coinbase[/src]
cbbook show order book
trades show last trades
stats show coin stats[/cmds]
stats show coin stats
[src]Messari[/src]
mcapdom show market cap dominance[/cmds]
"""
console.print(text=help_text, menu="Stocks - Due Diligence")
@@ -1183,3 +1192,58 @@ class DueDiligenceController(CryptoBaseController):
descend=ns_parser.descend,
export=ns_parser.export,
)
@log_start_end(log=logger)
def call_mcapdom(self, other_args: List[str]):
"""Process mcapdom command"""
parser = argparse.ArgumentParser(
add_help=False,
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
prog="mcapdom",
description="""
Display asset's percentage share of total crypto circulating market cap
[Source: https://messari.io]
""",
)
parser.add_argument(
"-i",
"--interval",
dest="interval",
type=str,
help="Frequency interval. Default: 1d",
default="1d",
choices=messari_model.INTERVALS_TIMESERIES,
)
parser.add_argument(
"-s",
"--start",
dest="start",
type=valid_date,
help="Initial date. Default: A year ago",
default=(datetime.now() - timedelta(days=365)).strftime("%Y-%m-%d"),
)
parser.add_argument(
"-end",
"--end",
dest="end",
type=valid_date,
help="End date. Default: Today",
default=datetime.now().strftime("%Y-%m-%d"),
)
ns_parser = parse_known_args_and_warn(
parser, other_args, EXPORT_BOTH_RAW_DATA_AND_FIGURES
)
if ns_parser:
messari_view.display_marketcap_dominance(
coin=self.symbol.upper(),
interval=ns_parser.interval,
start=ns_parser.start,
end=ns_parser.end,
export=ns_parser.export,
)

View File

@@ -0,0 +1,72 @@
import logging
import pandas as pd
import requests
from gamestonk_terminal import config_terminal as cfg
from gamestonk_terminal.decorators import log_start_end
from gamestonk_terminal.rich_config import console
logger = logging.getLogger(__name__)
INTERVALS_TIMESERIES = ["5m", "15m", "30m", "1h", "1d", "1w"]
base_url = "https://data.messari.io/api/v1/"
@log_start_end(log=logger)
def get_marketcap_dominance(
coin: str, interval: str, start: str, end: str
) -> pd.DataFrame:
"""Returns market dominance of a coin over time
[Source: https://messari.io/]
Parameters
----------
coin : str
Crypto symbol to check market cap dominance
start : int
Initial date like string (e.g., 2021-10-01)
end : int
End date like string (e.g., 2021-10-01)
interval : str
Interval frequency (e.g., 1d)
Returns
-------
pd.DataFrame
market dominance percentage over time
"""
url = base_url + f"assets/{coin}/metrics/mcap.dom/time-series"
headers = {"x-messari-api-key": cfg.API_MESSARI_KEY}
parameters = {
"start": start,
"end": end,
"interval": interval,
}
r = requests.get(url, params=parameters, headers=headers)
df = pd.DataFrame()
if r.status_code == 200:
df = pd.DataFrame(
r.json()["data"]["values"], columns=["timestamp", "marketcap_dominance"]
)
if df.empty:
console.print(f"No data found for {coin}.\n")
else:
df = df.set_index("timestamp")
df.index = pd.to_datetime(df.index, unit="ms")
elif r.status_code == 401:
console.print("[red]Invalid API Key[/red]\n")
else:
console.print(r.text)
return df

View File

@@ -0,0 +1,80 @@
import logging
import os
from typing import List, Optional
from matplotlib import pyplot as plt
from gamestonk_terminal.config_terminal import theme
from gamestonk_terminal.decorators import check_api_key
from gamestonk_terminal import config_plot as cfgPlot
from gamestonk_terminal.cryptocurrency.due_diligence.messari_model import (
get_marketcap_dominance,
)
from gamestonk_terminal.decorators import log_start_end
from gamestonk_terminal.helper_funcs import export_data, plot_autoscale
from gamestonk_terminal.rich_config import console
logger = logging.getLogger(__name__)
@log_start_end(log=logger)
@check_api_key(["API_MESSARI_KEY"])
def display_marketcap_dominance(
coin: str,
start: str,
end: str,
interval: str,
export: str = "",
external_axes: Optional[List[plt.Axes]] = None,
) -> None:
"""Display market dominance of a coin over time
[Source: https://messari.io/]
Parameters
----------
coin : str
Crypto symbol to check market cap dominance
start : int
Initial date like string (e.g., 2021-10-01)
end : int
End date like string (e.g., 2021-10-01)
interval : str
Interval frequency (e.g., 1d)
export : str
Export dataframe data to csv,json,xlsx file
external_axes : Optional[List[plt.Axes]], optional
External axes (1 axis is expected in the list), by default None
"""
df = get_marketcap_dominance(coin=coin, start=start, end=end, interval=interval)
if df.empty:
return
# This plot has 1 axis
if not external_axes:
_, ax = plt.subplots(figsize=plot_autoscale(), dpi=cfgPlot.PLOT_DPI)
else:
if len(external_axes) != 1:
logger.error("Expected list of one axis item.")
console.print("[red]Expected list of one axis item./n[/red]")
return
(ax,) = external_axes
ax.plot(df.index, df["marketcap_dominance"])
ax.set_title(f"{coin}'s Market Cap Dominance over time")
ax.set_ylabel(f"{coin} Percentage share")
ax.set_xlim(df.index[0], df.index[-1])
theme.style_primary_axis(ax)
if not external_axes:
theme.visualize_output()
export_data(
export,
os.path.dirname(os.path.abspath(__file__)),
"mcapdom",
df,
)

View File

@@ -11,4 +11,5 @@ social
score
dev
bc
exit
mcapdom
exit

View File

@@ -0,0 +1,71 @@
interactions:
- request:
body: null
headers:
Accept:
- '*/*'
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
User-Agent:
- python-requests/2.27.1
x-messari-api-key:
- mock_x-messari-api-key
method: GET
uri: https://data.messari.io/api/v1/assets/BTC/metrics/mcap.dom/time-series?start=2022-01-10&end=2022-03-08&interval=1d
response:
body:
string: !!binary |
H4sIAAAAAAAA/3SVT2/jyNHGvwrRl/cNQGvqf1fpmM0pQW7OZQcDg5G4Y2YsSiCpnQwG/u4BZTbJ
BFjDB8P8sfqpp58q/kzj1Ez3MR1/pvatuY3tOR0JoE5Td2nHqbnc0jERED0BP6E8QxxVj0wHVhMB
tfg1vdfp3EzNXOPWDM2lndrhUbEZx3Z6+db+SMf05+dfUr38pzunY8KWkdCbp1akfRJyfXKC05OT
U9sSEbCmetY3TKsGfEJ4Bjg+fn9NdWr7804g+H897PqpHX5v3ubTzqlO1+HcDumYmvHU9ueu/5rq
9Nt1uDTzAf8ar33a9f2yPrn33b+fLt3bWze2p2t/HlOdTte3+6Uf0/Hzzqk6XZrhWzudmtvL+Xrp
+qY/tenLe53G02t7eTh0aaehO31YcDk1t8P5ekl16ptLm47p7+X96i/r+3U6t+Np6G5Td+3TMT2/
ttV6TrWeU3VjNb221cPi/xurWzuc2n5qvrbV+NoMbXX9rZquU/NWnYYft+lanbrhdH9rpq7/utVL
dfq9ebu348smeR+F5/J31fXV3pNq7GYRs4L2dj29Vv+P1V+b/t4MPyqMDFW5mOofz7/86Q+s+uPm
tm7muF26vrvcLy//e8Hj9T6c2pdmmobun/cPvz7/LOb+rem+XVOd7sP8wus03cbjp0/fv38/fJuf
HE7Xy6f0Pl/XhwXp+PkzmmDO5DD/1BwHNwxkRUAlcvlSPxDXoA9E4CBKnFWzsWShhQhR2xVhBzJR
c84LQcAfJR6ECDgo5GyZPS8EostGhDIzWYYAc1sQAtm0Eucwh4wOJFKIQFoJcCNHFWMxLUI45yLV
Dx7GYDkzo5svhJhsUkkQ3UVno4ohpAqbVKcQIXc3YyjNGJuvlgE5uHtWUyFdiEy8mcriGJrNhaOU
cAhbgZxNnYKFzSAXP3whoBY8MKooIs9SSyvhJGuNQJLIQOKOgR8Eg7mvJSJUdL4VJbVCoCpthDkz
uHiOjMV1JkFbEfdgBnQ0CpelXeYlZVALHRQ1EBWJSRWXblhQZEXYMZuYIKBQLIQC+EqQANucGzXm
lfBMuxougAZo7swLYZltJVADAlDUM1qRuuTjo5sMmsOMg4BzqeElIjMhYa6ZwzwYlpRxlH4fhDEI
QnYMWgMggLFJJfcgY/ZwXXoRBN1cDTaE+fqRLasUJGhzFcAyZyMDEo1yDGXftAZkQDZEw5ASI2GT
na1ZUUTNQK3MpojiloFHt6QYwJqLWC22PYw3QhSm2XYppxjJpnUeFs8eSGxaTskIWwCycpYMjgjG
a8OPkS9IhETQLN48oiDuvPkamdTMYs7S6nxYbFpV3UHDc3bwJfNanP8gAB0sQpRpaUZRaJM6t6oG
xKFIJfHzAt2kMs5R9wzZsmipwqi7tCohBYdD5nXl6SPA692wh2YyEs2UC+G7yUJhYbZgyebL3ajm
3WARzAMazm6ApV+z3WABoLuzuQiVodAsu8EyECEWp5jbWQhn3sU1IIjRZb6yZWzKV2QZLHfWMMxk
VobTAGwf1sAIzsKiXHavQdA+AREsCmbb/jbM62DxQXTOA1t2Xj9oRrZOFh/YBIJQgFWFCsK6ThYf
0FRRVOc1LYurjzWwZSSLxfzloOymi2mmtB+sCPRgDMqMpYgh7pcAYTCSGOK6Jx7h3UIiyjE/zsiC
X768v/8nAAD//6Kn+3blCgAA
headers:
Connection:
- keep-alive
Content-Length:
- '1272'
Content-Type:
- application/json; charset=UTF-8
Date:
- Mon, 14 Mar 2022 09:55:32 GMT
content-encoding:
- gzip
server:
- istio-envoy
vary:
- Accept-Encoding,Origin
x-envoy-decorator-operation:
- meridian-service.meridian.svc.cluster.local:8080/*
x-envoy-upstream-service-time:
- '246'
x-ratelimit-limit:
- '4000'
x-ratelimit-remaining:
- '3984'
x-ratelimit-reset:
- '1647329561'
status:
code: 200
message: OK
version: 1

View File

@@ -0,0 +1,71 @@
interactions:
- request:
body: null
headers:
Accept:
- '*/*'
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
User-Agent:
- python-requests/2.27.1
x-messari-api-key:
- mock_x-messari-api-key
method: GET
uri: https://data.messari.io/api/v1/assets/BTC/metrics/mcap.dom/time-series?start=2022-01-10&end=2022-03-08&interval=1d
response:
body:
string: !!binary |
H4sIAAAAAAAA/3SWT2/jyNHGvwrRl/cNQGvqf1fpmM0pQW7OZQcDg5G4Y2YsSiCpnQwG/u4BZTbJ
BFjDB0H9Y/VTTz/V1M80Ts10H9PxZ2rfmtvYntORCOo0dZd2nJrLLR0TAdET8BPKM/KR5ChxcCQz
8NBf03udzs3UzDVuzdBc2qkdHhWbcWynl2/tj3RMf37+JdXLN905HRO2jITePLUi7ZOQ65MTnJ6c
nNqWiIA11bO+YVo14BPCM8Dx8f9rqlPbn3cCwf9rseundvi9eZt3O6c6XYdzO6RjasZT25+7/muq
02/X4dLMG/xrvPZp1/fLunLvu38/Xbq3t25sT9f+PKY6na5v90s/puPnnVN1ujTDt3Y6NbeX8/XS
9U1/atOX9zqNp9f28nDo0k5Dd/qw4HJqbofz9ZLq1DeXNh3T38vz1V/W5+t0bsfT0N2m7tqnY3p+
bat1n2rdp+rGanptq4fF/zdWt3Y4tf3UfG2r8bUZ2ur6WzVdp+atOg0/btO1OnXD6f7WTF3/dauX
6vR783Zvx5dN8j4Kz+Vz1fXV3pNq7GYRs4L2dj29Vv+P1V+b/t4MPyqMDFU5mOofz7/86Q+s+uPm
tm7muF26vrvcLy//e8Dj9T6c2pdmmobun/cPvz7/LOb+rem+XVOd7sP8wOs03cbjp0/fv38/fJtX
Dqfr5VN6n4/rw4J0/PwZTTBncpj/ao6DGwayIqASuXypH4hr0AcicBAlzqrZWLLQQoSo7YqwA5mo
OeeFIOCPEg9CBBwUcrbMnhcC0WUjQpmZLEOAuS0IgWxaiXOYQ0YHEilEIK0EuJGjirGYFiGcc5Hq
Bw9jsJyZ0c0XQkw2qSSI7qKzUcUQUoVNqlOIkLubMZRmjM1Xy4Ac3D2rqZAuRCbeTGVxDM3mwlFK
OIStQM6mTsHCZpCLH74QUAseGFUUkWeppZVwkrVGIElkIHHHwA+CwdzXEhEqOp+KklohUJU2wpwZ
XDxHxuI6k6CtiHswAzoahcvSLvOSMqiFDooaiIrEpIpLNywosiLsmE1MEFAoFkIBfCVIgG3OjRrz
SnimXQ0XQAM0d+aFsMy2EqgBASjqGa1IXfLx0U0GzWHGQcC51PASkZmQMNfMYR4MS8o4Sr8PwhgE
ITsGrQEQwNikknuQMXu4Lr0Igm6uBhvCfPzIllUKErS5CmCZs5EBiUbZhrJvWgMyIBuiYUiJkbDJ
ztasKKJmoFZmU0Rxy8CjW1IMYM1FrBbbHsYbIQrTbLuUXYxk0zoPi2cPJDYtu2SELQBZOUsGRwTj
teHHyBckQiJoFm8eURB33nyNTGpmMWdpdT4sNq2q7qDhOTv4knktzn8QgA4WIcq0NKMotEmdW1UD
4lCkkvj5At2kMs5R9wzZsmipwqi7tCohBYdD5vXK00eA17NhD81kJJopF8J3k4XCwmzBks2Xs1HN
u8EimAc0nN0AS7/zj51djtDd2VyEylBolt1gGYgQi1PM7SyEM+/iGhDE6DIf2TI25S2yDJY7axhm
MivDaQC2D2tgBGdhUS53r0HQPgERLApm2/1tmNfB4oPonAe27Ly+0IxsnSw+sAkEoQCrChWEdZ0s
PqCpoqjO17Qsrj6ugS0jWSzmNwdlN11MM6X9YEWgB2NQZixFDHF/CRAGI4khrvfEI7xbSEQ55uWM
LPjly/v7fwIAAP//7x9zNuUKAAA=
headers:
Connection:
- keep-alive
Content-Length:
- '1274'
Content-Type:
- application/json; charset=UTF-8
Date:
- Mon, 14 Mar 2022 13:24:49 GMT
content-encoding:
- gzip
server:
- istio-envoy
vary:
- Accept-Encoding,Origin
x-envoy-decorator-operation:
- meridian-service.meridian.svc.cluster.local:8080/*
x-envoy-upstream-service-time:
- '239'
x-ratelimit-limit:
- '4000'
x-ratelimit-remaining:
- '3982'
x-ratelimit-reset:
- '1647329561'
status:
code: 200
message: OK
version: 1

View File

@@ -0,0 +1,59 @@
timestamp,marketcap_dominance
2022-01-10,39.861913510152284
2022-01-11,40.45237557634742
2022-01-12,39.86380264568372
2022-01-13,39.44080507767387
2022-01-14,39.495333267090686
2022-01-15,39.23796807180244
2022-01-16,39.08628154634652
2022-01-17,38.89630677331868
2022-01-18,39.24118845417784
2022-01-19,39.82944288866307
2022-01-20,40.02808887565425
2022-01-21,40.3481957684397
2022-01-22,40.776582934366076
2022-01-23,41.3154511354178
2022-01-24,40.91249702488191
2022-01-25,41.99545776752561
2022-01-26,41.968330848797144
2022-01-27,41.889330181629845
2022-01-28,42.515911512325516
2022-01-29,42.38176464101429
2022-01-30,42.24036642156339
2022-01-31,42.38840160168833
2022-02-01,42.15909014587165
2022-02-02,41.70579663920373
2022-02-03,41.49685739689302
2022-02-04,41.463041078192425
2022-02-05,42.2889263389859
2022-02-06,41.936103436136754
2022-02-07,42.006737626024595
2022-02-08,41.907013611619476
2022-02-09,42.27514456605687
2022-02-10,41.85739251903579
2022-02-11,42.36211432883346
2022-02-12,42.86638789123657
2022-02-13,42.753747081106354
2022-02-14,42.994992648068994
2022-02-15,42.97256669764625
2022-02-16,42.55880598778081
2022-02-17,42.5018069945326
2022-02-18,42.143256023951245
2022-02-19,42.313255870767456
2022-02-20,42.352129398073686
2022-02-21,42.23895726245727
2022-02-22,42.14343369347689
2022-02-23,42.20889398386011
2022-02-24,42.00188836844265
2022-02-25,42.60442348297674
2022-02-26,41.99092318444793
2022-02-27,41.78835961726633
2022-02-28,41.909199374345384
2022-03-01,42.99993450661868
2022-03-02,43.45883236783284
2022-03-03,43.364092140355424
2022-03-04,43.16551455348149
2022-03-05,42.574692464278655
2022-03-06,42.29918931927319
2022-03-07,42.282193124611425
2022-03-08,42.34539611471341
1 timestamp marketcap_dominance
2 2022-01-10 39.861913510152284
3 2022-01-11 40.45237557634742
4 2022-01-12 39.86380264568372
5 2022-01-13 39.44080507767387
6 2022-01-14 39.495333267090686
7 2022-01-15 39.23796807180244
8 2022-01-16 39.08628154634652
9 2022-01-17 38.89630677331868
10 2022-01-18 39.24118845417784
11 2022-01-19 39.82944288866307
12 2022-01-20 40.02808887565425
13 2022-01-21 40.3481957684397
14 2022-01-22 40.776582934366076
15 2022-01-23 41.3154511354178
16 2022-01-24 40.91249702488191
17 2022-01-25 41.99545776752561
18 2022-01-26 41.968330848797144
19 2022-01-27 41.889330181629845
20 2022-01-28 42.515911512325516
21 2022-01-29 42.38176464101429
22 2022-01-30 42.24036642156339
23 2022-01-31 42.38840160168833
24 2022-02-01 42.15909014587165
25 2022-02-02 41.70579663920373
26 2022-02-03 41.49685739689302
27 2022-02-04 41.463041078192425
28 2022-02-05 42.2889263389859
29 2022-02-06 41.936103436136754
30 2022-02-07 42.006737626024595
31 2022-02-08 41.907013611619476
32 2022-02-09 42.27514456605687
33 2022-02-10 41.85739251903579
34 2022-02-11 42.36211432883346
35 2022-02-12 42.86638789123657
36 2022-02-13 42.753747081106354
37 2022-02-14 42.994992648068994
38 2022-02-15 42.97256669764625
39 2022-02-16 42.55880598778081
40 2022-02-17 42.5018069945326
41 2022-02-18 42.143256023951245
42 2022-02-19 42.313255870767456
43 2022-02-20 42.352129398073686
44 2022-02-21 42.23895726245727
45 2022-02-22 42.14343369347689
46 2022-02-23 42.20889398386011
47 2022-02-24 42.00188836844265
48 2022-02-25 42.60442348297674
49 2022-02-26 41.99092318444793
50 2022-02-27 41.78835961726633
51 2022-02-28 41.909199374345384
52 2022-03-01 42.99993450661868
53 2022-03-02 43.45883236783284
54 2022-03-03 43.364092140355424
55 2022-03-04 43.16551455348149
56 2022-03-05 42.574692464278655
57 2022-03-06 42.29918931927319
58 2022-03-07 42.282193124611425
59 2022-03-08 42.34539611471341

View File

@@ -0,0 +1,28 @@
# IMPORTATION STANDARD
# IMPORTATION THIRDPARTY
import pytest
# IMPORTATION INTERNAL
from gamestonk_terminal.cryptocurrency.due_diligence import messari_model
@pytest.fixture(scope="module")
def vcr_config():
return {
"filter_headers": [("x-messari-api-key", "mock_x-messari-api-key")],
}
@pytest.mark.vcr
@pytest.mark.parametrize(
"coin,interval,start,end",
[
("BTC", "1d", "2022-01-10", "2022-03-08"),
],
)
def test_get_marketcap_dominance(coin, interval, start, end, recorder):
df = messari_model.get_marketcap_dominance(
coin=coin, interval=interval, start=start, end=end
)
recorder.capture(df)

View File

@@ -35,4 +35,5 @@ Coinbase
cbbook show order book
trades show last trades
stats show coin stats
Messari
mcapdom show market cap dominance

View File

@@ -0,0 +1,19 @@
```
usage: mcapdom [-i {5m,15m,30m,1h,1d,1w}] [-s START] [-end END] [-h]
[--export {csv,json,xlsx,png,jpg,pdf,svg}]
```
Display asset's percentage share of total crypto circulating market cap [Source: https://messari.io]
```
optional arguments:
-i {5m,15m,30m,1h,1d,1w}, --interval {5m,15m,30m,1h,1d,1w}
Frequency interval. Default: 1d (default: 1d)
-s START, --start START
Initial date. Default: A year ago (default: 2021-03-14)
-end END, --end END End date. Default: Today (default: 2022-03-14)
-h, --help show this help message (default: False)
--export {csv,json,xlsx,png,jpg,pdf,svg}
Export raw data into csv, json, xlsx and figure into png, jpg, pdf, svg
(default: )
```

View File

@@ -598,7 +598,6 @@ main:
ref: "/terminal/common/quantitative_analysis/capm"
- name: line
ref: "/terminal/common/quantitative_analysis/line"
- name: prediction techniques
ref: "/terminal/common/prediction_techniques"
sub:
@@ -764,6 +763,8 @@ main:
ref: "/terminal/cryptocurrency/due_diligence/trades"
- name: stats
ref: "/terminal/cryptocurrency/due_diligence/stats"
- name: stats
ref: "/cryptocurrency/due_diligence/mcapdom"
- name: onchain
ref: "/terminal/cryptocurrency/onchain"
sub: