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,89 @@
|
|
|
1
|
+
# Token Skills
|
|
2
|
+
|
|
3
|
+
The Token skills provide blockchain token analytics capabilities powered by Moralis. These skills allow you to search, analyze, and track token information across multiple blockchains.
|
|
4
|
+
|
|
5
|
+
## Available Skills
|
|
6
|
+
|
|
7
|
+
| Skill | Description | Endpoint | Example Prompts |
|
|
8
|
+
|-------|-------------|----------|----------------|
|
|
9
|
+
| `token_price` | Get token price and information | `GET /erc20/:address/price` | "What's the current price of PEPE token?" "Get the price of USDT on Ethereum." |
|
|
10
|
+
| `token_erc20_transfers` | Get ERC20 token transfers for a wallet | `GET /:address/erc20/transfers` | "Show me all the USDT transfers for my wallet." "What are the recent token transactions for 0x123?" |
|
|
11
|
+
| `token_search` * | Search for tokens by name, symbol, or address | `GET /tokens/search` | "Find tokens with 'pepe' in the name." "Search for tokens with high market cap on Ethereum." |
|
|
12
|
+
| `token_analytics` | Get detailed analytics for a token | `GET /tokens/:address/analytics` | "Show me analytics for the PEPE token." "What are the buy/sell volumes for USDT in the last 24 hours?" |
|
|
13
|
+
|
|
14
|
+
\* Premium Endpoint: To use the `token_search` API, you will need an API key associated with a Moralis account on the Business plan or a custom Enterprise plan.
|
|
15
|
+
|
|
16
|
+
## Configuration
|
|
17
|
+
|
|
18
|
+
The token skills require a Moralis API key to function. You can configure this in your agent's configuration file:
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
skills:
|
|
22
|
+
token:
|
|
23
|
+
api_key: "your_moralis_api_key_here"
|
|
24
|
+
states:
|
|
25
|
+
token_price: "public"
|
|
26
|
+
token_erc20_transfers: "public"
|
|
27
|
+
token_search: "public"
|
|
28
|
+
token_analytics: "public"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Responses
|
|
32
|
+
|
|
33
|
+
All token skills return structured data from the Moralis API. Here are the typical response formats:
|
|
34
|
+
|
|
35
|
+
### Token Price
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"tokenName": "Pepe",
|
|
40
|
+
"tokenSymbol": "PEPE",
|
|
41
|
+
"tokenLogo": "https://cdn.moralis.io/eth/0x6982508145454ce325ddbe47a25d4ec3d2311933.png",
|
|
42
|
+
"tokenDecimals": "18",
|
|
43
|
+
"usdPrice": 0.000012302426023896,
|
|
44
|
+
"usdPriceFormatted": "0.000012302426023896",
|
|
45
|
+
"24hrPercentChange": "-3.7369101031758394",
|
|
46
|
+
"exchangeName": "Uniswap v3",
|
|
47
|
+
"tokenAddress": "0x6982508145454ce325ddbe47a25d4ec3d2311933"
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Token Analytics
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"tokenAddress": "0x6982508145454ce325ddbe47a25d4ec3d2311933",
|
|
56
|
+
"totalBuyVolume": {
|
|
57
|
+
"5m": "",
|
|
58
|
+
"1h": 43678.642005116264,
|
|
59
|
+
"6h": 129974.13379912674,
|
|
60
|
+
"24h": 4583254.969119737
|
|
61
|
+
},
|
|
62
|
+
"totalSellVolume": {
|
|
63
|
+
"5m": 147.69184595604904,
|
|
64
|
+
"1h": 393.0296489666009,
|
|
65
|
+
"6h": 257421.35479601548,
|
|
66
|
+
"24h": 4735908.689740969
|
|
67
|
+
},
|
|
68
|
+
"totalBuyers": {
|
|
69
|
+
"5m": "",
|
|
70
|
+
"1h": 33,
|
|
71
|
+
"6h": 115,
|
|
72
|
+
"24h": 547
|
|
73
|
+
},
|
|
74
|
+
"totalSellers": {
|
|
75
|
+
"5m": 1,
|
|
76
|
+
"1h": 2,
|
|
77
|
+
"6h": 78,
|
|
78
|
+
"24h": 587
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Usage Tips
|
|
84
|
+
|
|
85
|
+
- For the best performance, always specify the chain parameter when querying across multiple blockchains.
|
|
86
|
+
- When using the token_search endpoint, be aware of your Moralis plan limitations.
|
|
87
|
+
- The token analytics skill provides valuable trading data that can be used for token analysis and market assessment.
|
|
88
|
+
|
|
89
|
+
For more detailed information on each endpoint, refer to the [Moralis API documentation](https://docs.moralis.io/web3-data-api/evm).
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""Token skills for blockchain token analysis."""
|
|
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.token.base import TokenBaseTool
|
|
9
|
+
from intentkit.skills.token.erc20_transfers import ERC20Transfers
|
|
10
|
+
from intentkit.skills.token.token_analytics import TokenAnalytics
|
|
11
|
+
from intentkit.skills.token.token_price import TokenPrice
|
|
12
|
+
from intentkit.skills.token.token_search import TokenSearch
|
|
13
|
+
|
|
14
|
+
# Cache skills at the system level, because they are stateless
|
|
15
|
+
_cache: dict[str, TokenBaseTool] = {}
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SkillStates(TypedDict):
|
|
21
|
+
"""State configurations for Token skills."""
|
|
22
|
+
|
|
23
|
+
token_price: SkillState
|
|
24
|
+
token_erc20_transfers: SkillState
|
|
25
|
+
token_search: SkillState
|
|
26
|
+
token_analytics: SkillState
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class Config(SkillConfig):
|
|
30
|
+
"""Configuration for Token blockchain analysis skills."""
|
|
31
|
+
|
|
32
|
+
states: SkillStates
|
|
33
|
+
api_key: str
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
async def get_skills(
|
|
37
|
+
config: "Config",
|
|
38
|
+
is_private: bool,
|
|
39
|
+
store: SkillStoreABC,
|
|
40
|
+
**_,
|
|
41
|
+
) -> list[TokenBaseTool]:
|
|
42
|
+
"""Get all Token blockchain analysis skills.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
config: The configuration for Token skills.
|
|
46
|
+
is_private: Whether to include private skills.
|
|
47
|
+
store: The skill store for persisting data.
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
A list of Token blockchain analysis skills.
|
|
51
|
+
"""
|
|
52
|
+
if "states" not in config:
|
|
53
|
+
logger.error("No 'states' field in config")
|
|
54
|
+
return []
|
|
55
|
+
|
|
56
|
+
available_skills = []
|
|
57
|
+
|
|
58
|
+
# Include skills based on their state
|
|
59
|
+
for skill_name, state in config["states"].items():
|
|
60
|
+
if state == "disabled":
|
|
61
|
+
continue
|
|
62
|
+
elif state == "public" or (state == "private" and is_private):
|
|
63
|
+
available_skills.append(skill_name)
|
|
64
|
+
|
|
65
|
+
# Get each skill using the cached getter
|
|
66
|
+
result = []
|
|
67
|
+
for name in available_skills:
|
|
68
|
+
skill = get_token_skill(name, store)
|
|
69
|
+
if skill:
|
|
70
|
+
result.append(skill)
|
|
71
|
+
|
|
72
|
+
return result
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def get_token_skill(
|
|
76
|
+
name: str,
|
|
77
|
+
store: SkillStoreABC,
|
|
78
|
+
) -> TokenBaseTool:
|
|
79
|
+
"""Get a Token blockchain analysis skill by name.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
name: The name of the skill to get
|
|
83
|
+
store: The skill store for persisting data
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
The requested Token blockchain analysis skill
|
|
87
|
+
"""
|
|
88
|
+
if name in _cache:
|
|
89
|
+
return _cache[name]
|
|
90
|
+
|
|
91
|
+
skill = None
|
|
92
|
+
if name == "token_price":
|
|
93
|
+
skill = TokenPrice(skill_store=store)
|
|
94
|
+
elif name == "token_erc20_transfers":
|
|
95
|
+
skill = ERC20Transfers(skill_store=store)
|
|
96
|
+
elif name == "token_search":
|
|
97
|
+
skill = TokenSearch(skill_store=store)
|
|
98
|
+
elif name == "token_analytics":
|
|
99
|
+
skill = TokenAnalytics(skill_store=store)
|
|
100
|
+
else:
|
|
101
|
+
logger.warning(f"Unknown Token skill: {name}")
|
|
102
|
+
return None
|
|
103
|
+
|
|
104
|
+
if skill:
|
|
105
|
+
_cache[name] = skill
|
|
106
|
+
|
|
107
|
+
return skill
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""Base class for token-related skills."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import Any, Dict, Optional
|
|
5
|
+
|
|
6
|
+
import aiohttp
|
|
7
|
+
from langchain_core.runnables import RunnableConfig
|
|
8
|
+
|
|
9
|
+
from intentkit.abstracts.skill import SkillStoreABC
|
|
10
|
+
from intentkit.skills.base import IntentKitSkill, SkillContext
|
|
11
|
+
from intentkit.skills.token.constants import MORALIS_API_BASE_URL
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TokenBaseTool(IntentKitSkill):
|
|
17
|
+
"""Base class for all token-related skills.
|
|
18
|
+
|
|
19
|
+
This base class provides common functionality for token API interactions,
|
|
20
|
+
including making HTTP requests to the Moralis API.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(self, skill_store: SkillStoreABC = None):
|
|
24
|
+
"""Initialize the token tool with a skill store."""
|
|
25
|
+
super().__init__(skill_store=skill_store)
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def category(self) -> str:
|
|
29
|
+
return "token"
|
|
30
|
+
|
|
31
|
+
def get_api_key(self, context: SkillContext) -> str:
|
|
32
|
+
"""Get API key from agent config or system config.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
context: The skill context containing the agent config
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
The API key to use for API requests
|
|
39
|
+
"""
|
|
40
|
+
skill_config = context.config
|
|
41
|
+
if skill_config.get("api_key_provider") == "agent_owner":
|
|
42
|
+
return skill_config.get("api_key")
|
|
43
|
+
return self.skill_store.get_system_config("moralis_api_key")
|
|
44
|
+
|
|
45
|
+
def context_from_config(self, config: Optional[RunnableConfig] = None) -> Any:
|
|
46
|
+
"""Extract context from the runnable config."""
|
|
47
|
+
if not config:
|
|
48
|
+
logger.error("No config provided to context_from_config")
|
|
49
|
+
return None
|
|
50
|
+
|
|
51
|
+
if "configurable" not in config:
|
|
52
|
+
logger.error("'configurable' not in config")
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
if "agent" not in config["configurable"]:
|
|
56
|
+
logger.error("'agent' not in config['configurable']")
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
agent = config["configurable"].get("agent")
|
|
60
|
+
category_config = None
|
|
61
|
+
|
|
62
|
+
if agent.skills:
|
|
63
|
+
category_config = agent.skills.get(self.category)
|
|
64
|
+
|
|
65
|
+
if not category_config:
|
|
66
|
+
category_config = getattr(agent, self.category + "_config", {})
|
|
67
|
+
|
|
68
|
+
if not category_config:
|
|
69
|
+
category_config = {}
|
|
70
|
+
|
|
71
|
+
from intentkit.skills.base import SkillContext
|
|
72
|
+
|
|
73
|
+
context = SkillContext(
|
|
74
|
+
agent=agent,
|
|
75
|
+
config=category_config,
|
|
76
|
+
user_id=config["configurable"].get("user_id"),
|
|
77
|
+
entrypoint=config["configurable"].get("entrypoint"),
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
return context
|
|
81
|
+
|
|
82
|
+
def _prepare_params(self, params: Dict[str, Any]) -> Dict[str, Any]:
|
|
83
|
+
"""Convert boolean values to lowercase strings for API compatibility.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
params: Dictionary with query parameters that may contain boolean values
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
Dictionary with boolean values converted to lowercase strings
|
|
90
|
+
"""
|
|
91
|
+
if not params:
|
|
92
|
+
return params
|
|
93
|
+
|
|
94
|
+
result = {}
|
|
95
|
+
for key, value in params.items():
|
|
96
|
+
if isinstance(value, bool):
|
|
97
|
+
result[key] = str(value).lower()
|
|
98
|
+
else:
|
|
99
|
+
result[key] = value
|
|
100
|
+
return result
|
|
101
|
+
|
|
102
|
+
async def _make_request(
|
|
103
|
+
self,
|
|
104
|
+
method: str,
|
|
105
|
+
endpoint: str,
|
|
106
|
+
api_key: str,
|
|
107
|
+
params: Dict[str, Any] = None,
|
|
108
|
+
data: Dict[str, Any] = None,
|
|
109
|
+
) -> Dict[str, Any]:
|
|
110
|
+
"""Make a request to the Moralis API.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
method: HTTP method (GET, POST, etc.)
|
|
114
|
+
endpoint: API endpoint (without base URL)
|
|
115
|
+
api_key: Moralis API key
|
|
116
|
+
params: Query parameters
|
|
117
|
+
data: Request body data for POST requests
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
Response data as dictionary
|
|
121
|
+
"""
|
|
122
|
+
url = f"{MORALIS_API_BASE_URL}{endpoint}"
|
|
123
|
+
|
|
124
|
+
if not api_key:
|
|
125
|
+
logger.error("API key is missing")
|
|
126
|
+
return {"error": "API key is missing"}
|
|
127
|
+
|
|
128
|
+
headers = {"accept": "application/json", "X-API-Key": api_key}
|
|
129
|
+
processed_params = self._prepare_params(params) if params else None
|
|
130
|
+
|
|
131
|
+
try:
|
|
132
|
+
async with aiohttp.ClientSession() as session:
|
|
133
|
+
async with session.request(
|
|
134
|
+
method=method,
|
|
135
|
+
url=url,
|
|
136
|
+
headers=headers,
|
|
137
|
+
params=processed_params,
|
|
138
|
+
json=data,
|
|
139
|
+
) as response:
|
|
140
|
+
if response.status >= 400:
|
|
141
|
+
error_text = await response.text()
|
|
142
|
+
logger.error(f"API error {response.status}: {error_text}")
|
|
143
|
+
return {
|
|
144
|
+
"error": f"API error: {response.status}",
|
|
145
|
+
"details": error_text,
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return await response.json()
|
|
149
|
+
except aiohttp.ClientError as e:
|
|
150
|
+
logger.error(f"HTTP error making request: {str(e)}")
|
|
151
|
+
return {"error": f"HTTP error: {str(e)}"}
|
|
152
|
+
except Exception as e:
|
|
153
|
+
logger.error(f"Unexpected error making request: {str(e)}")
|
|
154
|
+
return {"error": f"Unexpected error: {str(e)}"}
|
|
@@ -0,0 +1,145 @@
|
|
|
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.token.base import TokenBaseTool
|
|
8
|
+
from intentkit.skills.token.constants import DEFAULT_CHAIN, DEFAULT_LIMIT, DEFAULT_ORDER
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ERC20TransfersInput(BaseModel):
|
|
14
|
+
"""Input for ERC20 transfers tool."""
|
|
15
|
+
|
|
16
|
+
address: str = Field(
|
|
17
|
+
description="The address of the wallet to get ERC20 token transfers for."
|
|
18
|
+
)
|
|
19
|
+
chain: str = Field(
|
|
20
|
+
description="The chain to query (e.g., 'eth', 'bsc', 'polygon').",
|
|
21
|
+
default=DEFAULT_CHAIN,
|
|
22
|
+
)
|
|
23
|
+
contract_addresses: Optional[List[str]] = Field(
|
|
24
|
+
description="List of contract addresses of transfers to filter by.",
|
|
25
|
+
default=None,
|
|
26
|
+
)
|
|
27
|
+
from_block: Optional[int] = Field(
|
|
28
|
+
description="The minimum block number from which to get the transactions.",
|
|
29
|
+
default=None,
|
|
30
|
+
)
|
|
31
|
+
to_block: Optional[int] = Field(
|
|
32
|
+
description="The maximum block number from which to get the transactions.",
|
|
33
|
+
default=None,
|
|
34
|
+
)
|
|
35
|
+
from_date: Optional[str] = Field(
|
|
36
|
+
description="The start date from which to get the transactions (any format accepted by momentjs).",
|
|
37
|
+
default=None,
|
|
38
|
+
)
|
|
39
|
+
to_date: Optional[str] = Field(
|
|
40
|
+
description="Get the transactions up to this date (any format accepted by momentjs).",
|
|
41
|
+
default=None,
|
|
42
|
+
)
|
|
43
|
+
limit: Optional[int] = Field(
|
|
44
|
+
description="The desired page size of the result.",
|
|
45
|
+
default=DEFAULT_LIMIT,
|
|
46
|
+
)
|
|
47
|
+
order: Optional[str] = Field(
|
|
48
|
+
description="The order of the result, in ascending (ASC) or descending (DESC).",
|
|
49
|
+
default=DEFAULT_ORDER,
|
|
50
|
+
)
|
|
51
|
+
cursor: Optional[str] = Field(
|
|
52
|
+
description="The cursor returned in the previous response (for pagination).",
|
|
53
|
+
default=None,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class ERC20Transfers(TokenBaseTool):
|
|
58
|
+
"""Tool for retrieving ERC20 token transfers by wallet using Moralis.
|
|
59
|
+
|
|
60
|
+
This tool uses Moralis' API to fetch ERC20 token transactions ordered by
|
|
61
|
+
block number in descending order for a specific wallet address.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
name: str = "token_erc20_transfers"
|
|
65
|
+
description: str = (
|
|
66
|
+
"Get ERC20 token transactions for a wallet address, ordered by block number. "
|
|
67
|
+
"Returns transaction details, token information, and wallet interactions."
|
|
68
|
+
)
|
|
69
|
+
args_schema: Type[BaseModel] = ERC20TransfersInput
|
|
70
|
+
|
|
71
|
+
async def _arun(
|
|
72
|
+
self,
|
|
73
|
+
address: str,
|
|
74
|
+
chain: str = DEFAULT_CHAIN,
|
|
75
|
+
contract_addresses: Optional[List[str]] = None,
|
|
76
|
+
from_block: Optional[int] = None,
|
|
77
|
+
to_block: Optional[int] = None,
|
|
78
|
+
from_date: Optional[str] = None,
|
|
79
|
+
to_date: Optional[str] = None,
|
|
80
|
+
limit: Optional[int] = DEFAULT_LIMIT,
|
|
81
|
+
order: Optional[str] = DEFAULT_ORDER,
|
|
82
|
+
cursor: Optional[str] = None,
|
|
83
|
+
config: RunnableConfig = None,
|
|
84
|
+
**kwargs,
|
|
85
|
+
) -> Dict[str, Any]:
|
|
86
|
+
"""Fetch ERC20 token transfers for a wallet from Moralis.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
address: The wallet address
|
|
90
|
+
chain: The blockchain to query
|
|
91
|
+
contract_addresses: List of contract addresses to filter by
|
|
92
|
+
from_block: Minimum block number
|
|
93
|
+
to_block: Maximum block number
|
|
94
|
+
from_date: Start date for transfers
|
|
95
|
+
to_date: End date for transfers
|
|
96
|
+
limit: Number of results per page
|
|
97
|
+
order: Order of results (ASC/DESC)
|
|
98
|
+
cursor: Pagination cursor
|
|
99
|
+
config: The configuration for the tool call
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
Dict containing ERC20 transfer data
|
|
103
|
+
"""
|
|
104
|
+
context = self.context_from_config(config)
|
|
105
|
+
if context is None:
|
|
106
|
+
logger.error("Context is None, cannot retrieve API key")
|
|
107
|
+
return {
|
|
108
|
+
"error": "Cannot retrieve API key. Please check agent configuration."
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
# Get the API key
|
|
112
|
+
api_key = self.get_api_key(context)
|
|
113
|
+
|
|
114
|
+
if not api_key:
|
|
115
|
+
logger.error("No Moralis API key available")
|
|
116
|
+
return {"error": "No Moralis API key provided in the configuration."}
|
|
117
|
+
|
|
118
|
+
# Build query parameters
|
|
119
|
+
params = {"chain": chain, "limit": limit, "order": order}
|
|
120
|
+
|
|
121
|
+
# Add optional parameters if they exist
|
|
122
|
+
if contract_addresses:
|
|
123
|
+
params["contract_addresses"] = contract_addresses
|
|
124
|
+
if from_block:
|
|
125
|
+
params["from_block"] = from_block
|
|
126
|
+
if to_block:
|
|
127
|
+
params["to_block"] = to_block
|
|
128
|
+
if from_date:
|
|
129
|
+
params["from_date"] = from_date
|
|
130
|
+
if to_date:
|
|
131
|
+
params["to_date"] = to_date
|
|
132
|
+
if cursor:
|
|
133
|
+
params["cursor"] = cursor
|
|
134
|
+
|
|
135
|
+
# Call Moralis API
|
|
136
|
+
try:
|
|
137
|
+
endpoint = f"/{address}/erc20/transfers"
|
|
138
|
+
return await self._make_request(
|
|
139
|
+
method="GET", endpoint=endpoint, api_key=api_key, params=params
|
|
140
|
+
)
|
|
141
|
+
except Exception as e:
|
|
142
|
+
logger.error(f"Error fetching ERC20 transfers: {e}")
|
|
143
|
+
return {
|
|
144
|
+
"error": f"An error occurred while fetching ERC20 transfers: {str(e)}. Please try again later."
|
|
145
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Token Skills",
|
|
4
|
+
"description": "Token analysis skills powered by Moralis API",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/portfolio/moralis.png",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"Blockchain",
|
|
9
|
+
"Web3",
|
|
10
|
+
"Crypto",
|
|
11
|
+
"Token",
|
|
12
|
+
"DeFi"
|
|
13
|
+
],
|
|
14
|
+
"properties": {
|
|
15
|
+
"enabled": {
|
|
16
|
+
"type": "boolean",
|
|
17
|
+
"title": "Enabled",
|
|
18
|
+
"description": "Whether this skill is enabled",
|
|
19
|
+
"default": true
|
|
20
|
+
},
|
|
21
|
+
"states": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"properties": {
|
|
24
|
+
"token_price": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"title": "ERC20 Token Price",
|
|
27
|
+
"enum": [
|
|
28
|
+
"disabled",
|
|
29
|
+
"public",
|
|
30
|
+
"private"
|
|
31
|
+
],
|
|
32
|
+
"x-enum-title": [
|
|
33
|
+
"Disabled",
|
|
34
|
+
"Agent Owner + All Users",
|
|
35
|
+
"Agent Owner Only"
|
|
36
|
+
],
|
|
37
|
+
"description": "Get the token price denominated in the blockchain's native token and USD",
|
|
38
|
+
"default": "public"
|
|
39
|
+
},
|
|
40
|
+
"token_erc20_transfers": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"title": "ERC20 Token Transfers",
|
|
43
|
+
"enum": [
|
|
44
|
+
"disabled",
|
|
45
|
+
"public",
|
|
46
|
+
"private"
|
|
47
|
+
],
|
|
48
|
+
"x-enum-title": [
|
|
49
|
+
"Disabled",
|
|
50
|
+
"Agent Owner + All Users",
|
|
51
|
+
"Agent Owner Only"
|
|
52
|
+
],
|
|
53
|
+
"description": "Get ERC20 token transactions ordered by block number",
|
|
54
|
+
"default": "public"
|
|
55
|
+
},
|
|
56
|
+
"token_search": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"title": "Token Search (Premium)",
|
|
59
|
+
"enum": [
|
|
60
|
+
"disabled",
|
|
61
|
+
"public",
|
|
62
|
+
"private"
|
|
63
|
+
],
|
|
64
|
+
"x-enum-title": [
|
|
65
|
+
"Disabled",
|
|
66
|
+
"Agent Owner + All Users",
|
|
67
|
+
"Agent Owner Only"
|
|
68
|
+
],
|
|
69
|
+
"description": "Search for tokens based on contract address, token name or token symbol. Premium endpoint available as an add-on. Requires a Moralis Business plan or Enterprise plan.",
|
|
70
|
+
"default": "public"
|
|
71
|
+
},
|
|
72
|
+
"token_analytics": {
|
|
73
|
+
"type": "string",
|
|
74
|
+
"title": "Token Analytics",
|
|
75
|
+
"enum": [
|
|
76
|
+
"disabled",
|
|
77
|
+
"public",
|
|
78
|
+
"private"
|
|
79
|
+
],
|
|
80
|
+
"x-enum-title": [
|
|
81
|
+
"Disabled",
|
|
82
|
+
"Agent Owner + All Users",
|
|
83
|
+
"Agent Owner Only"
|
|
84
|
+
],
|
|
85
|
+
"description": "Get analytics for a token by token address",
|
|
86
|
+
"default": "public"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"description": "States for each token analysis skill (disabled, public, or private)"
|
|
90
|
+
},
|
|
91
|
+
"api_key_provider": {
|
|
92
|
+
"type": "string",
|
|
93
|
+
"title": "API Key Provider",
|
|
94
|
+
"description": "Provider of the API key",
|
|
95
|
+
"enum": [
|
|
96
|
+
"platform",
|
|
97
|
+
"agent_owner"
|
|
98
|
+
],
|
|
99
|
+
"x-enum-title": [
|
|
100
|
+
"Nation Hosted",
|
|
101
|
+
"Owner Provided"
|
|
102
|
+
],
|
|
103
|
+
"default": "platform"
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"required": [
|
|
107
|
+
"states",
|
|
108
|
+
"enabled"
|
|
109
|
+
],
|
|
110
|
+
"if": {
|
|
111
|
+
"properties": {
|
|
112
|
+
"api_key_provider": {
|
|
113
|
+
"const": "agent_owner"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"then": {
|
|
118
|
+
"properties": {
|
|
119
|
+
"api_key": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"title": "Moralis API Key",
|
|
122
|
+
"description": "API key for Moralis API service",
|
|
123
|
+
"x-link": "[Get your API key](https://moralis.io/)",
|
|
124
|
+
"x-sensitive": true
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
"if": {
|
|
128
|
+
"properties": {
|
|
129
|
+
"enabled": {
|
|
130
|
+
"const": true
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"then": {
|
|
135
|
+
"required": [
|
|
136
|
+
"api_key"
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"additionalProperties": true
|
|
141
|
+
}
|