From e3cd8adf735efade24e8420143d2d08162910d66 Mon Sep 17 00:00:00 2001 From: jose-donato <43375532+jose-donato@users.noreply.github.com> Date: Mon, 2 May 2022 22:21:19 +0100 Subject: [PATCH] Add Messari crypto dd commands (#1711) --- .github/workflows/test.yml | 2 +- .pre-commit-config.yaml | 2 +- .../cryptocurrency/cryptocurrency_helpers.py | 19 + .../cryptocurrency/dataframe_helpers.py | 15 + .../due_diligence/dappradar_model.py | 0 .../due_diligence/dd_controller.py | 348 ++++++++- .../due_diligence/glassnode_model.py | 15 +- .../due_diligence/messari_model.py | 671 +++++++++++++++- .../due_diligence/messari_view.py | 714 +++++++++++++++++- .../due_diligence/pycoingecko_model.py | 33 + scripts/test_crypto_dd.openbb | 9 + .../test_get_available_timeseries.yaml | 257 +++++++ .../test_get_coin_tokenomics[aave].yaml | 438 +++++++++++ .../test_get_coin_tokenomics[btc].yaml | 58 ++ .../test_get_coin_tokenomics[eth].yaml | 58 ++ .../test_get_fundraising[eth].yaml | 60 ++ .../test_get_governance[eth].yaml | 57 ++ .../test_get_investors[eth].yaml | 132 ++++ .../test_get_links[eth].yaml | 43 ++ ...minance[BTC-1d-2022-01-10-2022-03-08].yaml | 71 -- ...minance[btc-1d-2022-01-10-2022-03-08].yaml | 61 ++ ...c-1d-2022-01-10-2022-03-08-sply.circ].yaml | 60 ++ .../test_get_project_product_info[eth].yaml | 86 +++ .../test_get_roadmap[eth].yaml | 132 ++++ .../test_get_team[eth].yaml | 84 +++ .../test_get_available_timeseries.csv | 243 ++++++ .../test_get_coin_tokenomics[aave].csv | 5 + .../test_get_fundraising[ETH]_1.csv | 2 + .../test_get_fundraising[ETH]_2.csv | 1 + .../test_get_fundraising[ETH]_3.csv | 7 + .../test_get_fundraising[eth]_1.csv | 2 + .../test_get_fundraising[eth]_2.csv | 1 + .../test_get_fundraising[eth]_3.csv | 7 + .../test_get_governance[ETH]_1.csv | 12 + .../test_get_governance[eth]_1.csv | 12 + .../test_get_investors[ETH].csv | 1 + .../test_get_investors[ETH]_1.csv | 40 + .../test_get_investors[eth].csv | 1 + .../test_get_investors[eth]_1.csv | 40 + .../test_get_links[ETH].csv | 8 + .../test_get_links[eth].csv | 8 + ...ominance[BTC-1d-2022-01-10-2022-03-08].csv | 2 +- ...ominance[btc-1d-2022-01-10-2022-03-08].csv | 59 ++ ...TC-1d-2022-01-10-2022-03-08-sply.circ].csv | 59 ++ ...tc-1d-2022-01-10-2022-03-08-sply.circ].csv | 59 ++ .../test_get_project_product_info[ETH].csv | 13 + .../test_get_project_product_info[ETH]_1.csv | 4 + .../test_get_project_product_info[ETH]_2.csv | 3 + .../test_get_project_product_info[ETH]_3.csv | 5 + .../test_get_project_product_info[eth].csv | 13 + .../test_get_project_product_info[eth]_1.csv | 4 + .../test_get_project_product_info[eth]_2.csv | 3 + .../test_get_project_product_info[eth]_3.csv | 5 + .../test_get_roadmap[ETH].csv | 71 ++ .../test_get_roadmap[eth].csv | 71 ++ .../test_messari_model/test_get_team[ETH].csv | 17 + .../test_get_team[ETH]_1.csv | 9 + .../test_messari_model/test_get_team[eth].csv | 17 + .../test_get_team[eth]_1.csv | 9 + .../due_diligence/test_dd_controller.py | 58 +- .../due_diligence/test_messari_model.py | 130 +++- .../test_dd_controller/test_print_help.txt | 21 +- .../test_get_fundraising[ETH].txt | 9 + .../test_get_fundraising[eth].txt | 9 + .../test_get_governance[ETH].txt | 1 + .../test_get_governance[eth].txt | 1 + .../cryptocurrency/due_diligence/fr/_index.md | 9 + .../due_diligence/gov/_index.md | 9 + .../due_diligence/inv/_index.md | 9 + .../due_diligence/links/_index.md | 9 + .../cryptocurrency/due_diligence/mt/_index.md | 22 + .../cryptocurrency/due_diligence/pi/_index.md | 9 + .../cryptocurrency/due_diligence/rm/_index.md | 10 + .../due_diligence/team/_index.md | 9 + .../cryptocurrency/due_diligence/tk/_index.md | 9 + website/data/menu/main.yml | 22 +- 76 files changed, 4453 insertions(+), 131 deletions(-) delete mode 100644 openbb_terminal/cryptocurrency/due_diligence/dappradar_model.py create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_available_timeseries.yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[aave].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[btc].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[eth].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_fundraising[eth].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_governance[eth].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_investors[eth].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_links[eth].yaml delete mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_marketcap_dominance[BTC-1d-2022-01-10-2022-03-08].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_marketcap_dominance[btc-1d-2022-01-10-2022-03-08].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_messari_timeseries[btc-1d-2022-01-10-2022-03-08-sply.circ].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_project_product_info[eth].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_roadmap[eth].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_team[eth].yaml create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_available_timeseries.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_coin_tokenomics[aave].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_1.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_2.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_3.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_1.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_2.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_3.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_governance[ETH]_1.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_governance[eth]_1.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[ETH].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[ETH]_1.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[eth].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[eth]_1.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_links[ETH].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_links[eth].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_marketcap_dominance[btc-1d-2022-01-10-2022-03-08].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_messari_timeseries[BTC-1d-2022-01-10-2022-03-08-sply.circ].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_messari_timeseries[btc-1d-2022-01-10-2022-03-08-sply.circ].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_1.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_2.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_3.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_1.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_2.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_3.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_roadmap[ETH].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_roadmap[eth].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[ETH].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[ETH]_1.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[eth].csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[eth]_1.csv create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_fundraising[ETH].txt create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_fundraising[eth].txt create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_governance[ETH].txt create mode 100644 tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_governance[eth].txt create mode 100644 website/content/terminal/cryptocurrency/due_diligence/fr/_index.md create mode 100644 website/content/terminal/cryptocurrency/due_diligence/gov/_index.md create mode 100644 website/content/terminal/cryptocurrency/due_diligence/inv/_index.md create mode 100644 website/content/terminal/cryptocurrency/due_diligence/links/_index.md create mode 100644 website/content/terminal/cryptocurrency/due_diligence/mt/_index.md create mode 100644 website/content/terminal/cryptocurrency/due_diligence/pi/_index.md create mode 100644 website/content/terminal/cryptocurrency/due_diligence/rm/_index.md create mode 100644 website/content/terminal/cryptocurrency/due_diligence/team/_index.md create mode 100644 website/content/terminal/cryptocurrency/due_diligence/tk/_index.md diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 62674d50144..75eb1024d58 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,7 +32,7 @@ jobs: - run: pip install types-pytz types-requests types-termcolor types-tabulate types-PyYAML types-python-dateutil types-setuptools types-six - run: bandit -x ./tests -r . || true - run: black --check . - - run: codespell --ignore-words-list=zlot,ba,buil,coo,ether,hist,hsi,mape,navagation,operatio,pres,ser,yeld,shold,ist,varian,datas,ake --quiet-level=2 --skip=./tests,.git,*.css,*.csv,*.html,*.ini,*.ipynb,*.js,*.json,*.lock,*.scss,*.txt,*.yaml,./build/pyinstaller + - run: codespell --ignore-words-list=zlot,ba,buil,coo,ether,hist,hsi,mape,navagation,operatio,pres,ser,yeld,shold,ist,varian,datas,ake,creat --quiet-level=2 --skip=./tests,.git,*.css,*.csv,*.html,*.ini,*.ipynb,*.js,*.json,*.lock,*.scss,*.txt,*.yaml,./build/pyinstaller - run: flake8 . --count --ignore=E203,W503 --max-line-length=122 --show-source --statistics --exclude ./build/pyinstaller - run: mypy --ignore-missing-imports --exclude="/setup\.py$" . - run: shopt -s globstar && pyupgrade --py36-plus **/*.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 97ef2c19064..409506f2dc8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -38,7 +38,7 @@ repos: entry: codespell args: [ - "--ignore-words-list=zlot,ba,buil,coo,ether,hist,hsi,mape,navagation,operatio,pres,ser,yeld,shold,ist,varian,datas,AKE", + "--ignore-words-list=zlot,ba,buil,coo,ether,hist,hsi,mape,navagation,operatio,pres,ser,yeld,shold,ist,varian,datas,ake,creat", "--quiet-level=2", "--skip=./tests,.git,*.css,*.csv,*.html,*.ini,*.ipynb,*.js,*.json,*.lock,*.scss,*.txt,*.yaml,build/pyinstaller/*", ] diff --git a/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py b/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py index b6206041056..30c7c3779c7 100644 --- a/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py +++ b/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py @@ -1060,6 +1060,25 @@ def load_ta_data( return pd.DataFrame(), currency +def load_yf_data(symbol: str, currency: str, interval: str, days: int): + df_coin = yf.download( + f"{symbol.upper()}-{currency.upper()}", + end=datetime.now(), + start=datetime.now() - timedelta(days=days), + progress=False, + interval=interval, + ).sort_index(ascending=False) + + df_coin.index.names = ["date"] + if df_coin.empty: + console.print( + f"Could not download data for {symbol}-{currency} from Yahoo Finance" + ) + return pd.DataFrame(), currency + + return df_coin[::-1], currency + + def plot_chart( coin_map_df: pd.DataFrame, source: str, currency: str, **kwargs: Any ) -> None: diff --git a/openbb_terminal/cryptocurrency/dataframe_helpers.py b/openbb_terminal/cryptocurrency/dataframe_helpers.py index a0e0907cc6b..4f83d2bdfbb 100644 --- a/openbb_terminal/cryptocurrency/dataframe_helpers.py +++ b/openbb_terminal/cryptocurrency/dataframe_helpers.py @@ -124,6 +124,21 @@ def lambda_very_long_number_formatter(num: Union[str, int, float]) -> str: return num +def prettify_paragraph(text): + + # Add tab to the beginning of paragraph + text = "\t" + text + pat = "(? list: """Helper method that change column names into more human readable format. E.g. - tradeAmount => Trade amount, diff --git a/openbb_terminal/cryptocurrency/due_diligence/dappradar_model.py b/openbb_terminal/cryptocurrency/due_diligence/dappradar_model.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/openbb_terminal/cryptocurrency/due_diligence/dd_controller.py b/openbb_terminal/cryptocurrency/due_diligence/dd_controller.py index ea51a6fc927..c62b21724d4 100644 --- a/openbb_terminal/cryptocurrency/due_diligence/dd_controller.py +++ b/openbb_terminal/cryptocurrency/due_diligence/dd_controller.py @@ -1,7 +1,7 @@ """Cryptocurrency Due diligence Controller""" __docformat__ = "numpy" -# pylint: disable=R0904, C0302, W0622, C0201 +# pylint: disable=R0904, C0302, W0622, C0201, consider-using-dict-items import argparse import logging from datetime import datetime, timedelta @@ -76,7 +76,7 @@ class DueDiligenceController(CryptoBaseController): "balance", ], "cb": ["cbbook", "trades", "stats"], - "mes": ["mcapdom"], + "mes": ["mcapdom", "links", "rm", "tk", "pi", "mt", "team", "gov", "fr", "inv"], "san": ["gh"], "cpanic": ["news"], } @@ -110,7 +110,10 @@ class DueDiligenceController(CryptoBaseController): self.source = source self.symbol = symbol self.coin_map_df = coin_map_df - + self.messari_timeseries = [] + df_mt = messari_model.get_available_timeseries() + if not df_mt.empty: + self.messari_timeseries = df_mt.index.to_list() if session and obbff.USE_PROMPT_TOOLKIT: choices: dict = {c: {} for c in self.controller_choices} choices["load"]["--source"] = {c: None for c in CRYPTO_SOURCES.keys()} @@ -143,6 +146,8 @@ class DueDiligenceController(CryptoBaseController): choices["twitter"]["-s"] = { c: None for c in coinpaprika_view.TWEETS_FILTERS } + choices["mt"] = {c: None for c in self.messari_timeseries} + choices["mt"]["-i"] = {c: None for c in messari_model.INTERVALS_TIMESERIES} choices["mcapdom"]["-i"] = { c: None for c in messari_model.INTERVALS_TIMESERIES } @@ -188,14 +193,23 @@ class DueDiligenceController(CryptoBaseController): twitter tweets for loaded coin events events related to loaded coin [src]Binance[/src] - binbook show order book - balance show coin balance + binbook order book + balance coin balance [src]Coinbase[/src] - cbbook show order book - trades show last trades - stats show coin stats + cbbook order book + trades last trades + stats coin stats [src]Messari[/src] - mcapdom show market cap dominance + mcapdom market cap dominance + mt messari timeseries e.g. twitter followers, circ supply, etc + rm roadmap + tk tokenomics e.g. circulating/max/total supply, emission type, etc + pi project information e.g. technology details, public repos, audits, vulns + team contributors (individuals and organizations) + inv investors (individuals and organizations) + gov governance details + fr fundraising details e.g. treasury accounts, sales rounds, allocation + links links e.g. whitepaper, github, twitter, youtube, reddit, telegram [src]Santiment[/src] gh github activity over time [src]CryptoPanic[/src] @@ -206,7 +220,9 @@ class DueDiligenceController(CryptoBaseController): def custom_reset(self): """Class specific component of reset command""" if self.coin: - return ["crypto", f"load {self.coin} --source {self.source}"] + if self.source == "cp": + return ["crypto", f"load {self.symbol}", "dd"] + return ["crypto", f"load {self.symbol} --source {self.source}", "dd"] return [] @log_start_end(log=logger) @@ -1303,9 +1319,31 @@ class DueDiligenceController(CryptoBaseController): ) @log_start_end(log=logger) - def call_gh(self, other_args: List[str]): - """Process mcapdom command""" + def call_links(self, other_args: List[str]): + """Process links command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="links", + description=""" + Display asset's links + [Source: https://messari.io] + """, + ) + ns_parser = parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED + ) + + if ns_parser: + messari_view.display_links( + coin=self.symbol.upper(), + export=ns_parser.export, + ) + + @log_start_end(log=logger) + def call_gh(self, other_args: List[str]): + """Process gh command""" parser = argparse.ArgumentParser( add_help=False, formatter_class=argparse.ArgumentDefaultsHelpFormatter, @@ -1318,9 +1356,8 @@ class DueDiligenceController(CryptoBaseController): See detailed definition at https://academy.santiment.net/metrics/development-activity/ [Source: https://santiment.net/] - """, + """, ) - parser.add_argument( "-i", "--interval", @@ -1368,9 +1405,292 @@ class DueDiligenceController(CryptoBaseController): dev_activity=ns_parser.dev, start=ns_parser.start.strftime("%Y-%m-%dT%H:%M:%SZ"), end=ns_parser.end.strftime("%Y-%m-%dT%H:%M:%SZ"), + ) + + @log_start_end(log=logger) + def call_rm(self, other_args: List[str]): + """Process rm command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="rm", + description=""" + Display asset's roadmap + [Source: https://messari.io] + """, + ) + + parser.add_argument( + "--descend", + action="store_true", + help="Flag to sort in descending order (lowest first)", + dest="descend", + default=False, + ) + + ns_parser = parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED, limit=5 + ) + + if ns_parser: + messari_view.display_roadmap( + descend=ns_parser.descend, + coin=self.symbol.upper(), + limit=ns_parser.limit, export=ns_parser.export, ) + @log_start_end(log=logger) + def call_tk(self, other_args: List[str]): + """Process tk command""" + + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="tk", + description=""" + Display asset's tokenomics + [Source: https://messari.io] + """, + ) + + ns_parser = parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED + ) + + if ns_parser: + messari_view.display_tokenomics( + coin=self.symbol.upper(), + coingecko_symbol=self.coin_map_df["CoinGecko"], + export=ns_parser.export, + ) + + @log_start_end(log=logger) + def call_pi(self, other_args: List[str]): + """Process pi command""" + + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="pi", + description=""" + Display asset's project info + [Source: https://messari.io] + """, + ) + + ns_parser = parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED + ) + + if ns_parser: + messari_view.display_project_info( + coin=self.symbol.upper(), + export=ns_parser.export, + ) + + @log_start_end(log=logger) + def call_team(self, other_args: List[str]): + """Process team command""" + + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="team", + description=""" + Display asset's team + [Source: https://messari.io] + """, + ) + + ns_parser = parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED + ) + + if ns_parser: + messari_view.display_team( + coin=self.symbol.upper(), + export=ns_parser.export, + ) + + @log_start_end(log=logger) + def call_inv(self, other_args: List[str]): + """Process inv command""" + + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="inv", + description=""" + Display asset's investors + [Source: https://messari.io] + """, + ) + + ns_parser = parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED + ) + + if ns_parser: + messari_view.display_investors( + coin=self.symbol.upper(), + export=ns_parser.export, + ) + + @log_start_end(log=logger) + def call_fr(self, other_args: List[str]): + """Process fr command""" + + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="fr", + description=""" + Display asset's fundraising details + [Source: https://messari.io] + """, + ) + + ns_parser = parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED + ) + + if ns_parser: + messari_view.display_fundraising( + coin=self.symbol.upper(), + export=ns_parser.export, + ) + + @log_start_end(log=logger) + def call_gov(self, other_args: List[str]): + """Process gov command""" + + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="gov", + description=""" + Display asset's governance + [Source: https://messari.io] + """, + ) + + ns_parser = parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED + ) + + if ns_parser: + messari_view.display_governance( + coin=self.symbol.upper(), + export=ns_parser.export, + ) + + @log_start_end(log=logger) + def call_mt(self, other_args: List[str]): + """Process mt command""" + + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="mt", + description=""" + Display messari timeseries + [Source: https://messari.io] + """, + ) + + parser.add_argument( + "--list", + action="store_true", + help="Flag to show available timeseries", + dest="list", + default=False, + ) + + parser.add_argument( + "-t", + "--timeseries", + dest="timeseries", + type=str, + help="Messari timeseries id", + default="", + ) + + parser.add_argument( + "-i", + "--interval", + dest="interval", + type=str, + help="Frequency interval", + 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"), + ) + parser.add_argument( + "--include-paid", + action="store_true", + help="Flag to show both paid and free sources", + dest="include_paid", + default=False, + ) + + parser.add_argument( + "-q", + "--query", + type=str, + dest="query", + nargs="+", + help="Query to search across all messari timeseries", + default="", + ) + + if other_args and not other_args[0][0] == "-": + other_args.insert(0, "-t") + + ns_parser = parse_known_args_and_warn( + parser, other_args, EXPORT_BOTH_RAW_DATA_AND_FIGURES, limit=10 + ) + + if ns_parser: + if ( + ns_parser.timeseries + and ns_parser.timeseries not in self.messari_timeseries + ): + console.print("\nTimeseries {ns_parser.timeseries} not found") + return + if ns_parser.list or ns_parser.query or ns_parser.timeseries == "": + messari_view.display_messari_timeseries_list( + ns_parser.limit, + " ".join(ns_parser.query), + not ns_parser.include_paid, + ns_parser.export, + ) + else: + messari_view.display_messari_timeseries( + timeseries_id=ns_parser.timeseries, + coin=self.symbol.upper(), + interval=ns_parser.interval, + start=ns_parser.start, + end=ns_parser.end, + export=ns_parser.export, + ) + @log_start_end(log=logger) def call_news(self, other_args): """Process news command""" diff --git a/openbb_terminal/cryptocurrency/due_diligence/glassnode_model.py b/openbb_terminal/cryptocurrency/due_diligence/glassnode_model.py index fa679f31c8f..de46e584f03 100644 --- a/openbb_terminal/cryptocurrency/due_diligence/glassnode_model.py +++ b/openbb_terminal/cryptocurrency/due_diligence/glassnode_model.py @@ -175,7 +175,9 @@ INTERVALS_EXCHANGE_BALANCES = ["24h"] @log_start_end(log=logger) -def get_close_price(asset: str, interval: str, since: int, until: int) -> pd.DataFrame: +def get_close_price( + asset: str, interval: str, since: int, until: int, print_errors: bool = True +) -> pd.DataFrame: """Returns the price of a cryptocurrency [Source: https://glassnode.com] @@ -189,6 +191,8 @@ def get_close_price(asset: str, interval: str, since: int, until: int) -> pd.Dat End date timestamp (e.g., 1_641_227_783_561) interval : str Interval frequency (e.g., 24h) + print_errors: bool + Flag to print errors. Default: True Returns ------- @@ -214,15 +218,18 @@ def get_close_price(asset: str, interval: str, since: int, until: int) -> pd.Dat df = pd.DataFrame(json.loads(r.text)) if df.empty: - console.print(f"No data found for {asset} price.\n") + if print_errors: + console.print(f"No data found for {asset} price.\n") else: df = df.set_index("t") df.index = pd.to_datetime(df.index, unit="s") elif r.status_code == 401: - console.print("[red]Invalid API Key[/red]\n") + if print_errors: + console.print("[red]Invalid API Key[/red]\n") else: - console.print(r.text) + if print_errors: + console.print(r.text) return df diff --git a/openbb_terminal/cryptocurrency/due_diligence/messari_model.py b/openbb_terminal/cryptocurrency/due_diligence/messari_model.py index 2f44bda5f03..7fc79c9e6ea 100644 --- a/openbb_terminal/cryptocurrency/due_diligence/messari_model.py +++ b/openbb_terminal/cryptocurrency/due_diligence/messari_model.py @@ -1,10 +1,24 @@ -import logging +"""Messari model""" +__docformat__ = "numpy" +# flake8: noqa +# pylint: disable=C0301,C0302 +import logging +from typing import Any, Tuple +import re import pandas as pd import requests from openbb_terminal import config_terminal as cfg +from openbb_terminal.cryptocurrency.dataframe_helpers import ( + lambda_replace_underscores_in_column_names, + prettify_column_names, +) +from openbb_terminal.cryptocurrency.due_diligence.pycoingecko_model import ( + get_coin_tokenomics, +) from openbb_terminal.decorators import log_start_end +from openbb_terminal.helper_funcs import lambda_long_number_format from openbb_terminal.rich_config import console logger = logging.getLogger(__name__) @@ -12,7 +26,44 @@ logger = logging.getLogger(__name__) INTERVALS_TIMESERIES = ["5m", "15m", "30m", "1h", "1d", "1w"] +@log_start_end(log=logger) +def get_available_timeseries() -> pd.DataFrame: + """Returns available messari timeseries + [Source: https://messari.io/] + + Returns + ------- + pd.DataFrame + available timeseries + """ + r = requests.get("https://data.messari.io/api/v1/assets/metrics") + if r.status_code == 200: + data = r.json() + metrics = data["data"]["metrics"] + arr = [] + for metric in metrics: + sources = "" + for source in metric["source_attribution"]: + sources += source["name"] + sources += "," + sources = sources.rstrip(",") + arr.append( + { + "id": metric["metric_id"], + "Title": metric["name"], + "Description": metric["description"], + "Requires Paid Key": "role_restriction" in metric, + "Sources": sources, + } + ) + df = pd.DataFrame(arr) + df.set_index("id", inplace=True) + return df + return pd.DataFrame() + + base_url = "https://data.messari.io/api/v1/" +base_url2 = "https://data.messari.io/api/v2/" @log_start_end(log=logger) @@ -39,7 +90,39 @@ def get_marketcap_dominance( market dominance percentage over time """ - url = base_url + f"assets/{coin}/metrics/mcap.dom/time-series" + df, _, _ = get_messari_timeseries( + coin=coin, end=end, start=start, interval=interval, timeseries_id="mcap.dom" + ) + return df + + +@log_start_end(log=logger) +def get_messari_timeseries( + coin: str, timeseries_id: str, interval: str, start: str, end: str +) -> Tuple[pd.DataFrame, str, str]: + """Returns messari timeseries + [Source: https://messari.io/] + + Parameters + ---------- + coin : str + Crypto symbol to check messari timeseries + timeseries_id : str + Messari timeserie id + 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 + messari timeserie over time + """ + + url = base_url + f"assets/{coin}/metrics/{timeseries_id}/time-series" headers = {"x-messari-api-key": cfg.API_MESSARI_KEY} @@ -52,21 +135,599 @@ def get_marketcap_dominance( r = requests.get(url, params=parameters, headers=headers) df = pd.DataFrame() + title = "" + y_axis = "" if r.status_code == 200: - df = pd.DataFrame( - r.json()["data"]["values"], columns=["timestamp", "marketcap_dominance"] - ) + data = r.json()["data"] + title = data["schema"]["name"] + + df = pd.DataFrame(data["values"], columns=["timestamp", "values"]) + schema_values = data["schema"]["values_schema"] + for key in schema_values.keys(): + if key != "timestamp": + y_axis = schema_values[key] 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: + if "requires a pro or enterprise subscription" in r.text: + console.print("[red]API Key not authorized for Premium Feature[/red]\n") + else: + console.print("[red]Invalid API Key[/red]\n") + else: + console.print(r.text) + return df, title, y_axis + + +@log_start_end(log=logger) +def get_links(symbol: str) -> pd.DataFrame: + """Returns asset's links + [Source: https://messari.io/] + + Parameters + ---------- + symbol : str + Crypto symbol to check links + + Returns + ------- + pd.DataFrame + asset links + """ + + url = base_url2 + f"assets/{symbol}/profile" + + headers = {"x-messari-api-key": cfg.API_MESSARI_KEY} + + params = {"fields": "profile/general/overview/official_links"} + + r = requests.get(url, headers=headers, params=params) + + df = pd.DataFrame() + + if r.status_code == 200: + data = r.json()["data"] + df = pd.DataFrame(data["profile"]["general"]["overview"]["official_links"]) + df.columns = map(str.capitalize, df.columns) + return df + if r.status_code == 401: + print("[red]Invalid API Key[/red]\n") + else: + print(r.text) + return pd.DataFrame() + + +@log_start_end(log=logger) +def get_roadmap(symbol: str) -> pd.DataFrame: + """Returns coin roadmap + [Source: https://messari.io/] + + Parameters + ---------- + symbol : str + Crypto symbol to check roadmap + + Returns + ------- + pd.DataFrame + roadmap + """ + + url = base_url2 + f"assets/{symbol}/profile" + + headers = {"x-messari-api-key": cfg.API_MESSARI_KEY} + + params = {"fields": "profile/general/roadmap"} + + r = requests.get(url, headers=headers, params=params) + + df = pd.DataFrame() + + if r.status_code == 200: + data = r.json()["data"] + df = pd.DataFrame(data["profile"]["general"]["roadmap"]) + df["date"] = pd.to_datetime(df["date"]) + df.columns = map(str.capitalize, df.columns) + df = df.dropna(axis=1, how="all") elif r.status_code == 401: console.print("[red]Invalid API Key[/red]\n") else: console.print(r.text) return df + + +@log_start_end(log=logger) +def get_tokenomics( + symbol: str, coingecko_symbol: str +) -> Tuple[pd.DataFrame, pd.DataFrame]: + """Returns coin tokenomics + [Source: https://messari.io/] + + Parameters + ---------- + symbol : str + Crypto symbol to check tokenomics + Returns + ------- + pd.DataFrame + Metric Value tokenomics + pd.DataFrame + Circulating supply overtime + """ + + url = base_url2 + f"assets/{symbol}/profile" + + headers = {"x-messari-api-key": ""} + + params = {"fields": "profile/economics/consensus_and_emission"} + + r = requests.get(url, headers=headers, params=params) + + df = pd.DataFrame() + circ_df = pd.DataFrame() + if r.status_code == 200: + data = r.json()["data"] + tokenomics_data = data["profile"]["economics"]["consensus_and_emission"] + df = pd.DataFrame( + { + "Metric": [ + "Emission Type", + "Consensus Mechanism", + "Consensus Details", + "Mining Algorithm", + "Block Reward", + ], + "Value": [ + tokenomics_data["supply"]["general_emission_type"], + tokenomics_data["consensus"]["general_consensus_mechanism"], + tokenomics_data["consensus"]["consensus_details"], + tokenomics_data["consensus"]["mining_algorithm"], + tokenomics_data["consensus"]["block_reward"], + ], + } + ) + df["Value"] = df["Value"].str.replace("n/a", "-") + cg_df = get_coin_tokenomics(coingecko_symbol) + df = pd.concat([df, cg_df], ignore_index=True, sort=False) + df.fillna("-", inplace=True) + circ_df, _, _ = get_messari_timeseries( + coin=symbol, + timeseries_id="sply.circ", + interval="1d", + start="", + end="", + ) + elif r.status_code == 401: + console.print("[red]Invalid API Key[/red]\n") + else: + console.print(r.text) + + return df, circ_df + + +@log_start_end(log=logger) +def get_project_product_info( + symbol: str, +) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]: + """Returns coin product info + [Source: https://messari.io/] + + Parameters + ---------- + symbol : str + Crypto symbol to check product info + + Returns + ------- + pd.DataFrame + Metric, Value with project and technology details + pd.DataFrame + coin public repos + pd.DataFrame + coin audits + pd.DataFrame + coin known exploits/vulns + """ + + url = base_url2 + f"assets/{symbol}/profile" + + headers = {"x-messari-api-key": ""} + + params = {"fields": "profile/general/overview/project_details,profile/technology"} + + r = requests.get(url, headers=headers, params=params) + + df = pd.DataFrame() + if r.status_code == 200: + data = r.json()["data"] + project_details = data["profile"]["general"]["overview"]["project_details"] + technology_data = data["profile"]["technology"] + technology_details = technology_data["overview"]["technology_details"] + df_info = pd.DataFrame( + { + "Metric": ["Project Details", "Technology Details"], + "Value": [project_details, technology_details], + } + ) + df_repos = pd.DataFrame(technology_data["overview"]["client_repositories"]) + df_repos.columns = prettify_column_names(df_repos.columns) + df_repos.fillna("-", inplace=True) + df_audits = pd.DataFrame(technology_data["security"]["audits"]) + df_audits.columns = prettify_column_names(df_audits.columns) + if not df_audits.empty: + df_audits["Date"] = pd.to_datetime(df_audits["Date"]) + df_audits.fillna("-", inplace=True) + df_vulns = pd.DataFrame( + technology_data["security"]["known_exploits_and_vulnerabilities"] + ) + df_vulns.columns = prettify_column_names(df_vulns.columns) + if not df_vulns.empty: + df_vulns["Date"] = pd.to_datetime(df_vulns["Date"]) + df_vulns.fillna("-", inplace=True) + return df_info, df_repos, df_audits, df_vulns + if r.status_code == 401: + console.print("[red]Invalid API Key[/red]\n") + else: + console.print(r.text) + + return df, df, df, df + + +@log_start_end(log=logger) +def get_team(symbol: str) -> Tuple[pd.DataFrame, pd.DataFrame]: + """Returns coin team + [Source: https://messari.io/] + + Parameters + ---------- + symbol : str + Crypto symbol to check team + + Returns + ------- + pd.DataFrame + individuals + pd.DataFrame + organizations + """ + + url = base_url2 + f"assets/{symbol}/profile" + + headers = {"x-messari-api-key": cfg.API_MESSARI_KEY} + + params = {"fields": "profile/contributors"} + + r = requests.get(url, headers=headers, params=params) + + df = pd.DataFrame() + if r.status_code == 200: + data = r.json()["data"] + df_individual_contributors = pd.DataFrame( + data["profile"]["contributors"]["individuals"] + ) + if not df_individual_contributors.empty: + df_individual_contributors.fillna("-", inplace=True) + df_individual_contributors.insert( + 0, + "Name", + df_individual_contributors[["first_name", "last_name"]].apply( + lambda x: " ".join(x), axis=1 + ), + ) + df_individual_contributors.drop( + ["slug", "avatar_url", "first_name", "last_name"], + axis=1, + inplace=True, + errors="ignore", + ) + df_individual_contributors.columns = map( + str.capitalize, df_individual_contributors.columns + ) + df_individual_contributors.replace( + to_replace=[None], value="-", inplace=True + ) + df_organizations_contributors = pd.DataFrame( + data["profile"]["contributors"]["organizations"] + ) + if not df_organizations_contributors.empty: + df_organizations_contributors.drop( + ["slug", "logo"], axis=1, inplace=True, errors="ignore" + ) + df_organizations_contributors.columns = map( + str.capitalize, df_organizations_contributors.columns + ) + df_organizations_contributors.replace( + to_replace=[None], value="-", inplace=True + ) + return df_individual_contributors, df_organizations_contributors + if r.status_code == 401: + console.print("[red]Invalid API Key[/red]\n") + else: + console.print(r.text) + + return df, df + + +@log_start_end(log=logger) +def get_investors(symbol: str) -> Tuple[pd.DataFrame, pd.DataFrame]: + """Returns coin investors + [Source: https://messari.io/] + + Parameters + ---------- + symbol : str + Crypto symbol to check investors + + Returns + ------- + pd.DataFrame + individuals + pd.DataFrame + organizations + """ + + url = base_url2 + f"assets/{symbol}/profile" + + headers = {"x-messari-api-key": cfg.API_MESSARI_KEY} + + params = {"fields": "profile/investors"} + + r = requests.get(url, headers=headers, params=params) + + df = pd.DataFrame() + if r.status_code == 200: + data = r.json()["data"] + df_individual_investors = pd.DataFrame( + data["profile"]["investors"]["individuals"] + ) + if not df_individual_investors.empty: + df_individual_investors.fillna("-", inplace=True) + df_individual_investors.insert( + 0, + "Name", + df_individual_investors[["first_name", "last_name"]].apply( + lambda x: " ".join(x), axis=1 + ), + ) + df_individual_investors.drop( + ["slug", "avatar_url", "first_name", "last_name"], + axis=1, + inplace=True, + errors="ignore", + ) + df_individual_investors.columns = map( + str.capitalize, df_individual_investors.columns + ) + df_individual_investors.replace(to_replace=[None], value="-", inplace=True) + df_organizations_investors = pd.DataFrame( + data["profile"]["investors"]["organizations"] + ) + if not df_organizations_investors.empty: + df_organizations_investors.drop( + ["slug", "logo"], axis=1, inplace=True, errors="ignore" + ) + df_organizations_investors.columns = map( + str.capitalize, df_organizations_investors.columns + ) + df_organizations_investors.replace( + to_replace=[None], value="-", inplace=True + ) + return df_individual_investors, df_organizations_investors + if r.status_code == 401: + console.print("[red]Invalid API Key[/red]\n") + else: + console.print(r.text) + + return df, df + + +@log_start_end(log=logger) +def get_governance(symbol: str) -> Tuple[str, pd.DataFrame]: + """Returns coin governance + [Source: https://messari.io/] + + Parameters + ---------- + symbol : str + Crypto symbol to check governance + + Returns + ------- + str + governance summary + pd.DataFrame + Metric Value with governance details + """ + + url = base_url2 + f"assets/{symbol}/profile" + + headers = {"x-messari-api-key": cfg.API_MESSARI_KEY} + + params = {"fields": "profile/governance"} + + r = requests.get(url, headers=headers, params=params) + + df = pd.DataFrame() + if r.status_code == 200: + data = r.json()["data"] + governance_data = data["profile"]["governance"] + if ( + governance_data["onchain_governance"]["onchain_governance_type"] is not None + and governance_data["onchain_governance"]["onchain_governance_details"] + is not None + ): + return ( + re.sub("<[^>]*>", "", governance_data["governance_details"]), + pd.DataFrame( + { + "Metric": ["Type", "Details"], + "Value": [ + governance_data["onchain_governance"][ + "onchain_governance_type" + ], + governance_data["onchain_governance"][ + "onchain_governance_details" + ], + ], + } + ), + ) + return ( + re.sub("<[^>]*>", "", governance_data["governance_details"]), + df, + ) + if r.status_code == 401: + console.print("[red]Invalid API Key[/red]\n") + else: + console.print(r.text) + + return "", df + + +def format_addresses(x: Any): + final_str = "" + for address in x: + final_str += f"{address['name']}: {address['link']}" + return final_str + + +@log_start_end(log=logger) +def get_fundraising( + symbol: str, +) -> Tuple[str, pd.DataFrame, pd.DataFrame, pd.DataFrame]: + """Returns coin fundraising + [Source: https://messari.io/] + + Parameters + ---------- + symbol : str + Crypto symbol to check fundraising + + Returns + ------- + str + launch summary + pd.DataFrame + Sales rounds + pd.DataFrame + Treasury Accounts + pd.DataFrame + Metric Value launch details + """ + + url = base_url2 + f"assets/{symbol}/profile" + + headers = {"x-messari-api-key": cfg.API_MESSARI_KEY} + + params = {"fields": "profile/economics/launch"} + + r = requests.get(url, headers=headers, params=params) + + df = pd.DataFrame() + if r.status_code == 200: + data = r.json()["data"] + launch_data = data["profile"]["economics"]["launch"] + launch_details = launch_data["general"]["launch_details"] + launch_type = launch_data["general"]["launch_style"] + launch_fundraising_rounds = pd.DataFrame( + launch_data["fundraising"]["sales_rounds"] + ) + if not launch_fundraising_rounds.empty: + launch_fundraising_rounds.fillna("-", inplace=True) + launch_fundraising_rounds.drop( + [ + "details", + "asset_collected", + "price_per_token_in_asset", + "amount_collected_in_asset", + "is_kyc_required", + "restricted_jurisdictions", + ], + axis=1, + inplace=True, + errors="ignore", + ) + launch_fundraising_rounds.columns = [ + lambda_replace_underscores_in_column_names(val) + for val in launch_fundraising_rounds.columns + ] + launch_fundraising_rounds["Start Date"] = launch_fundraising_rounds.apply( + lambda x: x["Start Date"].split("T")[0], axis=1 + ) + launch_fundraising_rounds["End Date"] = launch_fundraising_rounds.apply( + lambda x: x["End Date"].split("T")[0], axis=1 + ) + launch_fundraising_rounds.rename( + columns={ + "Native Tokens Allocated": "Tokens Allocated", + "Equivalent Price Per Token In Usd": "Price [$]", + "Amount Collected In Usd": "Amount Collected [$]", + }, + inplace=True, + ) + launch_fundraising_rounds.fillna("-", inplace=True) + + launch_fundraising_accounts = pd.DataFrame( + launch_data["fundraising"]["sales_treasury_accounts"] + ) + if not launch_fundraising_accounts.empty: + launch_fundraising_accounts.columns = [ + lambda_replace_underscores_in_column_names(val) + for val in launch_fundraising_accounts.columns + ] + launch_fundraising_accounts.drop( + ["Asset Held", "Security"], inplace=True, axis=1 + ) + launch_fundraising_accounts["Addresses"] = launch_fundraising_accounts[ + "Addresses" + ].map(format_addresses) + launch_distribution = pd.DataFrame( + { + "Metric": [ + "Genesis Date", + "Type", + "Total Supply", + "Investors [%]", + "Organization/Founders [%]", + "Rewards/Airdrops [%]", + ], + "Value": [ + launch_data["initial_distribution"]["genesis_block_date"].split( + "T" + )[0] + if launch_data["initial_distribution"]["genesis_block_date"] + else "-", + launch_type, + lambda_long_number_format( + launch_data["initial_distribution"]["initial_supply"] + ), + launch_data["initial_distribution"]["initial_supply_repartition"][ + "allocated_to_investors_percentage" + ], + launch_data["initial_distribution"]["initial_supply_repartition"][ + "allocated_to_organization_or_founders_percentage" + ], + launch_data["initial_distribution"]["initial_supply_repartition"][ + "allocated_to_premined_rewards_or_airdrops_percentage" + ], + ], + } + ) + return ( + launch_details, + launch_fundraising_rounds, + launch_fundraising_accounts, + launch_distribution, + ) + if r.status_code == 401: + console.print("[red]Invalid API Key[/red]\n") + else: + console.print(r.text) + + return "", df, df, df diff --git a/openbb_terminal/cryptocurrency/due_diligence/messari_view.py b/openbb_terminal/cryptocurrency/due_diligence/messari_view.py index 7cf82f1570a..f60735f51b7 100644 --- a/openbb_terminal/cryptocurrency/due_diligence/messari_view.py +++ b/openbb_terminal/cryptocurrency/due_diligence/messari_view.py @@ -1,22 +1,172 @@ +"""Messari view""" +__docformat__ = "numpy" + +# pylint: disable=C0201 + import logging import os from typing import List, Optional - +import pandas as pd +import numpy as np from matplotlib import pyplot as plt +from matplotlib import ticker +from matplotlib import dates as mdates from openbb_terminal.config_terminal import theme +from openbb_terminal import feature_flags as obbff +from openbb_terminal.cryptocurrency import cryptocurrency_helpers from openbb_terminal.decorators import check_api_key from openbb_terminal import config_plot as cfgPlot from openbb_terminal.cryptocurrency.due_diligence.messari_model import ( + get_available_timeseries, + get_fundraising, + get_governance, + get_investors, + get_links, get_marketcap_dominance, + get_messari_timeseries, + get_project_product_info, + get_roadmap, + get_team, + get_tokenomics, ) from openbb_terminal.decorators import log_start_end -from openbb_terminal.helper_funcs import export_data, plot_autoscale +from openbb_terminal.helper_funcs import ( + export_data, + lambda_long_number_format, + plot_autoscale, + print_rich_table, +) from openbb_terminal.rich_config import console +from openbb_terminal.cryptocurrency.dataframe_helpers import prettify_paragraph logger = logging.getLogger(__name__) +@log_start_end(log=logger) +@check_api_key(["API_MESSARI_KEY"]) +def display_messari_timeseries_list( + limit: int = 10, + query: str = "", + only_free: bool = True, + export: str = "", +) -> None: + """Display messari timeseries list + [Source: https://messari.io/] + + Parameters + ---------- + limit : int + number to show + query : str + Query to search across all messari timeseries + only_free : bool + Display only timeseries available for free + export : str + Export dataframe data to csv,json,xlsx file + """ + + df = get_available_timeseries() + if not df.empty: + if only_free: + df = df.drop(df[df["Requires Paid Key"]].index) + if query: + mask = np.column_stack( + [ + df[col].str.contains(query, na=False, regex=False, case=False) + for col in ["Title", "Description"] + ] + ) + df = df.loc[mask.any(axis=1)] + if df.empty: + console.print(f"\nNo timeseries found with query {query}\n") + else: + print_rich_table( + df.head(limit), + index_name="ID", + headers=list(df.columns), + show_index=True, + title="Messari Timeseries", + ) + + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "mt", + df, + ) + else: + console.print("\nUnable to retrieve data from Messari.\n") + + +@log_start_end(log=logger) +@check_api_key(["API_MESSARI_KEY"]) +def display_messari_timeseries( + coin: str, + timeseries_id: str, + start: str, + end: str, + interval: str, + export: str = "", + external_axes: Optional[List[plt.Axes]] = None, +) -> None: + """Display messari timeseries + [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, title, _ = get_messari_timeseries( + coin=coin, timeseries_id=timeseries_id, start=start, end=end, interval=interval + ) + + if not df.empty: + # 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.get_yaxis().set_major_formatter( + ticker.FuncFormatter(lambda x, _: lambda_long_number_format(x)) + ) + + ax.plot(df.index, df["values"]) + + ax.set_title(f"{coin}'s {title}") + ax.set_ylabel(title) + 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__)), + "mt", + df, + ) + + @log_start_end(log=logger) @check_api_key(["API_MESSARI_KEY"]) def display_marketcap_dominance( @@ -48,33 +198,555 @@ def display_marketcap_dominance( df = get_marketcap_dominance(coin=coin, start=start, end=end, interval=interval) - if df.empty: - return + if not df.empty: - # This plot has 1 axis - if not external_axes: - _, ax = plt.subplots(figsize=plot_autoscale(), dpi=cfgPlot.PLOT_DPI) + # 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["values"]) + + 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, + ) + + +@log_start_end(log=logger) +@check_api_key(["API_MESSARI_KEY"]) +def display_links(coin: str, export: str = "") -> None: + """Display coin links + [Source: https://messari.io/] + + Parameters + ---------- + coin : str + Crypto symbol to check links + 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_links(coin) + if not df.empty: + print_rich_table( + df, + headers=list(df.columns), + show_index=False, + title=f"{coin} Links", + ) + + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "links", + df, + ) 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 + console.print("\nUnable to retrieve data from Messari.\n") - 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]) +@log_start_end(log=logger) +@check_api_key(["API_MESSARI_KEY"]) +def display_roadmap( + coin: str, + descend: bool, + limit: int, + export: str = "", + external_axes: Optional[List[plt.Axes]] = None, +) -> None: + """Display coin roadmap + [Source: https://messari.io/] - theme.style_primary_axis(ax) + Parameters + ---------- + coin : str + Crypto symbol to check roadmap + descend: bool + reverse order + limit : int + number to show + 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_roadmap(coin) - if not external_axes: - theme.visualize_output() + if not df.empty: + df["Date"] = df["Date"].dt.date + show_df = df + show_df = show_df.sort_values(by="Date", ascending=descend) + show_df.fillna("Unknown", inplace=True) + print_rich_table( + show_df.head(limit), + headers=list(show_df.columns), + show_index=False, + title=f"{coin} Roadmap", + ) + df_prices, _ = cryptocurrency_helpers.load_yf_data( + symbol=coin, + currency="USD", + days=4380, + interval="1d", + ) + if not df_prices.empty: + 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 + + roadmap_dates = np.array( + pd.to_datetime(df["Date"], format="%Y-%m-%d", errors="coerce") + ) + + df_copy = df + df_copy["Date"] = pd.to_datetime( + df_copy["Date"], format="%Y-%m-%d", errors="coerce" + ) + + df_copy = df_copy[df_copy["Date"].notnull()] + titles = list(df_copy[df_copy["Date"] > df_prices.index[0]]["Title"]) + + roadmap_dates = mdates.date2num(roadmap_dates) + counter = 0 + max_price = df_prices["Close"].max() + for x in roadmap_dates: + if x > mdates.date2num(df_prices.index[0]): + ax.text( + x, + max_price * 0.7, + titles[counter], + rotation=-90, + verticalalignment="center", + size=6, + ) + counter += 1 + ax.vlines( + x=roadmap_dates, + color="orange", + ymin=0, + ymax=max_price, + ) + ax.plot(df_prices.index, df_prices["Close"].values) + ax.get_yaxis().set_major_formatter( + ticker.FuncFormatter(lambda x, _: lambda_long_number_format(x)) + ) + ax.set_title(f"{coin.upper()} Price and Roadmap") + ax.set_ylabel("Price [$]") + ax.set_xlim(df_prices.index[0], df_prices.index[-1]) + theme.style_primary_axis(ax) + + if not external_axes: + theme.visualize_output() + + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "rm", + df, + ) + else: + console.print("\nUnable to retrieve data from Messari.\n") + + +@log_start_end(log=logger) +@check_api_key(["API_MESSARI_KEY"]) +def display_tokenomics( + coin: str, + coingecko_symbol: str, + export: str = "", + external_axes: Optional[List[plt.Axes]] = None, +) -> None: + """Display coin tokenomics + [Source: https://messari.io/] + + Parameters + ---------- + coin : str + Crypto symbol to check tokenomics + coingecko_symbol : str + Coingecko crypto symbol to check tokenomics + 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, circ_df = get_tokenomics(coin, coingecko_symbol) + + if not df.empty and not circ_df.empty: + df = df.applymap(lambda x: lambda_long_number_format(x, 2)) + print_rich_table( + df, + headers=list(df.columns), + show_index=False, + title=f"{coin} Tokenomics", + ) + if not external_axes: + _, ax = plt.subplots(figsize=plot_autoscale(), dpi=cfgPlot.PLOT_DPI) + ax2 = ax.twinx() + 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, ax2) = external_axes + df_prices, _ = cryptocurrency_helpers.load_yf_data( + symbol=coin, + currency="USD", + days=4380, + interval="1d", + ) + merged_df = pd.concat([circ_df, df_prices], axis=1) + + color_palette = theme.get_colors() + ax.plot( + merged_df.index, + merged_df["values"], + color=color_palette[0], + label="Circ Supply", + ) + ax.plot(np.nan, label="Price", color=color_palette[1]) + if not df_prices.empty: + ax2.plot(merged_df.index, merged_df["Close"], color=color_palette[1]) + ax2.get_yaxis().set_major_formatter( + ticker.FuncFormatter(lambda x, _: lambda_long_number_format(x)) + ) + ax2.set_ylabel(f"{coin} price [$]") + theme.style_twin_axis(ax2) + ax2.yaxis.set_label_position("right") + ax.legend() + ax.get_yaxis().set_major_formatter( + ticker.FuncFormatter(lambda x, _: lambda_long_number_format(x)) + ) + ax.set_title(f"{coin} circulating supply over time") + ax.set_ylabel("Number of tokens") + ax.set_xlim(merged_df.index[0], merged_df.index[-1]) + theme.style_primary_axis(ax) + ax.yaxis.set_label_position("left") + ax.legend() + if not external_axes: + theme.visualize_output() + + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "tk", + df, + ) + else: + console.print("\nUnable to retrieve data from Messari.\n") + + +@log_start_end(log=logger) +@check_api_key(["API_MESSARI_KEY"]) +def display_project_info( + coin: str, + export: str = "", +) -> None: + """Display project info + [Source: https://messari.io/] + + Parameters + ---------- + coin : str + Crypto symbol to check project info + export : str + Export dataframe data to csv,json,xlsx file + """ + (df_info, df_repos, df_audits, df_vulns) = get_project_product_info(coin) + + if not df_info.empty: + print_rich_table( + df_info, + headers=list(df_info.columns), + show_index=False, + title=f"{coin} General Info", + ) + else: + console.print("\nGeneral info not found\n") + if not df_repos.empty: + print_rich_table( + df_repos, + headers=list(df_repos.columns), + show_index=False, + title=f"{coin} Public Repositories", + ) + else: + console.print("\nPublic repositories not found\n") + if not df_audits.empty: + print_rich_table( + df_audits, + headers=list(df_audits.columns), + show_index=False, + title=f"{coin} Audits", + ) + else: + console.print("\nAudits not found\n") + if not df_vulns.empty: + print_rich_table( + df_vulns, + headers=list(df_vulns.columns), + show_index=False, + title=f"{coin} Vulnerabilities", + ) + else: + console.print("\nVulnerabilities not found\n") export_data( export, os.path.dirname(os.path.abspath(__file__)), - "mcapdom", - df, + "pi", + df_info, + ) + + +@log_start_end(log=logger) +@check_api_key(["API_MESSARI_KEY"]) +def display_investors( + coin: str, + export: str = "", +) -> None: + """Display coin investors + [Source: https://messari.io/] + + Parameters + ---------- + coin : str + Crypto symbol to check coin investors + export : str + Export dataframe data to csv,json,xlsx file + """ + (df_individuals, df_organizations) = get_investors(coin) + if not df_individuals.empty or not df_organizations.empty: + if not df_individuals.empty: + print_rich_table( + df_individuals, + headers=list(df_individuals.columns), + show_index=False, + title=f"{coin} Investors - Individuals", + ) + else: + console.print("\nIndividual investors not found\n") + if not df_organizations.empty: + print_rich_table( + df_organizations, + headers=list(df_organizations.columns), + show_index=False, + title=f"{coin} Investors - Organizations", + ) + else: + console.print("\nInvestors - Organizations not found\n") + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "inv", + df_individuals, + ) + else: + console.print("\nInvestors not found\n") + + +@log_start_end(log=logger) +@check_api_key(["API_MESSARI_KEY"]) +def display_team( + coin: str, + export: str = "", +) -> None: + """Display coin team + [Source: https://messari.io/] + + Parameters + ---------- + coin : str + Crypto symbol to check coin team + export : str + Export dataframe data to csv,json,xlsx file + """ + (df_individuals, df_organizations) = get_team(coin) + if not df_individuals.empty or not df_organizations.empty: + if not df_individuals.empty: + print_rich_table( + df_individuals, + headers=list(df_individuals.columns), + show_index=False, + title=f"{coin} Team - Individuals", + ) + else: + console.print("\nIndividual team members not found\n") + if not df_organizations.empty: + print_rich_table( + df_organizations, + headers=list(df_organizations.columns), + show_index=False, + title=f"{coin} Team - Organizations", + ) + else: + console.print("\nTeam organizations not found\n") + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "team", + df_individuals, + ) + else: + console.print("\nTeam not found\n") + + +@log_start_end(log=logger) +@check_api_key(["API_MESSARI_KEY"]) +def display_governance( + coin: str, + export: str = "", +) -> None: + """Display coin governance + [Source: https://messari.io/] + + Parameters + ---------- + coin : str + Crypto symbol to check coin governance + export : str + Export dataframe data to csv,json,xlsx file + """ + (summary, df) = get_governance(coin) + if summary: + summary = prettify_paragraph(summary) + console.print(summary, "\n") + if not df.empty: + print_rich_table( + df, + headers=list(df.columns), + show_index=False, + title=f"{coin} Governance details", + ) + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "gov", + df, + ) + else: + console.print(f"\n{coin} governance details not found\n") + + +@log_start_end(log=logger) +@check_api_key(["API_MESSARI_KEY"]) +def display_fundraising( + coin: str, + export: str = "", +) -> None: + """Display coin fundraising + [Source: https://messari.io/] + + Parameters + ---------- + coin : str + Crypto symbol to check coin fundraising + export : str + Export dataframe data to csv,json,xlsx file + """ + (summary, df_sales_rounds, df_treasury_accs, df_details) = get_fundraising(coin) + if summary: + summary = prettify_paragraph(summary) + console.print(summary, "\n") + if not df_sales_rounds.empty: + df_sales_rounds = df_sales_rounds.applymap( + lambda x: lambda_long_number_format(x, 2) + ) + print_rich_table( + df_sales_rounds, + headers=list(df_sales_rounds.columns), + show_index=False, + title=f"{coin} Sales Rounds", + ) + else: + console.print("\nSales rounds not found\n") + if not df_treasury_accs.empty: + print_rich_table( + df_treasury_accs, + headers=list(df_treasury_accs.columns), + show_index=False, + title=f"{coin} Treasury Accounts", + ) + else: + console.print("\nTreasury accounts not found\n") + + if not df_details.empty: + values = [] + labels = [] + investors = df_details.loc[df_details["Metric"] == "Investors [%]"][ + "Value" + ].item() + founders = df_details.loc[df_details["Metric"] == "Organization/Founders [%]"][ + "Value" + ].item() + airdrops = ( + df_details.loc[df_details["Metric"] == "Rewards/Airdrops [%]"][ + "Value" + ].item(), + ) + if isinstance(investors, (int, float)) and investors > 0: + values.append(investors) + labels.append("Investors") + if isinstance(founders, (int, float)) and founders > 0: + values.append(founders) + labels.append("Organization/Founders") + if isinstance(airdrops[0], (int, float)) and airdrops[0] > 0: + values.append(airdrops[0]) + labels.append("Rewards/Airdrops") + if len(values) > 0 and sum(values) > 0: + _, ax = plt.subplots(figsize=plot_autoscale(), dpi=cfgPlot.PLOT_DPI) + ax.pie( + [s / 100 for s in values], + normalize=False, + labels=labels, + wedgeprops={"linewidth": 0.5, "edgecolor": "white"}, + labeldistance=1.05, + autopct="%1.0f%%", + startangle=90, + colors=theme.get_colors()[1:4], + ) + ax.set_title(f"{coin} Fundraising Distribution") + if obbff.USE_ION: + plt.ion() + plt.show() + + df_details.fillna("-", inplace=True) + + print_rich_table( + df_details, + headers=list(df_details.columns), + show_index=False, + title=f"{coin} Fundraising Details", + ) + else: + console.print("\nFundraising details not found\n") + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "fr", + df_details, ) diff --git a/openbb_terminal/cryptocurrency/due_diligence/pycoingecko_model.py b/openbb_terminal/cryptocurrency/due_diligence/pycoingecko_model.py index 8efadfb77fc..40b7fd1cf21 100644 --- a/openbb_terminal/cryptocurrency/due_diligence/pycoingecko_model.py +++ b/openbb_terminal/cryptocurrency/due_diligence/pycoingecko_model.py @@ -233,6 +233,39 @@ def get_coin_market_chart( return df +@log_start_end(log=logger) +def get_coin_tokenomics(symbol: str = "") -> pd.DataFrame: + """Get tokenomics for given coin. [Source: CoinGecko] + + Parameters + ---------- + symbol: str + coin symbol to check tokenomics + + Returns + ------- + pandas.DataFrame + Metric, Value with tokenomics + """ + client = CoinGeckoAPI() + coin_data = client.get_coin_by_id(symbol) + block_time = coin_data["block_time_in_minutes"] + total_supply = coin_data["market_data"]["total_supply"] + max_supply = coin_data["market_data"]["max_supply"] + circulating_supply = coin_data["market_data"]["circulating_supply"] + return pd.DataFrame( + { + "Metric": [ + "Block time [min]", + "Total Supply", + "Max Supply", + "Circulating Supply", + ], + "Value": [block_time, total_supply, max_supply, circulating_supply], + } + ) + + class Coin: """Coin class, it holds loaded coin""" diff --git a/scripts/test_crypto_dd.openbb b/scripts/test_crypto_dd.openbb index db9c3873d6c..d823cb822df 100644 --- a/scripts/test_crypto_dd.openbb +++ b/scripts/test_crypto_dd.openbb @@ -12,6 +12,15 @@ score dev bc mcapdom +mt --list +rm +tk +pi +team +inv +gov +fr +links gh news exit diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_available_timeseries.yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_available_timeseries.yaml new file mode 100644 index 00000000000..5f6cbff09fd --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_available_timeseries.yaml @@ -0,0 +1,257 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://data.messari.io/api/v1/assets/metrics + response: + body: + string: !!binary | + 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 + WznQAvcBAA== + headers: + content-encoding: + - gzip + content-type: + - application/json; charset=UTF-8 + date: + - Sun, 01 May 2022 18:24:57 GMT + transfer-encoding: + - chunked + vary: + - Accept-Encoding,Origin + x-ratelimit-limit: + - '4000' + x-ratelimit-remaining: + - '3997' + x-ratelimit-reset: + - '1651511281' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[aave].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[aave].yaml new file mode 100644 index 00000000000..086cbd36aae --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[aave].yaml @@ -0,0 +1,438 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api.coingecko.com/api/v3/coins/aave/ + response: + body: + string: !!binary | + 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 + 7z///wAAAP//AwAoRM8H8KkBAA== + headers: + Access-Control-Allow-Headers: + - Origin, X-Requested-With, Content-Type, Accept, Authorization + Access-Control-Allow-Methods: + - POST, PUT, DELETE, GET, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - link, per-page, total + Access-Control-Request-Method: + - '*' + Alternate-Protocol: + - 443:npn-spdy/2 + CF-Cache-Status: + - MISS + CF-RAY: + - 704a8e9aca1a94e6-LIS + Cache-Control: + - max-age=30, public, must-revalidate, s-maxage=30 + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 01 May 2022 18:24:58 GMT + ETag: + - W/"420ee7a914a9e140ba25103fbeedda45" + Expect-CT: + - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" + Server: + - cloudflare + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding, Origin + X-Request-Id: + - 3999bbb2-b3a4-4023-a265-03b8814ef8cd + X-Runtime: + - '0.034607' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[btc].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[btc].yaml new file mode 100644 index 00000000000..cf1bf239398 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[btc].yaml @@ -0,0 +1,58 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api.coingecko.com/api/v3/coins/btc/ + response: + body: + string: !!binary | + H4sIAKsTaGIAA6pWSi0qyi9SslJyzi/NSVHIyy9RSMvMS1FIzs/MUyjPLMlQKMlIVUjPLEvNU8hM + UaoFAAAA//8DAPO8ZzAxAAAA + headers: + Access-Control-Allow-Headers: + - Origin, X-Requested-With, Content-Type, Accept, Authorization + Access-Control-Allow-Methods: + - POST, PUT, DELETE, GET, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - link, per-page, total + Access-Control-Request-Method: + - '*' + CF-Cache-Status: + - MISS + CF-RAY: + - 7020728d4f3a03ea-LIS + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 26 Apr 2022 15:45:47 GMT + Expect-CT: + - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" + Server: + - cloudflare + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding, Origin + X-Request-Id: + - da9683fe-744d-476d-9df5-97096be984f5 + X-Runtime: + - '0.007656' + status: + code: 404 + message: Not Found +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[eth].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[eth].yaml new file mode 100644 index 00000000000..090530cb6b9 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_coin_tokenomics[eth].yaml @@ -0,0 +1,58 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api.coingecko.com/api/v3/coins/eth/ + response: + body: + string: !!binary | + H4sIAOMTaGIAA6pWSi0qyi9SslJyzi/NSVHIyy9RSMvMS1FIzs/MUyjPLMlQKMlIVUjPLEvNU8hM + UaoFAAAA//8DAPO8ZzAxAAAA + headers: + Access-Control-Allow-Headers: + - Origin, X-Requested-With, Content-Type, Accept, Authorization + Access-Control-Allow-Methods: + - POST, PUT, DELETE, GET, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - link, per-page, total + Access-Control-Request-Method: + - '*' + CF-Cache-Status: + - MISS + CF-RAY: + - 702073edad049501-LIS + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 26 Apr 2022 15:46:43 GMT + Expect-CT: + - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" + Server: + - cloudflare + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding, Origin + X-Request-Id: + - 2245a258-1311-4569-bf2d-9784a424a4f7 + X-Runtime: + - '0.009163' + status: + code: 404 + message: Not Found +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_fundraising[eth].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_fundraising[eth].yaml new file mode 100644 index 00000000000..5253fc40f60 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_fundraising[eth].yaml @@ -0,0 +1,60 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + x-messari-api-key: + - mock_x-messari-api-key + method: GET + uri: https://data.messari.io/api/v2/assets/eth/profile?fields=profile%2Feconomics%2Flaunch + response: + body: + string: !!binary | + H4sIAAAAAAAA/4RV247bOBL9lQKxC2QBtUxJ7UsL2Iekkd1gX7JA/JTpQKDFssQ0RWqKlA1P0EB+ + Y4CZn8uXDEhZsp0EGD9ZJOvU4alTxS/MeeEHx8ovDLXoHUpWrhLmVYfOi65nJct5nt/x5R3Pttmm + zO/L5SZ9WHL+sMnz1Uf2kjApvAgIPdm90hjBamtsp+qIrMVg6jb8a9AgCX1ZrJw/hQj2SPYondDI + kmlLohdKO1ayt75FwqH79vV3B5ZUo4zQ4O0zGpDKeVK7wStrAA9ofAKdMKJBCbsT+BbhaeC8qAW0 + hPt/P7HW+96Vi0WHzglSqbIL4Rz6BZ7TPLEYgVNa+I8djBQhwwi1EOOBBJzVEsgOTatPsOLQKa0j + kRDq4NWG/xPsPrJQRnklNKzz+dTb7TtwQ9/r07/A23iqH3Za1SlsW4QgB3hrn6HXokbYoT8iGvjf + oE+Q5wnkPLtPQBgJH7D32O2QgJ/XU3hnj3hASiJuvAv0A9WtcKM09SQ5KHNA5y05OCIhGOthcGKn + ESyBJ2HcHil+73BvCSPiWKXpdv9Fg045eKNt/Qz2TLLIIpnleJ+eVI0hIKoDR+EmUfQJHPqggQgF + re1gPMpLQM45j2r1SPBm+wiD8UrD66EZnAe+jFkekomeVgYF6RNIrLUyyjQj9D76hoSPoFlRrK9B + EyAUdYsy0D9D55tJzSdTJGvOY/aoEgkVhFQm3n+vyHnIcmjtQG5SJar7ZN4fkCBfJvzv4nM4Ij67 + kG02QPT0EDUSWtsjyktBb80ZLhlRwYaERTYlTAB/HdRBaDRR5H9km7SYXBiSjekIOzGqld169FX+ + o40n38a7BGK1CCU72/iKVLDnWI2Zcm3N2LOWXArvR+DRFO5M8RakfDIz359kFKCtae48UgdopD12 + aPyTWd2GzJMCJYjOmgY2S5B4QG370KzH1l6Yje4L9h+5zM3yAxOJTjUmYDoQ8O3rHzPk3G7Qk21I + dN++/gnHVtUtNOJwVcIrEiEXqaaNIszxozbCX/Vs7A2Xhvm7H4wMdVemCZM1bLuKgniOlb98YV75 + OGO3cWB+GIes84J8JYXHOOOz+zu+vsvzbbYqOS85/8gS5k992P1/nEksYfNENoPWCUMjbwEe7vgt + gBFeHbCKk9pVc81YuVyvePwlLM7eqrZaYx332JvtI0tYvGDVI43hlTJVPMpKnnLOl+s8XyfsYuzq + JwGDk+F4kSVMdGGoXPJc4RXZOl+mD9nmPl+uHn5+NCJlm+JMWrnq+VRXFNJTID0qQhgsFmM+D6Sc + VHWwbyjDp5dPybk00tZDcOhYHSO6WBykzsVmebRGqjEsYVqZZ1bOb9YRd6mgulUHTC014XsRtOfr + vMizfM0fFvPR4zGdXrR4tpd7t4hpXht5SfJ+v23np+48xoNH0l7u2YW0JxRuoFMl6jie450SNi/3 + Vqta4Xm5J/t51G5wWNl9NYL0ZGtEOeqRsPMsqa7f8ODgaX2cMaxc55wXqw1P8/vku82KsBfk1RQ6 + e6zytprfteCKGo0XDbJyU6T36+T2pKVGGPVbHDaVpWofuge/C8xW6bL4LrAn7JRBWREeBUkXgoUi + Sba/DQ4GeUnYaM3rC59baDRQM+pf7cIzetVcy9CdBd/yzdRcL/H3VwAAAP//GKVTisEJAAA= + headers: + content-encoding: + - gzip + content-length: + - '1250' + content-type: + - application/json; charset=UTF-8 + date: + - Sun, 01 May 2022 18:24:58 GMT + vary: + - Accept-Encoding,Origin + x-ratelimit-limit: + - '4000' + x-ratelimit-remaining: + - '3996' + x-ratelimit-reset: + - '1651511281' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_governance[eth].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_governance[eth].yaml new file mode 100644 index 00000000000..be7b9a4557c --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_governance[eth].yaml @@ -0,0 +1,57 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + x-messari-api-key: + - mock_x-messari-api-key + method: GET + uri: https://data.messari.io/api/v2/assets/eth/profile?fields=profile%2Fgovernance + response: + body: + string: !!binary | + H4sIAAAAAAAA/3RWXW/bVgz9K4Re2gKyFLttmhjYw/qBNsCwFlixAWuKgJIoic3VpXBJ2fOK/Pfh + Xjm2k3ZvkUQefp1z4u+ZGtqk2fp7Rg5HpSZbv8wz44HUcBizdbY6W60WZy8XZ8vPy4v16sX65WVx + 8fz56vLixfnq7+wuzxo0jAhjkJYdxT872VDw6OtHTzcNGbLTbJ29s54CTQPISAGNFJQHdhjcDkzg + NVst7MH6IFPXg7Ttou6RfQ7sWwkDOjjiFnAVQ1lhkIZcDg1tyEVkhRo96FQNbDAGManFwTR2ARvS + HJqpqqiB6+ns7HmN0Adqf7nOerNR12U5kCoGLlhKDMa1o5L2fS94GINsaCBvizHIKIpuQTxeZwmM + DgNeHQPh0z5Q4em7q0/6bK5b4pySg3i4z3uicTV+oTKFmuA924epgkCjKJuEXQFvJNAh/HRk68lD + w1pPquBpC/f9aQ5bth6wadhYPDpgP04GbZAhpgH9Y+QbaqCWYZg8266AqxZwTDM0UO0AYcBvEth2 + sBGjHOrYx0n5gUJHCa3u0XekwN4kvahQCWppqIDPArgRTpVGxzXGhhRGUVskhBy8NLTnh0TcSQ2m + sUFL6BygdkzeFPboLvLIQKW1LQYqsjwTn1hz85CRP769sd1I2Tr7XeCjX7yJX+H9MednQCdk/qtn + d3oKIQUvBj1uCNBH9nLN6ED8zOIT7t5Tlm3Om3OgZ41Xnu+VpLARY98V8LmP4wciYK8WIRQcq8Xr + kJMtYIh3xGF0pCAtOBElt4NaptHRKdj62i/gy9tfPx4Ykk6qX5/eK6BBiR6hRcfWT1VUwoFMRW+D + e5YgYk8R5g2GSnzEmCHWZblZFvXhbVHLUB5T3l19guXFeXn+4rI8P7/8WfqPudf+twcDNacTgRo7 + B7VIaNgnX4nM2J8qbiM+HqY9sZVqMhiTynnESKq9acxMS2s5nG8vI8K6T19gS9z1NusjFjAxdICD + TN5i0eQa0JPbR6BFDQZSLeAt6ci2F4yEQC5JASqyLdFhsLkEoG/A5Ja8JrgcJo2aayQR7r7nOQCd + +E65oQdDRIRIkcTWNmp3n/mN6pgK6HfQcIhPLUeORuZWU2jIF/CBfE35LLdHZ3BYkYOON+RnRbKC + 2s5R3MAJ4asd/MmGjm/h9WQU2Bfxqv8rn90DNp8eGxUQqomdLdiDwx2FxfJo8y2hTYHgaaCWQqAm + TadgcZM/FcSzIrYEnmwr4VZhYB+3S77DLuoN8HHyvpMxSE2qsE3WS0ZhYJ/O1s+3N9m74eyDTupb + 6DAqd2BL8/9B0QvCkazsH+/picKXykmXXPIo0s0cVdRYduQpoCtXZ8tX5XJVLl+Ve99IYo3/YFLt + xy6U5RnrjQVCncLupqGavAV0/G/8TdCiU7rLsy5EZWTrL1/v7u7u/gsAAP//HQ1/1D8IAAA= + headers: + content-encoding: + - gzip + content-length: + - '1079' + content-type: + - application/json; charset=UTF-8 + date: + - Sun, 01 May 2022 18:24:59 GMT + vary: + - Accept-Encoding,Origin + x-ratelimit-limit: + - '4000' + x-ratelimit-remaining: + - '3995' + x-ratelimit-reset: + - '1651511281' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_investors[eth].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_investors[eth].yaml new file mode 100644 index 00000000000..7b4221a2620 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_investors[eth].yaml @@ -0,0 +1,132 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + x-messari-api-key: + - mock_x-messari-api-key + method: GET + uri: https://data.messari.io/api/v2/assets/eth/profile?fields=profile%2Finvestors + response: + body: + string: !!binary | + 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 + headers: + content-encoding: + - gzip + content-type: + - application/json; charset=UTF-8 + date: + - Sun, 01 May 2022 18:25:00 GMT + transfer-encoding: + - chunked + vary: + - Accept-Encoding,Origin + x-ratelimit-limit: + - '4000' + x-ratelimit-remaining: + - '3994' + x-ratelimit-reset: + - '1651511281' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_links[eth].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_links[eth].yaml new file mode 100644 index 00000000000..066cddc8a1f --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_links[eth].yaml @@ -0,0 +1,43 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + x-messari-api-key: + - mock_x-messari-api-key + method: GET + uri: https://data.messari.io/api/v2/assets/eth/profile?fields=profile%2Fgeneral%2Foverview%2Fofficial_links + response: + body: + string: !!binary | + H4sIAAAAAAAA/4SQwWrzMBCEX+Vnz46l+Meh0bGXXksJhLaUosRre6lsCWkTUULevVgpxqlT6oMZ + NPpmtHuCwJoPAdQJ0GgXsAJVZsDUYWDdOVBQyKJYyHIhl5vlnSpKJYt8JVfL9bqU/1/gnEGlWQ8J + ztuaDA6ywR69NoO0R/RHwph0XdOetHk31H8EUK8n6HWHoGDbEqPTDj1kMLigoGV2QQmB3KLHQ5db + 3wjsRRzvCjhnY8QDcXvYzfEmned7241JU2yLu0CMcy7GmF9VT6lNJOZbj+WL8WvdE1YV8e02n7yE + +hG+qn1GY2z89/jHor5HJis+E3BZVvrnrqqniffGNvOknbHNz+HfzsP3FQAA//8dmVmGMwIAAA== + headers: + content-encoding: + - gzip + content-length: + - '283' + content-type: + - application/json; charset=UTF-8 + date: + - Sun, 01 May 2022 18:25:02 GMT + vary: + - Accept-Encoding,Origin + x-ratelimit-limit: + - '4000' + x-ratelimit-remaining: + - '3992' + x-ratelimit-reset: + - '1651511281' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_marketcap_dominance[BTC-1d-2022-01-10-2022-03-08].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_marketcap_dominance[BTC-1d-2022-01-10-2022-03-08].yaml deleted file mode 100644 index 810ebc29ee2..00000000000 --- a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_marketcap_dominance[BTC-1d-2022-01-10-2022-03-08].yaml +++ /dev/null @@ -1,71 +0,0 @@ -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 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_marketcap_dominance[btc-1d-2022-01-10-2022-03-08].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_marketcap_dominance[btc-1d-2022-01-10-2022-03-08].yaml new file mode 100644 index 00000000000..85c861ef482 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_marketcap_dominance[btc-1d-2022-01-10-2022-03-08].yaml @@ -0,0 +1,61 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + 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/3RVTY/byBX8K0RfkgAc+X33e7ompwS5TS5rGAMuxfUwHn2ApNYxjPnvATVskgmw + gg6Cuvi6qrqq+TONUzPdx3T8mbq35jZ2p3QkhDpN/bkbp+Z8S8dEQPQE+gT4jH4kOaodXIMImPiX + 9F6nUzM184xbMzTnbuqGx8RmHLvp5Vv3Ix3Tr1Ob6uWf/pSOCTtGQm+eOpHuScj1yQnaJyenrqN5 + uKZ65jdMKwd8QngGOD6+v6Q6dZfTushP4P+z2F+mbvi9eZt3O6U6XYdTN6Rjasa2u5z6y9dUp9+u + w7mZN/j3eL2kne6XdeV+6f/zdO7f3vqxa6+X05jq1F7f7ufLmI6fd07V6dwM37qpbW4vp+u5vzSX + tktf3us0tq/d+eHQuZuGvv2w4Nw2t8Ppek51ujTnLh3TP8vz1d/W5+t06sZ26G9Tf72kY3p+7ap1 + n2rdp+rHanrtqofFfxqrWze03WVqvnbV+NoMXXX9rZquU/NWtcOP23St2n5o72/N1F++bvNSnX5v + 3u7d+LJR3kfhufyu+ku196Qa+5nEzKC7XdvX6s9Y/b253JvhR4WRoSoHU/3r+a9/+QOr/ljcpmaO + 27m/9Of7+eX/D3i83oe2e2mmaeh/vX/49flnMfcfTf/tmup0H+YHXqfpNh4/ffr+/fvh27xyaK/n + T+l9Pq4PC9Lx82c0wZzJYf7UHAc3DGRFQCVy+VI/IHMbPiACB1HirJqNJQstiBC13RB2IBM157wg + 5jLBihABB4WcLbPnBYHosiFCmZksQ4C5LRAC2bgS5zCHjA4kUhCBtCLAjRxVjMW0EOGcC1U/eBiD + 5cyMbr4gxGSjSoLoLjobVQwhVdioOoUIubsZQxFjbL5aBuTg7llNhXRBZOLNVBbH0GwuHGWEQ9gK + yNnUKVjYDHLxwxcE1IIHRhVF5JlqkRJOss4IJIkMJO4Y+IFgMPd1RISKzqeipFYQqEobwpwZXDxH + xuI6k6CtEPdgBnQ0CpdFLvOSMqiFDooaiIrEpIqLGhYUWSHsmE1MEFAoFoQC+IogAbY5N2rMK8Iz + 7Wa4ABqguTMvCMtsKwI1IABFPaMVqks+PtRk0BxmHAScywwvEZkREuaaOcyDYUkZR9H7QBiDIGTH + oDUAAhgbVXIPMmYP10WLIOjmarAhzMePbFmlQII2VwEsczYyINEo21D2jWtABmRDNAwpMRI22dma + FUXUDNRKN0UUtww81JJiAGsuZLXY9jDeCFGYZtul7GIkG9e5LJ49kNi07JIRtgBk5SwZHBGMV8GP + yhdIhETQTN48okDcefM1MqmZxZyl1fmw2LiquoOG5+zgS+a1OP+BAHSwCFGmRYyi0EZ1lqoGxKFI + JfHzBbpRZZyj7hmyZdEyhVF3aVVCCg6HzOuVp48Ar2fDHprJSDRTLgjfNQuFhdmCJZsvZ6Oad8Ui + mAsazm6ARa/ZrlgA6O5sLkKlFJplVywDEWJxilnOgnDmXVwDghhd5iNbalPeIkux3FnDMJNZKacB + 2D6sgRGchUW53L0GQfsERLAomG33t2Fei8UH0TkPbNl5faEZ2dosPrAJBKEAqwoVCOvaLD6gqaKo + zte0LK4+roEtI1ks5jcHZTddTDOlfbEi0IMxKDOWIYa4vwQIg5HEENd74hHeLSSiHPNyRhb88uX9 + /b8BAAD//2AJahLlCgAA + headers: + content-encoding: + - gzip + content-length: + - '1269' + content-type: + - application/json; charset=UTF-8 + date: + - Sun, 01 May 2022 18:24:56 GMT + vary: + - Accept-Encoding,Origin + x-ratelimit-limit: + - '4000' + x-ratelimit-remaining: + - '3998' + x-ratelimit-reset: + - '1651511281' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_messari_timeseries[btc-1d-2022-01-10-2022-03-08-sply.circ].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_messari_timeseries[btc-1d-2022-01-10-2022-03-08-sply.circ].yaml new file mode 100644 index 00000000000..1e95114fe86 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_messari_timeseries[btc-1d-2022-01-10-2022-03-08-sply.circ].yaml @@ -0,0 +1,60 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + x-messari-api-key: + - mock_x-messari-api-key + method: GET + uri: https://data.messari.io/api/v1/assets/btc/metrics/sply.circ/time-series?start=2022-01-10&end=2022-03-08&interval=1d + response: + body: + string: !!binary | + H4sIAAAAAAAA/3SUTW/cNhPHvwrBUwJoN3wntbcHuT1Ae6l7iWEYXGlsMZbIrUjZXQT+7oWkpcSk + ruGDob9n/vPyG/7AMdk0RXz6gaG3lwgtPhld4eQGiMkOF3zCjDB2IPJA6B01JyZPhB+VZjXlzMhv + +L3CrU12TnGxox0gwbgktDFCenyBKz7hc2pwdfviWnzCFDhl1NgDCAEHwYw8GEaag2GGATDGCJe4 + mssb01YDPVByR8hp+f2GKwy+3UR+IOYn0fkE46vtZ7cWVziMLYz4hG1swLfOP+MKP4VxsLPB9xg8 + Lvp+3JTJu78Pg+t7F6EJvo24wk3op8FHfLovJlXhxo3N1Nvk/PNjnC6X/oof3iscmw6GZUADpNE1 + 6wTipb8e5whcYW8HwCf8dY9Hf6zxFW4hNqO7JBc8PuG7DlBhg1YbZJsXH956aJ8hotTZhFJ4AR/R + YK/oDKiDvkXnK7qM4Ts0KX55CpNv7Zw0orfONR3q7CsgH9A8Nj/Howh9j9rw5lHqwI3oEqJbIip0 + ntLPYQn1oXmBFk2XXJPzyKJljD1qgk+jbdIR3XVTrD5qoQ0Ql0TON/3UApo78rlilEawcRqvqAv9 + vLyIPq0FNNbPHUb37N2Ta6xPn4/o95BgnYP1yPlXiCmMaJhiQo0d4Wnq++tcVHQtjOgcUod699fk + WmR9++/qHMxTAo/g1fbTKliPFp6rJSR1gNJbWKp5teO1rKe/HtH/0OjiCwpPqIXLih8Cn9wI/RUF + /9FAXN5kB8hPwxnGJXvTWf8MqB3tYJNr7NzJ2UZo5zSti80I85KWGmwPET2NYfh1jA7iEVd47gbi + 4w5oefd3+e95k+UBoOh8A0tdcAlNhz5R9H/rp9mS1pqgfIXoz7uvnz++i/8kOTwtiZfRriMAlEKy + /Yf/UIDnfAqoh+eCtlihONgxlR/CuB6D8ztSb7bvIcXj/JYNzrthGh5/fT1imMYGHm1KoztP6zXe + /9guNzj/mx1fIH2180swjXNgl9Ilnr58aYLzw6I29nJswoDf53dhnT4+3d9TJajWzJD5p6KmZkIS + 9VAtgpE12wUpqLkJtZBqFxTXchUY4WvAKmhm6E2g1IhdMNzom8CIKMxrvkWwmu7mnOwC13o351Sy + bC6U2M05kzx7SEl2c873chVXuzkXQrGboBkvzKWkWTCkLswV3yLM7fsqaLp51IYV5oZkgRNlCvOa + 5LFzKmVhXtfZgzNBd3NBdG6Q89sCV4HKPCsuqNjNl0HcBEnIbi741jmXRu/mQvCa3wSleWEut9Xy + 2zZugmJbVSYvZBE02xqseQGcMJTfUglCC+CEqTNwgpICOFHrnErkgEWQROWqBNMFcJKK3IfgqgBO + sl0QsgBO8m21QvICOClY3qBQrABOSpo7F5oWwEm1R+i6AE5qls9AGFMAJw3fGqxVAZysubqNROaJ + LIIiXNz6kFQUwCnK831IxgrgFKNbqvmIdoFviEpBCuAUr/OspDAFcEroLZXUBXBKbouSShXAKaW2 + crUogFNabKkML4BThmcY8qN0E2qaPRQhBXCqrjNXitQFcJrUWwTVBXCamrwPxVQBnGZa5gguC+A0 + V3lWC++7ILbXR0lWAKfl1odStABOK5oXpVRdAKc1Uezh4f39nwAAAP//FqqgJDMLAAA= + headers: + content-encoding: + - gzip + content-length: + - '1247' + content-type: + - application/json; charset=UTF-8 + date: + - Sun, 01 May 2022 18:25:03 GMT + vary: + - Accept-Encoding,Origin + x-ratelimit-limit: + - '4000' + x-ratelimit-remaining: + - '3991' + x-ratelimit-reset: + - '1651511281' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_project_product_info[eth].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_project_product_info[eth].yaml new file mode 100644 index 00000000000..6f900677764 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_project_product_info[eth].yaml @@ -0,0 +1,86 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + x-messari-api-key: + - mock_x-messari-api-key + method: GET + uri: https://data.messari.io/api/v2/assets/eth/profile?fields=profile%2Fgeneral%2Foverview%2Fproject_details%2Cprofile%2Ftechnology + response: + body: + string: !!binary | + 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 + headers: + content-encoding: + - gzip + content-type: + - application/json; charset=UTF-8 + date: + - Sun, 01 May 2022 18:25:04 GMT + transfer-encoding: + - chunked + vary: + - Accept-Encoding,Origin + x-ratelimit-limit: + - '4000' + x-ratelimit-remaining: + - '3990' + x-ratelimit-reset: + - '1651511281' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_roadmap[eth].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_roadmap[eth].yaml new file mode 100644 index 00000000000..8887b7804de --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_roadmap[eth].yaml @@ -0,0 +1,132 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + x-messari-api-key: + - mock_x-messari-api-key + method: GET + uri: https://data.messari.io/api/v2/assets/eth/profile?fields=profile%2Fgeneral%2Froadmap + response: + body: + string: !!binary | + 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 + 8pNCR6wfzibf/vPbt2/f/i8AAP//IkcNRs00AAA= + headers: + content-encoding: + - gzip + content-type: + - application/json; charset=UTF-8 + date: + - Sun, 01 May 2022 18:25:05 GMT + transfer-encoding: + - chunked + vary: + - Accept-Encoding,Origin + x-ratelimit-limit: + - '4000' + x-ratelimit-remaining: + - '3989' + x-ratelimit-reset: + - '1651511281' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_team[eth].yaml b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_team[eth].yaml new file mode 100644 index 00000000000..6b0a47ba0bf --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/cassettes/test_messari_model/test_get_team[eth].yaml @@ -0,0 +1,84 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + x-messari-api-key: + - mock_x-messari-api-key + method: GET + uri: https://data.messari.io/api/v2/assets/eth/profile?fields=profile%2Fcontributors + response: + body: + string: !!binary | + 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 + COeYxS03fvv27du3/wYAAP//Rnp3TSEaAAA= + headers: + content-encoding: + - gzip + content-type: + - application/json; charset=UTF-8 + date: + - Sun, 01 May 2022 18:25:01 GMT + transfer-encoding: + - chunked + vary: + - Accept-Encoding,Origin + x-ratelimit-limit: + - '4000' + x-ratelimit-remaining: + - '3993' + x-ratelimit-reset: + - '1651511281' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_available_timeseries.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_available_timeseries.csv new file mode 100644 index 00000000000..6bc7ef1cbfd --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_available_timeseries.csv @@ -0,0 +1,243 @@ +id,Title,Description,Requires Paid Key,Sources +exch.sply.usd,Supply on Exchanges,The sum USD value of all native units held in hot or cold exchange wallets that interval.,False,"Coinmetrics,Kaiko" +exch.sply.kraken,Supply on Kraken,The sum USD value held by Kraken at the end of that interval.,True,Coinmetrics +fees.pct.rev,Miner Revenue from Fees (%),The percentage of miner revenue derived from fees that interval. This is equal to the fees divided by the miner revenue.,True,Coinmetrics +sply.top.100,Supply in top 100 addresses,The sum of all native units held by the richest 100 addresses at the end of that time interval.,True,Coinmetrics +txn.cnt,Transactions Count,The sum count of transactions that interval. Transactions represent a bundle of intended actions to alter the ledger initiated by a user (human or machine). Transactions are counted whether they execute or not and whether they result in the transfer of native units.,False,Coinmetrics +miner.1hop.sply.ntv,Supply One Hop from Miners (Native Units),"The sum of the balances of all addresses within one hop of a mining entity. An address within one hop of a mining entity is defined as an address that has been credited from a transaction debiting the 'FEES' or 'ISSUANCE' accounts, or any address that has been credited in a transaction sent by such an address.",True,Coinmetrics +sply.act.10y,10 Year Active Supply,The sum of unique native units that transacted at least once in the trailing 10 years up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics +sply.act.90d,90 Days Active Supply,The sum of unique native units that transacted at least once in the trailing 90 days up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics +sply.rvv.30d,Supply Revived in Last 30 Days,The sum of all native unit balances last active at least 30 days ago that became active in this interval.,True,Coinmetrics +blk.hgt,Block Height,The count of blocks from the genesis (first) block to the last block of that interval on the main chain.,True,Coinmetrics +exch.bitmex.flow.in.ntv,Bitmex Deposits (Native Units),The sum in native units sent to Bitmex that interval.,True,Coinmetrics +sply.addr.bal.1k,Supply in addresses with balance greater than $1K,"The sum of all native units being held in addresses whose balance was $1K or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +sply.rvv.7d,Supply Revived in Last 7 Days,The sum of all native unit balances last active at least 7 days ago that became active in this interval.,True,Coinmetrics +sply.act.3y,3 Year Active Supply,The sum of unique native units that transacted at least once in the trailing 3 years up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics +exch.bitstamp.flow.in.ntv,Bitstamp Deposits (Native Units),The sum in native units sent to Bitstamp that interval.,True,Coinmetrics +exch.sply.bittrex.ntv,Supply on Bittrex (Native Units),The sum in native units held by Bittrex at the end of that interval.,True,Coinmetrics +exch.sply.poloniex.ntv,Supply on Poloniex (Native Units),The sum in native units held by Poloniex at the end of that interval.,True,Coinmetrics +exch.bitfinex.flow.net.ntv,Bitfinex Net Flows (Native Units),The net native units value sent or withdrawn to/from Bitfinex that interval.,True,Coinmetrics +exch.binance.flow.in.ntv,Binance Deposits (Native Units),The sum in native units sent to Binance that interval.,True,Coinmetrics +utxo.loss.cnt,UTXO in Loss Count,The sum count of unspent transaction outputs created on days where the closing price was higher than the closing price at the end of the period.,True,Coinmetrics +addr.bal.1k.ntv.cnt,Addresses with balance greater than 1K native units,"The sum count of unique addresses holding at least 1,000 native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +blk.cnt,Block Count,The sum count of blocks created each day,False,Coinmetrics +exch.poloniex.flow.out,Poloniex Withdrawals,The sum in US dollars withdrawn from Poloniex that interval.,True,Coinmetrics +exch.sply.bitmex.ntv,Supply on Bitmex (Native Units),The sum in native units held by Bitmex at the end of that interval.,True,Coinmetrics +hash.rev,Miner Revenue per Hash,"The USD value of the mean miner reward per estimated hash unit performed during the period, also known as hashprice. The unit of hashpower measurement depends on the protocol.",True,Coinmetrics +sply.total.iss.ntv,Total Issuance (Native Units),The sum of all new native units issued that interval.,False,Coinmetrics +min.rev.ntv,Miner Revenue (Native Units),"The sum of all miner revenue, which constitutes fees plus newly issued native units.",False,Coinmetrics +miner.rev.total,Total Miner Revenue,The sum USD value of all miner revenue (fees plus newly issued native units) for all time from genesis up to the end of that interval.,True,Coinmetrics +sply.rvv.3y,Supply Revived in Last 3 Years,The sum of all native unit balances last active at least 3 years ago that became active in this interval.,True,Coinmetrics +sply.utxo.prof,Supply in UTXOs in Profit (Native Units),The sum of all native units held in unspent transaction outputs created on days where the closing price was lower than or equal to the closing price at the end of the period.,True,Coinmetrics +txn.tfr.val.med.ntv,Median Transfer Value (Native Units),"The median count of native units transferred per transfer (i.e., the median size of a transfer) between distinct addresses that interval.",False,Coinmetrics +addr.act.rcv.cnt,Active Addresses Count (Received),The sum count of unique addresses that were active in the network (as a recipient of a ledger change) that interval.,True,Coinmetrics +exch.bitstamp.flow.out.ntv,Bitstamp Withdrawals (Native Units),The sum in native units withdrawn from Bitstamp that interval.,True,Coinmetrics +sply.cont.usd,Supply in contracts,The sum USD value being held by smart contracts.,True,Coinmetrics +txn.fee.avg,Average Transaction Fees,The USD value of the mean fee per transaction that interval.,False,Coinmetrics +txn.gas.limit,Total Gas Limit,The sum gas limit of all transactions that interval.,True,Coinmetrics +txn.vol,Transaction Volume,"The sum USD value of all native units transferred (i.e., the aggregate size in USD of all transfers).",False,Coinmetrics +exch.binance.flow.in,Binance Deposits,The sum USD value sent to Binance that interval.,True,Coinmetrics +exch.sply.bittrex,Supply on Bittrex,The sum USD value held by Bittrex at the end of that interval.,True,Coinmetrics +sply.act.5y,5 Year Active Supply,The sum of unique native units that transacted at least once in the trailing 5 years up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics +sply.act.180d,180 Days Active Supply,The sum of unique native units that transacted at least once in the trailing 180 days up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics +sply.addr.bal.1.ntv,Supply in addresses with balance greater than 1 native unit,"The sum of all native units being held in addresses whose balance was 1 native units or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +sply.rvv.2y,Supply Revived in Last 2 Years,The sum of all native unit balances last active at least 2 years ago that became active in this interval.,True,Coinmetrics +exch.flow.in.usd,Deposits on Exchanges,"The sum USD value sent to exchanges that interval, excluding exchange to exchange activity.",False,Coinmetrics +txn.tsfr.cnt,Transactions Transfer Count,The sum count of transfers that interval. Transfers represent movements of native units from one ledger entity to another distinct ledger entity. Only transfers that are the result of a transaction and that have a positive (non-zero) value are counted.,False,Coinmetrics +mcap.circ,Circulating Marketcap,"The circulating marketcap is the price of the asset multiplied by the circulating supply. If no price is found for an asset because no trades occurred, the last price of the last trade is used. After 30 days with no trades, a marketcap of 0 is reported until trading resumes.",False,"Messari,Kaiko" +exch.poloniex.flow.net.ntv,Poloniex Net Flows (Native Units),The net native units value sent or withdrawn to/from Poloniex that interval.,True,Coinmetrics +exch.binance.flow.out,Binance Withdrawals,The sum in US dollars withdrawn from Binance that interval.,True,Coinmetrics +exch.sply.gemini,Supply on Gemini,The sum USD value held by Gemini at the end of that interval.,True,Coinmetrics +exch.flow.in.ntv.incl,Deposits on Exchanges - Inclusive (Native Units),"The amount of the asset sent to exchanges that interval, including exchange to exchange activity.",False,Coinmetrics +exch.flow.in.usd.incl,Deposits on Exchanges - Inclusive,"The sum USD value sent to exchanges that interval, including exchange to exchange activity.",False,Coinmetrics +exch.bittrex.flow.in.ntv,Bittrex Deposits (Native Units),The sum in native units sent to Bittrex that interval.,True,Coinmetrics +sply.addr.bal.10k.ntv,Supply in addresses with balance greater than 10K native units,"The sum of all native units being held in addresses whose balance was 10K native units or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +txn.gas.limit.avg,Average Gas Limit,The mean gas limit per transaction that interval.,True,Coinmetrics +telegram.users,Telegram Users,The number of users in the asset's primary Telegram channel,False,CoinGecko +exch.poloniex.flow.net,Poloniex Net Flows,The net USD value sent or withdrawn to/from Poloniex that interval.,True,Coinmetrics +addr.cnt,Addresses Count,"The sum count of unique addresses holding any amount of native units as of the end of that interval. Only native units are considered (e.g., a 0 ETH balance address with ERC-20 tokens would not be considered).",True,Coinmetrics +txn.tsfr.val.avg,Average Transfer Value,"The sum USD value of native units transferred divided by the count of transfers (i.e., the mean ""size"" in USD of a transfer).",False,Coinmetrics +min.rev.usd,Miner Revenue,"The sum USD value of all miner revenue, which constitutes fees plus newly issued native units, represented as the US dollar amount earned if all native units were sold at the closing price on the same day.",False,"Coinmetrics,Kaiko" +sply.act.pct.1y,1 Year Active Supply (%),The percentage of the current supply that has been active in the trailing 1 year up to the end of that interval.,True,Coinmetrics +blk.unc.rew,Uncle Rewards,The sum USD value rewarded to miners for creating and including uncle blocks in that interval. This includes the uncle inclusion reward (for the main chain block miner) and the uncle rewards (for the uncle block miners).,True,Coinmetrics +exch.huobi.flow.in,Huobi Deposits,The sum USD value sent to Huobi that interval.,True,Coinmetrics +exch.sply.bitmex,Supply on Bitmex,The sum USD value held by Bitmex at the end of that interval.,True,Coinmetrics +sply.addr.bal.100,Supply in addresses with balance greater than $100,"The sum of all native units being held in addresses whose balance was $100 or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +txn.fee.med.ntv,Median Transaction Fees (Native Units),The median fee per transaction in native units that interval.,False,Coinmetrics +exch.kraken.flow.in,Kraken Deposits,The sum USD value sent to Kraken that interval.,True,Coinmetrics +exch.flow.in.ntv,Deposits on Exchanges (Native Units),"The amount of the asset sent to exchanges that interval, excluding exchange to exchange activity.",False,Coinmetrics +sply.rvv.180d,180 Days Active Supply,The sum of all native unit balances last active at least 180 days ago that became active in this interval.,True,Coinmetrics +addr.bal.10m.cnt,Addresses with balance greater than $10M,"The sum count of unique addresses holding at least ten million dollars' worth of native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.bittrex.flow.net,Bittrex Net Flows,The net USD value sent or withdrawn to/from Bittrex that interval.,True,Coinmetrics +exch.huobi.flow.out.ntv,Huobi Withdrawals (Native Units),The sum in native units withdrawn from Huobi that interval.,True,Coinmetrics +txn.cnt.sec,Transactions per Second Count,The sum count of transactions divided by the number of seconds that interval.,True,Coinmetrics +txn.tfr.erc721.cnt,ERC-721 Transfer Count,The sum count of ERC-721 transfers in that interval. Only transfers between two distinct addresses are counted. ERC-165 is used to determine a contract’s compliance with ERC-721.,False,Coinmetrics +cg.sply.circ,Circulating Supply (CoinGecko),"The circulating supply acknowledges that tokens may be held by projects/foundations which have no intent to sell down their positions, but which have not locked up supply in a formal contract. Thus, circulating supply does not include known project treasury holdings (which can be significant). Note that an investor must carefully consider both liquid and circulating supplies when evaluating an asset, and the two can vary significantly. A risk of depending entirely on circulating supply is that the number can change dramatically based on discretionary sales from project treasuries.",False, +sply.addr.bal.10.ntv,Supply in addresses with balance greater than 10 native units,"The sum of all native units being held in addresses whose balance was 10 native units or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +blk.unc.rew.ntv,Uncle Rewards (Native Units),The sum of native units rewarded to miners for creating and including uncle blocks in thatinterval. This includes the uncle inclusion reward (for the main chain block miner) and the uncle rewards(for the uncle block miners).,True,Coinmetrics +exch.huobi.flow.net.ntv,Huobi Net Flows (Native Units),The net native units value sent or withdrawn to/from Huobi that interval.,True,Coinmetrics +sply.addr.bal.0.1.ntv,Supply in addresses with balance greater than 0.1 native unit,"The sum of all native units being held in addresses whose balance was 0.1 native units or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +txn.tfr.avg.ntv,Average Transfer Value (Native Units),"The sum value of native units transferred divided by the count of transfers (i.e., the mean size of a transfer) between distinct addresses that interval.",False,Coinmetrics +exch.bitstamp.flow.net.ntv,Bitstamp Net Flows (Native Units),The net native units value sent or withdrawn to/from Bitstamp that interval.,True,Coinmetrics +exch.bittrex.flow.out.ntv,Bittrex Withdrawals (Native Units),The sum in native units withdrawn from Bittrex that interval.,True,Coinmetrics +real.vol,Real Volume,"It is well known that many exchanges conduct wash trading practices in order to inflate trading volume. They are incentivized to report inflated volumes in order to attract traders. ""Real Volume"" refers to the total volume on the exchanges that we believe with high level of confidence are free of wash trading activities. However, that does not necessarily mean that the volume reported by other exchanges is 100% wash trades. As such, the Messari ""Real Volume"" applies a penalty to these exchanges to discount the volume believed to come from wash trading activity. For more information, see our methodology page.",False,Kaiko +addr.bal.10.cnt,Addresses with balance greater than $10,"The sum count of unique addresses holding at least ten dollars' worth of native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +addr.bal.1.cnt,Addresses with balance greater than $1,"The sum count of unique addresses holding at least one dollars' worth of native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.huobi.flow.in.ntv,Huobi Deposits (Native Units),The sum in native units sent to Huobi that interval.,True,Coinmetrics +txn.cont.dest.cnt,Contract Destructions Count,The sum count of contracts successfully destroyed across all transactions in that interval. A contract is a special address that contains and can execute code.,True,Coinmetrics +txn.tfr.val.ntv,Transaction Volume (Native Units),"The sum of native units transferred (i.e., the aggregate size of all transfers) between distinct addresses that interval.",False,Coinmetrics +sply.addr.bal.1m,Supply in addresses with balance greater than $1M,"The sum of all native units being held in addresses whose balance was $1M or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +addr.bal.1m.ntv.cnt,Addresses with balance greater than 1M native units,"The sum count of unique addresses holding at least 1,000,000 native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.bittrex.flow.in,Bittrex Deposits,The sum USD value sent to Bittrex that interval.,True,Coinmetrics +exch.gemini.flow.in,Gemini Deposits,The sum USD value sent to Gemini that interval.,True,Coinmetrics +exch.poloniex.flow.in.ntv,Poloniex Deposits (Native Units),The sum in native units sent to Poloniex that interval.,True,Coinmetrics +exch.bitfinex.flow.out.ntv,Bitfinex Withdrawals (Native Units),The sum in native units withdrawn from Bitfinex that interval.,True,Coinmetrics +hashrate.30d,30 day Average Hash Rate,The mean rate at which miners are solving hashes over the last 30 days. Hash rate is the speed at which computations are being completed across all miners in the network. The unit of measurement varies depending on the protocol.,True,Coinmetrics +exch.gemini.flow.net,Gemini Net Flows,The net USD value sent or withdrawn to/from Gemini that interval.,True,Coinmetrics +exch.bittrex.flow.out,Bittrex Withdrawals,The sum in US dollars withdrawn from Bittrex that interval.,True,Coinmetrics +exch.sply.huobi,Supply on Huobi,The sum USD value held by Huobi at the end of that interval.,True,Coinmetrics +miner.1hop.sply,Supply One Hop from Miners,"The sum of the balances of all addresses within one hop of a mining entity in USD. An address within one hop of a mining entity is defined as an address that has been credited from a transaction debiting the 'FEES' or 'ISSUANCE' accounts, or any address that has been credited in a transaction sent by such an address.",True,Coinmetrics +sply.rvv.4y,Supply Revived in Last 4 Years,The sum of all native unit balances last active at least 4 years ago that became active in this interval.,True,Coinmetrics +sply.addr.bal.1,Supply in addresses with balance greater than $1,"The sum of all native units being held in addresses whose balance was $1 or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +txn.cont.cnt,Contracts Transactions Count,"The sum count of transactions that invoked a contract in that interval. Failed transactions are counted but internal transactions are not (i.e., only the parent transaction is counted). A contract is a special address that contains and can execute code.",True,Coinmetrics +txn.erc721.cnt,ERC-721 Transactions Count,"The sum count of transactions that resulted in any ERC-721 activity in that interval. Only transfers between two distinct addresses are counted. ERC-165 is used to determine a contract’s compliance with ERC-721. Only Transfer or Approval events are counted as activity. If a transaction results in more than 1 transfer or approval, it’s only counted once.",True,Coinmetrics +exch.flow.out.usd,Withdrawals from Exchanges,"The sum USD value withdrawn from exchanges that interval, excluding exchange to exchange activity.",False,Coinmetrics +nvt.adj,Adjusted NVT,"The ratio of the network value (or market capitalization, current supply) divided by the adjusted transfer value. Also referred to as NVT.",False,Coinmetrics +sply.addr.bal.10,Supply in addresses with balance greater than $10,"The sum of all native units being held in addresses whose balance was $10 or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.binance.flow.net.ntv,Binance Net Flows (Native Units),The net native units value sent or withdrawn to/from Binance that interval.,True,Coinmetrics +exch.bitstamp.flow.in,Bitstamp Deposits,The sum USD value sent to Bitstamp that interval.,True,Coinmetrics +exch.kraken.flow.in.ntv,Kraken Deposits (Native Units),The sum in native units sent to Kraken that interval.,True,Coinmetrics +txn.tfr.erc20.cnt,ERC-20 Transfer Count,"The sum count of ERC-20 transfers in that interval. Only non-zero transfers between two distinct addresses are counted. Contracts that contain all of the following are considered to be ERC-20 contracts: the balanceOf function, the transfer function, and the Transfer event hash.",False,Coinmetrics +txn.tfr.val.adj.ntv,Adjusted Transaction Volume (Native Units),The sum of native units transferred between distinct addresses that interval removing noise and certain artifacts.,False,Coinmetrics +addr.bal.1m.cnt,Addresses with balance greater than $1M,"The sum count of unique addresses holding at least one million dollars' worth of native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +sply.addr.bal.10k,Supply in addresses with balance greater than $10K,"The sum of all native units being held in addresses whose balance was $10K or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.bittrex.flow.net.ntv,Bittrex Net Flows (Native Units),The net native units value sent or withdrawn to/from Bittrex that interval.,True,Coinmetrics +exch.bitfinex.flow.in,Bitfinex Deposits,The sum USD value sent to Bitfinex that interval.,True,Coinmetrics +miner.sply.ntv,Miner Supply (Native Units),The sum of the balances of all mining entities. A mining entity is defined as an address that has been credited from a transaction debiting the 'FEES' or 'ISSUANCE' accounts.,True,Coinmetrics +sply.act.30d,30 Days Active Supply,The sum of unique native units that transacted at least once in the trailing 30 days up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics +sply.rvv.90d,Supply Revived in Last 90 Days,The sum of all native unit balances last active at least 90 days ago that became active in this interval.,True,Coinmetrics +twitter.followers,Twitter Followers,The number of followers of the asset's primary Twitter account,False,CoinGecko +addr.bal.10.ntv.cnt,Addresses with balance greater than 10 native units,"The sum count of unique addresses holding at least 10 native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.kraken.flow.out.ntv,Kraken Withdrawals (Native Units),The sum in native units withdrawn from Kraken that interval.,True,Coinmetrics +mcap.out,Outstanding Marketcap,The sum USD value of the current supply. Also referred to as network value or market capitalization.,False,Coinmetrics +rvt.adj,Adjusted RVT,The ratio of the network's realized value to the adjusted transfer value. Also referred to as RVT.,True,Coinmetrics +exch.bitmex.flow.net,Bitmex Net Flows,The net USD value sent or withdrawn to/from Bitmex that interval.,True,Coinmetrics +exch.sply.bitfinex,Supply on Bitfinex,The sum USD value held by Bitfinex at the end of that interval.,True,Coinmetrics +new.iss.usd,New Issuance,"The sum USD value of new native units issued that interval. Only those native units that are issued by a protocol-mandated continuous emission schedule are included (i.e., units manually released from escrow or otherwise disbursed are not included).",False,Coinmetrics +sply.rvv.5y,Supply Revived in Last 5 Years,The sum of all native unit balances last active at least 5 years ago that became active in this interval.,True,Coinmetrics +blk.wght.total,Block Weight,The sum of the weights of all blocks created in that interval. Weight is a dimensionless measure of a block’s “size”. It is only applicable for chains that use SegWit (segregated witness).,True,Coinmetrics +addr.bal.100.ntv.cnt,Addresses with balance greater than 100 native units,"The sum count of unique addresses holding at least 100 native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +reddit.subscribers,Reddit Subscribers,The number of subscribers on the asset's primary subreddit,False,Reddit +act.addr.cnt,Active Addresses Count,The sum count of unique addresses that were active in the network (either as a recipient or originator of a ledger change) that interval. All parties in a ledger change action (recipients and originators) are counted. Individual addresses are not double-counted.,False,Coinmetrics +txn.cont.call.succ.cnt,Successful Contract Calls Count,The sum count of contract calls successfully executed across all transactions in that interval. A contract call is the invocation of a contract’s code by another contract or non-contract address. Only successful executions are taken into account.,True,Coinmetrics +txn.tkn.cnt,Token Transactions Count,"The sum count of transactions that resulted in any token (ERC-20 or ERC-721) activity in that interval. Only Transfer or Approval events are counted as activity. If a transaction results in more than 1 transfer or approval, it’s only counted once.",True,Coinmetrics +utxo.age.avg,Average UTXO Age,The simple average age in full days of all unspent transaction outputs.,True,Coinmetrics +blk.unc.cnt,Uncle Blocks Count,The sum count of uncle blocks mined in that interval.,True,Coinmetrics +exch.gemini.flow.net.ntv,Gemini Net Flows (Native Units),The net native units value sent or withdrawn to/from Gemini that interval.,True,Coinmetrics +exch.bitmex.flow.out,Bitmex Withdrawals,The sum in native units withdrawn from Bitmex that interval.,True,Coinmetrics +exch.bitstamp.flow.out,Bitstamp Withdrawals,The sum in US dollars withdrawn from Bitstamp that interval.,True,Coinmetrics +exch.sply.bitstamp.ntv,Supply on Bitstamp (Native Units),The sum in native units held by Bitstamp at the end of that interval.,True,Coinmetrics +addr.bal.100k.ntv.cnt,Addresses with balance greater than 100K native units,"The sum count of unique addresses holding at least 100,000 native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +blk.int.avg,Average Block Interval (seconds),The mean absolute time (in seconds) between all the blocks created that interval.,True,Coinmetrics +exch.bitmex.flow.in,Bitmex Deposits,The sum USD value sent to Bitmex that interval.,True,Coinmetrics +iss.rate,Annual Issuance Rate,"The percentage of new native units (continuous) issued over that interval, extrapolated to one year (i.e., multiplied by 365), and divided by the current supply at the end of that interval. Also referred to as the annual inflation rate.",False,Coinmetrics +sply.act.evr,Active Supply,The sum of unique native units that transacted at least once from genesis up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics +sply.cont.ntv,Supply in contracts (Native Units),The sum of all native units being held by smart contracts.,True,Coinmetrics +blk.unc.rew.pct,Miner Revenue from Uncle Blocks (%),The percentage of miner revenue derived from creating and including uncle blocks in that interval. This is equal to the sum of the uncle inclusion reward (for the main chain block miner) and the uncle rewards (for the uncle block miners) divided by the miner revenue.,True,Coinmetrics +exch.poloniex.flow.in,Poloniex Deposits,The sum USD value sent to Poloniex that interval.,True,Coinmetrics +exch.bitstamp.flow.net,Bitstamp Net Flows,The net USD value sent or withdrawn to/from Bitstamp that interval.,True,Coinmetrics +exch.gemini.flow.in.ntv,Gemini Deposits (Native Units),The sum in native units sent to Gemini that interval.,True,Coinmetrics +hash.rev.ntv,Miner Revenue per Hash (Native Units),"The mean miner reward per estimated hash unit performed during the period, in native units. The unit of hashpower measurement depends on the protocol.",True,Coinmetrics +hashrate.rev.ntv,Miner Revenue per Hash per Second (Native Units),"The mean daily miner reward per estimated hash unit per second performed during the period, in native units. The unit of hashpower measurement depends on the protocol.",True,Coinmetrics +sply.act.1y,1 Year Active Supply,The sum of unique native units that transacted at least once in the trailing 1 year up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics +price,Price,Volume weighted average price computed using Messari Methodology,False,Kaiko +sply.liquid,Liquid Supply,The liquid supply of an asset is the number of units that currently exist on-chain and which are not known to be encumbered by any contracts.,False,Messari +txn.cont.creat.cnt,Contract Creations Count,The sum count of new contracts successfully created across all transactions in that interval. A contract is a special address that contains and can execute code.,True,Coinmetrics +mcap.dom,Marketcap Dominance,The marketcap dominance is the asset's percentage share of total crypto circulating marketcap,False,Kaiko +reddit.active.users,Reddit Active Users,The number of active users on the asset's primary subreddit,False,Reddit +exch.bitfinex.flow.in.ntv,Bitfinex Deposits (Native Units),The sum in native units sent to Bitfinex that interval.,True,Coinmetrics +exch.poloniex.flow.out.ntv,Poloniex Withdrawals (Native Units),The sum in native units withdrawn from Poloniex that interval.,True,Coinmetrics +exch.sply.binance.ntv,Supply on Binance (Native Units),The sum in native units held by Binance at the end of that interval.,True,Coinmetrics +sply.rvv.1y,Supply Revived in Last 1 Year,The sum of all native unit balances last active at least 1 year ago that became active in this interval.,True,Coinmetrics +daily.shp,Sharpe Ratio,"The Sharpe ratio (performance of the asset compared to a ""risk-free"" asset) over a window of time)",False,Kaiko +exch.kraken.flow.net,Kraken Net Flows,The net USD value sent or withdrawn to/from Kraken that interval.,True,Coinmetrics +exch.sply.huobi.ntv,Supply on Huobi (Native Units),The sum in native units held by Huobi at the end of that interval.,True,Coinmetrics +daily.vol,Volatility,The annualized standard-deviation of daily returns over a window of time,False,Kaiko +addr.bal.10k.ntv.cnt,Addresses with balance greater than 10K native units,"The sum count of unique addresses holding at least 10,000 native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +txn.gas,Gas Used,"The sum gas used (i.e., paid) across all transactions that interval.",True,Coinmetrics +blk.size.bytes.avg,Average Block Size (bytes),The mean size (in bytes) of all blocks created,False,Coinmetrics +exch.bitfinex.flow.net,Bitfinex Net Flows,The net USD value sent or withdrawn to/from Bitfinex that interval.,True,Coinmetrics +exch.binance.flow.net,Binance Net Flows,The net USD value sent or withdrawn to/from Binance that interval.,True,Coinmetrics +exch.gemini.flow.out.ntv,Gemini Withdrawals (Native Units),The sum in native units withdrawn from Gemini that interval.,True,Coinmetrics +fees,Total Fees,The sum USD value of all fees paid to miners that interval. Fees do not include new issuance.,False,Coinmetrics +rvt.adj.90d.ma,Adjusted RVT 90-days MA,The ratio of the network's realized value to the 90-day moving average of the adjusted transfer value. Also referred to as RVT.,True,Coinmetrics +sply.circ,Circulating Supply,"The circulating supply acknowledges that tokens may be held by projects/foundations which have no intent to sell down their positions, but which have not locked up supply in a formal contract. Thus, circulating supply does not include known project treasury holdings (which can be significant). Note that an investor must carefully consider both liquid and circulating supplies when evaluating an asset, and the two can vary significantly. A risk of depending entirely on circulating supply is that the number can change dramatically based on discretionary sales from project treasuries.",False, +mcap.realized,Realized Marketcap,"The sum USD value based on the USD closing price on the day that a native unit last moved (i.e., last transacted) for all native units.",False,Coinmetrics +miner.sply,Miner Supply,The sum of the balances of all mining entities in USD. A mining entity is defined as an address that has been credited from a transaction debiting the 'FEES' or 'ISSUANCE' accounts.,True,Coinmetrics +txn.erc20.cnt,ERC-20 Transactions Count,"The sum count of transactions that resulted in any ERC-20 activity in that interval. Contracts that contain all of the following are considered to be ERC-20 contracts: the balanceOf function, the transfer function, and the Transfer event hash. Only Transfer or Approval events are counted as activity. If a transaction results in more than 1 transfer or approval, it’s only counted once.",True,Coinmetrics +exch.sply.bitstamp,Supply on Bitstamp,The sum USD value held by Bitstamp at the end of that interval.,True,Coinmetrics +exch.flow.out.ntv,Withdrawals from Exchanges (Native Units),"The amount of the asset withdrawn from exchanges that interval, excluding exchange to exchange activity.",False,Coinmetrics +sply.act.7d,7 Days Active Supply,The sum of unique native units that transacted at least once in the trailing 7 days up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics +sply.addr.bal.100k.ntv,Supply in addresses with balance greater than 100K native units,"The sum of all native units being held in addresses whose balance was 100K native units or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +sply.out,Outstanding Supply,"The sum of all native units ever created and visible on the ledger (i.e., issued) at the end of that interval. For account-based protocols, only accounts with positive balances are counted.",False,Coinmetrics +addr.bal.0.1.ntv.cnt,Addresses with balance greater than 0.1 native units,"The sum count of unique addresses holding at least 0.1 native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.flow.out.usd.incl,Withdrawals from Exchanges - Inclusive,"The sum USD value withdrawn from exchanges that interval, including exchange to exchange activity.",False,Coinmetrics +blk.size.byte,Block Size (bytes),The sum of the size (in bytes) of all blocks created each day,False,Coinmetrics +sply.top.10pct,Supply in top 10% addresses,The sum of all native units held by the richest 10% of addresses at the end of that interval.,True,Coinmetrics +exch.sply.poloniex,Supply on Poloniex,The sum USD value held by Poloniex at the end of that interval.,True,Coinmetrics +exch.flow.out.ntv.incl,Withdrawals from Exchanges - Inclusive (Native Units),"The amount of the asset withdrawn from exchanges that interval, including exchange to exchange activity.",False,Coinmetrics +sply.addr.bal.100.ntv,Supply in addresses with balance greater than 100 native units,"The sum of all native units being held in addresses whose balance was 100 native units or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.bitmex.flow.net.ntv,Bitmex Net Flows (Native Units),The net native units value sent or withdrawn to/from Bitmex that interval.,True,Coinmetrics +exch.bitmex.flow.out.ntv,Bitmex Withdrawals (Native Units),The sum in native units withdrawn from Bitmex that interval.,True,Coinmetrics +exch.sply.binance,Supply on Binance,The sum USD value held by Binance at the end of that interval.,True,Coinmetrics +nvt.adj.90d.ma,Adjusted NVT 90-days MA,"The ratio of the network value (or market capitalization, current supply) to the 90-day moving average of the adjusted transfer value. Also referred to as NVT.",False,Coinmetrics +sply.act.1d,1 Day Active Supply,The sum of unique native units that transacted at least once in the trailing 1 days up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics +sply.top.1pct,Supply in top 1% addresses,The sum of all native units held by the richest 1% of addresses at the end of that interval.,True,Coinmetrics +blk.wght.avg,Average Block Weight,The mean weight of all blocks created that day. Weight is a dimensionless measure of a block’s “size”. It is only applicable for chains that use SegWit (segregated witness).,True,Coinmetrics +diff.avg,Average Difficulty,"The mean difficulty of finding a hash that meets the protocol-designated requirement (i.e., the difficulty of finding a new block) that interval. The requirement is unique to each applicable cryptocurrency protocol.",False,Coinmetrics +txn.fee.med,Median Transaction Fees,The USD value of the median fee per transaction that interval.,False,Coinmetrics +utxo.cnt,UTXO Count,The sum count of unspent transaction outputs that interval.,True,Coinmetrics +addr.bal.100k.cnt,Addresses with balance greater than $100K,"The sum count of unique addresses holding at least one hundred thousand dollars' worth of native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +addr.bal.0.001.ntv.cnt,Addresses with balance greater than 0.001 native units,"The sum count of unique addresses holding at least 0.001 native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.sply,Supply on Exchanges (Native Units),The sum of all native units held in hot or cold exchange wallets that interval.,False,Coinmetrics +exch.gemini.flow.out,Gemini Withdrawals,The sum in US dollars withdrawn from Gemini that interval.,True,Coinmetrics +sply.addr.bal.10m,Supply in addresses with balance greater than $10M,"The sum of all native units being held in addresses whose balance was $10M or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +sply.shld,Supply Shielded,The sum of all native units being held in shielded pool(s).,True,Coinmetrics +utxo.age.val.avg,Value-weighted Average UTXO Age,The value-weighted average age in full days of all unspent transaction outputs.,True,Coinmetrics +addr.bal.0.01.ntv.cnt,Addresses with balance greater than 0.01 native units,"The sum count of unique addresses holding at least 0.01 native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.huobi.flow.net,Huobi Net Flows,The net USD value sent or withdrawn to/from Huobi that interval.,True,Coinmetrics +exch.sply.kraken.ntv,Supply on Kraken (Native Units),The sum in native units held by Kraken at the end of that interval.,True,Coinmetrics +txn.cont.call.cnt,Contract Calls Count,The sum count of contract calls executed across all transactions in that interval. A contract call is the invocation of a contract’s code by another contract or non-contract address. Failed invocations are counted. A single transaction can result in multiple contract calls.,True,Coinmetrics +exch.sply.bitfinex.ntv,Supply on Bitfinex (Native Units),The sum in native units held by Bitfinex at the end of that interval.,True,Coinmetrics +hashrate,Hash Rate,The mean rate at which miners are solving hashes that interval.,False,Coinmetrics +sply.utxo.loss,Supply in UTXOs in Loss (Native Units),The sum of all native units held in unspent transaction outputs created on days when the closing price was higher than the closing price at the end of the period.,True,Coinmetrics +txn.tfr.val.med,Median Transfer Value,"The median USD value transferred per transfer (i.e., the median size in USD of a transfer) between distinct addresses that interval.",False,Coinmetrics +addr.bal.100.cnt,Addresses with balance greater than $100,"The sum count of unique addresses holding at least one hundred dollars' worth of native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.huobi.flow.out,Huobi Withdrawals,The sum in US dollars withdrawn from Huobi that interval.,True,Coinmetrics +sply.act.4y,4 Year Active Supply,The sum of unique native units that transacted at least once in the trailing 4 years up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics +txn.gas.avg,Average Gas Used,"The mean gas used (i.e., paid) across all transactions that interval.",True,Coinmetrics +addr.bal.1.ntv.cnt,Addresses with balance greater than 1 native units,"The sum count of unique addresses holding at least 1 native unit as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.binance.flow.out.ntv,Binance Withdrawals (Native Units),The sum in native units withdrawn from Binance that interval.,True,Coinmetrics +hashrate.rev,Miner Revenue per Hash per Second,"The USD value of the mean miner reward per estimated hash unit performed during the period, also known as hashprice. The unit of hashpower measurement depends on the protocol.",True,Coinmetrics +sply.addr.bal.100k,Supply in addresses with balance greater than $100K,"The sum of all native units being held in addresses whose balance was $100K or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +txn.fee.avg.ntv,Average Transaction Fees (Native Units),The mean fee per transaction in native units that interval.,False,Coinmetrics +iss.rate.day,Daily Issuance Rate,The percentage of new native units (continuous) issued over that interval divided by the current supply at the end of that interval. Also referred to as the daily inflation rate.,True,Coinmetrics +sply.addr.bal.0.01.ntv,Supply in addresses with balance greater than 0.01 native unit,"The sum of all native units being held in addresses whose balance was 0.01 native units or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +sply.addr.bal.0.001.ntv,Supply in addresses with balance greater than 0.001 native unit,"The sum of all native units being held in addresses whose balance was 0.001 native units or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +addr.bal.10k.cnt,Addresses with balance greater than $10K,"The sum count of unique addresses holding at least ten thousand dollars' worth of native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +txn.tsfr.val.adj,Adjusted Transaction Volume,The sum USD value of all native units transferred removing noise and certain artifacts.,False,Coinmetrics +blk.gas.limit.avg,Average Gas Limit per Block,The mean gas limit of all blocks that interval.,True,Coinmetrics +utxo.age.med,Median UTXO Age,"The median age in full days of all unspent transaction outputs, rounded down to the nearest day.",True,Coinmetrics +utxo.prof.cnt,UTXO in Profit Count,The sum count of unspent transaction outputs created on days where the closing price was lower than or equal to the closing price at the end of the period.,True,Coinmetrics +sply.total.iss,Total Issuance,The sum USD value of all new native units issued that interval.,False,Coinmetrics +sply.addr.bal.1m.ntv,Supply in addresses with balance greater than 1M native units,"The sum of all native units being held in addresses whose balance was 1M native units or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.kraken.flow.net.ntv,Kraken Net Flows (Native Units),The net native units value sent or withdrawn to/from Kraken that interval.,True,Coinmetrics +addr.act.sent.cnt,Active Addresses Count (Sent),The sum count of unique addresses that were active in the network (as an originator of a ledger change) that interval.,True,Coinmetrics +exch.sply.gemini.ntv,Supply on Gemini (Native Units),The sum in native units held by Gemini at the end of that interval.,True,Coinmetrics +fees.ntv,Total Fees (Native Units),The sum of all fees paid to miners in native units. Fees do not include new issuance.,False,Coinmetrics +new.iss.ntv,New Issuance (Native Units),"The sum of new native units issued that interval. Only those native units that are issued by a protocol-mandated continuous emission schedule are included (i.e., units manually released from escrow or otherwise disbursed are not included).",False,Coinmetrics +sply.addr.bal.1k.ntv,Supply in addresses with balance greater than 1K native units,"The sum of all native units being held in addresses whose balance was 1K native units or greater at the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +addr.bal.1k.cnt,Addresses with balance greater than $1K,"The sum count of unique addresses holding at least one thousand dollars' worth of native units as of the end of that interval. Only native units are considered (e.g., an address with less than X ETH but with more than X in ERC-20 tokens would not be considered).",True,Coinmetrics +exch.bitfinex.flow.out,Bitfinex Withdrawals,The sum in US dollars withdrawn from Bitfinex that interval.,True,Coinmetrics +exch.kraken.flow.out,Kraken Withdrawals,The sum in US dollars withdrawn from Kraken that interval.,True,Coinmetrics +sply.act.2y,2 Year Active Supply,The sum of unique native units that transacted at least once in the trailing 2 years up to the end of that interval. Native units that transacted more than once are only counted once.,True,Coinmetrics diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_coin_tokenomics[aave].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_coin_tokenomics[aave].csv new file mode 100644 index 00000000000..d714b33febb --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_coin_tokenomics[aave].csv @@ -0,0 +1,5 @@ +,Metric,Value +0,Block time [min],0.0 +1,Total Supply,16000000.0 +2,Max Supply,16000000.0 +3,Circulating Supply,13699679.287590466 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_1.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_1.csv new file mode 100644 index 00000000000..91e4f20edc9 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_1.csv @@ -0,0 +1,2 @@ +,Title,Start Date,Type,End Date,Tokens Allocated,Price [$],Amount Collected [$] +0,Token Sale,2014-07-22,Public,2014-09-02,576000000,0.31,18300000 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_2.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_2.csv new file mode 100644 index 00000000000..e16c76dff88 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_2.csv @@ -0,0 +1 @@ +"" diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_3.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_3.csv new file mode 100644 index 00000000000..97f724dda07 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[ETH]_3.csv @@ -0,0 +1,7 @@ +,Metric,Value +0,Genesis Date,2015-07-30 +1,Type,Crowdsale +2,Total Supply,72.004 M +3,Investors [%],83.47 +4,Organization/Founders [%],16.53 +5,Rewards/Airdrops [%], diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_1.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_1.csv new file mode 100644 index 00000000000..91e4f20edc9 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_1.csv @@ -0,0 +1,2 @@ +,Title,Start Date,Type,End Date,Tokens Allocated,Price [$],Amount Collected [$] +0,Token Sale,2014-07-22,Public,2014-09-02,576000000,0.31,18300000 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_2.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_2.csv new file mode 100644 index 00000000000..e16c76dff88 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_2.csv @@ -0,0 +1 @@ +"" diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_3.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_3.csv new file mode 100644 index 00000000000..97f724dda07 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_fundraising[eth]_3.csv @@ -0,0 +1,7 @@ +,Metric,Value +0,Genesis Date,2015-07-30 +1,Type,Crowdsale +2,Total Supply,72.004 M +3,Investors [%],83.47 +4,Organization/Founders [%],16.53 +5,Rewards/Airdrops [%], diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_governance[ETH]_1.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_governance[ETH]_1.csv new file mode 100644 index 00000000000..5ea3b0617bc --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_governance[ETH]_1.csv @@ -0,0 +1,12 @@ +,Metric,Value +0,Type,No On-Chain Governance +1,Details,"While Ethereum does not have an official on-chain governance model, it does have a history with coin voting. The three instances listed below are examples of loosely couple coin voting: +- [DAO proposal votes](https://daostats.github.io/proposals.html) +- [The DAO Carbonvote](http://v1.carbonvote.com/) +- [The EIP 186/649/669 Carbonvote](http://carbonvote.com/) + +Loosely coupled coin voting still coordinates the details of the proposal off-chain, but participants submit their votes on-chain, with each vote weighted by the total amount of ether held by that address. Despite the correlation between voting weight and tokens held, users do not submit tokens alongside their votes and are therefore not subject to any direct financial burden. Hence, the loosely coupled label given to this style of governance by Vitalik Buterin. + +Ethereum does not have any examples of coin voting as a built-in layer-1 protocol feature (referred to as tightly couple coin voting). But networks miners engage in a tightly couple voting process when determining whether to change the block gas limit. + +See more details in Vitalik Buterin's [blog post](https://vitalik.ca/general/2017/12/17/voting.html) on blockchain governance" diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_governance[eth]_1.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_governance[eth]_1.csv new file mode 100644 index 00000000000..5ea3b0617bc --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_governance[eth]_1.csv @@ -0,0 +1,12 @@ +,Metric,Value +0,Type,No On-Chain Governance +1,Details,"While Ethereum does not have an official on-chain governance model, it does have a history with coin voting. The three instances listed below are examples of loosely couple coin voting: +- [DAO proposal votes](https://daostats.github.io/proposals.html) +- [The DAO Carbonvote](http://v1.carbonvote.com/) +- [The EIP 186/649/669 Carbonvote](http://carbonvote.com/) + +Loosely coupled coin voting still coordinates the details of the proposal off-chain, but participants submit their votes on-chain, with each vote weighted by the total amount of ether held by that address. Despite the correlation between voting weight and tokens held, users do not submit tokens alongside their votes and are therefore not subject to any direct financial burden. Hence, the loosely coupled label given to this style of governance by Vitalik Buterin. + +Ethereum does not have any examples of coin voting as a built-in layer-1 protocol feature (referred to as tightly couple coin voting). But networks miners engage in a tightly couple voting process when determining whether to change the block gas limit. + +See more details in Vitalik Buterin's [blog post](https://vitalik.ca/general/2017/12/17/voting.html) on blockchain governance" diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[ETH].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[ETH].csv new file mode 100644 index 00000000000..e16c76dff88 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[ETH].csv @@ -0,0 +1 @@ +"" diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[ETH]_1.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[ETH]_1.csv new file mode 100644 index 00000000000..fa9ba12b292 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[ETH]_1.csv @@ -0,0 +1,40 @@ +,Name,Description +0,Electric Capital,"Electric Capital is a crypto asset management firm. They invest in tokens that are Programmable Money. Electric Capital invests in both liquid and illiquid tokens that are emerging stores of value and rooted in novel technology. The firm was started by technology entrepreneurs, engineers, and successful investors. Before Electric Capital, the founders started six companies (five acquired), invested in 100+ technology startups with a cumulative market cap in the tens of billions, and served as executives at technology companies such as Facebook, Google, and Twitter. They have been investing personally in cryptocurrencies since 2013 and were early believers in Bitcoin, Ethereum, and Monero." +1,Pantera Capital,"Pantera Capital is an investment firm focused exclusively on ventures, tokens, and projects related to blockchain tech, digital currency, and crypto assets." +2,8 Decimal Capital,"8 Decimal Capital is a multi-strategy investment firm focused on both token and equity investment. They currently have more than 30 portfolio companies, and an AUM of 60M USD. The investment team consists of more than 10 venture capital veterans, researchers, and trading professionals. 8 Decimal thematically invest in core infrastructure layer projects that address security, scalability and privacy, provide a full suite of post investment value add to our portfolio companies." +3,HASHED,"To empower networks and innovators +in building the decentralized future." +4,KR1,KR1 is a European digital asset investment company supporting early stage decentralised and open source blockchain projects. +5,Three Arrows Capital,"Three Arrows Capital Pte. Ltd. is a hedge fund manager established in 2012 and focused on providing superior risk-adjusted returns, founded by Su Zhu and Kyle Davies." +6,CMT Digital,"CMT Digital, a division of the CMT Group, is focused on crypto asset trading, blockchain technology investments, and legal/policy engagement in the crypto asset / blockchain technology industry. Beginning in late 2013, under the leadership of Colleen Sullivan, the firm immersed itself in understanding the bitcoin protocol and took an active role in shaping the regulatory landscape for crypto assets. Accustomed to operating in highly regulated markets, CMT Digital participates in global discussions on regulation, policy, and best practices in the crypto asset and blockchain space." +7,Alameda Research,"Alameda Research was founded in October 2017. It manages over $100 million in digital assets and trades $600 million to $1.5 billion per day across thousands of products: all major coins and altcoins, as well as their derivatives. " +8,Boost VC,"Boost VC is the #1 accelerator in the world for Crypto and VR startups and is committed to making science fiction technologies a reality. +Since 2012, we’ve funded 250+ companies who have gone on to raise an additional $1 billion and are actively changing the world." +9,"Winklevoss Capital Management, LLC",Winklevoss Capital is a family office founded by Tyler Winklevoss and Cameron Winklevoss. +10,M31 Capital,"M31 Capital is a global investment firm focused on cryptoassets & blockchain technology. The firm restricts itself to cryptoasset-specific investment strategies, including both direct token investments as well as select active network participation opportunities" +11,Multicoin Capital,A thesis-driven cryptofund offering LPs venture capital economics with all the advantages of public market liquidity +12,Outlier Ventures,"Outlier Ventures has been backing Web 3 founders since 2014 and is the world’s leading Web 3 accelerator program on track to accelerate up to 100 startups and protocols in 2021 through both Ascent and their earlier pre-seed/seed program (Base Camp). + +Both Base Camp and Ascent recruit at intervals throughout the year, looking for founders accelerating the open metaverse thesis by launching token networks. Specializing in a New Data Economy, NFTs, and DeFi they bring together a network of 1,000 of the world’s leading Web 3 founders, protocols, and VCs to mentor and invest." +13,Paradigm,A digital asset investment firm +14,Maven 11 Capital,"Maven 11 is a prominent European investment firm solely focused on DLT / blockchain tech related ventures, tokens, digital currencies and digital assets. We are a diverse team of serial entrepreneurs and traditional finance professionals and above all passionate believers that blockchain technology will fundamentally change economic and social structures." +15,Delphi Digital,Delphi Digital is an independent research and consulting boutique specializing in the digital asset market. +16,8Decimal Capital,- +17,Jump Capital,"Jump Capital is an expansion stage venture firm with operating DNA at its core. We offer unparalleled institutional resources through Jump’s ecosystem, including access to a broad network, top research labs and academic institutions advancing the state of the art in healthcare, high-performance computing, data mining, and machine learning." +18,Blocktree Capital,"BlockTree Capital is an investment and venture firm focused exclusively on ventures, tokens, and projects related to blockchain technology, digital currency, and crypto assets." +19,ValueNet Capital,ValueNet Capital is a venture fund focused exclusively in investing on Blockchain technologies. It has strong relationships with some of the most promising entrepreneurs and other top investors in the space. +20,Astronaut Capital,"Astronaut Capital is a licensed asset manager (CIMA: 1491696) focused on providing an outperforming investment vehicle to retail, sophisticated and institutional investors. ASTRO is a close-ended Erc-20 token which has been created to service the needs of the crypto community. The token focuses on exposure to a diversified portfolio including ICO's, cryptocurrencies and altcoins." +21,How 2 Ventures,"A Blockchain Venture Capital, Digital Asset & Cryptocurrency Hedge Fund. How 2 Ventures five-point strategy focuses on several areas of investment within the Blockchain startup, and Digital Asset & Cryptocurrency markets: 1. Emerging Blockchain Technology (pre-ICO & ICO investments). 2. Established Blockchain networks’ digital assets & cryptocurrencies (forks, airdrops, etc.). 3. Emerging Blockchain networks’ digital assets & cryptocurrencies (growth, adoption, etc.). 4. Leverage trading during periods of volatility to increase returns (BTC, ETH vs. alternative coins). 5. Capitalize on swings in the market using alpha theory (-2, -1, 0, 1, 2)" +22,1Confirmation,A venture fund that seeks to fund exceptional founders who build to advance the decentralization of the web and society +23,SNZ,- +24,Kenetic Capital,Kenetic is a proprietary trading and investment firm focused on digital assets and blockchain related companies. We have developed technology to facilitate our quantitative trading strategies and offer various digital asset related structured products to counterparts. +25,Electric Capital,- +26,LD Capital,- +27,Union Square Ventures,USV is a small collegial partnership that manages over $1B across seven funds. +28,Placeholder VC,Placeholder is a venture capital partnership that invests in decentralized information networks. +29,Fabric Ventures,Investing in decentralised data networks powering the shift towards human-centric computing +30,Boost VC,"The Boost VC Accelerator has invested $500k in Sci-Fi Founders. 250+ companies funded. Crypto, VR, space, AI, robotics, biotech, Sci-Fi." +31,Digital Currency Group,"Digital Currency Group (formerly known as the Bitcoin Opportunity Fund) is an investment firm focused on early seed rounds in cryptocurrency firms focusing on building out the infrastructure for the industry. It was founded by fintech entrepreneur Barry Silbert, who also founded SecondMarket, a private market for illiquid assets such as startup stock options. As a general rule, their investments focus on equity in companies rather than tokens, though they do purchase and hold cryptocurrencies. DCG also owns and operates CoinDesk, a well-known media company in the space, Genesis Trading, a bitcoin brokerage firm, and Grayscale Investments, a digital currency asset management firm. DCG has made over 100 investments in the space including well-known startups like Protocol Labs, Coinbase, and Ripple." +32,a16z Crypto,"a16z crypto is the blockchain and cryptoasset investment arm of Venture Capital firm Andreessen Horowitz. The fund was launched with $300 million to invest in crypto companies and protocols. a16z crypto is structured to hold investments for 10+ years and invest throughout various market cycles. Along with capital a16z Crypto provides support from the a16z team to assist startups with executive and technical recruiting, regulatory affairs, communications and marketing, and general startup management. +" +33,Galaxy Digital,"Galaxy Digital is a diversified, multi-service merchant bank dedicated to the digital assets and blockchain technology industry. Galaxy Digital’s multi-disciplinary team has extensive experience spanning investing, portfolio management, capital markets, operations, and blockchain technology. Galaxy Digital currently operates four distinct business lines, which include: Trading (arbitrage, macro, market making/OTC), Asset Management (management of external capital across passive and ecosystem funds), Principal Investing (private equity, venture, public equity, ICO investments, Pre-ICO investments, and liquid and illiquid cryptocurrencies), and Advisory (capital markets, M&A/restructuring, and technical consulting services to both start-ups and established institutions). Galaxy Digital’s CEO and Founder is Michael Novogratz." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[eth].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[eth].csv new file mode 100644 index 00000000000..e16c76dff88 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[eth].csv @@ -0,0 +1 @@ +"" diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[eth]_1.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[eth]_1.csv new file mode 100644 index 00000000000..fa9ba12b292 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_investors[eth]_1.csv @@ -0,0 +1,40 @@ +,Name,Description +0,Electric Capital,"Electric Capital is a crypto asset management firm. They invest in tokens that are Programmable Money. Electric Capital invests in both liquid and illiquid tokens that are emerging stores of value and rooted in novel technology. The firm was started by technology entrepreneurs, engineers, and successful investors. Before Electric Capital, the founders started six companies (five acquired), invested in 100+ technology startups with a cumulative market cap in the tens of billions, and served as executives at technology companies such as Facebook, Google, and Twitter. They have been investing personally in cryptocurrencies since 2013 and were early believers in Bitcoin, Ethereum, and Monero." +1,Pantera Capital,"Pantera Capital is an investment firm focused exclusively on ventures, tokens, and projects related to blockchain tech, digital currency, and crypto assets." +2,8 Decimal Capital,"8 Decimal Capital is a multi-strategy investment firm focused on both token and equity investment. They currently have more than 30 portfolio companies, and an AUM of 60M USD. The investment team consists of more than 10 venture capital veterans, researchers, and trading professionals. 8 Decimal thematically invest in core infrastructure layer projects that address security, scalability and privacy, provide a full suite of post investment value add to our portfolio companies." +3,HASHED,"To empower networks and innovators +in building the decentralized future." +4,KR1,KR1 is a European digital asset investment company supporting early stage decentralised and open source blockchain projects. +5,Three Arrows Capital,"Three Arrows Capital Pte. Ltd. is a hedge fund manager established in 2012 and focused on providing superior risk-adjusted returns, founded by Su Zhu and Kyle Davies." +6,CMT Digital,"CMT Digital, a division of the CMT Group, is focused on crypto asset trading, blockchain technology investments, and legal/policy engagement in the crypto asset / blockchain technology industry. Beginning in late 2013, under the leadership of Colleen Sullivan, the firm immersed itself in understanding the bitcoin protocol and took an active role in shaping the regulatory landscape for crypto assets. Accustomed to operating in highly regulated markets, CMT Digital participates in global discussions on regulation, policy, and best practices in the crypto asset and blockchain space." +7,Alameda Research,"Alameda Research was founded in October 2017. It manages over $100 million in digital assets and trades $600 million to $1.5 billion per day across thousands of products: all major coins and altcoins, as well as their derivatives. " +8,Boost VC,"Boost VC is the #1 accelerator in the world for Crypto and VR startups and is committed to making science fiction technologies a reality. +Since 2012, we’ve funded 250+ companies who have gone on to raise an additional $1 billion and are actively changing the world." +9,"Winklevoss Capital Management, LLC",Winklevoss Capital is a family office founded by Tyler Winklevoss and Cameron Winklevoss. +10,M31 Capital,"M31 Capital is a global investment firm focused on cryptoassets & blockchain technology. The firm restricts itself to cryptoasset-specific investment strategies, including both direct token investments as well as select active network participation opportunities" +11,Multicoin Capital,A thesis-driven cryptofund offering LPs venture capital economics with all the advantages of public market liquidity +12,Outlier Ventures,"Outlier Ventures has been backing Web 3 founders since 2014 and is the world’s leading Web 3 accelerator program on track to accelerate up to 100 startups and protocols in 2021 through both Ascent and their earlier pre-seed/seed program (Base Camp). + +Both Base Camp and Ascent recruit at intervals throughout the year, looking for founders accelerating the open metaverse thesis by launching token networks. Specializing in a New Data Economy, NFTs, and DeFi they bring together a network of 1,000 of the world’s leading Web 3 founders, protocols, and VCs to mentor and invest." +13,Paradigm,A digital asset investment firm +14,Maven 11 Capital,"Maven 11 is a prominent European investment firm solely focused on DLT / blockchain tech related ventures, tokens, digital currencies and digital assets. We are a diverse team of serial entrepreneurs and traditional finance professionals and above all passionate believers that blockchain technology will fundamentally change economic and social structures." +15,Delphi Digital,Delphi Digital is an independent research and consulting boutique specializing in the digital asset market. +16,8Decimal Capital,- +17,Jump Capital,"Jump Capital is an expansion stage venture firm with operating DNA at its core. We offer unparalleled institutional resources through Jump’s ecosystem, including access to a broad network, top research labs and academic institutions advancing the state of the art in healthcare, high-performance computing, data mining, and machine learning." +18,Blocktree Capital,"BlockTree Capital is an investment and venture firm focused exclusively on ventures, tokens, and projects related to blockchain technology, digital currency, and crypto assets." +19,ValueNet Capital,ValueNet Capital is a venture fund focused exclusively in investing on Blockchain technologies. It has strong relationships with some of the most promising entrepreneurs and other top investors in the space. +20,Astronaut Capital,"Astronaut Capital is a licensed asset manager (CIMA: 1491696) focused on providing an outperforming investment vehicle to retail, sophisticated and institutional investors. ASTRO is a close-ended Erc-20 token which has been created to service the needs of the crypto community. The token focuses on exposure to a diversified portfolio including ICO's, cryptocurrencies and altcoins." +21,How 2 Ventures,"A Blockchain Venture Capital, Digital Asset & Cryptocurrency Hedge Fund. How 2 Ventures five-point strategy focuses on several areas of investment within the Blockchain startup, and Digital Asset & Cryptocurrency markets: 1. Emerging Blockchain Technology (pre-ICO & ICO investments). 2. Established Blockchain networks’ digital assets & cryptocurrencies (forks, airdrops, etc.). 3. Emerging Blockchain networks’ digital assets & cryptocurrencies (growth, adoption, etc.). 4. Leverage trading during periods of volatility to increase returns (BTC, ETH vs. alternative coins). 5. Capitalize on swings in the market using alpha theory (-2, -1, 0, 1, 2)" +22,1Confirmation,A venture fund that seeks to fund exceptional founders who build to advance the decentralization of the web and society +23,SNZ,- +24,Kenetic Capital,Kenetic is a proprietary trading and investment firm focused on digital assets and blockchain related companies. We have developed technology to facilitate our quantitative trading strategies and offer various digital asset related structured products to counterparts. +25,Electric Capital,- +26,LD Capital,- +27,Union Square Ventures,USV is a small collegial partnership that manages over $1B across seven funds. +28,Placeholder VC,Placeholder is a venture capital partnership that invests in decentralized information networks. +29,Fabric Ventures,Investing in decentralised data networks powering the shift towards human-centric computing +30,Boost VC,"The Boost VC Accelerator has invested $500k in Sci-Fi Founders. 250+ companies funded. Crypto, VR, space, AI, robotics, biotech, Sci-Fi." +31,Digital Currency Group,"Digital Currency Group (formerly known as the Bitcoin Opportunity Fund) is an investment firm focused on early seed rounds in cryptocurrency firms focusing on building out the infrastructure for the industry. It was founded by fintech entrepreneur Barry Silbert, who also founded SecondMarket, a private market for illiquid assets such as startup stock options. As a general rule, their investments focus on equity in companies rather than tokens, though they do purchase and hold cryptocurrencies. DCG also owns and operates CoinDesk, a well-known media company in the space, Genesis Trading, a bitcoin brokerage firm, and Grayscale Investments, a digital currency asset management firm. DCG has made over 100 investments in the space including well-known startups like Protocol Labs, Coinbase, and Ripple." +32,a16z Crypto,"a16z crypto is the blockchain and cryptoasset investment arm of Venture Capital firm Andreessen Horowitz. The fund was launched with $300 million to invest in crypto companies and protocols. a16z crypto is structured to hold investments for 10+ years and invest throughout various market cycles. Along with capital a16z Crypto provides support from the a16z team to assist startups with executive and technical recruiting, regulatory affairs, communications and marketing, and general startup management. +" +33,Galaxy Digital,"Galaxy Digital is a diversified, multi-service merchant bank dedicated to the digital assets and blockchain technology industry. Galaxy Digital’s multi-disciplinary team has extensive experience spanning investing, portfolio management, capital markets, operations, and blockchain technology. Galaxy Digital currently operates four distinct business lines, which include: Trading (arbitrage, macro, market making/OTC), Asset Management (management of external capital across passive and ecosystem funds), Principal Investing (private equity, venture, public equity, ICO investments, Pre-ICO investments, and liquid and illiquid cryptocurrencies), and Advisory (capital markets, M&A/restructuring, and technical consulting services to both start-ups and established institutions). Galaxy Digital’s CEO and Founder is Michael Novogratz." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_links[ETH].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_links[ETH].csv new file mode 100644 index 00000000000..67f81e754e6 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_links[ETH].csv @@ -0,0 +1,8 @@ +,Name,Link +0,Whitepaper,https://ethereum.org/en/whitepaper/ +1,Github,https://github.com/ethereum +2,Website,https://www.ethereum.org/ +3,Twitter,https://twitter.com/ethereum +4,Reddit,https://www.reddit.com/r/ethereum/ +5,Yellow Paper,https://ethereum.github.io/yellowpaper/paper.pdf +6,Blog,https://blog.ethereum.org/ diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_links[eth].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_links[eth].csv new file mode 100644 index 00000000000..67f81e754e6 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_links[eth].csv @@ -0,0 +1,8 @@ +,Name,Link +0,Whitepaper,https://ethereum.org/en/whitepaper/ +1,Github,https://github.com/ethereum +2,Website,https://www.ethereum.org/ +3,Twitter,https://twitter.com/ethereum +4,Reddit,https://www.reddit.com/r/ethereum/ +5,Yellow Paper,https://ethereum.github.io/yellowpaper/paper.pdf +6,Blog,https://blog.ethereum.org/ diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_marketcap_dominance[BTC-1d-2022-01-10-2022-03-08].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_marketcap_dominance[BTC-1d-2022-01-10-2022-03-08].csv index 282dcc73fe6..0a0b4f7ba7f 100644 --- a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_marketcap_dominance[BTC-1d-2022-01-10-2022-03-08].csv +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_marketcap_dominance[BTC-1d-2022-01-10-2022-03-08].csv @@ -1,4 +1,4 @@ -timestamp,marketcap_dominance +timestamp,values 2022-01-10,39.861913510152284 2022-01-11,40.45237557634742 2022-01-12,39.86380264568372 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_marketcap_dominance[btc-1d-2022-01-10-2022-03-08].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_marketcap_dominance[btc-1d-2022-01-10-2022-03-08].csv new file mode 100644 index 00000000000..0a0b4f7ba7f --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_marketcap_dominance[btc-1d-2022-01-10-2022-03-08].csv @@ -0,0 +1,59 @@ +timestamp,values +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 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_messari_timeseries[BTC-1d-2022-01-10-2022-03-08-sply.circ].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_messari_timeseries[BTC-1d-2022-01-10-2022-03-08-sply.circ].csv new file mode 100644 index 00000000000..c84f09dabfa --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_messari_timeseries[BTC-1d-2022-01-10-2022-03-08-sply.circ].csv @@ -0,0 +1,59 @@ +timestamp,values +2022-01-10,18924506 +2022-01-11,18925418 +2022-01-12,18926375 +2022-01-13,18927281 +2022-01-14,18928387 +2022-01-15,18929381 +2022-01-16,18930381 +2022-01-17,18931525 +2022-01-18,18932537 +2022-01-19,18933375 +2022-01-20,18934462 +2022-01-21,18935512 +2022-01-22,18936362 +2022-01-23,18937175 +2022-01-24,18938075 +2022-01-25,18939006 +2022-01-26,18939962 +2022-01-27,18940737 +2022-01-28,18941581 +2022-01-29,18942550 +2022-01-30,18943462 +2022-01-31,18944393 +2022-02-01,18945281 +2022-02-02,18946237 +2022-02-03,18947206 +2022-02-04,18948131 +2022-02-05,18948918 +2022-02-06,18949706 +2022-02-07,18950681 +2022-02-08,18951493 +2022-02-09,18952493 +2022-02-10,18953362 +2022-02-11,18954275 +2022-02-12,18955137 +2022-02-13,18956275 +2022-02-14,18957287 +2022-02-15,18958306 +2022-02-16,18959368 +2022-02-17,18960343 +2022-02-18,18961325 +2022-02-19,18962168 +2022-02-20,18963075 +2022-02-21,18963993 +2022-02-22,18964768 +2022-02-23,18965706 +2022-02-24,18966643 +2022-02-25,18967468 +2022-02-26,18968318 +2022-02-27,18969106 +2022-02-28,18969931 +2022-03-01,18970906 +2022-03-02,18971887 +2022-03-03,18972756 +2022-03-04,18973675 +2022-03-05,18974537 +2022-03-06,18975318 +2022-03-07,18976125 +2022-03-08,18977062 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_messari_timeseries[btc-1d-2022-01-10-2022-03-08-sply.circ].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_messari_timeseries[btc-1d-2022-01-10-2022-03-08-sply.circ].csv new file mode 100644 index 00000000000..c84f09dabfa --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_messari_timeseries[btc-1d-2022-01-10-2022-03-08-sply.circ].csv @@ -0,0 +1,59 @@ +timestamp,values +2022-01-10,18924506 +2022-01-11,18925418 +2022-01-12,18926375 +2022-01-13,18927281 +2022-01-14,18928387 +2022-01-15,18929381 +2022-01-16,18930381 +2022-01-17,18931525 +2022-01-18,18932537 +2022-01-19,18933375 +2022-01-20,18934462 +2022-01-21,18935512 +2022-01-22,18936362 +2022-01-23,18937175 +2022-01-24,18938075 +2022-01-25,18939006 +2022-01-26,18939962 +2022-01-27,18940737 +2022-01-28,18941581 +2022-01-29,18942550 +2022-01-30,18943462 +2022-01-31,18944393 +2022-02-01,18945281 +2022-02-02,18946237 +2022-02-03,18947206 +2022-02-04,18948131 +2022-02-05,18948918 +2022-02-06,18949706 +2022-02-07,18950681 +2022-02-08,18951493 +2022-02-09,18952493 +2022-02-10,18953362 +2022-02-11,18954275 +2022-02-12,18955137 +2022-02-13,18956275 +2022-02-14,18957287 +2022-02-15,18958306 +2022-02-16,18959368 +2022-02-17,18960343 +2022-02-18,18961325 +2022-02-19,18962168 +2022-02-20,18963075 +2022-02-21,18963993 +2022-02-22,18964768 +2022-02-23,18965706 +2022-02-24,18966643 +2022-02-25,18967468 +2022-02-26,18968318 +2022-02-27,18969106 +2022-02-28,18969931 +2022-03-01,18970906 +2022-03-02,18971887 +2022-03-03,18972756 +2022-03-04,18973675 +2022-03-05,18974537 +2022-03-06,18975318 +2022-03-07,18976125 +2022-03-08,18977062 diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH].csv new file mode 100644 index 00000000000..dac8deaabfa --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH].csv @@ -0,0 +1,13 @@ +,Metric,Value +0,Project Details,"Ethereum is a distributed blockchain computing platform for smart contracts and decentralized applications. Its native token is ether (ETH), which primarily serves as a means of payment for transaction fees and as collateral for borrowing specific ERC-20 tokens within the decentralized finance (DeFi) sector." +1,Technology Details,"Account-based model +Ethereum is an account-based blockchain consisting of external accounts, which are controlled by a user’s private keys, and contract accounts, which are managed by contract code. External contracts can create and sign messages to send to both types of accounts, while contract accounts can only execute transactions automatically in response to a message they have received. The latter are what are known as smart contracts and enable the programmability of decentralized applications (dApps). + +Ethereum Virtual Machine +The heart of the Ethereum blockchain is known as the Ethereum Virtual Machine (EVM), which is the part of the protocol that executes transactions. It is a Turing complete virtual machine featuring a specific language “EVM bytecode,” typically written in a higher-level language called Solidity. Every operation on the EVM requires computational effort and memory. Ethereum node operators and miners provide these scarce resources to application developers and network users in exchange for gas. Different operations require different amounts of gas, and the user can specify how much they are willing to pay in ETH for each unit of gas. The amount of gas required for the transaction, along with the price paid, becomes the transaction cost. Every transaction also had a gas limit to prevent attacks from overloading blocks, which could slow down block production. + +Developer tools and token standards +Ethereum adopted Ethereum Request for Comment (ERC) 20 in late 2015 as a standard for Ethereum smart contracts to issue tokens on the platform. The majority of tokens built on Ethereum are ERC-20 compliant, meaning they follow a standard set of rules defining how they are created and used. Another more popular token rule set is ERC-721 with standardizes the issuance of non-fungible tokens (NFTs) where any given token is distinguishable from another making them popular for gaming. + +Ethereum 2.0 +As Ethereum transitions to Eth 2.0, it will undergo significant changes to its design. It will transition from Proof-of-Work to Proof-of-Stake and feature a sharding architecture. Currently, nodes must validate every transaction to maintain an updated global state. The new sharding model segments the network into various groups (called shards) and randomly assigns nodes to each shard. Rather than having to monitor the entire chain, nodes only have to validate their respective shard(s). Individual shards shared their transaction details with the Beacon Chain, which acts as the backbone of Ethereum 2.0. The Beacon Chain serves to validate the transactions on each shard, helping the entire network reach consensus. It also identifies dishonest validators and initiates penalties in the form of slashing, in which a portion of a validator's stake is removed from circulation. Eth 2.0 will also replace the EVM with Ethereum WebAssembly (eWASM), which intends to translate coding logic more efficiently and help improve Ethereum’s scalability." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_1.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_1.csv new file mode 100644 index 00000000000..85545a818da --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_1.csv @@ -0,0 +1,4 @@ +,Name,Link,License_type +0,go-ethereum,https://github.com/ethereum/go-ethereum,LGPL 3.0 +1,aleth,https://github.com/ethereum/aleth,GPL 3.0 +2,trinity,https://github.com/ethereum/trinity,MIT diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_2.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_2.csv new file mode 100644 index 00000000000..32a1143781a --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_2.csv @@ -0,0 +1,3 @@ +,Title,Date,Type,Details +0,Gas Economics,-,-,[https://github.com/LeastAuthority/ethereum-analyses/blob/master/GasEcon.md](https://github.com/LeastAuthority/ethereum-analyses/blob/master/GasEcon.md) +1,"Analysis of Ethash, Ethereum's Proof-of-Work puzzle",-,-,[https://github.com/LeastAuthority/ethereum-analyses/blob/master/PoW.md](https://github.com/LeastAuthority/ethereum-analyses/blob/master/PoW.md) diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_3.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_3.csv new file mode 100644 index 00000000000..de301bd8116 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[ETH]_3.csv @@ -0,0 +1,5 @@ +,Title,Date,Type,Details +0,The DAO Hack,2016-06-01 04:00:00+00:00,Hack,"An attacker exploited a bug in one of The DAO smart contracts, allowing the guilty party to steal 3.6 million ETH. A significant portion of the Ethereum community opted to reverse the transactions via a hard fork to recover the funds. However, a few stakeholders did not approve of a chain reversal, leading to a contentious hard fork. The legacy chain that did not reverse its transaction history is now known as Ethereum Classic (a href=""https://messari.io/asset/ethereum-classic""$ETC/a)." +1,Transaction spam attack,2016-09-22 04:00:00+00:00,DDoS Attack,"In Sep. 2016, just a few months after the DAO Hack and subsequent hard fork, Ethereum experienced a computational DDoS (distributed denial-of-service) attack in which the assailant(s) spammed the network by calling the EXTCODESIZE opcode roughly 50,000 times per block. The attack reduced the rate of block production by 50-66% as block validation times ballooned to 20-60 seconds (as opposed to 12-14 seconds). + +In response, Ethereum developers opted to initiate a hard fork at block 2463000 (Oct. 18, 2016) to implement EIP-150, which addressed the issue of underpriced operation codes to make future DDoS attacks cost-prohibitive. The Ethereum team initially proposed issuing a second hard fork upgrade to introduce EIP-158. But they later decided to replace it with EIP-161, which they included in the Spurious Dragon hard fork." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth].csv new file mode 100644 index 00000000000..dac8deaabfa --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth].csv @@ -0,0 +1,13 @@ +,Metric,Value +0,Project Details,"Ethereum is a distributed blockchain computing platform for smart contracts and decentralized applications. Its native token is ether (ETH), which primarily serves as a means of payment for transaction fees and as collateral for borrowing specific ERC-20 tokens within the decentralized finance (DeFi) sector." +1,Technology Details,"Account-based model +Ethereum is an account-based blockchain consisting of external accounts, which are controlled by a user’s private keys, and contract accounts, which are managed by contract code. External contracts can create and sign messages to send to both types of accounts, while contract accounts can only execute transactions automatically in response to a message they have received. The latter are what are known as smart contracts and enable the programmability of decentralized applications (dApps). + +Ethereum Virtual Machine +The heart of the Ethereum blockchain is known as the Ethereum Virtual Machine (EVM), which is the part of the protocol that executes transactions. It is a Turing complete virtual machine featuring a specific language “EVM bytecode,” typically written in a higher-level language called Solidity. Every operation on the EVM requires computational effort and memory. Ethereum node operators and miners provide these scarce resources to application developers and network users in exchange for gas. Different operations require different amounts of gas, and the user can specify how much they are willing to pay in ETH for each unit of gas. The amount of gas required for the transaction, along with the price paid, becomes the transaction cost. Every transaction also had a gas limit to prevent attacks from overloading blocks, which could slow down block production. + +Developer tools and token standards +Ethereum adopted Ethereum Request for Comment (ERC) 20 in late 2015 as a standard for Ethereum smart contracts to issue tokens on the platform. The majority of tokens built on Ethereum are ERC-20 compliant, meaning they follow a standard set of rules defining how they are created and used. Another more popular token rule set is ERC-721 with standardizes the issuance of non-fungible tokens (NFTs) where any given token is distinguishable from another making them popular for gaming. + +Ethereum 2.0 +As Ethereum transitions to Eth 2.0, it will undergo significant changes to its design. It will transition from Proof-of-Work to Proof-of-Stake and feature a sharding architecture. Currently, nodes must validate every transaction to maintain an updated global state. The new sharding model segments the network into various groups (called shards) and randomly assigns nodes to each shard. Rather than having to monitor the entire chain, nodes only have to validate their respective shard(s). Individual shards shared their transaction details with the Beacon Chain, which acts as the backbone of Ethereum 2.0. The Beacon Chain serves to validate the transactions on each shard, helping the entire network reach consensus. It also identifies dishonest validators and initiates penalties in the form of slashing, in which a portion of a validator's stake is removed from circulation. Eth 2.0 will also replace the EVM with Ethereum WebAssembly (eWASM), which intends to translate coding logic more efficiently and help improve Ethereum’s scalability." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_1.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_1.csv new file mode 100644 index 00000000000..85545a818da --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_1.csv @@ -0,0 +1,4 @@ +,Name,Link,License_type +0,go-ethereum,https://github.com/ethereum/go-ethereum,LGPL 3.0 +1,aleth,https://github.com/ethereum/aleth,GPL 3.0 +2,trinity,https://github.com/ethereum/trinity,MIT diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_2.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_2.csv new file mode 100644 index 00000000000..32a1143781a --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_2.csv @@ -0,0 +1,3 @@ +,Title,Date,Type,Details +0,Gas Economics,-,-,[https://github.com/LeastAuthority/ethereum-analyses/blob/master/GasEcon.md](https://github.com/LeastAuthority/ethereum-analyses/blob/master/GasEcon.md) +1,"Analysis of Ethash, Ethereum's Proof-of-Work puzzle",-,-,[https://github.com/LeastAuthority/ethereum-analyses/blob/master/PoW.md](https://github.com/LeastAuthority/ethereum-analyses/blob/master/PoW.md) diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_3.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_3.csv new file mode 100644 index 00000000000..de301bd8116 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_project_product_info[eth]_3.csv @@ -0,0 +1,5 @@ +,Title,Date,Type,Details +0,The DAO Hack,2016-06-01 04:00:00+00:00,Hack,"An attacker exploited a bug in one of The DAO smart contracts, allowing the guilty party to steal 3.6 million ETH. A significant portion of the Ethereum community opted to reverse the transactions via a hard fork to recover the funds. However, a few stakeholders did not approve of a chain reversal, leading to a contentious hard fork. The legacy chain that did not reverse its transaction history is now known as Ethereum Classic (a href=""https://messari.io/asset/ethereum-classic""$ETC/a)." +1,Transaction spam attack,2016-09-22 04:00:00+00:00,DDoS Attack,"In Sep. 2016, just a few months after the DAO Hack and subsequent hard fork, Ethereum experienced a computational DDoS (distributed denial-of-service) attack in which the assailant(s) spammed the network by calling the EXTCODESIZE opcode roughly 50,000 times per block. The attack reduced the rate of block production by 50-66% as block validation times ballooned to 20-60 seconds (as opposed to 12-14 seconds). + +In response, Ethereum developers opted to initiate a hard fork at block 2463000 (Oct. 18, 2016) to implement EIP-150, which addressed the issue of underpriced operation codes to make future DDoS attacks cost-prohibitive. The Ethereum team initially proposed issuing a second hard fork upgrade to introduce EIP-158. But they later decided to replace it with EIP-161, which they included in the Spurious Dragon hard fork." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_roadmap[ETH].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_roadmap[ETH].csv new file mode 100644 index 00000000000..658ca530220 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_roadmap[ETH].csv @@ -0,0 +1,71 @@ +,Title,Date,Type,Details +0,Olympic,2015-05-01 04:00:00+00:00,Testnet Launch,"Olympic was the final Ethereum proof-of-concept released before mainnet launch. Its stated purpose was to reward participants for testing the limits of the Ethereum design by “spamming the network with transactions and doing crazy things with the state.” The event included a competition that offered a pool of 25,000 ETH (a href=""https://messari.io/article/incentivizing-testnet-participation""~0.03% of Ethereum's initial supply/a) for the top miner and developer participants. Broad testnet engagement unearthed critical bugs and simple optimizations in the live system that the core team was able to identify and resolve pre-mainnet. Ethereum core developers deprecated Olympic when Frontier launched in favor of Mordon, the Frontier-equivalent public testnet." +1,Frontier (mainnet launch),2015-07-30 04:00:00+00:00,Network Launch,"Frontier marked the official 1.0 release of the Ethereum mainnet and introduced a series of new characteristics, including a block reward, a temporary gas block limit, and Canary contracts. The Frontier launch enabled miners to start receiving real ETH as a reward for their efforts, with the initial block subsidy consisting of five ETH per valid block. Version 1.0 also featured a hardcoded gas limit of 5000 gas per block to prevent any issues with node installation. The gas limit lasted only a few days post-launch before being automatically removed. To avoid unwanted chain forks, Frontier contained Canary contracts as well. Canary contracts gave Ethereum core developers the ability to stop specific operations or transactions before a miner wandered off to an orphaned chain. These contracts meant the final execution of transactions remained centralized in Ethereum's early stages." +2,Homestead,2016-03-14 04:00:00+00:00,Hard Fork Upgrade,"Homestead was the first planned hard fork of Ethereum and took place at block number 1,150,000. The upgrade removed the Canary contracts used in Frontier, thus eliminating the centralized process for executing transactions, and introduced the now widely-used Solidity smart contracts. It also included the (now deprecated) Mist wallet, the first user interface (UI) for storing and transacting tokens, as well as writing and deploying smart contracts. + +Furthermore, Homestead was one of the first implementations of a href=""https://messari.io/article/ethereum-improvement-proposal-eip""Ethereum Improvement Proposals (EIPs)/a, and the upgrade introduced three new EIPs upon activation: +EIP-2 (which included sub-proposals EIPs 2.1-2.4) ensured ACID compliance (all-or-nothing) for contract deployments and helped stabilize block times +EIP-7 added the DELETECALL opcode +EIP-8 equipped client software with the ability to accommodate future network protocol updates" +3,Spurious Dragon,2016-11-22 05:00:00+00:00,Hard Fork Upgrade,"The Spurious Dragon hard fork activated at block 2,675,000, which arrived on Nov. 22, 2019. The upgrade introduced four code changes: +EIP-155 offered protection from replay attacks +EIP-160 increase the price of the EXP opcode to make it more challenging to slow down the network with computationally intensive operations +EIP-161 makes it possible to remove large numbers of empty accounts to reduced blockchain state size +EIP-170 set a limit for the code size a smart contract can contain to prevent repetitive attacks on large pieces of code +" +4,Metropolis: Byzantium ,2017-10-16 04:00:00+00:00,Hard Fork Upgrade,"Byzantium was the first phase of the proposed Metropolis upgrade and activated at block 4,370,000. The Byzantium hard fork included nine EIPs, with EIP-100, EIP-658, and EIP-649, introducing the most significant code changes. +EIP-100 adjusted the difficulty formula to stabilize the ETH issuance rate +EIP-658 added a new field to transaction receipts to indicate success or failure +EIP-649 delayed the difficulty bomb (i.e., the Ethereum ""ice age"") by one year and reduced the block subsidy from five to three ETH +Details on the remaining Byzantium EIPs are available here. +" +5,Metropolis: Constantinople/St. Petersburg,2019-02-28 05:00:00+00:00,Hard Fork Upgrade,"Constantinople, the second phase of Metropolis, was initially scheduled to go live at block 7,080,000 (January 16, 2019). But on January 15, 2019, security auditing firm ChainSecurity discovered a vulnerability in one of the accepted EIPs that would enable a reentrancy attack (i.e., the opportunity for an attacker to steal user funds similar to The DAO hack). Core Ethereum developers and some projects running on the network voted to delay Constantinople until the developers closed the security loophole. + +After a month-long delay, Constantinople and its security patch, St. Petersburg, went live at block 7,280,000, introducing five new code changes to the network: +EIP-145 added Bitwise shifting instructions to the EVM, making the execution of shifts in smart contracts significantly cheaper +EIP-1052 expedited inter-smart contract verification (smart contract can verify each other via a hash rather than the entire code set) +EIP-1014 improved state channel integrations to facilitate the connection to off-chain scaling solutions +EIP-1283 reduced costs for executing multiple updates within a single transaction (aka the SSTORE opcode) +EIP-1234 delayed the difficulty bomb for another year and reduced the mining reward from three to two ETH per block (the reduction is also known as the ""Thirdening"") +" +6,Istanbul (Phase I),2019-12-07 05:00:00+00:00,Hard Fork Upgrade,"The first phase of Istanbul is set to activate at block 9,069,000, almost two months after its initially scheduled launch (Oct. 16, 2019). Istanbul Phase I intends to introduce six new EIPs upon activation to help optimize opcode computational costs, improve denial-of-service attack security, and enhance the performance of layer-2 solutions using a href=""https://messari.io/article/zk-snark""ZK-SNARKs/a or a href=""https://messari.io/article/zk-stark""ZK-STARKs/a, among other advancements. The accepted EIPs include: +EIP-152 adds the ability to verify Zcash-to-Ethereum atomic swaps +EIP-1108 reduces the costs for ZK-SNARKs +EIP-1344 improves smart contract ability, especially those used by layer-2 solutions, to track the correct base chain during a hard fork +EIP-1844 restructures the costs of specific a href=""https://messari.io/article/ethereum-virtual-machine""Ethereum Virtual Machine (EVM)/a opcodes to deter spamming attacks and to match each operation with its required level of computation +EIP-2028 reduces the cost of calling data within transactions and the fees associated with ZK-SNARKs and ZK-STARKs +EIP-2200 alters the cost of storage in the EVM and allows smart contracts to generate more creative functions +" +7,Muir Glacier,2020-01-02 05:00:00+00:00,Hard Fork Upgrade,"The Muir Glacier hard fork activated at block 9,200,000, which arrived on Jan. 2, 2020. The upgrade only included EIP-2384, which delayed Ethereum's inherent ""Difficulty Bomb"" for another 4,000,000 blocks (approximately 611 days) to prevent block times from increasing (and usability plummeting). Muir Glacier's abrupt arrival, less than a month after Istanbul, marked the third time Ethereum core developers opted to delay the Difficulty Bomb (aka Ice Age). + +Learn more: +Ethereum Muir Glacier Upgrade by the Ethereum Cat Herders" +8,Istanbul (Phase II): Berlin,,Hard Fork Upgrade,"The launch of Berlin, the second step of the Istanbul upgrade, should occur at some point in 2020. Ethereum core developers split Istanbul into two phases because two of the EIPs up for discussion require extensive testing and development before launch. At the moment, core devs have approved and raised two EIPs to accepted status. There are two other proposed EIPs that may be ready in time for Berlin. + +Accepted +EIP-2315 implements simple subroutines for the EVM which could lower gas costs and make states analysis easier +EIP 2537 (which superseded EIP-1962) implements a single BLS curve to make it easier to deploy and manage rollup contracts and zk-SNARKs/STARKs + +Proposed +EIP-2046 reduces the gas cost for static calls made to precompiled contracts +EIP-2565 will re-price the ModExp precompile (EIP-198) to enable more cost-efficient verification of RSA signatures, verifiable delay functions (VDFs), and primality checks, among other functions + +Istanbul Phase II notably excludes any EIPs related to the difficulty bomb (i.e., the Ethereum ""ice age""). The core developers concluded, ""there's no major reason do it now"" because the difficulty bomb is only necessary once Ethereum 2.0 and its Proof-of-Stake (PoS) consensus mechanism are activated. Overlooking an Ice Age EIP for now also prevents any further delays in Berlin's development phase. + +Core devs and the greater Ethereum community also excludes the EIP-1057, the proposal for the now-infamous ProgPoW (short for Progressive Proof-of-Work). It aimed to alter Ethereum's hashing algorithm to close the performance efficiency gap between generalized and specialized mining hardware (otherwise known as ASICs). While GPU miners and some core devs favored the proposal, many in the community were vehemently against it. Therefore, all sides agree to a href=""https://messari.io/article/progpow-wars-ethereum-dev-call-places-a-spotlight-on-the-progpow-debate""not include ProgPoW/a in any upcoming forks as no protocol changes are worth triggering a network split + +Learn more: +Berlin EIPs spreadsheet" +9,Serenity Phase 0,2020-12-01 00:00:00+00:00,Network Launch,"Serenity Phase 0 marks Ethereum's initial transition to Ethereum 2.0. This initial phase will introduce the Beacon Chain, which will serve as the backbone for Ethereum 2.0's sharded network architecture. As opposed to Ethereum's current Proof-of-Work (PoW) blockchain, the Beacon Chain will use Casper FFG, a specific variation of Proof-of-Stake (PoS), and a system of validators to confirm transactions and inhibit Sybil attacks. + +Ethereum core developers split the Serenity upgrade into three phases to optimize the development process and limit deployment risks. The specifications for this first phase include: +Beacon Chain is the core of the Ethereum 2.0 system; it manages the PoS protocol for itself and all of the individual shard chains. The Beacon chain will use Casper the Friendly Finality Gadget (Casper FFG) to ensure transaction finality. +Fork Choice enables validators' clients to automatically select the right chain when the Phase 0 Serenity fork is initiated +Deposit Contract allows Ethereum stakeholders to transfer funds from ETH 1.0 to ETH 2.0 and claim rights to a validator role on the new PoS chain +Honest Validator dictates the expected behavior of an ""honest validator and slashing specifications with respect to Phase 0 of ETH 2.0 + +It is essential to note the launch of Phase 0 will not immediately replace Ethereum 1.0 (also known as Ethereum 1.x). The two chains will coexist for at least until Serenity Phase 1.5 arrives, which marks when the current Ethereum chain will merge into the Ethereum 2.0 system a shard within the network. Running the legacy and future chains in parallel may cause ETH inflation to increase as both chains will simultaneously mint new tokens." +10,EIP-1559,,Network Change,"EIP-1559 was authored by Vitalik Buterin and Eric Conner, among others. It aims to replace Ethereum's ""first-price auction"" fee model with a base network fee that could change based on network demand. The goal is to create a more efficient fee market and simplify the gas payment process for client and application software, removing the potential for users to pay unnecessarily high gas fees. EIP-1559 also proposes burning the base network fee to help keep this fee low and ETH inflation in check." +11,Serenity Phase 1,,Network Upgrade,"Phase 1 will introduce 64 independent shard chains to the ETH 2.0 network. Shard chains will not execute state or keep track of account balances, as the phase intends to only test the construction and validity of shard chains with the Beacon chain. ETH 1.0 will continue to run in parallel with ETH 2.0 throughout this phase." +12,Serenity Phase 1.5: ETH1 <> ETH2 merge,,Network Change,"A proposal for merging the current Ethereum network with Ethereum 2.0 first introduced by Vitalik Buterin. The proposal intends to remove the Proof-of-Work (PoW) chain by moving everything onto the Beacon Chain on an accelerated schedule. This accelerated merge requires stateless clients on Ethereum 1.x, which would remove the need for most nodes to store the entire state altogether." +13,Serenity Phase 2,,Network Change,"The final phase of Serenity will add full-functionality to shard chains, enabling them to execute transactions and maintain account balances. It also introduces the eWASM virtual machine, which will replace the EVM." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_roadmap[eth].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_roadmap[eth].csv new file mode 100644 index 00000000000..658ca530220 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_roadmap[eth].csv @@ -0,0 +1,71 @@ +,Title,Date,Type,Details +0,Olympic,2015-05-01 04:00:00+00:00,Testnet Launch,"Olympic was the final Ethereum proof-of-concept released before mainnet launch. Its stated purpose was to reward participants for testing the limits of the Ethereum design by “spamming the network with transactions and doing crazy things with the state.” The event included a competition that offered a pool of 25,000 ETH (a href=""https://messari.io/article/incentivizing-testnet-participation""~0.03% of Ethereum's initial supply/a) for the top miner and developer participants. Broad testnet engagement unearthed critical bugs and simple optimizations in the live system that the core team was able to identify and resolve pre-mainnet. Ethereum core developers deprecated Olympic when Frontier launched in favor of Mordon, the Frontier-equivalent public testnet." +1,Frontier (mainnet launch),2015-07-30 04:00:00+00:00,Network Launch,"Frontier marked the official 1.0 release of the Ethereum mainnet and introduced a series of new characteristics, including a block reward, a temporary gas block limit, and Canary contracts. The Frontier launch enabled miners to start receiving real ETH as a reward for their efforts, with the initial block subsidy consisting of five ETH per valid block. Version 1.0 also featured a hardcoded gas limit of 5000 gas per block to prevent any issues with node installation. The gas limit lasted only a few days post-launch before being automatically removed. To avoid unwanted chain forks, Frontier contained Canary contracts as well. Canary contracts gave Ethereum core developers the ability to stop specific operations or transactions before a miner wandered off to an orphaned chain. These contracts meant the final execution of transactions remained centralized in Ethereum's early stages." +2,Homestead,2016-03-14 04:00:00+00:00,Hard Fork Upgrade,"Homestead was the first planned hard fork of Ethereum and took place at block number 1,150,000. The upgrade removed the Canary contracts used in Frontier, thus eliminating the centralized process for executing transactions, and introduced the now widely-used Solidity smart contracts. It also included the (now deprecated) Mist wallet, the first user interface (UI) for storing and transacting tokens, as well as writing and deploying smart contracts. + +Furthermore, Homestead was one of the first implementations of a href=""https://messari.io/article/ethereum-improvement-proposal-eip""Ethereum Improvement Proposals (EIPs)/a, and the upgrade introduced three new EIPs upon activation: +EIP-2 (which included sub-proposals EIPs 2.1-2.4) ensured ACID compliance (all-or-nothing) for contract deployments and helped stabilize block times +EIP-7 added the DELETECALL opcode +EIP-8 equipped client software with the ability to accommodate future network protocol updates" +3,Spurious Dragon,2016-11-22 05:00:00+00:00,Hard Fork Upgrade,"The Spurious Dragon hard fork activated at block 2,675,000, which arrived on Nov. 22, 2019. The upgrade introduced four code changes: +EIP-155 offered protection from replay attacks +EIP-160 increase the price of the EXP opcode to make it more challenging to slow down the network with computationally intensive operations +EIP-161 makes it possible to remove large numbers of empty accounts to reduced blockchain state size +EIP-170 set a limit for the code size a smart contract can contain to prevent repetitive attacks on large pieces of code +" +4,Metropolis: Byzantium ,2017-10-16 04:00:00+00:00,Hard Fork Upgrade,"Byzantium was the first phase of the proposed Metropolis upgrade and activated at block 4,370,000. The Byzantium hard fork included nine EIPs, with EIP-100, EIP-658, and EIP-649, introducing the most significant code changes. +EIP-100 adjusted the difficulty formula to stabilize the ETH issuance rate +EIP-658 added a new field to transaction receipts to indicate success or failure +EIP-649 delayed the difficulty bomb (i.e., the Ethereum ""ice age"") by one year and reduced the block subsidy from five to three ETH +Details on the remaining Byzantium EIPs are available here. +" +5,Metropolis: Constantinople/St. Petersburg,2019-02-28 05:00:00+00:00,Hard Fork Upgrade,"Constantinople, the second phase of Metropolis, was initially scheduled to go live at block 7,080,000 (January 16, 2019). But on January 15, 2019, security auditing firm ChainSecurity discovered a vulnerability in one of the accepted EIPs that would enable a reentrancy attack (i.e., the opportunity for an attacker to steal user funds similar to The DAO hack). Core Ethereum developers and some projects running on the network voted to delay Constantinople until the developers closed the security loophole. + +After a month-long delay, Constantinople and its security patch, St. Petersburg, went live at block 7,280,000, introducing five new code changes to the network: +EIP-145 added Bitwise shifting instructions to the EVM, making the execution of shifts in smart contracts significantly cheaper +EIP-1052 expedited inter-smart contract verification (smart contract can verify each other via a hash rather than the entire code set) +EIP-1014 improved state channel integrations to facilitate the connection to off-chain scaling solutions +EIP-1283 reduced costs for executing multiple updates within a single transaction (aka the SSTORE opcode) +EIP-1234 delayed the difficulty bomb for another year and reduced the mining reward from three to two ETH per block (the reduction is also known as the ""Thirdening"") +" +6,Istanbul (Phase I),2019-12-07 05:00:00+00:00,Hard Fork Upgrade,"The first phase of Istanbul is set to activate at block 9,069,000, almost two months after its initially scheduled launch (Oct. 16, 2019). Istanbul Phase I intends to introduce six new EIPs upon activation to help optimize opcode computational costs, improve denial-of-service attack security, and enhance the performance of layer-2 solutions using a href=""https://messari.io/article/zk-snark""ZK-SNARKs/a or a href=""https://messari.io/article/zk-stark""ZK-STARKs/a, among other advancements. The accepted EIPs include: +EIP-152 adds the ability to verify Zcash-to-Ethereum atomic swaps +EIP-1108 reduces the costs for ZK-SNARKs +EIP-1344 improves smart contract ability, especially those used by layer-2 solutions, to track the correct base chain during a hard fork +EIP-1844 restructures the costs of specific a href=""https://messari.io/article/ethereum-virtual-machine""Ethereum Virtual Machine (EVM)/a opcodes to deter spamming attacks and to match each operation with its required level of computation +EIP-2028 reduces the cost of calling data within transactions and the fees associated with ZK-SNARKs and ZK-STARKs +EIP-2200 alters the cost of storage in the EVM and allows smart contracts to generate more creative functions +" +7,Muir Glacier,2020-01-02 05:00:00+00:00,Hard Fork Upgrade,"The Muir Glacier hard fork activated at block 9,200,000, which arrived on Jan. 2, 2020. The upgrade only included EIP-2384, which delayed Ethereum's inherent ""Difficulty Bomb"" for another 4,000,000 blocks (approximately 611 days) to prevent block times from increasing (and usability plummeting). Muir Glacier's abrupt arrival, less than a month after Istanbul, marked the third time Ethereum core developers opted to delay the Difficulty Bomb (aka Ice Age). + +Learn more: +Ethereum Muir Glacier Upgrade by the Ethereum Cat Herders" +8,Istanbul (Phase II): Berlin,,Hard Fork Upgrade,"The launch of Berlin, the second step of the Istanbul upgrade, should occur at some point in 2020. Ethereum core developers split Istanbul into two phases because two of the EIPs up for discussion require extensive testing and development before launch. At the moment, core devs have approved and raised two EIPs to accepted status. There are two other proposed EIPs that may be ready in time for Berlin. + +Accepted +EIP-2315 implements simple subroutines for the EVM which could lower gas costs and make states analysis easier +EIP 2537 (which superseded EIP-1962) implements a single BLS curve to make it easier to deploy and manage rollup contracts and zk-SNARKs/STARKs + +Proposed +EIP-2046 reduces the gas cost for static calls made to precompiled contracts +EIP-2565 will re-price the ModExp precompile (EIP-198) to enable more cost-efficient verification of RSA signatures, verifiable delay functions (VDFs), and primality checks, among other functions + +Istanbul Phase II notably excludes any EIPs related to the difficulty bomb (i.e., the Ethereum ""ice age""). The core developers concluded, ""there's no major reason do it now"" because the difficulty bomb is only necessary once Ethereum 2.0 and its Proof-of-Stake (PoS) consensus mechanism are activated. Overlooking an Ice Age EIP for now also prevents any further delays in Berlin's development phase. + +Core devs and the greater Ethereum community also excludes the EIP-1057, the proposal for the now-infamous ProgPoW (short for Progressive Proof-of-Work). It aimed to alter Ethereum's hashing algorithm to close the performance efficiency gap between generalized and specialized mining hardware (otherwise known as ASICs). While GPU miners and some core devs favored the proposal, many in the community were vehemently against it. Therefore, all sides agree to a href=""https://messari.io/article/progpow-wars-ethereum-dev-call-places-a-spotlight-on-the-progpow-debate""not include ProgPoW/a in any upcoming forks as no protocol changes are worth triggering a network split + +Learn more: +Berlin EIPs spreadsheet" +9,Serenity Phase 0,2020-12-01 00:00:00+00:00,Network Launch,"Serenity Phase 0 marks Ethereum's initial transition to Ethereum 2.0. This initial phase will introduce the Beacon Chain, which will serve as the backbone for Ethereum 2.0's sharded network architecture. As opposed to Ethereum's current Proof-of-Work (PoW) blockchain, the Beacon Chain will use Casper FFG, a specific variation of Proof-of-Stake (PoS), and a system of validators to confirm transactions and inhibit Sybil attacks. + +Ethereum core developers split the Serenity upgrade into three phases to optimize the development process and limit deployment risks. The specifications for this first phase include: +Beacon Chain is the core of the Ethereum 2.0 system; it manages the PoS protocol for itself and all of the individual shard chains. The Beacon chain will use Casper the Friendly Finality Gadget (Casper FFG) to ensure transaction finality. +Fork Choice enables validators' clients to automatically select the right chain when the Phase 0 Serenity fork is initiated +Deposit Contract allows Ethereum stakeholders to transfer funds from ETH 1.0 to ETH 2.0 and claim rights to a validator role on the new PoS chain +Honest Validator dictates the expected behavior of an ""honest validator and slashing specifications with respect to Phase 0 of ETH 2.0 + +It is essential to note the launch of Phase 0 will not immediately replace Ethereum 1.0 (also known as Ethereum 1.x). The two chains will coexist for at least until Serenity Phase 1.5 arrives, which marks when the current Ethereum chain will merge into the Ethereum 2.0 system a shard within the network. Running the legacy and future chains in parallel may cause ETH inflation to increase as both chains will simultaneously mint new tokens." +10,EIP-1559,,Network Change,"EIP-1559 was authored by Vitalik Buterin and Eric Conner, among others. It aims to replace Ethereum's ""first-price auction"" fee model with a base network fee that could change based on network demand. The goal is to create a more efficient fee market and simplify the gas payment process for client and application software, removing the potential for users to pay unnecessarily high gas fees. EIP-1559 also proposes burning the base network fee to help keep this fee low and ETH inflation in check." +11,Serenity Phase 1,,Network Upgrade,"Phase 1 will introduce 64 independent shard chains to the ETH 2.0 network. Shard chains will not execute state or keep track of account balances, as the phase intends to only test the construction and validity of shard chains with the Beacon chain. ETH 1.0 will continue to run in parallel with ETH 2.0 throughout this phase." +12,Serenity Phase 1.5: ETH1 <> ETH2 merge,,Network Change,"A proposal for merging the current Ethereum network with Ethereum 2.0 first introduced by Vitalik Buterin. The proposal intends to remove the Proof-of-Work (PoW) chain by moving everything onto the Beacon Chain on an accelerated schedule. This accelerated merge requires stateless clients on Ethereum 1.x, which would remove the need for most nodes to store the entire state altogether." +13,Serenity Phase 2,,Network Change,"The final phase of Serenity will add full-functionality to shard chains, enabling them to execute transactions and maintain account balances. It also introduces the eWASM virtual machine, which will replace the EVM." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[ETH].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[ETH].csv new file mode 100644 index 00000000000..9d3671f073d --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[ETH].csv @@ -0,0 +1,17 @@ +,Name,Title,Description +0,Hudson Jameson,COO and Blockchain Lead at Oaken Innovations,- +1,Martin Swende,Security Lead at Ethereum Foundation,- +2,Vitalik Buterin,Co-Founder of Ethereum,"Vitalik is the creator of Ethereum. He first discovered blockchain and cryptocurrency technologies through Bitcoin in 2011, and was immediately excited by the technology and its potential. He cofounded Bitcoin Magazine in September 2011, and after two and a half years looking at what the existing blockchain technology and applications had to offer, wrote the Ethereum white paper in November 2013. He now leads Ethereum's research team, working on future versions of the Ethereum protocol." +3,Pooja Ranjan,Project Manager at Ethereum Cat Herders,- +4,Afri Schoedon,Release Manager at Parity Technologies,- +5,Greg Colvin,Designer and Developer at the Ethereum Foundation,- +6,Alexey Akhunov,Independent researcher and software developer,- +7,Tim Beiko,Product Manager at Pegasys,- +8,Peter Szilagyi,Core Software Developer at Ethereum Foundation,- +9,Joe Lubin,Founder of ConsenSys,"Joseph Lubin is a co-founder of blockchain computing platform Ethereum and the founder of Consensus Systems (ConsenSys), a blockchain venture studio. ConsenSys is one of the largest and fastest-growing companies in the blockchain technology space, building developer tools, decentralized applications, and solutions for enterprises and governments that harness the power of Ethereum. Headquartered in New York, ConsenSys also has a global presence, employing top entrepreneurs, computer scientists, software developers, and experts in enterprise delivery worldwide. + +Lubin graduated from Princeton University with a degree in Electrical Engineering and Computer Science. He worked in the Princeton Robotics Lab, at tomandandy music developing an autonomous music composition tool, and at private research firm Vision Applications Inc. building autonomous mobile robots. + +As a software engineer and consultant, Lubin worked with eMagine on the Identrus project and was involved in the founding and operation of a hedge fund with a partner. He held positions as Director of the New York office of Blacksmith Software Consulting, and VP of Technology in Private Wealth Management at Goldman Sachs. Through these posts, Lubin focused on the intersection of cryptography, engineering, and finance. + +Switching gears, Lubin moved to Kingston, Jamaica to work on projects in the music industry. Two years into his musical endeavors, Lubin co-founded the Ethereum Project and has been working on Ethereum and ConsenSys since January 2014." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[ETH]_1.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[ETH]_1.csv new file mode 100644 index 00000000000..dbc847712c0 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[ETH]_1.csv @@ -0,0 +1,9 @@ +,Name,Description +0,ConsenSys,ConsenSys is a global formation of technologists and entrepreneurs working to enable a decentralized world. +1,ConsenSys Software Inc,"ConsenSys Software Inc (formerly PegaSys) is the protocol engineering group at ConsenSys developing performant and dependable solutions for a wide range of enterprises to incorporate and involve the public-chain community and private chain work by enterprises. +" +2,Ethereum Cat Herders,A project dedicated to decentralizing Ethereum project management +3,Gnosis,- +4,Ethereum Foundation,"Ethereum is a decentralized platform that runs smart contracts: applications that run exactly as programmed without any possibility of downtime, censorship, fraud or third-party interference." +5,Status Research & Development GmbH,- +6,Prysmatic Labs,"Prsymatic Labs is developing Prysm, a full featured sharding client for Ethereum 2.0, that can process transactions as fast as possible." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[eth].csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[eth].csv new file mode 100644 index 00000000000..9d3671f073d --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[eth].csv @@ -0,0 +1,17 @@ +,Name,Title,Description +0,Hudson Jameson,COO and Blockchain Lead at Oaken Innovations,- +1,Martin Swende,Security Lead at Ethereum Foundation,- +2,Vitalik Buterin,Co-Founder of Ethereum,"Vitalik is the creator of Ethereum. He first discovered blockchain and cryptocurrency technologies through Bitcoin in 2011, and was immediately excited by the technology and its potential. He cofounded Bitcoin Magazine in September 2011, and after two and a half years looking at what the existing blockchain technology and applications had to offer, wrote the Ethereum white paper in November 2013. He now leads Ethereum's research team, working on future versions of the Ethereum protocol." +3,Pooja Ranjan,Project Manager at Ethereum Cat Herders,- +4,Afri Schoedon,Release Manager at Parity Technologies,- +5,Greg Colvin,Designer and Developer at the Ethereum Foundation,- +6,Alexey Akhunov,Independent researcher and software developer,- +7,Tim Beiko,Product Manager at Pegasys,- +8,Peter Szilagyi,Core Software Developer at Ethereum Foundation,- +9,Joe Lubin,Founder of ConsenSys,"Joseph Lubin is a co-founder of blockchain computing platform Ethereum and the founder of Consensus Systems (ConsenSys), a blockchain venture studio. ConsenSys is one of the largest and fastest-growing companies in the blockchain technology space, building developer tools, decentralized applications, and solutions for enterprises and governments that harness the power of Ethereum. Headquartered in New York, ConsenSys also has a global presence, employing top entrepreneurs, computer scientists, software developers, and experts in enterprise delivery worldwide. + +Lubin graduated from Princeton University with a degree in Electrical Engineering and Computer Science. He worked in the Princeton Robotics Lab, at tomandandy music developing an autonomous music composition tool, and at private research firm Vision Applications Inc. building autonomous mobile robots. + +As a software engineer and consultant, Lubin worked with eMagine on the Identrus project and was involved in the founding and operation of a hedge fund with a partner. He held positions as Director of the New York office of Blacksmith Software Consulting, and VP of Technology in Private Wealth Management at Goldman Sachs. Through these posts, Lubin focused on the intersection of cryptography, engineering, and finance. + +Switching gears, Lubin moved to Kingston, Jamaica to work on projects in the music industry. Two years into his musical endeavors, Lubin co-founded the Ethereum Project and has been working on Ethereum and ConsenSys since January 2014." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[eth]_1.csv b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[eth]_1.csv new file mode 100644 index 00000000000..dbc847712c0 --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/csv/test_messari_model/test_get_team[eth]_1.csv @@ -0,0 +1,9 @@ +,Name,Description +0,ConsenSys,ConsenSys is a global formation of technologists and entrepreneurs working to enable a decentralized world. +1,ConsenSys Software Inc,"ConsenSys Software Inc (formerly PegaSys) is the protocol engineering group at ConsenSys developing performant and dependable solutions for a wide range of enterprises to incorporate and involve the public-chain community and private chain work by enterprises. +" +2,Ethereum Cat Herders,A project dedicated to decentralizing Ethereum project management +3,Gnosis,- +4,Ethereum Foundation,"Ethereum is a decentralized platform that runs smart contracts: applications that run exactly as programmed without any possibility of downtime, censorship, fraud or third-party interference." +5,Status Research & Development GmbH,- +6,Prysmatic Labs,"Prsymatic Labs is developing Prysm, a full featured sharding client for Ethereum 2.0, that can process transactions as fast as possible." diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/test_dd_controller.py b/tests/openbb_terminal/cryptocurrency/due_diligence/test_dd_controller.py index 0d776803645..e5956d1fef3 100644 --- a/tests/openbb_terminal/cryptocurrency/due_diligence/test_dd_controller.py +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/test_dd_controller.py @@ -12,6 +12,7 @@ from openbb_terminal.cryptocurrency.due_diligence import dd_controller # pylint: disable=W0603 # pylint: disable=E1111 +MESSARI_TIMESERIES_DF = pd.DataFrame() COIN_MAP_DF = pd.Series( data={ @@ -65,6 +66,11 @@ def test_menu_with_queue(expected, mocker, queue): target=f"{path_controller}.DueDiligenceController.switch", return_value=["quit"], ) + # MOCK MESSARI_TIMESERIES_DF + mocker.patch( + target=f"{path_controller}.messari_model.get_available_timeseries", + return_value=MESSARI_TIMESERIES_DF, + ) result_menu = dd_controller.DueDiligenceController(queue=queue).menu() assert result_menu == expected @@ -100,6 +106,11 @@ def test_menu_without_queue_completion(mocker): target=f"{path_controller}.session.prompt", return_value="quit", ) + # MOCK MESSARI_TIMESERIES_DF + mocker.patch( + target=f"{path_controller}.messari_model.get_available_timeseries", + return_value=MESSARI_TIMESERIES_DF, + ) result_menu = dd_controller.DueDiligenceController(queue=None).menu() @@ -128,6 +139,12 @@ def test_menu_without_queue_sys_exit(mock_input, mocker): # MOCK USER INPUT mocker.patch("builtins.input", return_value=mock_input) + # MOCK MESSARI_TIMESERIES_DF + mocker.patch( + target=f"{path_controller}.messari_model.get_available_timeseries", + return_value=MESSARI_TIMESERIES_DF, + ) + # MOCK SWITCH class SystemExitSideEffect: def __init__(self): @@ -152,7 +169,14 @@ def test_menu_without_queue_sys_exit(mock_input, mocker): @pytest.mark.vcr(record_mode="none") @pytest.mark.record_stdout -def test_print_help(): +def test_print_help(mocker): + path_controller = "openbb_terminal.cryptocurrency.due_diligence.dd_controller" + + # MOCK MESSARI_TIMESERIES_DF + mocker.patch( + target=f"{path_controller}.messari_model.get_available_timeseries", + return_value=MESSARI_TIMESERIES_DF, + ) controller = dd_controller.DueDiligenceController(queue=None) controller.print_help() @@ -172,7 +196,14 @@ def test_print_help(): ), ], ) -def test_switch(an_input, expected_queue): +def test_switch(an_input, expected_queue, mocker): + path_controller = "openbb_terminal.cryptocurrency.due_diligence.dd_controller" + + # MOCK MESSARI_TIMESERIES_DF + mocker.patch( + target=f"{path_controller}.messari_model.get_available_timeseries", + return_value=MESSARI_TIMESERIES_DF, + ) controller = dd_controller.DueDiligenceController(queue=None) queue = controller.switch(an_input=an_input) @@ -183,6 +214,14 @@ def test_switch(an_input, expected_queue): def test_call_cls(mocker): mocker.patch("os.system") + path_controller = "openbb_terminal.cryptocurrency.due_diligence.dd_controller" + + # MOCK MESSARI_TIMESERIES_DF + mocker.patch( + target=f"{path_controller}.messari_model.get_available_timeseries", + return_value=MESSARI_TIMESERIES_DF, + ) + controller = dd_controller.DueDiligenceController(queue=None) controller.call_cls([]) @@ -216,7 +255,14 @@ def test_call_cls(mocker): ), ], ) -def test_call_func_expect_queue(expected_queue, func, queue): +def test_call_func_expect_queue(expected_queue, func, queue, mocker): + path_controller = "openbb_terminal.cryptocurrency.due_diligence.dd_controller" + + # MOCK MESSARI_TIMESERIES_DF + mocker.patch( + target=f"{path_controller}.messari_model.get_available_timeseries", + return_value=MESSARI_TIMESERIES_DF, + ) controller = dd_controller.DueDiligenceController(queue=queue) result = getattr(controller, func)([]) @@ -415,6 +461,12 @@ def test_call_func( return_value=COINBASE_SHOW_AVAILABLE_PAIRS_OF_GIVEN_SYMBOL, ) + # MOCK MESSARI_TIMESERIES_DF + mocker.patch( + target=f"{path_controller}.messari_model.get_available_timeseries", + return_value=MESSARI_TIMESERIES_DF, + ) + if mocked_func: mock = mocker.Mock() mocker.patch( diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/test_messari_model.py b/tests/openbb_terminal/cryptocurrency/due_diligence/test_messari_model.py index d3630411ef8..54686c6aec3 100644 --- a/tests/openbb_terminal/cryptocurrency/due_diligence/test_messari_model.py +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/test_messari_model.py @@ -10,7 +10,10 @@ from openbb_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")], + "filter_headers": [ + ("User-Agent", None), + ("x-messari-api-key", "mock_x-messari-api-key"), + ], } @@ -18,7 +21,7 @@ def vcr_config(): @pytest.mark.parametrize( "coin,interval,start,end", [ - ("BTC", "1d", "2022-01-10", "2022-03-08"), + ("btc", "1d", "2022-01-10", "2022-03-08"), ], ) def test_get_marketcap_dominance(coin, interval, start, end, recorder): @@ -26,3 +29,126 @@ def test_get_marketcap_dominance(coin, interval, start, end, recorder): coin=coin, interval=interval, start=start, end=end ) recorder.capture(df) + + +@pytest.mark.vcr +def test_get_available_timeseries(recorder): + df = messari_model.get_available_timeseries() + recorder.capture(df) + + +@pytest.mark.vcr +@pytest.mark.parametrize( + "coin", + [ + ("aave"), + ], +) +def test_get_coin_tokenomics(coin, recorder): + df = messari_model.get_coin_tokenomics(symbol=coin) + recorder.capture(df) + + +@pytest.mark.vcr +@pytest.mark.parametrize( + "coin", + [ + ("eth"), + ], +) +def test_get_fundraising(coin, recorder): + ( + summary, + df_sales_rounds, + df_treasury_accs, + df_details, + ) = messari_model.get_fundraising(symbol=coin) + recorder.capture_list([summary, df_sales_rounds, df_treasury_accs, df_details]) + + +@pytest.mark.vcr +@pytest.mark.parametrize( + "coin", + [ + ("eth"), + ], +) +def test_get_governance(coin, recorder): + summary, df = messari_model.get_governance(symbol=coin) + recorder.capture_list([summary, df]) + + +@pytest.mark.vcr +@pytest.mark.parametrize( + "coin", + [ + ("eth"), + ], +) +def test_get_investors(coin, recorder): + df_individuals, df_organizations = messari_model.get_investors(symbol=coin) + recorder.capture_list([df_individuals, df_organizations]) + + +@pytest.mark.vcr +@pytest.mark.parametrize( + "coin", + [ + ("eth"), + ], +) +def test_get_team(coin, recorder): + df_individuals, df_organizations = messari_model.get_team(symbol=coin) + recorder.capture_list([df_individuals, df_organizations]) + + +@pytest.mark.vcr +@pytest.mark.parametrize( + "coin", + [ + ("eth"), + ], +) +def test_get_links(coin, recorder): + df = messari_model.get_links(symbol=coin) + recorder.capture(df) + + +@pytest.mark.vcr +@pytest.mark.parametrize( + "coin,interval,start,end,timeseries_id", + [ + ("btc", "1d", "2022-01-10", "2022-03-08", "sply.circ"), + ], +) +def test_get_messari_timeseries(coin, interval, start, end, timeseries_id, recorder): + df, _, _ = messari_model.get_messari_timeseries( + coin=coin, interval=interval, start=start, end=end, timeseries_id=timeseries_id + ) + recorder.capture(df) + + +@pytest.mark.vcr +@pytest.mark.parametrize( + "coin", + [ + ("eth"), + ], +) +def test_get_project_product_info(coin, recorder): + df_info, df_repos, df_audits, df_vulns = messari_model.get_project_product_info( + symbol=coin + ) + recorder.capture_list([df_info, df_repos, df_audits, df_vulns]) + + +@pytest.mark.vcr +@pytest.mark.parametrize( + "coin", + [ + ("eth"), + ], +) +def test_get_roadmap(coin, recorder): + df = messari_model.get_roadmap(symbol=coin) + recorder.capture(df) diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_dd_controller/test_print_help.txt b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_dd_controller/test_print_help.txt index cdeb4bab450..dccaf346d6f 100644 --- a/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_dd_controller/test_print_help.txt +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_dd_controller/test_print_help.txt @@ -29,14 +29,23 @@ CoinPaprika twitter tweets for loaded coin events events related to loaded coin Binance - binbook show order book - balance show coin balance + binbook order book + balance coin balance Coinbase - cbbook show order book - trades show last trades - stats show coin stats + cbbook order book + trades last trades + stats coin stats Messari - mcapdom show market cap dominance + mcapdom market cap dominance + mt messari timeseries e.g. twitter followers, circ supply, etc + rm roadmap + tk tokenomics e.g. circulating/max/total supply, emission type, etc + pi project information e.g. technology details, public repos, audits, vulns + team contributors (individuals and organizations) + inv investors (individuals and organizations) + gov governance details + fr fundraising details e.g. treasury accounts, sales rounds, allocation + links links e.g. whitepaper, github, twitter, youtube, reddit, telegram Santiment gh github activity over time CryptoPanic diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_fundraising[ETH].txt b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_fundraising[ETH].txt new file mode 100644 index 00000000000..f575c1e3fcd --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_fundraising[ETH].txt @@ -0,0 +1,9 @@ +Ethereum’s original token distribution event, managed by the Ethereum Foundation, sold roughly 60 million ethers (80% of the initial 72 million ETH supply) to the public. The sale took place between July 22, 2014, and September 02, 2014. However, the Ether purchased by crowdsale investors were not usable or transferable before the launch of the Genesis Block on July 31, 2015. The price of ether was initially set to a discounted price of 2000 ETH per BTC until August 05, 2019, before linearly declining to a final rate of 1337 ETH per BTC, reached on August 28, 2014. +3,700 BTC were raised in the first 12 hours of the sale +Over 25,000 BTC were raised in the first 2 weeks. +The sale eventually allowed the Ethereum Foundation to raise over 31,000 BTC, equivalent to $18.3 million. + +The remaining 12 million ETH (20% of the initial supply) were allocated to the Foundation and early Ethereum contributors. Of the ether sent to the Foundation: +3 million were allocated to a long-term endowment +6 million were distributed among 85 developers who contributed prior to the crowdsale +3 million were designed as a “developer purchase program” which gave Ethereum developers the right to purchase ether at crowdsale prices. \ No newline at end of file diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_fundraising[eth].txt b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_fundraising[eth].txt new file mode 100644 index 00000000000..f575c1e3fcd --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_fundraising[eth].txt @@ -0,0 +1,9 @@ +Ethereum’s original token distribution event, managed by the Ethereum Foundation, sold roughly 60 million ethers (80% of the initial 72 million ETH supply) to the public. The sale took place between July 22, 2014, and September 02, 2014. However, the Ether purchased by crowdsale investors were not usable or transferable before the launch of the Genesis Block on July 31, 2015. The price of ether was initially set to a discounted price of 2000 ETH per BTC until August 05, 2019, before linearly declining to a final rate of 1337 ETH per BTC, reached on August 28, 2014. +3,700 BTC were raised in the first 12 hours of the sale +Over 25,000 BTC were raised in the first 2 weeks. +The sale eventually allowed the Ethereum Foundation to raise over 31,000 BTC, equivalent to $18.3 million. + +The remaining 12 million ETH (20% of the initial supply) were allocated to the Foundation and early Ethereum contributors. Of the ether sent to the Foundation: +3 million were allocated to a long-term endowment +6 million were distributed among 85 developers who contributed prior to the crowdsale +3 million were designed as a “developer purchase program” which gave Ethereum developers the right to purchase ether at crowdsale prices. \ No newline at end of file diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_governance[ETH].txt b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_governance[ETH].txt new file mode 100644 index 00000000000..5674e3fc3eb --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_governance[ETH].txt @@ -0,0 +1 @@ +Ethereum operates similarly to Bitcoin through off-chain, informal governance. In this model, developers can submit protocol upgrades, dubbed Ethereum Improvement Proposals (EIPs), on Ethereum's open-source GitHub repository. Core Ethereum developers then discuss new proposals, with additional input from the extended community. If approved by a majority vote, core developers merge the changes into the base code. To avoid complications post-merge, node operators must update their clients to the latest software. \ No newline at end of file diff --git a/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_governance[eth].txt b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_governance[eth].txt new file mode 100644 index 00000000000..5674e3fc3eb --- /dev/null +++ b/tests/openbb_terminal/cryptocurrency/due_diligence/txt/test_messari_model/test_get_governance[eth].txt @@ -0,0 +1 @@ +Ethereum operates similarly to Bitcoin through off-chain, informal governance. In this model, developers can submit protocol upgrades, dubbed Ethereum Improvement Proposals (EIPs), on Ethereum's open-source GitHub repository. Core Ethereum developers then discuss new proposals, with additional input from the extended community. If approved by a majority vote, core developers merge the changes into the base code. To avoid complications post-merge, node operators must update their clients to the latest software. \ No newline at end of file diff --git a/website/content/terminal/cryptocurrency/due_diligence/fr/_index.md b/website/content/terminal/cryptocurrency/due_diligence/fr/_index.md new file mode 100644 index 00000000000..349f5868b8f --- /dev/null +++ b/website/content/terminal/cryptocurrency/due_diligence/fr/_index.md @@ -0,0 +1,9 @@ +`usage: fr [-h] [--export EXPORT]` + +Display asset's fundraising details [Source: https://messari.io] + +``` +optional arguments: + -h, --help show this help message (default: False) + --export EXPORT Export raw data into csv, json, xlsx (default: ) +``` diff --git a/website/content/terminal/cryptocurrency/due_diligence/gov/_index.md b/website/content/terminal/cryptocurrency/due_diligence/gov/_index.md new file mode 100644 index 00000000000..5ccd54dd214 --- /dev/null +++ b/website/content/terminal/cryptocurrency/due_diligence/gov/_index.md @@ -0,0 +1,9 @@ +`usage: gov [-h] [--export EXPORT]` + +Display asset's governance [Source: https://messari.io] + +``` +optional arguments: + -h, --help show this help message (default: False) + --export EXPORT Export raw data into csv, json, xlsx (default: ) +``` diff --git a/website/content/terminal/cryptocurrency/due_diligence/inv/_index.md b/website/content/terminal/cryptocurrency/due_diligence/inv/_index.md new file mode 100644 index 00000000000..96dda7fa61c --- /dev/null +++ b/website/content/terminal/cryptocurrency/due_diligence/inv/_index.md @@ -0,0 +1,9 @@ +`usage: inv [-h] [--export EXPORT]` + +Display asset's investors [Source: https://messari.io] + +``` +optional arguments: + -h, --help show this help message (default: False) + --export EXPORT Export raw data into csv, json, xlsx (default: ) +``` diff --git a/website/content/terminal/cryptocurrency/due_diligence/links/_index.md b/website/content/terminal/cryptocurrency/due_diligence/links/_index.md new file mode 100644 index 00000000000..8b4076bd221 --- /dev/null +++ b/website/content/terminal/cryptocurrency/due_diligence/links/_index.md @@ -0,0 +1,9 @@ +`usage: links [-h] [--export EXPORT]` + +Display asset's links [Source: https://messari.io] + +``` +optional arguments: + -h, --help show this help message (default: False) + --export EXPORT Export raw data into csv, json, xlsx (default: ) +``` diff --git a/website/content/terminal/cryptocurrency/due_diligence/mt/_index.md b/website/content/terminal/cryptocurrency/due_diligence/mt/_index.md new file mode 100644 index 00000000000..055ee4d11ba --- /dev/null +++ b/website/content/terminal/cryptocurrency/due_diligence/mt/_index.md @@ -0,0 +1,22 @@ +`usage: mt [--list] [-t {exch.bittrex.flow.net,...}] [-i {5m,15m,30m,1h,1d,1w}] [-s START] [-end END] [--include-paid] [-q QUERY [QUERY ...]] [-h] [--export EXPORT] [-l LIMIT]` + +Display messari timeseries [Source: https://messari.io] + +```` +optional arguments: + --list Flag to show available timeseries (default: False) + -t {exch.bittrex.flow.net,exch.sply.bitstamp,addr.bal.100k.ntv.cnt,exch.sply.binance,utxo.age.med,exch.kraken.flow.out.ntv,exch.flow.out.ntv,diff.avg,utxo.age.val.avg,twitter.followers,blk.cnt,hashrate.30d,sply.addr.bal.1m.ntv,addr.bal.1m.cnt,exch.huobi.flow.in.ntv,min.rev.usd,utxo.prof.cnt,blk.int.avg,exch.binance.flow.in,sply.act.4y,txn.tfr.val.adj.ntv,exch.sply.bittrex.ntv,sply.rvv.4y,blk.unc.rew,exch.sply,exch.sply.usd,exch.binance.flow.net.ntv,fees.ntv,sply.total.iss,hashrate,sply.act.30d,txn.tfr.erc721.cnt,exch.gemini.flow.net.ntv,exch.poloniex.flow.out,exch.sply.kraken.ntv,exch.flow.in.usd,addr.bal.10.cnt,exch.bitstamp.flow.net.ntv,exch.sply.binance.ntv,telegram.users,exch.huobi.flow.net,nvt.adj,addr.bal.1.ntv.cnt,exch.gemini.flow.in,cg.sply.circ,exch.sply.bitfinex.ntv,exch.bitmex.flow.in.ntv,exch.bittrex.flow.out,miner.1hop.sply.ntv,txn.tkn.cnt,addr.bal.1m.ntv.cnt,exch.bitstamp.flow.in.ntv,hash.rev.ntv,txn.tfr.val.ntv,utxo.cnt,addr.bal.0.01.ntv.cnt,exch.bitmex.flow.out.ntv,rvt.adj.90d.ma,sply.act.3y,sply.addr.bal.1k.ntv,sply.addr.bal.1.ntv,sply.rvv.5y,sply.shld,addr.bal.0.001.ntv.cnt,exch.bitfinex.flow.net,exch.poloniex.flow.in,exch.sply.bitmex,txn.tfr.avg.ntv,txn.gas,blk.hgt,exch.gemini.flow.out,exch.sply.bitfinex,sply.act.180d,sply.addr.bal.1m,txn.cnt,exch.binance.flow.in.ntv,exch.poloniex.flow.out.ntv,mcap.realized,sply.act.90d,exch.bitstamp.flow.in,exch.bittrex.flow.in,exch.poloniex.flow.in.ntv,exch.sply.huobi.ntv,exch.flow.out.usd,price,addr.bal.1k.ntv.cnt,addr.bal.100.ntv.cnt,exch.kraken.flow.net.ntv,txn.fee.med,sply.act.1y,txn.cont.call.succ.cnt,txn.tfr.erc20.cnt,addr.bal.10k.ntv.cnt,blk.size.bytes.avg,exch.binance.flow.net,exch.binance.flow.out,sply.rvv.180d,sply.rvv.7d,addr.cnt,exch.bittrex.flow.out.ntv,sply.addr.bal.100.ntv,sply.rvv.2y,sply.top.100,txn.cnt.sec,exch.bitfinex.flow.in,exch.bitfinex.flow.out.ntv,exch.sply.poloniex.ntv,sply.cont.usd,exch.bittrex.flow.net.ntv,exch.flow.out.ntv.incl,sply.addr.bal.0.001.ntv,txn.vol,txn.fee.avg,txn.fee.avg.ntv,real.vol,exch.poloniex.flow.net,exch.kraken.flow.in.ntv,txn.cont.call.cnt,exch.flow.out.usd.incl,exch.flow.in.ntv.incl,new.iss.ntv,fees.pct.rev,exch.gemini.flow.net,exch.bitstamp.flow.out,exch.gemini.flow.out.ntv,exch.kraken.flow.out,addr.act.sent.cnt,exch.bittrex.flow.in.ntv,exch.sply.gemini,sply.act.2y,sply.act.7d,sply.top.1pct,txn.cont.cnt,sply.liquid,addr.bal.100k.cnt,exch.bitfinex.flow.net.ntv,exch.huobi.flow.out,txn.fee.med.ntv,blk.unc.rew.ntv,hashrate.rev,sply.addr.bal.100,sply.addr.bal.100k.ntv,sply.rvv.30d,txn.tsfr.cnt,mcap.dom,act.addr.cnt,exch.binance.flow.out.ntv,sply.act.pct.1y,blk.unc.rew.pct,exch.bitstamp.flow.out.ntv,exch.sply.bittrex,sply.total.iss.ntv,addr.bal.0.1.ntv.cnt,sply.addr.bal.0.1.ntv,sply.top.10pct,exch.sply.bitstamp.ntv,nvt.adj.90d.ma,txn.cont.creat.cnt,exch.huobi.flow.in,exch.flow.in.ntv,sply.act.evr,sply.addr.bal.100k,txn.erc721.cnt,exch.bitmex.flow.in,hashrate.rev.ntv,sply.addr.bal.10.ntv,sply.rvv.90d,mcap.out,miner.rev.total,sply.addr.bal.1k,exch.flow.in.usd.incl,sply.act.5y,txn.gas.limit.avg,mcap.circ,daily.shp,addr.bal.10m.cnt,blk.size.byte,miner.sply,reddit.active.users,exch.poloniex.flow.net.ntv,sply.rvv.1y,exch.bitmex.flow.net,exch.bitmex.flow.net.ntv,exch.bitfinex.flow.out,exch.sply.poloniex,txn.gas.limit,txn.tfr.val.med,addr.bal.1k.cnt,fees,sply.addr.bal.10k.ntv,sply.utxo.prof,addr.bal.10.ntv.cnt,exch.kraken.flow.net,blk.gas.limit.avg,iss.rate,txn.cont.dest.cnt,txn.tfr.val.med.ntv,sply.circ,new.iss.usd,miner.sply.ntv,sply.addr.bal.10,blk.wght.total,sply.addr.bal.1,txn.tsfr.val.avg,utxo.loss.cnt,rvt.adj,exch.bitstamp.flow.net,sply.out,txn.erc20.cnt,utxo.age.avg,reddit.subscribers,exch.huobi.flow.net.ntv,iss.rate.day,exch.sply.gemini.ntv,hash.rev,sply.act.1d,miner.1hop.sply,sply.act.10y,sply.rvv.3y,addr.bal.10k.cnt,exch.bitfinex.flow.in.ntv,exch.kraken.flow.in,exch.huobi.flow.out.ntv,txn.tsfr.val.adj,exch.sply.huobi,addr.bal.1.cnt,min.rev.ntv,sply.addr.bal.10k,addr.act.rcv.cnt,exch.sply.kraken,sply.addr.bal.10m,blk.wght.avg,sply.utxo.loss,addr.bal.100.cnt,exch.sply.bitmex.ntv,txn.gas.avg,sply.addr.bal.0.01.ntv,sply.cont.ntv,daily.vol,blk.unc.cnt,exch.gemini.flow.in.ntv,exch.bitmex.flow.out}, --timeseries {exch.bittrex.flow.net,exch.sply.bitstamp,addr.bal.100k.ntv.cnt,exch.sply.binance,utxo.age.med,exch.kraken.flow.out.ntv,exch.flow.out.ntv,diff.avg,utxo.age.val.avg,twitter.followers,blk.cnt,hashrate.30d,sply.addr.bal.1m.ntv,addr.bal.1m.cnt,exch.huobi.flow.in.ntv,min.rev.usd,utxo.prof.cnt,blk.int.avg,exch.binance.flow.in,sply.act.4y,txn.tfr.val.adj.ntv,exch.sply.bittrex.ntv,sply.rvv.4y,blk.unc.rew,exch.sply,exch.sply.usd,exch.binance.flow.net.ntv,fees.ntv,sply.total.iss,hashrate,sply.act.30d,txn.tfr.erc721.cnt,exch.gemini.flow.net.ntv,exch.poloniex.flow.out,exch.sply.kraken.ntv,exch.flow.in.usd,addr.bal.10.cnt,exch.bitstamp.flow.net.ntv,exch.sply.binance.ntv,telegram.users,exch.huobi.flow.net,nvt.adj,addr.bal.1.ntv.cnt,exch.gemini.flow.in,cg.sply.circ,exch.sply.bitfinex.ntv,exch.bitmex.flow.in.ntv,exch.bittrex.flow.out,miner.1hop.sply.ntv,txn.tkn.cnt,addr.bal.1m.ntv.cnt,exch.bitstamp.flow.in.ntv,hash.rev.ntv,txn.tfr.val.ntv,utxo.cnt,addr.bal.0.01.ntv.cnt,exch.bitmex.flow.out.ntv,rvt.adj.90d.ma,sply.act.3y,sply.addr.bal.1k.ntv,sply.addr.bal.1.ntv,sply.rvv.5y,sply.shld,addr.bal.0.001.ntv.cnt,exch.bitfinex.flow.net,exch.poloniex.flow.in,exch.sply.bitmex,txn.tfr.avg.ntv,txn.gas,blk.hgt,exch.gemini.flow.out,exch.sply.bitfinex,sply.act.180d,sply.addr.bal.1m,txn.cnt,exch.binance.flow.in.ntv,exch.poloniex.flow.out.ntv,mcap.realized,sply.act.90d,exch.bitstamp.flow.in,exch.bittrex.flow.in,exch.poloniex.flow.in.ntv,exch.sply.huobi.ntv,exch.flow.out.usd,price,addr.bal.1k.ntv.cnt,addr.bal.100.ntv.cnt,exch.kraken.flow.net.ntv,txn.fee.med,sply.act.1y,txn.cont.call.succ.cnt,txn.tfr.erc20.cnt,addr.bal.10k.ntv.cnt,blk.size.bytes.avg,exch.binance.flow.net,exch.binance.flow.out,sply.rvv.180d,sply.rvv.7d,addr.cnt,exch.bittrex.flow.out.ntv,sply.addr.bal.100.ntv,sply.rvv.2y,sply.top.100,txn.cnt.sec,exch.bitfinex.flow.in,exch.bitfinex.flow.out.ntv,exch.sply.poloniex.ntv,sply.cont.usd,exch.bittrex.flow.net.ntv,exch.flow.out.ntv.incl,sply.addr.bal.0.001.ntv,txn.vol,txn.fee.avg,txn.fee.avg.ntv,real.vol,exch.poloniex.flow.net,exch.kraken.flow.in.ntv,txn.cont.call.cnt,exch.flow.out.usd.incl,exch.flow.in.ntv.incl,new.iss.ntv,fees.pct.rev,exch.gemini.flow.net,exch.bitstamp.flow.out,exch.gemini.flow.out.ntv,exch.kraken.flow.out,addr.act.sent.cnt,exch.bittrex.flow.in.ntv,exch.sply.gemini,sply.act.2y,sply.act.7d,sply.top.1pct,txn.cont.cnt,sply.liquid,addr.bal.100k.cnt,exch.bitfinex.flow.net.ntv,exch.huobi.flow.out,txn.fee.med.ntv,blk.unc.rew.ntv,hashrate.rev,sply.addr.bal.100,sply.addr.bal.100k.ntv,sply.rvv.30d,txn.tsfr.cnt,mcap.dom,act.addr.cnt,exch.binance.flow.out.ntv,sply.act.pct.1y,blk.unc.rew.pct,exch.bitstamp.flow.out.ntv,exch.sply.bittrex,sply.total.iss.ntv,addr.bal.0.1.ntv.cnt,sply.addr.bal.0.1.ntv,sply.top.10pct,exch.sply.bitstamp.ntv,nvt.adj.90d.ma,txn.cont.creat.cnt,exch.huobi.flow.in,exch.flow.in.ntv,sply.act.evr,sply.addr.bal.100k,txn.erc721.cnt,exch.bitmex.flow.in,hashrate.rev.ntv,sply.addr.bal.10.ntv,sply.rvv.90d,mcap.out,miner.rev.total,sply.addr.bal.1k,exch.flow.in.usd.incl,sply.act.5y,txn.gas.limit.avg,mcap.circ,daily.shp,addr.bal.10m.cnt,blk.size.byte,miner.sply,reddit.active.users,exch.poloniex.flow.net.ntv,sply.rvv.1y,exch.bitmex.flow.net,exch.bitmex.flow.net.ntv,exch.bitfinex.flow.out,exch.sply.poloniex,txn.gas.limit,txn.tfr.val.med,addr.bal.1k.cnt,fees,sply.addr.bal.10k.ntv,sply.utxo.prof,addr.bal.10.ntv.cnt,exch.kraken.flow.net,blk.gas.limit.avg,iss.rate,txn.cont.dest.cnt,txn.tfr.val.med.ntv,sply.circ,new.iss.usd,miner.sply.ntv,sply.addr.bal.10,blk.wght.total,sply.addr.bal.1,txn.tsfr.val.avg,utxo.loss.cnt,rvt.adj,exch.bitstamp.flow.net,sply.out,txn.erc20.cnt,utxo.age.avg,reddit.subscribers,exch.huobi.flow.net.ntv,iss.rate.day,exch.sply.gemini.ntv,hash.rev,sply.act.1d,miner.1hop.sply,sply.act.10y,sply.rvv.3y,addr.bal.10k.cnt,exch.bitfinex.flow.in.ntv,exch.kraken.flow.in,exch.huobi.flow.out.ntv,txn.tsfr.val.adj,exch.sply.huobi,addr.bal.1.cnt,min.rev.ntv,sply.addr.bal.10k,addr.act.rcv.cnt,exch.sply.kraken,sply.addr.bal.10m,blk.wght.avg,sply.utxo.loss,addr.bal.100.cnt,exch.sply.bitmex.ntv,txn.gas.avg,sply.addr.bal.0.01.ntv,sply.cont.ntv,daily.vol,blk.unc.cnt,exch.gemini.flow.in.ntv,exch.bitmex.flow.out} + Messari timeseries id. Default: txn.vol (default: txn.vol) + -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-04-26) + -end END, --end END End date. Default: Today (default: 2022-04-26) + --include-paid Flag to show both paid and free sources (default: False) + -q QUERY [QUERY ...], --query QUERY [QUERY ...] + Query to search across all messari timeseries (default: ) + -h, --help show this help message (default: False) + --export EXPORT Export raw data into csv, json, xlsx and figure into png, jpg, pdf, svg (default: ) + -l LIMIT, --limit LIMIT + Number of entries to show in data. (default: 10)``` +```` diff --git a/website/content/terminal/cryptocurrency/due_diligence/pi/_index.md b/website/content/terminal/cryptocurrency/due_diligence/pi/_index.md new file mode 100644 index 00000000000..50e266bc841 --- /dev/null +++ b/website/content/terminal/cryptocurrency/due_diligence/pi/_index.md @@ -0,0 +1,9 @@ +`usage: pi [-h] [--export EXPORT]` + +Display asset's project info [Source: https://messari.io] + +``` +optional arguments: + -h, --help show this help message (default: False) + --export EXPORT Export raw data into csv, json, xlsx (default: ) +``` diff --git a/website/content/terminal/cryptocurrency/due_diligence/rm/_index.md b/website/content/terminal/cryptocurrency/due_diligence/rm/_index.md new file mode 100644 index 00000000000..b4f6174355b --- /dev/null +++ b/website/content/terminal/cryptocurrency/due_diligence/rm/_index.md @@ -0,0 +1,10 @@ +`usage: rm [--chart] [-h] [--export EXPORT]` + +Display asset's roadmap [Source: https://messari.io] + +``` +optional arguments: + --chart Flag to show chart with coin price and roadmap dates (default: False) + -h, --help show this help message (default: False) + --export EXPORT Export raw data into csv, json, xlsx (default: ) +``` diff --git a/website/content/terminal/cryptocurrency/due_diligence/team/_index.md b/website/content/terminal/cryptocurrency/due_diligence/team/_index.md new file mode 100644 index 00000000000..fa60f778ad2 --- /dev/null +++ b/website/content/terminal/cryptocurrency/due_diligence/team/_index.md @@ -0,0 +1,9 @@ +`usage: team [-h] [--export EXPORT]` + +Display asset's team [Source: https://messari.io] + +``` +optional arguments: + -h, --help show this help message (default: False) + --export EXPORT Export raw data into csv, json, xlsx (default: ) +``` diff --git a/website/content/terminal/cryptocurrency/due_diligence/tk/_index.md b/website/content/terminal/cryptocurrency/due_diligence/tk/_index.md new file mode 100644 index 00000000000..f5b21afc795 --- /dev/null +++ b/website/content/terminal/cryptocurrency/due_diligence/tk/_index.md @@ -0,0 +1,9 @@ +`usage: tk [-h] [--export EXPORT` + +Display asset's tokenomics [Source: https://messari.io] + +``` +optional arguments: +-h, --help show this help message (default: False) +--export EXPORT Export raw data into csv, json, xlsx (default: ) +``` diff --git a/website/data/menu/main.yml b/website/data/menu/main.yml index 9cc1be15a1f..4db0c66deac 100755 --- a/website/data/menu/main.yml +++ b/website/data/menu/main.yml @@ -541,7 +541,7 @@ main: - name: getdd ref: "/terminal/common/behavioural_analysis/getdd" - name: reddit_sent - ref: "/terminal/common/behavioural_analysis/reddit_sent" + ref: "/terminal/common/behavioural_analysis/reddit_sent" - name: bullbear ref: "/terminal/common/behavioural_analysis/bullbear" - name: messages @@ -783,10 +783,28 @@ main: ref: "/terminal/cryptocurrency/due_diligence/trades" - name: stats ref: "/terminal/cryptocurrency/due_diligence/stats" - - name: stats + - name: mcapdom ref: "/terminal/cryptocurrency/due_diligence/mcapdom" - name: nonzero ref: "/terminal/cryptocurrency/due_diligence/nonzero" + - name: mt + ref: "/terminal/cryptocurrency/due_diligence/mt" + - name: rm + ref: "/terminal/cryptocurrency/due_diligence/rm" + - name: tk + ref: "/terminal/cryptocurrency/due_diligence/tk" + - name: pi + ref: "/terminal/cryptocurrency/due_diligence/pi" + - name: team + ref: "/terminal/cryptocurrency/due_diligence/team" + - name: inv + ref: "/terminal/cryptocurrency/due_diligence/inv" + - name: gov + ref: "/terminal/cryptocurrency/due_diligence/gov" + - name: fr + ref: "/terminal/cryptocurrency/due_diligence/fr" + - name: links + ref: "/terminal/cryptocurrency/due_diligence/links" - name: news ref: "/terminal/cryptocurrency/due_diligence/news" - name: gh