intentkit 0.5.0__py3-none-any.whl → 0.5.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of intentkit might be problematic. Click here for more details.
- intentkit/__init__.py +17 -0
- intentkit/abstracts/__init__.py +0 -0
- intentkit/abstracts/agent.py +60 -0
- intentkit/abstracts/api.py +4 -0
- intentkit/abstracts/engine.py +38 -0
- intentkit/abstracts/exception.py +9 -0
- intentkit/abstracts/graph.py +25 -0
- intentkit/abstracts/skill.py +129 -0
- intentkit/abstracts/twitter.py +54 -0
- intentkit/clients/__init__.py +14 -0
- intentkit/clients/cdp.py +53 -0
- intentkit/clients/twitter.py +445 -0
- intentkit/config/__init__.py +0 -0
- intentkit/config/config.py +164 -0
- intentkit/core/__init__.py +0 -0
- intentkit/core/agent.py +191 -0
- intentkit/core/api.py +40 -0
- intentkit/core/client.py +45 -0
- intentkit/core/credit.py +1767 -0
- intentkit/core/engine.py +1018 -0
- intentkit/core/node.py +223 -0
- intentkit/core/prompt.py +58 -0
- intentkit/core/skill.py +124 -0
- intentkit/models/agent.py +1689 -0
- intentkit/models/agent_data.py +810 -0
- intentkit/models/agent_schema.json +733 -0
- intentkit/models/app_setting.py +156 -0
- intentkit/models/base.py +9 -0
- intentkit/models/chat.py +581 -0
- intentkit/models/conversation.py +286 -0
- intentkit/models/credit.py +1406 -0
- intentkit/models/db.py +120 -0
- intentkit/models/db_mig.py +102 -0
- intentkit/models/generator.py +347 -0
- intentkit/models/llm.py +746 -0
- intentkit/models/redis.py +132 -0
- intentkit/models/skill.py +466 -0
- intentkit/models/user.py +243 -0
- intentkit/skills/__init__.py +12 -0
- intentkit/skills/acolyt/__init__.py +83 -0
- intentkit/skills/acolyt/acolyt.jpg +0 -0
- intentkit/skills/acolyt/ask.py +128 -0
- intentkit/skills/acolyt/base.py +28 -0
- intentkit/skills/acolyt/schema.json +89 -0
- intentkit/skills/aixbt/README.md +71 -0
- intentkit/skills/aixbt/__init__.py +73 -0
- intentkit/skills/aixbt/aixbt.jpg +0 -0
- intentkit/skills/aixbt/base.py +21 -0
- intentkit/skills/aixbt/projects.py +153 -0
- intentkit/skills/aixbt/schema.json +99 -0
- intentkit/skills/allora/__init__.py +83 -0
- intentkit/skills/allora/allora.jpeg +0 -0
- intentkit/skills/allora/base.py +28 -0
- intentkit/skills/allora/price.py +130 -0
- intentkit/skills/allora/schema.json +89 -0
- intentkit/skills/base.py +174 -0
- intentkit/skills/carv/README.md +95 -0
- intentkit/skills/carv/__init__.py +121 -0
- intentkit/skills/carv/base.py +183 -0
- intentkit/skills/carv/carv.webp +0 -0
- intentkit/skills/carv/fetch_news.py +92 -0
- intentkit/skills/carv/onchain_query.py +164 -0
- intentkit/skills/carv/schema.json +137 -0
- intentkit/skills/carv/token_info_and_price.py +110 -0
- intentkit/skills/cdp/__init__.py +137 -0
- intentkit/skills/cdp/base.py +21 -0
- intentkit/skills/cdp/cdp.png +0 -0
- intentkit/skills/cdp/get_balance.py +81 -0
- intentkit/skills/cdp/schema.json +473 -0
- intentkit/skills/chainlist/README.md +38 -0
- intentkit/skills/chainlist/__init__.py +54 -0
- intentkit/skills/chainlist/base.py +21 -0
- intentkit/skills/chainlist/chain_lookup.py +208 -0
- intentkit/skills/chainlist/chainlist.png +0 -0
- intentkit/skills/chainlist/schema.json +47 -0
- intentkit/skills/common/__init__.py +82 -0
- intentkit/skills/common/base.py +21 -0
- intentkit/skills/common/common.jpg +0 -0
- intentkit/skills/common/current_time.py +84 -0
- intentkit/skills/common/schema.json +57 -0
- intentkit/skills/cookiefun/README.md +121 -0
- intentkit/skills/cookiefun/__init__.py +78 -0
- intentkit/skills/cookiefun/base.py +41 -0
- intentkit/skills/cookiefun/constants.py +18 -0
- intentkit/skills/cookiefun/cookiefun.png +0 -0
- intentkit/skills/cookiefun/get_account_details.py +171 -0
- intentkit/skills/cookiefun/get_account_feed.py +282 -0
- intentkit/skills/cookiefun/get_account_smart_followers.py +181 -0
- intentkit/skills/cookiefun/get_sectors.py +128 -0
- intentkit/skills/cookiefun/schema.json +155 -0
- intentkit/skills/cookiefun/search_accounts.py +225 -0
- intentkit/skills/cryptocompare/__init__.py +130 -0
- intentkit/skills/cryptocompare/api.py +159 -0
- intentkit/skills/cryptocompare/base.py +303 -0
- intentkit/skills/cryptocompare/cryptocompare.png +0 -0
- intentkit/skills/cryptocompare/fetch_news.py +96 -0
- intentkit/skills/cryptocompare/fetch_price.py +99 -0
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +113 -0
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +109 -0
- intentkit/skills/cryptocompare/fetch_top_volume.py +108 -0
- intentkit/skills/cryptocompare/fetch_trading_signals.py +107 -0
- intentkit/skills/cryptocompare/schema.json +168 -0
- intentkit/skills/cryptopanic/__init__.py +108 -0
- intentkit/skills/cryptopanic/base.py +51 -0
- intentkit/skills/cryptopanic/cryptopanic.png +0 -0
- intentkit/skills/cryptopanic/fetch_crypto_news.py +153 -0
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +136 -0
- intentkit/skills/cryptopanic/schema.json +103 -0
- intentkit/skills/dapplooker/README.md +92 -0
- intentkit/skills/dapplooker/__init__.py +83 -0
- intentkit/skills/dapplooker/base.py +26 -0
- intentkit/skills/dapplooker/dapplooker.jpg +0 -0
- intentkit/skills/dapplooker/dapplooker_token_data.py +476 -0
- intentkit/skills/dapplooker/schema.json +91 -0
- intentkit/skills/defillama/__init__.py +323 -0
- intentkit/skills/defillama/api.py +315 -0
- intentkit/skills/defillama/base.py +135 -0
- intentkit/skills/defillama/coins/__init__.py +0 -0
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +116 -0
- intentkit/skills/defillama/coins/fetch_block.py +98 -0
- intentkit/skills/defillama/coins/fetch_current_prices.py +105 -0
- intentkit/skills/defillama/coins/fetch_first_price.py +100 -0
- intentkit/skills/defillama/coins/fetch_historical_prices.py +110 -0
- intentkit/skills/defillama/coins/fetch_price_chart.py +109 -0
- intentkit/skills/defillama/coins/fetch_price_percentage.py +93 -0
- intentkit/skills/defillama/config/__init__.py +0 -0
- intentkit/skills/defillama/config/chains.py +433 -0
- intentkit/skills/defillama/defillama.jpeg +0 -0
- intentkit/skills/defillama/fees/__init__.py +0 -0
- intentkit/skills/defillama/fees/fetch_fees_overview.py +130 -0
- intentkit/skills/defillama/schema.json +383 -0
- intentkit/skills/defillama/stablecoins/__init__.py +0 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +100 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +129 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +83 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +126 -0
- intentkit/skills/defillama/tests/__init__.py +0 -0
- intentkit/skills/defillama/tests/api_integration.test.py +192 -0
- intentkit/skills/defillama/tests/api_unit.test.py +583 -0
- intentkit/skills/defillama/tvl/__init__.py +0 -0
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +106 -0
- intentkit/skills/defillama/tvl/fetch_chains.py +107 -0
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +91 -0
- intentkit/skills/defillama/tvl/fetch_protocol.py +207 -0
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +93 -0
- intentkit/skills/defillama/tvl/fetch_protocols.py +196 -0
- intentkit/skills/defillama/volumes/__init__.py +0 -0
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +157 -0
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +123 -0
- intentkit/skills/defillama/volumes/fetch_options_overview.py +131 -0
- intentkit/skills/defillama/yields/__init__.py +0 -0
- intentkit/skills/defillama/yields/fetch_pool_chart.py +100 -0
- intentkit/skills/defillama/yields/fetch_pools.py +126 -0
- intentkit/skills/dexscreener/__init__.py +93 -0
- intentkit/skills/dexscreener/base.py +133 -0
- intentkit/skills/dexscreener/dexscreener.png +0 -0
- intentkit/skills/dexscreener/model/__init__.py +0 -0
- intentkit/skills/dexscreener/model/search_token_response.py +82 -0
- intentkit/skills/dexscreener/schema.json +48 -0
- intentkit/skills/dexscreener/search_token.py +321 -0
- intentkit/skills/dune_analytics/__init__.py +103 -0
- intentkit/skills/dune_analytics/base.py +46 -0
- intentkit/skills/dune_analytics/dune.png +0 -0
- intentkit/skills/dune_analytics/fetch_kol_buys.py +128 -0
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +237 -0
- intentkit/skills/dune_analytics/schema.json +99 -0
- intentkit/skills/elfa/README.md +100 -0
- intentkit/skills/elfa/__init__.py +123 -0
- intentkit/skills/elfa/base.py +28 -0
- intentkit/skills/elfa/elfa.jpg +0 -0
- intentkit/skills/elfa/mention.py +504 -0
- intentkit/skills/elfa/schema.json +153 -0
- intentkit/skills/elfa/stats.py +118 -0
- intentkit/skills/elfa/tokens.py +126 -0
- intentkit/skills/enso/README.md +75 -0
- intentkit/skills/enso/__init__.py +114 -0
- intentkit/skills/enso/abi/__init__.py +0 -0
- intentkit/skills/enso/abi/approval.py +279 -0
- intentkit/skills/enso/abi/erc20.py +14 -0
- intentkit/skills/enso/abi/route.py +129 -0
- intentkit/skills/enso/base.py +44 -0
- intentkit/skills/enso/best_yield.py +286 -0
- intentkit/skills/enso/enso.jpg +0 -0
- intentkit/skills/enso/networks.py +105 -0
- intentkit/skills/enso/prices.py +93 -0
- intentkit/skills/enso/route.py +300 -0
- intentkit/skills/enso/schema.json +212 -0
- intentkit/skills/enso/tokens.py +223 -0
- intentkit/skills/enso/wallet.py +381 -0
- intentkit/skills/github/README.md +63 -0
- intentkit/skills/github/__init__.py +54 -0
- intentkit/skills/github/base.py +21 -0
- intentkit/skills/github/github.jpg +0 -0
- intentkit/skills/github/github_search.py +183 -0
- intentkit/skills/github/schema.json +59 -0
- intentkit/skills/heurist/__init__.py +143 -0
- intentkit/skills/heurist/base.py +26 -0
- intentkit/skills/heurist/heurist.png +0 -0
- intentkit/skills/heurist/image_generation_animagine_xl.py +162 -0
- intentkit/skills/heurist/image_generation_arthemy_comics.py +162 -0
- intentkit/skills/heurist/image_generation_arthemy_real.py +162 -0
- intentkit/skills/heurist/image_generation_braindance.py +162 -0
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +162 -0
- intentkit/skills/heurist/image_generation_flux_1_dev.py +162 -0
- intentkit/skills/heurist/image_generation_sdxl.py +161 -0
- intentkit/skills/heurist/schema.json +196 -0
- intentkit/skills/lifi/README.md +294 -0
- intentkit/skills/lifi/__init__.py +141 -0
- intentkit/skills/lifi/base.py +21 -0
- intentkit/skills/lifi/lifi.png +0 -0
- intentkit/skills/lifi/schema.json +89 -0
- intentkit/skills/lifi/token_execute.py +472 -0
- intentkit/skills/lifi/token_quote.py +190 -0
- intentkit/skills/lifi/utils.py +656 -0
- intentkit/skills/moralis/README.md +490 -0
- intentkit/skills/moralis/__init__.py +110 -0
- intentkit/skills/moralis/api.py +281 -0
- intentkit/skills/moralis/base.py +55 -0
- intentkit/skills/moralis/fetch_chain_portfolio.py +191 -0
- intentkit/skills/moralis/fetch_nft_portfolio.py +284 -0
- intentkit/skills/moralis/fetch_solana_portfolio.py +331 -0
- intentkit/skills/moralis/fetch_wallet_portfolio.py +301 -0
- intentkit/skills/moralis/moralis.png +0 -0
- intentkit/skills/moralis/schema.json +156 -0
- intentkit/skills/moralis/tests/__init__.py +0 -0
- intentkit/skills/moralis/tests/test_wallet.py +511 -0
- intentkit/skills/nation/__init__.py +62 -0
- intentkit/skills/nation/base.py +31 -0
- intentkit/skills/nation/nation.png +0 -0
- intentkit/skills/nation/nft_check.py +106 -0
- intentkit/skills/nation/schema.json +58 -0
- intentkit/skills/openai/__init__.py +107 -0
- intentkit/skills/openai/base.py +32 -0
- intentkit/skills/openai/dalle_image_generation.py +128 -0
- intentkit/skills/openai/gpt_image_generation.py +152 -0
- intentkit/skills/openai/gpt_image_to_image.py +186 -0
- intentkit/skills/openai/image_to_text.py +126 -0
- intentkit/skills/openai/openai.png +0 -0
- intentkit/skills/openai/schema.json +139 -0
- intentkit/skills/portfolio/README.md +55 -0
- intentkit/skills/portfolio/__init__.py +151 -0
- intentkit/skills/portfolio/base.py +107 -0
- intentkit/skills/portfolio/constants.py +9 -0
- intentkit/skills/portfolio/moralis.png +0 -0
- intentkit/skills/portfolio/schema.json +237 -0
- intentkit/skills/portfolio/token_balances.py +155 -0
- intentkit/skills/portfolio/wallet_approvals.py +102 -0
- intentkit/skills/portfolio/wallet_defi_positions.py +80 -0
- intentkit/skills/portfolio/wallet_history.py +155 -0
- intentkit/skills/portfolio/wallet_net_worth.py +112 -0
- intentkit/skills/portfolio/wallet_nfts.py +139 -0
- intentkit/skills/portfolio/wallet_profitability.py +101 -0
- intentkit/skills/portfolio/wallet_profitability_summary.py +91 -0
- intentkit/skills/portfolio/wallet_stats.py +79 -0
- intentkit/skills/portfolio/wallet_swaps.py +147 -0
- intentkit/skills/skills.toml +103 -0
- intentkit/skills/slack/__init__.py +98 -0
- intentkit/skills/slack/base.py +55 -0
- intentkit/skills/slack/get_channel.py +109 -0
- intentkit/skills/slack/get_message.py +136 -0
- intentkit/skills/slack/schedule_message.py +92 -0
- intentkit/skills/slack/schema.json +135 -0
- intentkit/skills/slack/send_message.py +81 -0
- intentkit/skills/slack/slack.jpg +0 -0
- intentkit/skills/system/__init__.py +90 -0
- intentkit/skills/system/base.py +22 -0
- intentkit/skills/system/read_agent_api_key.py +87 -0
- intentkit/skills/system/regenerate_agent_api_key.py +77 -0
- intentkit/skills/system/schema.json +53 -0
- intentkit/skills/system/system.svg +76 -0
- intentkit/skills/tavily/README.md +86 -0
- intentkit/skills/tavily/__init__.py +91 -0
- intentkit/skills/tavily/base.py +27 -0
- intentkit/skills/tavily/schema.json +119 -0
- intentkit/skills/tavily/tavily.jpg +0 -0
- intentkit/skills/tavily/tavily_extract.py +147 -0
- intentkit/skills/tavily/tavily_search.py +139 -0
- intentkit/skills/token/README.md +89 -0
- intentkit/skills/token/__init__.py +107 -0
- intentkit/skills/token/base.py +154 -0
- intentkit/skills/token/constants.py +9 -0
- intentkit/skills/token/erc20_transfers.py +145 -0
- intentkit/skills/token/moralis.png +0 -0
- intentkit/skills/token/schema.json +141 -0
- intentkit/skills/token/token_analytics.py +81 -0
- intentkit/skills/token/token_price.py +132 -0
- intentkit/skills/token/token_search.py +121 -0
- intentkit/skills/twitter/__init__.py +146 -0
- intentkit/skills/twitter/base.py +68 -0
- intentkit/skills/twitter/follow_user.py +69 -0
- intentkit/skills/twitter/get_mentions.py +124 -0
- intentkit/skills/twitter/get_timeline.py +111 -0
- intentkit/skills/twitter/get_user_by_username.py +84 -0
- intentkit/skills/twitter/get_user_tweets.py +123 -0
- intentkit/skills/twitter/like_tweet.py +65 -0
- intentkit/skills/twitter/post_tweet.py +90 -0
- intentkit/skills/twitter/reply_tweet.py +98 -0
- intentkit/skills/twitter/retweet.py +76 -0
- intentkit/skills/twitter/schema.json +258 -0
- intentkit/skills/twitter/search_tweets.py +115 -0
- intentkit/skills/twitter/twitter.png +0 -0
- intentkit/skills/unrealspeech/__init__.py +55 -0
- intentkit/skills/unrealspeech/base.py +21 -0
- intentkit/skills/unrealspeech/schema.json +100 -0
- intentkit/skills/unrealspeech/text_to_speech.py +177 -0
- intentkit/skills/unrealspeech/unrealspeech.jpg +0 -0
- intentkit/skills/venice_audio/__init__.py +106 -0
- intentkit/skills/venice_audio/base.py +119 -0
- intentkit/skills/venice_audio/input.py +41 -0
- intentkit/skills/venice_audio/schema.json +152 -0
- intentkit/skills/venice_audio/venice_audio.py +240 -0
- intentkit/skills/venice_audio/venice_logo.jpg +0 -0
- intentkit/skills/venice_image/README.md +119 -0
- intentkit/skills/venice_image/__init__.py +154 -0
- intentkit/skills/venice_image/api.py +138 -0
- intentkit/skills/venice_image/base.py +188 -0
- intentkit/skills/venice_image/config.py +35 -0
- intentkit/skills/venice_image/image_enhance/README.md +119 -0
- intentkit/skills/venice_image/image_enhance/__init__.py +0 -0
- intentkit/skills/venice_image/image_enhance/image_enhance.py +80 -0
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +23 -0
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +40 -0
- intentkit/skills/venice_image/image_generation/README.md +144 -0
- intentkit/skills/venice_image/image_generation/__init__.py +0 -0
- intentkit/skills/venice_image/image_generation/image_generation_base.py +117 -0
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -0
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -0
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -0
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -0
- intentkit/skills/venice_image/image_upscale/README.md +111 -0
- intentkit/skills/venice_image/image_upscale/__init__.py +0 -0
- intentkit/skills/venice_image/image_upscale/image_upscale.py +90 -0
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +23 -0
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -0
- intentkit/skills/venice_image/image_vision/README.md +112 -0
- intentkit/skills/venice_image/image_vision/__init__.py +0 -0
- intentkit/skills/venice_image/image_vision/image_vision.py +100 -0
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -0
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -0
- intentkit/skills/venice_image/schema.json +267 -0
- intentkit/skills/venice_image/utils.py +78 -0
- intentkit/skills/venice_image/venice_image.jpg +0 -0
- intentkit/skills/web_scraper/README.md +82 -0
- intentkit/skills/web_scraper/__init__.py +92 -0
- intentkit/skills/web_scraper/base.py +21 -0
- intentkit/skills/web_scraper/langchain.png +0 -0
- intentkit/skills/web_scraper/schema.json +115 -0
- intentkit/skills/web_scraper/scrape_and_index.py +327 -0
- intentkit/utils/__init__.py +1 -0
- intentkit/utils/chain.py +436 -0
- intentkit/utils/error.py +134 -0
- intentkit/utils/logging.py +70 -0
- intentkit/utils/middleware.py +61 -0
- intentkit/utils/random.py +16 -0
- intentkit/utils/s3.py +267 -0
- intentkit/utils/slack_alert.py +79 -0
- intentkit/utils/tx.py +37 -0
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/METADATA +1 -1
- intentkit-0.5.2.dist-info/RECORD +365 -0
- intentkit-0.5.0.dist-info/RECORD +0 -4
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/WHEEL +0 -0
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
"""DeFi Llama skills."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import TypedDict
|
|
5
|
+
|
|
6
|
+
from intentkit.abstracts.skill import SkillStoreABC
|
|
7
|
+
from intentkit.skills.base import SkillConfig, SkillState
|
|
8
|
+
from intentkit.skills.defillama.base import DefiLlamaBaseTool
|
|
9
|
+
from intentkit.skills.defillama.coins.fetch_batch_historical_prices import (
|
|
10
|
+
DefiLlamaFetchBatchHistoricalPrices,
|
|
11
|
+
)
|
|
12
|
+
from intentkit.skills.defillama.coins.fetch_block import DefiLlamaFetchBlock
|
|
13
|
+
|
|
14
|
+
# Coins Tools
|
|
15
|
+
from intentkit.skills.defillama.coins.fetch_current_prices import (
|
|
16
|
+
DefiLlamaFetchCurrentPrices,
|
|
17
|
+
)
|
|
18
|
+
from intentkit.skills.defillama.coins.fetch_first_price import DefiLlamaFetchFirstPrice
|
|
19
|
+
from intentkit.skills.defillama.coins.fetch_historical_prices import (
|
|
20
|
+
DefiLlamaFetchHistoricalPrices,
|
|
21
|
+
)
|
|
22
|
+
from intentkit.skills.defillama.coins.fetch_price_chart import DefiLlamaFetchPriceChart
|
|
23
|
+
from intentkit.skills.defillama.coins.fetch_price_percentage import (
|
|
24
|
+
DefiLlamaFetchPricePercentage,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
# Fees Tools
|
|
28
|
+
from intentkit.skills.defillama.fees.fetch_fees_overview import (
|
|
29
|
+
DefiLlamaFetchFeesOverview,
|
|
30
|
+
)
|
|
31
|
+
from intentkit.skills.defillama.stablecoins.fetch_stablecoin_chains import (
|
|
32
|
+
DefiLlamaFetchStablecoinChains,
|
|
33
|
+
)
|
|
34
|
+
from intentkit.skills.defillama.stablecoins.fetch_stablecoin_charts import (
|
|
35
|
+
DefiLlamaFetchStablecoinCharts,
|
|
36
|
+
)
|
|
37
|
+
from intentkit.skills.defillama.stablecoins.fetch_stablecoin_prices import (
|
|
38
|
+
DefiLlamaFetchStablecoinPrices,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# Stablecoins Tools
|
|
42
|
+
from intentkit.skills.defillama.stablecoins.fetch_stablecoins import (
|
|
43
|
+
DefiLlamaFetchStablecoins,
|
|
44
|
+
)
|
|
45
|
+
from intentkit.skills.defillama.tvl.fetch_chain_historical_tvl import (
|
|
46
|
+
DefiLlamaFetchChainHistoricalTvl,
|
|
47
|
+
)
|
|
48
|
+
from intentkit.skills.defillama.tvl.fetch_chains import DefiLlamaFetchChains
|
|
49
|
+
from intentkit.skills.defillama.tvl.fetch_historical_tvl import (
|
|
50
|
+
DefiLlamaFetchHistoricalTvl,
|
|
51
|
+
)
|
|
52
|
+
from intentkit.skills.defillama.tvl.fetch_protocol import DefiLlamaFetchProtocol
|
|
53
|
+
from intentkit.skills.defillama.tvl.fetch_protocol_current_tvl import (
|
|
54
|
+
DefiLlamaFetchProtocolCurrentTvl,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# TVL Tools
|
|
58
|
+
from intentkit.skills.defillama.tvl.fetch_protocols import DefiLlamaFetchProtocols
|
|
59
|
+
|
|
60
|
+
# Volumes Tools
|
|
61
|
+
from intentkit.skills.defillama.volumes.fetch_dex_overview import (
|
|
62
|
+
DefiLlamaFetchDexOverview,
|
|
63
|
+
)
|
|
64
|
+
from intentkit.skills.defillama.volumes.fetch_dex_summary import (
|
|
65
|
+
DefiLlamaFetchDexSummary,
|
|
66
|
+
)
|
|
67
|
+
from intentkit.skills.defillama.volumes.fetch_options_overview import (
|
|
68
|
+
DefiLlamaFetchOptionsOverview,
|
|
69
|
+
)
|
|
70
|
+
from intentkit.skills.defillama.yields.fetch_pool_chart import DefiLlamaFetchPoolChart
|
|
71
|
+
|
|
72
|
+
# Yields Tools
|
|
73
|
+
from intentkit.skills.defillama.yields.fetch_pools import DefiLlamaFetchPools
|
|
74
|
+
|
|
75
|
+
# we cache skills in system level, because they are stateless
|
|
76
|
+
_cache: dict[str, DefiLlamaBaseTool] = {}
|
|
77
|
+
|
|
78
|
+
logger = logging.getLogger(__name__)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class SkillStates(TypedDict):
|
|
82
|
+
# TVL Skills
|
|
83
|
+
fetch_protocols: SkillState
|
|
84
|
+
fetch_protocol: SkillState
|
|
85
|
+
fetch_historical_tvl: SkillState
|
|
86
|
+
fetch_chain_historical_tvl: SkillState
|
|
87
|
+
fetch_protocol_current_tvl: SkillState
|
|
88
|
+
fetch_chains: SkillState
|
|
89
|
+
|
|
90
|
+
# Coins Skills
|
|
91
|
+
fetch_current_prices: SkillState
|
|
92
|
+
fetch_historical_prices: SkillState
|
|
93
|
+
fetch_batch_historical_prices: SkillState
|
|
94
|
+
fetch_price_chart: SkillState
|
|
95
|
+
fetch_price_percentage: SkillState
|
|
96
|
+
fetch_first_price: SkillState
|
|
97
|
+
fetch_block: SkillState
|
|
98
|
+
|
|
99
|
+
# Stablecoins Skills
|
|
100
|
+
fetch_stablecoins: SkillState
|
|
101
|
+
fetch_stablecoin_charts: SkillState
|
|
102
|
+
fetch_stablecoin_chains: SkillState
|
|
103
|
+
fetch_stablecoin_prices: SkillState
|
|
104
|
+
|
|
105
|
+
# Yields Skills
|
|
106
|
+
fetch_pools: SkillState
|
|
107
|
+
fetch_pool_chart: SkillState
|
|
108
|
+
|
|
109
|
+
# Volumes Skills
|
|
110
|
+
fetch_dex_overview: SkillState
|
|
111
|
+
fetch_dex_summary: SkillState
|
|
112
|
+
fetch_options_overview: SkillState
|
|
113
|
+
|
|
114
|
+
# Fees Skills
|
|
115
|
+
fetch_fees_overview: SkillState
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class Config(SkillConfig):
|
|
119
|
+
"""Configuration for DeFi Llama skills."""
|
|
120
|
+
|
|
121
|
+
states: SkillStates
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
async def get_skills(
|
|
125
|
+
config: "Config",
|
|
126
|
+
is_private: bool,
|
|
127
|
+
store: SkillStoreABC,
|
|
128
|
+
**_,
|
|
129
|
+
) -> list[DefiLlamaBaseTool]:
|
|
130
|
+
"""Get all DeFi Llama skills."""
|
|
131
|
+
available_skills = []
|
|
132
|
+
|
|
133
|
+
# Include skills based on their state
|
|
134
|
+
for skill_name, state in config["states"].items():
|
|
135
|
+
if state == "disabled":
|
|
136
|
+
continue
|
|
137
|
+
elif state == "public" or (state == "private" and is_private):
|
|
138
|
+
available_skills.append(skill_name)
|
|
139
|
+
|
|
140
|
+
# Get each skill using the cached getter
|
|
141
|
+
result = []
|
|
142
|
+
for name in available_skills:
|
|
143
|
+
skill = get_defillama_skill(name, store)
|
|
144
|
+
if skill:
|
|
145
|
+
result.append(skill)
|
|
146
|
+
return result
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def get_defillama_skill(
|
|
150
|
+
name: str,
|
|
151
|
+
store: SkillStoreABC,
|
|
152
|
+
) -> DefiLlamaBaseTool:
|
|
153
|
+
"""Get a DeFi Llama skill by name.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
name: The name of the skill to get
|
|
157
|
+
store: The skill store for persisting data
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
The requested DeFi Llama skill
|
|
161
|
+
|
|
162
|
+
Notes:
|
|
163
|
+
Each skill maps to a specific DeFi Llama API endpoint. Some skills handle both
|
|
164
|
+
base and chain-specific endpoints through optional parameters rather than
|
|
165
|
+
separate implementations.
|
|
166
|
+
"""
|
|
167
|
+
# TVL Skills
|
|
168
|
+
if name == "fetch_protocols":
|
|
169
|
+
if name not in _cache:
|
|
170
|
+
_cache[name] = DefiLlamaFetchProtocols(
|
|
171
|
+
skill_store=store,
|
|
172
|
+
)
|
|
173
|
+
return _cache[name]
|
|
174
|
+
elif name == "fetch_protocol":
|
|
175
|
+
if name not in _cache:
|
|
176
|
+
_cache[name] = DefiLlamaFetchProtocol(
|
|
177
|
+
skill_store=store,
|
|
178
|
+
)
|
|
179
|
+
return _cache[name]
|
|
180
|
+
elif name == "fetch_historical_tvl":
|
|
181
|
+
if name not in _cache:
|
|
182
|
+
_cache[name] = DefiLlamaFetchHistoricalTvl(
|
|
183
|
+
skill_store=store,
|
|
184
|
+
)
|
|
185
|
+
return _cache[name]
|
|
186
|
+
elif name == "fetch_chain_historical_tvl":
|
|
187
|
+
if name not in _cache:
|
|
188
|
+
_cache[name] = DefiLlamaFetchChainHistoricalTvl(
|
|
189
|
+
skill_store=store,
|
|
190
|
+
)
|
|
191
|
+
return _cache[name]
|
|
192
|
+
elif name == "fetch_protocol_current_tvl":
|
|
193
|
+
if name not in _cache:
|
|
194
|
+
_cache[name] = DefiLlamaFetchProtocolCurrentTvl(
|
|
195
|
+
skill_store=store,
|
|
196
|
+
)
|
|
197
|
+
return _cache[name]
|
|
198
|
+
elif name == "fetch_chains":
|
|
199
|
+
if name not in _cache:
|
|
200
|
+
_cache[name] = DefiLlamaFetchChains(
|
|
201
|
+
skill_store=store,
|
|
202
|
+
)
|
|
203
|
+
return _cache[name]
|
|
204
|
+
|
|
205
|
+
# Coins Skills
|
|
206
|
+
elif name == "fetch_current_prices":
|
|
207
|
+
if name not in _cache:
|
|
208
|
+
_cache[name] = DefiLlamaFetchCurrentPrices(
|
|
209
|
+
skill_store=store,
|
|
210
|
+
)
|
|
211
|
+
return _cache[name]
|
|
212
|
+
elif name == "fetch_historical_prices":
|
|
213
|
+
if name not in _cache:
|
|
214
|
+
_cache[name] = DefiLlamaFetchHistoricalPrices(
|
|
215
|
+
skill_store=store,
|
|
216
|
+
)
|
|
217
|
+
return _cache[name]
|
|
218
|
+
elif name == "fetch_batch_historical_prices":
|
|
219
|
+
if name not in _cache:
|
|
220
|
+
_cache[name] = DefiLlamaFetchBatchHistoricalPrices(
|
|
221
|
+
skill_store=store,
|
|
222
|
+
)
|
|
223
|
+
return _cache[name]
|
|
224
|
+
elif name == "fetch_price_chart":
|
|
225
|
+
if name not in _cache:
|
|
226
|
+
_cache[name] = DefiLlamaFetchPriceChart(
|
|
227
|
+
skill_store=store,
|
|
228
|
+
)
|
|
229
|
+
return _cache[name]
|
|
230
|
+
elif name == "fetch_price_percentage":
|
|
231
|
+
if name not in _cache:
|
|
232
|
+
_cache[name] = DefiLlamaFetchPricePercentage(
|
|
233
|
+
skill_store=store,
|
|
234
|
+
)
|
|
235
|
+
return _cache[name]
|
|
236
|
+
elif name == "fetch_first_price":
|
|
237
|
+
if name not in _cache:
|
|
238
|
+
_cache[name] = DefiLlamaFetchFirstPrice(
|
|
239
|
+
skill_store=store,
|
|
240
|
+
)
|
|
241
|
+
return _cache[name]
|
|
242
|
+
elif name == "fetch_block":
|
|
243
|
+
if name not in _cache:
|
|
244
|
+
_cache[name] = DefiLlamaFetchBlock(
|
|
245
|
+
skill_store=store,
|
|
246
|
+
)
|
|
247
|
+
return _cache[name]
|
|
248
|
+
|
|
249
|
+
# Stablecoins Skills
|
|
250
|
+
elif name == "fetch_stablecoins":
|
|
251
|
+
if name not in _cache:
|
|
252
|
+
_cache[name] = DefiLlamaFetchStablecoins(
|
|
253
|
+
skill_store=store,
|
|
254
|
+
)
|
|
255
|
+
return _cache[name]
|
|
256
|
+
elif name == "fetch_stablecoin_charts":
|
|
257
|
+
if name not in _cache:
|
|
258
|
+
_cache[name] = DefiLlamaFetchStablecoinCharts(
|
|
259
|
+
skill_store=store,
|
|
260
|
+
)
|
|
261
|
+
return _cache[name]
|
|
262
|
+
elif name == "fetch_stablecoin_chains":
|
|
263
|
+
if name not in _cache:
|
|
264
|
+
_cache[name] = DefiLlamaFetchStablecoinChains(
|
|
265
|
+
skill_store=store,
|
|
266
|
+
)
|
|
267
|
+
return _cache[name]
|
|
268
|
+
elif name == "fetch_stablecoin_prices":
|
|
269
|
+
if name not in _cache:
|
|
270
|
+
_cache[name] = DefiLlamaFetchStablecoinPrices(
|
|
271
|
+
skill_store=store,
|
|
272
|
+
)
|
|
273
|
+
return _cache[name]
|
|
274
|
+
|
|
275
|
+
# Yields Skills
|
|
276
|
+
elif name == "fetch_pools":
|
|
277
|
+
if name not in _cache:
|
|
278
|
+
_cache[name] = DefiLlamaFetchPools(
|
|
279
|
+
skill_store=store,
|
|
280
|
+
)
|
|
281
|
+
return _cache[name]
|
|
282
|
+
elif name == "fetch_pool_chart":
|
|
283
|
+
if name not in _cache:
|
|
284
|
+
_cache[name] = DefiLlamaFetchPoolChart(
|
|
285
|
+
skill_store=store,
|
|
286
|
+
)
|
|
287
|
+
return _cache[name]
|
|
288
|
+
|
|
289
|
+
# Volumes Skills
|
|
290
|
+
elif name == "fetch_dex_overview": # Handles both base and chain-specific overviews
|
|
291
|
+
if name not in _cache:
|
|
292
|
+
_cache[name] = DefiLlamaFetchDexOverview(
|
|
293
|
+
skill_store=store,
|
|
294
|
+
)
|
|
295
|
+
return _cache[name]
|
|
296
|
+
elif name == "fetch_dex_summary":
|
|
297
|
+
if name not in _cache:
|
|
298
|
+
_cache[name] = DefiLlamaFetchDexSummary(
|
|
299
|
+
skill_store=store,
|
|
300
|
+
)
|
|
301
|
+
return _cache[name]
|
|
302
|
+
elif (
|
|
303
|
+
name == "fetch_options_overview"
|
|
304
|
+
): # Handles both base and chain-specific overviews
|
|
305
|
+
if name not in _cache:
|
|
306
|
+
_cache[name] = DefiLlamaFetchOptionsOverview(
|
|
307
|
+
skill_store=store,
|
|
308
|
+
)
|
|
309
|
+
return _cache[name]
|
|
310
|
+
|
|
311
|
+
# Fees Skills
|
|
312
|
+
elif (
|
|
313
|
+
name == "fetch_fees_overview"
|
|
314
|
+
): # Handles both base and chain-specific overviews
|
|
315
|
+
if name not in _cache:
|
|
316
|
+
_cache[name] = DefiLlamaFetchFeesOverview(
|
|
317
|
+
skill_store=store,
|
|
318
|
+
)
|
|
319
|
+
return _cache[name]
|
|
320
|
+
|
|
321
|
+
else:
|
|
322
|
+
logger.warning(f"Unknown DeFi Llama skill: {name}")
|
|
323
|
+
return None
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"""DeFi Llama API implementation and shared schemas."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from typing import List, Optional
|
|
5
|
+
|
|
6
|
+
import httpx
|
|
7
|
+
|
|
8
|
+
DEFILLAMA_TVL_BASE_URL = "https://api.llama.fi"
|
|
9
|
+
DEFILLAMA_COINS_BASE_URL = "https://coins.llama.fi"
|
|
10
|
+
DEFILLAMA_STABLECOINS_BASE_URL = "https://stablecoins.llama.fi"
|
|
11
|
+
DEFILLAMA_YIELDS_BASE_URL = "https://yields.llama.fi"
|
|
12
|
+
DEFILLAMA_VOLUMES_BASE_URL = "https://api.llama.fi"
|
|
13
|
+
DEFILLAMA_FEES_BASE_URL = "https://api.llama.fi"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# TVL API Functions
|
|
17
|
+
async def fetch_protocols() -> dict:
|
|
18
|
+
"""List all protocols on defillama along with their TVL."""
|
|
19
|
+
url = f"{DEFILLAMA_TVL_BASE_URL}/protocols"
|
|
20
|
+
async with httpx.AsyncClient() as client:
|
|
21
|
+
response = await client.get(url)
|
|
22
|
+
if response.status_code != 200:
|
|
23
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
24
|
+
return response.json()
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
async def fetch_protocol(protocol: str) -> dict:
|
|
28
|
+
"""Get historical TVL of a protocol and breakdowns by token and chain."""
|
|
29
|
+
url = f"{DEFILLAMA_TVL_BASE_URL}/protocol/{protocol}"
|
|
30
|
+
async with httpx.AsyncClient() as client:
|
|
31
|
+
response = await client.get(url)
|
|
32
|
+
if response.status_code != 200:
|
|
33
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
34
|
+
return response.json()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
async def fetch_historical_tvl() -> dict:
|
|
38
|
+
"""Get historical TVL of DeFi on all chains."""
|
|
39
|
+
url = f"{DEFILLAMA_TVL_BASE_URL}/v2/historicalChainTvl"
|
|
40
|
+
async with httpx.AsyncClient() as client:
|
|
41
|
+
response = await client.get(url)
|
|
42
|
+
if response.status_code != 200:
|
|
43
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
44
|
+
return response.json()
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
async def fetch_chain_historical_tvl(chain: str) -> dict:
|
|
48
|
+
"""Get historical TVL of a specific chain."""
|
|
49
|
+
url = f"{DEFILLAMA_TVL_BASE_URL}/v2/historicalChainTvl/{chain}"
|
|
50
|
+
async with httpx.AsyncClient() as client:
|
|
51
|
+
response = await client.get(url)
|
|
52
|
+
if response.status_code != 200:
|
|
53
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
54
|
+
return response.json()
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
async def fetch_protocol_current_tvl(protocol: str) -> dict:
|
|
58
|
+
"""Get current TVL of a protocol."""
|
|
59
|
+
url = f"{DEFILLAMA_TVL_BASE_URL}/tvl/{protocol}"
|
|
60
|
+
async with httpx.AsyncClient() as client:
|
|
61
|
+
response = await client.get(url)
|
|
62
|
+
if response.status_code != 200:
|
|
63
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
64
|
+
return response.json()
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
async def fetch_chains() -> dict:
|
|
68
|
+
"""Get current TVL of all chains."""
|
|
69
|
+
url = f"{DEFILLAMA_TVL_BASE_URL}/v2/chains"
|
|
70
|
+
async with httpx.AsyncClient() as client:
|
|
71
|
+
response = await client.get(url)
|
|
72
|
+
if response.status_code != 200:
|
|
73
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
74
|
+
return response.json()
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
# Coins API Functions
|
|
78
|
+
async def fetch_current_prices(coins: List[str]) -> dict:
|
|
79
|
+
"""Get current prices of tokens by contract address using a 4-hour search window."""
|
|
80
|
+
coins_str = ",".join(coins)
|
|
81
|
+
url = f"{DEFILLAMA_COINS_BASE_URL}/prices/current/{coins_str}?searchWidth=4h"
|
|
82
|
+
|
|
83
|
+
async with httpx.AsyncClient() as client:
|
|
84
|
+
response = await client.get(url)
|
|
85
|
+
if response.status_code != 200:
|
|
86
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
87
|
+
return response.json()
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
async def fetch_historical_prices(timestamp: int, coins: List[str]) -> dict:
|
|
91
|
+
"""Get historical prices of tokens by contract address using a 4-hour search window."""
|
|
92
|
+
coins_str = ",".join(coins)
|
|
93
|
+
url = f"{DEFILLAMA_COINS_BASE_URL}/prices/historical/{timestamp}/{coins_str}?searchWidth=4h"
|
|
94
|
+
|
|
95
|
+
async with httpx.AsyncClient() as client:
|
|
96
|
+
response = await client.get(url)
|
|
97
|
+
if response.status_code != 200:
|
|
98
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
99
|
+
return response.json()
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
async def fetch_batch_historical_prices(coins_timestamps: dict) -> dict:
|
|
103
|
+
"""Get historical prices for multiple tokens at multiple timestamps."""
|
|
104
|
+
url = f"{DEFILLAMA_COINS_BASE_URL}/batchHistorical"
|
|
105
|
+
|
|
106
|
+
async with httpx.AsyncClient() as client:
|
|
107
|
+
response = await client.get(
|
|
108
|
+
url, params={"coins": coins_timestamps, "searchWidth": "600"}
|
|
109
|
+
)
|
|
110
|
+
if response.status_code != 200:
|
|
111
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
112
|
+
return response.json()
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
async def fetch_price_chart(coins: List[str]) -> dict:
|
|
116
|
+
"""Get historical price chart data from the past day for multiple tokens."""
|
|
117
|
+
coins_str = ",".join(coins)
|
|
118
|
+
start_time = int(datetime.now().timestamp()) - 86400 # now - 1 day
|
|
119
|
+
|
|
120
|
+
url = f"{DEFILLAMA_COINS_BASE_URL}/chart/{coins_str}"
|
|
121
|
+
params = {"start": start_time, "span": 10, "period": "2d", "searchWidth": "600"}
|
|
122
|
+
|
|
123
|
+
async with httpx.AsyncClient() as client:
|
|
124
|
+
response = await client.get(url, params=params)
|
|
125
|
+
if response.status_code != 200:
|
|
126
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
127
|
+
return response.json()
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
async def fetch_price_percentage(coins: List[str]) -> dict:
|
|
131
|
+
"""Get price percentage changes for multiple tokens over a 24h period."""
|
|
132
|
+
coins_str = ",".join(coins)
|
|
133
|
+
current_timestamp = int(datetime.now().timestamp())
|
|
134
|
+
|
|
135
|
+
url = f"{DEFILLAMA_COINS_BASE_URL}/percentage/{coins_str}"
|
|
136
|
+
params = {"timestamp": current_timestamp, "lookForward": "false", "period": "24h"}
|
|
137
|
+
|
|
138
|
+
async with httpx.AsyncClient() as client:
|
|
139
|
+
response = await client.get(url, params=params)
|
|
140
|
+
if response.status_code != 200:
|
|
141
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
142
|
+
return response.json()
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
async def fetch_first_price(coins: List[str]) -> dict:
|
|
146
|
+
"""Get first recorded price data for multiple tokens."""
|
|
147
|
+
coins_str = ",".join(coins)
|
|
148
|
+
url = f"{DEFILLAMA_COINS_BASE_URL}/prices/first/{coins_str}"
|
|
149
|
+
|
|
150
|
+
async with httpx.AsyncClient() as client:
|
|
151
|
+
response = await client.get(url)
|
|
152
|
+
if response.status_code != 200:
|
|
153
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
154
|
+
return response.json()
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
async def fetch_block(chain: str) -> dict:
|
|
158
|
+
"""Get current block data for a specific chain."""
|
|
159
|
+
current_timestamp = int(datetime.now().timestamp())
|
|
160
|
+
url = f"{DEFILLAMA_COINS_BASE_URL}/block/{chain}/{current_timestamp}"
|
|
161
|
+
|
|
162
|
+
async with httpx.AsyncClient() as client:
|
|
163
|
+
response = await client.get(url)
|
|
164
|
+
if response.status_code != 200:
|
|
165
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
166
|
+
return response.json()
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
# Stablecoins API Functions
|
|
170
|
+
async def fetch_stablecoins() -> dict:
|
|
171
|
+
"""Get comprehensive stablecoin data from DeFi Llama."""
|
|
172
|
+
url = f"{DEFILLAMA_STABLECOINS_BASE_URL}/stablecoins"
|
|
173
|
+
params = {"includePrices": "true"}
|
|
174
|
+
|
|
175
|
+
async with httpx.AsyncClient() as client:
|
|
176
|
+
response = await client.get(url, params=params)
|
|
177
|
+
if response.status_code != 200:
|
|
178
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
179
|
+
return response.json()
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
async def fetch_stablecoin_charts(
|
|
183
|
+
stablecoin_id: str, chain: Optional[str] = None
|
|
184
|
+
) -> dict:
|
|
185
|
+
"""Get historical circulating supply data for a stablecoin."""
|
|
186
|
+
base_url = f"{DEFILLAMA_STABLECOINS_BASE_URL}/stablecoincharts"
|
|
187
|
+
|
|
188
|
+
# If chain is specified, fetch chain-specific data, otherwise fetch all chains
|
|
189
|
+
endpoint = f"/{chain}" if chain else "/all"
|
|
190
|
+
url = f"{base_url}{endpoint}?stablecoin={stablecoin_id}"
|
|
191
|
+
|
|
192
|
+
async with httpx.AsyncClient() as client:
|
|
193
|
+
response = await client.get(url)
|
|
194
|
+
if response.status_code != 200:
|
|
195
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
196
|
+
return response.json()
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
async def fetch_stablecoin_chains() -> dict:
|
|
200
|
+
"""Get stablecoin distribution data across all chains."""
|
|
201
|
+
url = f"{DEFILLAMA_STABLECOINS_BASE_URL}/stablecoinchains"
|
|
202
|
+
|
|
203
|
+
async with httpx.AsyncClient() as client:
|
|
204
|
+
response = await client.get(url)
|
|
205
|
+
if response.status_code != 200:
|
|
206
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
207
|
+
return response.json()
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
async def fetch_stablecoin_prices() -> dict:
|
|
211
|
+
"""Get current stablecoin price data.
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Dictionary containing stablecoin prices with their dates
|
|
215
|
+
"""
|
|
216
|
+
url = f"{DEFILLAMA_STABLECOINS_BASE_URL}/stablecoinprices"
|
|
217
|
+
|
|
218
|
+
async with httpx.AsyncClient() as client:
|
|
219
|
+
response = await client.get(url)
|
|
220
|
+
if response.status_code != 200:
|
|
221
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
222
|
+
return response.json()
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
# Yields API Functions
|
|
226
|
+
async def fetch_pools() -> dict:
|
|
227
|
+
"""Get comprehensive data for all yield-generating pools."""
|
|
228
|
+
url = f"{DEFILLAMA_YIELDS_BASE_URL}/pools"
|
|
229
|
+
|
|
230
|
+
async with httpx.AsyncClient() as client:
|
|
231
|
+
response = await client.get(url)
|
|
232
|
+
if response.status_code != 200:
|
|
233
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
234
|
+
return response.json()
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
async def fetch_pool_chart(pool_id: str) -> dict:
|
|
238
|
+
"""Get historical chart data for a specific pool."""
|
|
239
|
+
url = f"{DEFILLAMA_YIELDS_BASE_URL}/chart/{pool_id}"
|
|
240
|
+
|
|
241
|
+
async with httpx.AsyncClient() as client:
|
|
242
|
+
response = await client.get(url)
|
|
243
|
+
if response.status_code != 200:
|
|
244
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
245
|
+
return response.json()
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
# Volumes API Functions
|
|
249
|
+
async def fetch_dex_overview() -> dict:
|
|
250
|
+
"""Get overview data for DEX protocols."""
|
|
251
|
+
url = f"{DEFILLAMA_VOLUMES_BASE_URL}/overview/dexs"
|
|
252
|
+
params = {
|
|
253
|
+
"excludeTotalDataChart": "true",
|
|
254
|
+
"excludeTotalDataChartBreakdown": "true",
|
|
255
|
+
"dataType": "dailyVolume",
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
async with httpx.AsyncClient() as client:
|
|
259
|
+
response = await client.get(url, params=params)
|
|
260
|
+
if response.status_code != 200:
|
|
261
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
262
|
+
return response.json()
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
async def fetch_dex_summary(protocol: str) -> dict:
|
|
266
|
+
"""Get summary data for a specific DEX protocol."""
|
|
267
|
+
url = f"{DEFILLAMA_VOLUMES_BASE_URL}/summary/dexs/{protocol}"
|
|
268
|
+
params = {
|
|
269
|
+
"excludeTotalDataChart": "true",
|
|
270
|
+
"excludeTotalDataChartBreakdown": "true",
|
|
271
|
+
"dataType": "dailyVolume",
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
async with httpx.AsyncClient() as client:
|
|
275
|
+
response = await client.get(url, params=params)
|
|
276
|
+
if response.status_code != 200:
|
|
277
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
278
|
+
return response.json()
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
async def fetch_options_overview() -> dict:
|
|
282
|
+
"""Get overview data for options protocols from DeFi Llama."""
|
|
283
|
+
url = f"{DEFILLAMA_VOLUMES_BASE_URL}/overview/options"
|
|
284
|
+
params = {
|
|
285
|
+
"excludeTotalDataChart": "true",
|
|
286
|
+
"excludeTotalDataChartBreakdown": "true",
|
|
287
|
+
"dataType": "dailyPremiumVolume",
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
async with httpx.AsyncClient() as client:
|
|
291
|
+
response = await client.get(url, params=params)
|
|
292
|
+
if response.status_code != 200:
|
|
293
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
294
|
+
return response.json()
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
# Fees and Revenue API Functions
|
|
298
|
+
async def fetch_fees_overview() -> dict:
|
|
299
|
+
"""Get overview data for fees from DeFi Llama.
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
Dictionary containing fees overview data
|
|
303
|
+
"""
|
|
304
|
+
url = f"{DEFILLAMA_FEES_BASE_URL}/overview/fees"
|
|
305
|
+
params = {
|
|
306
|
+
"excludeTotalDataChart": "true",
|
|
307
|
+
"excludeTotalDataChartBreakdown": "true",
|
|
308
|
+
"dataType": "dailyFees",
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
async with httpx.AsyncClient() as client:
|
|
312
|
+
response = await client.get(url, params=params)
|
|
313
|
+
if response.status_code != 200:
|
|
314
|
+
return {"error": f"API returned status code {response.status_code}"}
|
|
315
|
+
return response.json()
|