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,155 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Dict, Optional, Type
|
|
3
|
+
|
|
4
|
+
from langchain_core.runnables import RunnableConfig
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from intentkit.skills.portfolio.base import PortfolioBaseTool
|
|
8
|
+
from intentkit.skills.portfolio.constants import (
|
|
9
|
+
DEFAULT_CHAIN,
|
|
10
|
+
DEFAULT_LIMIT,
|
|
11
|
+
DEFAULT_ORDER,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class WalletHistoryInput(BaseModel):
|
|
18
|
+
"""Input for wallet transaction history tool."""
|
|
19
|
+
|
|
20
|
+
address: str = Field(
|
|
21
|
+
description="The address of the wallet to get transaction history for."
|
|
22
|
+
)
|
|
23
|
+
chain: str = Field(
|
|
24
|
+
description="The chain to query (e.g., 'eth', 'bsc', 'polygon').",
|
|
25
|
+
default=DEFAULT_CHAIN,
|
|
26
|
+
)
|
|
27
|
+
limit: Optional[int] = Field(
|
|
28
|
+
description="The desired page size of the result.",
|
|
29
|
+
default=DEFAULT_LIMIT,
|
|
30
|
+
)
|
|
31
|
+
cursor: Optional[str] = Field(
|
|
32
|
+
description="The cursor returned in the previous response (for pagination).",
|
|
33
|
+
default=None,
|
|
34
|
+
)
|
|
35
|
+
from_block: Optional[int] = Field(
|
|
36
|
+
description="The minimum block number to get transactions from.",
|
|
37
|
+
default=None,
|
|
38
|
+
)
|
|
39
|
+
to_block: Optional[int] = Field(
|
|
40
|
+
description="The maximum block number to get transactions from.",
|
|
41
|
+
default=None,
|
|
42
|
+
)
|
|
43
|
+
from_date: Optional[str] = Field(
|
|
44
|
+
description="The start date to get transactions from (format in seconds or datestring).",
|
|
45
|
+
default=None,
|
|
46
|
+
)
|
|
47
|
+
to_date: Optional[str] = Field(
|
|
48
|
+
description="The end date to get transactions from (format in seconds or datestring).",
|
|
49
|
+
default=None,
|
|
50
|
+
)
|
|
51
|
+
include_internal_transactions: Optional[bool] = Field(
|
|
52
|
+
description="If the result should contain the internal transactions.",
|
|
53
|
+
default=None,
|
|
54
|
+
)
|
|
55
|
+
nft_metadata: Optional[bool] = Field(
|
|
56
|
+
description="If the result should contain the NFT metadata.",
|
|
57
|
+
default=None,
|
|
58
|
+
)
|
|
59
|
+
order: Optional[str] = Field(
|
|
60
|
+
description="The order of the result, in ascending (ASC) or descending (DESC).",
|
|
61
|
+
default=DEFAULT_ORDER,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class WalletHistory(PortfolioBaseTool):
|
|
66
|
+
"""Tool for retrieving wallet transaction history using Moralis.
|
|
67
|
+
|
|
68
|
+
This tool uses Moralis' API to fetch the full transaction history of a specified wallet address,
|
|
69
|
+
including sends, receives, token and NFT transfers, and contract interactions.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
name: str = "portfolio_wallet_history"
|
|
73
|
+
description: str = (
|
|
74
|
+
"Retrieve the full transaction history of a specified wallet address, including sends, "
|
|
75
|
+
"receives, token and NFT transfers, and contract interactions."
|
|
76
|
+
)
|
|
77
|
+
args_schema: Type[BaseModel] = WalletHistoryInput
|
|
78
|
+
|
|
79
|
+
async def _arun(
|
|
80
|
+
self,
|
|
81
|
+
address: str,
|
|
82
|
+
chain: str = DEFAULT_CHAIN,
|
|
83
|
+
limit: Optional[int] = DEFAULT_LIMIT,
|
|
84
|
+
cursor: Optional[str] = None,
|
|
85
|
+
from_block: Optional[int] = None,
|
|
86
|
+
to_block: Optional[int] = None,
|
|
87
|
+
from_date: Optional[str] = None,
|
|
88
|
+
to_date: Optional[str] = None,
|
|
89
|
+
include_internal_transactions: Optional[bool] = None,
|
|
90
|
+
nft_metadata: Optional[bool] = None,
|
|
91
|
+
order: Optional[str] = DEFAULT_ORDER,
|
|
92
|
+
config: RunnableConfig = None,
|
|
93
|
+
**kwargs,
|
|
94
|
+
) -> Dict[str, Any]:
|
|
95
|
+
"""Fetch wallet transaction history from Moralis.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
address: The wallet address to get history for
|
|
99
|
+
chain: The blockchain to query
|
|
100
|
+
limit: Number of results per page
|
|
101
|
+
cursor: Pagination cursor
|
|
102
|
+
from_block: Minimum block number
|
|
103
|
+
to_block: Maximum block number
|
|
104
|
+
from_date: Start date for transactions
|
|
105
|
+
to_date: End date for transactions
|
|
106
|
+
include_internal_transactions: Include internal txs
|
|
107
|
+
nft_metadata: Include NFT metadata
|
|
108
|
+
order: Order of results (ASC/DESC)
|
|
109
|
+
config: The configuration for the tool call
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Dict containing transaction history data
|
|
113
|
+
"""
|
|
114
|
+
context = self.context_from_config(config)
|
|
115
|
+
logger.debug(
|
|
116
|
+
f"wallet_history.py: Fetching wallet history with context {context}"
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# Get the API key from the agent's configuration
|
|
120
|
+
api_key = self.get_api_key(context)
|
|
121
|
+
if not api_key:
|
|
122
|
+
return {"error": "No Moralis API key provided in the configuration."}
|
|
123
|
+
|
|
124
|
+
# Build query parameters
|
|
125
|
+
params = {"chain": chain, "limit": limit, "order": order}
|
|
126
|
+
|
|
127
|
+
# Add optional parameters if they exist
|
|
128
|
+
if cursor:
|
|
129
|
+
params["cursor"] = cursor
|
|
130
|
+
if from_block:
|
|
131
|
+
params["from_block"] = from_block
|
|
132
|
+
if to_block:
|
|
133
|
+
params["to_block"] = to_block
|
|
134
|
+
if from_date:
|
|
135
|
+
params["from_date"] = from_date
|
|
136
|
+
if to_date:
|
|
137
|
+
params["to_date"] = to_date
|
|
138
|
+
if include_internal_transactions is not None:
|
|
139
|
+
params["include_internal_transactions"] = include_internal_transactions
|
|
140
|
+
if nft_metadata is not None:
|
|
141
|
+
params["nft_metadata"] = nft_metadata
|
|
142
|
+
|
|
143
|
+
# Call Moralis API
|
|
144
|
+
try:
|
|
145
|
+
endpoint = f"/wallets/{address}/history"
|
|
146
|
+
return await self._make_request(
|
|
147
|
+
method="GET", endpoint=endpoint, api_key=api_key, params=params
|
|
148
|
+
)
|
|
149
|
+
except Exception as e:
|
|
150
|
+
logger.error(
|
|
151
|
+
f"wallet_history.py: Error fetching wallet history: {e}", exc_info=True
|
|
152
|
+
)
|
|
153
|
+
return {
|
|
154
|
+
"error": "An error occurred while fetching wallet history. Please try again later."
|
|
155
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Dict, List, Optional, Type
|
|
3
|
+
|
|
4
|
+
from langchain_core.runnables import RunnableConfig
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from intentkit.skills.portfolio.base import PortfolioBaseTool
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class WalletNetWorthInput(BaseModel):
|
|
13
|
+
"""Input for wallet net worth tool."""
|
|
14
|
+
|
|
15
|
+
address: str = Field(description="The wallet address to calculate net worth for.")
|
|
16
|
+
chains: Optional[List[str]] = Field(
|
|
17
|
+
description="The chains to query (e.g., ['eth', 'bsc', 'polygon']).",
|
|
18
|
+
default=None,
|
|
19
|
+
)
|
|
20
|
+
exclude_spam: Optional[bool] = Field(
|
|
21
|
+
description="Exclude spam tokens from the result.",
|
|
22
|
+
default=True,
|
|
23
|
+
)
|
|
24
|
+
exclude_unverified_contracts: Optional[bool] = Field(
|
|
25
|
+
description="Exclude unverified contracts from the result.",
|
|
26
|
+
default=True,
|
|
27
|
+
)
|
|
28
|
+
max_token_inactivity: Optional[int] = Field(
|
|
29
|
+
description="Exclude tokens inactive for more than the given amount of days.",
|
|
30
|
+
default=1,
|
|
31
|
+
)
|
|
32
|
+
min_pair_side_liquidity_usd: Optional[float] = Field(
|
|
33
|
+
description="Exclude tokens with liquidity less than the specified amount in USD.",
|
|
34
|
+
default=1000,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class WalletNetWorth(PortfolioBaseTool):
|
|
39
|
+
"""Tool for calculating a wallet's total net worth using Moralis.
|
|
40
|
+
|
|
41
|
+
This tool uses Moralis' API to calculate the net worth of a wallet in USD across
|
|
42
|
+
multiple chains, with options to filter out spam and low-liquidity tokens.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
name: str = "portfolio_wallet_net_worth"
|
|
46
|
+
description: str = (
|
|
47
|
+
"Get the net worth of a wallet in USD across multiple chains. "
|
|
48
|
+
"Filters out spam tokens and low-liquidity assets for more accurate results."
|
|
49
|
+
)
|
|
50
|
+
args_schema: Type[BaseModel] = WalletNetWorthInput
|
|
51
|
+
|
|
52
|
+
async def _arun(
|
|
53
|
+
self,
|
|
54
|
+
address: str,
|
|
55
|
+
chains: Optional[List[str]] = None,
|
|
56
|
+
exclude_spam: Optional[bool] = True,
|
|
57
|
+
exclude_unverified_contracts: Optional[bool] = True,
|
|
58
|
+
max_token_inactivity: Optional[int] = 1,
|
|
59
|
+
min_pair_side_liquidity_usd: Optional[float] = 1000,
|
|
60
|
+
config: RunnableConfig = None,
|
|
61
|
+
**kwargs,
|
|
62
|
+
) -> Dict[str, Any]:
|
|
63
|
+
"""Calculate wallet net worth from Moralis.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
address: The wallet address to calculate net worth for
|
|
67
|
+
chains: List of chains to query
|
|
68
|
+
exclude_spam: Whether to exclude spam tokens
|
|
69
|
+
exclude_unverified_contracts: Whether to exclude unverified contracts
|
|
70
|
+
max_token_inactivity: Exclude tokens inactive for more than the given days
|
|
71
|
+
min_pair_side_liquidity_usd: Exclude tokens with liquidity less than specified
|
|
72
|
+
config: The configuration for the tool call
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Dict containing wallet net worth data
|
|
76
|
+
"""
|
|
77
|
+
context = self.context_from_config(config)
|
|
78
|
+
logger.debug(
|
|
79
|
+
f"wallet_net_worth.py: Calculating wallet net worth with context {context}"
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# Get the API key from the agent's configuration
|
|
83
|
+
api_key = self.get_api_key(context)
|
|
84
|
+
if not api_key:
|
|
85
|
+
return {"error": "No Moralis API key provided in the configuration."}
|
|
86
|
+
|
|
87
|
+
# Build query parameters
|
|
88
|
+
params = {
|
|
89
|
+
"exclude_spam": exclude_spam,
|
|
90
|
+
"exclude_unverified_contracts": exclude_unverified_contracts,
|
|
91
|
+
"max_token_inactivity": max_token_inactivity,
|
|
92
|
+
"min_pair_side_liquidity_usd": min_pair_side_liquidity_usd,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
# Add chains if specified
|
|
96
|
+
if chains:
|
|
97
|
+
params["chains"] = chains
|
|
98
|
+
|
|
99
|
+
# Call Moralis API
|
|
100
|
+
try:
|
|
101
|
+
endpoint = f"/wallets/{address}/net-worth"
|
|
102
|
+
return await self._make_request(
|
|
103
|
+
method="GET", endpoint=endpoint, api_key=api_key, params=params
|
|
104
|
+
)
|
|
105
|
+
except Exception as e:
|
|
106
|
+
logger.error(
|
|
107
|
+
f"wallet_net_worth.py: Error calculating wallet net worth: {e}",
|
|
108
|
+
exc_info=True,
|
|
109
|
+
)
|
|
110
|
+
return {
|
|
111
|
+
"error": "An error occurred while calculating wallet net worth. Please try again later."
|
|
112
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Dict, List, Optional, Type
|
|
3
|
+
|
|
4
|
+
from langchain_core.runnables import RunnableConfig
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from intentkit.skills.portfolio.base import PortfolioBaseTool
|
|
8
|
+
from intentkit.skills.portfolio.constants import DEFAULT_CHAIN, DEFAULT_LIMIT
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class WalletNFTsInput(BaseModel):
|
|
14
|
+
"""Input for wallet NFTs tool."""
|
|
15
|
+
|
|
16
|
+
address: str = Field(description="The address of the wallet to get NFTs for.")
|
|
17
|
+
chain: str = Field(
|
|
18
|
+
description="The chain to query (e.g., 'eth', 'base', 'polygon').",
|
|
19
|
+
default=DEFAULT_CHAIN,
|
|
20
|
+
)
|
|
21
|
+
format: Optional[str] = Field(
|
|
22
|
+
description="The format of the token ID ('decimal' or 'hex').",
|
|
23
|
+
default="decimal",
|
|
24
|
+
)
|
|
25
|
+
limit: Optional[int] = Field(
|
|
26
|
+
description="The desired page size of the result.",
|
|
27
|
+
default=DEFAULT_LIMIT,
|
|
28
|
+
)
|
|
29
|
+
exclude_spam: Optional[bool] = Field(
|
|
30
|
+
description="Should spam NFTs be excluded from the result?",
|
|
31
|
+
default=True,
|
|
32
|
+
)
|
|
33
|
+
token_addresses: Optional[List[str]] = Field(
|
|
34
|
+
description="The non-fungible token (NFT) addresses to get balances for.",
|
|
35
|
+
default=None,
|
|
36
|
+
)
|
|
37
|
+
cursor: Optional[str] = Field(
|
|
38
|
+
description="The cursor returned in the previous response (for pagination).",
|
|
39
|
+
default=None,
|
|
40
|
+
)
|
|
41
|
+
normalize_metadata: Optional[bool] = Field(
|
|
42
|
+
description="The option to enable metadata normalization.",
|
|
43
|
+
default=True,
|
|
44
|
+
)
|
|
45
|
+
media_items: Optional[bool] = Field(
|
|
46
|
+
description="Should preview media data be returned?",
|
|
47
|
+
default=False,
|
|
48
|
+
)
|
|
49
|
+
include_prices: Optional[bool] = Field(
|
|
50
|
+
description="Should NFT last sale prices be included in the result?",
|
|
51
|
+
default=False,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class WalletNFTs(PortfolioBaseTool):
|
|
56
|
+
"""Tool for retrieving NFTs owned by a wallet using Moralis.
|
|
57
|
+
|
|
58
|
+
This tool uses Moralis' API to fetch NFTs owned by a given address, with options
|
|
59
|
+
to filter and format the results.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
name: str = "portfolio_wallet_nfts"
|
|
63
|
+
description: str = (
|
|
64
|
+
"Get NFTs owned by a given wallet address. Results include token details, "
|
|
65
|
+
"metadata, collection information, and optionally prices."
|
|
66
|
+
)
|
|
67
|
+
args_schema: Type[BaseModel] = WalletNFTsInput
|
|
68
|
+
|
|
69
|
+
async def _arun(
|
|
70
|
+
self,
|
|
71
|
+
address: str,
|
|
72
|
+
chain: str = DEFAULT_CHAIN,
|
|
73
|
+
format: Optional[str] = "decimal",
|
|
74
|
+
limit: Optional[int] = DEFAULT_LIMIT,
|
|
75
|
+
exclude_spam: Optional[bool] = True,
|
|
76
|
+
token_addresses: Optional[List[str]] = None,
|
|
77
|
+
cursor: Optional[str] = None,
|
|
78
|
+
normalize_metadata: Optional[bool] = True,
|
|
79
|
+
media_items: Optional[bool] = False,
|
|
80
|
+
include_prices: Optional[bool] = False,
|
|
81
|
+
config: RunnableConfig = None,
|
|
82
|
+
**kwargs,
|
|
83
|
+
) -> Dict[str, Any]:
|
|
84
|
+
"""Fetch NFTs owned by a wallet from Moralis.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
address: The wallet address
|
|
88
|
+
chain: The blockchain to query
|
|
89
|
+
format: The format of the token ID ('decimal' or 'hex')
|
|
90
|
+
limit: Number of results per page
|
|
91
|
+
exclude_spam: Whether to exclude spam NFTs
|
|
92
|
+
token_addresses: Specific NFT contracts to filter by
|
|
93
|
+
cursor: Pagination cursor
|
|
94
|
+
normalize_metadata: Enable metadata normalization
|
|
95
|
+
media_items: Include preview media data
|
|
96
|
+
include_prices: Include NFT last sale prices
|
|
97
|
+
config: The configuration for the tool call
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Dict containing wallet NFTs data
|
|
101
|
+
"""
|
|
102
|
+
context = self.context_from_config(config)
|
|
103
|
+
logger.debug(f"wallet_nfts.py: Fetching wallet NFTs with context {context}")
|
|
104
|
+
|
|
105
|
+
# Get the API key from the agent's configuration
|
|
106
|
+
api_key = self.get_api_key(context)
|
|
107
|
+
if not api_key:
|
|
108
|
+
return {"error": "No Moralis API key provided in the configuration."}
|
|
109
|
+
|
|
110
|
+
# Build query parameters
|
|
111
|
+
params = {
|
|
112
|
+
"chain": chain,
|
|
113
|
+
"format": format,
|
|
114
|
+
"limit": limit,
|
|
115
|
+
"exclude_spam": exclude_spam,
|
|
116
|
+
"normalizeMetadata": normalize_metadata,
|
|
117
|
+
"media_items": media_items,
|
|
118
|
+
"include_prices": include_prices,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# Add optional parameters if they exist
|
|
122
|
+
if token_addresses:
|
|
123
|
+
params["token_addresses"] = token_addresses
|
|
124
|
+
if cursor:
|
|
125
|
+
params["cursor"] = cursor
|
|
126
|
+
|
|
127
|
+
# Call Moralis API
|
|
128
|
+
try:
|
|
129
|
+
endpoint = f"/{address}/nft"
|
|
130
|
+
return await self._make_request(
|
|
131
|
+
method="GET", endpoint=endpoint, api_key=api_key, params=params
|
|
132
|
+
)
|
|
133
|
+
except Exception as e:
|
|
134
|
+
logger.error(
|
|
135
|
+
f"wallet_nfts.py: Error fetching wallet NFTs: {e}", exc_info=True
|
|
136
|
+
)
|
|
137
|
+
return {
|
|
138
|
+
"error": "An error occurred while fetching wallet NFTs. Please try again later."
|
|
139
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Dict, List, Optional, Type
|
|
3
|
+
|
|
4
|
+
from langchain_core.runnables import RunnableConfig
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from intentkit.skills.portfolio.base import PortfolioBaseTool
|
|
8
|
+
from intentkit.skills.portfolio.constants import DEFAULT_CHAIN
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class WalletProfitabilityInput(BaseModel):
|
|
14
|
+
"""Input for wallet profitability breakdown tool."""
|
|
15
|
+
|
|
16
|
+
address: str = Field(
|
|
17
|
+
description="The wallet address to get profitability breakdown for."
|
|
18
|
+
)
|
|
19
|
+
chain: str = Field(
|
|
20
|
+
description="The chain to query (e.g., 'eth', 'bsc', 'polygon').",
|
|
21
|
+
default=DEFAULT_CHAIN,
|
|
22
|
+
)
|
|
23
|
+
days: Optional[str] = Field(
|
|
24
|
+
description="Timeframe in days for which profitability is calculated. Options: 'all', '7', '30', '60', '90'.",
|
|
25
|
+
default="all",
|
|
26
|
+
)
|
|
27
|
+
token_addresses: Optional[List[str]] = Field(
|
|
28
|
+
description="The token addresses list to filter the result with.",
|
|
29
|
+
default=None,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class WalletProfitability(PortfolioBaseTool):
|
|
34
|
+
"""Tool for retrieving detailed wallet profitability breakdown using Moralis.
|
|
35
|
+
|
|
36
|
+
This tool uses Moralis' API to retrieve detailed profitability information for a
|
|
37
|
+
specific wallet address, with the option to filter by one or more tokens.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
name: str = "portfolio_wallet_profitability"
|
|
41
|
+
description: str = (
|
|
42
|
+
"Retrieve detailed profitability breakdown for a wallet, including profit/loss per token, "
|
|
43
|
+
"average buy/sell prices, and realized profits. Can be filtered by specific tokens."
|
|
44
|
+
)
|
|
45
|
+
args_schema: Type[BaseModel] = WalletProfitabilityInput
|
|
46
|
+
|
|
47
|
+
async def _arun(
|
|
48
|
+
self,
|
|
49
|
+
address: str,
|
|
50
|
+
chain: str = DEFAULT_CHAIN,
|
|
51
|
+
days: Optional[str] = "all",
|
|
52
|
+
token_addresses: Optional[List[str]] = None,
|
|
53
|
+
config: RunnableConfig = None,
|
|
54
|
+
**kwargs,
|
|
55
|
+
) -> Dict[str, Any]:
|
|
56
|
+
"""Fetch detailed wallet profitability from Moralis.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
address: The wallet address to get profitability for
|
|
60
|
+
chain: The blockchain to query
|
|
61
|
+
days: Timeframe in days for the profitability data
|
|
62
|
+
token_addresses: List of token addresses to filter results
|
|
63
|
+
config: The configuration for the tool call
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Dict containing wallet profitability breakdown data
|
|
67
|
+
"""
|
|
68
|
+
context = self.context_from_config(config)
|
|
69
|
+
logger.debug(
|
|
70
|
+
f"wallet_profitability.py: Fetching profitability breakdown with context {context}"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# Get the API key from the agent's configuration
|
|
74
|
+
api_key = self.get_api_key(context)
|
|
75
|
+
if not api_key:
|
|
76
|
+
return {"error": "No Moralis API key provided in the configuration."}
|
|
77
|
+
|
|
78
|
+
# Build query parameters
|
|
79
|
+
params = {
|
|
80
|
+
"chain": chain,
|
|
81
|
+
"days": days,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
# Add token_addresses if specified
|
|
85
|
+
if token_addresses:
|
|
86
|
+
params["token_addresses"] = token_addresses
|
|
87
|
+
|
|
88
|
+
# Call Moralis API
|
|
89
|
+
try:
|
|
90
|
+
endpoint = f"/wallets/{address}/profitability"
|
|
91
|
+
return await self._make_request(
|
|
92
|
+
method="GET", endpoint=endpoint, api_key=api_key, params=params
|
|
93
|
+
)
|
|
94
|
+
except Exception as e:
|
|
95
|
+
logger.error(
|
|
96
|
+
f"wallet_profitability.py: Error fetching profitability breakdown: {e}",
|
|
97
|
+
exc_info=True,
|
|
98
|
+
)
|
|
99
|
+
return {
|
|
100
|
+
"error": "An error occurred while fetching profitability breakdown. Please try again later."
|
|
101
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Dict, Optional, Type
|
|
3
|
+
|
|
4
|
+
from langchain_core.runnables import RunnableConfig
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from intentkit.skills.portfolio.base import PortfolioBaseTool
|
|
8
|
+
from intentkit.skills.portfolio.constants import DEFAULT_CHAIN
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class WalletProfitabilitySummaryInput(BaseModel):
|
|
14
|
+
"""Input for wallet profitability summary tool."""
|
|
15
|
+
|
|
16
|
+
address: str = Field(
|
|
17
|
+
description="The wallet address to get profitability summary for."
|
|
18
|
+
)
|
|
19
|
+
chain: str = Field(
|
|
20
|
+
description="The chain to query (e.g., 'eth', 'bsc', 'polygon').",
|
|
21
|
+
default=DEFAULT_CHAIN,
|
|
22
|
+
)
|
|
23
|
+
days: Optional[str] = Field(
|
|
24
|
+
description="Timeframe in days for the profitability summary. Options: 'all', '7', '30', '60', '90'.",
|
|
25
|
+
default="all",
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class WalletProfitabilitySummary(PortfolioBaseTool):
|
|
30
|
+
"""Tool for retrieving wallet profitability summary using Moralis.
|
|
31
|
+
|
|
32
|
+
This tool uses Moralis' API to retrieve a summary of wallet profitability
|
|
33
|
+
based on specified parameters.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
name: str = "portfolio_wallet_profitability_summary"
|
|
37
|
+
description: str = (
|
|
38
|
+
"Retrieve a summary of wallet profitability including total profit/loss, "
|
|
39
|
+
"trade volume, and other metrics. Filter by time period."
|
|
40
|
+
)
|
|
41
|
+
args_schema: Type[BaseModel] = WalletProfitabilitySummaryInput
|
|
42
|
+
|
|
43
|
+
async def _arun(
|
|
44
|
+
self,
|
|
45
|
+
address: str,
|
|
46
|
+
chain: str = DEFAULT_CHAIN,
|
|
47
|
+
days: Optional[str] = "all",
|
|
48
|
+
config: RunnableConfig = None,
|
|
49
|
+
**kwargs,
|
|
50
|
+
) -> Dict[str, Any]:
|
|
51
|
+
"""Fetch wallet profitability summary from Moralis.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
address: The wallet address to get profitability for
|
|
55
|
+
chain: The blockchain to query
|
|
56
|
+
days: Timeframe in days for the summary
|
|
57
|
+
config: The configuration for the tool call
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Dict containing wallet profitability summary data
|
|
61
|
+
"""
|
|
62
|
+
context = self.context_from_config(config)
|
|
63
|
+
logger.debug(
|
|
64
|
+
f"wallet_profitability_summary.py: Fetching profitability summary with context {context}"
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
# Get the API key from the agent's configuration
|
|
68
|
+
api_key = self.get_api_key(context)
|
|
69
|
+
if not api_key:
|
|
70
|
+
return {"error": "No Moralis API key provided in the configuration."}
|
|
71
|
+
|
|
72
|
+
# Build query parameters
|
|
73
|
+
params = {
|
|
74
|
+
"chain": chain,
|
|
75
|
+
"days": days,
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# Call Moralis API
|
|
79
|
+
try:
|
|
80
|
+
endpoint = f"/wallets/{address}/profitability/summary"
|
|
81
|
+
return await self._make_request(
|
|
82
|
+
method="GET", endpoint=endpoint, api_key=api_key, params=params
|
|
83
|
+
)
|
|
84
|
+
except Exception as e:
|
|
85
|
+
logger.error(
|
|
86
|
+
f"wallet_profitability_summary.py: Error fetching profitability summary: {e}",
|
|
87
|
+
exc_info=True,
|
|
88
|
+
)
|
|
89
|
+
return {
|
|
90
|
+
"error": "An error occurred while fetching profitability summary. Please try again later."
|
|
91
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Dict, Type
|
|
3
|
+
|
|
4
|
+
from langchain_core.runnables import RunnableConfig
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from intentkit.skills.portfolio.base import PortfolioBaseTool
|
|
8
|
+
from intentkit.skills.portfolio.constants import DEFAULT_CHAIN
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class WalletStatsInput(BaseModel):
|
|
14
|
+
"""Input for wallet stats tool."""
|
|
15
|
+
|
|
16
|
+
address: str = Field(description="The wallet address to get stats for.")
|
|
17
|
+
chain: str = Field(
|
|
18
|
+
description="The chain to query (e.g., 'eth', 'bsc', 'polygon').",
|
|
19
|
+
default=DEFAULT_CHAIN,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class WalletStats(PortfolioBaseTool):
|
|
24
|
+
"""Tool for retrieving wallet statistics using Moralis.
|
|
25
|
+
|
|
26
|
+
This tool uses Moralis' API to get high-level statistical information about
|
|
27
|
+
a wallet, including NFT counts, collection counts, and transaction counts.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
name: str = "portfolio_wallet_stats"
|
|
31
|
+
description: str = (
|
|
32
|
+
"Get statistical information about a wallet, including the number of NFTs, "
|
|
33
|
+
"collections, and transaction counts."
|
|
34
|
+
)
|
|
35
|
+
args_schema: Type[BaseModel] = WalletStatsInput
|
|
36
|
+
|
|
37
|
+
async def _arun(
|
|
38
|
+
self,
|
|
39
|
+
address: str,
|
|
40
|
+
chain: str = DEFAULT_CHAIN,
|
|
41
|
+
config: RunnableConfig = None,
|
|
42
|
+
**kwargs,
|
|
43
|
+
) -> Dict[str, Any]:
|
|
44
|
+
"""Fetch wallet stats from Moralis.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
address: The wallet address to get stats for
|
|
48
|
+
chain: The blockchain to query
|
|
49
|
+
config: The configuration for the tool call
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
Dict containing wallet stats data
|
|
53
|
+
"""
|
|
54
|
+
context = self.context_from_config(config)
|
|
55
|
+
logger.debug(f"wallet_stats.py: Fetching wallet stats with context {context}")
|
|
56
|
+
|
|
57
|
+
# Get the API key from the agent's configuration
|
|
58
|
+
api_key = self.get_api_key(context)
|
|
59
|
+
if not api_key:
|
|
60
|
+
return {"error": "No Moralis API key provided in the configuration."}
|
|
61
|
+
|
|
62
|
+
# Build query parameters
|
|
63
|
+
params = {
|
|
64
|
+
"chain": chain,
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
# Call Moralis API
|
|
68
|
+
try:
|
|
69
|
+
endpoint = f"/wallets/{address}/stats"
|
|
70
|
+
return await self._make_request(
|
|
71
|
+
method="GET", endpoint=endpoint, api_key=api_key, params=params
|
|
72
|
+
)
|
|
73
|
+
except Exception as e:
|
|
74
|
+
logger.error(
|
|
75
|
+
f"wallet_stats.py: Error fetching wallet stats: {e}", exc_info=True
|
|
76
|
+
)
|
|
77
|
+
return {
|
|
78
|
+
"error": "An error occurred while fetching wallet stats. Please try again later."
|
|
79
|
+
}
|