@gala-chain/launchpad-mcp-server 5.0.3 → 5.0.4-beta.0
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.
- package/README.md +49 -21
- package/dist/ai-docs.json +7357 -0
- package/dist/constants/mcpToolNames.d.ts +3 -1
- package/dist/constants/mcpToolNames.d.ts.map +1 -1
- package/dist/constants/mcpToolNames.js +2 -1
- package/dist/constants/mcpToolNames.js.map +1 -1
- package/dist/explain-sdk-usage-ai.json +3445 -0
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/generated/version.js.map +1 -1
- package/dist/prompts/account.d.ts +24 -0
- package/dist/prompts/account.d.ts.map +1 -0
- package/dist/prompts/account.js +89 -0
- package/dist/prompts/account.js.map +1 -0
- package/dist/prompts/api-keys.d.ts +36 -0
- package/dist/prompts/api-keys.d.ts.map +1 -0
- package/dist/prompts/api-keys.js +251 -0
- package/dist/prompts/api-keys.js.map +1 -0
- package/dist/prompts/auth.d.ts +29 -0
- package/dist/prompts/auth.d.ts.map +1 -0
- package/dist/prompts/auth.js +127 -0
- package/dist/prompts/auth.js.map +1 -0
- package/dist/prompts/balances.d.ts.map +1 -1
- package/dist/prompts/balances.js +17 -17
- package/dist/prompts/balances.js.map +1 -1
- package/dist/prompts/bans.d.ts +23 -0
- package/dist/prompts/bans.d.ts.map +1 -0
- package/dist/prompts/bans.js +82 -0
- package/dist/prompts/bans.js.map +1 -0
- package/dist/prompts/bridge.d.ts +2 -1
- package/dist/prompts/bridge.d.ts.map +1 -1
- package/dist/prompts/bridge.js +91 -227
- package/dist/prompts/bridge.js.map +1 -1
- package/dist/prompts/burns.d.ts +30 -0
- package/dist/prompts/burns.d.ts.map +1 -0
- package/dist/prompts/burns.js +127 -0
- package/dist/prompts/burns.js.map +1 -0
- package/dist/prompts/chat-messages.d.ts +21 -0
- package/dist/prompts/chat-messages.d.ts.map +1 -0
- package/dist/prompts/chat-messages.js +103 -0
- package/dist/prompts/chat-messages.js.map +1 -0
- package/dist/prompts/chat.d.ts +67 -0
- package/dist/prompts/chat.d.ts.map +1 -0
- package/dist/prompts/chat.js +355 -0
- package/dist/prompts/chat.js.map +1 -0
- package/dist/prompts/comments.d.ts +29 -0
- package/dist/prompts/comments.d.ts.map +1 -0
- package/dist/prompts/comments.js +133 -0
- package/dist/prompts/comments.js.map +1 -0
- package/dist/prompts/content-flags.d.ts +29 -0
- package/dist/prompts/content-flags.d.ts.map +1 -0
- package/dist/prompts/content-flags.js +248 -0
- package/dist/prompts/content-flags.js.map +1 -0
- package/dist/prompts/content-reactions.d.ts +29 -0
- package/dist/prompts/content-reactions.d.ts.map +1 -0
- package/dist/prompts/content-reactions.js +77 -0
- package/dist/prompts/content-reactions.js.map +1 -0
- package/dist/prompts/create-token.d.ts.map +1 -1
- package/dist/prompts/create-token.js +11 -18
- package/dist/prompts/create-token.js.map +1 -1
- package/dist/prompts/dex-trading.d.ts.map +1 -1
- package/dist/prompts/dex-trading.js +11 -42
- package/dist/prompts/dex-trading.js.map +1 -1
- package/dist/prompts/discover-tokens.d.ts.map +1 -1
- package/dist/prompts/discover-tokens.js +11 -26
- package/dist/prompts/discover-tokens.js.map +1 -1
- package/dist/prompts/event-subscriptions.d.ts +45 -0
- package/dist/prompts/event-subscriptions.d.ts.map +1 -0
- package/dist/prompts/event-subscriptions.js +330 -0
- package/dist/prompts/event-subscriptions.js.map +1 -0
- package/dist/prompts/explore-dex-pools.d.ts +2 -0
- package/dist/prompts/explore-dex-pools.d.ts.map +1 -1
- package/dist/prompts/explore-dex-pools.js +26 -104
- package/dist/prompts/explore-dex-pools.js.map +1 -1
- package/dist/prompts/factories/balance-prompt-factory.d.ts +102 -0
- package/dist/prompts/factories/balance-prompt-factory.d.ts.map +1 -0
- package/dist/prompts/factories/balance-prompt-factory.js +176 -0
- package/dist/prompts/factories/balance-prompt-factory.js.map +1 -0
- package/dist/prompts/factories/ban-management-factory.d.ts +90 -0
- package/dist/prompts/factories/ban-management-factory.d.ts.map +1 -0
- package/dist/prompts/factories/ban-management-factory.js +330 -0
- package/dist/prompts/factories/ban-management-factory.js.map +1 -0
- package/dist/prompts/factories/calculation-prompt-factory.d.ts +119 -0
- package/dist/prompts/factories/calculation-prompt-factory.d.ts.map +1 -0
- package/dist/prompts/factories/calculation-prompt-factory.js +183 -0
- package/dist/prompts/factories/calculation-prompt-factory.js.map +1 -0
- package/dist/prompts/factories/discovery-prompt-factory.d.ts +135 -0
- package/dist/prompts/factories/discovery-prompt-factory.d.ts.map +1 -0
- package/dist/prompts/factories/discovery-prompt-factory.js +240 -0
- package/dist/prompts/factories/discovery-prompt-factory.js.map +1 -0
- package/dist/prompts/factories/event-subscription-factory.d.ts +177 -0
- package/dist/prompts/factories/event-subscription-factory.d.ts.map +1 -0
- package/dist/prompts/factories/event-subscription-factory.js +329 -0
- package/dist/prompts/factories/event-subscription-factory.js.map +1 -0
- package/dist/prompts/factories/filtered-list-prompt-factory.d.ts +95 -0
- package/dist/prompts/factories/filtered-list-prompt-factory.d.ts.map +1 -0
- package/dist/prompts/factories/filtered-list-prompt-factory.js +147 -0
- package/dist/prompts/factories/filtered-list-prompt-factory.js.map +1 -0
- package/dist/prompts/factories/index.d.ts +33 -0
- package/dist/prompts/factories/index.d.ts.map +1 -0
- package/dist/prompts/factories/index.js +91 -0
- package/dist/prompts/factories/index.js.map +1 -0
- package/dist/prompts/factories/invite-management-factory.d.ts +88 -0
- package/dist/prompts/factories/invite-management-factory.d.ts.map +1 -0
- package/dist/prompts/factories/invite-management-factory.js +262 -0
- package/dist/prompts/factories/invite-management-factory.js.map +1 -0
- package/dist/prompts/factories/reaction-prompt-factory.d.ts +81 -0
- package/dist/prompts/factories/reaction-prompt-factory.d.ts.map +1 -0
- package/dist/prompts/factories/reaction-prompt-factory.js +188 -0
- package/dist/prompts/factories/reaction-prompt-factory.js.map +1 -0
- package/dist/prompts/factories/simple-operation-factory.d.ts +166 -0
- package/dist/prompts/factories/simple-operation-factory.d.ts.map +1 -0
- package/dist/prompts/factories/simple-operation-factory.js +218 -0
- package/dist/prompts/factories/simple-operation-factory.js.map +1 -0
- package/dist/prompts/index.d.ts +31 -6
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +136 -5
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/locks.d.ts.map +1 -1
- package/dist/prompts/locks.js +32 -56
- package/dist/prompts/locks.js.map +1 -1
- package/dist/prompts/moderators.d.ts +22 -0
- package/dist/prompts/moderators.d.ts.map +1 -0
- package/dist/prompts/moderators.js +62 -0
- package/dist/prompts/moderators.js.map +1 -0
- package/dist/prompts/monitoring.d.ts +3 -1
- package/dist/prompts/monitoring.d.ts.map +1 -1
- package/dist/prompts/monitoring.js +52 -140
- package/dist/prompts/monitoring.js.map +1 -1
- package/dist/prompts/overseers.d.ts +34 -0
- package/dist/prompts/overseers.d.ts.map +1 -0
- package/dist/prompts/overseers.js +117 -0
- package/dist/prompts/overseers.js.map +1 -0
- package/dist/prompts/pools.d.ts +22 -20
- package/dist/prompts/pools.d.ts.map +1 -1
- package/dist/prompts/pools.js +150 -251
- package/dist/prompts/pools.js.map +1 -1
- package/dist/prompts/portfolio.d.ts.map +1 -1
- package/dist/prompts/portfolio.js +1 -9
- package/dist/prompts/portfolio.js.map +1 -1
- package/dist/prompts/prompt-factories.d.ts +179 -0
- package/dist/prompts/prompt-factories.d.ts.map +1 -0
- package/dist/prompts/prompt-factories.js +230 -0
- package/dist/prompts/prompt-factories.js.map +1 -0
- package/dist/prompts/referrals.d.ts +27 -0
- package/dist/prompts/referrals.d.ts.map +1 -0
- package/dist/prompts/referrals.js +176 -0
- package/dist/prompts/referrals.js.map +1 -0
- package/dist/prompts/streaming.d.ts +84 -0
- package/dist/prompts/streaming.d.ts.map +1 -0
- package/dist/prompts/streaming.js +411 -0
- package/dist/prompts/streaming.js.map +1 -0
- package/dist/prompts/tier1-bridge-operations.d.ts +30 -0
- package/dist/prompts/tier1-bridge-operations.d.ts.map +1 -0
- package/dist/prompts/tier1-bridge-operations.js +634 -0
- package/dist/prompts/tier1-bridge-operations.js.map +1 -0
- package/dist/prompts/tier1-liquidity-management.d.ts +30 -0
- package/dist/prompts/tier1-liquidity-management.d.ts.map +1 -0
- package/dist/prompts/tier1-liquidity-management.js +560 -0
- package/dist/prompts/tier1-liquidity-management.js.map +1 -0
- package/dist/prompts/tier1-pool-discovery.d.ts +30 -0
- package/dist/prompts/tier1-pool-discovery.d.ts.map +1 -0
- package/dist/prompts/tier1-pool-discovery.js +221 -0
- package/dist/prompts/tier1-pool-discovery.js.map +1 -0
- package/dist/prompts/tier1-price-history.d.ts +30 -0
- package/dist/prompts/tier1-price-history.d.ts.map +1 -0
- package/dist/prompts/tier1-price-history.js +429 -0
- package/dist/prompts/tier1-price-history.js.map +1 -0
- package/dist/prompts/tier1-token-analysis.d.ts +30 -0
- package/dist/prompts/tier1-token-analysis.d.ts.map +1 -0
- package/dist/prompts/tier1-token-analysis.js +376 -0
- package/dist/prompts/tier1-token-analysis.js.map +1 -0
- package/dist/prompts/tier2-account-setup.d.ts +24 -0
- package/dist/prompts/tier2-account-setup.d.ts.map +1 -0
- package/dist/prompts/tier2-account-setup.js +206 -0
- package/dist/prompts/tier2-account-setup.js.map +1 -0
- package/dist/prompts/tier2-advanced-liquidity.d.ts +24 -0
- package/dist/prompts/tier2-advanced-liquidity.d.ts.map +1 -0
- package/dist/prompts/tier2-advanced-liquidity.js +298 -0
- package/dist/prompts/tier2-advanced-liquidity.js.map +1 -0
- package/dist/prompts/tier2-asset-management.d.ts +25 -0
- package/dist/prompts/tier2-asset-management.d.ts.map +1 -0
- package/dist/prompts/tier2-asset-management.js +246 -0
- package/dist/prompts/tier2-asset-management.js.map +1 -0
- package/dist/prompts/tier2-token-lifecycle.d.ts +25 -0
- package/dist/prompts/tier2-token-lifecycle.d.ts.map +1 -0
- package/dist/prompts/tier2-token-lifecycle.js +241 -0
- package/dist/prompts/tier2-token-lifecycle.js.map +1 -0
- package/dist/prompts/tier3-community-engagement.d.ts +26 -0
- package/dist/prompts/tier3-community-engagement.d.ts.map +1 -0
- package/dist/prompts/tier3-community-engagement.js +610 -0
- package/dist/prompts/tier3-community-engagement.js.map +1 -0
- package/dist/prompts/tier3-moderation-workflows.d.ts +31 -0
- package/dist/prompts/tier3-moderation-workflows.d.ts.map +1 -0
- package/dist/prompts/tier3-moderation-workflows.js +511 -0
- package/dist/prompts/tier3-moderation-workflows.js.map +1 -0
- package/dist/prompts/tier3-streaming-management.d.ts +26 -0
- package/dist/prompts/tier3-streaming-management.d.ts.map +1 -0
- package/dist/prompts/tier3-streaming-management.js +797 -0
- package/dist/prompts/tier3-streaming-management.js.map +1 -0
- package/dist/prompts/token-bans.d.ts +27 -0
- package/dist/prompts/token-bans.d.ts.map +1 -0
- package/dist/prompts/token-bans.js +77 -0
- package/dist/prompts/token-bans.js.map +1 -0
- package/dist/prompts/trades.d.ts +22 -0
- package/dist/prompts/trades.d.ts.map +1 -0
- package/dist/prompts/trades.js +107 -0
- package/dist/prompts/trades.js.map +1 -0
- package/dist/prompts/trading-calculations.d.ts +3 -1
- package/dist/prompts/trading-calculations.d.ts.map +1 -1
- package/dist/prompts/trading-calculations.js +134 -270
- package/dist/prompts/trading-calculations.js.map +1 -1
- package/dist/prompts/trading.d.ts +10 -1
- package/dist/prompts/trading.d.ts.map +1 -1
- package/dist/prompts/trading.js +128 -2
- package/dist/prompts/trading.js.map +1 -1
- package/dist/prompts/transfers.d.ts +2 -1
- package/dist/prompts/transfers.d.ts.map +1 -1
- package/dist/prompts/transfers.js +26 -30
- package/dist/prompts/transfers.js.map +1 -1
- package/dist/prompts/uploads.d.ts +19 -0
- package/dist/prompts/uploads.d.ts.map +1 -0
- package/dist/prompts/uploads.js +114 -0
- package/dist/prompts/uploads.js.map +1 -0
- package/dist/prompts/utility-tools.d.ts.map +1 -1
- package/dist/prompts/utility-tools.js +27 -18
- package/dist/prompts/utility-tools.js.map +1 -1
- package/dist/prompts/utils/index.d.ts +21 -0
- package/dist/prompts/utils/index.d.ts.map +1 -0
- package/dist/prompts/utils/index.js +38 -0
- package/dist/prompts/utils/index.js.map +1 -0
- package/dist/prompts/utils/pagination-helpers.d.ts +95 -0
- package/dist/prompts/utils/pagination-helpers.d.ts.map +1 -0
- package/dist/prompts/utils/pagination-helpers.js +121 -0
- package/dist/prompts/utils/pagination-helpers.js.map +1 -0
- package/dist/prompts/utils/workflowTemplates.d.ts.map +1 -1
- package/dist/prompts/utils/workflowTemplates.js +4 -3
- package/dist/prompts/utils/workflowTemplates.js.map +1 -1
- package/dist/prompts/wallet.d.ts +24 -0
- package/dist/prompts/wallet.d.ts.map +1 -0
- package/dist/prompts/wallet.js +139 -0
- package/dist/prompts/wallet.js.map +1 -0
- package/dist/schemas/common-schemas.d.ts +890 -0
- package/dist/schemas/common-schemas.d.ts.map +1 -1
- package/dist/schemas/common-schemas.js +853 -1
- package/dist/schemas/common-schemas.js.map +1 -1
- package/dist/server.d.ts +31 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +68 -7
- package/dist/server.js.map +1 -1
- package/dist/tools/api-keys/index.d.ts +41 -0
- package/dist/tools/api-keys/index.d.ts.map +1 -0
- package/dist/tools/api-keys/index.js +245 -0
- package/dist/tools/api-keys/index.js.map +1 -0
- package/dist/tools/auth/index.d.ts +19 -0
- package/dist/tools/auth/index.d.ts.map +1 -0
- package/dist/tools/auth/index.js +138 -0
- package/dist/tools/auth/index.js.map +1 -0
- package/dist/tools/balance/helpers/format-balance.d.ts +86 -0
- package/dist/tools/balance/helpers/format-balance.d.ts.map +1 -0
- package/dist/tools/balance/helpers/format-balance.js +87 -0
- package/dist/tools/balance/helpers/format-balance.js.map +1 -0
- package/dist/tools/balance/index.d.ts +4 -4
- package/dist/tools/balance/index.d.ts.map +1 -1
- package/dist/tools/balance/index.js +64 -176
- package/dist/tools/balance/index.js.map +1 -1
- package/dist/tools/ban/index.d.ts +37 -0
- package/dist/tools/ban/index.d.ts.map +1 -0
- package/dist/tools/ban/index.js +206 -0
- package/dist/tools/ban/index.js.map +1 -0
- package/dist/tools/bridge/helpers/bridgeable-token-tools.d.ts +87 -0
- package/dist/tools/bridge/helpers/bridgeable-token-tools.d.ts.map +1 -0
- package/dist/tools/bridge/helpers/bridgeable-token-tools.js +130 -0
- package/dist/tools/bridge/helpers/bridgeable-token-tools.js.map +1 -0
- package/dist/tools/bridge/helpers/external-chain-balance-tools.d.ts +87 -0
- package/dist/tools/bridge/helpers/external-chain-balance-tools.d.ts.map +1 -0
- package/dist/tools/bridge/helpers/external-chain-balance-tools.js +167 -0
- package/dist/tools/bridge/helpers/external-chain-balance-tools.js.map +1 -0
- package/dist/tools/bridge/index.d.ts +3 -7
- package/dist/tools/bridge/index.d.ts.map +1 -1
- package/dist/tools/bridge/index.js +89 -371
- package/dist/tools/bridge/index.js.map +1 -1
- package/dist/tools/burns/index.d.ts.map +1 -1
- package/dist/tools/burns/index.js +8 -36
- package/dist/tools/burns/index.js.map +1 -1
- package/dist/tools/chat/getPinnedChatMessage.d.ts +15 -0
- package/dist/tools/chat/getPinnedChatMessage.d.ts.map +1 -0
- package/dist/tools/chat/getPinnedChatMessage.js +37 -0
- package/dist/tools/chat/getPinnedChatMessage.js.map +1 -0
- package/dist/tools/chat/index.d.ts +73 -0
- package/dist/tools/chat/index.d.ts.map +1 -0
- package/dist/tools/chat/index.js +359 -0
- package/dist/tools/chat/index.js.map +1 -0
- package/dist/tools/chat/pinChatMessage.d.ts +16 -0
- package/dist/tools/chat/pinChatMessage.d.ts.map +1 -0
- package/dist/tools/chat/pinChatMessage.js +51 -0
- package/dist/tools/chat/pinChatMessage.js.map +1 -0
- package/dist/tools/chat/unpinChatMessage.d.ts +16 -0
- package/dist/tools/chat/unpinChatMessage.d.ts.map +1 -0
- package/dist/tools/chat/unpinChatMessage.js +39 -0
- package/dist/tools/chat/unpinChatMessage.js.map +1 -0
- package/dist/tools/chat-messages/index.d.ts +35 -0
- package/dist/tools/chat-messages/index.d.ts.map +1 -0
- package/dist/tools/chat-messages/index.js +165 -0
- package/dist/tools/chat-messages/index.js.map +1 -0
- package/dist/tools/comments/index.d.ts +44 -0
- package/dist/tools/comments/index.d.ts.map +1 -0
- package/dist/tools/comments/index.js +171 -0
- package/dist/tools/comments/index.js.map +1 -0
- package/dist/tools/content-flags/index.d.ts +38 -0
- package/dist/tools/content-flags/index.d.ts.map +1 -0
- package/dist/tools/content-flags/index.js +282 -0
- package/dist/tools/content-flags/index.js.map +1 -0
- package/dist/tools/content-reactions/index.d.ts +43 -0
- package/dist/tools/content-reactions/index.d.ts.map +1 -0
- package/dist/tools/content-reactions/index.js +135 -0
- package/dist/tools/content-reactions/index.js.map +1 -0
- package/dist/tools/creation/index.d.ts.map +1 -1
- package/dist/tools/creation/index.js +2 -5
- package/dist/tools/creation/index.js.map +1 -1
- package/dist/tools/dex/fetchAllDexPools.d.ts.map +1 -1
- package/dist/tools/dex/fetchAllDexPools.js +5 -21
- package/dist/tools/dex/fetchAllDexPools.js.map +1 -1
- package/dist/tools/dex/fetchDexPools.d.ts.map +1 -1
- package/dist/tools/dex/fetchDexPools.js +11 -28
- package/dist/tools/dex/fetchDexPools.js.map +1 -1
- package/dist/tools/dex/helpers.d.ts +479 -0
- package/dist/tools/dex/helpers.d.ts.map +1 -0
- package/dist/tools/dex/helpers.js +570 -0
- package/dist/tools/dex/helpers.js.map +1 -0
- package/dist/tools/dex/index.d.ts +50 -11
- package/dist/tools/dex/index.d.ts.map +1 -1
- package/dist/tools/dex/index.js +124 -486
- package/dist/tools/dex/index.js.map +1 -1
- package/dist/tools/dex/leaderboard.d.ts.map +1 -1
- package/dist/tools/dex/leaderboard.js +5 -70
- package/dist/tools/dex/leaderboard.js.map +1 -1
- package/dist/tools/dex/liquidity-positions.d.ts.map +1 -1
- package/dist/tools/dex/liquidity-positions.js +20 -91
- package/dist/tools/dex/liquidity-positions.js.map +1 -1
- package/dist/tools/dex/volume.d.ts.map +1 -1
- package/dist/tools/dex/volume.js +6 -21
- package/dist/tools/dex/volume.js.map +1 -1
- package/dist/tools/dex-analytics/index.d.ts +48 -0
- package/dist/tools/dex-analytics/index.d.ts.map +1 -0
- package/dist/tools/dex-analytics/index.js +111 -0
- package/dist/tools/dex-analytics/index.js.map +1 -0
- package/dist/tools/dex-liquidity/index.d.ts +22 -0
- package/dist/tools/dex-liquidity/index.d.ts.map +1 -0
- package/dist/tools/dex-liquidity/index.js +384 -0
- package/dist/tools/dex-liquidity/index.js.map +1 -0
- package/dist/tools/dex-pools/index.d.ts +60 -0
- package/dist/tools/dex-pools/index.d.ts.map +1 -0
- package/dist/tools/dex-pools/index.js +231 -0
- package/dist/tools/dex-pools/index.js.map +1 -0
- package/dist/tools/handler-factories.d.ts +1401 -0
- package/dist/tools/handler-factories.d.ts.map +1 -0
- package/dist/tools/handler-factories.js +1680 -0
- package/dist/tools/handler-factories.js.map +1 -0
- package/dist/tools/index.d.ts +1 -11
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +171 -27
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/locks/index.d.ts +2 -0
- package/dist/tools/locks/index.d.ts.map +1 -1
- package/dist/tools/locks/index.js +9 -86
- package/dist/tools/locks/index.js.map +1 -1
- package/dist/tools/moderators/index.d.ts +53 -0
- package/dist/tools/moderators/index.d.ts.map +1 -0
- package/dist/tools/moderators/index.js +258 -0
- package/dist/tools/moderators/index.js.map +1 -0
- package/dist/tools/overseers/getOverseerUserSummary.d.ts +15 -0
- package/dist/tools/overseers/getOverseerUserSummary.d.ts.map +1 -0
- package/dist/tools/overseers/getOverseerUserSummary.js +40 -0
- package/dist/tools/overseers/getOverseerUserSummary.js.map +1 -0
- package/dist/tools/overseers/index.d.ts +58 -0
- package/dist/tools/overseers/index.d.ts.map +1 -0
- package/dist/tools/overseers/index.js +325 -0
- package/dist/tools/overseers/index.js.map +1 -0
- package/dist/tools/overseers/listOverseerUsers.d.ts +15 -0
- package/dist/tools/overseers/listOverseerUsers.d.ts.map +1 -0
- package/dist/tools/overseers/listOverseerUsers.js +76 -0
- package/dist/tools/overseers/listOverseerUsers.js.map +1 -0
- package/dist/tools/pagination-handler-factory.d.ts +131 -0
- package/dist/tools/pagination-handler-factory.d.ts.map +1 -0
- package/dist/tools/pagination-handler-factory.js +159 -0
- package/dist/tools/pagination-handler-factory.js.map +1 -0
- package/dist/tools/pools/checkPoolExists.d.ts +16 -0
- package/dist/tools/pools/checkPoolExists.d.ts.map +1 -0
- package/dist/tools/pools/checkPoolExists.js +48 -0
- package/dist/tools/pools/checkPoolExists.js.map +1 -0
- package/dist/tools/pools/fetchAllPools.d.ts.map +1 -1
- package/dist/tools/pools/fetchAllPools.js +51 -11
- package/dist/tools/pools/fetchAllPools.js.map +1 -1
- package/dist/tools/pools/fetchAllPriceHistory.d.ts.map +1 -1
- package/dist/tools/pools/fetchAllPriceHistory.js +11 -51
- package/dist/tools/pools/fetchAllPriceHistory.js.map +1 -1
- package/dist/tools/pools/fetchPoolDetails.d.ts.map +1 -1
- package/dist/tools/pools/fetchPoolDetails.js +4 -11
- package/dist/tools/pools/fetchPoolDetails.js.map +1 -1
- package/dist/tools/pools/fetchPools.d.ts.map +1 -1
- package/dist/tools/pools/fetchPools.js +40 -20
- package/dist/tools/pools/fetchPools.js.map +1 -1
- package/dist/tools/pools/fetchPriceHistory.d.ts.map +1 -1
- package/dist/tools/pools/fetchPriceHistory.js +10 -51
- package/dist/tools/pools/fetchPriceHistory.js.map +1 -1
- package/dist/tools/pools/fetchTokenDetails.d.ts.map +1 -1
- package/dist/tools/pools/fetchTokenDetails.js +4 -35
- package/dist/tools/pools/fetchTokenDetails.js.map +1 -1
- package/dist/tools/pools/index.d.ts +2 -0
- package/dist/tools/pools/index.d.ts.map +1 -1
- package/dist/tools/pools/index.js +103 -35
- package/dist/tools/pools/index.js.map +1 -1
- package/dist/tools/pools/onDexPoolCreation.d.ts +1 -2
- package/dist/tools/pools/onDexPoolCreation.d.ts.map +1 -1
- package/dist/tools/pools/onDexPoolCreation.js +14 -48
- package/dist/tools/pools/onDexPoolCreation.js.map +1 -1
- package/dist/tools/pools/onLaunchpadTokenCreation.d.ts +1 -2
- package/dist/tools/pools/onLaunchpadTokenCreation.d.ts.map +1 -1
- package/dist/tools/pools/onLaunchpadTokenCreation.js +9 -42
- package/dist/tools/pools/onLaunchpadTokenCreation.js.map +1 -1
- package/dist/tools/pools/priceHistoryFactory.d.ts +44 -0
- package/dist/tools/pools/priceHistoryFactory.d.ts.map +1 -0
- package/dist/tools/pools/priceHistoryFactory.js +154 -0
- package/dist/tools/pools/priceHistoryFactory.js.map +1 -0
- package/dist/tools/pools/updateTokenSocials.d.ts +16 -0
- package/dist/tools/pools/updateTokenSocials.d.ts.map +1 -0
- package/dist/tools/pools/updateTokenSocials.js +84 -0
- package/dist/tools/pools/updateTokenSocials.js.map +1 -0
- package/dist/tools/referrals/index.d.ts +12 -0
- package/dist/tools/referrals/index.d.ts.map +1 -0
- package/dist/tools/referrals/index.js +110 -0
- package/dist/tools/referrals/index.js.map +1 -0
- package/dist/tools/streaming/index.d.ts +94 -0
- package/dist/tools/streaming/index.d.ts.map +1 -0
- package/dist/tools/streaming/index.js +549 -0
- package/dist/tools/streaming/index.js.map +1 -0
- package/dist/tools/streaming/setNextLiveStreamCountdown.d.ts +16 -0
- package/dist/tools/streaming/setNextLiveStreamCountdown.d.ts.map +1 -0
- package/dist/tools/streaming/setNextLiveStreamCountdown.js +62 -0
- package/dist/tools/streaming/setNextLiveStreamCountdown.js.map +1 -0
- package/dist/tools/token-ban/index.d.ts +39 -0
- package/dist/tools/token-ban/index.d.ts.map +1 -0
- package/dist/tools/token-ban/index.js +177 -0
- package/dist/tools/token-ban/index.js.map +1 -0
- package/dist/tools/tool-factory.d.ts +84 -0
- package/dist/tools/tool-factory.d.ts.map +1 -0
- package/dist/tools/tool-factory.js +135 -0
- package/dist/tools/tool-factory.js.map +1 -0
- package/dist/tools/trades/index.d.ts +20 -0
- package/dist/tools/trades/index.d.ts.map +1 -0
- package/dist/tools/trades/index.js +113 -0
- package/dist/tools/trades/index.js.map +1 -0
- package/dist/tools/trading/helpers/arg-extractors.d.ts +128 -0
- package/dist/tools/trading/helpers/arg-extractors.d.ts.map +1 -0
- package/dist/tools/trading/helpers/arg-extractors.js +215 -0
- package/dist/tools/trading/helpers/arg-extractors.js.map +1 -0
- package/dist/tools/trading/helpers/index.d.ts +8 -0
- package/dist/tools/trading/helpers/index.d.ts.map +1 -0
- package/dist/tools/trading/helpers/index.js +24 -0
- package/dist/tools/trading/helpers/index.js.map +1 -0
- package/dist/tools/trading/helpers/trading-schemas.d.ts +276 -0
- package/dist/tools/trading/helpers/trading-schemas.d.ts.map +1 -0
- package/dist/tools/trading/helpers/trading-schemas.js +310 -0
- package/dist/tools/trading/helpers/trading-schemas.js.map +1 -0
- package/dist/tools/trading/index.d.ts +2 -0
- package/dist/tools/trading/index.d.ts.map +1 -1
- package/dist/tools/trading/index.js +148 -371
- package/dist/tools/trading/index.js.map +1 -1
- package/dist/tools/transfers/index.d.ts +3 -0
- package/dist/tools/transfers/index.d.ts.map +1 -1
- package/dist/tools/transfers/index.js +72 -52
- package/dist/tools/transfers/index.js.map +1 -1
- package/dist/tools/utils/cleanup.d.ts.map +1 -1
- package/dist/tools/utils/cleanup.js +2 -9
- package/dist/tools/utils/cleanup.js.map +1 -1
- package/dist/tools/utils/clearCache.d.ts.map +1 -1
- package/dist/tools/utils/clearCache.js +5 -7
- package/dist/tools/utils/clearCache.js.map +1 -1
- package/dist/tools/utils/explainSdkUsage.d.ts +52 -0
- package/dist/tools/utils/explainSdkUsage.d.ts.map +1 -1
- package/dist/tools/utils/explainSdkUsage.js +1905 -93
- package/dist/tools/utils/explainSdkUsage.js.map +1 -1
- package/dist/tools/utils/getEthereumAddressFromPrivateKey.d.ts.map +1 -1
- package/dist/tools/utils/getEthereumAddressFromPrivateKey.js +2 -1
- package/dist/tools/utils/getEthereumAddressFromPrivateKey.js.map +1 -1
- package/dist/tools/utils/index.d.ts +2 -0
- package/dist/tools/utils/index.d.ts.map +1 -1
- package/dist/tools/utils/index.js +2 -12
- package/dist/tools/utils/index.js.map +1 -1
- package/dist/tools/wallet/index.d.ts +7 -0
- package/dist/tools/wallet/index.d.ts.map +1 -0
- package/dist/tools/wallet/index.js +24 -0
- package/dist/tools/wallet/index.js.map +1 -0
- package/dist/utils/date-converter.d.ts +58 -0
- package/dist/utils/date-converter.d.ts.map +1 -0
- package/dist/utils/date-converter.js +83 -0
- package/dist/utils/date-converter.js.map +1 -0
- package/dist/utils/pool-filter-builder.d.ts +78 -0
- package/dist/utils/pool-filter-builder.d.ts.map +1 -0
- package/dist/utils/pool-filter-builder.js +130 -0
- package/dist/utils/pool-filter-builder.js.map +1 -0
- package/dist/utils/safe-parsers.d.ts +87 -0
- package/dist/utils/safe-parsers.d.ts.map +1 -0
- package/dist/utils/safe-parsers.js +134 -0
- package/dist/utils/safe-parsers.js.map +1 -0
- package/dist/utils/validation.d.ts +5 -5
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +24 -21
- package/dist/utils/validation.js.map +1 -1
- package/package.json +23 -15
- package/.env.example +0 -21
- package/.eslintrc.json +0 -88
- package/CHANGELOG.md +0 -2161
- package/DOCS_AUDIT_REPORT.md +0 -189
- package/DRY_REFACTORING_GUIDE.md +0 -271
- package/MCP_COVERAGE_REPORT.md +0 -164
- package/MCP_TEST_ANALYSIS.md +0 -317
- package/jest.integration.config.js +0 -70
- package/scripts/inject-version.ts +0 -31
- package/scripts/validate-mcp-test-analysis.ts +0 -250
|
@@ -0,0 +1,1680 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Handler Factory Utilities
|
|
4
|
+
*
|
|
5
|
+
* Provides reusable factory functions for creating MCP tool handlers with common patterns.
|
|
6
|
+
* Reduces boilerplate and ensures consistent error handling across all tools.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* // Simple single-arg handler
|
|
10
|
+
* const handler = createSimpleHandler('fetchGalaBalance', (args) => args.address);
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* // Toggle enable/disable pattern
|
|
14
|
+
* const handler = createToggleHandler('enableChat', 'disableChat');
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* // Transaction status handler
|
|
18
|
+
* const handler = createTransactionStatusHandler('getSolanaTransactionStatus', 'Solana');
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // No-arg convenience fetcher
|
|
22
|
+
* const handler = createConvenienceFetcher('getGlobalChatStatus');
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.AUTH_DESCRIPTIONS = exports.extractBatchTokenOperationArgs = exports.extractSearchFilterArgs = exports.extractOffsetPaginationArgs = exports.extractPaginationArgs = exports.EXTERNAL_CHAIN_CONFIG = void 0;
|
|
26
|
+
exports.invokeSdkMethod = invokeSdkMethod;
|
|
27
|
+
exports.createSimpleHandler = createSimpleHandler;
|
|
28
|
+
exports.createToggleHandler = createToggleHandler;
|
|
29
|
+
exports.createTransactionStatusHandler = createTransactionStatusHandler;
|
|
30
|
+
exports.createConvenienceFetcher = createConvenienceFetcher;
|
|
31
|
+
exports.createBooleanHandler = createBooleanHandler;
|
|
32
|
+
exports.createTransformingHandler = createTransformingHandler;
|
|
33
|
+
exports.createReactionHandler = createReactionHandler;
|
|
34
|
+
exports.createWebSocketActionHandler = createWebSocketActionHandler;
|
|
35
|
+
exports.createTypingIndicatorHandler = createTypingIndicatorHandler;
|
|
36
|
+
exports.createContentListHandler = createContentListHandler;
|
|
37
|
+
exports.createContentCreateHandler = createContentCreateHandler;
|
|
38
|
+
exports.createContentUpdateHandler = createContentUpdateHandler;
|
|
39
|
+
exports.createContentDeleteHandler = createContentDeleteHandler;
|
|
40
|
+
exports.createContentCrudHandlers = createContentCrudHandlers;
|
|
41
|
+
exports.createStreamingListHandler = createStreamingListHandler;
|
|
42
|
+
exports.createStreamingGetHandler = createStreamingGetHandler;
|
|
43
|
+
exports.createStreamingDeleteHandler = createStreamingDeleteHandler;
|
|
44
|
+
exports.createTokenUserHandler = createTokenUserHandler;
|
|
45
|
+
exports.createNoArgActionHandler = createNoArgActionHandler;
|
|
46
|
+
exports.createWrapUnwrapHandler = createWrapUnwrapHandler;
|
|
47
|
+
exports.createExternalTokenBalanceHandler = createExternalTokenBalanceHandler;
|
|
48
|
+
exports.createExternalNativeBalanceHandler = createExternalNativeBalanceHandler;
|
|
49
|
+
exports.createExternalAllBalancesHandler = createExternalAllBalancesHandler;
|
|
50
|
+
exports.createArgumentExtractor = createArgumentExtractor;
|
|
51
|
+
exports.createOptionalAddressFetcher = createOptionalAddressFetcher;
|
|
52
|
+
exports.createTokenAddressHandler = createTokenAddressHandler;
|
|
53
|
+
exports.extractStatusArg = extractStatusArg;
|
|
54
|
+
exports.createPaginatedListHandler = createPaginatedListHandler;
|
|
55
|
+
exports.createBatchTokenOperationHandler = createBatchTokenOperationHandler;
|
|
56
|
+
exports.extractTransferArgs = extractTransferArgs;
|
|
57
|
+
exports.extractTokenTransferArgs = extractTokenTransferArgs;
|
|
58
|
+
exports.createGalaTransferHandler = createGalaTransferHandler;
|
|
59
|
+
exports.createTokenTransferHandler = createTokenTransferHandler;
|
|
60
|
+
exports.createTokenNameFetcher = createTokenNameFetcher;
|
|
61
|
+
exports.createTokenNameHandler = createTokenNameHandler;
|
|
62
|
+
exports.createTokenNameBooleanHandler = createTokenNameBooleanHandler;
|
|
63
|
+
exports.createCustomMessageHandler = createCustomMessageHandler;
|
|
64
|
+
exports.createWalletRequiredHandler = createWalletRequiredHandler;
|
|
65
|
+
exports.createNotFoundHandler = createNotFoundHandler;
|
|
66
|
+
exports.createNoArgResultHandler = createNoArgResultHandler;
|
|
67
|
+
exports.createSyncBooleanHandler = createSyncBooleanHandler;
|
|
68
|
+
exports.extractFlexibleTokenId = extractFlexibleTokenId;
|
|
69
|
+
exports.createConditionalResponseHandler = createConditionalResponseHandler;
|
|
70
|
+
exports.createOptionResultHandler = createOptionResultHandler;
|
|
71
|
+
exports.createWalletRequiredMethodHandler = createWalletRequiredMethodHandler;
|
|
72
|
+
exports.createOptionalParamsHandler = createOptionalParamsHandler;
|
|
73
|
+
exports.createPositionEnrichmentHandler = createPositionEnrichmentHandler;
|
|
74
|
+
const response_formatter_js_1 = require("../utils/response-formatter.js");
|
|
75
|
+
const error_handler_js_1 = require("../utils/error-handler.js");
|
|
76
|
+
/**
|
|
77
|
+
* Core helper: Looks up and invokes an SDK method with the given arguments.
|
|
78
|
+
*
|
|
79
|
+
* This is the core primitive that all handler factories use. It handles:
|
|
80
|
+
* - Method lookup on the SDK instance
|
|
81
|
+
* - Method existence validation
|
|
82
|
+
* - Argument handling (no args, single arg, spread array)
|
|
83
|
+
* - Proper `this` binding via call/apply
|
|
84
|
+
*
|
|
85
|
+
* @param options - Invocation configuration
|
|
86
|
+
* @returns Promise resolving to the SDK method result
|
|
87
|
+
* @throws Error if the SDK method doesn't exist
|
|
88
|
+
*
|
|
89
|
+
* @internal Exported for use by pagination-handler-factory; not part of public API.
|
|
90
|
+
*/
|
|
91
|
+
async function invokeSdkMethod(options) {
|
|
92
|
+
const { sdk, methodName, extractedArgs, errorContext } = options;
|
|
93
|
+
const contextLabel = errorContext ?? methodName;
|
|
94
|
+
const method = sdk[methodName];
|
|
95
|
+
if (!method || typeof method !== 'function') {
|
|
96
|
+
throw new Error(`SDK method "${methodName}" not found${errorContext ? ` for ${contextLabel}` : ''}`);
|
|
97
|
+
}
|
|
98
|
+
let result;
|
|
99
|
+
if (extractedArgs === undefined) {
|
|
100
|
+
// No args case
|
|
101
|
+
result = (await method.call(sdk));
|
|
102
|
+
}
|
|
103
|
+
else if (Array.isArray(extractedArgs)) {
|
|
104
|
+
// Spread array of args
|
|
105
|
+
result = (await method.apply(sdk, extractedArgs));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Single arg
|
|
109
|
+
result = (await method.call(sdk, extractedArgs));
|
|
110
|
+
}
|
|
111
|
+
return { result };
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Creates a simple handler that calls an SDK method with extracted arguments.
|
|
115
|
+
*
|
|
116
|
+
* Handles single or multi-argument SDK methods, with optional custom argument extraction.
|
|
117
|
+
*
|
|
118
|
+
* @param sdkMethodName - Name of the SDK method to call (must exist on LaunchpadSDK)
|
|
119
|
+
* @param argExtractor - Optional function to extract/transform args before calling SDK method
|
|
120
|
+
* @returns Handler that calls the SDK method and returns formatted success response
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* // Simple single-arg extraction
|
|
124
|
+
* const handler = createSimpleHandler('fetchGalaBalance', (args) => args.address);
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* // Multi-arg extraction
|
|
128
|
+
* const handler = createSimpleHandler('fetchTokenBalance', (args) => [
|
|
129
|
+
* args.tokenName,
|
|
130
|
+
* args.address
|
|
131
|
+
* ]);
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* // No extraction (uses entire args object)
|
|
135
|
+
* const handler = createSimpleHandler('registerAccount');
|
|
136
|
+
*/
|
|
137
|
+
function createSimpleHandler(sdkMethodName, argExtractor) {
|
|
138
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
139
|
+
const extractedArgs = argExtractor ? argExtractor(args) : args;
|
|
140
|
+
const { result } = await invokeSdkMethod({
|
|
141
|
+
sdk,
|
|
142
|
+
methodName: sdkMethodName,
|
|
143
|
+
extractedArgs,
|
|
144
|
+
});
|
|
145
|
+
return (0, response_formatter_js_1.formatSuccess)(result);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Creates a toggle handler for enable/disable patterns.
|
|
150
|
+
*
|
|
151
|
+
* Returns a handler that calls the appropriate enable or disable SDK method
|
|
152
|
+
* based on the `enabled` argument value.
|
|
153
|
+
*
|
|
154
|
+
* @param enableMethod - Name of the SDK method to enable (called when enabled=true)
|
|
155
|
+
* @param disableMethod - Name of the SDK method to disable (called when enabled=false)
|
|
156
|
+
* @param argExtractor - Optional function to extract arguments for the SDK methods
|
|
157
|
+
* @returns Handler that toggles between enable and disable methods
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* const handler = createToggleHandler('enableChat', 'disableChat', (args) => args.tokenName);
|
|
161
|
+
*
|
|
162
|
+
* // When args = { enabled: true, tokenName: 'mytoken' }
|
|
163
|
+
* // Calls: sdk.enableChat('mytoken')
|
|
164
|
+
*
|
|
165
|
+
* // When args = { enabled: false, tokenName: 'mytoken' }
|
|
166
|
+
* // Calls: sdk.disableChat('mytoken')
|
|
167
|
+
*/
|
|
168
|
+
function createToggleHandler(enableMethod, disableMethod, argExtractor) {
|
|
169
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
170
|
+
const enabled = args.enabled;
|
|
171
|
+
// Validate enabled is a boolean
|
|
172
|
+
if (typeof enabled !== 'boolean') {
|
|
173
|
+
throw new Error(`enabled must be a boolean, received: ${typeof enabled}`);
|
|
174
|
+
}
|
|
175
|
+
const methodName = enabled ? enableMethod : disableMethod;
|
|
176
|
+
const extractedArgs = argExtractor ? argExtractor(args) : args;
|
|
177
|
+
const { result } = await invokeSdkMethod({
|
|
178
|
+
sdk,
|
|
179
|
+
methodName,
|
|
180
|
+
extractedArgs,
|
|
181
|
+
});
|
|
182
|
+
return (0, response_formatter_js_1.formatSuccess)(result);
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Creates a transaction status handler for blockchain transaction queries.
|
|
187
|
+
*
|
|
188
|
+
* Handles transaction status patterns like getSolanaTransactionStatus and getEthereumTransactionStatus.
|
|
189
|
+
* These methods typically require a transaction hash and optional chain hint.
|
|
190
|
+
*
|
|
191
|
+
* @param sdkMethod - Name of the SDK method to call (e.g., 'getSolanaTransactionStatus')
|
|
192
|
+
* @param chainName - Name of the chain for context in error messages
|
|
193
|
+
* @returns Handler that queries transaction status
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* const handler = createTransactionStatusHandler('getSolanaTransactionStatus', 'Solana');
|
|
197
|
+
*
|
|
198
|
+
* // Args expected: { transactionHash, chainHint? }
|
|
199
|
+
*/
|
|
200
|
+
function createTransactionStatusHandler(sdkMethod, chainName) {
|
|
201
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
202
|
+
const transactionHash = args.transactionHash;
|
|
203
|
+
const chainHint = args.chainHint;
|
|
204
|
+
// Validate transactionHash is a non-empty string
|
|
205
|
+
if (typeof transactionHash !== 'string' || transactionHash.trim() === '') {
|
|
206
|
+
throw new Error(`transactionHash must be a non-empty string for ${chainName} transaction status`);
|
|
207
|
+
}
|
|
208
|
+
// Validate chainHint is undefined or a string
|
|
209
|
+
if (chainHint !== undefined && typeof chainHint !== 'string') {
|
|
210
|
+
throw new Error(`chainHint must be a string if provided, received: ${typeof chainHint}`);
|
|
211
|
+
}
|
|
212
|
+
const { result } = await invokeSdkMethod({
|
|
213
|
+
sdk,
|
|
214
|
+
methodName: sdkMethod,
|
|
215
|
+
extractedArgs: [transactionHash, chainHint],
|
|
216
|
+
errorContext: chainName,
|
|
217
|
+
});
|
|
218
|
+
return (0, response_formatter_js_1.formatSuccess)(result);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Creates a convenience fetcher handler for simple no-arg or single-arg SDK methods.
|
|
223
|
+
*
|
|
224
|
+
* Ideal for read-only queries that don't require complex argument extraction.
|
|
225
|
+
* Automatically formats the result as JSON.
|
|
226
|
+
*
|
|
227
|
+
* @param sdkMethod - Name of the SDK method to call
|
|
228
|
+
* @param argExtractor - Optional function to extract single argument
|
|
229
|
+
* @returns Handler that fetches data from SDK
|
|
230
|
+
*
|
|
231
|
+
* @example
|
|
232
|
+
* // No-arg fetcher
|
|
233
|
+
* const handler = createConvenienceFetcher('getGlobalChatStatus');
|
|
234
|
+
*
|
|
235
|
+
* // Single-arg fetcher
|
|
236
|
+
* const handler = createConvenienceFetcher('fetchProfile', (args) => args.address);
|
|
237
|
+
*/
|
|
238
|
+
function createConvenienceFetcher(sdkMethod, argExtractor) {
|
|
239
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
240
|
+
const extractedArgs = argExtractor ? argExtractor(args) : undefined;
|
|
241
|
+
const { result } = await invokeSdkMethod({
|
|
242
|
+
sdk,
|
|
243
|
+
methodName: sdkMethod,
|
|
244
|
+
extractedArgs,
|
|
245
|
+
});
|
|
246
|
+
return (0, response_formatter_js_1.formatSuccess)(result);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Creates a simple handler that returns a boolean success result.
|
|
251
|
+
*
|
|
252
|
+
* Use this for handlers that call SDK methods and just need to report success/failure,
|
|
253
|
+
* rather than returning the full SDK result.
|
|
254
|
+
*
|
|
255
|
+
* @param sdkMethodName - Name of the SDK method to call
|
|
256
|
+
* @param argExtractor - Optional function to extract/transform args before calling SDK method
|
|
257
|
+
* @param successMessage - Optional custom success message (defaults to "Operation completed successfully")
|
|
258
|
+
* @returns Handler that calls the SDK method and returns formatted boolean response
|
|
259
|
+
*
|
|
260
|
+
* @example
|
|
261
|
+
* const handler = createBooleanHandler('updateProfile', (args) => [
|
|
262
|
+
* { fullName: args.fullName, profileImage: args.profileImage },
|
|
263
|
+
* args.address,
|
|
264
|
+
* args.privateKey
|
|
265
|
+
* ], 'Profile updated successfully');
|
|
266
|
+
*/
|
|
267
|
+
function createBooleanHandler(sdkMethodName, argExtractor, successMessage) {
|
|
268
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
269
|
+
const extractedArgs = argExtractor ? argExtractor(args) : args;
|
|
270
|
+
await invokeSdkMethod({
|
|
271
|
+
sdk,
|
|
272
|
+
methodName: sdkMethodName,
|
|
273
|
+
extractedArgs,
|
|
274
|
+
});
|
|
275
|
+
return (0, response_formatter_js_1.formatBoolean)(true, successMessage ?? 'Operation completed successfully');
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Creates a handler with custom result transformation.
|
|
280
|
+
*
|
|
281
|
+
* Use this for handlers that need to post-process SDK results before formatting.
|
|
282
|
+
* The resultTransformer receives the raw SDK result and args, and returns the
|
|
283
|
+
* transformed data to be formatted.
|
|
284
|
+
*
|
|
285
|
+
* @param sdkMethodName - Name of the SDK method to call
|
|
286
|
+
* @param argExtractor - Optional function to extract/transform args before calling SDK method
|
|
287
|
+
* @param resultTransformer - Function to transform the SDK result before formatting
|
|
288
|
+
* @returns Handler that calls the SDK method and returns formatted transformed response
|
|
289
|
+
*
|
|
290
|
+
* @example
|
|
291
|
+
* const handler = createTransformingHandler(
|
|
292
|
+
* 'getSupportedBridgeTokens',
|
|
293
|
+
* undefined,
|
|
294
|
+
* (result, args) => {
|
|
295
|
+
* if (args.chain) {
|
|
296
|
+
* return result.tokens.filter(t => t.supportedChains.includes(args.chain));
|
|
297
|
+
* }
|
|
298
|
+
* return result;
|
|
299
|
+
* }
|
|
300
|
+
* );
|
|
301
|
+
*/
|
|
302
|
+
function createTransformingHandler(sdkMethodName, argExtractor, resultTransformer) {
|
|
303
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
304
|
+
const extractedArgs = argExtractor ? argExtractor(args) : undefined;
|
|
305
|
+
const { result } = await invokeSdkMethod({
|
|
306
|
+
sdk,
|
|
307
|
+
methodName: sdkMethodName,
|
|
308
|
+
extractedArgs,
|
|
309
|
+
});
|
|
310
|
+
const transformed = resultTransformer(result, args);
|
|
311
|
+
return (0, response_formatter_js_1.formatSuccess)(transformed);
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Creates a reaction handler for add/remove reaction operations.
|
|
316
|
+
*
|
|
317
|
+
* This factory handles the common pattern of reaction operations that take
|
|
318
|
+
* tokenName, messageId, and reactionType parameters. Consolidates add/remove
|
|
319
|
+
* into a single factory with operation type parameter.
|
|
320
|
+
*
|
|
321
|
+
* Note: The `operation` parameter is intentionally kept for API clarity and
|
|
322
|
+
* future extensibility (e.g., logging, metrics). The actual SDK method
|
|
323
|
+
* determines the operation semantics.
|
|
324
|
+
*
|
|
325
|
+
* @param _operation - Either 'add' or 'remove' (documents intent, used for API clarity)
|
|
326
|
+
* @param sdkMethodName - Name of the SDK method to call
|
|
327
|
+
* @returns Handler that calls the SDK method with reaction parameters
|
|
328
|
+
*
|
|
329
|
+
* @example
|
|
330
|
+
* // Create add reaction handler
|
|
331
|
+
* const handler = createReactionHandler('add', 'addContentReaction');
|
|
332
|
+
*
|
|
333
|
+
* // Create remove reaction handler
|
|
334
|
+
* const handler = createReactionHandler('remove', 'removeContentReaction');
|
|
335
|
+
*
|
|
336
|
+
* @since 5.13.0
|
|
337
|
+
*/
|
|
338
|
+
function createReactionHandler(operation, sdkMethodName) {
|
|
339
|
+
return createSimpleHandler(sdkMethodName, (args) => {
|
|
340
|
+
// Runtime validation for required string fields
|
|
341
|
+
const tokenName = args.tokenName;
|
|
342
|
+
const messageId = args.messageId;
|
|
343
|
+
const reactionType = args.reactionType;
|
|
344
|
+
if (typeof tokenName !== 'string' || !tokenName) {
|
|
345
|
+
throw new Error(`tokenName is required to ${operation} reaction`);
|
|
346
|
+
}
|
|
347
|
+
if (typeof messageId !== 'string' || !messageId) {
|
|
348
|
+
throw new Error(`messageId is required to ${operation} reaction`);
|
|
349
|
+
}
|
|
350
|
+
if (typeof reactionType !== 'string' || !reactionType) {
|
|
351
|
+
throw new Error(`reactionType is required to ${operation} reaction`);
|
|
352
|
+
}
|
|
353
|
+
return { tokenName, messageId, reactionType };
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Creates a WebSocket action handler with custom response formatting.
|
|
358
|
+
*
|
|
359
|
+
* This factory handles WebSocket operations that don't return meaningful
|
|
360
|
+
* SDK responses but need to return a custom success response.
|
|
361
|
+
*
|
|
362
|
+
* @param sdkMethodName - Name of the SDK method to call
|
|
363
|
+
* @param argExtractor - Function to extract arguments from input
|
|
364
|
+
* @param responseBuilder - Function to build the success response from args
|
|
365
|
+
* @returns Handler that calls SDK method and returns custom response
|
|
366
|
+
*
|
|
367
|
+
* @example
|
|
368
|
+
* const handler = createWebSocketActionHandler(
|
|
369
|
+
* 'sendStreamChatViaWebSocket',
|
|
370
|
+
* (args) => [args.tokenName, args.content],
|
|
371
|
+
* (args) => ({ sent: true, tokenName: args.tokenName, content: args.content })
|
|
372
|
+
* );
|
|
373
|
+
*
|
|
374
|
+
* @since 5.13.0
|
|
375
|
+
*/
|
|
376
|
+
function createWebSocketActionHandler(sdkMethodName, argExtractor, responseBuilder) {
|
|
377
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
378
|
+
const extractedArgs = argExtractor(args);
|
|
379
|
+
await invokeSdkMethod({
|
|
380
|
+
sdk,
|
|
381
|
+
methodName: sdkMethodName,
|
|
382
|
+
extractedArgs,
|
|
383
|
+
});
|
|
384
|
+
return (0, response_formatter_js_1.formatSuccess)(responseBuilder(args));
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Creates a typing indicator handler for start/stop typing operations.
|
|
389
|
+
*
|
|
390
|
+
* This factory handles the typing indicator pattern where a boolean
|
|
391
|
+
* determines which SDK method to call (sendTypingStart or sendTypingStop).
|
|
392
|
+
*
|
|
393
|
+
* Note: This handler uses synchronous SDK methods, which is why it doesn't
|
|
394
|
+
* use the shared invokeSdkMethod helper (designed for async methods).
|
|
395
|
+
*
|
|
396
|
+
* @param startMethod - SDK method name for start typing (sync method)
|
|
397
|
+
* @param stopMethod - SDK method name for stop typing (sync method)
|
|
398
|
+
* @returns Handler that calls appropriate method based on isTyping flag
|
|
399
|
+
*
|
|
400
|
+
* @example
|
|
401
|
+
* const handler = createTypingIndicatorHandler('sendTypingStart', 'sendTypingStop');
|
|
402
|
+
*
|
|
403
|
+
* @since 5.13.0
|
|
404
|
+
*/
|
|
405
|
+
function createTypingIndicatorHandler(startMethod, stopMethod) {
|
|
406
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
407
|
+
const tokenName = args.tokenName;
|
|
408
|
+
const isTyping = args.isTyping;
|
|
409
|
+
const methodName = isTyping ? startMethod : stopMethod;
|
|
410
|
+
const method = sdk[methodName];
|
|
411
|
+
if (!method || typeof method !== 'function') {
|
|
412
|
+
throw new Error(`SDK method "${methodName}" not found`);
|
|
413
|
+
}
|
|
414
|
+
method.call(sdk, tokenName);
|
|
415
|
+
return (0, response_formatter_js_1.formatSuccess)({
|
|
416
|
+
sent: true,
|
|
417
|
+
tokenName,
|
|
418
|
+
isTyping,
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Creates a list handler for content with tokenName/userAddress filters and pagination.
|
|
424
|
+
*
|
|
425
|
+
* This factory handles the common pattern of listing content (comments, chat messages)
|
|
426
|
+
* with optional tokenName and/or userAddress filters plus pagination.
|
|
427
|
+
*
|
|
428
|
+
* @param sdkMethod - Name of the SDK method to call
|
|
429
|
+
* @param options - Configuration options
|
|
430
|
+
* @returns Handler that lists content with filters and pagination
|
|
431
|
+
*
|
|
432
|
+
* @example
|
|
433
|
+
* const handler = createContentListHandler('getComments', {
|
|
434
|
+
* requireAtLeastOneFilter: true,
|
|
435
|
+
* resourceName: 'comments'
|
|
436
|
+
* });
|
|
437
|
+
*
|
|
438
|
+
* @since 6.3.0
|
|
439
|
+
*/
|
|
440
|
+
function createContentListHandler(sdkMethod, options = {}) {
|
|
441
|
+
const { requireAtLeastOneFilter = true, resourceName = 'content' } = options;
|
|
442
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
443
|
+
if (requireAtLeastOneFilter && !args.tokenName && !args.userAddress) {
|
|
444
|
+
throw new Error(`At least one of tokenName or userAddress is required to list ${resourceName}`);
|
|
445
|
+
}
|
|
446
|
+
const extractedArgs = {
|
|
447
|
+
tokenName: args.tokenName,
|
|
448
|
+
userAddress: args.userAddress,
|
|
449
|
+
page: args.page,
|
|
450
|
+
limit: args.limit,
|
|
451
|
+
};
|
|
452
|
+
const { result } = await invokeSdkMethod({
|
|
453
|
+
sdk,
|
|
454
|
+
methodName: sdkMethod,
|
|
455
|
+
extractedArgs,
|
|
456
|
+
});
|
|
457
|
+
return (0, response_formatter_js_1.formatSuccess)(result);
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Creates a create handler for content with tokenName and content fields.
|
|
462
|
+
*
|
|
463
|
+
* This factory handles the common pattern of creating content (comments, chat messages)
|
|
464
|
+
* with tokenName and content as required fields.
|
|
465
|
+
*
|
|
466
|
+
* @param sdkMethod - Name of the SDK method to call
|
|
467
|
+
* @returns Handler that creates content
|
|
468
|
+
*
|
|
469
|
+
* @example
|
|
470
|
+
* const handler = createContentCreateHandler('createComment');
|
|
471
|
+
*
|
|
472
|
+
* @since 6.3.0
|
|
473
|
+
*/
|
|
474
|
+
function createContentCreateHandler(sdkMethod) {
|
|
475
|
+
return createSimpleHandler(sdkMethod, (args) => ({
|
|
476
|
+
tokenName: args.tokenName,
|
|
477
|
+
content: args.content,
|
|
478
|
+
}));
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Creates an update handler for content with id and content fields.
|
|
482
|
+
*
|
|
483
|
+
* This factory handles the common pattern of updating content (comments, chat messages)
|
|
484
|
+
* with id and content wrapped in an update object.
|
|
485
|
+
*
|
|
486
|
+
* @param sdkMethod - Name of the SDK method to call
|
|
487
|
+
* @returns Handler that updates content
|
|
488
|
+
*
|
|
489
|
+
* @example
|
|
490
|
+
* const handler = createContentUpdateHandler('updateComment');
|
|
491
|
+
*
|
|
492
|
+
* @since 6.3.0
|
|
493
|
+
*/
|
|
494
|
+
function createContentUpdateHandler(sdkMethod) {
|
|
495
|
+
return createSimpleHandler(sdkMethod, (args) => [
|
|
496
|
+
args.id,
|
|
497
|
+
{ content: args.content },
|
|
498
|
+
]);
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Creates a delete handler for content with just an id field.
|
|
502
|
+
*
|
|
503
|
+
* This factory handles the common pattern of deleting content (comments, chat messages)
|
|
504
|
+
* by id, returning a boolean success response.
|
|
505
|
+
*
|
|
506
|
+
* @param sdkMethod - Name of the SDK method to call
|
|
507
|
+
* @param successMessage - Optional custom success message
|
|
508
|
+
* @returns Handler that deletes content
|
|
509
|
+
*
|
|
510
|
+
* @example
|
|
511
|
+
* const handler = createContentDeleteHandler('deleteComment', 'Comment deleted');
|
|
512
|
+
*
|
|
513
|
+
* @since 6.3.0
|
|
514
|
+
*/
|
|
515
|
+
function createContentDeleteHandler(sdkMethod, successMessage) {
|
|
516
|
+
return createBooleanHandler(sdkMethod, (args) => args.id, successMessage ?? 'Content deleted successfully');
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Creates all four CRUD handlers for a content resource.
|
|
520
|
+
*
|
|
521
|
+
* Returns an object with list, create, update, and delete handlers configured
|
|
522
|
+
* for the specified SDK methods. This is a convenience factory for resources
|
|
523
|
+
* that implement the full CRUD pattern.
|
|
524
|
+
*
|
|
525
|
+
* @param config - Configuration specifying SDK methods and resource name
|
|
526
|
+
* @returns Object containing all four CRUD handlers
|
|
527
|
+
*
|
|
528
|
+
* @example
|
|
529
|
+
* const { list, create, update, delete: remove } = createContentCrudHandlers({
|
|
530
|
+
* listMethod: 'getComments',
|
|
531
|
+
* createMethod: 'createComment',
|
|
532
|
+
* updateMethod: 'updateComment',
|
|
533
|
+
* deleteMethod: 'deleteComment',
|
|
534
|
+
* resourceName: 'Comment'
|
|
535
|
+
* });
|
|
536
|
+
*
|
|
537
|
+
* @since 6.3.0
|
|
538
|
+
*/
|
|
539
|
+
function createContentCrudHandlers(config) {
|
|
540
|
+
return {
|
|
541
|
+
list: createContentListHandler(config.listMethod, {
|
|
542
|
+
requireAtLeastOneFilter: true,
|
|
543
|
+
resourceName: config.resourceName.toLowerCase() + 's',
|
|
544
|
+
}),
|
|
545
|
+
create: createContentCreateHandler(config.createMethod),
|
|
546
|
+
update: createContentUpdateHandler(config.updateMethod),
|
|
547
|
+
delete: createContentDeleteHandler(config.deleteMethod, `${config.resourceName} deleted`),
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Creates a list handler for streaming resources with tokenName and pagination.
|
|
552
|
+
*
|
|
553
|
+
* @param sdkMethod - Name of the SDK method to call
|
|
554
|
+
* @returns Handler that lists streaming resources
|
|
555
|
+
*
|
|
556
|
+
* @example
|
|
557
|
+
* const handler = createStreamingListHandler('getStreamRecordings');
|
|
558
|
+
*
|
|
559
|
+
* @since 6.3.0
|
|
560
|
+
*/
|
|
561
|
+
function createStreamingListHandler(sdkMethod) {
|
|
562
|
+
return createSimpleHandler(sdkMethod, (args) => ({
|
|
563
|
+
tokenName: args.tokenName,
|
|
564
|
+
page: args.page,
|
|
565
|
+
limit: args.limit,
|
|
566
|
+
}));
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Creates a get/fetch handler for streaming resources with tokenName and resourceId.
|
|
570
|
+
*
|
|
571
|
+
* @param sdkMethod - Name of the SDK method to call
|
|
572
|
+
* @param resourceIdField - Name of the resource ID field in args
|
|
573
|
+
* @returns Handler that fetches a single streaming resource
|
|
574
|
+
*
|
|
575
|
+
* @example
|
|
576
|
+
* const handler = createStreamingGetHandler('getRecordingDownload', 'assetId');
|
|
577
|
+
*
|
|
578
|
+
* @since 6.3.0
|
|
579
|
+
*/
|
|
580
|
+
function createStreamingGetHandler(sdkMethod, resourceIdField) {
|
|
581
|
+
return createSimpleHandler(sdkMethod, (args) => [
|
|
582
|
+
args.tokenName,
|
|
583
|
+
args[resourceIdField],
|
|
584
|
+
]);
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* Creates a delete handler for streaming resources with tokenName and resourceId.
|
|
588
|
+
*
|
|
589
|
+
* @param sdkMethod - Name of the SDK method to call
|
|
590
|
+
* @param resourceIdField - Name of the resource ID field in args
|
|
591
|
+
* @param successMessage - Success message to return
|
|
592
|
+
* @returns Handler that deletes a streaming resource
|
|
593
|
+
*
|
|
594
|
+
* @example
|
|
595
|
+
* const handler = createStreamingDeleteHandler('deleteRecording', 'assetId', 'Recording deleted');
|
|
596
|
+
*
|
|
597
|
+
* @since 6.3.0
|
|
598
|
+
*/
|
|
599
|
+
function createStreamingDeleteHandler(sdkMethod, resourceIdField, successMessage) {
|
|
600
|
+
return createBooleanHandler(sdkMethod, (args) => [args.tokenName, args[resourceIdField]], successMessage);
|
|
601
|
+
}
|
|
602
|
+
// =============================================================================
|
|
603
|
+
// Token + User Handler Factory (Ban/Moderation Operations)
|
|
604
|
+
// =============================================================================
|
|
605
|
+
/**
|
|
606
|
+
* Creates a handler for operations that take tokenName and userAddress.
|
|
607
|
+
*
|
|
608
|
+
* This is a common pattern for ban/moderation operations:
|
|
609
|
+
* - createBan
|
|
610
|
+
* - removeBan
|
|
611
|
+
* - getBanStatus
|
|
612
|
+
*
|
|
613
|
+
* Reduces boilerplate by providing consistent argument extraction.
|
|
614
|
+
*
|
|
615
|
+
* @param sdkMethodName - Name of the SDK method to call
|
|
616
|
+
* @param additionalExtractor - Optional function to extract additional arguments
|
|
617
|
+
* @returns Handler that calls SDK method with tokenName, userAddress, and optional extras
|
|
618
|
+
*
|
|
619
|
+
* @example
|
|
620
|
+
* // Simple case: tokenName + userAddress only
|
|
621
|
+
* const handler = createTokenUserHandler('removeBan');
|
|
622
|
+
*
|
|
623
|
+
* // With additional args
|
|
624
|
+
* const handler = createTokenUserHandler('createBan', (args) => ({
|
|
625
|
+
* reason: args.reason as string | undefined,
|
|
626
|
+
* durationSeconds: args.durationSeconds as number | undefined,
|
|
627
|
+
* }));
|
|
628
|
+
*
|
|
629
|
+
* @since 6.6.0
|
|
630
|
+
*/
|
|
631
|
+
function createTokenUserHandler(sdkMethodName, additionalExtractor) {
|
|
632
|
+
return createSimpleHandler(sdkMethodName, (args) => {
|
|
633
|
+
const baseArgs = {
|
|
634
|
+
tokenName: args.tokenName,
|
|
635
|
+
userAddress: args.userAddress,
|
|
636
|
+
};
|
|
637
|
+
if (additionalExtractor) {
|
|
638
|
+
return { ...baseArgs, ...additionalExtractor(args) };
|
|
639
|
+
}
|
|
640
|
+
return baseArgs;
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
// =============================================================================
|
|
644
|
+
// No-Arg Action Handler Factory
|
|
645
|
+
// =============================================================================
|
|
646
|
+
/**
|
|
647
|
+
* Creates a handler for no-argument async actions that return a custom response.
|
|
648
|
+
*
|
|
649
|
+
* Use this for SDK methods that take no arguments and need a custom success response.
|
|
650
|
+
* Ideal for WebSocket connection management, initialization operations, etc.
|
|
651
|
+
*
|
|
652
|
+
* @param sdkMethodName - Name of the SDK method to call (takes no arguments)
|
|
653
|
+
* @param successResponse - Static response to return on success
|
|
654
|
+
* @returns Handler that calls SDK method and returns the custom response
|
|
655
|
+
*
|
|
656
|
+
* @example
|
|
657
|
+
* const handler = createNoArgActionHandler(
|
|
658
|
+
* 'connectStreamWebSocket',
|
|
659
|
+
* { connected: true, message: 'Connected to stream WebSocket' }
|
|
660
|
+
* );
|
|
661
|
+
*
|
|
662
|
+
* @since 6.6.0
|
|
663
|
+
*/
|
|
664
|
+
function createNoArgActionHandler(sdkMethodName, successResponse) {
|
|
665
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk) => {
|
|
666
|
+
await invokeSdkMethod({
|
|
667
|
+
sdk,
|
|
668
|
+
methodName: sdkMethodName,
|
|
669
|
+
});
|
|
670
|
+
return (0, response_formatter_js_1.formatSuccess)(successResponse);
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Creates a wrap or unwrap handler for cross-channel bridge operations.
|
|
675
|
+
*
|
|
676
|
+
* Both wrap and unwrap operations share identical structure:
|
|
677
|
+
* - tokenId (flexible format)
|
|
678
|
+
* - amount (decimal string)
|
|
679
|
+
* - recipient (optional)
|
|
680
|
+
* - memo (optional)
|
|
681
|
+
*
|
|
682
|
+
* The only difference is the SDK method called.
|
|
683
|
+
*
|
|
684
|
+
* @param sdkMethodName - Either 'wrapToken' or 'unwrapToken'
|
|
685
|
+
* @returns Handler for the wrap/unwrap operation
|
|
686
|
+
*
|
|
687
|
+
* @example
|
|
688
|
+
* const wrapHandler = createWrapUnwrapHandler('wrapToken');
|
|
689
|
+
* const unwrapHandler = createWrapUnwrapHandler('unwrapToken');
|
|
690
|
+
*
|
|
691
|
+
* @since 6.4.0
|
|
692
|
+
*/
|
|
693
|
+
function createWrapUnwrapHandler(sdkMethodName) {
|
|
694
|
+
return createSimpleHandler(sdkMethodName, (args) => {
|
|
695
|
+
// Runtime validation for tokenId - must be string or object
|
|
696
|
+
const tokenId = args.tokenId;
|
|
697
|
+
if (tokenId === undefined || tokenId === null) {
|
|
698
|
+
throw new Error('tokenId is required for wrap/unwrap operations');
|
|
699
|
+
}
|
|
700
|
+
if (typeof tokenId !== 'string' && typeof tokenId !== 'object') {
|
|
701
|
+
throw new Error('tokenId must be a string or TokenClassKey object');
|
|
702
|
+
}
|
|
703
|
+
return {
|
|
704
|
+
tokenId,
|
|
705
|
+
amount: args.amount,
|
|
706
|
+
recipient: args.recipient,
|
|
707
|
+
memo: args.memo,
|
|
708
|
+
};
|
|
709
|
+
});
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* Pre-configured chain settings for Ethereum and Solana.
|
|
713
|
+
* Single source of truth for chain-specific configuration.
|
|
714
|
+
*/
|
|
715
|
+
exports.EXTERNAL_CHAIN_CONFIG = {
|
|
716
|
+
Ethereum: {
|
|
717
|
+
chain: 'Ethereum',
|
|
718
|
+
addressFormat: '0x format',
|
|
719
|
+
nativeSymbol: 'ETH',
|
|
720
|
+
tokenSymbols: ['GALA', 'GWETH', 'GUSDC', 'GUSDT', 'GWTRX', 'GWBTC'],
|
|
721
|
+
allBalancesRpcCount: 7,
|
|
722
|
+
},
|
|
723
|
+
Solana: {
|
|
724
|
+
chain: 'Solana',
|
|
725
|
+
addressFormat: 'base58 format',
|
|
726
|
+
nativeSymbol: 'SOL',
|
|
727
|
+
tokenSymbols: ['GALA', 'GSOL'],
|
|
728
|
+
allBalancesRpcCount: 3,
|
|
729
|
+
},
|
|
730
|
+
};
|
|
731
|
+
/**
|
|
732
|
+
* Creates a token balance handler for external chains (Ethereum ERC-20, Solana SPL).
|
|
733
|
+
*
|
|
734
|
+
* Used for fetching single token balances on external chains.
|
|
735
|
+
* Takes symbol and optional address, returns token balance.
|
|
736
|
+
*
|
|
737
|
+
* @param chain - Target chain ('Ethereum' or 'Solana')
|
|
738
|
+
* @returns Handler that fetches single token balance
|
|
739
|
+
*
|
|
740
|
+
* @example
|
|
741
|
+
* const handler = createExternalTokenBalanceHandler('Ethereum');
|
|
742
|
+
* // SDK method: fetchEthereumWalletTokenBalance
|
|
743
|
+
*
|
|
744
|
+
* @since 6.5.0
|
|
745
|
+
*/
|
|
746
|
+
function createExternalTokenBalanceHandler(chain) {
|
|
747
|
+
const sdkMethod = `fetch${chain}WalletTokenBalance`;
|
|
748
|
+
return createSimpleHandler(sdkMethod, (args) => [
|
|
749
|
+
args.symbol,
|
|
750
|
+
args.address,
|
|
751
|
+
]);
|
|
752
|
+
}
|
|
753
|
+
/**
|
|
754
|
+
* Creates a native balance handler for external chains (ETH, SOL).
|
|
755
|
+
*
|
|
756
|
+
* Used for fetching native currency balance on external chains.
|
|
757
|
+
* Takes optional address, returns native balance.
|
|
758
|
+
*
|
|
759
|
+
* @param chain - Target chain ('Ethereum' or 'Solana')
|
|
760
|
+
* @returns Handler that fetches native currency balance
|
|
761
|
+
*
|
|
762
|
+
* @example
|
|
763
|
+
* const handler = createExternalNativeBalanceHandler('Solana');
|
|
764
|
+
* // SDK method: fetchSolanaWalletNativeBalance
|
|
765
|
+
*
|
|
766
|
+
* @since 6.5.0
|
|
767
|
+
*/
|
|
768
|
+
function createExternalNativeBalanceHandler(chain) {
|
|
769
|
+
const sdkMethod = `fetch${chain}WalletNativeBalance`;
|
|
770
|
+
return createConvenienceFetcher(sdkMethod, (args) => args.address);
|
|
771
|
+
}
|
|
772
|
+
/**
|
|
773
|
+
* Creates an all-balances handler for external chains.
|
|
774
|
+
*
|
|
775
|
+
* Used for fetching all supported token balances on external chains.
|
|
776
|
+
* Takes optional address, returns native + all supported token balances.
|
|
777
|
+
*
|
|
778
|
+
* @param chain - Target chain ('Ethereum' or 'Solana')
|
|
779
|
+
* @returns Handler that fetches all balances
|
|
780
|
+
*
|
|
781
|
+
* @example
|
|
782
|
+
* const handler = createExternalAllBalancesHandler('Ethereum');
|
|
783
|
+
* // SDK method: fetchEthereumWalletAllBalances
|
|
784
|
+
*
|
|
785
|
+
* @since 6.5.0
|
|
786
|
+
*/
|
|
787
|
+
function createExternalAllBalancesHandler(chain) {
|
|
788
|
+
const sdkMethod = `fetch${chain}WalletAllBalances`;
|
|
789
|
+
return createConvenienceFetcher(sdkMethod, (args) => args.address);
|
|
790
|
+
}
|
|
791
|
+
/**
|
|
792
|
+
* Creates a type-safe argument extractor function from field definitions.
|
|
793
|
+
*
|
|
794
|
+
* This factory eliminates repetitive argument extraction patterns like:
|
|
795
|
+
* ```typescript
|
|
796
|
+
* // Before (repeated many times)
|
|
797
|
+
* function extractFooArgs(args: Record<string, unknown>): FooArgs {
|
|
798
|
+
* return {
|
|
799
|
+
* page: args.page as number | undefined,
|
|
800
|
+
* limit: args.limit as number | undefined,
|
|
801
|
+
* };
|
|
802
|
+
* }
|
|
803
|
+
*
|
|
804
|
+
* // After
|
|
805
|
+
* const extractFooArgs = createArgumentExtractor<FooArgs>(['page', 'limit']);
|
|
806
|
+
* ```
|
|
807
|
+
*
|
|
808
|
+
* @param fields - Array of field names to extract (strings or FieldDefinition objects)
|
|
809
|
+
* @returns Function that extracts specified fields from MCP args with proper typing
|
|
810
|
+
*
|
|
811
|
+
* @example
|
|
812
|
+
* // Simple field names (all optional)
|
|
813
|
+
* const extractPaginationArgs = createArgumentExtractor<PaginationArgs>(['page', 'limit']);
|
|
814
|
+
*
|
|
815
|
+
* @example
|
|
816
|
+
* // Mixed required/optional
|
|
817
|
+
* const extractTransferArgs = createArgumentExtractor<TransferArgs>([
|
|
818
|
+
* { name: 'recipientAddress', required: true },
|
|
819
|
+
* { name: 'amount', required: true },
|
|
820
|
+
* 'uniqueKey', // optional
|
|
821
|
+
* 'privateKey', // optional
|
|
822
|
+
* ]);
|
|
823
|
+
*
|
|
824
|
+
* @since 6.11.0
|
|
825
|
+
*/
|
|
826
|
+
function createArgumentExtractor(fields) {
|
|
827
|
+
return (args) => {
|
|
828
|
+
const result = {};
|
|
829
|
+
for (const field of fields) {
|
|
830
|
+
const fieldName = typeof field === 'string' ? field : field.name;
|
|
831
|
+
result[fieldName] = args[fieldName];
|
|
832
|
+
}
|
|
833
|
+
return result;
|
|
834
|
+
};
|
|
835
|
+
}
|
|
836
|
+
/**
|
|
837
|
+
* Extracts standard page/limit pagination from MCP args.
|
|
838
|
+
*
|
|
839
|
+
* Use this helper to avoid repetitive casting in list handlers.
|
|
840
|
+
*
|
|
841
|
+
* @param args - MCP tool arguments
|
|
842
|
+
* @returns Typed pagination object with page and limit
|
|
843
|
+
*
|
|
844
|
+
* @example
|
|
845
|
+
* handler: createSimpleHandler('listItems', (args) => ({
|
|
846
|
+
* tokenName: args.tokenName as string,
|
|
847
|
+
* ...extractPaginationArgs(args),
|
|
848
|
+
* })),
|
|
849
|
+
*
|
|
850
|
+
* @since 6.7.0
|
|
851
|
+
*/
|
|
852
|
+
exports.extractPaginationArgs = createArgumentExtractor(['page', 'limit']);
|
|
853
|
+
// =============================================================================
|
|
854
|
+
// GalaChain Balance Handler Factories
|
|
855
|
+
// =============================================================================
|
|
856
|
+
/**
|
|
857
|
+
* Creates a handler for SDK methods that take an optional wallet address.
|
|
858
|
+
*
|
|
859
|
+
* Consolidates the common pattern where an SDK method accepts an optional
|
|
860
|
+
* address parameter that defaults to the SDK's configured wallet.
|
|
861
|
+
*
|
|
862
|
+
* @param sdkMethodName - Name of the SDK method to call
|
|
863
|
+
* @returns Handler that fetches data with optional address
|
|
864
|
+
*
|
|
865
|
+
* @example
|
|
866
|
+
* // For fetchGalaBalance, fetchProfile
|
|
867
|
+
* const handler = createOptionalAddressFetcher('fetchGalaBalance');
|
|
868
|
+
*
|
|
869
|
+
* @since 6.8.0
|
|
870
|
+
*/
|
|
871
|
+
function createOptionalAddressFetcher(sdkMethodName) {
|
|
872
|
+
return createConvenienceFetcher(sdkMethodName, (args) => args.address);
|
|
873
|
+
}
|
|
874
|
+
/**
|
|
875
|
+
* Creates a handler for SDK methods that take tokenName and address parameters.
|
|
876
|
+
*
|
|
877
|
+
* Consolidates the common pattern for balance queries that need both
|
|
878
|
+
* a token identifier and a wallet address.
|
|
879
|
+
*
|
|
880
|
+
* @param sdkMethodName - Name of the SDK method to call
|
|
881
|
+
* @returns Handler that fetches token-specific data for an address
|
|
882
|
+
*
|
|
883
|
+
* @example
|
|
884
|
+
* // For fetchTokenBalance
|
|
885
|
+
* const handler = createTokenAddressHandler('fetchTokenBalance');
|
|
886
|
+
*
|
|
887
|
+
* @since 6.8.0
|
|
888
|
+
*/
|
|
889
|
+
function createTokenAddressHandler(sdkMethodName) {
|
|
890
|
+
return createSimpleHandler(sdkMethodName, (args) => [
|
|
891
|
+
args.tokenName,
|
|
892
|
+
args.address,
|
|
893
|
+
]);
|
|
894
|
+
}
|
|
895
|
+
/**
|
|
896
|
+
* Extracts offset/limit pagination from MCP args.
|
|
897
|
+
*
|
|
898
|
+
* Used for bridgeable token queries that use offset-based pagination.
|
|
899
|
+
*
|
|
900
|
+
* @param args - MCP tool arguments
|
|
901
|
+
* @returns Typed pagination object with offset and limit
|
|
902
|
+
*
|
|
903
|
+
* @example
|
|
904
|
+
* handler: createSimpleHandler('fetchTokens', (args) => ({
|
|
905
|
+
* network: args.network as string,
|
|
906
|
+
* ...extractOffsetPaginationArgs(args),
|
|
907
|
+
* })),
|
|
908
|
+
*
|
|
909
|
+
* @since 6.7.0
|
|
910
|
+
*/
|
|
911
|
+
exports.extractOffsetPaginationArgs = createArgumentExtractor(['offset', 'limit']);
|
|
912
|
+
/**
|
|
913
|
+
* Extracts common search/filter parameters from MCP args.
|
|
914
|
+
*
|
|
915
|
+
* Used for list operations that support search, name, and userAddress filters.
|
|
916
|
+
*
|
|
917
|
+
* @param args - MCP tool arguments
|
|
918
|
+
* @returns Typed filter object
|
|
919
|
+
*
|
|
920
|
+
* @example
|
|
921
|
+
* handler: createSimpleHandler('listBans', (args) => ({
|
|
922
|
+
* tokenName: args.tokenName as string,
|
|
923
|
+
* ...extractPaginationArgs(args),
|
|
924
|
+
* ...extractSearchFilterArgs(args),
|
|
925
|
+
* })),
|
|
926
|
+
*
|
|
927
|
+
* @since 6.7.0
|
|
928
|
+
*/
|
|
929
|
+
exports.extractSearchFilterArgs = createArgumentExtractor(['search', 'name', 'userAddress']);
|
|
930
|
+
/**
|
|
931
|
+
* Extracts status filter with typed union constraint.
|
|
932
|
+
*
|
|
933
|
+
* @param args - MCP tool arguments
|
|
934
|
+
* @returns Status string or undefined
|
|
935
|
+
*
|
|
936
|
+
* @example
|
|
937
|
+
* handler: createSimpleHandler('listInvites', (args) => ({
|
|
938
|
+
* ...extractPaginationArgs(args),
|
|
939
|
+
* status: extractStatusArg<'PENDING' | 'CLAIMED' | 'REVOKED' | 'EXPIRED'>(args),
|
|
940
|
+
* })),
|
|
941
|
+
*
|
|
942
|
+
* @since 6.7.0
|
|
943
|
+
*/
|
|
944
|
+
function extractStatusArg(args) {
|
|
945
|
+
return args.status;
|
|
946
|
+
}
|
|
947
|
+
/**
|
|
948
|
+
* Creates a handler for paginated list operations with common patterns.
|
|
949
|
+
*
|
|
950
|
+
* This factory reduces boilerplate for handlers that:
|
|
951
|
+
* - Require tokenName (optional or required)
|
|
952
|
+
* - Use page/limit pagination
|
|
953
|
+
* - Optionally include status filter
|
|
954
|
+
*
|
|
955
|
+
* @param sdkMethodName - Name of the SDK method to call
|
|
956
|
+
* @param options - Configuration options
|
|
957
|
+
* @returns Handler that calls SDK method with extracted args
|
|
958
|
+
*
|
|
959
|
+
* @example
|
|
960
|
+
* const handler = createPaginatedListHandler('listModeratorInvites', {
|
|
961
|
+
* tokenNameRequired: false,
|
|
962
|
+
* includeStatus: true,
|
|
963
|
+
* });
|
|
964
|
+
*
|
|
965
|
+
* @since 6.7.0
|
|
966
|
+
*/
|
|
967
|
+
function createPaginatedListHandler(sdkMethodName, options = {}) {
|
|
968
|
+
const { tokenNameRequired = false, includeStatus = false } = options;
|
|
969
|
+
return createSimpleHandler(sdkMethodName, (args) => {
|
|
970
|
+
const result = {
|
|
971
|
+
...(0, exports.extractPaginationArgs)(args),
|
|
972
|
+
};
|
|
973
|
+
if (tokenNameRequired) {
|
|
974
|
+
result.tokenName = args.tokenName;
|
|
975
|
+
}
|
|
976
|
+
else {
|
|
977
|
+
result.tokenName = args.tokenName;
|
|
978
|
+
}
|
|
979
|
+
if (includeStatus) {
|
|
980
|
+
result.status = args.status;
|
|
981
|
+
}
|
|
982
|
+
return result;
|
|
983
|
+
});
|
|
984
|
+
}
|
|
985
|
+
/**
|
|
986
|
+
* Extracts common batch token operation args from MCP tool args.
|
|
987
|
+
*
|
|
988
|
+
* Used by lockTokens and unlockTokens which share identical argument patterns.
|
|
989
|
+
*
|
|
990
|
+
* @param args - MCP tool arguments
|
|
991
|
+
* @returns Typed batch operation arguments
|
|
992
|
+
*
|
|
993
|
+
* @since 6.8.0
|
|
994
|
+
*/
|
|
995
|
+
exports.extractBatchTokenOperationArgs = createArgumentExtractor(['tokens', 'uniqueKey', 'privateKey']);
|
|
996
|
+
/**
|
|
997
|
+
* Creates a handler for batch token operations (lock, unlock).
|
|
998
|
+
*
|
|
999
|
+
* Consolidates the common pattern for operations that batch multiple
|
|
1000
|
+
* token amounts with optional uniqueKey and privateKey.
|
|
1001
|
+
*
|
|
1002
|
+
* @param sdkMethodName - Name of the SDK method to call ('lockTokens' or 'unlockTokens')
|
|
1003
|
+
* @returns Handler that processes batch token operations
|
|
1004
|
+
*
|
|
1005
|
+
* @example
|
|
1006
|
+
* const lockHandler = createBatchTokenOperationHandler('lockTokens');
|
|
1007
|
+
* const unlockHandler = createBatchTokenOperationHandler('unlockTokens');
|
|
1008
|
+
*
|
|
1009
|
+
* @since 6.8.0
|
|
1010
|
+
*/
|
|
1011
|
+
function createBatchTokenOperationHandler(sdkMethodName) {
|
|
1012
|
+
return createSimpleHandler(sdkMethodName, exports.extractBatchTokenOperationArgs);
|
|
1013
|
+
}
|
|
1014
|
+
/**
|
|
1015
|
+
* Base extractor for common transfer fields (amount, uniqueKey, privateKey).
|
|
1016
|
+
*
|
|
1017
|
+
* @since 6.11.0
|
|
1018
|
+
*/
|
|
1019
|
+
const extractBaseTransferArgs = createArgumentExtractor(['amount', 'uniqueKey', 'privateKey']);
|
|
1020
|
+
/**
|
|
1021
|
+
* Extracts GALA transfer args from MCP tool args.
|
|
1022
|
+
*
|
|
1023
|
+
* Used by transferGala which uses recipientAddress.
|
|
1024
|
+
*
|
|
1025
|
+
* @param args - MCP tool arguments
|
|
1026
|
+
* @returns Typed transfer arguments
|
|
1027
|
+
*
|
|
1028
|
+
* @since 6.8.0
|
|
1029
|
+
*/
|
|
1030
|
+
function extractTransferArgs(args) {
|
|
1031
|
+
return {
|
|
1032
|
+
recipientAddress: args.recipientAddress,
|
|
1033
|
+
...extractBaseTransferArgs(args),
|
|
1034
|
+
};
|
|
1035
|
+
}
|
|
1036
|
+
/**
|
|
1037
|
+
* Extracts token transfer args from MCP tool args.
|
|
1038
|
+
*
|
|
1039
|
+
* Used by transferToken which uses 'to' and tokenName.
|
|
1040
|
+
*
|
|
1041
|
+
* @param args - MCP tool arguments
|
|
1042
|
+
* @returns Typed token transfer arguments
|
|
1043
|
+
*
|
|
1044
|
+
* @since 6.8.0
|
|
1045
|
+
*/
|
|
1046
|
+
function extractTokenTransferArgs(args) {
|
|
1047
|
+
return {
|
|
1048
|
+
to: args.to,
|
|
1049
|
+
tokenName: args.tokenName,
|
|
1050
|
+
...extractBaseTransferArgs(args),
|
|
1051
|
+
};
|
|
1052
|
+
}
|
|
1053
|
+
/**
|
|
1054
|
+
* Creates a handler for GALA transfer operations.
|
|
1055
|
+
*
|
|
1056
|
+
* Consolidates the GALA transfer pattern which uses recipientAddress.
|
|
1057
|
+
*
|
|
1058
|
+
* @returns Handler that processes GALA transfers
|
|
1059
|
+
*
|
|
1060
|
+
* @example
|
|
1061
|
+
* const handler = createGalaTransferHandler();
|
|
1062
|
+
*
|
|
1063
|
+
* @since 6.8.0
|
|
1064
|
+
*/
|
|
1065
|
+
function createGalaTransferHandler() {
|
|
1066
|
+
return createSimpleHandler('transferGala', extractTransferArgs);
|
|
1067
|
+
}
|
|
1068
|
+
/**
|
|
1069
|
+
* Creates a handler for token transfer operations.
|
|
1070
|
+
*
|
|
1071
|
+
* Consolidates the token transfer pattern which uses 'to' and tokenName.
|
|
1072
|
+
*
|
|
1073
|
+
* @returns Handler that processes token transfers
|
|
1074
|
+
*
|
|
1075
|
+
* @example
|
|
1076
|
+
* const handler = createTokenTransferHandler();
|
|
1077
|
+
*
|
|
1078
|
+
* @since 6.8.0
|
|
1079
|
+
*/
|
|
1080
|
+
function createTokenTransferHandler() {
|
|
1081
|
+
return createSimpleHandler('transferToken', extractTokenTransferArgs);
|
|
1082
|
+
}
|
|
1083
|
+
// =============================================================================
|
|
1084
|
+
// Token Name Fetcher Factory (DRY consolidation for status check tools)
|
|
1085
|
+
// =============================================================================
|
|
1086
|
+
/**
|
|
1087
|
+
* Creates a fetcher handler for SDK methods that take tokenName as the sole argument.
|
|
1088
|
+
*
|
|
1089
|
+
* This is a specialized version of createConvenienceFetcher that eliminates the
|
|
1090
|
+
* repetitive pattern: `(args) => args.tokenName as string`
|
|
1091
|
+
*
|
|
1092
|
+
* Common in streaming/chat status tools:
|
|
1093
|
+
* - getChatStatus
|
|
1094
|
+
* - getStreamInfo
|
|
1095
|
+
* - getSimulcastTargets
|
|
1096
|
+
* - resetStreamKey
|
|
1097
|
+
*
|
|
1098
|
+
* @param sdkMethod - Name of the SDK method that accepts tokenName
|
|
1099
|
+
* @returns Handler that calls SDK method with tokenName extracted from args
|
|
1100
|
+
*
|
|
1101
|
+
* @example
|
|
1102
|
+
* // Before (repetitive)
|
|
1103
|
+
* handler: createConvenienceFetcher('getChatStatus', (args) => args.tokenName as string),
|
|
1104
|
+
* handler: createConvenienceFetcher('getStreamInfo', (args) => args.tokenName as string),
|
|
1105
|
+
*
|
|
1106
|
+
* // After (DRY)
|
|
1107
|
+
* handler: createTokenNameFetcher('getChatStatus'),
|
|
1108
|
+
* handler: createTokenNameFetcher('getStreamInfo'),
|
|
1109
|
+
*
|
|
1110
|
+
* @since 6.8.0
|
|
1111
|
+
*/
|
|
1112
|
+
function createTokenNameFetcher(sdkMethod) {
|
|
1113
|
+
return createConvenienceFetcher(sdkMethod, (args) => args.tokenName);
|
|
1114
|
+
}
|
|
1115
|
+
/**
|
|
1116
|
+
* Creates a simple handler for SDK methods that take tokenName as the sole argument.
|
|
1117
|
+
*
|
|
1118
|
+
* Similar to createTokenNameFetcher but uses createSimpleHandler internally.
|
|
1119
|
+
* Use this for write operations that take only tokenName.
|
|
1120
|
+
*
|
|
1121
|
+
* @param sdkMethod - Name of the SDK method that accepts tokenName
|
|
1122
|
+
* @returns Handler that calls SDK method with tokenName extracted from args
|
|
1123
|
+
*
|
|
1124
|
+
* @example
|
|
1125
|
+
* // Before (repetitive)
|
|
1126
|
+
* handler: createSimpleHandler('startStream', (args) => args.tokenName as string),
|
|
1127
|
+
*
|
|
1128
|
+
* // After (DRY)
|
|
1129
|
+
* handler: createTokenNameHandler('startStream'),
|
|
1130
|
+
*
|
|
1131
|
+
* @since 6.8.0
|
|
1132
|
+
*/
|
|
1133
|
+
function createTokenNameHandler(sdkMethod) {
|
|
1134
|
+
return createSimpleHandler(sdkMethod, (args) => args.tokenName);
|
|
1135
|
+
}
|
|
1136
|
+
/**
|
|
1137
|
+
* Creates a boolean handler for SDK methods that take tokenName and return success.
|
|
1138
|
+
*
|
|
1139
|
+
* Combines tokenName extraction with boolean success response.
|
|
1140
|
+
* Use for operations like stopStream that return { success: true }.
|
|
1141
|
+
*
|
|
1142
|
+
* @param sdkMethod - Name of the SDK method that accepts tokenName
|
|
1143
|
+
* @param successMessage - Success message to return
|
|
1144
|
+
* @returns Handler that calls SDK method and returns boolean success
|
|
1145
|
+
*
|
|
1146
|
+
* @example
|
|
1147
|
+
* // Before
|
|
1148
|
+
* handler: createBooleanHandler('stopStream', (args) => args.tokenName as string, 'Stream stopped'),
|
|
1149
|
+
*
|
|
1150
|
+
* // After
|
|
1151
|
+
* handler: createTokenNameBooleanHandler('stopStream', 'Stream stopped'),
|
|
1152
|
+
*
|
|
1153
|
+
* @since 6.8.0
|
|
1154
|
+
*/
|
|
1155
|
+
function createTokenNameBooleanHandler(sdkMethod, successMessage) {
|
|
1156
|
+
return createBooleanHandler(sdkMethod, (args) => args.tokenName, successMessage);
|
|
1157
|
+
}
|
|
1158
|
+
// =============================================================================
|
|
1159
|
+
// Custom Message Handler Factory (DRY for interpolated message responses)
|
|
1160
|
+
// =============================================================================
|
|
1161
|
+
/**
|
|
1162
|
+
* Creates a handler that calls an SDK method and builds a response with custom message.
|
|
1163
|
+
*
|
|
1164
|
+
* Use this for handlers that need to format a response with an interpolated message
|
|
1165
|
+
* based on the SDK result. This is a common pattern in pool info, quote, and
|
|
1166
|
+
* position query tools.
|
|
1167
|
+
*
|
|
1168
|
+
* @param sdkMethodName - Name of the SDK method to call
|
|
1169
|
+
* @param argExtractor - Function to extract arguments from MCP args
|
|
1170
|
+
* @param responseBuilder - Function to build the response object from SDK result
|
|
1171
|
+
* @returns Handler that calls SDK method and returns custom formatted response
|
|
1172
|
+
*
|
|
1173
|
+
* @example
|
|
1174
|
+
* const handler = createCustomMessageHandler(
|
|
1175
|
+
* 'getSwapPoolInfo',
|
|
1176
|
+
* (args) => [args.tokenA as string, args.tokenB as string],
|
|
1177
|
+
* (result, args) => ({
|
|
1178
|
+
* ...result,
|
|
1179
|
+
* message: `Pool ${args.tokenA}/${args.tokenB} has ${result.liquidity} liquidity`,
|
|
1180
|
+
* })
|
|
1181
|
+
* );
|
|
1182
|
+
*
|
|
1183
|
+
* @since 6.9.0
|
|
1184
|
+
*/
|
|
1185
|
+
function createCustomMessageHandler(sdkMethodName, argExtractor, responseBuilder) {
|
|
1186
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
1187
|
+
const extractedArgs = argExtractor(args);
|
|
1188
|
+
const { result } = await invokeSdkMethod({
|
|
1189
|
+
sdk,
|
|
1190
|
+
methodName: sdkMethodName,
|
|
1191
|
+
extractedArgs,
|
|
1192
|
+
});
|
|
1193
|
+
return (0, response_formatter_js_1.formatSuccess)(responseBuilder(result, args));
|
|
1194
|
+
});
|
|
1195
|
+
}
|
|
1196
|
+
// =============================================================================
|
|
1197
|
+
// Wallet-Required Handler Factory (DRY for operations requiring wallet)
|
|
1198
|
+
// =============================================================================
|
|
1199
|
+
/**
|
|
1200
|
+
* Creates a handler that validates wallet configuration before calling SDK method.
|
|
1201
|
+
*
|
|
1202
|
+
* Use this for write operations that require a configured wallet (swaps, liquidity
|
|
1203
|
+
* add/remove, transfers, etc.). Fails fast with helpful error if wallet not configured.
|
|
1204
|
+
*
|
|
1205
|
+
* @param sdkMethodName - Name of the SDK method to call
|
|
1206
|
+
* @param argExtractor - Function to extract arguments from MCP args
|
|
1207
|
+
* @param responseBuilder - Optional function to build custom response (defaults to result)
|
|
1208
|
+
* @param walletValidator - Optional custom wallet validation function
|
|
1209
|
+
* @returns Handler that validates wallet then calls SDK method
|
|
1210
|
+
*
|
|
1211
|
+
* @example
|
|
1212
|
+
* const handler = createWalletRequiredHandler(
|
|
1213
|
+
* 'executeSwap',
|
|
1214
|
+
* (args) => [args.fromToken, args.toToken, args.amount, args.estimatedOutput, args.feeTier, args.slippageTolerance || 0.01],
|
|
1215
|
+
* (result) => ({ ...result, message: `Swap completed!` })
|
|
1216
|
+
* );
|
|
1217
|
+
*
|
|
1218
|
+
* @since 6.9.0
|
|
1219
|
+
*/
|
|
1220
|
+
function createWalletRequiredHandler(sdkMethodName, argExtractor, responseBuilder, walletValidator) {
|
|
1221
|
+
const validateWallet = walletValidator ?? ((sdk) => {
|
|
1222
|
+
try {
|
|
1223
|
+
sdk.getAddress();
|
|
1224
|
+
}
|
|
1225
|
+
catch {
|
|
1226
|
+
throw new Error('Wallet not configured - required for this operation');
|
|
1227
|
+
}
|
|
1228
|
+
});
|
|
1229
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
1230
|
+
validateWallet(sdk);
|
|
1231
|
+
const extractedArgs = argExtractor(args);
|
|
1232
|
+
const { result } = await invokeSdkMethod({
|
|
1233
|
+
sdk,
|
|
1234
|
+
methodName: sdkMethodName,
|
|
1235
|
+
extractedArgs,
|
|
1236
|
+
});
|
|
1237
|
+
const response = responseBuilder ? responseBuilder(result, args) : result;
|
|
1238
|
+
return (0, response_formatter_js_1.formatSuccess)(response);
|
|
1239
|
+
});
|
|
1240
|
+
}
|
|
1241
|
+
// =============================================================================
|
|
1242
|
+
// Not-Found Conditional Handler Factory (DRY for position/resource lookups)
|
|
1243
|
+
// =============================================================================
|
|
1244
|
+
/**
|
|
1245
|
+
* Creates a handler that returns found: false response if SDK result is null/undefined.
|
|
1246
|
+
*
|
|
1247
|
+
* Use this for position lookups and resource queries that may return null when
|
|
1248
|
+
* the resource doesn't exist. Provides consistent not-found responses.
|
|
1249
|
+
*
|
|
1250
|
+
* @param sdkMethodName - Name of the SDK method to call
|
|
1251
|
+
* @param argExtractor - Function to extract arguments from MCP args
|
|
1252
|
+
* @param notFoundBuilder - Function to build not-found response (receives args)
|
|
1253
|
+
* @param foundBuilder - Function to build found response (receives result and args)
|
|
1254
|
+
* @returns Handler with conditional found/not-found response
|
|
1255
|
+
*
|
|
1256
|
+
* @example
|
|
1257
|
+
* const handler = createNotFoundHandler(
|
|
1258
|
+
* 'getSwapLiquidityPositionById',
|
|
1259
|
+
* (args) => [args.ownerAddress, args.positionId],
|
|
1260
|
+
* (args) => ({ found: false, message: `Position ${args.positionId} not found` }),
|
|
1261
|
+
* (result, args) => ({ found: true, ...result, message: `Found position ${args.positionId}` })
|
|
1262
|
+
* );
|
|
1263
|
+
*
|
|
1264
|
+
* @since 6.9.0
|
|
1265
|
+
*/
|
|
1266
|
+
function createNotFoundHandler(sdkMethodName, argExtractor, notFoundBuilder, foundBuilder) {
|
|
1267
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
1268
|
+
const extractedArgs = argExtractor(args);
|
|
1269
|
+
const { result } = await invokeSdkMethod({
|
|
1270
|
+
sdk,
|
|
1271
|
+
methodName: sdkMethodName,
|
|
1272
|
+
extractedArgs,
|
|
1273
|
+
});
|
|
1274
|
+
if (!result) {
|
|
1275
|
+
return (0, response_formatter_js_1.formatSuccess)(notFoundBuilder(args));
|
|
1276
|
+
}
|
|
1277
|
+
return (0, response_formatter_js_1.formatSuccess)(foundBuilder(result, args));
|
|
1278
|
+
});
|
|
1279
|
+
}
|
|
1280
|
+
// =============================================================================
|
|
1281
|
+
// Async No-Arg Handler Factory (DRY for session/status tools with custom messages)
|
|
1282
|
+
// =============================================================================
|
|
1283
|
+
/**
|
|
1284
|
+
* Creates a handler for no-argument SDK methods with custom response formatting.
|
|
1285
|
+
*
|
|
1286
|
+
* Unlike createNoArgActionHandler which returns a static response, this factory
|
|
1287
|
+
* allows building the response from the SDK result. Useful for session info,
|
|
1288
|
+
* status queries, and other async methods that return data.
|
|
1289
|
+
*
|
|
1290
|
+
* @param sdkMethodName - Name of the SDK method to call (takes no arguments)
|
|
1291
|
+
* @param responseBuilder - Function to build response from SDK result
|
|
1292
|
+
* @returns Handler that calls SDK method and formats response
|
|
1293
|
+
*
|
|
1294
|
+
* @example
|
|
1295
|
+
* const handler = createNoArgResultHandler(
|
|
1296
|
+
* 'getSession',
|
|
1297
|
+
* (session) => ({
|
|
1298
|
+
* address: session.address,
|
|
1299
|
+
* expiresAt: session.expiresAt,
|
|
1300
|
+
* message: `Session for ${session.address}, expires ${new Date(session.expiresAt).toISOString()}`,
|
|
1301
|
+
* })
|
|
1302
|
+
* );
|
|
1303
|
+
*
|
|
1304
|
+
* @since 6.9.0
|
|
1305
|
+
*/
|
|
1306
|
+
function createNoArgResultHandler(sdkMethodName, responseBuilder) {
|
|
1307
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk) => {
|
|
1308
|
+
const { result } = await invokeSdkMethod({
|
|
1309
|
+
sdk,
|
|
1310
|
+
methodName: sdkMethodName,
|
|
1311
|
+
});
|
|
1312
|
+
return (0, response_formatter_js_1.formatSuccess)(responseBuilder(result));
|
|
1313
|
+
});
|
|
1314
|
+
}
|
|
1315
|
+
// =============================================================================
|
|
1316
|
+
// Sync Boolean Check Handler Factory (DRY for isAuthenticated, shouldRefresh, etc.)
|
|
1317
|
+
// =============================================================================
|
|
1318
|
+
/**
|
|
1319
|
+
* Creates a handler for synchronous SDK methods that return boolean with conditional messages.
|
|
1320
|
+
*
|
|
1321
|
+
* Use for sync methods like isAuthenticated(), shouldRefreshToken() that need
|
|
1322
|
+
* different messages based on the boolean result.
|
|
1323
|
+
*
|
|
1324
|
+
* @param syncMethodName - Name of the sync SDK method to call
|
|
1325
|
+
* @param argExtractor - Optional function to extract arguments from MCP args
|
|
1326
|
+
* @param messages - Object with true and false message strings
|
|
1327
|
+
* @returns Handler that calls sync method and returns formatted boolean response
|
|
1328
|
+
*
|
|
1329
|
+
* @example
|
|
1330
|
+
* const handler = createSyncBooleanHandler(
|
|
1331
|
+
* 'isAuthenticated',
|
|
1332
|
+
* undefined,
|
|
1333
|
+
* { true: 'Session is valid', false: 'Not authenticated or token expired' }
|
|
1334
|
+
* );
|
|
1335
|
+
*
|
|
1336
|
+
* @since 6.9.0
|
|
1337
|
+
*/
|
|
1338
|
+
function createSyncBooleanHandler(syncMethodName, argExtractor, messages) {
|
|
1339
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
1340
|
+
const method = sdk[syncMethodName];
|
|
1341
|
+
if (!method || typeof method !== 'function') {
|
|
1342
|
+
throw new Error(`SDK method "${syncMethodName}" not found`);
|
|
1343
|
+
}
|
|
1344
|
+
const extractedArg = argExtractor ? argExtractor(args) : undefined;
|
|
1345
|
+
const result = extractedArg !== undefined ? method.call(sdk, extractedArg) : method.call(sdk);
|
|
1346
|
+
return (0, response_formatter_js_1.formatBoolean)(result, result ? messages.true : messages.false);
|
|
1347
|
+
});
|
|
1348
|
+
}
|
|
1349
|
+
/**
|
|
1350
|
+
* Extracts flexible token identifier from MCP args.
|
|
1351
|
+
*
|
|
1352
|
+
* Handles the common pattern where tools accept either tokenName (convenience)
|
|
1353
|
+
* or tokenId (full identifier), but not both. Returns an object with the
|
|
1354
|
+
* appropriate property set based on which was provided.
|
|
1355
|
+
*
|
|
1356
|
+
* Pattern replaced:
|
|
1357
|
+
* ```typescript
|
|
1358
|
+
* // Before (repeated 6+ times)
|
|
1359
|
+
* if (args.tokenName) {
|
|
1360
|
+
* options.tokenName = args.tokenName;
|
|
1361
|
+
* } else {
|
|
1362
|
+
* options.tokenId = args.tokenId;
|
|
1363
|
+
* }
|
|
1364
|
+
*
|
|
1365
|
+
* // After
|
|
1366
|
+
* const tokenId = extractFlexibleTokenId(args);
|
|
1367
|
+
* const options = { ...tokenId, ...otherOptions };
|
|
1368
|
+
* ```
|
|
1369
|
+
*
|
|
1370
|
+
* @param args - MCP tool arguments containing tokenName and/or tokenId
|
|
1371
|
+
* @returns Object with either tokenName or tokenId property set
|
|
1372
|
+
*
|
|
1373
|
+
* @example
|
|
1374
|
+
* // In fetchPriceHistory handler:
|
|
1375
|
+
* handler: createSimpleHandler('fetchPriceHistory', (args) => ({
|
|
1376
|
+
* ...extractFlexibleTokenId(args),
|
|
1377
|
+
* sortOrder: args.sortOrder,
|
|
1378
|
+
* page: args.page,
|
|
1379
|
+
* limit: args.limit,
|
|
1380
|
+
* })),
|
|
1381
|
+
*
|
|
1382
|
+
* @since 6.10.0
|
|
1383
|
+
*/
|
|
1384
|
+
function extractFlexibleTokenId(args) {
|
|
1385
|
+
if (args.tokenName) {
|
|
1386
|
+
return { tokenName: args.tokenName };
|
|
1387
|
+
}
|
|
1388
|
+
return { tokenId: args.tokenId };
|
|
1389
|
+
}
|
|
1390
|
+
// =============================================================================
|
|
1391
|
+
// Conditional Response Handler Factory (DRY for null-check token responses)
|
|
1392
|
+
// =============================================================================
|
|
1393
|
+
/**
|
|
1394
|
+
* Creates a handler for SDK methods that may return null with different success responses.
|
|
1395
|
+
*
|
|
1396
|
+
* Use for methods like getAccessToken() that return null when not authenticated,
|
|
1397
|
+
* requiring different response structures for null vs non-null results.
|
|
1398
|
+
*
|
|
1399
|
+
* @param sdkMethodName - Name of the SDK method to call (sync or async)
|
|
1400
|
+
* @param nullResponse - Response to return when result is null/undefined
|
|
1401
|
+
* @param valueBuilder - Function to build response when result has value
|
|
1402
|
+
* @param isSync - Whether the SDK method is synchronous (default: false)
|
|
1403
|
+
* @returns Handler with conditional null/value responses
|
|
1404
|
+
*
|
|
1405
|
+
* @example
|
|
1406
|
+
* const handler = createConditionalResponseHandler(
|
|
1407
|
+
* 'getAccessToken',
|
|
1408
|
+
* { accessToken: null, message: 'Not authenticated - no token available' },
|
|
1409
|
+
* (token) => ({ accessToken: token, message: 'Access token retrieved' }),
|
|
1410
|
+
* true // sync method
|
|
1411
|
+
* );
|
|
1412
|
+
*
|
|
1413
|
+
* @since 6.9.0
|
|
1414
|
+
*/
|
|
1415
|
+
function createConditionalResponseHandler(sdkMethodName, nullResponse, valueBuilder, isSync = false) {
|
|
1416
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk) => {
|
|
1417
|
+
let result;
|
|
1418
|
+
if (isSync) {
|
|
1419
|
+
const method = sdk[sdkMethodName];
|
|
1420
|
+
if (!method || typeof method !== 'function') {
|
|
1421
|
+
throw new Error(`SDK method "${sdkMethodName}" not found`);
|
|
1422
|
+
}
|
|
1423
|
+
result = method.call(sdk);
|
|
1424
|
+
}
|
|
1425
|
+
else {
|
|
1426
|
+
// Async method via invokeSdkMethod
|
|
1427
|
+
const invocation = await invokeSdkMethod({
|
|
1428
|
+
sdk,
|
|
1429
|
+
methodName: sdkMethodName,
|
|
1430
|
+
});
|
|
1431
|
+
result = invocation.result;
|
|
1432
|
+
}
|
|
1433
|
+
if (result === null || result === undefined) {
|
|
1434
|
+
return (0, response_formatter_js_1.formatSuccess)(nullResponse);
|
|
1435
|
+
}
|
|
1436
|
+
return (0, response_formatter_js_1.formatSuccess)(valueBuilder(result));
|
|
1437
|
+
});
|
|
1438
|
+
}
|
|
1439
|
+
// =============================================================================
|
|
1440
|
+
// Authentication Description Constants (DRY consolidation for tool descriptions)
|
|
1441
|
+
// =============================================================================
|
|
1442
|
+
/**
|
|
1443
|
+
* Standard authentication requirement descriptions for MCP tool definitions.
|
|
1444
|
+
*
|
|
1445
|
+
* Provides consistent, reusable auth requirement strings to eliminate
|
|
1446
|
+
* repetitive boilerplate in tool descriptions.
|
|
1447
|
+
*
|
|
1448
|
+
* @example
|
|
1449
|
+
* description: `Get chat status for a stream.
|
|
1450
|
+
*
|
|
1451
|
+
* ${AUTH_DESCRIPTIONS.PUBLIC}`,
|
|
1452
|
+
*
|
|
1453
|
+
* @example
|
|
1454
|
+
* description: `Start a stream.
|
|
1455
|
+
*
|
|
1456
|
+
* ${AUTH_DESCRIPTIONS.JWT_SESSION}`,
|
|
1457
|
+
*
|
|
1458
|
+
* @since 6.8.0
|
|
1459
|
+
*/
|
|
1460
|
+
exports.AUTH_DESCRIPTIONS = {
|
|
1461
|
+
/** No authentication required */
|
|
1462
|
+
PUBLIC: 'Authentication: None required (public endpoint)',
|
|
1463
|
+
/** Requires JWT session (login first) */
|
|
1464
|
+
JWT_SESSION: 'Authentication: Requires JWT session (call gala_launchpad_login first)',
|
|
1465
|
+
/** Requires wallet signature */
|
|
1466
|
+
WALLET_SIGNATURE: 'Authentication: Requires wallet signature',
|
|
1467
|
+
/** Requires stream admin API key */
|
|
1468
|
+
ADMIN_API_KEY: 'Authentication: Requires streamAdminApiKey configuration',
|
|
1469
|
+
/** Requires admin API key OR JWT as token owner */
|
|
1470
|
+
ADMIN_OR_OWNER: 'Authentication: Requires streamAdminApiKey (admin) OR JWT auth (token owner)',
|
|
1471
|
+
/** Requires admin API key OR JWT as moderator */
|
|
1472
|
+
ADMIN_OR_MODERATOR: 'Authentication: Requires streamAdminApiKey (admin) OR JWT auth (token owner/moderator)',
|
|
1473
|
+
/** Requires admin API key OR JWT as overseer */
|
|
1474
|
+
ADMIN_OR_OVERSEER: 'Authentication: Requires streamAdminApiKey (admin) OR JWT auth as Overseer',
|
|
1475
|
+
/** Requires admin API key OR JWT as existing overseer */
|
|
1476
|
+
ADMIN_OR_EXISTING_OVERSEER: 'Authentication: Requires streamAdminApiKey (admin) OR JWT auth as existing Overseer',
|
|
1477
|
+
/** Stream creator only (wallet signature) */
|
|
1478
|
+
STREAM_CREATOR: 'Authentication: Requires wallet signature (stream creator only)',
|
|
1479
|
+
/** Optional JWT - returns null/limited if not authenticated */
|
|
1480
|
+
OPTIONAL_JWT: 'Authentication: Optional JWT - returns limited data if not authenticated',
|
|
1481
|
+
/** Requires JWT or API key with specific permission */
|
|
1482
|
+
JWT_OR_API_KEY: (permission) => `Authentication: Requires JWT session OR API key with ${permission} permission`,
|
|
1483
|
+
};
|
|
1484
|
+
// =============================================================================
|
|
1485
|
+
// Optional Result Handler Factory (DRY for position/resource lookups that may not exist)
|
|
1486
|
+
// =============================================================================
|
|
1487
|
+
/**
|
|
1488
|
+
* Creates a handler for SDK methods that return optional results (null/undefined if not found).
|
|
1489
|
+
*
|
|
1490
|
+
* Use this for resource lookup operations where not finding the resource is a valid
|
|
1491
|
+
* outcome (not an error). Returns a consistent { found: false } response when
|
|
1492
|
+
* the resource doesn't exist, and { found: true, data: result } when it does.
|
|
1493
|
+
*
|
|
1494
|
+
* @param sdkMethod - Function that calls the SDK method with sdk and args
|
|
1495
|
+
* @param notFoundMessage - Message to return when resource is not found (default: 'Resource not found')
|
|
1496
|
+
* @returns Handler with consistent found/not-found response structure
|
|
1497
|
+
*
|
|
1498
|
+
* @example
|
|
1499
|
+
* const handler = createOptionResultHandler(
|
|
1500
|
+
* (sdk, args) => sdk.getSwapLiquidityPositionById(args.ownerAddress, args.positionId),
|
|
1501
|
+
* 'Position not found'
|
|
1502
|
+
* );
|
|
1503
|
+
*
|
|
1504
|
+
* @since 6.12.0
|
|
1505
|
+
*/
|
|
1506
|
+
function createOptionResultHandler(sdkMethod, notFoundMessage = 'Resource not found') {
|
|
1507
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
1508
|
+
const result = await sdkMethod(sdk, args);
|
|
1509
|
+
if (result === null || result === undefined) {
|
|
1510
|
+
return (0, response_formatter_js_1.formatSuccess)({ found: false, message: notFoundMessage });
|
|
1511
|
+
}
|
|
1512
|
+
return (0, response_formatter_js_1.formatSuccess)({ found: true, data: result });
|
|
1513
|
+
});
|
|
1514
|
+
}
|
|
1515
|
+
// =============================================================================
|
|
1516
|
+
// Wallet Required Handler Factory (Simplified version for common patterns)
|
|
1517
|
+
// =============================================================================
|
|
1518
|
+
/**
|
|
1519
|
+
* Creates a handler for SDK methods requiring wallet validation with optional result transformation.
|
|
1520
|
+
*
|
|
1521
|
+
* This is a simplified version of createWalletRequiredHandler that takes the SDK method
|
|
1522
|
+
* directly (as a function) rather than a method name string. Useful for cases where
|
|
1523
|
+
* you need direct SDK method calls with type safety.
|
|
1524
|
+
*
|
|
1525
|
+
* @param sdkMethod - Function that calls the SDK method with sdk and args
|
|
1526
|
+
* @param transformer - Optional function to transform the result before returning
|
|
1527
|
+
* @returns Handler that validates wallet then calls SDK method
|
|
1528
|
+
*
|
|
1529
|
+
* @example
|
|
1530
|
+
* const handler = createWalletRequiredMethodHandler(
|
|
1531
|
+
* (sdk, args) => sdk.addSwapLiquidityByPrice({
|
|
1532
|
+
* token0: args.token0, token1: args.token1, fee: args.fee,
|
|
1533
|
+
* minPrice: args.minPrice, maxPrice: args.maxPrice,
|
|
1534
|
+
* amount0Desired: args.amount0Desired, amount1Desired: args.amount1Desired,
|
|
1535
|
+
* }),
|
|
1536
|
+
* (result) => ({ ...result, message: 'Liquidity added!' })
|
|
1537
|
+
* );
|
|
1538
|
+
*
|
|
1539
|
+
* @since 6.12.0
|
|
1540
|
+
*/
|
|
1541
|
+
function createWalletRequiredMethodHandler(sdkMethod, transformer) {
|
|
1542
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
1543
|
+
// Validate wallet is configured
|
|
1544
|
+
try {
|
|
1545
|
+
sdk.getAddress();
|
|
1546
|
+
}
|
|
1547
|
+
catch {
|
|
1548
|
+
throw new Error('Wallet configuration required for this operation');
|
|
1549
|
+
}
|
|
1550
|
+
const result = await sdkMethod(sdk, args);
|
|
1551
|
+
return (0, response_formatter_js_1.formatSuccess)(transformer ? transformer(result) : result);
|
|
1552
|
+
});
|
|
1553
|
+
}
|
|
1554
|
+
// =============================================================================
|
|
1555
|
+
// Optional Params Handler Factory (DRY for SDK methods with optional parameter objects)
|
|
1556
|
+
// =============================================================================
|
|
1557
|
+
/**
|
|
1558
|
+
* Creates a handler for SDK methods that accept optional parameter objects.
|
|
1559
|
+
*
|
|
1560
|
+
* This factory handles the common pattern where an SDK method takes an optional
|
|
1561
|
+
* params object, and you want to build those params from the MCP args.
|
|
1562
|
+
*
|
|
1563
|
+
* @param sdkMethod - Function that calls the SDK method with sdk and optional params
|
|
1564
|
+
* @param paramBuilder - Optional function to build params from args (if omitted, passes args directly)
|
|
1565
|
+
* @param resultTransformer - Optional function to transform the result before returning
|
|
1566
|
+
* @returns Handler that builds params and calls SDK method
|
|
1567
|
+
*
|
|
1568
|
+
* @example
|
|
1569
|
+
* const handler = createOptionalParamsHandler(
|
|
1570
|
+
* (sdk, params) => sdk.getAllSwapUserLiquidityPositions(params?.ownerAddress, params?.options),
|
|
1571
|
+
* (args) => ({
|
|
1572
|
+
* ownerAddress: args.ownerAddress,
|
|
1573
|
+
* options: args.withPrices ? { withPrices: true } : undefined,
|
|
1574
|
+
* }),
|
|
1575
|
+
* (result, args) => formatPositionListResponse(parsePositionListResult(result), { ownerAddress: args.ownerAddress })
|
|
1576
|
+
* );
|
|
1577
|
+
*
|
|
1578
|
+
* @since 6.12.0
|
|
1579
|
+
*/
|
|
1580
|
+
function createOptionalParamsHandler(sdkMethod, paramBuilder, resultTransformer) {
|
|
1581
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
1582
|
+
const params = paramBuilder ? paramBuilder(args) : args;
|
|
1583
|
+
const result = await sdkMethod(sdk, params);
|
|
1584
|
+
const transformed = resultTransformer ? resultTransformer(result, args) : result;
|
|
1585
|
+
return (0, response_formatter_js_1.formatSuccess)(transformed);
|
|
1586
|
+
});
|
|
1587
|
+
}
|
|
1588
|
+
/**
|
|
1589
|
+
* Creates a handler for liquidity position operations that require pre-fetching position details.
|
|
1590
|
+
*
|
|
1591
|
+
* This factory consolidates the common pattern found in removeLiquidity and collectPositionFees:
|
|
1592
|
+
* 1. Validate wallet configured
|
|
1593
|
+
* 2. Extract ownerAddress and positionId from args
|
|
1594
|
+
* 3. Fetch position details via getSwapLiquidityPositionById
|
|
1595
|
+
* 4. Validate position exists
|
|
1596
|
+
* 5. Call the SDK operation with position data
|
|
1597
|
+
* 6. Return enriched response with position token info
|
|
1598
|
+
*
|
|
1599
|
+
* Pattern replaced:
|
|
1600
|
+
* ```typescript
|
|
1601
|
+
* // Before (40+ lines duplicated in 2 handlers)
|
|
1602
|
+
* handler: withErrorHandling(async (sdk, args) => {
|
|
1603
|
+
* validateWalletConfigured(sdk);
|
|
1604
|
+
* const ownerAddress = args.ownerAddress as string;
|
|
1605
|
+
* const positionId = args.positionId as string;
|
|
1606
|
+
* const position = await sdk.getSwapLiquidityPositionById(ownerAddress, positionId);
|
|
1607
|
+
* if (!position) throw new Error(`Position ${positionId} not found...`);
|
|
1608
|
+
* const result = await sdk.someOperation({...});
|
|
1609
|
+
* return formatSuccess({ transactionId: result.transactionId, token0: position.token0, ... });
|
|
1610
|
+
* })
|
|
1611
|
+
*
|
|
1612
|
+
* // After
|
|
1613
|
+
* handler: createPositionEnrichmentHandler({
|
|
1614
|
+
* operation: (sdk, position, args) => sdk.removeSwapLiquidity({
|
|
1615
|
+
* token0: position.token0, token1: position.token1, ...args,
|
|
1616
|
+
* }),
|
|
1617
|
+
* responseBuilder: (result, position, args) => ({
|
|
1618
|
+
* transactionId: result.transactionId,
|
|
1619
|
+
* token0: position.token0,
|
|
1620
|
+
* message: `Liquidity removed! Received ${result.amount0} ${position.token0}...`,
|
|
1621
|
+
* })
|
|
1622
|
+
* })
|
|
1623
|
+
* ```
|
|
1624
|
+
*
|
|
1625
|
+
* @param config - Configuration specifying the SDK operation and response builder
|
|
1626
|
+
* @returns Handler that pre-fetches position, calls operation, and returns enriched response
|
|
1627
|
+
*
|
|
1628
|
+
* @example
|
|
1629
|
+
* // Remove liquidity handler
|
|
1630
|
+
* const handler = createPositionEnrichmentHandler({
|
|
1631
|
+
* operation: (sdk, position, args) => sdk.removeSwapLiquidity({
|
|
1632
|
+
* token0: position.token0,
|
|
1633
|
+
* token1: position.token1,
|
|
1634
|
+
* fee: position.feeTier,
|
|
1635
|
+
* tickLower: position.tickLower,
|
|
1636
|
+
* tickUpper: position.tickUpper,
|
|
1637
|
+
* liquidity: args.liquidity,
|
|
1638
|
+
* amount0Min: args.amount0Min,
|
|
1639
|
+
* amount1Min: args.amount1Min,
|
|
1640
|
+
* positionId: args.positionId,
|
|
1641
|
+
* }),
|
|
1642
|
+
* responseBuilder: (result, position, args) => ({
|
|
1643
|
+
* transactionId: result.transactionId,
|
|
1644
|
+
* status: result.status,
|
|
1645
|
+
* positionId: args.positionId,
|
|
1646
|
+
* token0: position.token0,
|
|
1647
|
+
* token1: position.token1,
|
|
1648
|
+
* amount0: result.amount0,
|
|
1649
|
+
* amount1: result.amount1,
|
|
1650
|
+
* message: `Liquidity removed! Received ${result.amount0} ${position.token0} and ${result.amount1} ${position.token1}`,
|
|
1651
|
+
* })
|
|
1652
|
+
* });
|
|
1653
|
+
*
|
|
1654
|
+
* @since 6.14.0
|
|
1655
|
+
*/
|
|
1656
|
+
function createPositionEnrichmentHandler(config) {
|
|
1657
|
+
return (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => {
|
|
1658
|
+
// 1. Validate wallet configured
|
|
1659
|
+
try {
|
|
1660
|
+
sdk.getAddress();
|
|
1661
|
+
}
|
|
1662
|
+
catch {
|
|
1663
|
+
throw new Error('Wallet configuration required for this operation');
|
|
1664
|
+
}
|
|
1665
|
+
// 2. Extract position identifiers
|
|
1666
|
+
const ownerAddress = args.ownerAddress;
|
|
1667
|
+
const positionId = args.positionId;
|
|
1668
|
+
// 3. Fetch position details
|
|
1669
|
+
const position = await sdk.getSwapLiquidityPositionById(ownerAddress, positionId);
|
|
1670
|
+
// 4. Validate position exists
|
|
1671
|
+
if (!position) {
|
|
1672
|
+
throw new Error(`Position ${positionId} not found for owner ${ownerAddress}`);
|
|
1673
|
+
}
|
|
1674
|
+
// 5. Call SDK operation with position data
|
|
1675
|
+
const result = await config.operation(sdk, position, args);
|
|
1676
|
+
// 6. Return enriched response
|
|
1677
|
+
return (0, response_formatter_js_1.formatSuccess)(config.responseBuilder(result, position, args));
|
|
1678
|
+
});
|
|
1679
|
+
}
|
|
1680
|
+
//# sourceMappingURL=handler-factories.js.map
|