diff --git a/.vscode/settings.json b/.vscode/settings.json index 6956c3c..71de542 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,4 @@ { - "python.analysis.typeCheckingMode": "off", + "python.analysis.typeCheckingMode": "basic", "python.analysis.autoImportCompletions": false } \ No newline at end of file diff --git a/README.md b/README.md index 8ba6c3b..df44cf6 100644 --- a/README.md +++ b/README.md @@ -2,27 +2,31 @@ pequena aplicação para ir acompanhando a evolução de um portfolio de activos de criptomoedas -"historico_preco.csv" -> ficheiro CSV com dados historicos diarizados de um activo. - - data,moeda,simbolo,preco_abertura,preco_maximo,preco_minimo,preco_fecho +"historico_preco.csv" -> ficheiro CSV com dados historicos diarizados de um activo. - - data a que se referem os dados. formato: dd-mm-aaaa - - nome do activo (ex: bitcoin) - - simbolo do activo (ex: btc) - - preco de abertura do activo para esse dia (em EUR) - - preco máximo atingido pelo activo nesse dia (em EUR) - - preco minimo atingido pelo activo nesse dia (em EUR) - - preco de fecho do activo nesse dia (em EUR) +~~~pseudo +data,moeda,simbolo,preco_abertura,preco_maximo,preco_minimo,preco_fecho + + - data a que se referem os dados. formato: dd-mm-aaaa + - nome do activo (ex: bitcoin) + - simbolo do activo (ex: btc) + - preco de abertura do activo para esse dia (em EUR) + - preco máximo atingido pelo activo nesse dia (em EUR) + - preco minimo atingido pelo activo nesse dia (em EUR) + - preco de fecho do activo nesse dia (em EUR) +~~~ "portfolio.csv" - ficheiro CSV com informação sobre os movimentos de um activo. - - data,moeda,tipo_movimento,quantidade,preco_movimento - - data a que se refere o movimento - - activo a que se refere o movimento - - tipo do movimento ("compra", "venda") - - quantidade do activo a que se refere o movimento - - preco a que foi efectuado o movimento (preco activo * quantidade comprada) +~~~pseudo +data,moeda,tipo_movimento,quantidade,preco_movimento + + - data a que se refere o movimento + - activo a que se refere o movimento + - tipo do movimento ("compra", "venda") + - quantidade do activo a que se refere o movimento + - preco a que foi efectuado o movimento (preco activo * quantidade comprada) +~~~ exemplo: 02-03-2024,bitcoin,compra,0.05,2978.024 @@ -32,113 +36,154 @@ este exemplo indica-nos que no dia 02-03-2024 foi comprado 0.05BTC com um custo de notar que o preco do movimento é o valor pago por 0.05BTC, não o preco de mercado de 1un de BTC nesta data. podemos calcular qual o preco de compra por unidade de BTC deste movimento simplesmente: - - / = 59560.48EUR + +~~~pseudo + / = 59560.48EUR +~~~ consultando na coingecko o preco de mercado de bitcoin à data de 02-03-2024 (cerca de 57560.483EUR), vemos que foi pago um premium de: - ( ( 59560.48 / 57560.483 ) - 1 ) * 100 = 3.47% + ( ( 59560.48 / 57560.483 ) - 1 ) * 100 = 3.47% -## Documentação API -https://docs.coingecko.com/reference/introduction +
+ Documentação API + + API_KEY = "CG-K5RS5VXsdFDip2UvY3z8VjQP" -## Obter preço de fecho dos ultimos 365 dias - -https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=eur&days=365&interval=daily - -* 365 dias é o maximo que podemos obter com demo API_KEY da CoinGecko (as of May '24) - -## Obter OHLC dos ultimos 2 dias - -https://api.coingecko.com/api/v3/coins/bitcoin/ohlc?vs_currency=eur&days=365&precision=3 +
## Sidequest - criação de wrapper para a API Coingecko -sim sim, já existe uma (muito bem feita, por sinal!) que pode ser descarregada aqui: https://github.com/khooihzhz/coingecko-python +sim sim, já existe uma (muito bem feita, por sinal!) que pode ser descarregada [aqui](). esta é a minha tentativa! :D +### Padrões a adoptar + +#### Nomes de funções e parâmetros das chamadas API + +usar como nome das funções e dos parâmetros os mesmos nomes usados pela API da CoinGecko,por exemplo: + +~~~pseudo +documentation: + 'Coin Price by IDs' +endpoint: + /simple/price/ +parametros: + ids (required) + vs_currencies (required) + include_market_cap + include_24hr_vol + include_24hr_change + include_last_updated_at + precision + +função: + coin_price_by_ids() +parametros: + ids + vs_currencies + include_market_cap + include_24hr_vol + include_24hr_change + include_last_updated_at + precision +~~~ + +*Nota: na situação em que o nome do parâmetro for um termo reservado, renomear com nome apropriado e comentar essa alteração* + +#### Parâmetros obrigatórios e vazios + +nas chamadas de API com parametros obrigatorios, a função deve gerar erro quando o parametro não for passado como argumento ou o tipo de objecto for diferente do esperado + +quando houver parametros 'vazios' passados como argumentos, estes não devem ser incluidos no URL de consulta. ( implementado na função API() ) + ### endpoints Public API V3 -- **ping** - > ✅ check api server status +✅ - implementado -- **simple** - > ✅ coin price by ids +❌ - não implementado - > ✅ coin price by token addresses - - > ✅ supported currencies list -- **coins** - > ✅ coins list (id map) +* **ping** - > ❌⬛ coins list with market data + * ✅ check api server status - > ❌⬛ coin data by id +* **simple** + * ✅ coin price by ids - > ❌⬛ coin tickers by id + * ✅ coin price by token addresses - > ❌⬛ coin historical data by id - - > ❌⬛ coin historical chart data by id + * ✅ supported currencies list +* **coins** + * ✅ coins list (id map) - > ❌⬛ coin historical chart data within time range by id + * ✅ coins list with market data - > ❌⬛ coin ohlc chart by id -- **contract** - > ❌⬛ coin data by token address + * ✅ coin data by id - > ❌⬛ coin historical chart data by token address + * ✅ coin tickers by id - > ❌⬛ coin historical chart data within time range by token address -- **asset platforms** - > ❌⬛ assets platforms list (id map) + * ✅ coin historical data by id -- **categories** - > ❌⬛ coins categories list (id map) - - > ❌⬛ coins categories list with market data + * ✅ coin historical chart data by id -- **exchanges** - > ❌⬛ exchanges list with data - - > ❌⬛ exchanges list (id map) + * ❌⬛ coin historical chart data within time range by id - > ❌⬛ exchange data by id + * ❌⬛ coin ohlc chart by id +* **contract** + * ❌⬛ coin data by token address - > ❌⬛ exchange tickers by id + * ❌⬛ coin historical chart data by token address - > ❌⬛ exchange volume chart by id -- **derivatives** - > ❌⬛ derivatives tickers list + * ❌⬛ coin historical chart data within time range by token address +* **asset platforms** + * ❌⬛ assets platforms list (id map) - > ❌⬛ derivatives exchange list with data +* **categories** + * ❌⬛ coins categories list (id map) - > ❌⬛ derivatives exchange data by id + * ❌⬛ coins categories list with market data - > ❌⬛ derivatives exchanges list (id map) +* **exchanges** + * ❌⬛ exchanges list with data -- **NFTs (beta)** - > ❌⬛ nfts list (id map) + * ❌⬛ exchanges list (id map) - > ❌⬛ nfts collection data by id + * ❌⬛ exchange data by id - > ❌⬛ nfts collection data by contract address + * ❌⬛ exchange tickers by id -- **exchange rates** - > ❌⬛ btc-to-currency exchange rates + * ❌⬛ exchange volume chart by id +* **derivatives** + * ❌⬛ derivatives tickers list -- **search** - > ❌⬛ search queries + * ❌⬛ derivatives exchange list with data -- **trending** - > ❌⬛ trending search list + * ❌⬛ derivatives exchange data by id -- **global** - > ❌⬛ crypto global market data + * ❌⬛ derivatives exchanges list (id map) - > ❌⬛ global de-fi market data +* **NFTs (beta)** + * ❌⬛ nfts list (id map) -- **companies (beta)** - > ❌⬛ public companies holdings \ No newline at end of file + * ❌⬛ nfts collection data by id + + * ❌⬛ nfts collection data by contract address + +* **exchange rates** + * ❌⬛ btc-to-currency exchange rates + +* **search** + * ❌⬛ search queries + +* **trending** + * ❌⬛ trending search list + +* **global** + * ❌⬛ crypto global market data + + * ❌⬛ global de-fi market data + +* **companies (beta)** + * ❌⬛ public companies holdings diff --git a/coingecko_api.py b/coingecko_api.py deleted file mode 100644 index d0e45fa..0000000 --- a/coingecko_api.py +++ /dev/null @@ -1,245 +0,0 @@ - -# . documentação API: https://docs.coingecko.com/v3.0.1/reference/introduction - -import requests -import json - -CHAVE_API = 'CG-K5RS5VXsdFDip2UvY3z8VjQP' -headers = { - 'accept': 'application/json', - 'x-cg-demo-api-key': CHAVE_API -} - -url_raiz_API = 'https://api.coingecko.com/api/v3/' - -# criptomoeda = 'bitcoin' -# vs_currency = 'eur' -# dias = '30' -# precisao = '3' - -#url_consulta_ohlc = 'coins/' + criptomoeda + '/ohlc?vs_currency=' + vs_currency + '&days=' + dias + '&precision=' + precisao - -# https://docs.coingecko.com/v3.0.1/reference/ping-server -# verificar o estado do servidor API -def ping() -> tuple: - endpoint_api = 'ping' - url_pedido = url_raiz_API + endpoint_api - resposta = requests.get(url_pedido, headers=headers) - return resposta.status_code, resposta.json()['gecko_says'] -# debug (decomentar linhas seguintes para testar funcao) -# codigo, dados = ping() -# print(f'codigo: {codigo}') -# print(f'resposta: {dados}') - -# https://docs.coingecko.com/v3.0.1/reference/simple-price -# consultar preco de uma ou mais moedas usando o seu ID de Moeda API -def consultar_preco(id_criptomoeda: str = '', - vs_currency: str = '', - flag_include_market_cap: bool = False, - flag_include_24hr_vol: bool = False, - flag_include_24hr_change: bool = False, - flag_include_last_updated_at: bool = False, - precisao: int | str = 'full' - ) -> tuple: - ''' - consultar preço de um ou mais moedas usando o seu ID de Moeda - - podem ser passadas multiplos IDs de moedas separadas por virgula, como objecto de tipo 'str' - ''' - # validacao de parametros - if not isinstance(id_criptomoeda, str): - raise TypeError('\'id_criptomoeda\' não é do tipo \'str\'') - if id_criptomoeda == '': - raise ValueError('\'id_criptomoeda\' tem de ser definido') - if not isinstance(vs_currency, str): - raise TypeError('\'vs_currency\' não é do tipo \'str\'') - if vs_currency == '': - raise ValueError('\'vs_currency\' tem de ser definido') - if not isinstance(flag_include_market_cap, bool): - flag_include_market_cap = False - if not isinstance(flag_include_24hr_vol, bool): - flag_include_24hr_vol = False - if not isinstance(flag_include_24hr_change, bool): - flag_include_24hr_change = False - if not isinstance(flag_include_last_updated_at, bool): - flag_include_last_updated_at = False - if (not isinstance(precisao, int)) and (not isinstance(precisao, str)): - raise TypeError('\'precisao\' não é do tipo \'int\' ou \'str\'') - if isinstance(precisao, int): - if precisao < 0: - precisao = 0 - if precisao > 18: - precisao = 18 - precisao = str(precisao) - - endpoint_api = 'simple/price?' + 'ids=' + id_criptomoeda + \ - '&vs_currencies=' + vs_currency + \ - '&include_market_cap=' + str(flag_include_market_cap).lower() + \ - '&include_24hr_vol=' + str(flag_include_24hr_vol).lower() + \ - '&include_24hr_change=' + str(flag_include_24hr_change).lower() + \ - '&include_last_updated_at=' + str(flag_include_last_updated_at).lower() + \ - '&precision=' + precisao - url_pedido = url_raiz_API + endpoint_api - resposta = requests.get(url_pedido, headers=headers) - return resposta.status_code, resposta.json() -# debug (decomentar linhas seguintes para testar funcao) -# codigo, dados_dict = consultar_preco('bitcoin,dogecoin,ethereum,0chain', 'eur') -# if codigo == 200: -# print(f'codigo: {codigo}') -# for moeda in dados_dict: -# print(f'{moeda}') -# for vs_currency in dados_dict[moeda]: -# print(f'\t{vs_currency}: {dados_dict[moeda][vs_currency]:.2f}') - -# https://docs.coingecko.com/v3.0.1/reference/simple-supported-currencies -# obter lista de todas as moedas suportadas por CoinGecko que podem ser usados como 'vs_currencies' -def obter_lista_moedas_vs_currencies() -> tuple: - endpoint_api = 'simple/supported_vs_currencies' - url_pedido = url_raiz_API + endpoint_api - resposta = requests.get(url_pedido, headers=headers) - return resposta.status_code, resposta.json() -# debug (decomentar linhas seguintes para testar funcao) -# codigo, dados = obter_lista_moedas_vs_currencies() -# if codigo == 200: -# for item in dados: -# print(item) - -# https://docs.coingecko.com/v3.0.1/reference/simple-token-price -# consultar preco de token usando o endereco de contrato do token -def consultar_preco_token( - id_platform: str = '', - contract_address: str = '', - vs_currency: str = '', - flag_include_market_cap: bool = False, - flag_include_24hr_vol: bool = False, - flag_include_24hr_change: bool = False, - flag_include_last_updated_at: bool = False, - precisao: int | str = 'full' -) -> tuple: - # validacao de parametros - if not isinstance(id_platform, str): - raise TypeError('\'id_platform\' tem de ser do tipo \'str\'') - if id_platform == '': - raise ValueError('\'id_platform\' tem de ser definido') - if not isinstance(contract_address, str): - raise TypeError('\'contract_address\' tem de ser do tipo \'str\'') - if contract_address == '': - raise ValueError('\'contract_address\' tem de ser definido') - if not isinstance(vs_currency, str): - raise TypeError('\'vs_currency\' tem de ser do tipo \'str\'') - if vs_currency == '': - raise ValueError('\'vs_currency\' tem de ser definido') - if not isinstance(flag_include_market_cap, bool): - flag_include_market_cap = False - if not isinstance(flag_include_24hr_vol, bool): - flag_include_24hr_vol = False - if not isinstance(flag_include_24hr_change, bool): - flag_include_24hr_change = False - if not isinstance(flag_include_last_updated_at, bool): - flag_include_last_updated_at = False - if (not isinstance(precisao, int)) and (not isinstance(precisao, str)): - raise TypeError('\'precisao\' tem de ser do tipo \'int\' ou \'str\'') - if isinstance(precisao, int): - if precisao < 0: - precisao = 0 - if precisao > 18: - precisao = 18 - precisao = str(precisao) - - endpoint_api = 'simple/token_price/' + id_platform + \ - '?contract_addresses=' + contract_address + \ - '&vs_currencies=' + vs_currency + \ - '&include_market_cap=' + str(flag_include_market_cap).lower() + \ - '&include_24hr_vol=' + str(flag_include_24hr_vol).lower() + \ - '&include_24hr_change=' + str(flag_include_24hr_change).lower() + \ - '&include_last_updated_at=' + str(flag_include_last_updated_at).lower() + \ - '&precision=' + precisao - url_pedido = url_raiz_API + endpoint_api - resposta = requests.get(url_pedido, headers=headers) - return resposta.status_code, resposta.json() -# debug (decomentar linhas seguintes para testar funcao) -# id_plataforma = 'ethereum' -# enderecos_contracto = '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599,0x4594cffbfc09bc5e7ecf1c2e1c1e24f0f7d29036' -# codigo, dados = consultar_preco_token(id_plataforma, enderecos_contracto, 'eur') -# print(f'codigo: {codigo}') -# if codigo == 200: -# for contrato in dados: -# print(f'{contrato}') -# for vs_currency in dados[contrato]: -# print(f'\t{vs_currency}: {dados[contrato][vs_currency]:0.2f}') - -# https://api.coingecko.com/api/v3/simple/supported_vs_currencies -# este endpoint permite consultar quais as moedas de referencia suportadas pela CoinGecko -def lista_moedas_referencia_suportadas() -> tuple: - endpoint_api = 'simple/supported_vs_currencies/' - url_pedido = url_raiz_API + endpoint_api - resposta = requests.get(url_pedido, headers=headers) - return resposta.status_code, resposta.json() -# debug (decomentar linhas seguintes para testar funcao) -# codigo, lista_moedas_referencia = lista_moedas_referencia_suportadas() -# if codigo == 200: -# for moeda in lista_moedas_referencia: -# print(f'{moeda}') - - -# https://api.coingecko.com/api/v3/coins/list -# obter todas as moedas suportadas em CoinGecko com IDs, nome, simbolo e (no caso de contractos) endereco na plataforma das moedas -def lista_moedas(flag_include_platform: bool = False) -> tuple: - if not isinstance(flag_include_platform, bool): - flag_include_platform = False - endpoint_api = 'coins/list?' + str(flag_include_platform).lower() - url_pedido = url_raiz_API + endpoint_api - resposta = requests.get(url_pedido, headers=headers) - return resposta.status_code, resposta.json() -# debug (decomentar linhas seguintes para testar funcao) -# codigo, dados = lista_moedas(flag_include_platform=False) -# if codigo == 200: -# for item in dados: -# print(item) - -# https://api.coingecko.com/api/v3/coins/markets -# consultar preço, cap mercado, volume e dados de mercado de todas as moedas suportadas -def lista_dados_mercado( - vs_currency: str = '', - ids_criptomoedas: str = '', - category: str = '', - -) - - - -# ===================================================== -# fazer consulta de dados OHLC -def consulta_ohcl(criptomoeda: str = '', - vs_currency: str = '', - dias: int | str = 30, - precisao: int | str = 3 - ) -> tuple: - # validacao de parametros - if not isinstance(criptomoeda, str): - raise TypeError('\'criptomoeda\' não é do tipo \'str\'') - if criptomoeda == '': - raise ValueError('\'criptomoeda\' tem de ser definido') - if not isinstance(vs_currency, str): - raise TypeError('\'vs_currency\' não é do tipo \'str\'') - if vs_currency == '': - raise ValueError('\'vs_currency\' tem de ser definido') - if (not isinstance(dias, str)) and (not isinstance(dias, int)): - raise TypeError('\'dias\' não é do tipo \'str\' ou \'int\'') - if isinstance(dias, int): - dias = str(dias) - if (not isinstance(precisao, str)) and (not isinstance(precisao, int)): - raise TypeError('\'precisao\' não é do tipo \'str\' ou \'int\'') - if isinstance(precisao, int): - precisao = str(precisao) - - endpoint_api = 'coins/' + criptomoeda + '/ohlc?vs_currency=' + vs_currency + '&days=' + dias + '&precision=' + precisao - url_pedido = url_raiz_API + endpoint_api - resposta = requests.get(url_pedido, headers=headers) - return resposta.status_code, resposta.json() -# debug (decomentar linhas seguintes para testar funcao) -# codigo, dados = consulta_ohcl('dogecoin', 'eur', precisao=5) -# if codigo == 200: -# print(f'codigo: {codigo}') -# for item in dados: -# print(item) diff --git a/modulos/coingecko_api.py b/modulos/coingecko_api.py new file mode 100644 index 0000000..fcbbc85 --- /dev/null +++ b/modulos/coingecko_api.py @@ -0,0 +1,1121 @@ + +# . documentação API: https://docs.coingecko.com/v3.0.1/reference/introduction + +import requests +import json + +CHAVE_API = 'CG-K5RS5VXsdFDip2UvY3z8VjQP' +headers = { + 'accept': 'application/json', + 'x-cg-demo-api-key': CHAVE_API +} + +url_raiz_API = 'https://api.coingecko.com/api/v3/' + +# chamada API geral +def API(api_endpoint: str = '', api_parameters_dict: dict[str, str] = {}) -> tuple: + '''função genérica para fazer uma consulta a API CoinGecko''' + # validar parametros + # api_endpoint + if not isinstance(api_endpoint, str): + raise TypeError('\'api_endpoint\' tem de ser do tipo \'str\'') + if api_endpoint == None or api_endpoint == '': + raise ValueError('\'api_endpoint\' tem de ser definido') + # api_parameters_dict + if not isinstance(api_parameters_dict, dict): + raise TypeError('\'api_parameters_dict\' tem de ser do tipo \'dict\'') + + # processar argumentos + api_parameters_string = '' if api_parameters_dict == {} else '?' + ampersand = '' # primeira iteração é '', depois passa a '&' + for param in api_parameters_dict: + if api_parameters_dict[param] == '': + continue + api_parameters_string += ampersand + param + '=' + api_parameters_dict[param] + if ampersand == '': + ampersand = '&' + url_pedido = url_raiz_API + api_endpoint + api_parameters_string + resposta = requests.get(url_pedido, headers=headers) + return url_pedido, resposta.status_code, resposta.json() + + +def ping() -> tuple: + '''https://docs.coingecko.com/v3.0.1/reference/ping-server + + função para verificar o estado do servidor API CoinGecko''' + return API('ping',{}) + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = ping() +# print(f'codigo: {codigo}') +# print(f'resposta: {dados}') + + +def coin_price_by_ids( + ids: str = '', + vs_currencies: str = '', + include_market_cap: bool = False, + include_24hr_vol: bool = False, + include_24hr_change: bool = False, + include_last_updated_at: bool = False, + precision: int | str = '' +) -> tuple: + '''https://docs.coingecko.com/v3.0.1/reference/simple-price + + consultar preço de um ou mais moedas usando o seu ID de Moeda + + podem ser passadas multiplas IDs de moedas separadas por virgula, como objecto de tipo 'str' + + parametros: + ids (obrigatorio) + + vs_currencies (obrigatorio)''' + # dicionario de parametros + api_parameters= { + 'ids': '', + 'vs_currencies': '', + 'include_24hr_vol': '', + 'include_24hr_change': '', + 'include_last_update_at': '', + 'precision': '', + } + # validacao de parametros + # ids + if not isinstance(ids, str): + raise TypeError('\'ids\' não é do tipo \'str\'') + if ids == '': + raise ValueError('\'ids\' tem de ser definido') + api_parameters['ids'] = ids + # vs_currencies + if not isinstance(vs_currencies, str): + raise TypeError('\'vs_currencies\' não é do tipo \'str\'') + if vs_currencies == '': + raise ValueError('\'vs_currencies\' tem de ser definido') + api_parameters['vs_currencies'] = vs_currencies + # include_market_cap + if not isinstance(include_market_cap, bool): + include_market_cap = False + if include_market_cap: + api_parameters['include_market_cap'] = str(True).lower() + # include_24hr_vol + if not isinstance(include_24hr_vol, bool): + include_24hr_vol = False + if include_24hr_vol: + api_parameters['include_24hr_vol'] = str(True).lower() + # include_24hr_change + if not isinstance(include_24hr_change, bool): + include_24hr_change = False + if include_24hr_change: + api_parameters['include_24hr_change'] = str(True).lower() + # include_last_update_at + if not isinstance(include_last_updated_at, bool): + include_last_updated_at = False + if include_last_updated_at: + api_parameters['include_last_updated_at'] = str(True).lower() + # precision + if (not isinstance(precision, (int, str))): + raise TypeError('\'precision\' não é do tipo \'int\' ou \'str\'') + if precision != '': + if isinstance(precision, str): + if precision == 'full': + precision = '18' + precision = int(precision) + if isinstance(precision, int): + if precision < 0: + precision = 0 + if precision > 18: + precision = 18 + precision = str(precision) + api_parameters['precision'] = precision + + return API('simple/price', api_parameters) + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados_dict = coin_price_by_ids('bitcoin,xkc,ethereum','eur', precision=True) +# print(f'url: {url}') +# if codigo == 200: +# for moeda in dados_dict: +# print(f'{moeda}') +# for vs_currencies in dados_dict[moeda]: +# print(f'\t{vs_currencies}: {dados_dict[moeda][vs_currencies]}') +# else: +# print(f'erro: {codigo}{dados_dict}') + + +def coin_price_by_token_addresses( + id_platform: str = '', + contract_addresses: str = '', + vs_currencies: str = '', + include_market_cap: bool = False, + include_24hr_vol: bool = False, + include_24hr_change: bool = False, + include_last_updated_at: bool = False, + precision: int | str = '' +) -> tuple: + '''https://docs.coingecko.com/v3.0.1/reference/simple-token-price + + consultar preco de tokens usando os endereços de contrato dos tokens + + parametros: + id (obrigatorio) - id da plataforma onde residem os contratos + + contract_addresses (obrigatorio) - endereços dos contratos, separados por virgula se forem mais que 1 + + vs_currencies (obrigatorio) - moedas de referencia, separadas por virgula se forem mais que 1''' + # dicionario de parametros + api_parameters= { + 'id_platform': '', + 'contract_addresses': '', + 'vs_currencies': '', + 'include_market_cap': '', + 'include_24hr_vol': '', + 'include_24hr_change': '', + 'include_last_updated_at': '', + 'precision': '', + } + # validacao de parametros + # id_platform ('id' já existe como metodo, não pode ser usado) + if not isinstance(id_platform, str): + raise TypeError('\'id_platform\' tem de ser do tipo \'str\'') + if id_platform == '': + raise ValueError('\'id_platform\' tem de ser definido') + api_parameters['id'] = id_platform + # contract_addresses + if not isinstance(contract_addresses, str): + raise TypeError('\'contract_addresses\' tem de ser do tipo \'str\'') + if contract_addresses == '': + raise ValueError('\'contract_addresses\' tem de ser definido') + api_parameters['contract_addresses'] = contract_addresses + # vs_currencies + if not isinstance(vs_currencies, str): + raise TypeError('\'vs_currencies\' tem de ser do tipo \'str\'') + if vs_currencies == '': + raise ValueError('\'vs_currencies\' tem de ser definido') + api_parameters['vs_currencies'] = vs_currencies + # include_market_cap + if not isinstance(include_market_cap, bool): + include_market_cap = False + if include_market_cap != False: + api_parameters['include_market_cap'] = str(include_market_cap).lower() + # include_24hr_vol + if not isinstance(include_24hr_vol, bool): + include_24hr_vol = False + if include_24hr_vol != False: + api_parameters['include_24hr_vol'] = str(include_24hr_vol).lower() + # include_24hr_change + if not isinstance(include_24hr_change, bool): + include_24hr_change = False + if include_24hr_change != False: + api_parameters['include_24hr_change'] = str(include_24hr_change).lower() + # include_last_updated_at + if not isinstance(include_last_updated_at, bool): + include_last_updated_at = False + if include_last_updated_at != False: + api_parameters['include_last_updated_at'] = str(include_last_updated_at).lower() + # precision + if (not isinstance(precision, (int, str))): + raise TypeError('\'precision\' tem de ser do tipo \'int\' ou \'str\'') + if isinstance(precision, str): + if precision == 'full': + precision = '18' + precision = int(precision) + if isinstance(precision, int): + if precision < 0: + precision = 0 + if precision > 18: + precision = 18 + precision = str(precision) + api_parameters['precision'] = precision + + return API(f'simple/token_price/{api_parameters['id']}',api_parameters) + + +# debug (decomentar linhas seguintes para testar funcao) +# id_plataforma = 'ethereum' +# enderecos_contracto = '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599,0x4594cffbfc09bc5e7ecf1c2e1c1e24f0f7d29036' +# url, codigo, dados = coin_price_by_token_addresses(id_plataforma, enderecos_contracto, 'eur') +# print(f'url: {url}') +# if codigo == 200: +# for contrato in dados: +# print(f'{contrato}') +# for vs_currency in dados[contrato]: +# print(f'\t{vs_currency}: {dados[contrato][vs_currency]}') +# else: +# print(f'erro {codigo}: {dados}') + + +def supported_currencies_list() -> tuple: + '''https://docs.coingecko.com/v3.0.1/reference/simple-supported-currencies + + este endpoint permite consultar quais as moedas de referencia suportadas pela CoinGecko''' + return API('simple/supported_vs_currencies', {}) + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = supported_currencies_list() +# print(f'url: {url}') +# if codigo == 200: +# for moeda in dados: +# print(f'{moeda}') +# else: +# print(f'erro {codigo}: {dados}') + + +def coins_list(include_platform: bool = False) -> tuple: + '''https://docs.coingecko.com/v3.0.1/reference/coins-list + + obter todas as moedas suportadas em CoinGecko com IDs, nome, + simbolo e (no caso de contractos) endereco na plataforma das moedas + ''' + # dicionario de parametros + api_parameters= { + 'include_platform': '', + } + # validacao parametros + # include_platform + if not isinstance(include_platform, bool): + include_platform = False + if include_platform: + api_parameters['include_platform'] = str(True).lower() + + return API('coins/list', api_parameters) + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list(include_platform=False) +# print(f'url: {url}') +# if codigo == 200: +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +# lista auxiliar para ordenação dos dados retornados por coins_list_with_market_data() +lista_tipos_ordenacao = [ + 'market_cap_asc', + 'market_cap_desc', + 'volume_asc', + 'volume_desc', + 'id_asc', + 'id_desc' +] +# lista auxiliar para parametro 'price_change_percentage' +lista_timeframe_price_change = [ + '1h', + '24h', + '7d', + '14d', + '30d', + '200d', + '1y' +] +def coins_list_with_market_data( + vs_currency: str = '', + ids: str = '', + category: str = '', + order: str = '', + per_page: int = 100, + page: int = 0, + sparkline: bool = False, + price_change_percentage: str = '', + locale: str = '', + precision: int | str = '' +) -> tuple: + ''' + https://docs.coingecko.com/v3.0.1/reference/coins-markets + + consultar preço, cap mercado, volume e dados de mercado de todas as moedas suportadas + + ''' + # dicionario de parametros para passar para a API, todos os valores tem de ser do tipo 'str' + api_parameters = { + 'vs_currency': '', + 'ids': '', + 'category': '', + 'order': '', + 'per_page': '', + 'page': '', + 'sparkline': '', + 'price_change_percentage': '', + 'locale': '', + 'precision': '', + } + # validação de parametros + # vs_currency + if not isinstance(vs_currency, str): + raise TypeError('\'vs_currency\' tem de ser do tipo \'str\'') + if vs_currency == '' or vs_currency == ' ': + raise ValueError('\'vs_currency\' tem de ser definido') + api_parameters['vs_currency'] = vs_currency + # ids + if not isinstance(ids, str): + raise TypeError('\'ids\' tem de ser do tipo \'str\'') + if ids != '': + api_parameters['ids'] = ids + # category + if not isinstance(category, str): + raise TypeError('\'category\' tem de ser do tipo \'str\'') + if category != '': + api_parameters['category'] = category + if ids == '' and category == '': + raise ValueError('\'ids\' ou \'category\' têm de ser definidos') + # order + if not isinstance(order, str): + raise TypeError('\'order\' tem de ser do tipo \'str\'') + if not order in lista_tipos_ordenacao: + order = lista_tipos_ordenacao[1] + api_parameters['order'] = order + # per_page + if not isinstance(per_page, int): + raise TypeError('\'per_page\' tem de ser do tipo \'int\'') + if (per_page < 1) or (per_page > 250): + per_page = 100 + api_parameters['per_page'] = str(per_page) + # page + if not isinstance(page, int): + raise TypeError('\'page\' tem de ser do tipo \'int\'') + api_parameters['page'] = str(page) + # sparkline + if not isinstance(sparkline, bool): + raise TypeError('\'sparkline\' tem de ser do tipo \'bool\'') + if sparkline: + api_parameters['sparkline'] = str(True).lower() + # price_change_percentage + if not isinstance(price_change_percentage, str): + raise TypeError('\'price_change_percentage\' tem de ser do tipo \'str\'') + for timeframe in price_change_percentage.split(','): + if not timeframe in lista_timeframe_price_change: + price_change_percentage = lista_timeframe_price_change[0] + else: + price_change_percentage += f',{timeframe}' + api_parameters['price_change_percentage'] = price_change_percentage + # locale + if not isinstance(locale, str): + raise TypeError('\'locale\' tem de ser do tipo \'str\'') + api_parameters['locale'] = locale + # precision + if precision != '': + if not isinstance(precision, (int, str)): + raise TypeError('\'precision\' tem de ser do tipo \'int\' ou \'str\'') + if isinstance(precision, str): + if precision == 'full': + precision = '18' + precision = int(precision) + if isinstance(precision, int): + if precision < 0: + precision = 0 + if precision > 18: + precision = 18 + precision = str(precision) + api_parameters['precision'] = precision + + return API('coins/markets', api_parameters) + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def coin_data_by_id( + id_criptomoeda: str = '', + localization: bool = True, + tickers: bool = True, + market_data: bool = True, + community_data: bool = True, + developer_data: bool = True, + sparkline: bool = False, +) -> tuple: + '''https://docs.coingecko.com/v3.0.1/reference/coins-id + + este endpoint permite fazer uma consulta a todos os dados de uma moeda + (nome, preço, dados mercado... incluindo tickers de correctora) na + CoinGecko com base numa id de moeda + ''' + # dicionario de parametros + api_parameters = { + 'id': '', + 'localization': '', + 'tickers': '', + 'market_data': '', + 'community_data': '', + 'developer_data': '', + 'sparkline': '', + } + # validação de parametros + # id_criptomoeda (como 'id' é nome reservado, foi usado outro nome) + if not isinstance(id_criptomoeda, str): + raise TypeError('\'id_criptomoeda\' tem de ser do tipo \'str\'') + if id_criptomoeda == '': + raise ValueError('\'id_criptomoeda\' tem de ser definido') + api_parameters['id'] = id_criptomoeda + # localization + if not isinstance(localization, bool): + raise TypeError('\'localization\' tem de ser do tipo \'bool\'') + if not localization: + api_parameters['localization'] = str(localization).lower() + # tickers + if not isinstance(tickers, bool): + raise TypeError('\'tickers\' tem de ser do tipo \'bool\'') + if not tickers: + api_parameters['tickers'] = str(tickers).lower() + # market_data + if not isinstance(market_data, bool): + raise TypeError('\'market_data\' tem de ser do tipo \'bool\'') + if not market_data: + api_parameters['market_data'] = str(market_data).lower() + # community_data + if not isinstance(community_data, bool): + raise TypeError('\'community_data\' tem de ser do tipo \'bool\'') + if not community_data: + api_parameters['community_data'] = str(community_data).lower() + # developer_data + if not isinstance(developer_data, bool): + raise TypeError('\'developer_data\' tem de ser do tipo \'bool\'') + if not developer_data: + api_parameters['developer_data'] = str(developer_data).lower() + # sparkline + if not isinstance(sparkline, bool): + raise TypeError('\'sparkline\' tem de ser do tipo \'bool\'') + if sparkline: + api_parameters['sparkline'] = str(sparkline).lower() + + return API(f'coins/{api_parameters['id']}', api_parameters) + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coin_data_by_id('bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# for item in dados: +# print(f'{item}') +# else: +# print(f'erro {codigo}: {dados}') + +def coin_tickers_by_id( + id_criptomoeda: str = '', + exchange_ids: str = '', + include_exchange_logo: bool = False, + page: int = -1, + order: str = '', + depth: bool = False +) -> tuple: + '''https://docs.coingecko.com/v3.0.1/reference/coins-id-tickers + + este endpoint permite fazer uma consulta de tickers tanto em + correctoras centralizadas como descentralizadas a partir de um id + de moeda + ''' + # dicionario parametros + api_parameters: dict[str, str] = { + 'id': '', + 'exchange_ids': '', + 'include_exchange_logo': '', + 'page': '', + 'order': '', + 'depth': '', + } + # validacao parametros + # id_criptomoeda (como 'id' é nome reservado, foi usado outro nome) + if not isinstance(id_criptomoeda, str): + raise TypeError('\'id_criptomoeda\' tem de ser do tipo \'str\'') + if id_criptomoeda == '': + raise ValueError('\'id_cripomoeda\' tem de ser definido') + api_parameters['id'] = id_criptomoeda + # exchange_ids + if not isinstance(exchange_ids, str): + raise TypeError('\'exchange_ids\' tem de ser do tipo \'str\'') + if exchange_ids != '': + api_parameters['exchange_ids'] = exchange_ids + # include_exchange_logo + if not isinstance(include_exchange_logo, bool): + raise TypeError('\'include_exchange_logo\' tem de ser do tipo \'str\'') + if include_exchange_logo: + api_parameters['include_exchange_logo'] = str(include_exchange_logo).lower() + # page + if not isinstance(page, int | None): + raise TypeError('\'page\' tem de ser do tipo \'int\'') + if page != None: + if page < 1: + page = 1 + api_parameters['page'] = str(page) + # order + if not isinstance(order, str): + raise TypeError('\'order\' tem de ser do tipo \'str\'') + if order != '': + api_parameters['order'] = order + # depth + if not isinstance(depth, bool): + raise TypeError('\'depth\' tem de ser do tipo \'bool\'') + if depth: + api_parameters['depth'] = str(depth).lower() + + return API(f'coins/{api_parameters['id']}/tickers', api_parameters) + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coin_tickers_by_id('bitcoin',include_exchange_logo=True) +# print(f'url: {url}') +# if codigo == 200: +# for item in dados: +# print(f'{item}: {dados[item]}') +# else: +# print(f'erro {codigo}: {dados}') + + +def coin_historical_data_by_id( + id_criptomoeda: str = '', + date: str = '', + localization: bool = True +) -> tuple: + '''https://docs.coingecko.com/v3.0.1/reference/coins-id-history + + este endpoint permite fazer consulta de dados historicos (preco, cap mercado, volume 24h, + etc) sobre uma moeda numa determinada data, passando o id da moeda. + ''' + # dicionario parametros + api_parameters: dict[str, str] = { + 'id': '', + 'date': '', + 'localization': '', + } + # validacao de parametros + # id_criptomoeda (como 'id' é nome reservado, foi usado outro nome) + if not isinstance(id_criptomoeda, str): + raise TypeError('\'id_criptomoeda\' tem de ser do tipo \'str\'') + if id_criptomoeda == None or id_criptomoeda == '': + raise ValueError('\'id_criptomoeda\' tem de ser definido') + api_parameters['id'] = id_criptomoeda + # date + if not isinstance(date, str): + raise TypeError('\'date\' tem de ser do tipo \'str\'') + if date == '' or date == None: + raise ValueError('\'date\' tem de ser definido') + if date != '': + api_parameters['date'] = date + # localization + if not isinstance(localization, bool): + raise TypeError('\'localization\' tem de ser do tipo \'bool\'') + if not localization: + api_parameters['localization'] = str(localization).lower() + + return API(f'coins/{api_parameters['id']}/history', api_parameters) + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coin_historical_data_by_id('bitcoin','10-12-2023',localization=False) +# print(f'url: {url}') +# if codigo == 200: +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def coin_historical_chart_data_by_id( + id_criptomoeda: str = '', + vs_currency: str = '', + days: str = '', + interval: str = '', + precision: int | str = 'full' +) -> tuple: + '''https://docs.coingecko.com/v3.0.1/reference/coins-id-market-chart + + este endpoint permite fazer consulta para obter dados historicos graficos que + incluem tempo unix, preco, capitalizacao mercado e volume 24h a partir de um id de moeda + ''' + # dicionario parametros + api_parameters = { + 'id': '', + 'vs_currency': '', + 'days': '', + 'interval': '', + 'precision': '', + } + # validacao de parametros + # id_criptomoeda (como 'id' é nome reservado, foi usado outro nome) + if not isinstance(id_criptomoeda, str): + raise TypeError('\'id_criptomoeda\' tem de ser do tipo \'str\'') + if id_criptomoeda == '': + raise ValueError('\'id_criptomoeda\' tem de ser definido') + api_parameters['id'] = id_criptomoeda + # vs_currency + if not isinstance(vs_currency, str): + raise TypeError('\'vs_currency\' tem de ser do tipo \'str\'') + if vs_currency == '': + raise ValueError('\'vs_currency\' tem de ser definido') + api_parameters['vs_currency'] = vs_currency + # days + if not isinstance(days, str): + raise TypeError('\'days\' tem de ser do tipo \'str\'') + if days == '': + raise ValueError('\'days\' tem de ser definido') + api_parameters['days'] = days + # interval + if not isinstance(interval, str): + raise TypeError('\'interval\' tem de ser do tipo \'str\'') + if interval != '': + api_parameters['interval'] = interval + # precision + if not isinstance(precision,( int, str)): + raise TypeError('\'precision\' tem de ser do tipo \'str\' ou \'int\'') + if isinstance(precision, str): + if precision == 'full': + precision = '18' + precision = int(precision) + if isinstance(precision, int): + if precision < 0: + precision = 0 + if precision > 18: + precision = 18 + api_parameters['precision'] = str(precision) + + return API(f'coins/{api_parameters['id']}/market_chart', api_parameters) + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coin_historical_chart_data_by_id('bitcoin', 'eur', '30') +# print(f'url: {url}') +# if codigo == 200: +# for item in dados: +# print(f'{item}: {dados[item]}') +# else: +# print(f'erro {codigo}: {dados}') + + +def coin_historical_chart_data_within_time_range_by_id() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def coin_ohlc_chart_by_id() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def coin_data_by_token_address() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def coin_historical_chart_data_by_token_address() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def coin_historical_chart_data_within_time_range_by_token_address() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def assets_platforms_list() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def coins_categories_list() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def coins_categories_list_with_market_data() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def exchanges_list_with_data() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def exchanges_list() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def exchange_data_by_id() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def exchange_tickers_by_id() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def exchange_colume_chart_by_id() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def derivatives_tickers_list() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def derivatives_exchange_list_with_data() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def derivatives_exchange_data_by_id() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def derivatives_exchanges_list() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def nfts_list() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def nfts_collection_data_by_id() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def nfts_collection_data_by_contrat_address() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def btc_to_curency_exchange_rates() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def search_queries() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def trending_search_list() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def crypto_global_market_data() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def global_defi_market_data() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +def public_companies_holdings() -> tuple: + pass + + +# debug (decomentar linhas seguintes para testar funcao) +# url, codigo, dados = coins_list_with_market_data('eur', 'bitcoin') +# print(f'url: {url}') +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) +# else: +# print(f'erro {codigo}: {dados}') + + +# ===================================================== +# fazer consulta de dados OHLC +def consulta_ohcl(criptomoeda: str = '', + vs_currency: str = '', + dias: int | str = 30, + precisao: int | str = 3 + ) -> tuple: + # validacao de parametros + if not isinstance(criptomoeda, str): + raise TypeError('\'criptomoeda\' não é do tipo \'str\'') + if criptomoeda == '': + raise ValueError('\'criptomoeda\' tem de ser definido') + if not isinstance(vs_currency, str): + raise TypeError('\'vs_currency\' não é do tipo \'str\'') + if vs_currency == '': + raise ValueError('\'vs_currency\' tem de ser definido') + if (not isinstance(dias, str)) and (not isinstance(dias, int)): + raise TypeError('\'dias\' não é do tipo \'str\' ou \'int\'') + if isinstance(dias, int): + dias = str(dias) + if (not isinstance(precisao, str)) and (not isinstance(precisao, int)): + raise TypeError('\'precisao\' não é do tipo \'str\' ou \'int\'') + if isinstance(precisao, int): + precisao = str(precisao) + + endpoint_api = 'coins/' + criptomoeda + '/ohlc?vs_currency=' + vs_currency + '&days=' + dias + '&precision=' + precisao + url_pedido = url_raiz_API + endpoint_api + resposta = requests.get(url_pedido, headers=headers) + return resposta.status_code, resposta.json() + + +# debug (decomentar linhas seguintes para testar funcao) +# codigo, dados = consulta_ohcl('dogecoin', 'eur', precisao=5) +# if codigo == 200: +# print(f'codigo: {codigo}') +# for item in dados: +# print(item) diff --git a/testes/teste_coingecko_api.py b/testes/teste_coingecko_api.py new file mode 100644 index 0000000..0669056 --- /dev/null +++ b/testes/teste_coingecko_api.py @@ -0,0 +1,38 @@ +import unittest + +import modulos.coingecko_api as cgapi + + +class Teste_API(unittest.TestCase): + '''teste API()''' + pass + + +class Teste_ping(unittest.TestCase): + '''teste ping()''' + pass + + +class Teste_coin_price_by_ids(unittest.TestCase): + '''teste coin_price_by_ids()''' + pass + + +class Teste_supported_currencies_list(unittest.TestCase): + '''teste supported_currencies_list()''' + pass + + +class Teste_coin_price_by_token_addresses(unittest.TestCase): + '''teste coin_price_by_token_addresses()''' + pass + + +class Teste_coins_list(unittest.TestCase): + '''teste coins_list()''' + pass + + +class Teste_coins_list_with_market_data(unittest.TestCase): + '''teste coins_list_with_market_data()''' + pass \ No newline at end of file