clodds 1.1.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/LICENSE +21 -0
- package/README.md +468 -0
- package/dist/acp/agreement.d.ts +110 -0
- package/dist/acp/agreement.js +514 -0
- package/dist/acp/agreement.js.map +1 -0
- package/dist/acp/discovery.d.ts +84 -0
- package/dist/acp/discovery.js +332 -0
- package/dist/acp/discovery.js.map +1 -0
- package/dist/acp/escrow.d.ts +139 -0
- package/dist/acp/escrow.js +880 -0
- package/dist/acp/escrow.js.map +1 -0
- package/dist/acp/identity.d.ts +135 -0
- package/dist/acp/identity.js +716 -0
- package/dist/acp/identity.js.map +1 -0
- package/dist/acp/index.d.ts +205 -0
- package/dist/acp/index.js +583 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/acp/persistence.d.ts +59 -0
- package/dist/acp/persistence.js +590 -0
- package/dist/acp/persistence.js.map +1 -0
- package/dist/acp/predictions.d.ts +89 -0
- package/dist/acp/predictions.js +417 -0
- package/dist/acp/predictions.js.map +1 -0
- package/dist/acp/registry.d.ts +143 -0
- package/dist/acp/registry.js +584 -0
- package/dist/acp/registry.js.map +1 -0
- package/dist/agents/handlers/acp.d.ts +12 -0
- package/dist/agents/handlers/acp.js +987 -0
- package/dist/agents/handlers/acp.js.map +1 -0
- package/dist/agents/handlers/agentbets.d.ts +8 -0
- package/dist/agents/handlers/agentbets.js +63 -0
- package/dist/agents/handlers/agentbets.js.map +1 -0
- package/dist/agents/handlers/arbitrage.d.ts +16 -0
- package/dist/agents/handlers/arbitrage.js +187 -0
- package/dist/agents/handlers/arbitrage.js.map +1 -0
- package/dist/agents/handlers/betfair.d.ts +11 -0
- package/dist/agents/handlers/betfair.js +214 -0
- package/dist/agents/handlers/betfair.js.map +1 -0
- package/dist/agents/handlers/binance.d.ts +9 -0
- package/dist/agents/handlers/binance.js +227 -0
- package/dist/agents/handlers/binance.js.map +1 -0
- package/dist/agents/handlers/bittensor.d.ts +10 -0
- package/dist/agents/handlers/bittensor.js +90 -0
- package/dist/agents/handlers/bittensor.js.map +1 -0
- package/dist/agents/handlers/bybit.d.ts +9 -0
- package/dist/agents/handlers/bybit.js +226 -0
- package/dist/agents/handlers/bybit.js.map +1 -0
- package/dist/agents/handlers/credentials.d.ts +8 -0
- package/dist/agents/handlers/credentials.js +103 -0
- package/dist/agents/handlers/credentials.js.map +1 -0
- package/dist/agents/handlers/hyperliquid.d.ts +9 -0
- package/dist/agents/handlers/hyperliquid.js +326 -0
- package/dist/agents/handlers/hyperliquid.js.map +1 -0
- package/dist/agents/handlers/index.d.ts +82 -0
- package/dist/agents/handlers/index.js +143 -0
- package/dist/agents/handlers/index.js.map +1 -0
- package/dist/agents/handlers/kalshi.d.ts +10 -0
- package/dist/agents/handlers/kalshi.js +1377 -0
- package/dist/agents/handlers/kalshi.js.map +1 -0
- package/dist/agents/handlers/manifold.d.ts +9 -0
- package/dist/agents/handlers/manifold.js +1001 -0
- package/dist/agents/handlers/manifold.js.map +1 -0
- package/dist/agents/handlers/markets.d.ts +8 -0
- package/dist/agents/handlers/markets.js +321 -0
- package/dist/agents/handlers/markets.js.map +1 -0
- package/dist/agents/handlers/opinion.d.ts +11 -0
- package/dist/agents/handlers/opinion.js +374 -0
- package/dist/agents/handlers/opinion.js.map +1 -0
- package/dist/agents/handlers/paper-trading.d.ts +8 -0
- package/dist/agents/handlers/paper-trading.js +124 -0
- package/dist/agents/handlers/paper-trading.js.map +1 -0
- package/dist/agents/handlers/polymarket.d.ts +17 -0
- package/dist/agents/handlers/polymarket.js +455 -0
- package/dist/agents/handlers/polymarket.js.map +1 -0
- package/dist/agents/handlers/predictfun.d.ts +9 -0
- package/dist/agents/handlers/predictfun.js +488 -0
- package/dist/agents/handlers/predictfun.js.map +1 -0
- package/dist/agents/handlers/smarkets.d.ts +11 -0
- package/dist/agents/handlers/smarkets.js +205 -0
- package/dist/agents/handlers/smarkets.js.map +1 -0
- package/dist/agents/handlers/solana.d.ts +14 -0
- package/dist/agents/handlers/solana.js +1530 -0
- package/dist/agents/handlers/solana.js.map +1 -0
- package/dist/agents/handlers/types.d.ts +58 -0
- package/dist/agents/handlers/types.js +34 -0
- package/dist/agents/handlers/types.js.map +1 -0
- package/dist/agents/handlers/virtuals.d.ts +11 -0
- package/dist/agents/handlers/virtuals.js +135 -0
- package/dist/agents/handlers/virtuals.js.map +1 -0
- package/dist/agents/handlers/wallets.d.ts +9 -0
- package/dist/agents/handlers/wallets.js +222 -0
- package/dist/agents/handlers/wallets.js.map +1 -0
- package/dist/agents/index.d.ts +79 -0
- package/dist/agents/index.js +16690 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/subagents.d.ts +219 -0
- package/dist/agents/subagents.js +736 -0
- package/dist/agents/subagents.js.map +1 -0
- package/dist/alerts/index.d.ts +110 -0
- package/dist/alerts/index.js +421 -0
- package/dist/alerts/index.js.map +1 -0
- package/dist/alerts/realtime.d.ts +114 -0
- package/dist/alerts/realtime.js +262 -0
- package/dist/alerts/realtime.js.map +1 -0
- package/dist/api/apikeys.d.ts +74 -0
- package/dist/api/apikeys.js +319 -0
- package/dist/api/apikeys.js.map +1 -0
- package/dist/api/compute/code.d.ts +28 -0
- package/dist/api/compute/code.js +257 -0
- package/dist/api/compute/code.js.map +1 -0
- package/dist/api/compute/data.d.ts +72 -0
- package/dist/api/compute/data.js +264 -0
- package/dist/api/compute/data.js.map +1 -0
- package/dist/api/compute/gateway.d.ts +185 -0
- package/dist/api/compute/gateway.js +958 -0
- package/dist/api/compute/gateway.js.map +1 -0
- package/dist/api/compute/index.d.ts +21 -0
- package/dist/api/compute/index.js +46 -0
- package/dist/api/compute/index.js.map +1 -0
- package/dist/api/compute/llm.d.ts +64 -0
- package/dist/api/compute/llm.js +602 -0
- package/dist/api/compute/llm.js.map +1 -0
- package/dist/api/compute/persistence.d.ts +77 -0
- package/dist/api/compute/persistence.js +251 -0
- package/dist/api/compute/persistence.js.map +1 -0
- package/dist/api/compute/storage.d.ts +48 -0
- package/dist/api/compute/storage.js +283 -0
- package/dist/api/compute/storage.js.map +1 -0
- package/dist/api/compute/trade.d.ts +69 -0
- package/dist/api/compute/trade.js +460 -0
- package/dist/api/compute/trade.js.map +1 -0
- package/dist/api/compute/types.d.ts +271 -0
- package/dist/api/compute/types.js +87 -0
- package/dist/api/compute/types.js.map +1 -0
- package/dist/api/compute/web.d.ts +29 -0
- package/dist/api/compute/web.js +255 -0
- package/dist/api/compute/web.js.map +1 -0
- package/dist/api/custody.d.ts +48 -0
- package/dist/api/custody.js +272 -0
- package/dist/api/custody.js.map +1 -0
- package/dist/api/fees.d.ts +91 -0
- package/dist/api/fees.js +155 -0
- package/dist/api/fees.js.map +1 -0
- package/dist/api/gateway.d.ts +40 -0
- package/dist/api/gateway.js +569 -0
- package/dist/api/gateway.js.map +1 -0
- package/dist/api/index.d.ts +29 -0
- package/dist/api/index.js +55 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/jobs.d.ts +59 -0
- package/dist/api/jobs.js +362 -0
- package/dist/api/jobs.js.map +1 -0
- package/dist/api/middleware.d.ts +60 -0
- package/dist/api/middleware.js +315 -0
- package/dist/api/middleware.js.map +1 -0
- package/dist/api/prompt.d.ts +44 -0
- package/dist/api/prompt.js +345 -0
- package/dist/api/prompt.js.map +1 -0
- package/dist/api/sdk.d.ts +258 -0
- package/dist/api/sdk.js +341 -0
- package/dist/api/sdk.js.map +1 -0
- package/dist/api/server.d.ts +17 -0
- package/dist/api/server.js +852 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/types.d.ts +307 -0
- package/dist/api/types.js +64 -0
- package/dist/api/types.js.map +1 -0
- package/dist/arbitrage/index.d.ts +124 -0
- package/dist/arbitrage/index.js +482 -0
- package/dist/arbitrage/index.js.map +1 -0
- package/dist/auth/copilot.d.ts +87 -0
- package/dist/auth/copilot.js +328 -0
- package/dist/auth/copilot.js.map +1 -0
- package/dist/auth/google.d.ts +121 -0
- package/dist/auth/google.js +479 -0
- package/dist/auth/google.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.js +25 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oauth.d.ts +94 -0
- package/dist/auth/oauth.js +502 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/qwen.d.ts +110 -0
- package/dist/auth/qwen.js +351 -0
- package/dist/auth/qwen.js.map +1 -0
- package/dist/auto-reply/index.d.ts +143 -0
- package/dist/auto-reply/index.js +391 -0
- package/dist/auto-reply/index.js.map +1 -0
- package/dist/automation/cron.d.ts +66 -0
- package/dist/automation/cron.js +226 -0
- package/dist/automation/cron.js.map +1 -0
- package/dist/automation/heartbeats.d.ts +63 -0
- package/dist/automation/heartbeats.js +144 -0
- package/dist/automation/heartbeats.js.map +1 -0
- package/dist/automation/index.d.ts +9 -0
- package/dist/automation/index.js +15 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/webhooks.d.ts +60 -0
- package/dist/automation/webhooks.js +225 -0
- package/dist/automation/webhooks.js.map +1 -0
- package/dist/bankr/client.d.ts +86 -0
- package/dist/bankr/client.js +177 -0
- package/dist/bankr/client.js.map +1 -0
- package/dist/bankr/index.d.ts +6 -0
- package/dist/bankr/index.js +23 -0
- package/dist/bankr/index.js.map +1 -0
- package/dist/base/index.d.ts +6 -0
- package/dist/base/index.js +23 -0
- package/dist/base/index.js.map +1 -0
- package/dist/base/provider.d.ts +27 -0
- package/dist/base/provider.js +128 -0
- package/dist/base/provider.js.map +1 -0
- package/dist/bin/worker.d.ts +31 -0
- package/dist/bin/worker.js +127 -0
- package/dist/bin/worker.js.map +1 -0
- package/dist/bittensor/chutes.d.ts +14 -0
- package/dist/bittensor/chutes.js +141 -0
- package/dist/bittensor/chutes.js.map +1 -0
- package/dist/bittensor/index.d.ts +7 -0
- package/dist/bittensor/index.js +13 -0
- package/dist/bittensor/index.js.map +1 -0
- package/dist/bittensor/persistence.d.ts +8 -0
- package/dist/bittensor/persistence.js +188 -0
- package/dist/bittensor/persistence.js.map +1 -0
- package/dist/bittensor/plugin.d.ts +30 -0
- package/dist/bittensor/plugin.js +134 -0
- package/dist/bittensor/plugin.js.map +1 -0
- package/dist/bittensor/python-runner.d.ts +7 -0
- package/dist/bittensor/python-runner.js +83 -0
- package/dist/bittensor/python-runner.js.map +1 -0
- package/dist/bittensor/server.d.ts +7 -0
- package/dist/bittensor/server.js +110 -0
- package/dist/bittensor/server.js.map +1 -0
- package/dist/bittensor/service.d.ts +7 -0
- package/dist/bittensor/service.js +291 -0
- package/dist/bittensor/service.js.map +1 -0
- package/dist/bittensor/tool.d.ts +45 -0
- package/dist/bittensor/tool.js +147 -0
- package/dist/bittensor/tool.js.map +1 -0
- package/dist/bittensor/types.d.ts +188 -0
- package/dist/bittensor/types.js +6 -0
- package/dist/bittensor/types.js.map +1 -0
- package/dist/bittensor/wallet.d.ts +18 -0
- package/dist/bittensor/wallet.js +192 -0
- package/dist/bittensor/wallet.js.map +1 -0
- package/dist/bridge/wormhole.d.ts +239 -0
- package/dist/bridge/wormhole.js +404 -0
- package/dist/bridge/wormhole.js.map +1 -0
- package/dist/browser/index.d.ts +67 -0
- package/dist/browser/index.js +458 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/cache/index.d.ts +105 -0
- package/dist/cache/index.js +306 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/canvas/index.d.ts +66 -0
- package/dist/canvas/index.js +391 -0
- package/dist/canvas/index.js.map +1 -0
- package/dist/channels/base-adapter.d.ts +126 -0
- package/dist/channels/base-adapter.js +416 -0
- package/dist/channels/base-adapter.js.map +1 -0
- package/dist/channels/bluebubbles/index.d.ts +23 -0
- package/dist/channels/bluebubbles/index.js +182 -0
- package/dist/channels/bluebubbles/index.js.map +1 -0
- package/dist/channels/discord/index.d.ts +25 -0
- package/dist/channels/discord/index.js +419 -0
- package/dist/channels/discord/index.js.map +1 -0
- package/dist/channels/googlechat/index.d.ts +35 -0
- package/dist/channels/googlechat/index.js +223 -0
- package/dist/channels/googlechat/index.js.map +1 -0
- package/dist/channels/imessage/index.d.ts +28 -0
- package/dist/channels/imessage/index.js +340 -0
- package/dist/channels/imessage/index.js.map +1 -0
- package/dist/channels/index.d.ts +58 -0
- package/dist/channels/index.js +382 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/line/index.d.ts +307 -0
- package/dist/channels/line/index.js +760 -0
- package/dist/channels/line/index.js.map +1 -0
- package/dist/channels/matrix/index.d.ts +35 -0
- package/dist/channels/matrix/index.js +328 -0
- package/dist/channels/matrix/index.js.map +1 -0
- package/dist/channels/mattermost/index.d.ts +25 -0
- package/dist/channels/mattermost/index.js +239 -0
- package/dist/channels/mattermost/index.js.map +1 -0
- package/dist/channels/nextcloud-talk/index.d.ts +25 -0
- package/dist/channels/nextcloud-talk/index.js +175 -0
- package/dist/channels/nextcloud-talk/index.js.map +1 -0
- package/dist/channels/nostr/index.d.ts +21 -0
- package/dist/channels/nostr/index.js +278 -0
- package/dist/channels/nostr/index.js.map +1 -0
- package/dist/channels/signal/index.d.ts +33 -0
- package/dist/channels/signal/index.js +333 -0
- package/dist/channels/signal/index.js.map +1 -0
- package/dist/channels/slack/index.d.ts +26 -0
- package/dist/channels/slack/index.js +266 -0
- package/dist/channels/slack/index.js.map +1 -0
- package/dist/channels/teams/index.d.ts +42 -0
- package/dist/channels/teams/index.js +312 -0
- package/dist/channels/teams/index.js.map +1 -0
- package/dist/channels/telegram/index.d.ts +9 -0
- package/dist/channels/telegram/index.js +761 -0
- package/dist/channels/telegram/index.js.map +1 -0
- package/dist/channels/tlon/index.d.ts +25 -0
- package/dist/channels/tlon/index.js +236 -0
- package/dist/channels/tlon/index.js.map +1 -0
- package/dist/channels/twitch/index.d.ts +25 -0
- package/dist/channels/twitch/index.js +182 -0
- package/dist/channels/twitch/index.js.map +1 -0
- package/dist/channels/voice/index.d.ts +31 -0
- package/dist/channels/voice/index.js +208 -0
- package/dist/channels/voice/index.js.map +1 -0
- package/dist/channels/webchat/index.d.ts +29 -0
- package/dist/channels/webchat/index.js +366 -0
- package/dist/channels/webchat/index.js.map +1 -0
- package/dist/channels/whatsapp/index.d.ts +72 -0
- package/dist/channels/whatsapp/index.js +767 -0
- package/dist/channels/whatsapp/index.js.map +1 -0
- package/dist/channels/zalo/index.d.ts +45 -0
- package/dist/channels/zalo/index.js +285 -0
- package/dist/channels/zalo/index.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +23 -0
- package/dist/cli/commands/doctor.js +649 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/gateway.d.ts +6 -0
- package/dist/cli/commands/gateway.js +32 -0
- package/dist/cli/commands/gateway.js.map +1 -0
- package/dist/cli/commands/index.d.ts +31 -0
- package/dist/cli/commands/index.js +3743 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/onboard.d.ts +4 -0
- package/dist/cli/commands/onboard.js +334 -0
- package/dist/cli/commands/onboard.js.map +1 -0
- package/dist/cli/commands/repl.d.ts +11 -0
- package/dist/cli/commands/repl.js +185 -0
- package/dist/cli/commands/repl.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +29 -0
- package/dist/cli/commands/skills.js +297 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.js +449 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/secure.d.ts +14 -0
- package/dist/cli/secure.js +626 -0
- package/dist/cli/secure.js.map +1 -0
- package/dist/commands/index.d.ts +61 -0
- package/dist/commands/index.js +290 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/registry.d.ts +69 -0
- package/dist/commands/registry.js +3142 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/config/index.d.ts +465 -0
- package/dist/config/index.js +1451 -0
- package/dist/config/index.js.map +1 -0
- package/dist/credentials/index.d.ts +51 -0
- package/dist/credentials/index.js +270 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/cron/index.d.ts +151 -0
- package/dist/cron/index.js +1283 -0
- package/dist/cron/index.js.map +1 -0
- package/dist/cron/types.d.ts +102 -0
- package/dist/cron/types.js +6 -0
- package/dist/cron/types.js.map +1 -0
- package/dist/daemon/index.d.ts +23 -0
- package/dist/daemon/index.js +159 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/db/index.d.ts +825 -0
- package/dist/db/index.js +3382 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations.d.ts +70 -0
- package/dist/db/migrations.js +1373 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/docker/index.d.ts +188 -0
- package/dist/docker/index.js +571 -0
- package/dist/docker/index.js.map +1 -0
- package/dist/doctor/index.d.ts +47 -0
- package/dist/doctor/index.js +379 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/embeddings/index.d.ts +65 -0
- package/dist/embeddings/index.js +399 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/evm/contracts.d.ts +112 -0
- package/dist/evm/contracts.js +332 -0
- package/dist/evm/contracts.js.map +1 -0
- package/dist/evm/index.d.ts +21 -0
- package/dist/evm/index.js +45 -0
- package/dist/evm/index.js.map +1 -0
- package/dist/evm/multichain.d.ts +87 -0
- package/dist/evm/multichain.js +308 -0
- package/dist/evm/multichain.js.map +1 -0
- package/dist/evm/odos.d.ts +62 -0
- package/dist/evm/odos.js +261 -0
- package/dist/evm/odos.js.map +1 -0
- package/dist/evm/oneinch.d.ts +55 -0
- package/dist/evm/oneinch.js +324 -0
- package/dist/evm/oneinch.js.map +1 -0
- package/dist/evm/transfers.d.ts +83 -0
- package/dist/evm/transfers.js +393 -0
- package/dist/evm/transfers.js.map +1 -0
- package/dist/evm/uniswap.d.ts +56 -0
- package/dist/evm/uniswap.js +307 -0
- package/dist/evm/uniswap.js.map +1 -0
- package/dist/evm/virtuals.d.ts +220 -0
- package/dist/evm/virtuals.js +735 -0
- package/dist/evm/virtuals.js.map +1 -0
- package/dist/evm/wallet.d.ts +96 -0
- package/dist/evm/wallet.js +258 -0
- package/dist/evm/wallet.js.map +1 -0
- package/dist/exchanges/binance-futures/index.d.ts +83 -0
- package/dist/exchanges/binance-futures/index.js +394 -0
- package/dist/exchanges/binance-futures/index.js.map +1 -0
- package/dist/exchanges/bybit/index.d.ts +78 -0
- package/dist/exchanges/bybit/index.js +379 -0
- package/dist/exchanges/bybit/index.js.map +1 -0
- package/dist/exchanges/hyperliquid/index.d.ts +594 -0
- package/dist/exchanges/hyperliquid/index.js +1101 -0
- package/dist/exchanges/hyperliquid/index.js.map +1 -0
- package/dist/exchanges/mexc/index.d.ts +80 -0
- package/dist/exchanges/mexc/index.js +389 -0
- package/dist/exchanges/mexc/index.js.map +1 -0
- package/dist/exchanges/opinion/index.d.ts +128 -0
- package/dist/exchanges/opinion/index.js +443 -0
- package/dist/exchanges/opinion/index.js.map +1 -0
- package/dist/exchanges/predictfun/index.d.ts +107 -0
- package/dist/exchanges/predictfun/index.js +398 -0
- package/dist/exchanges/predictfun/index.js.map +1 -0
- package/dist/execution/auto-redeem.d.ts +55 -0
- package/dist/execution/auto-redeem.js +324 -0
- package/dist/execution/auto-redeem.js.map +1 -0
- package/dist/execution/bracket-orders.d.ts +84 -0
- package/dist/execution/bracket-orders.js +387 -0
- package/dist/execution/bracket-orders.js.map +1 -0
- package/dist/execution/circuit-breaker.d.ts +87 -0
- package/dist/execution/circuit-breaker.js +274 -0
- package/dist/execution/circuit-breaker.js.map +1 -0
- package/dist/execution/dca-persistence.d.ts +47 -0
- package/dist/execution/dca-persistence.js +159 -0
- package/dist/execution/dca-persistence.js.map +1 -0
- package/dist/execution/dca.d.ts +60 -0
- package/dist/execution/dca.js +273 -0
- package/dist/execution/dca.js.map +1 -0
- package/dist/execution/futures.d.ts +162 -0
- package/dist/execution/futures.js +1336 -0
- package/dist/execution/futures.js.map +1 -0
- package/dist/execution/index.d.ts +346 -0
- package/dist/execution/index.js +2532 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/mev-protection.d.ts +150 -0
- package/dist/execution/mev-protection.js +377 -0
- package/dist/execution/mev-protection.js.map +1 -0
- package/dist/execution/order-persistence.d.ts +81 -0
- package/dist/execution/order-persistence.js +350 -0
- package/dist/execution/order-persistence.js.map +1 -0
- package/dist/execution/position-manager.d.ts +142 -0
- package/dist/execution/position-manager.js +404 -0
- package/dist/execution/position-manager.js.map +1 -0
- package/dist/execution/smart-router.d.ts +90 -0
- package/dist/execution/smart-router.js +323 -0
- package/dist/execution/smart-router.js.map +1 -0
- package/dist/execution/trigger-orders.d.ts +81 -0
- package/dist/execution/trigger-orders.js +266 -0
- package/dist/execution/trigger-orders.js.map +1 -0
- package/dist/execution/twap.d.ts +87 -0
- package/dist/execution/twap.js +405 -0
- package/dist/execution/twap.js.map +1 -0
- package/dist/extensions/copilot-proxy/index.d.ts +49 -0
- package/dist/extensions/copilot-proxy/index.js +204 -0
- package/dist/extensions/copilot-proxy/index.js.map +1 -0
- package/dist/extensions/diagnostics-otel/index.d.ts +54 -0
- package/dist/extensions/diagnostics-otel/index.js +290 -0
- package/dist/extensions/diagnostics-otel/index.js.map +1 -0
- package/dist/extensions/google-auth/index.d.ts +71 -0
- package/dist/extensions/google-auth/index.js +350 -0
- package/dist/extensions/google-auth/index.js.map +1 -0
- package/dist/extensions/index.d.ts +11 -0
- package/dist/extensions/index.js +29 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/llm-task/index.d.ts +80 -0
- package/dist/extensions/llm-task/index.js +248 -0
- package/dist/extensions/llm-task/index.js.map +1 -0
- package/dist/extensions/lobster/index.d.ts +69 -0
- package/dist/extensions/lobster/index.js +178 -0
- package/dist/extensions/lobster/index.js.map +1 -0
- package/dist/extensions/memory-lancedb/index.d.ts +62 -0
- package/dist/extensions/memory-lancedb/index.js +343 -0
- package/dist/extensions/memory-lancedb/index.js.map +1 -0
- package/dist/extensions/open-prose/index.d.ts +82 -0
- package/dist/extensions/open-prose/index.js +565 -0
- package/dist/extensions/open-prose/index.js.map +1 -0
- package/dist/extensions/qwen-portal/index.d.ts +48 -0
- package/dist/extensions/qwen-portal/index.js +161 -0
- package/dist/extensions/qwen-portal/index.js.map +1 -0
- package/dist/extensions/task-runner/index.d.ts +121 -0
- package/dist/extensions/task-runner/index.js +640 -0
- package/dist/extensions/task-runner/index.js.map +1 -0
- package/dist/farcaster/client.d.ts +101 -0
- package/dist/farcaster/client.js +282 -0
- package/dist/farcaster/client.js.map +1 -0
- package/dist/farcaster/index.d.ts +4 -0
- package/dist/farcaster/index.js +21 -0
- package/dist/farcaster/index.js.map +1 -0
- package/dist/feeds/acled/index.d.ts +86 -0
- package/dist/feeds/acled/index.js +215 -0
- package/dist/feeds/acled/index.js.map +1 -0
- package/dist/feeds/agentbets/index.d.ts +17 -0
- package/dist/feeds/agentbets/index.js +137 -0
- package/dist/feeds/agentbets/index.js.map +1 -0
- package/dist/feeds/betfair/index.d.ts +132 -0
- package/dist/feeds/betfair/index.js +640 -0
- package/dist/feeds/betfair/index.js.map +1 -0
- package/dist/feeds/crypto/index.d.ts +101 -0
- package/dist/feeds/crypto/index.js +506 -0
- package/dist/feeds/crypto/index.js.map +1 -0
- package/dist/feeds/crypto/whale-tracker.d.ts +138 -0
- package/dist/feeds/crypto/whale-tracker.js +685 -0
- package/dist/feeds/crypto/whale-tracker.js.map +1 -0
- package/dist/feeds/descriptors.d.ts +14 -0
- package/dist/feeds/descriptors.js +582 -0
- package/dist/feeds/descriptors.js.map +1 -0
- package/dist/feeds/drift/index.d.ts +23 -0
- package/dist/feeds/drift/index.js +182 -0
- package/dist/feeds/drift/index.js.map +1 -0
- package/dist/feeds/drift/trading.d.ts +75 -0
- package/dist/feeds/drift/trading.js +457 -0
- package/dist/feeds/drift/trading.js.map +1 -0
- package/dist/feeds/external/index.d.ts +48 -0
- package/dist/feeds/external/index.js +575 -0
- package/dist/feeds/external/index.js.map +1 -0
- package/dist/feeds/fred/index.d.ts +134 -0
- package/dist/feeds/fred/index.js +263 -0
- package/dist/feeds/fred/index.js.map +1 -0
- package/dist/feeds/freshness.d.ts +79 -0
- package/dist/feeds/freshness.js +259 -0
- package/dist/feeds/freshness.js.map +1 -0
- package/dist/feeds/hedgehog/index.d.ts +24 -0
- package/dist/feeds/hedgehog/index.js +589 -0
- package/dist/feeds/hedgehog/index.js.map +1 -0
- package/dist/feeds/hedgehog/types.d.ts +215 -0
- package/dist/feeds/hedgehog/types.js +7 -0
- package/dist/feeds/hedgehog/types.js.map +1 -0
- package/dist/feeds/index.d.ts +38 -0
- package/dist/feeds/index.js +469 -0
- package/dist/feeds/index.js.map +1 -0
- package/dist/feeds/kalshi/index.d.ts +116 -0
- package/dist/feeds/kalshi/index.js +970 -0
- package/dist/feeds/kalshi/index.js.map +1 -0
- package/dist/feeds/manifold/index.d.ts +15 -0
- package/dist/feeds/manifold/index.js +269 -0
- package/dist/feeds/manifold/index.js.map +1 -0
- package/dist/feeds/metaculus/index.d.ts +22 -0
- package/dist/feeds/metaculus/index.js +149 -0
- package/dist/feeds/metaculus/index.js.map +1 -0
- package/dist/feeds/news/index.d.ts +20 -0
- package/dist/feeds/news/index.js +308 -0
- package/dist/feeds/news/index.js.map +1 -0
- package/dist/feeds/opinion/index.d.ts +31 -0
- package/dist/feeds/opinion/index.js +389 -0
- package/dist/feeds/opinion/index.js.map +1 -0
- package/dist/feeds/polymarket/index.d.ts +21 -0
- package/dist/feeds/polymarket/index.js +501 -0
- package/dist/feeds/polymarket/index.js.map +1 -0
- package/dist/feeds/polymarket/rtds.d.ts +40 -0
- package/dist/feeds/polymarket/rtds.js +159 -0
- package/dist/feeds/polymarket/rtds.js.map +1 -0
- package/dist/feeds/polymarket/user-ws.d.ts +64 -0
- package/dist/feeds/polymarket/user-ws.js +230 -0
- package/dist/feeds/polymarket/user-ws.js.map +1 -0
- package/dist/feeds/polymarket/whale-tracker.d.ts +152 -0
- package/dist/feeds/polymarket/whale-tracker.js +709 -0
- package/dist/feeds/polymarket/whale-tracker.js.map +1 -0
- package/dist/feeds/predictfun/index.d.ts +24 -0
- package/dist/feeds/predictfun/index.js +234 -0
- package/dist/feeds/predictfun/index.js.map +1 -0
- package/dist/feeds/predictit/index.d.ts +14 -0
- package/dist/feeds/predictit/index.js +88 -0
- package/dist/feeds/predictit/index.js.map +1 -0
- package/dist/feeds/registry.d.ts +148 -0
- package/dist/feeds/registry.js +197 -0
- package/dist/feeds/registry.js.map +1 -0
- package/dist/feeds/smarkets/index.d.ts +76 -0
- package/dist/feeds/smarkets/index.js +415 -0
- package/dist/feeds/smarkets/index.js.map +1 -0
- package/dist/feeds/virtuals/index.d.ts +92 -0
- package/dist/feeds/virtuals/index.js +341 -0
- package/dist/feeds/virtuals/index.js.map +1 -0
- package/dist/feeds/weather-nws/index.d.ts +73 -0
- package/dist/feeds/weather-nws/index.js +162 -0
- package/dist/feeds/weather-nws/index.js.map +1 -0
- package/dist/feeds/weather-openmeteo/index.d.ts +80 -0
- package/dist/feeds/weather-openmeteo/index.js +197 -0
- package/dist/feeds/weather-openmeteo/index.js.map +1 -0
- package/dist/gateway/alerts-routes.d.ts +15 -0
- package/dist/gateway/alerts-routes.js +188 -0
- package/dist/gateway/alerts-routes.js.map +1 -0
- package/dist/gateway/alt-data-routes.d.ts +15 -0
- package/dist/gateway/alt-data-routes.js +67 -0
- package/dist/gateway/alt-data-routes.js.map +1 -0
- package/dist/gateway/api-routes.d.ts +39 -0
- package/dist/gateway/api-routes.js +1028 -0
- package/dist/gateway/api-routes.js.map +1 -0
- package/dist/gateway/audit-routes.d.ts +8 -0
- package/dist/gateway/audit-routes.js +61 -0
- package/dist/gateway/audit-routes.js.map +1 -0
- package/dist/gateway/bracket-routes.d.ts +12 -0
- package/dist/gateway/bracket-routes.js +122 -0
- package/dist/gateway/bracket-routes.js.map +1 -0
- package/dist/gateway/control-ui.d.ts +45 -0
- package/dist/gateway/control-ui.js +301 -0
- package/dist/gateway/control-ui.js.map +1 -0
- package/dist/gateway/copy-trading-routes.d.ts +12 -0
- package/dist/gateway/copy-trading-routes.js +159 -0
- package/dist/gateway/copy-trading-routes.js.map +1 -0
- package/dist/gateway/cron-routes.d.ts +14 -0
- package/dist/gateway/cron-routes.js +132 -0
- package/dist/gateway/cron-routes.js.map +1 -0
- package/dist/gateway/dca-routes.d.ts +8 -0
- package/dist/gateway/dca-routes.js +179 -0
- package/dist/gateway/dca-routes.js.map +1 -0
- package/dist/gateway/embeddings-routes.d.ts +12 -0
- package/dist/gateway/embeddings-routes.js +102 -0
- package/dist/gateway/embeddings-routes.js.map +1 -0
- package/dist/gateway/feeds-routes.d.ts +34 -0
- package/dist/gateway/feeds-routes.js +167 -0
- package/dist/gateway/feeds-routes.js.map +1 -0
- package/dist/gateway/index.d.ts +100 -0
- package/dist/gateway/index.js +2321 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/monitoring-routes.d.ts +12 -0
- package/dist/gateway/monitoring-routes.js +73 -0
- package/dist/gateway/monitoring-routes.js.map +1 -0
- package/dist/gateway/opportunity-routes.d.ts +12 -0
- package/dist/gateway/opportunity-routes.js +238 -0
- package/dist/gateway/opportunity-routes.js.map +1 -0
- package/dist/gateway/payments-routes.d.ts +14 -0
- package/dist/gateway/payments-routes.js +82 -0
- package/dist/gateway/payments-routes.js.map +1 -0
- package/dist/gateway/percolator-routes.d.ts +16 -0
- package/dist/gateway/percolator-routes.js +139 -0
- package/dist/gateway/percolator-routes.js.map +1 -0
- package/dist/gateway/queue-routes.d.ts +12 -0
- package/dist/gateway/queue-routes.js +47 -0
- package/dist/gateway/queue-routes.js.map +1 -0
- package/dist/gateway/risk-routes.d.ts +12 -0
- package/dist/gateway/risk-routes.js +119 -0
- package/dist/gateway/risk-routes.js.map +1 -0
- package/dist/gateway/routing-routes.d.ts +12 -0
- package/dist/gateway/routing-routes.js +86 -0
- package/dist/gateway/routing-routes.js.map +1 -0
- package/dist/gateway/server.d.ts +215 -0
- package/dist/gateway/server.js +2287 -0
- package/dist/gateway/server.js.map +1 -0
- package/dist/gateway/shield-routes.d.ts +8 -0
- package/dist/gateway/shield-routes.js +88 -0
- package/dist/gateway/shield-routes.js.map +1 -0
- package/dist/gateway/signal-bus.d.ts +51 -0
- package/dist/gateway/signal-bus.js +64 -0
- package/dist/gateway/signal-bus.js.map +1 -0
- package/dist/gateway/trigger-routes.d.ts +12 -0
- package/dist/gateway/trigger-routes.js +127 -0
- package/dist/gateway/trigger-routes.js.map +1 -0
- package/dist/gateway/twap-routes.d.ts +12 -0
- package/dist/gateway/twap-routes.js +142 -0
- package/dist/gateway/twap-routes.js.map +1 -0
- package/dist/gateway/webhooks-routes.d.ts +31 -0
- package/dist/gateway/webhooks-routes.js +107 -0
- package/dist/gateway/webhooks-routes.js.map +1 -0
- package/dist/gateway/whale-routes.d.ts +12 -0
- package/dist/gateway/whale-routes.js +204 -0
- package/dist/gateway/whale-routes.js.map +1 -0
- package/dist/history/index.d.ts +81 -0
- package/dist/history/index.js +362 -0
- package/dist/history/index.js.map +1 -0
- package/dist/hooks/index.d.ts +279 -0
- package/dist/hooks/index.js +739 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/i18n/index.d.ts +65 -0
- package/dist/i18n/index.js +183 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/identity/erc8004.d.ts +104 -0
- package/dist/identity/erc8004.js +493 -0
- package/dist/identity/erc8004.js.map +1 -0
- package/dist/identity/index.d.ts +1 -0
- package/dist/identity/index.js +18 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +240 -0
- package/dist/index.js.map +1 -0
- package/dist/infra/index.d.ts +133 -0
- package/dist/infra/index.js +481 -0
- package/dist/infra/index.js.map +1 -0
- package/dist/infra/retry.d.ts +132 -0
- package/dist/infra/retry.js +450 -0
- package/dist/infra/retry.js.map +1 -0
- package/dist/ledger/anchor.d.ts +45 -0
- package/dist/ledger/anchor.js +271 -0
- package/dist/ledger/anchor.js.map +1 -0
- package/dist/ledger/hash.d.ts +26 -0
- package/dist/ledger/hash.js +69 -0
- package/dist/ledger/hash.js.map +1 -0
- package/dist/ledger/hooks.d.ts +107 -0
- package/dist/ledger/hooks.js +314 -0
- package/dist/ledger/hooks.js.map +1 -0
- package/dist/ledger/index.d.ts +67 -0
- package/dist/ledger/index.js +221 -0
- package/dist/ledger/index.js.map +1 -0
- package/dist/ledger/storage.d.ts +57 -0
- package/dist/ledger/storage.js +368 -0
- package/dist/ledger/storage.js.map +1 -0
- package/dist/ledger/types.d.ts +138 -0
- package/dist/ledger/types.js +16 -0
- package/dist/ledger/types.js.map +1 -0
- package/dist/link-understanding/index.d.ts +61 -0
- package/dist/link-understanding/index.js +320 -0
- package/dist/link-understanding/index.js.map +1 -0
- package/dist/logging/index.d.ts +50 -0
- package/dist/logging/index.js +255 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/macos/index.d.ts +143 -0
- package/dist/macos/index.js +587 -0
- package/dist/macos/index.js.map +1 -0
- package/dist/markdown/index.d.ts +43 -0
- package/dist/markdown/index.js +305 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/market-index/index.d.ts +51 -0
- package/dist/market-index/index.js +553 -0
- package/dist/market-index/index.js.map +1 -0
- package/dist/mcp/index.d.ts +263 -0
- package/dist/mcp/index.js +940 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/installer.d.ts +11 -0
- package/dist/mcp/installer.js +128 -0
- package/dist/mcp/installer.js.map +1 -0
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.js +172 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/media/index.d.ts +119 -0
- package/dist/media/index.js +740 -0
- package/dist/media/index.js.map +1 -0
- package/dist/memory/context.d.ts +189 -0
- package/dist/memory/context.js +541 -0
- package/dist/memory/context.js.map +1 -0
- package/dist/memory/index.d.ts +74 -0
- package/dist/memory/index.js +352 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/summarizer.d.ts +10 -0
- package/dist/memory/summarizer.js +51 -0
- package/dist/memory/summarizer.js.map +1 -0
- package/dist/memory/tokenizer.d.ts +4 -0
- package/dist/memory/tokenizer.js +61 -0
- package/dist/memory/tokenizer.js.map +1 -0
- package/dist/messages/unified.d.ts +7 -0
- package/dist/messages/unified.js +77 -0
- package/dist/messages/unified.js.map +1 -0
- package/dist/ml-pipeline/collector.d.ts +23 -0
- package/dist/ml-pipeline/collector.js +176 -0
- package/dist/ml-pipeline/collector.js.map +1 -0
- package/dist/ml-pipeline/index.d.ts +21 -0
- package/dist/ml-pipeline/index.js +72 -0
- package/dist/ml-pipeline/index.js.map +1 -0
- package/dist/ml-pipeline/trainer.d.ts +32 -0
- package/dist/ml-pipeline/trainer.js +228 -0
- package/dist/ml-pipeline/trainer.js.map +1 -0
- package/dist/ml-pipeline/types.d.ts +51 -0
- package/dist/ml-pipeline/types.js +23 -0
- package/dist/ml-pipeline/types.js.map +1 -0
- package/dist/models/adaptive.d.ts +11 -0
- package/dist/models/adaptive.js +64 -0
- package/dist/models/adaptive.js.map +1 -0
- package/dist/models/failover.d.ts +51 -0
- package/dist/models/failover.js +151 -0
- package/dist/models/failover.js.map +1 -0
- package/dist/models/index.d.ts +7 -0
- package/dist/models/index.js +13 -0
- package/dist/models/index.js.map +1 -0
- package/dist/monitoring/alerts.d.ts +185 -0
- package/dist/monitoring/alerts.js +565 -0
- package/dist/monitoring/alerts.js.map +1 -0
- package/dist/monitoring/health.d.ts +151 -0
- package/dist/monitoring/health.js +423 -0
- package/dist/monitoring/health.js.map +1 -0
- package/dist/monitoring/index.d.ts +25 -0
- package/dist/monitoring/index.js +258 -0
- package/dist/monitoring/index.js.map +1 -0
- package/dist/monitoring/metrics.d.ts +147 -0
- package/dist/monitoring/metrics.js +519 -0
- package/dist/monitoring/metrics.js.map +1 -0
- package/dist/nodes/index.d.ts +81 -0
- package/dist/nodes/index.js +475 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/opportunity/analytics.d.ts +221 -0
- package/dist/opportunity/analytics.js +678 -0
- package/dist/opportunity/analytics.js.map +1 -0
- package/dist/opportunity/combinatorial.d.ts +147 -0
- package/dist/opportunity/combinatorial.js +765 -0
- package/dist/opportunity/combinatorial.js.map +1 -0
- package/dist/opportunity/correlation.d.ts +107 -0
- package/dist/opportunity/correlation.js +410 -0
- package/dist/opportunity/correlation.js.map +1 -0
- package/dist/opportunity/executor.d.ts +108 -0
- package/dist/opportunity/executor.js +356 -0
- package/dist/opportunity/executor.js.map +1 -0
- package/dist/opportunity/index.d.ts +285 -0
- package/dist/opportunity/index.js +839 -0
- package/dist/opportunity/index.js.map +1 -0
- package/dist/opportunity/links.d.ts +87 -0
- package/dist/opportunity/links.js +344 -0
- package/dist/opportunity/links.js.map +1 -0
- package/dist/opportunity/matching.d.ts +101 -0
- package/dist/opportunity/matching.js +551 -0
- package/dist/opportunity/matching.js.map +1 -0
- package/dist/opportunity/outcomes.d.ts +74 -0
- package/dist/opportunity/outcomes.js +321 -0
- package/dist/opportunity/outcomes.js.map +1 -0
- package/dist/opportunity/risk.d.ts +128 -0
- package/dist/opportunity/risk.js +381 -0
- package/dist/opportunity/risk.js.map +1 -0
- package/dist/opportunity/scoring.d.ts +151 -0
- package/dist/opportunity/scoring.js +421 -0
- package/dist/opportunity/scoring.js.map +1 -0
- package/dist/pairing/index.d.ts +108 -0
- package/dist/pairing/index.js +431 -0
- package/dist/pairing/index.js.map +1 -0
- package/dist/payments/index.d.ts +12 -0
- package/dist/payments/index.js +34 -0
- package/dist/payments/index.js.map +1 -0
- package/dist/payments/x402/evm.d.ts +53 -0
- package/dist/payments/x402/evm.js +282 -0
- package/dist/payments/x402/evm.js.map +1 -0
- package/dist/payments/x402/index.d.ts +158 -0
- package/dist/payments/x402/index.js +531 -0
- package/dist/payments/x402/index.js.map +1 -0
- package/dist/payments/x402/solana.d.ts +51 -0
- package/dist/payments/x402/solana.js +397 -0
- package/dist/payments/x402/solana.js.map +1 -0
- package/dist/percolator/accounts.d.ts +21 -0
- package/dist/percolator/accounts.js +76 -0
- package/dist/percolator/accounts.js.map +1 -0
- package/dist/percolator/encode.d.ts +14 -0
- package/dist/percolator/encode.js +90 -0
- package/dist/percolator/encode.js.map +1 -0
- package/dist/percolator/execution.d.ts +29 -0
- package/dist/percolator/execution.js +239 -0
- package/dist/percolator/execution.js.map +1 -0
- package/dist/percolator/feed.d.ts +15 -0
- package/dist/percolator/feed.js +160 -0
- package/dist/percolator/feed.js.map +1 -0
- package/dist/percolator/index.d.ts +20 -0
- package/dist/percolator/index.js +24 -0
- package/dist/percolator/index.js.map +1 -0
- package/dist/percolator/instructions.d.ts +29 -0
- package/dist/percolator/instructions.js +52 -0
- package/dist/percolator/instructions.js.map +1 -0
- package/dist/percolator/keeper.d.ts +11 -0
- package/dist/percolator/keeper.js +83 -0
- package/dist/percolator/keeper.js.map +1 -0
- package/dist/percolator/pda.d.ts +15 -0
- package/dist/percolator/pda.js +26 -0
- package/dist/percolator/pda.js.map +1 -0
- package/dist/percolator/slab.d.ts +122 -0
- package/dist/percolator/slab.js +325 -0
- package/dist/percolator/slab.js.map +1 -0
- package/dist/percolator/tx.d.ts +27 -0
- package/dist/percolator/tx.js +77 -0
- package/dist/percolator/tx.js.map +1 -0
- package/dist/percolator/types.d.ts +51 -0
- package/dist/percolator/types.js +9 -0
- package/dist/percolator/types.js.map +1 -0
- package/dist/permissions/index.d.ts +262 -0
- package/dist/permissions/index.js +929 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/plugins/index.d.ts +158 -0
- package/dist/plugins/index.js +444 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/portfolio/index.d.ts +170 -0
- package/dist/portfolio/index.js +970 -0
- package/dist/portfolio/index.js.map +1 -0
- package/dist/presence/index.d.ts +34 -0
- package/dist/presence/index.js +124 -0
- package/dist/presence/index.js.map +1 -0
- package/dist/process/index.d.ts +82 -0
- package/dist/process/index.js +402 -0
- package/dist/process/index.js.map +1 -0
- package/dist/providers/discovery.d.ts +209 -0
- package/dist/providers/discovery.js +751 -0
- package/dist/providers/discovery.js.map +1 -0
- package/dist/providers/health.d.ts +27 -0
- package/dist/providers/health.js +80 -0
- package/dist/providers/health.js.map +1 -0
- package/dist/providers/index.d.ts +154 -0
- package/dist/providers/index.js +897 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/queue/index.d.ts +36 -0
- package/dist/queue/index.js +146 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/jobs/index.d.ts +11 -0
- package/dist/queue/jobs/index.js +32 -0
- package/dist/queue/jobs/index.js.map +1 -0
- package/dist/queue/jobs/producer.d.ts +43 -0
- package/dist/queue/jobs/producer.js +233 -0
- package/dist/queue/jobs/producer.js.map +1 -0
- package/dist/queue/jobs/types.d.ts +128 -0
- package/dist/queue/jobs/types.js +14 -0
- package/dist/queue/jobs/types.js.map +1 -0
- package/dist/queue/jobs/worker.d.ts +22 -0
- package/dist/queue/jobs/worker.js +220 -0
- package/dist/queue/jobs/worker.js.map +1 -0
- package/dist/remote/index.d.ts +136 -0
- package/dist/remote/index.js +456 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/risk/circuit-breaker.d.ts +99 -0
- package/dist/risk/circuit-breaker.js +300 -0
- package/dist/risk/circuit-breaker.js.map +1 -0
- package/dist/risk/dashboard.d.ts +69 -0
- package/dist/risk/dashboard.js +127 -0
- package/dist/risk/dashboard.js.map +1 -0
- package/dist/risk/engine.d.ts +128 -0
- package/dist/risk/engine.js +311 -0
- package/dist/risk/engine.js.map +1 -0
- package/dist/risk/index.d.ts +10 -0
- package/dist/risk/index.js +38 -0
- package/dist/risk/index.js.map +1 -0
- package/dist/risk/stress.d.ts +70 -0
- package/dist/risk/stress.js +215 -0
- package/dist/risk/stress.js.map +1 -0
- package/dist/risk/var.d.ts +72 -0
- package/dist/risk/var.js +173 -0
- package/dist/risk/var.js.map +1 -0
- package/dist/risk/volatility.d.ts +61 -0
- package/dist/risk/volatility.js +132 -0
- package/dist/risk/volatility.js.map +1 -0
- package/dist/routing/index.d.ts +116 -0
- package/dist/routing/index.js +371 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/search/index.d.ts +30 -0
- package/dist/search/index.js +129 -0
- package/dist/search/index.js.map +1 -0
- package/dist/security/address-checker.d.ts +6 -0
- package/dist/security/address-checker.js +213 -0
- package/dist/security/address-checker.js.map +1 -0
- package/dist/security/code-scanner.d.ts +3 -0
- package/dist/security/code-scanner.js +190 -0
- package/dist/security/code-scanner.js.map +1 -0
- package/dist/security/index.d.ts +176 -0
- package/dist/security/index.js +498 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/sanitizer.d.ts +2 -0
- package/dist/security/sanitizer.js +135 -0
- package/dist/security/sanitizer.js.map +1 -0
- package/dist/security/scam-db.d.ts +5 -0
- package/dist/security/scam-db.js +116 -0
- package/dist/security/scam-db.js.map +1 -0
- package/dist/security/shield.d.ts +12 -0
- package/dist/security/shield.js +80 -0
- package/dist/security/shield.js.map +1 -0
- package/dist/security/tx-validator.d.ts +5 -0
- package/dist/security/tx-validator.js +115 -0
- package/dist/security/tx-validator.js.map +1 -0
- package/dist/security/types.d.ts +84 -0
- package/dist/security/types.js +6 -0
- package/dist/security/types.js.map +1 -0
- package/dist/services/alt-data/feeds/fear-greed.d.ts +14 -0
- package/dist/services/alt-data/feeds/fear-greed.js +81 -0
- package/dist/services/alt-data/feeds/fear-greed.js.map +1 -0
- package/dist/services/alt-data/feeds/funding-rates.d.ts +13 -0
- package/dist/services/alt-data/feeds/funding-rates.js +90 -0
- package/dist/services/alt-data/feeds/funding-rates.js.map +1 -0
- package/dist/services/alt-data/feeds/reddit.d.ts +13 -0
- package/dist/services/alt-data/feeds/reddit.js +112 -0
- package/dist/services/alt-data/feeds/reddit.js.map +1 -0
- package/dist/services/alt-data/index.d.ts +31 -0
- package/dist/services/alt-data/index.js +278 -0
- package/dist/services/alt-data/index.js.map +1 -0
- package/dist/services/alt-data/market-matcher.d.ts +29 -0
- package/dist/services/alt-data/market-matcher.js +157 -0
- package/dist/services/alt-data/market-matcher.js.map +1 -0
- package/dist/services/alt-data/sentiment.d.ts +11 -0
- package/dist/services/alt-data/sentiment.js +277 -0
- package/dist/services/alt-data/sentiment.js.map +1 -0
- package/dist/services/alt-data/types.d.ts +86 -0
- package/dist/services/alt-data/types.js +9 -0
- package/dist/services/alt-data/types.js.map +1 -0
- package/dist/services/feature-engineering/accessor.d.ts +19 -0
- package/dist/services/feature-engineering/accessor.js +31 -0
- package/dist/services/feature-engineering/accessor.js.map +1 -0
- package/dist/services/feature-engineering/index.d.ts +15 -0
- package/dist/services/feature-engineering/index.js +345 -0
- package/dist/services/feature-engineering/index.js.map +1 -0
- package/dist/services/feature-engineering/indicators.d.ts +90 -0
- package/dist/services/feature-engineering/indicators.js +254 -0
- package/dist/services/feature-engineering/indicators.js.map +1 -0
- package/dist/services/feature-engineering/rolling-window.d.ts +89 -0
- package/dist/services/feature-engineering/rolling-window.js +173 -0
- package/dist/services/feature-engineering/rolling-window.js.map +1 -0
- package/dist/services/feature-engineering/thresholds.d.ts +137 -0
- package/dist/services/feature-engineering/thresholds.js +280 -0
- package/dist/services/feature-engineering/thresholds.js.map +1 -0
- package/dist/services/feature-engineering/types.d.ts +138 -0
- package/dist/services/feature-engineering/types.js +6 -0
- package/dist/services/feature-engineering/types.js.map +1 -0
- package/dist/services/tick-recorder/index.d.ts +12 -0
- package/dist/services/tick-recorder/index.js +200 -0
- package/dist/services/tick-recorder/index.js.map +1 -0
- package/dist/services/tick-recorder/queries.d.ts +46 -0
- package/dist/services/tick-recorder/queries.js +291 -0
- package/dist/services/tick-recorder/queries.js.map +1 -0
- package/dist/services/tick-recorder/schema.d.ts +27 -0
- package/dist/services/tick-recorder/schema.js +185 -0
- package/dist/services/tick-recorder/schema.js.map +1 -0
- package/dist/services/tick-recorder/timescale.d.ts +27 -0
- package/dist/services/tick-recorder/timescale.js +105 -0
- package/dist/services/tick-recorder/timescale.js.map +1 -0
- package/dist/services/tick-recorder/types.d.ts +113 -0
- package/dist/services/tick-recorder/types.js +7 -0
- package/dist/services/tick-recorder/types.js.map +1 -0
- package/dist/services/tick-streamer/index.d.ts +12 -0
- package/dist/services/tick-streamer/index.js +317 -0
- package/dist/services/tick-streamer/index.js.map +1 -0
- package/dist/services/tick-streamer/types.d.ts +134 -0
- package/dist/services/tick-streamer/types.js +6 -0
- package/dist/services/tick-streamer/types.js.map +1 -0
- package/dist/session/index.d.ts +147 -0
- package/dist/session/index.js +429 -0
- package/dist/session/index.js.map +1 -0
- package/dist/sessions/index.d.ts +69 -0
- package/dist/sessions/index.js +447 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/signal-router/index.d.ts +2 -0
- package/dist/signal-router/index.js +6 -0
- package/dist/signal-router/index.js.map +1 -0
- package/dist/signal-router/router.d.ts +25 -0
- package/dist/signal-router/router.js +391 -0
- package/dist/signal-router/router.js.map +1 -0
- package/dist/signal-router/types.d.ts +64 -0
- package/dist/signal-router/types.js +9 -0
- package/dist/signal-router/types.js.map +1 -0
- package/dist/skills/bundled/acp/index.d.ts +25 -0
- package/dist/skills/bundled/acp/index.js +472 -0
- package/dist/skills/bundled/acp/index.js.map +1 -0
- package/dist/skills/bundled/agentbets/index.d.ts +15 -0
- package/dist/skills/bundled/agentbets/index.js +168 -0
- package/dist/skills/bundled/agentbets/index.js.map +1 -0
- package/dist/skills/bundled/ai-strategy/index.d.ts +21 -0
- package/dist/skills/bundled/ai-strategy/index.js +647 -0
- package/dist/skills/bundled/ai-strategy/index.js.map +1 -0
- package/dist/skills/bundled/alerts/index.d.ts +20 -0
- package/dist/skills/bundled/alerts/index.js +249 -0
- package/dist/skills/bundled/alerts/index.js.map +1 -0
- package/dist/skills/bundled/analytics/index.d.ts +17 -0
- package/dist/skills/bundled/analytics/index.js +112 -0
- package/dist/skills/bundled/analytics/index.js.map +1 -0
- package/dist/skills/bundled/arbitrage/index.d.ts +24 -0
- package/dist/skills/bundled/arbitrage/index.js +253 -0
- package/dist/skills/bundled/arbitrage/index.js.map +1 -0
- package/dist/skills/bundled/auto-reply/index.d.ts +18 -0
- package/dist/skills/bundled/auto-reply/index.js +215 -0
- package/dist/skills/bundled/auto-reply/index.js.map +1 -0
- package/dist/skills/bundled/automation/index.d.ts +19 -0
- package/dist/skills/bundled/automation/index.js +160 -0
- package/dist/skills/bundled/automation/index.js.map +1 -0
- package/dist/skills/bundled/backtest/index.d.ts +18 -0
- package/dist/skills/bundled/backtest/index.js +250 -0
- package/dist/skills/bundled/backtest/index.js.map +1 -0
- package/dist/skills/bundled/bags/index.d.ts +49 -0
- package/dist/skills/bundled/bags/index.js +1069 -0
- package/dist/skills/bundled/bags/index.js.map +1 -0
- package/dist/skills/bundled/bankr/index.d.ts +161 -0
- package/dist/skills/bundled/bankr/index.js +271 -0
- package/dist/skills/bundled/bankr/index.js.map +1 -0
- package/dist/skills/bundled/betfair/index.d.ts +24 -0
- package/dist/skills/bundled/betfair/index.js +511 -0
- package/dist/skills/bundled/betfair/index.js.map +1 -0
- package/dist/skills/bundled/binance-futures/index.d.ts +15 -0
- package/dist/skills/bundled/binance-futures/index.js +485 -0
- package/dist/skills/bundled/binance-futures/index.js.map +1 -0
- package/dist/skills/bundled/botchan/index.d.ts +130 -0
- package/dist/skills/bundled/botchan/index.js +427 -0
- package/dist/skills/bundled/botchan/index.js.map +1 -0
- package/dist/skills/bundled/bridge/index.d.ts +17 -0
- package/dist/skills/bundled/bridge/index.js +297 -0
- package/dist/skills/bundled/bridge/index.js.map +1 -0
- package/dist/skills/bundled/bybit-futures/index.d.ts +15 -0
- package/dist/skills/bundled/bybit-futures/index.js +380 -0
- package/dist/skills/bundled/bybit-futures/index.js.map +1 -0
- package/dist/skills/bundled/clanker/index.d.ts +236 -0
- package/dist/skills/bundled/clanker/index.js +759 -0
- package/dist/skills/bundled/clanker/index.js.map +1 -0
- package/dist/skills/bundled/copy-trading/index.d.ts +20 -0
- package/dist/skills/bundled/copy-trading/index.js +213 -0
- package/dist/skills/bundled/copy-trading/index.js.map +1 -0
- package/dist/skills/bundled/copy-trading-solana/index.d.ts +21 -0
- package/dist/skills/bundled/copy-trading-solana/index.js +421 -0
- package/dist/skills/bundled/copy-trading-solana/index.js.map +1 -0
- package/dist/skills/bundled/credentials/index.d.ts +17 -0
- package/dist/skills/bundled/credentials/index.js +137 -0
- package/dist/skills/bundled/credentials/index.js.map +1 -0
- package/dist/skills/bundled/crypto-hft/index.d.ts +26 -0
- package/dist/skills/bundled/crypto-hft/index.js +361 -0
- package/dist/skills/bundled/crypto-hft/index.js.map +1 -0
- package/dist/skills/bundled/dca/index.d.ts +26 -0
- package/dist/skills/bundled/dca/index.js +1342 -0
- package/dist/skills/bundled/dca/index.js.map +1 -0
- package/dist/skills/bundled/divergence/index.d.ts +19 -0
- package/dist/skills/bundled/divergence/index.js +272 -0
- package/dist/skills/bundled/divergence/index.js.map +1 -0
- package/dist/skills/bundled/doctor/index.d.ts +18 -0
- package/dist/skills/bundled/doctor/index.js +78 -0
- package/dist/skills/bundled/doctor/index.js.map +1 -0
- package/dist/skills/bundled/drift/index.d.ts +13 -0
- package/dist/skills/bundled/drift/index.js +378 -0
- package/dist/skills/bundled/drift/index.js.map +1 -0
- package/dist/skills/bundled/drift-sdk/index.d.ts +17 -0
- package/dist/skills/bundled/drift-sdk/index.js +501 -0
- package/dist/skills/bundled/drift-sdk/index.js.map +1 -0
- package/dist/skills/bundled/edge/index.d.ts +16 -0
- package/dist/skills/bundled/edge/index.js +91 -0
- package/dist/skills/bundled/edge/index.js.map +1 -0
- package/dist/skills/bundled/embeddings/index.d.ts +19 -0
- package/dist/skills/bundled/embeddings/index.js +215 -0
- package/dist/skills/bundled/embeddings/index.js.map +1 -0
- package/dist/skills/bundled/endaoment/index.d.ts +105 -0
- package/dist/skills/bundled/endaoment/index.js +285 -0
- package/dist/skills/bundled/endaoment/index.js.map +1 -0
- package/dist/skills/bundled/ens/index.d.ts +151 -0
- package/dist/skills/bundled/ens/index.js +278 -0
- package/dist/skills/bundled/ens/index.js.map +1 -0
- package/dist/skills/bundled/erc8004/index.d.ts +123 -0
- package/dist/skills/bundled/erc8004/index.js +301 -0
- package/dist/skills/bundled/erc8004/index.js.map +1 -0
- package/dist/skills/bundled/execution/index.d.ts +18 -0
- package/dist/skills/bundled/execution/index.js +358 -0
- package/dist/skills/bundled/execution/index.js.map +1 -0
- package/dist/skills/bundled/farcaster/index.d.ts +121 -0
- package/dist/skills/bundled/farcaster/index.js +314 -0
- package/dist/skills/bundled/farcaster/index.js.map +1 -0
- package/dist/skills/bundled/features/index.d.ts +17 -0
- package/dist/skills/bundled/features/index.js +305 -0
- package/dist/skills/bundled/features/index.js.map +1 -0
- package/dist/skills/bundled/feeds/index.d.ts +26 -0
- package/dist/skills/bundled/feeds/index.js +462 -0
- package/dist/skills/bundled/feeds/index.js.map +1 -0
- package/dist/skills/bundled/harden/index.d.ts +55 -0
- package/dist/skills/bundled/harden/index.js +510 -0
- package/dist/skills/bundled/harden/index.js.map +1 -0
- package/dist/skills/bundled/history/index.d.ts +21 -0
- package/dist/skills/bundled/history/index.js +195 -0
- package/dist/skills/bundled/history/index.js.map +1 -0
- package/dist/skills/bundled/hyperliquid/index.d.ts +19 -0
- package/dist/skills/bundled/hyperliquid/index.js +1280 -0
- package/dist/skills/bundled/hyperliquid/index.js.map +1 -0
- package/dist/skills/bundled/identity/index.d.ts +17 -0
- package/dist/skills/bundled/identity/index.js +223 -0
- package/dist/skills/bundled/identity/index.js.map +1 -0
- package/dist/skills/bundled/integrations/index.d.ts +17 -0
- package/dist/skills/bundled/integrations/index.js +138 -0
- package/dist/skills/bundled/integrations/index.js.map +1 -0
- package/dist/skills/bundled/jupiter/index.d.ts +41 -0
- package/dist/skills/bundled/jupiter/index.js +872 -0
- package/dist/skills/bundled/jupiter/index.js.map +1 -0
- package/dist/skills/bundled/kamino/index.d.ts +33 -0
- package/dist/skills/bundled/kamino/index.js +578 -0
- package/dist/skills/bundled/kamino/index.js.map +1 -0
- package/dist/skills/bundled/ledger/index.d.ts +14 -0
- package/dist/skills/bundled/ledger/index.js +186 -0
- package/dist/skills/bundled/ledger/index.js.map +1 -0
- package/dist/skills/bundled/market-index/index.d.ts +18 -0
- package/dist/skills/bundled/market-index/index.js +182 -0
- package/dist/skills/bundled/market-index/index.js.map +1 -0
- package/dist/skills/bundled/markets/index.d.ts +16 -0
- package/dist/skills/bundled/markets/index.js +95 -0
- package/dist/skills/bundled/markets/index.js.map +1 -0
- package/dist/skills/bundled/mcp/index.d.ts +19 -0
- package/dist/skills/bundled/mcp/index.js +212 -0
- package/dist/skills/bundled/mcp/index.js.map +1 -0
- package/dist/skills/bundled/memory/index.d.ts +20 -0
- package/dist/skills/bundled/memory/index.js +210 -0
- package/dist/skills/bundled/memory/index.js.map +1 -0
- package/dist/skills/bundled/metaculus/index.d.ts +17 -0
- package/dist/skills/bundled/metaculus/index.js +168 -0
- package/dist/skills/bundled/metaculus/index.js.map +1 -0
- package/dist/skills/bundled/meteora/index.d.ts +39 -0
- package/dist/skills/bundled/meteora/index.js +837 -0
- package/dist/skills/bundled/meteora/index.js.map +1 -0
- package/dist/skills/bundled/meteora-dbc/index.d.ts +33 -0
- package/dist/skills/bundled/meteora-dbc/index.js +993 -0
- package/dist/skills/bundled/meteora-dbc/index.js.map +1 -0
- package/dist/skills/bundled/metrics/index.d.ts +18 -0
- package/dist/skills/bundled/metrics/index.js +91 -0
- package/dist/skills/bundled/metrics/index.js.map +1 -0
- package/dist/skills/bundled/mev/index.d.ts +17 -0
- package/dist/skills/bundled/mev/index.js +108 -0
- package/dist/skills/bundled/mev/index.js.map +1 -0
- package/dist/skills/bundled/mexc-futures/index.d.ts +16 -0
- package/dist/skills/bundled/mexc-futures/index.js +389 -0
- package/dist/skills/bundled/mexc-futures/index.js.map +1 -0
- package/dist/skills/bundled/mm/index.d.ts +18 -0
- package/dist/skills/bundled/mm/index.js +315 -0
- package/dist/skills/bundled/mm/index.js.map +1 -0
- package/dist/skills/bundled/monitoring/index.d.ts +18 -0
- package/dist/skills/bundled/monitoring/index.js +146 -0
- package/dist/skills/bundled/monitoring/index.js.map +1 -0
- package/dist/skills/bundled/news/index.d.ts +17 -0
- package/dist/skills/bundled/news/index.js +161 -0
- package/dist/skills/bundled/news/index.js.map +1 -0
- package/dist/skills/bundled/onchainkit/index.d.ts +92 -0
- package/dist/skills/bundled/onchainkit/index.js +429 -0
- package/dist/skills/bundled/onchainkit/index.js.map +1 -0
- package/dist/skills/bundled/opinion/index.d.ts +12 -0
- package/dist/skills/bundled/opinion/index.js +429 -0
- package/dist/skills/bundled/opinion/index.js.map +1 -0
- package/dist/skills/bundled/opportunity/index.d.ts +25 -0
- package/dist/skills/bundled/opportunity/index.js +289 -0
- package/dist/skills/bundled/opportunity/index.js.map +1 -0
- package/dist/skills/bundled/orca/index.d.ts +12 -0
- package/dist/skills/bundled/orca/index.js +663 -0
- package/dist/skills/bundled/orca/index.js.map +1 -0
- package/dist/skills/bundled/pairing/index.d.ts +24 -0
- package/dist/skills/bundled/pairing/index.js +228 -0
- package/dist/skills/bundled/pairing/index.js.map +1 -0
- package/dist/skills/bundled/percolator/index.d.ts +20 -0
- package/dist/skills/bundled/percolator/index.js +229 -0
- package/dist/skills/bundled/percolator/index.js.map +1 -0
- package/dist/skills/bundled/permissions/index.d.ts +21 -0
- package/dist/skills/bundled/permissions/index.js +204 -0
- package/dist/skills/bundled/permissions/index.js.map +1 -0
- package/dist/skills/bundled/plugins/index.d.ts +20 -0
- package/dist/skills/bundled/plugins/index.js +209 -0
- package/dist/skills/bundled/plugins/index.js.map +1 -0
- package/dist/skills/bundled/portfolio/index.d.ts +20 -0
- package/dist/skills/bundled/portfolio/index.js +367 -0
- package/dist/skills/bundled/portfolio/index.js.map +1 -0
- package/dist/skills/bundled/portfolio-sync/index.d.ts +17 -0
- package/dist/skills/bundled/portfolio-sync/index.js +116 -0
- package/dist/skills/bundled/portfolio-sync/index.js.map +1 -0
- package/dist/skills/bundled/positions/index.d.ts +18 -0
- package/dist/skills/bundled/positions/index.js +161 -0
- package/dist/skills/bundled/positions/index.js.map +1 -0
- package/dist/skills/bundled/predictfun/index.d.ts +13 -0
- package/dist/skills/bundled/predictfun/index.js +612 -0
- package/dist/skills/bundled/predictfun/index.js.map +1 -0
- package/dist/skills/bundled/predictit/index.d.ts +16 -0
- package/dist/skills/bundled/predictit/index.js +138 -0
- package/dist/skills/bundled/predictit/index.js.map +1 -0
- package/dist/skills/bundled/presence/index.d.ts +18 -0
- package/dist/skills/bundled/presence/index.js +151 -0
- package/dist/skills/bundled/presence/index.js.map +1 -0
- package/dist/skills/bundled/processes/index.d.ts +17 -0
- package/dist/skills/bundled/processes/index.js +121 -0
- package/dist/skills/bundled/processes/index.js.map +1 -0
- package/dist/skills/bundled/pump-swarm/index.d.ts +16 -0
- package/dist/skills/bundled/pump-swarm/index.js +2235 -0
- package/dist/skills/bundled/pump-swarm/index.js.map +1 -0
- package/dist/skills/bundled/pumpfun/index.d.ts +47 -0
- package/dist/skills/bundled/pumpfun/index.js +1400 -0
- package/dist/skills/bundled/pumpfun/index.js.map +1 -0
- package/dist/skills/bundled/qmd/index.d.ts +18 -0
- package/dist/skills/bundled/qmd/index.js +116 -0
- package/dist/skills/bundled/qmd/index.js.map +1 -0
- package/dist/skills/bundled/qrcoin/index.d.ts +92 -0
- package/dist/skills/bundled/qrcoin/index.js +328 -0
- package/dist/skills/bundled/qrcoin/index.js.map +1 -0
- package/dist/skills/bundled/raydium/index.d.ts +35 -0
- package/dist/skills/bundled/raydium/index.js +695 -0
- package/dist/skills/bundled/raydium/index.js.map +1 -0
- package/dist/skills/bundled/remote/index.d.ts +19 -0
- package/dist/skills/bundled/remote/index.js +186 -0
- package/dist/skills/bundled/remote/index.js.map +1 -0
- package/dist/skills/bundled/research/index.d.ts +17 -0
- package/dist/skills/bundled/research/index.js +185 -0
- package/dist/skills/bundled/research/index.js.map +1 -0
- package/dist/skills/bundled/risk/index.d.ts +31 -0
- package/dist/skills/bundled/risk/index.js +379 -0
- package/dist/skills/bundled/risk/index.js.map +1 -0
- package/dist/skills/bundled/router/index.d.ts +17 -0
- package/dist/skills/bundled/router/index.js +160 -0
- package/dist/skills/bundled/router/index.js.map +1 -0
- package/dist/skills/bundled/routing/index.d.ts +23 -0
- package/dist/skills/bundled/routing/index.js +257 -0
- package/dist/skills/bundled/routing/index.js.map +1 -0
- package/dist/skills/bundled/sandbox/index.d.ts +18 -0
- package/dist/skills/bundled/sandbox/index.js +119 -0
- package/dist/skills/bundled/sandbox/index.js.map +1 -0
- package/dist/skills/bundled/search-config/index.d.ts +18 -0
- package/dist/skills/bundled/search-config/index.js +170 -0
- package/dist/skills/bundled/search-config/index.js.map +1 -0
- package/dist/skills/bundled/sessions/index.d.ts +29 -0
- package/dist/skills/bundled/sessions/index.js +193 -0
- package/dist/skills/bundled/sessions/index.js.map +1 -0
- package/dist/skills/bundled/shield/index.d.ts +22 -0
- package/dist/skills/bundled/shield/index.js +245 -0
- package/dist/skills/bundled/shield/index.js.map +1 -0
- package/dist/skills/bundled/signals/index.d.ts +24 -0
- package/dist/skills/bundled/signals/index.js +776 -0
- package/dist/skills/bundled/signals/index.js.map +1 -0
- package/dist/skills/bundled/sizing/index.d.ts +16 -0
- package/dist/skills/bundled/sizing/index.js +168 -0
- package/dist/skills/bundled/sizing/index.js.map +1 -0
- package/dist/skills/bundled/slippage/index.d.ts +16 -0
- package/dist/skills/bundled/slippage/index.js +111 -0
- package/dist/skills/bundled/slippage/index.js.map +1 -0
- package/dist/skills/bundled/smarkets/index.d.ts +23 -0
- package/dist/skills/bundled/smarkets/index.js +473 -0
- package/dist/skills/bundled/smarkets/index.js.map +1 -0
- package/dist/skills/bundled/strategy/index.d.ts +18 -0
- package/dist/skills/bundled/strategy/index.js +168 -0
- package/dist/skills/bundled/strategy/index.js.map +1 -0
- package/dist/skills/bundled/streaming/index.d.ts +19 -0
- package/dist/skills/bundled/streaming/index.js +147 -0
- package/dist/skills/bundled/streaming/index.js.map +1 -0
- package/dist/skills/bundled/tailscale/index.d.ts +18 -0
- package/dist/skills/bundled/tailscale/index.js +173 -0
- package/dist/skills/bundled/tailscale/index.js.map +1 -0
- package/dist/skills/bundled/ticks/index.d.ts +17 -0
- package/dist/skills/bundled/ticks/index.js +287 -0
- package/dist/skills/bundled/ticks/index.js.map +1 -0
- package/dist/skills/bundled/token-security/index.d.ts +19 -0
- package/dist/skills/bundled/token-security/index.js +138 -0
- package/dist/skills/bundled/token-security/index.js.map +1 -0
- package/dist/skills/bundled/trading-evm/index.d.ts +19 -0
- package/dist/skills/bundled/trading-evm/index.js +302 -0
- package/dist/skills/bundled/trading-evm/index.js.map +1 -0
- package/dist/skills/bundled/trading-futures/index.d.ts +14 -0
- package/dist/skills/bundled/trading-futures/index.js +874 -0
- package/dist/skills/bundled/trading-futures/index.js.map +1 -0
- package/dist/skills/bundled/trading-kalshi/index.d.ts +36 -0
- package/dist/skills/bundled/trading-kalshi/index.js +1199 -0
- package/dist/skills/bundled/trading-kalshi/index.js.map +1 -0
- package/dist/skills/bundled/trading-manifold/index.d.ts +23 -0
- package/dist/skills/bundled/trading-manifold/index.js +391 -0
- package/dist/skills/bundled/trading-manifold/index.js.map +1 -0
- package/dist/skills/bundled/trading-polymarket/index.d.ts +27 -0
- package/dist/skills/bundled/trading-polymarket/index.js +1321 -0
- package/dist/skills/bundled/trading-polymarket/index.js.map +1 -0
- package/dist/skills/bundled/trading-solana/index.d.ts +19 -0
- package/dist/skills/bundled/trading-solana/index.js +383 -0
- package/dist/skills/bundled/trading-solana/index.js.map +1 -0
- package/dist/skills/bundled/trading-system/index.d.ts +22 -0
- package/dist/skills/bundled/trading-system/index.js +355 -0
- package/dist/skills/bundled/trading-system/index.js.map +1 -0
- package/dist/skills/bundled/triggers/index.d.ts +18 -0
- package/dist/skills/bundled/triggers/index.js +172 -0
- package/dist/skills/bundled/triggers/index.js.map +1 -0
- package/dist/skills/bundled/tts/index.d.ts +16 -0
- package/dist/skills/bundled/tts/index.js +150 -0
- package/dist/skills/bundled/tts/index.js.map +1 -0
- package/dist/skills/bundled/tweet-ideas/index.d.ts +20 -0
- package/dist/skills/bundled/tweet-ideas/index.js +470 -0
- package/dist/skills/bundled/tweet-ideas/index.js.map +1 -0
- package/dist/skills/bundled/usage/index.d.ts +17 -0
- package/dist/skills/bundled/usage/index.js +145 -0
- package/dist/skills/bundled/usage/index.js.map +1 -0
- package/dist/skills/bundled/veil/index.d.ts +79 -0
- package/dist/skills/bundled/veil/index.js +322 -0
- package/dist/skills/bundled/veil/index.js.map +1 -0
- package/dist/skills/bundled/verify/index.d.ts +20 -0
- package/dist/skills/bundled/verify/index.js +157 -0
- package/dist/skills/bundled/verify/index.js.map +1 -0
- package/dist/skills/bundled/virtuals/index.d.ts +20 -0
- package/dist/skills/bundled/virtuals/index.js +255 -0
- package/dist/skills/bundled/virtuals/index.js.map +1 -0
- package/dist/skills/bundled/voice/index.d.ts +18 -0
- package/dist/skills/bundled/voice/index.js +190 -0
- package/dist/skills/bundled/voice/index.js.map +1 -0
- package/dist/skills/bundled/weather/index.d.ts +20 -0
- package/dist/skills/bundled/weather/index.js +475 -0
- package/dist/skills/bundled/weather/index.js.map +1 -0
- package/dist/skills/bundled/webhooks/index.d.ts +18 -0
- package/dist/skills/bundled/webhooks/index.js +136 -0
- package/dist/skills/bundled/webhooks/index.js.map +1 -0
- package/dist/skills/bundled/whale-tracking/index.d.ts +18 -0
- package/dist/skills/bundled/whale-tracking/index.js +441 -0
- package/dist/skills/bundled/whale-tracking/index.js.map +1 -0
- package/dist/skills/bundled/yoink/index.d.ts +78 -0
- package/dist/skills/bundled/yoink/index.js +236 -0
- package/dist/skills/bundled/yoink/index.js.map +1 -0
- package/dist/skills/executor.d.ts +117 -0
- package/dist/skills/executor.js +469 -0
- package/dist/skills/executor.js.map +1 -0
- package/dist/skills/frontmatter.d.ts +69 -0
- package/dist/skills/frontmatter.js +187 -0
- package/dist/skills/frontmatter.js.map +1 -0
- package/dist/skills/index.d.ts +150 -0
- package/dist/skills/index.js +531 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +48 -0
- package/dist/skills/loader.js +594 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts +94 -0
- package/dist/skills/registry.js +308 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/solana/copytrade.d.ts +116 -0
- package/dist/solana/copytrade.js +493 -0
- package/dist/solana/copytrade.js.map +1 -0
- package/dist/solana/drift.d.ts +154 -0
- package/dist/solana/drift.js +599 -0
- package/dist/solana/drift.js.map +1 -0
- package/dist/solana/jupiter.d.ts +283 -0
- package/dist/solana/jupiter.js +553 -0
- package/dist/solana/jupiter.js.map +1 -0
- package/dist/solana/kamino.d.ts +206 -0
- package/dist/solana/kamino.js +546 -0
- package/dist/solana/kamino.js.map +1 -0
- package/dist/solana/meteora-dbc.d.ts +430 -0
- package/dist/solana/meteora-dbc.js +1105 -0
- package/dist/solana/meteora-dbc.js.map +1 -0
- package/dist/solana/meteora.d.ts +232 -0
- package/dist/solana/meteora.js +682 -0
- package/dist/solana/meteora.js.map +1 -0
- package/dist/solana/orca.d.ts +163 -0
- package/dist/solana/orca.js +378 -0
- package/dist/solana/orca.js.map +1 -0
- package/dist/solana/pools.d.ts +26 -0
- package/dist/solana/pools.js +96 -0
- package/dist/solana/pools.js.map +1 -0
- package/dist/solana/pump-swarm.d.ts +349 -0
- package/dist/solana/pump-swarm.js +1663 -0
- package/dist/solana/pump-swarm.js.map +1 -0
- package/dist/solana/pumpapi.d.ts +196 -0
- package/dist/solana/pumpapi.js +462 -0
- package/dist/solana/pumpapi.js.map +1 -0
- package/dist/solana/raydium.d.ts +170 -0
- package/dist/solana/raydium.js +673 -0
- package/dist/solana/raydium.js.map +1 -0
- package/dist/solana/swarm-ai-builder.d.ts +97 -0
- package/dist/solana/swarm-ai-builder.js +571 -0
- package/dist/solana/swarm-ai-builder.js.map +1 -0
- package/dist/solana/swarm-arbitrage.d.ts +111 -0
- package/dist/solana/swarm-arbitrage.js +437 -0
- package/dist/solana/swarm-arbitrage.js.map +1 -0
- package/dist/solana/swarm-builders.d.ts +71 -0
- package/dist/solana/swarm-builders.js +402 -0
- package/dist/solana/swarm-builders.js.map +1 -0
- package/dist/solana/swarm-copytrade.d.ts +103 -0
- package/dist/solana/swarm-copytrade.js +420 -0
- package/dist/solana/swarm-copytrade.js.map +1 -0
- package/dist/solana/swarm-presets.d.ts +49 -0
- package/dist/solana/swarm-presets.js +282 -0
- package/dist/solana/swarm-presets.js.map +1 -0
- package/dist/solana/swarm-signals.d.ts +128 -0
- package/dist/solana/swarm-signals.js +529 -0
- package/dist/solana/swarm-signals.js.map +1 -0
- package/dist/solana/swarm-strategies.d.ts +230 -0
- package/dist/solana/swarm-strategies.js +611 -0
- package/dist/solana/swarm-strategies.js.map +1 -0
- package/dist/solana/tokenlist.d.ts +10 -0
- package/dist/solana/tokenlist.js +54 -0
- package/dist/solana/tokenlist.js.map +1 -0
- package/dist/solana/wallet.d.ts +12 -0
- package/dist/solana/wallet.js +90 -0
- package/dist/solana/wallet.js.map +1 -0
- package/dist/strategies/crypto-hft/index.d.ts +46 -0
- package/dist/strategies/crypto-hft/index.js +469 -0
- package/dist/strategies/crypto-hft/index.js.map +1 -0
- package/dist/strategies/crypto-hft/market-scanner.d.ts +26 -0
- package/dist/strategies/crypto-hft/market-scanner.js +177 -0
- package/dist/strategies/crypto-hft/market-scanner.js.map +1 -0
- package/dist/strategies/crypto-hft/orderbook.d.ts +37 -0
- package/dist/strategies/crypto-hft/orderbook.js +184 -0
- package/dist/strategies/crypto-hft/orderbook.js.map +1 -0
- package/dist/strategies/crypto-hft/positions.d.ts +49 -0
- package/dist/strategies/crypto-hft/positions.js +376 -0
- package/dist/strategies/crypto-hft/positions.js.map +1 -0
- package/dist/strategies/crypto-hft/presets.d.ts +11 -0
- package/dist/strategies/crypto-hft/presets.js +164 -0
- package/dist/strategies/crypto-hft/presets.js.map +1 -0
- package/dist/strategies/crypto-hft/strategies.d.ts +96 -0
- package/dist/strategies/crypto-hft/strategies.js +330 -0
- package/dist/strategies/crypto-hft/strategies.js.map +1 -0
- package/dist/strategies/crypto-hft/types.d.ts +196 -0
- package/dist/strategies/crypto-hft/types.js +32 -0
- package/dist/strategies/crypto-hft/types.js.map +1 -0
- package/dist/strategies/hft-divergence/detector.d.ts +29 -0
- package/dist/strategies/hft-divergence/detector.js +182 -0
- package/dist/strategies/hft-divergence/detector.js.map +1 -0
- package/dist/strategies/hft-divergence/index.d.ts +12 -0
- package/dist/strategies/hft-divergence/index.js +19 -0
- package/dist/strategies/hft-divergence/index.js.map +1 -0
- package/dist/strategies/hft-divergence/market-rotator.d.ts +17 -0
- package/dist/strategies/hft-divergence/market-rotator.js +128 -0
- package/dist/strategies/hft-divergence/market-rotator.js.map +1 -0
- package/dist/strategies/hft-divergence/position-manager.d.ts +35 -0
- package/dist/strategies/hft-divergence/position-manager.js +188 -0
- package/dist/strategies/hft-divergence/position-manager.js.map +1 -0
- package/dist/strategies/hft-divergence/strategy.d.ts +31 -0
- package/dist/strategies/hft-divergence/strategy.js +295 -0
- package/dist/strategies/hft-divergence/strategy.js.map +1 -0
- package/dist/strategies/hft-divergence/types.d.ts +114 -0
- package/dist/strategies/hft-divergence/types.js +10 -0
- package/dist/strategies/hft-divergence/types.js.map +1 -0
- package/dist/streaming/index.d.ts +70 -0
- package/dist/streaming/index.js +296 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/tailscale/index.d.ts +139 -0
- package/dist/tailscale/index.js +345 -0
- package/dist/tailscale/index.js.map +1 -0
- package/dist/telemetry/index.d.ts +143 -0
- package/dist/telemetry/index.js +535 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/terminal/index.d.ts +121 -0
- package/dist/terminal/index.js +548 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/token-security/index.d.ts +36 -0
- package/dist/token-security/index.js +253 -0
- package/dist/token-security/index.js.map +1 -0
- package/dist/tools/browser.d.ts +128 -0
- package/dist/tools/browser.js +459 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/canvas.d.ts +93 -0
- package/dist/tools/canvas.js +349 -0
- package/dist/tools/canvas.js.map +1 -0
- package/dist/tools/docker.d.ts +59 -0
- package/dist/tools/docker.js +191 -0
- package/dist/tools/docker.js.map +1 -0
- package/dist/tools/email.d.ts +25 -0
- package/dist/tools/email.js +131 -0
- package/dist/tools/email.js.map +1 -0
- package/dist/tools/exec.d.ts +81 -0
- package/dist/tools/exec.js +373 -0
- package/dist/tools/exec.js.map +1 -0
- package/dist/tools/files.d.ts +46 -0
- package/dist/tools/files.js +185 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/git.d.ts +29 -0
- package/dist/tools/git.js +105 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/image.d.ts +57 -0
- package/dist/tools/image.js +308 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/index.d.ts +39 -0
- package/dist/tools/index.js +46 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/message.d.ts +99 -0
- package/dist/tools/message.js +200 -0
- package/dist/tools/message.js.map +1 -0
- package/dist/tools/nodes.d.ts +134 -0
- package/dist/tools/nodes.js +357 -0
- package/dist/tools/nodes.js.map +1 -0
- package/dist/tools/sessions.d.ts +60 -0
- package/dist/tools/sessions.js +119 -0
- package/dist/tools/sessions.js.map +1 -0
- package/dist/tools/shell-history.d.ts +17 -0
- package/dist/tools/shell-history.js +118 -0
- package/dist/tools/shell-history.js.map +1 -0
- package/dist/tools/sms.d.ts +18 -0
- package/dist/tools/sms.js +66 -0
- package/dist/tools/sms.js.map +1 -0
- package/dist/tools/sql.d.ts +19 -0
- package/dist/tools/sql.js +91 -0
- package/dist/tools/sql.js.map +1 -0
- package/dist/tools/transcription.d.ts +13 -0
- package/dist/tools/transcription.js +99 -0
- package/dist/tools/transcription.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +69 -0
- package/dist/tools/web-fetch.js +251 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +58 -0
- package/dist/tools/web-search.js +204 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/webhooks.d.ts +74 -0
- package/dist/tools/webhooks.js +165 -0
- package/dist/tools/webhooks.js.map +1 -0
- package/dist/trading/accounts.d.ts +167 -0
- package/dist/trading/accounts.js +394 -0
- package/dist/trading/accounts.js.map +1 -0
- package/dist/trading/adapters/index.d.ts +27 -0
- package/dist/trading/adapters/index.js +165 -0
- package/dist/trading/adapters/index.js.map +1 -0
- package/dist/trading/backtest.d.ts +161 -0
- package/dist/trading/backtest.js +665 -0
- package/dist/trading/backtest.js.map +1 -0
- package/dist/trading/bots/index.d.ts +196 -0
- package/dist/trading/bots/index.js +688 -0
- package/dist/trading/bots/index.js.map +1 -0
- package/dist/trading/bridge.d.ts +33 -0
- package/dist/trading/bridge.js +121 -0
- package/dist/trading/bridge.js.map +1 -0
- package/dist/trading/builder.d.ts +102 -0
- package/dist/trading/builder.js +430 -0
- package/dist/trading/builder.js.map +1 -0
- package/dist/trading/copy-trading.d.ts +125 -0
- package/dist/trading/copy-trading.js +611 -0
- package/dist/trading/copy-trading.js.map +1 -0
- package/dist/trading/devtools.d.ts +172 -0
- package/dist/trading/devtools.js +425 -0
- package/dist/trading/devtools.js.map +1 -0
- package/dist/trading/futures/index.d.ts +981 -0
- package/dist/trading/futures/index.js +4011 -0
- package/dist/trading/futures/index.js.map +1 -0
- package/dist/trading/index.d.ts +102 -0
- package/dist/trading/index.js +310 -0
- package/dist/trading/index.js.map +1 -0
- package/dist/trading/kelly.d.ts +137 -0
- package/dist/trading/kelly.js +328 -0
- package/dist/trading/kelly.js.map +1 -0
- package/dist/trading/logger.d.ts +163 -0
- package/dist/trading/logger.js +424 -0
- package/dist/trading/logger.js.map +1 -0
- package/dist/trading/market-making/engine.d.ts +44 -0
- package/dist/trading/market-making/engine.js +165 -0
- package/dist/trading/market-making/engine.js.map +1 -0
- package/dist/trading/market-making/index.d.ts +10 -0
- package/dist/trading/market-making/index.js +29 -0
- package/dist/trading/market-making/index.js.map +1 -0
- package/dist/trading/market-making/strategy.d.ts +25 -0
- package/dist/trading/market-making/strategy.js +250 -0
- package/dist/trading/market-making/strategy.js.map +1 -0
- package/dist/trading/market-making/types.d.ts +92 -0
- package/dist/trading/market-making/types.js +6 -0
- package/dist/trading/market-making/types.js.map +1 -0
- package/dist/trading/ml-signals.d.ts +175 -0
- package/dist/trading/ml-signals.js +548 -0
- package/dist/trading/ml-signals.js.map +1 -0
- package/dist/trading/orchestrator.d.ts +59 -0
- package/dist/trading/orchestrator.js +199 -0
- package/dist/trading/orchestrator.js.map +1 -0
- package/dist/trading/position-bridge.d.ts +41 -0
- package/dist/trading/position-bridge.js +178 -0
- package/dist/trading/position-bridge.js.map +1 -0
- package/dist/trading/resilience.d.ts +81 -0
- package/dist/trading/resilience.js +257 -0
- package/dist/trading/resilience.js.map +1 -0
- package/dist/trading/risk.d.ts +18 -0
- package/dist/trading/risk.js +91 -0
- package/dist/trading/risk.js.map +1 -0
- package/dist/trading/safety.d.ts +114 -0
- package/dist/trading/safety.js +372 -0
- package/dist/trading/safety.js.map +1 -0
- package/dist/trading/secrets.d.ts +48 -0
- package/dist/trading/secrets.js +243 -0
- package/dist/trading/secrets.js.map +1 -0
- package/dist/trading/state.d.ts +88 -0
- package/dist/trading/state.js +221 -0
- package/dist/trading/state.js.map +1 -0
- package/dist/trading/stream.d.ts +121 -0
- package/dist/trading/stream.js +396 -0
- package/dist/trading/stream.js.map +1 -0
- package/dist/trading/tracking.d.ts +136 -0
- package/dist/trading/tracking.js +512 -0
- package/dist/trading/tracking.js.map +1 -0
- package/dist/tts/index.d.ts +28 -0
- package/dist/tts/index.js +64 -0
- package/dist/tts/index.js.map +1 -0
- package/dist/tui/index.d.ts +159 -0
- package/dist/tui/index.js +580 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/types.d.ts +1373 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/usage/index.d.ts +57 -0
- package/dist/usage/index.js +191 -0
- package/dist/usage/index.js.map +1 -0
- package/dist/utils/attachments.d.ts +12 -0
- package/dist/utils/attachments.js +104 -0
- package/dist/utils/attachments.js.map +1 -0
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.js +474 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/http.d.ts +22 -0
- package/dist/utils/http.js +191 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/id.d.ts +21 -0
- package/dist/utils/id.js +41 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/json-utils.d.ts +201 -0
- package/dist/utils/json-utils.js +151 -0
- package/dist/utils/json-utils.js.map +1 -0
- package/dist/utils/kalshi-auth.d.ts +10 -0
- package/dist/utils/kalshi-auth.js +48 -0
- package/dist/utils/kalshi-auth.js.map +1 -0
- package/dist/utils/kelly.d.ts +153 -0
- package/dist/utils/kelly.js +322 -0
- package/dist/utils/kelly.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.js +26 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/opinion-auth.d.ts +17 -0
- package/dist/utils/opinion-auth.js +25 -0
- package/dist/utils/opinion-auth.js.map +1 -0
- package/dist/utils/polymarket-auth.d.ts +11 -0
- package/dist/utils/polymarket-auth.js +32 -0
- package/dist/utils/polymarket-auth.js.map +1 -0
- package/dist/utils/polymarket-order-signer.d.ts +118 -0
- package/dist/utils/polymarket-order-signer.js +329 -0
- package/dist/utils/polymarket-order-signer.js.map +1 -0
- package/dist/utils/polymarket-setup.d.ts +70 -0
- package/dist/utils/polymarket-setup.js +288 -0
- package/dist/utils/polymarket-setup.js.map +1 -0
- package/dist/utils/production.d.ts +112 -0
- package/dist/utils/production.js +294 -0
- package/dist/utils/production.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +77 -0
- package/dist/utils/rate-limiter.js +271 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/webhook-security.d.ts +63 -0
- package/dist/utils/webhook-security.js +183 -0
- package/dist/utils/webhook-security.js.map +1 -0
- package/dist/voice/index.d.ts +125 -0
- package/dist/voice/index.js +557 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/weather/edge.d.ts +70 -0
- package/dist/weather/edge.js +281 -0
- package/dist/weather/edge.js.map +1 -0
- package/dist/weather/index.d.ts +6 -0
- package/dist/weather/index.js +23 -0
- package/dist/weather/index.js.map +1 -0
- package/dist/weather/markets.d.ts +84 -0
- package/dist/weather/markets.js +320 -0
- package/dist/weather/markets.js.map +1 -0
- package/dist/weather/noaa.d.ts +113 -0
- package/dist/weather/noaa.js +287 -0
- package/dist/weather/noaa.js.map +1 -0
- package/dist/web/index.d.ts +112 -0
- package/dist/web/index.js +639 -0
- package/dist/web/index.js.map +1 -0
- package/dist/wizard/index.d.ts +27 -0
- package/dist/wizard/index.js +186 -0
- package/dist/wizard/index.js.map +1 -0
- package/dist/workspace/index.d.ts +73 -0
- package/dist/workspace/index.js +403 -0
- package/dist/workspace/index.js.map +1 -0
- package/package.json +168 -0
|
@@ -0,0 +1,2532 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Execution Service - Native TypeScript order execution
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Limit orders (GTC, GTD)
|
|
7
|
+
* - Market orders (FOK)
|
|
8
|
+
* - Maker orders (GTC with postOnly flag)
|
|
9
|
+
* - Order cancellation
|
|
10
|
+
* - Open orders management
|
|
11
|
+
*
|
|
12
|
+
* Supports: Polymarket, Kalshi
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
48
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
49
|
+
};
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.POLYMARKET_EXCHANGES = void 0;
|
|
52
|
+
exports.checkPolymarketNegRisk = checkPolymarketNegRisk;
|
|
53
|
+
exports.getPolymarketExchange = getPolymarketExchange;
|
|
54
|
+
exports.getPolymarketTickSize = getPolymarketTickSize;
|
|
55
|
+
exports.validatePriceTickSize = validatePriceTickSize;
|
|
56
|
+
exports.getPolymarketNegRiskCached = getPolymarketNegRiskCached;
|
|
57
|
+
exports.getPolymarketFeeRate = getPolymarketFeeRate;
|
|
58
|
+
exports.getPolymarketOrderbookCached = getPolymarketOrderbookCached;
|
|
59
|
+
exports.validatePostOnly = validatePostOnly;
|
|
60
|
+
exports.getPolymarketBalance = getPolymarketBalance;
|
|
61
|
+
exports.getPolymarketPositions = getPolymarketPositions;
|
|
62
|
+
exports.getPolymarketTrades = getPolymarketTrades;
|
|
63
|
+
exports.calculateOrderbookImbalance = calculateOrderbookImbalance;
|
|
64
|
+
exports.getOrderbookImbalance = getOrderbookImbalance;
|
|
65
|
+
exports.createExecutionService = createExecutionService;
|
|
66
|
+
const crypto_1 = require("crypto");
|
|
67
|
+
const logger_1 = require("../utils/logger");
|
|
68
|
+
const polymarket_auth_1 = require("../utils/polymarket-auth");
|
|
69
|
+
const polymarket_order_signer_1 = require("../utils/polymarket-order-signer");
|
|
70
|
+
const kalshi_auth_1 = require("../utils/kalshi-auth");
|
|
71
|
+
const opinion = __importStar(require("../exchanges/opinion"));
|
|
72
|
+
const predictfun = __importStar(require("../exchanges/predictfun"));
|
|
73
|
+
const user_ws_1 = require("../feeds/polymarket/user-ws");
|
|
74
|
+
// =============================================================================
|
|
75
|
+
// POLYMARKET EXECUTION
|
|
76
|
+
// =============================================================================
|
|
77
|
+
// API URLs (configurable for testnet)
|
|
78
|
+
const POLY_CLOB_URL = process.env.POLY_CLOB_URL || 'https://clob.polymarket.com';
|
|
79
|
+
// Exchange contract addresses (configurable via env for testnet support)
|
|
80
|
+
// Mainnet (default):
|
|
81
|
+
// CTF: 0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E
|
|
82
|
+
// NEG_RISK: 0xC5d563A36AE78145C45a50134d48A1215220f80a
|
|
83
|
+
// Amoy Testnet:
|
|
84
|
+
// POLY_CLOB_URL=https://clob.polymarket.com (same)
|
|
85
|
+
// POLY_CTF_EXCHANGE=0xdFE02Eb6733538f8Ea35D585af8DE5958AD99E40
|
|
86
|
+
// POLY_NEG_RISK_CTF_EXCHANGE=0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296
|
|
87
|
+
const POLY_CTF_EXCHANGE = process.env.POLY_CTF_EXCHANGE || '0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E';
|
|
88
|
+
const POLY_NEG_RISK_CTF_EXCHANGE = process.env.POLY_NEG_RISK_CTF_EXCHANGE || '0xC5d563A36AE78145C45a50134d48A1215220f80a';
|
|
89
|
+
/**
|
|
90
|
+
* Retry helper with exponential backoff for Polymarket REST API calls
|
|
91
|
+
* Retries on: network errors, 5xx server errors, 429 rate limit
|
|
92
|
+
* Does NOT retry on: 4xx client errors (bad request, unauthorized, etc.)
|
|
93
|
+
*/
|
|
94
|
+
async function polymarketRetryWithBackoff(operation, maxAttempts = 3, baseDelayMs = 1000) {
|
|
95
|
+
let lastError = null;
|
|
96
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
97
|
+
try {
|
|
98
|
+
const result = await operation();
|
|
99
|
+
// Retry on 5xx or 429
|
|
100
|
+
if (result.response.status >= 500 || result.response.status === 429) {
|
|
101
|
+
if (attempt < maxAttempts) {
|
|
102
|
+
const delay = baseDelayMs * Math.pow(2, attempt - 1);
|
|
103
|
+
logger_1.logger.warn({ status: result.response.status, attempt, delay }, 'Polymarket API error, retrying...');
|
|
104
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
112
|
+
if (attempt < maxAttempts) {
|
|
113
|
+
const delay = baseDelayMs * Math.pow(2, attempt - 1);
|
|
114
|
+
logger_1.logger.warn({ error: lastError.message, attempt, delay }, 'Polymarket API network error, retrying...');
|
|
115
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
throw lastError || new Error('Polymarket API request failed after retries');
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if a token is a negative risk market (crypto 15-min markets)
|
|
123
|
+
*/
|
|
124
|
+
async function checkPolymarketNegRisk(tokenId) {
|
|
125
|
+
try {
|
|
126
|
+
const response = await fetch(`${POLY_CLOB_URL}/neg-risk?token_id=${tokenId}`);
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
const data = (await response.json());
|
|
131
|
+
return data.neg_risk === true;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get the appropriate exchange address for a market
|
|
139
|
+
*/
|
|
140
|
+
function getPolymarketExchange(negRisk) {
|
|
141
|
+
return negRisk ? POLY_NEG_RISK_CTF_EXCHANGE : POLY_CTF_EXCHANGE;
|
|
142
|
+
}
|
|
143
|
+
// Cache for tick sizes, neg risk status, fee rates, and orderbooks
|
|
144
|
+
const tickSizeCache = new Map();
|
|
145
|
+
const negRiskCache = new Map();
|
|
146
|
+
const feeRateCache = new Map();
|
|
147
|
+
const orderbookCache = new Map();
|
|
148
|
+
const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour for static data
|
|
149
|
+
const ORDERBOOK_CACHE_TTL_MS = 5000; // 5 seconds for orderbook (needs to be fresh)
|
|
150
|
+
// Nonce tracking to prevent duplicate orders
|
|
151
|
+
// Uses atomic counter to avoid race conditions in concurrent async operations
|
|
152
|
+
// Format: timestamp_base + counter ensures uniqueness across restarts and within process
|
|
153
|
+
const nonceBase = BigInt(Date.now()) * 1000000n; // Timestamp * 1M for counter space
|
|
154
|
+
let nonceCounter = 0n;
|
|
155
|
+
function getNextNonce() {
|
|
156
|
+
// Atomic increment - JavaScript is single-threaded so this is safe
|
|
157
|
+
// but we use BigInt to avoid Number precision issues at high counts
|
|
158
|
+
nonceCounter += 1n;
|
|
159
|
+
return (nonceBase + nonceCounter).toString();
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get tick size for a token (from orderbook endpoint)
|
|
163
|
+
* Valid tick sizes: "0.1", "0.01", "0.001", "0.0001"
|
|
164
|
+
*/
|
|
165
|
+
async function getPolymarketTickSize(tokenId) {
|
|
166
|
+
// Check cache
|
|
167
|
+
const cached = tickSizeCache.get(tokenId);
|
|
168
|
+
if (cached && Date.now() - cached.cachedAt < CACHE_TTL_MS) {
|
|
169
|
+
return cached.tickSize;
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const response = await fetch(`${POLY_CLOB_URL}/book?token_id=${tokenId}`);
|
|
173
|
+
if (!response.ok) {
|
|
174
|
+
return '0.01'; // Default tick size
|
|
175
|
+
}
|
|
176
|
+
const data = await response.json();
|
|
177
|
+
const tickSize = data.tick_size || '0.01';
|
|
178
|
+
tickSizeCache.set(tokenId, { tickSize, cachedAt: Date.now() });
|
|
179
|
+
return tickSize;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return '0.01';
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Validate price against tick size
|
|
187
|
+
* Returns error message if invalid, null if valid
|
|
188
|
+
*/
|
|
189
|
+
function validatePriceTickSize(price, tickSize) {
|
|
190
|
+
const tick = parseFloat(tickSize);
|
|
191
|
+
if (tick <= 0)
|
|
192
|
+
return null; // Skip validation if tick size invalid
|
|
193
|
+
// Check if price is a multiple of tick size (with floating point tolerance)
|
|
194
|
+
const remainder = Math.abs((price * 10000) % (tick * 10000)) / 10000;
|
|
195
|
+
const tolerance = tick / 100; // 1% of tick size tolerance for floating point
|
|
196
|
+
if (remainder > tolerance && remainder < tick - tolerance) {
|
|
197
|
+
return `Price ${price} is not a valid tick size increment. Must be multiple of ${tickSize}`;
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Get neg risk status with caching
|
|
203
|
+
*/
|
|
204
|
+
async function getPolymarketNegRiskCached(tokenId) {
|
|
205
|
+
// Check cache
|
|
206
|
+
const cached = negRiskCache.get(tokenId);
|
|
207
|
+
if (cached && Date.now() - cached.cachedAt < CACHE_TTL_MS) {
|
|
208
|
+
return cached.negRisk;
|
|
209
|
+
}
|
|
210
|
+
const negRisk = await checkPolymarketNegRisk(tokenId);
|
|
211
|
+
negRiskCache.set(tokenId, { negRisk, cachedAt: Date.now() });
|
|
212
|
+
return negRisk;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get fee rate in basis points for a token
|
|
216
|
+
* Crypto 15-min markets have higher fees due to negative risk
|
|
217
|
+
*/
|
|
218
|
+
async function getPolymarketFeeRate(tokenId) {
|
|
219
|
+
// Check cache
|
|
220
|
+
const cached = feeRateCache.get(tokenId);
|
|
221
|
+
if (cached && Date.now() - cached.cachedAt < CACHE_TTL_MS) {
|
|
222
|
+
return cached.feeRateBps;
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
// Fee rate depends on neg_risk status
|
|
226
|
+
// Standard markets: 0 bps maker, ~2% taker
|
|
227
|
+
// Neg risk (crypto): higher fees
|
|
228
|
+
const negRisk = await getPolymarketNegRiskCached(tokenId);
|
|
229
|
+
// Polymarket fee formula for neg risk: shares × 0.25 × (price × (1 - price))²
|
|
230
|
+
// Simplified: ~0-50 bps depending on price
|
|
231
|
+
const feeRateBps = negRisk ? 25 : 0; // Approximate - actual varies by price
|
|
232
|
+
feeRateCache.set(tokenId, { feeRateBps, cachedAt: Date.now() });
|
|
233
|
+
return feeRateBps;
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return 0;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Get orderbook with caching (5 second TTL)
|
|
241
|
+
*/
|
|
242
|
+
async function getPolymarketOrderbookCached(tokenId) {
|
|
243
|
+
// Check cache
|
|
244
|
+
const cached = orderbookCache.get(tokenId);
|
|
245
|
+
if (cached && Date.now() - cached.cachedAt < ORDERBOOK_CACHE_TTL_MS) {
|
|
246
|
+
return cached.data;
|
|
247
|
+
}
|
|
248
|
+
try {
|
|
249
|
+
const response = await fetch(`${POLY_CLOB_URL}/book?token_id=${tokenId}`);
|
|
250
|
+
if (!response.ok)
|
|
251
|
+
return null;
|
|
252
|
+
const data = await response.json();
|
|
253
|
+
const bids = (data.bids || [])
|
|
254
|
+
.map((b) => [parseFloat(b.price), parseFloat(b.size)])
|
|
255
|
+
.sort((a, b) => b[0] - a[0]); // Highest bid first
|
|
256
|
+
const asks = (data.asks || [])
|
|
257
|
+
.map((a) => [parseFloat(a.price), parseFloat(a.size)])
|
|
258
|
+
.sort((a, b) => a[0] - b[0]); // Lowest ask first
|
|
259
|
+
const bestBid = bids[0]?.[0] ?? 0;
|
|
260
|
+
const bestAsk = asks[0]?.[0] ?? 0.99;
|
|
261
|
+
const midPrice = (bestBid + bestAsk) / 2;
|
|
262
|
+
const orderbook = { bids, asks, midPrice };
|
|
263
|
+
orderbookCache.set(tokenId, { data: orderbook, cachedAt: Date.now() });
|
|
264
|
+
return orderbook;
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Validate post-only order won't take liquidity
|
|
272
|
+
* Returns error message if order would cross the spread
|
|
273
|
+
*/
|
|
274
|
+
async function validatePostOnly(tokenId, side, price) {
|
|
275
|
+
const orderbook = await getPolymarketOrderbookCached(tokenId);
|
|
276
|
+
if (!orderbook)
|
|
277
|
+
return null; // Can't validate, let server decide
|
|
278
|
+
if (side === 'buy') {
|
|
279
|
+
// Buy order: price must be < best ask to be maker-only
|
|
280
|
+
const bestAsk = orderbook.asks[0]?.[0];
|
|
281
|
+
if (bestAsk && price >= bestAsk) {
|
|
282
|
+
return `Post-only buy at ${price} would cross spread (best ask: ${bestAsk}). Use price < ${bestAsk}`;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
// Sell order: price must be > best bid to be maker-only
|
|
287
|
+
const bestBid = orderbook.bids[0]?.[0];
|
|
288
|
+
if (bestBid && price <= bestBid) {
|
|
289
|
+
return `Post-only sell at ${price} would cross spread (best bid: ${bestBid}). Use price > ${bestBid}`;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Parse Polymarket error response into structured error
|
|
296
|
+
*/
|
|
297
|
+
function parsePolymarketError(errorMsg, status) {
|
|
298
|
+
if (!errorMsg) {
|
|
299
|
+
return { code: 'UNKNOWN', message: `HTTP ${status}` };
|
|
300
|
+
}
|
|
301
|
+
const msg = errorMsg.toLowerCase();
|
|
302
|
+
if (msg.includes('price') && (msg.includes('invalid') || msg.includes('tick'))) {
|
|
303
|
+
return { code: 'INVALID_TICK_SIZE', message: errorMsg };
|
|
304
|
+
}
|
|
305
|
+
if (msg.includes('balance') || msg.includes('insufficient')) {
|
|
306
|
+
return { code: 'INSUFFICIENT_BALANCE', message: errorMsg };
|
|
307
|
+
}
|
|
308
|
+
if (msg.includes('size') && msg.includes('invalid')) {
|
|
309
|
+
return { code: 'INVALID_SIZE', message: errorMsg };
|
|
310
|
+
}
|
|
311
|
+
if (msg.includes('nonce')) {
|
|
312
|
+
return { code: 'INVALID_NONCE', message: errorMsg };
|
|
313
|
+
}
|
|
314
|
+
if (msg.includes('halt') || msg.includes('closed')) {
|
|
315
|
+
return { code: 'MARKET_HALTED', message: errorMsg };
|
|
316
|
+
}
|
|
317
|
+
if (msg.includes('match') || msg.includes('cross')) {
|
|
318
|
+
return { code: 'ORDER_WOULD_MATCH', message: errorMsg };
|
|
319
|
+
}
|
|
320
|
+
return { code: 'UNKNOWN', message: errorMsg };
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Get USDC balance for an address
|
|
324
|
+
*/
|
|
325
|
+
async function getPolymarketBalance(auth, address) {
|
|
326
|
+
const walletAddress = address || auth.address;
|
|
327
|
+
const url = `${POLY_CLOB_URL}/balance?address=${walletAddress}`;
|
|
328
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)(auth, 'GET', url);
|
|
329
|
+
try {
|
|
330
|
+
const response = await fetch(url, { headers });
|
|
331
|
+
if (!response.ok) {
|
|
332
|
+
throw new Error(`HTTP ${response.status}`);
|
|
333
|
+
}
|
|
334
|
+
const data = await response.json();
|
|
335
|
+
return {
|
|
336
|
+
balance: parseFloat(data.balance || '0'),
|
|
337
|
+
allowance: parseFloat(data.allowance || '0'),
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
logger_1.logger.error({ error, walletAddress }, 'Failed to fetch Polymarket balance');
|
|
342
|
+
return { balance: 0, allowance: 0 };
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Get positions for an address
|
|
347
|
+
*/
|
|
348
|
+
async function getPolymarketPositions(auth, address) {
|
|
349
|
+
const walletAddress = address || auth.address;
|
|
350
|
+
const url = `${POLY_CLOB_URL}/positions?address=${walletAddress}`;
|
|
351
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)(auth, 'GET', url);
|
|
352
|
+
try {
|
|
353
|
+
const response = await fetch(url, { headers });
|
|
354
|
+
if (!response.ok) {
|
|
355
|
+
throw new Error(`HTTP ${response.status}`);
|
|
356
|
+
}
|
|
357
|
+
const data = await response.json();
|
|
358
|
+
return data.map(p => ({
|
|
359
|
+
tokenId: p.asset_id || '',
|
|
360
|
+
conditionId: p.condition_id || '',
|
|
361
|
+
size: parseFloat(p.size || '0'),
|
|
362
|
+
avgPrice: parseFloat(p.avg_price || '0'),
|
|
363
|
+
currentPrice: parseFloat(p.cur_price || '0'),
|
|
364
|
+
unrealizedPnl: parseFloat(p.unrealized_pnl || '0'),
|
|
365
|
+
}));
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
logger_1.logger.error({ error, walletAddress }, 'Failed to fetch Polymarket positions');
|
|
369
|
+
return [];
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Get trade history for an address
|
|
374
|
+
*/
|
|
375
|
+
async function getPolymarketTrades(auth, limit = 100) {
|
|
376
|
+
const url = `${POLY_CLOB_URL}/trades?limit=${limit}`;
|
|
377
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)(auth, 'GET', url);
|
|
378
|
+
try {
|
|
379
|
+
const response = await fetch(url, { headers });
|
|
380
|
+
if (!response.ok) {
|
|
381
|
+
throw new Error(`HTTP ${response.status}`);
|
|
382
|
+
}
|
|
383
|
+
const data = await response.json();
|
|
384
|
+
return data.map(t => ({
|
|
385
|
+
id: t.id || '',
|
|
386
|
+
tokenId: t.asset_id || '',
|
|
387
|
+
side: (t.side?.toUpperCase() || 'BUY'),
|
|
388
|
+
price: parseFloat(t.price || '0'),
|
|
389
|
+
size: parseFloat(t.size || '0'),
|
|
390
|
+
timestamp: new Date(t.timestamp || Date.now()),
|
|
391
|
+
transactionHash: t.transaction_hash,
|
|
392
|
+
}));
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
logger_1.logger.error({ error }, 'Failed to fetch Polymarket trades');
|
|
396
|
+
return [];
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Calculate orderbook imbalance metrics for directional signals
|
|
401
|
+
*
|
|
402
|
+
* @param orderbook - Raw orderbook data
|
|
403
|
+
* @param depthLevels - Number of price levels to analyze (default: 5)
|
|
404
|
+
* @param depthDollars - Optional: analyze orders within this dollar amount of best price
|
|
405
|
+
* @returns Imbalance metrics including directional signal
|
|
406
|
+
*/
|
|
407
|
+
function calculateOrderbookImbalance(orderbook, depthLevels = 5, depthDollars) {
|
|
408
|
+
const { bids, asks, midPrice } = orderbook;
|
|
409
|
+
// Filter to depth levels or dollar depth
|
|
410
|
+
let filteredBids = bids.slice(0, depthLevels);
|
|
411
|
+
let filteredAsks = asks.slice(0, depthLevels);
|
|
412
|
+
if (depthDollars !== undefined && depthDollars > 0) {
|
|
413
|
+
const bestBid = bids[0]?.[0] ?? 0;
|
|
414
|
+
const bestAsk = asks[0]?.[0] ?? 0.99;
|
|
415
|
+
filteredBids = bids.filter(([price]) => bestBid - price <= depthDollars);
|
|
416
|
+
filteredAsks = asks.filter(([price]) => price - bestAsk <= depthDollars);
|
|
417
|
+
}
|
|
418
|
+
// Calculate total volumes
|
|
419
|
+
const totalBidVolume = filteredBids.reduce((sum, [, size]) => sum + size, 0);
|
|
420
|
+
const totalAskVolume = filteredAsks.reduce((sum, [, size]) => sum + size, 0);
|
|
421
|
+
// Calculate VWAP for each side
|
|
422
|
+
const bidCost = filteredBids.reduce((sum, [price, size]) => sum + price * size, 0);
|
|
423
|
+
const askCost = filteredAsks.reduce((sum, [price, size]) => sum + price * size, 0);
|
|
424
|
+
const vwapBid = totalBidVolume > 0 ? bidCost / totalBidVolume : 0;
|
|
425
|
+
const vwapAsk = totalAskVolume > 0 ? askCost / totalAskVolume : 1;
|
|
426
|
+
// Calculate bid/ask ratio
|
|
427
|
+
const bidAskRatio = totalAskVolume > 0 ? totalBidVolume / totalAskVolume :
|
|
428
|
+
totalBidVolume > 0 ? Infinity : 1;
|
|
429
|
+
// Normalized imbalance score: (bid - ask) / (bid + ask)
|
|
430
|
+
// Ranges from -1 (all asks) to +1 (all bids)
|
|
431
|
+
const totalVolume = totalBidVolume + totalAskVolume;
|
|
432
|
+
const imbalanceScore = totalVolume > 0
|
|
433
|
+
? (totalBidVolume - totalAskVolume) / totalVolume
|
|
434
|
+
: 0;
|
|
435
|
+
// Best prices and spread
|
|
436
|
+
const bestBid = bids[0]?.[0] ?? 0;
|
|
437
|
+
const bestAsk = asks[0]?.[0] ?? 0.99;
|
|
438
|
+
const spread = bestAsk - bestBid;
|
|
439
|
+
const spreadPct = midPrice > 0 ? spread / midPrice : 0;
|
|
440
|
+
// Determine directional signal
|
|
441
|
+
// Thresholds tuned for prediction markets (typically 0.01-0.99 range)
|
|
442
|
+
let signal = 'neutral';
|
|
443
|
+
if (imbalanceScore > 0.15) {
|
|
444
|
+
signal = 'bullish'; // Significantly more bid volume
|
|
445
|
+
}
|
|
446
|
+
else if (imbalanceScore < -0.15) {
|
|
447
|
+
signal = 'bearish'; // Significantly more ask volume
|
|
448
|
+
}
|
|
449
|
+
// Confidence based on:
|
|
450
|
+
// 1. Total volume (more volume = more reliable signal)
|
|
451
|
+
// 2. Spread (tighter spread = more reliable)
|
|
452
|
+
// 3. Imbalance magnitude (stronger imbalance = more confident)
|
|
453
|
+
const volumeScore = Math.min(1, totalVolume / 10000); // Normalize to ~$10k
|
|
454
|
+
const spreadScore = Math.max(0, 1 - spreadPct * 10); // Penalty for wide spreads
|
|
455
|
+
const imbalanceMagnitude = Math.abs(imbalanceScore);
|
|
456
|
+
const confidence = (volumeScore * 0.4 + spreadScore * 0.3 + imbalanceMagnitude * 0.3);
|
|
457
|
+
return {
|
|
458
|
+
bidAskRatio,
|
|
459
|
+
imbalanceScore,
|
|
460
|
+
vwapBid,
|
|
461
|
+
vwapAsk,
|
|
462
|
+
totalBidVolume,
|
|
463
|
+
totalAskVolume,
|
|
464
|
+
spread,
|
|
465
|
+
spreadPct,
|
|
466
|
+
signal,
|
|
467
|
+
confidence: Math.min(1, Math.max(0, confidence)),
|
|
468
|
+
bestBid,
|
|
469
|
+
bestAsk,
|
|
470
|
+
midPrice,
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Fetch and analyze orderbook imbalance for a market
|
|
475
|
+
*/
|
|
476
|
+
async function getOrderbookImbalance(platform, marketIdOrTokenId, depthLevels) {
|
|
477
|
+
try {
|
|
478
|
+
let orderbook = null;
|
|
479
|
+
if (platform === 'polymarket') {
|
|
480
|
+
orderbook = await fetchPolymarketOrderbook(marketIdOrTokenId);
|
|
481
|
+
}
|
|
482
|
+
else if (platform === 'kalshi') {
|
|
483
|
+
orderbook = await fetchKalshiOrderbook(marketIdOrTokenId);
|
|
484
|
+
}
|
|
485
|
+
else if (platform === 'opinion') {
|
|
486
|
+
orderbook = await fetchOpinionOrderbook(marketIdOrTokenId);
|
|
487
|
+
}
|
|
488
|
+
if (!orderbook || (orderbook.bids.length === 0 && orderbook.asks.length === 0)) {
|
|
489
|
+
return null;
|
|
490
|
+
}
|
|
491
|
+
return calculateOrderbookImbalance(orderbook, depthLevels);
|
|
492
|
+
}
|
|
493
|
+
catch (error) {
|
|
494
|
+
logger_1.logger.warn({ error, platform, marketIdOrTokenId }, 'Failed to get orderbook imbalance');
|
|
495
|
+
return null;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Fetch Polymarket orderbook for a token
|
|
500
|
+
*/
|
|
501
|
+
async function fetchPolymarketOrderbook(tokenId) {
|
|
502
|
+
try {
|
|
503
|
+
const response = await fetch(`${POLY_CLOB_URL}/book?token_id=${tokenId}`);
|
|
504
|
+
if (!response.ok)
|
|
505
|
+
return null;
|
|
506
|
+
const data = await response.json();
|
|
507
|
+
const bids = (data.bids || [])
|
|
508
|
+
.map(b => [parseFloat(b.price), parseFloat(b.size)])
|
|
509
|
+
.sort((a, b) => b[0] - a[0]); // Sort bids descending by price
|
|
510
|
+
const asks = (data.asks || [])
|
|
511
|
+
.map(a => [parseFloat(a.price), parseFloat(a.size)])
|
|
512
|
+
.sort((a, b) => a[0] - b[0]); // Sort asks ascending by price
|
|
513
|
+
const bestBid = bids[0]?.[0] ?? 0;
|
|
514
|
+
const bestAsk = asks[0]?.[0] ?? 0.99;
|
|
515
|
+
const midPrice = (bestBid + bestAsk) / 2;
|
|
516
|
+
return { bids, asks, midPrice };
|
|
517
|
+
}
|
|
518
|
+
catch (error) {
|
|
519
|
+
logger_1.logger.warn({ error, tokenId }, 'Failed to fetch Polymarket orderbook');
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
const KALSHI_URL = 'https://trading-api.kalshi.com/trade-api/v2';
|
|
524
|
+
/**
|
|
525
|
+
* Fetch Kalshi orderbook for a market
|
|
526
|
+
*/
|
|
527
|
+
async function fetchKalshiOrderbook(marketId) {
|
|
528
|
+
try {
|
|
529
|
+
const response = await fetch(`${KALSHI_URL}/markets/${marketId}/orderbook`);
|
|
530
|
+
if (!response.ok)
|
|
531
|
+
return null;
|
|
532
|
+
const data = await response.json();
|
|
533
|
+
// Kalshi returns [price_cents, contracts] for yes and no sides
|
|
534
|
+
const yesOrders = data.orderbook?.yes || [];
|
|
535
|
+
const noOrders = data.orderbook?.no || [];
|
|
536
|
+
// For YES: bids are buy yes orders, asks are from sell yes / buy no
|
|
537
|
+
const bids = yesOrders
|
|
538
|
+
.map(([priceCents, size]) => [priceCents / 100, size])
|
|
539
|
+
.sort((a, b) => b[0] - a[0]);
|
|
540
|
+
// For asks, use complementary no price (1 - no_price = yes_ask)
|
|
541
|
+
const asks = noOrders
|
|
542
|
+
.map(([priceCents, size]) => [1 - priceCents / 100, size])
|
|
543
|
+
.sort((a, b) => a[0] - b[0]);
|
|
544
|
+
const bestBid = bids[0]?.[0] ?? 0;
|
|
545
|
+
const bestAsk = asks[0]?.[0] ?? 0.99;
|
|
546
|
+
const midPrice = (bestBid + bestAsk) / 2;
|
|
547
|
+
return { bids, asks, midPrice };
|
|
548
|
+
}
|
|
549
|
+
catch (error) {
|
|
550
|
+
logger_1.logger.warn({ error, marketId }, 'Failed to fetch Kalshi orderbook');
|
|
551
|
+
return null;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Calculate average fill price by walking through orderbook
|
|
556
|
+
*/
|
|
557
|
+
function calculateFillFromOrderbook(orders, // [price, size] sorted appropriately
|
|
558
|
+
targetSize, side) {
|
|
559
|
+
let totalFilled = 0;
|
|
560
|
+
let totalCost = 0;
|
|
561
|
+
for (const [price, size] of orders) {
|
|
562
|
+
const fillableAtThisLevel = Math.min(size, targetSize - totalFilled);
|
|
563
|
+
if (fillableAtThisLevel <= 0)
|
|
564
|
+
break;
|
|
565
|
+
totalFilled += fillableAtThisLevel;
|
|
566
|
+
totalCost += fillableAtThisLevel * price;
|
|
567
|
+
if (totalFilled >= targetSize)
|
|
568
|
+
break;
|
|
569
|
+
}
|
|
570
|
+
if (totalFilled === 0) {
|
|
571
|
+
// No liquidity, return worst-case price
|
|
572
|
+
return {
|
|
573
|
+
avgFillPrice: side === 'buy' ? 1 : 0,
|
|
574
|
+
totalFilled: 0,
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
return {
|
|
578
|
+
avgFillPrice: totalCost / totalFilled,
|
|
579
|
+
totalFilled,
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
async function placePolymarketOrder(auth, tokenId, side, price, size, orderType = 'GTC', negRisk, postOnly) {
|
|
583
|
+
// Validate tick size
|
|
584
|
+
const tickSize = await getPolymarketTickSize(tokenId);
|
|
585
|
+
const tickError = validatePriceTickSize(price, tickSize);
|
|
586
|
+
if (tickError) {
|
|
587
|
+
return { success: false, error: tickError };
|
|
588
|
+
}
|
|
589
|
+
// Validate post-only won't cross spread
|
|
590
|
+
if (postOnly) {
|
|
591
|
+
const postOnlyError = await validatePostOnly(tokenId, side, price);
|
|
592
|
+
if (postOnlyError) {
|
|
593
|
+
return { success: false, error: postOnlyError };
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
// Auto-detect negRisk if not provided
|
|
597
|
+
const actualNegRisk = negRisk ?? await getPolymarketNegRiskCached(tokenId);
|
|
598
|
+
// Get fee rate for this token
|
|
599
|
+
const feeRateBps = await getPolymarketFeeRate(tokenId);
|
|
600
|
+
// If private key available, use EIP-712 signed order (required for real CLOB)
|
|
601
|
+
if (auth.privateKey) {
|
|
602
|
+
const signedAuth = { ...auth, privateKey: auth.privateKey };
|
|
603
|
+
return placeSignedPolymarketOrder(signedAuth, tokenId, side, price, size, orderType, actualNegRisk, postOnly, feeRateBps);
|
|
604
|
+
}
|
|
605
|
+
// Fallback: simplified payload (may not work with real CLOB without signing)
|
|
606
|
+
const url = `${POLY_CLOB_URL}/order`;
|
|
607
|
+
const order = {
|
|
608
|
+
tokenID: tokenId,
|
|
609
|
+
side: side.toUpperCase(),
|
|
610
|
+
price: price.toString(),
|
|
611
|
+
size: size.toString(),
|
|
612
|
+
orderType: orderType,
|
|
613
|
+
feeRateBps: feeRateBps.toString(),
|
|
614
|
+
negRisk: actualNegRisk,
|
|
615
|
+
nonce: getNextNonce(),
|
|
616
|
+
};
|
|
617
|
+
if (postOnly === true)
|
|
618
|
+
order.postOnly = true;
|
|
619
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)(auth, 'POST', url, order);
|
|
620
|
+
try {
|
|
621
|
+
const response = await fetch(url, {
|
|
622
|
+
method: 'POST',
|
|
623
|
+
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
624
|
+
body: JSON.stringify(order),
|
|
625
|
+
});
|
|
626
|
+
const data = (await response.json());
|
|
627
|
+
if (!response.ok || data.errorMsg) {
|
|
628
|
+
const { code, message } = parsePolymarketError(data.errorMsg, response.status);
|
|
629
|
+
logger_1.logger.error({ status: response.status, errorCode: code, error: message }, 'Polymarket order failed');
|
|
630
|
+
return { success: false, error: `[${code}] ${message}` };
|
|
631
|
+
}
|
|
632
|
+
const orderId = data.orderID || data.order_id;
|
|
633
|
+
logger_1.logger.info({ orderId, tokenId, side, price, size, feeRateBps }, 'Polymarket order placed');
|
|
634
|
+
return { success: true, orderId, status: 'open', transactionHash: data.transactionsHashes?.[0] };
|
|
635
|
+
}
|
|
636
|
+
catch (error) {
|
|
637
|
+
logger_1.logger.error({ error }, 'Error placing Polymarket order');
|
|
638
|
+
return { success: false, error: error instanceof Error ? error.message : 'Unknown error' };
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Place a single EIP-712 signed order on Polymarket CLOB.
|
|
643
|
+
* Uses POST /order with the full signed order payload.
|
|
644
|
+
*/
|
|
645
|
+
async function placeSignedPolymarketOrder(auth, tokenId, side, price, size, orderType = 'GTC', negRisk, postOnly, feeRateBps) {
|
|
646
|
+
const url = `${POLY_CLOB_URL}/order`;
|
|
647
|
+
const signerCfg = {
|
|
648
|
+
privateKey: auth.privateKey,
|
|
649
|
+
funderAddress: auth.funderAddress,
|
|
650
|
+
signatureType: auth.signatureType,
|
|
651
|
+
};
|
|
652
|
+
const postOrder = (0, polymarket_order_signer_1.buildSignedOrder)({
|
|
653
|
+
tokenId,
|
|
654
|
+
price,
|
|
655
|
+
size,
|
|
656
|
+
side: side === 'buy' ? 'buy' : 'sell',
|
|
657
|
+
negRisk,
|
|
658
|
+
feeRateBps,
|
|
659
|
+
nonce: getNextNonce(),
|
|
660
|
+
}, signerCfg);
|
|
661
|
+
// Set owner to API key (required by Polymarket CLOB)
|
|
662
|
+
postOrder.owner = auth.apiKey;
|
|
663
|
+
postOrder.orderType = orderType;
|
|
664
|
+
if (postOnly)
|
|
665
|
+
postOrder.postOnly = true;
|
|
666
|
+
try {
|
|
667
|
+
const { response, data } = await polymarketRetryWithBackoff(async () => {
|
|
668
|
+
// Build headers fresh for each attempt (timestamp-based HMAC)
|
|
669
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)(auth, 'POST', url, postOrder);
|
|
670
|
+
const resp = await fetch(url, {
|
|
671
|
+
method: 'POST',
|
|
672
|
+
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
673
|
+
body: JSON.stringify(postOrder),
|
|
674
|
+
});
|
|
675
|
+
const json = (await resp.json());
|
|
676
|
+
return { response: resp, data: json };
|
|
677
|
+
});
|
|
678
|
+
if (!response.ok || data.errorMsg) {
|
|
679
|
+
const { code, message } = parsePolymarketError(data.errorMsg, response.status);
|
|
680
|
+
logger_1.logger.error({ status: response.status, errorCode: code, error: message }, 'Polymarket signed order failed');
|
|
681
|
+
return { success: false, error: `[${code}] ${message}` };
|
|
682
|
+
}
|
|
683
|
+
const orderId = data.orderID || data.order_id;
|
|
684
|
+
logger_1.logger.info({ orderId, tokenId, side, price, size, feeRateBps }, 'Polymarket signed order placed');
|
|
685
|
+
return { success: true, orderId, status: 'open', transactionHash: data.transactionsHashes?.[0] };
|
|
686
|
+
}
|
|
687
|
+
catch (error) {
|
|
688
|
+
logger_1.logger.error({ error }, 'Error placing Polymarket signed order after retries');
|
|
689
|
+
return { success: false, error: error instanceof Error ? error.message : 'Unknown error' };
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
async function cancelPolymarketOrder(auth, orderId) {
|
|
693
|
+
const url = `${POLY_CLOB_URL}/order/${orderId}`;
|
|
694
|
+
try {
|
|
695
|
+
const { response } = await polymarketRetryWithBackoff(async () => {
|
|
696
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)(auth, 'DELETE', url);
|
|
697
|
+
const resp = await fetch(url, {
|
|
698
|
+
method: 'DELETE',
|
|
699
|
+
headers: {
|
|
700
|
+
...headers,
|
|
701
|
+
'Content-Type': 'application/json',
|
|
702
|
+
},
|
|
703
|
+
});
|
|
704
|
+
return { response: resp, data: null };
|
|
705
|
+
});
|
|
706
|
+
if (!response.ok) {
|
|
707
|
+
logger_1.logger.error({ status: response.status, orderId }, 'Failed to cancel Polymarket order');
|
|
708
|
+
return false;
|
|
709
|
+
}
|
|
710
|
+
logger_1.logger.info({ orderId }, 'Polymarket order cancelled');
|
|
711
|
+
return true;
|
|
712
|
+
}
|
|
713
|
+
catch (error) {
|
|
714
|
+
logger_1.logger.error({ error, orderId }, 'Error cancelling Polymarket order after retries');
|
|
715
|
+
return false;
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
async function cancelAllPolymarketOrders(auth, marketId) {
|
|
719
|
+
let url = `${POLY_CLOB_URL}/cancel-all`;
|
|
720
|
+
if (marketId) {
|
|
721
|
+
url += `?market=${marketId}`;
|
|
722
|
+
}
|
|
723
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)(auth, 'DELETE', url);
|
|
724
|
+
try {
|
|
725
|
+
const response = await fetch(url, {
|
|
726
|
+
method: 'DELETE',
|
|
727
|
+
headers: {
|
|
728
|
+
...headers,
|
|
729
|
+
'Content-Type': 'application/json',
|
|
730
|
+
},
|
|
731
|
+
});
|
|
732
|
+
if (!response.ok) {
|
|
733
|
+
logger_1.logger.error({ status: response.status }, 'Failed to cancel all Polymarket orders');
|
|
734
|
+
return 0;
|
|
735
|
+
}
|
|
736
|
+
const data = (await response.json());
|
|
737
|
+
const count = data.canceled || 0;
|
|
738
|
+
logger_1.logger.info({ count, marketId }, 'Cancelled Polymarket orders');
|
|
739
|
+
return count;
|
|
740
|
+
}
|
|
741
|
+
catch (error) {
|
|
742
|
+
logger_1.logger.error({ error }, 'Error cancelling all Polymarket orders');
|
|
743
|
+
return 0;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
/**
|
|
747
|
+
* Place multiple Polymarket orders in a single batch request.
|
|
748
|
+
*
|
|
749
|
+
* If private key is available, uses POST /orders with EIP-712 signed orders
|
|
750
|
+
* (up to 15 per request). Otherwise falls back to parallel single-order calls.
|
|
751
|
+
*/
|
|
752
|
+
async function placePolymarketOrdersBatch(auth, orders) {
|
|
753
|
+
if (orders.length === 0)
|
|
754
|
+
return [];
|
|
755
|
+
// If no private key, fall back to parallel individual calls
|
|
756
|
+
if (!auth.privateKey) {
|
|
757
|
+
const results = await Promise.all(orders.map(o => placePolymarketOrder(auth, o.tokenId, o.side, o.price, o.size, 'GTC', o.negRisk, o.postOnly)
|
|
758
|
+
.catch(err => ({ success: false, error: err instanceof Error ? err.message : 'Order failed' }))));
|
|
759
|
+
logger_1.logger.info({ total: orders.length, successful: results.filter(r => r.success).length }, 'Polymarket parallel orders placed');
|
|
760
|
+
return results;
|
|
761
|
+
}
|
|
762
|
+
// Build all signed orders
|
|
763
|
+
const signerCfg = {
|
|
764
|
+
privateKey: auth.privateKey,
|
|
765
|
+
funderAddress: auth.funderAddress,
|
|
766
|
+
signatureType: auth.signatureType,
|
|
767
|
+
};
|
|
768
|
+
const postOrders = (0, polymarket_order_signer_1.buildSignedOrders)(orders.map(o => ({
|
|
769
|
+
tokenId: o.tokenId,
|
|
770
|
+
price: o.price,
|
|
771
|
+
size: o.size,
|
|
772
|
+
side: o.side === 'buy' ? 'buy' : 'sell',
|
|
773
|
+
negRisk: o.negRisk,
|
|
774
|
+
})), signerCfg);
|
|
775
|
+
// Set owner to API key on all orders (required by Polymarket CLOB)
|
|
776
|
+
for (const po of postOrders) {
|
|
777
|
+
po.owner = auth.apiKey;
|
|
778
|
+
}
|
|
779
|
+
// Apply postOnly flag
|
|
780
|
+
for (let i = 0; i < postOrders.length; i++) {
|
|
781
|
+
if (orders[i].postOnly)
|
|
782
|
+
postOrders[i].postOnly = true;
|
|
783
|
+
}
|
|
784
|
+
// Send in chunks of 15 (Polymarket batch limit)
|
|
785
|
+
const results = [];
|
|
786
|
+
for (let i = 0; i < postOrders.length; i += 15) {
|
|
787
|
+
const chunk = postOrders.slice(i, i + 15);
|
|
788
|
+
const url = `${POLY_CLOB_URL}/orders`;
|
|
789
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)(auth, 'POST', url, chunk);
|
|
790
|
+
try {
|
|
791
|
+
const response = await fetch(url, {
|
|
792
|
+
method: 'POST',
|
|
793
|
+
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
794
|
+
body: JSON.stringify(chunk),
|
|
795
|
+
});
|
|
796
|
+
if (!response.ok) {
|
|
797
|
+
const error = await response.text();
|
|
798
|
+
logger_1.logger.error({ status: response.status, error, count: chunk.length }, 'Polymarket batch order failed');
|
|
799
|
+
results.push(...chunk.map(() => ({ success: false, error: `HTTP ${response.status}` })));
|
|
800
|
+
continue;
|
|
801
|
+
}
|
|
802
|
+
const data = (await response.json());
|
|
803
|
+
logger_1.logger.info({ count: chunk.length, successful: data.filter(r => r.orderID || r.order_id).length }, 'Polymarket batch orders placed');
|
|
804
|
+
for (const r of data) {
|
|
805
|
+
results.push({
|
|
806
|
+
success: !r.errorMsg,
|
|
807
|
+
orderId: r.orderID || r.order_id,
|
|
808
|
+
error: r.errorMsg,
|
|
809
|
+
status: r.errorMsg ? 'rejected' : 'open',
|
|
810
|
+
transactionHash: r.transactionsHashes?.[0],
|
|
811
|
+
});
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
catch (error) {
|
|
815
|
+
logger_1.logger.error({ error }, 'Error placing Polymarket batch orders');
|
|
816
|
+
results.push(...chunk.map(() => ({
|
|
817
|
+
success: false,
|
|
818
|
+
error: error instanceof Error ? error.message : 'Batch order failed',
|
|
819
|
+
})));
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
logger_1.logger.info({ total: orders.length, successful: results.filter(r => r.success).length }, 'Polymarket batch orders completed');
|
|
823
|
+
return results;
|
|
824
|
+
}
|
|
825
|
+
/**
|
|
826
|
+
* Cancel multiple Polymarket orders concurrently.
|
|
827
|
+
*
|
|
828
|
+
* NOTE: The true batch cancel endpoint (DELETE /orders) accepts an array of
|
|
829
|
+
* order IDs. It uses L2 HMAC auth (same as other endpoints), so we can use
|
|
830
|
+
* it directly. Falls back to parallel individual cancels on error.
|
|
831
|
+
*/
|
|
832
|
+
async function cancelPolymarketOrdersBatch(auth, orderIds) {
|
|
833
|
+
if (orderIds.length === 0)
|
|
834
|
+
return [];
|
|
835
|
+
// DELETE /orders with array of IDs uses L2 HMAC auth (no order signing needed)
|
|
836
|
+
const url = `${POLY_CLOB_URL}/orders`;
|
|
837
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)(auth, 'DELETE', url, orderIds);
|
|
838
|
+
try {
|
|
839
|
+
const response = await fetch(url, {
|
|
840
|
+
method: 'DELETE',
|
|
841
|
+
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
842
|
+
body: JSON.stringify(orderIds),
|
|
843
|
+
});
|
|
844
|
+
if (!response.ok) {
|
|
845
|
+
logger_1.logger.warn({ status: response.status, count: orderIds.length }, 'Polymarket batch cancel failed, falling back to individual');
|
|
846
|
+
// Fallback to parallel individual cancels
|
|
847
|
+
return Promise.all(orderIds.map(async (orderId) => ({
|
|
848
|
+
orderId,
|
|
849
|
+
success: await cancelPolymarketOrder(auth, orderId).catch(() => false),
|
|
850
|
+
})));
|
|
851
|
+
}
|
|
852
|
+
const data = (await response.json());
|
|
853
|
+
const canceledSet = new Set(data.canceled || []);
|
|
854
|
+
logger_1.logger.info({ total: orderIds.length, canceled: canceledSet.size, notCanceled: Object.keys(data.not_canceled || {}).length }, 'Polymarket batch cancel completed');
|
|
855
|
+
return orderIds.map(orderId => ({ orderId, success: canceledSet.has(orderId) }));
|
|
856
|
+
}
|
|
857
|
+
catch (error) {
|
|
858
|
+
logger_1.logger.error({ error }, 'Error in Polymarket batch cancel, falling back to individual');
|
|
859
|
+
return Promise.all(orderIds.map(async (orderId) => ({
|
|
860
|
+
orderId,
|
|
861
|
+
success: await cancelPolymarketOrder(auth, orderId).catch(() => false),
|
|
862
|
+
})));
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
async function getPolymarketOpenOrders(auth) {
|
|
866
|
+
const url = `${POLY_CLOB_URL}/orders?state=OPEN`;
|
|
867
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)(auth, 'GET', url);
|
|
868
|
+
try {
|
|
869
|
+
const response = await fetch(url, {
|
|
870
|
+
method: 'GET',
|
|
871
|
+
headers: {
|
|
872
|
+
...headers,
|
|
873
|
+
'Content-Type': 'application/json',
|
|
874
|
+
},
|
|
875
|
+
});
|
|
876
|
+
if (!response.ok) {
|
|
877
|
+
logger_1.logger.error({ status: response.status }, 'Failed to fetch Polymarket orders');
|
|
878
|
+
return [];
|
|
879
|
+
}
|
|
880
|
+
const data = (await response.json());
|
|
881
|
+
return data.map((o) => ({
|
|
882
|
+
orderId: o.id,
|
|
883
|
+
platform: 'polymarket',
|
|
884
|
+
marketId: o.market,
|
|
885
|
+
tokenId: o.asset_id,
|
|
886
|
+
side: o.side.toLowerCase(),
|
|
887
|
+
price: parseFloat(o.price),
|
|
888
|
+
originalSize: parseFloat(o.original_size),
|
|
889
|
+
remainingSize: parseFloat(o.original_size) - parseFloat(o.size_matched),
|
|
890
|
+
filledSize: parseFloat(o.size_matched),
|
|
891
|
+
orderType: o.order_type || 'GTC',
|
|
892
|
+
status: o.status.toLowerCase(),
|
|
893
|
+
createdAt: new Date(o.created_at),
|
|
894
|
+
expiration: o.expiration ? new Date(o.expiration) : undefined,
|
|
895
|
+
}));
|
|
896
|
+
}
|
|
897
|
+
catch (error) {
|
|
898
|
+
logger_1.logger.error({ error }, 'Error fetching Polymarket orders');
|
|
899
|
+
return [];
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
// =============================================================================
|
|
903
|
+
// KALSHI EXECUTION
|
|
904
|
+
// =============================================================================
|
|
905
|
+
const KALSHI_API_URL = 'https://api.elections.kalshi.com/trade-api/v2';
|
|
906
|
+
/**
|
|
907
|
+
* Retry helper with exponential backoff for Kalshi API calls
|
|
908
|
+
* Retries on: network errors, 5xx server errors, 429 rate limit
|
|
909
|
+
* Does NOT retry on: 4xx client errors (bad request, unauthorized, etc.)
|
|
910
|
+
*/
|
|
911
|
+
async function kalshiRetryWithBackoff(operation, maxAttempts = 3, baseDelayMs = 1000) {
|
|
912
|
+
let lastError = null;
|
|
913
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
914
|
+
try {
|
|
915
|
+
const result = await operation();
|
|
916
|
+
// Retry on 5xx or 429
|
|
917
|
+
if (result.response.status >= 500 || result.response.status === 429) {
|
|
918
|
+
if (attempt < maxAttempts) {
|
|
919
|
+
const delay = baseDelayMs * Math.pow(2, attempt - 1);
|
|
920
|
+
logger_1.logger.warn({ status: result.response.status, attempt, delay }, 'Kalshi API error, retrying...');
|
|
921
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
922
|
+
continue;
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
return result;
|
|
926
|
+
}
|
|
927
|
+
catch (error) {
|
|
928
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
929
|
+
if (attempt < maxAttempts) {
|
|
930
|
+
const delay = baseDelayMs * Math.pow(2, attempt - 1);
|
|
931
|
+
logger_1.logger.warn({ error: lastError.message, attempt, delay }, 'Kalshi API network error, retrying...');
|
|
932
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
throw lastError || new Error('Kalshi API request failed after retries');
|
|
937
|
+
}
|
|
938
|
+
async function placeKalshiOrder(auth, ticker, side, action, price, count, orderType = 'GTC', maxSlippage) {
|
|
939
|
+
const url = `${KALSHI_API_URL}/portfolio/orders`;
|
|
940
|
+
// Slippage protection for market orders
|
|
941
|
+
let effectivePrice = price;
|
|
942
|
+
if (orderType === 'FOK' && maxSlippage !== undefined) {
|
|
943
|
+
try {
|
|
944
|
+
const orderbook = await fetchKalshiOrderbook(ticker);
|
|
945
|
+
if (orderbook) {
|
|
946
|
+
// For buy: look at asks; for sell: look at bids
|
|
947
|
+
const relevantSide = action === 'buy' ? orderbook.asks : orderbook.bids;
|
|
948
|
+
const { avgFillPrice, totalFilled } = calculateFillFromOrderbook(relevantSide, count, action);
|
|
949
|
+
if (totalFilled < count * 0.5) {
|
|
950
|
+
return {
|
|
951
|
+
success: false,
|
|
952
|
+
error: `Insufficient liquidity: only ${totalFilled}/${count} contracts available`,
|
|
953
|
+
};
|
|
954
|
+
}
|
|
955
|
+
// Calculate slippage from mid price
|
|
956
|
+
const slippage = action === 'buy'
|
|
957
|
+
? (avgFillPrice - orderbook.midPrice) / orderbook.midPrice
|
|
958
|
+
: (orderbook.midPrice - avgFillPrice) / orderbook.midPrice;
|
|
959
|
+
if (slippage > maxSlippage) {
|
|
960
|
+
return {
|
|
961
|
+
success: false,
|
|
962
|
+
error: `Slippage ${(slippage * 100).toFixed(2)}% exceeds max ${(maxSlippage * 100).toFixed(2)}%`,
|
|
963
|
+
};
|
|
964
|
+
}
|
|
965
|
+
// Use limit order instead of market to cap slippage
|
|
966
|
+
// Add buffer to expected price for fill certainty
|
|
967
|
+
const buffer = action === 'buy' ? 0.01 : -0.01;
|
|
968
|
+
effectivePrice = Math.max(0.01, Math.min(0.99, avgFillPrice + buffer));
|
|
969
|
+
logger_1.logger.info({ ticker, action, count, avgFillPrice, effectivePrice, slippage }, 'Kalshi market order converted to limit with slippage protection');
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
catch (err) {
|
|
973
|
+
logger_1.logger.warn({ err, ticker }, 'Failed to check slippage, proceeding with market order');
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
const order = {
|
|
977
|
+
ticker,
|
|
978
|
+
side,
|
|
979
|
+
action,
|
|
980
|
+
type: orderType === 'FOK' && maxSlippage !== undefined ? 'limit' : (orderType === 'FOK' ? 'market' : 'limit'),
|
|
981
|
+
yes_price: side === 'yes' ? Math.round(effectivePrice * 100) : undefined,
|
|
982
|
+
no_price: side === 'no' ? Math.round(effectivePrice * 100) : undefined,
|
|
983
|
+
count,
|
|
984
|
+
};
|
|
985
|
+
try {
|
|
986
|
+
const { response, data } = await kalshiRetryWithBackoff(async () => {
|
|
987
|
+
// Build headers fresh for each attempt (timestamp-based)
|
|
988
|
+
const headers = (0, kalshi_auth_1.buildKalshiHeadersForUrl)(auth, 'POST', url);
|
|
989
|
+
const resp = await fetch(url, {
|
|
990
|
+
method: 'POST',
|
|
991
|
+
headers: {
|
|
992
|
+
...headers,
|
|
993
|
+
'Content-Type': 'application/json',
|
|
994
|
+
},
|
|
995
|
+
body: JSON.stringify(order),
|
|
996
|
+
});
|
|
997
|
+
const json = (await resp.json());
|
|
998
|
+
return { response: resp, data: json };
|
|
999
|
+
});
|
|
1000
|
+
if (!response.ok || data.error) {
|
|
1001
|
+
logger_1.logger.error({ status: response.status, error: data.error }, 'Kalshi order failed');
|
|
1002
|
+
return {
|
|
1003
|
+
success: false,
|
|
1004
|
+
error: data.error?.message || `HTTP ${response.status}`,
|
|
1005
|
+
};
|
|
1006
|
+
}
|
|
1007
|
+
logger_1.logger.info({ orderId: data.order?.order_id, ticker, side, action, price, count }, 'Kalshi order placed');
|
|
1008
|
+
return {
|
|
1009
|
+
success: true,
|
|
1010
|
+
orderId: data.order?.order_id,
|
|
1011
|
+
status: data.order?.status || 'open',
|
|
1012
|
+
filledSize: data.order?.filled_count,
|
|
1013
|
+
avgFillPrice: data.order?.yes_price != null ? data.order.yes_price / 100 :
|
|
1014
|
+
data.order?.no_price != null ? data.order.no_price / 100 : undefined,
|
|
1015
|
+
};
|
|
1016
|
+
}
|
|
1017
|
+
catch (error) {
|
|
1018
|
+
logger_1.logger.error({ error }, 'Error placing Kalshi order after retries');
|
|
1019
|
+
return {
|
|
1020
|
+
success: false,
|
|
1021
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
1022
|
+
};
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
async function cancelKalshiOrder(auth, orderId) {
|
|
1026
|
+
const url = `${KALSHI_API_URL}/portfolio/orders/${orderId}`;
|
|
1027
|
+
try {
|
|
1028
|
+
const { response } = await kalshiRetryWithBackoff(async () => {
|
|
1029
|
+
const headers = (0, kalshi_auth_1.buildKalshiHeadersForUrl)(auth, 'DELETE', url);
|
|
1030
|
+
const resp = await fetch(url, {
|
|
1031
|
+
method: 'DELETE',
|
|
1032
|
+
headers: {
|
|
1033
|
+
...headers,
|
|
1034
|
+
'Content-Type': 'application/json',
|
|
1035
|
+
},
|
|
1036
|
+
});
|
|
1037
|
+
return { response: resp, data: null };
|
|
1038
|
+
});
|
|
1039
|
+
if (!response.ok) {
|
|
1040
|
+
logger_1.logger.error({ status: response.status, orderId }, 'Failed to cancel Kalshi order');
|
|
1041
|
+
return false;
|
|
1042
|
+
}
|
|
1043
|
+
logger_1.logger.info({ orderId }, 'Kalshi order cancelled');
|
|
1044
|
+
return true;
|
|
1045
|
+
}
|
|
1046
|
+
catch (error) {
|
|
1047
|
+
logger_1.logger.error({ error, orderId }, 'Error cancelling Kalshi order after retries');
|
|
1048
|
+
return false;
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
async function getKalshiOpenOrders(auth) {
|
|
1052
|
+
const url = `${KALSHI_API_URL}/portfolio/orders?status=resting`;
|
|
1053
|
+
try {
|
|
1054
|
+
const { response, data } = await kalshiRetryWithBackoff(async () => {
|
|
1055
|
+
const headers = (0, kalshi_auth_1.buildKalshiHeadersForUrl)(auth, 'GET', url);
|
|
1056
|
+
const resp = await fetch(url, {
|
|
1057
|
+
method: 'GET',
|
|
1058
|
+
headers: {
|
|
1059
|
+
...headers,
|
|
1060
|
+
'Content-Type': 'application/json',
|
|
1061
|
+
},
|
|
1062
|
+
});
|
|
1063
|
+
const json = (await resp.json());
|
|
1064
|
+
return { response: resp, data: json };
|
|
1065
|
+
});
|
|
1066
|
+
if (!response.ok) {
|
|
1067
|
+
logger_1.logger.error({ status: response.status }, 'Failed to fetch Kalshi orders');
|
|
1068
|
+
return [];
|
|
1069
|
+
}
|
|
1070
|
+
return (data.orders || []).map((o) => {
|
|
1071
|
+
const price = (o.side === 'yes' ? o.yes_price : o.no_price) / 100;
|
|
1072
|
+
return {
|
|
1073
|
+
orderId: o.order_id,
|
|
1074
|
+
platform: 'kalshi',
|
|
1075
|
+
marketId: o.ticker,
|
|
1076
|
+
outcome: o.side,
|
|
1077
|
+
side: o.action,
|
|
1078
|
+
price,
|
|
1079
|
+
originalSize: o.count,
|
|
1080
|
+
remainingSize: o.remaining_count,
|
|
1081
|
+
filledSize: o.count - o.remaining_count,
|
|
1082
|
+
orderType: o.type === 'market' ? 'FOK' : 'GTC',
|
|
1083
|
+
status: o.status,
|
|
1084
|
+
createdAt: new Date(o.created_time),
|
|
1085
|
+
expiration: o.expiration_time ? new Date(o.expiration_time) : undefined,
|
|
1086
|
+
};
|
|
1087
|
+
});
|
|
1088
|
+
}
|
|
1089
|
+
catch (error) {
|
|
1090
|
+
logger_1.logger.error({ error }, 'Error fetching Kalshi orders after retries');
|
|
1091
|
+
return [];
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
/**
|
|
1095
|
+
* Place multiple Kalshi orders in a single batch request.
|
|
1096
|
+
* Kalshi supports up to 20 orders per batch via POST /portfolio/orders/batched.
|
|
1097
|
+
*/
|
|
1098
|
+
async function placeKalshiOrdersBatch(auth, orders) {
|
|
1099
|
+
if (orders.length === 0)
|
|
1100
|
+
return [];
|
|
1101
|
+
const results = [];
|
|
1102
|
+
// Chunk into batches of 20 (Kalshi limit)
|
|
1103
|
+
for (let i = 0; i < orders.length; i += 20) {
|
|
1104
|
+
const chunk = orders.slice(i, i + 20);
|
|
1105
|
+
const url = `${KALSHI_API_URL}/portfolio/orders/batched`;
|
|
1106
|
+
const headers = (0, kalshi_auth_1.buildKalshiHeadersForUrl)(auth, 'POST', url);
|
|
1107
|
+
const body = {
|
|
1108
|
+
orders: chunk.map(o => ({
|
|
1109
|
+
ticker: o.ticker,
|
|
1110
|
+
side: o.side,
|
|
1111
|
+
action: o.action,
|
|
1112
|
+
type: o.orderType === 'FOK' ? 'market' : 'limit',
|
|
1113
|
+
yes_price: o.side === 'yes' ? Math.round(o.price * 100) : undefined,
|
|
1114
|
+
no_price: o.side === 'no' ? Math.round(o.price * 100) : undefined,
|
|
1115
|
+
count: o.count,
|
|
1116
|
+
})),
|
|
1117
|
+
};
|
|
1118
|
+
try {
|
|
1119
|
+
const response = await fetch(url, {
|
|
1120
|
+
method: 'POST',
|
|
1121
|
+
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
1122
|
+
body: JSON.stringify(body),
|
|
1123
|
+
});
|
|
1124
|
+
if (!response.ok) {
|
|
1125
|
+
const error = await response.text();
|
|
1126
|
+
logger_1.logger.error({ status: response.status, error, count: chunk.length }, 'Kalshi batch order failed');
|
|
1127
|
+
results.push(...chunk.map(() => ({ success: false, error: `HTTP ${response.status}` })));
|
|
1128
|
+
continue;
|
|
1129
|
+
}
|
|
1130
|
+
const data = (await response.json());
|
|
1131
|
+
const respOrders = data.orders || [];
|
|
1132
|
+
for (let j = 0; j < chunk.length; j++) {
|
|
1133
|
+
const r = respOrders[j];
|
|
1134
|
+
if (r?.order_id) {
|
|
1135
|
+
results.push({
|
|
1136
|
+
success: true,
|
|
1137
|
+
orderId: r.order_id,
|
|
1138
|
+
status: r.status || 'open',
|
|
1139
|
+
filledSize: r.filled_count,
|
|
1140
|
+
});
|
|
1141
|
+
}
|
|
1142
|
+
else {
|
|
1143
|
+
results.push({ success: false, error: 'No order_id in response' });
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
logger_1.logger.info({ count: chunk.length, successful: respOrders.filter(r => r?.order_id).length }, 'Kalshi batch orders placed');
|
|
1147
|
+
}
|
|
1148
|
+
catch (error) {
|
|
1149
|
+
logger_1.logger.error({ error }, 'Error placing Kalshi batch orders');
|
|
1150
|
+
results.push(...chunk.map(() => ({
|
|
1151
|
+
success: false,
|
|
1152
|
+
error: error instanceof Error ? error.message : 'Batch order failed',
|
|
1153
|
+
})));
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
return results;
|
|
1157
|
+
}
|
|
1158
|
+
/**
|
|
1159
|
+
* Cancel multiple Kalshi orders in a single batch request.
|
|
1160
|
+
* Kalshi supports up to 20 cancels per batch via DELETE /portfolio/orders/batched.
|
|
1161
|
+
*/
|
|
1162
|
+
async function cancelKalshiOrdersBatch(auth, orderIds) {
|
|
1163
|
+
if (orderIds.length === 0)
|
|
1164
|
+
return [];
|
|
1165
|
+
const results = [];
|
|
1166
|
+
for (let i = 0; i < orderIds.length; i += 20) {
|
|
1167
|
+
const chunk = orderIds.slice(i, i + 20);
|
|
1168
|
+
const url = `${KALSHI_API_URL}/portfolio/orders/batched`;
|
|
1169
|
+
const headers = (0, kalshi_auth_1.buildKalshiHeadersForUrl)(auth, 'DELETE', url);
|
|
1170
|
+
const body = {
|
|
1171
|
+
orders: chunk.map(id => ({ order_id: id })),
|
|
1172
|
+
};
|
|
1173
|
+
try {
|
|
1174
|
+
const response = await fetch(url, {
|
|
1175
|
+
method: 'DELETE',
|
|
1176
|
+
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
1177
|
+
body: JSON.stringify(body),
|
|
1178
|
+
});
|
|
1179
|
+
if (!response.ok) {
|
|
1180
|
+
logger_1.logger.error({ status: response.status, count: chunk.length }, 'Kalshi batch cancel failed');
|
|
1181
|
+
results.push(...chunk.map(id => ({ orderId: id, success: false })));
|
|
1182
|
+
continue;
|
|
1183
|
+
}
|
|
1184
|
+
logger_1.logger.info({ count: chunk.length }, 'Kalshi batch cancel completed');
|
|
1185
|
+
results.push(...chunk.map(id => ({ orderId: id, success: true })));
|
|
1186
|
+
}
|
|
1187
|
+
catch (error) {
|
|
1188
|
+
logger_1.logger.error({ error }, 'Error batch cancelling Kalshi orders');
|
|
1189
|
+
results.push(...chunk.map(id => ({ orderId: id, success: false })));
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
return results;
|
|
1193
|
+
}
|
|
1194
|
+
/**
|
|
1195
|
+
* Amend a Kalshi order (change price and/or count without losing queue position).
|
|
1196
|
+
* POST /portfolio/orders/{order_id}/amend
|
|
1197
|
+
*/
|
|
1198
|
+
async function amendKalshiOrder(auth, orderId, updates) {
|
|
1199
|
+
const url = `${KALSHI_API_URL}/portfolio/orders/${orderId}/amend`;
|
|
1200
|
+
const headers = (0, kalshi_auth_1.buildKalshiHeadersForUrl)(auth, 'POST', url);
|
|
1201
|
+
const body = {};
|
|
1202
|
+
if (updates.price != null && updates.side) {
|
|
1203
|
+
if (updates.side === 'yes') {
|
|
1204
|
+
body.yes_price = Math.round(updates.price * 100);
|
|
1205
|
+
}
|
|
1206
|
+
else {
|
|
1207
|
+
body.no_price = Math.round(updates.price * 100);
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
if (updates.count != null) {
|
|
1211
|
+
body.count = updates.count;
|
|
1212
|
+
}
|
|
1213
|
+
try {
|
|
1214
|
+
const response = await fetch(url, {
|
|
1215
|
+
method: 'POST',
|
|
1216
|
+
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
1217
|
+
body: JSON.stringify(body),
|
|
1218
|
+
});
|
|
1219
|
+
const data = (await response.json());
|
|
1220
|
+
if (!response.ok) {
|
|
1221
|
+
logger_1.logger.error({ status: response.status, orderId }, 'Kalshi order amend failed');
|
|
1222
|
+
return { success: false, error: `HTTP ${response.status}` };
|
|
1223
|
+
}
|
|
1224
|
+
logger_1.logger.info({ orderId, updates }, 'Kalshi order amended');
|
|
1225
|
+
return {
|
|
1226
|
+
success: true,
|
|
1227
|
+
orderId: data.order?.order_id || orderId,
|
|
1228
|
+
status: data.order?.status || 'open',
|
|
1229
|
+
};
|
|
1230
|
+
}
|
|
1231
|
+
catch (error) {
|
|
1232
|
+
logger_1.logger.error({ error, orderId }, 'Error amending Kalshi order');
|
|
1233
|
+
return { success: false, error: error instanceof Error ? error.message : 'Unknown error' };
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
// =============================================================================
|
|
1237
|
+
// OPINION.TRADE EXECUTION (delegates to exchange module with EIP-712 signing)
|
|
1238
|
+
// =============================================================================
|
|
1239
|
+
/**
|
|
1240
|
+
* Convert ExecutionConfig opinion fields to OpinionConfig for the exchange module.
|
|
1241
|
+
* The exchange module uses the unofficial-opinion-clob-sdk which handles
|
|
1242
|
+
* EIP-712 order signing internally — raw REST calls skip signing entirely.
|
|
1243
|
+
*/
|
|
1244
|
+
function toOpinionConfig(auth) {
|
|
1245
|
+
return {
|
|
1246
|
+
apiKey: auth.apiKey,
|
|
1247
|
+
privateKey: auth.privateKey || '',
|
|
1248
|
+
vaultAddress: auth.multiSigAddress || '',
|
|
1249
|
+
rpcUrl: auth.rpcUrl,
|
|
1250
|
+
};
|
|
1251
|
+
}
|
|
1252
|
+
async function placeOpinionOrder(auth, tokenId, side, price, size, orderType = 'GTC') {
|
|
1253
|
+
if (!auth.privateKey) {
|
|
1254
|
+
return { success: false, error: 'Opinion privateKey required for order signing' };
|
|
1255
|
+
}
|
|
1256
|
+
if (!auth.multiSigAddress) {
|
|
1257
|
+
return { success: false, error: 'Opinion multiSigAddress (vaultAddress) required for trading' };
|
|
1258
|
+
}
|
|
1259
|
+
const config = toOpinionConfig(auth);
|
|
1260
|
+
// Extract marketId from tokenId (Opinion tokens use format: marketId-outcomeIndex)
|
|
1261
|
+
const marketId = parseInt(tokenId.split('-')[0], 10) || 0;
|
|
1262
|
+
const result = await opinion.placeOrder(config, marketId, tokenId, side === 'buy' ? 'BUY' : 'SELL', price, size, orderType === 'FOK' ? 'MARKET' : 'LIMIT');
|
|
1263
|
+
return {
|
|
1264
|
+
success: result.success,
|
|
1265
|
+
orderId: result.orderId,
|
|
1266
|
+
status: result.status,
|
|
1267
|
+
error: result.error,
|
|
1268
|
+
};
|
|
1269
|
+
}
|
|
1270
|
+
async function cancelOpinionOrder(auth, orderId) {
|
|
1271
|
+
const config = toOpinionConfig(auth);
|
|
1272
|
+
return opinion.cancelOrder(config, orderId);
|
|
1273
|
+
}
|
|
1274
|
+
async function getOpinionOpenOrders(auth) {
|
|
1275
|
+
const config = toOpinionConfig(auth);
|
|
1276
|
+
try {
|
|
1277
|
+
const orders = await opinion.getOpenOrders(config);
|
|
1278
|
+
return orders.map((o) => ({
|
|
1279
|
+
orderId: o.orderId,
|
|
1280
|
+
platform: 'opinion',
|
|
1281
|
+
marketId: o.marketId?.toString() || '',
|
|
1282
|
+
tokenId: o.orderId, // tokenId not directly available from getOpenOrders
|
|
1283
|
+
side: o.side.toLowerCase(),
|
|
1284
|
+
price: parseFloat(o.price),
|
|
1285
|
+
originalSize: parseFloat(o.orderShares),
|
|
1286
|
+
remainingSize: parseFloat(o.orderShares) - parseFloat(o.filledShares || '0'),
|
|
1287
|
+
filledSize: parseFloat(o.filledShares || '0'),
|
|
1288
|
+
orderType: 'GTC',
|
|
1289
|
+
status: o.status.toLowerCase(),
|
|
1290
|
+
createdAt: new Date(o.createdAt),
|
|
1291
|
+
}));
|
|
1292
|
+
}
|
|
1293
|
+
catch (error) {
|
|
1294
|
+
logger_1.logger.error({ error }, 'Error fetching Opinion orders');
|
|
1295
|
+
return [];
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
async function placeOpinionOrdersBatch(auth, orders) {
|
|
1299
|
+
if (!auth.privateKey || !auth.multiSigAddress) {
|
|
1300
|
+
return orders.map(() => ({
|
|
1301
|
+
success: false,
|
|
1302
|
+
error: 'Opinion privateKey and multiSigAddress required for order signing',
|
|
1303
|
+
}));
|
|
1304
|
+
}
|
|
1305
|
+
const config = toOpinionConfig(auth);
|
|
1306
|
+
const results = await opinion.placeOrdersBatch(config, orders);
|
|
1307
|
+
return results.map(r => ({
|
|
1308
|
+
success: r.success,
|
|
1309
|
+
orderId: r.orderId,
|
|
1310
|
+
error: r.error,
|
|
1311
|
+
}));
|
|
1312
|
+
}
|
|
1313
|
+
async function cancelOpinionOrdersBatch(auth, orderIds) {
|
|
1314
|
+
const config = toOpinionConfig(auth);
|
|
1315
|
+
return opinion.cancelOrdersBatch(config, orderIds);
|
|
1316
|
+
}
|
|
1317
|
+
async function cancelAllOpinionOrders(auth, marketId) {
|
|
1318
|
+
const config = toOpinionConfig(auth);
|
|
1319
|
+
const result = await opinion.cancelAllOrders(config, marketId ? parseInt(marketId, 10) : undefined);
|
|
1320
|
+
return result.cancelled;
|
|
1321
|
+
}
|
|
1322
|
+
// =============================================================================
|
|
1323
|
+
// PREDICTFUN EXECUTION
|
|
1324
|
+
// =============================================================================
|
|
1325
|
+
async function placePredictFunOrder(config, tokenId, side, price, size, marketId) {
|
|
1326
|
+
try {
|
|
1327
|
+
const result = await predictfun.createOrder({ ...config, dryRun: false }, {
|
|
1328
|
+
marketId,
|
|
1329
|
+
tokenId,
|
|
1330
|
+
side: side.toUpperCase(),
|
|
1331
|
+
price,
|
|
1332
|
+
quantity: size,
|
|
1333
|
+
isYieldBearing: true, // Default to yield-bearing
|
|
1334
|
+
});
|
|
1335
|
+
if (!result.success) {
|
|
1336
|
+
return {
|
|
1337
|
+
success: false,
|
|
1338
|
+
error: result.error || 'Order placement failed',
|
|
1339
|
+
};
|
|
1340
|
+
}
|
|
1341
|
+
logger_1.logger.info({ orderHash: result.orderHash, tokenId, side, price, size }, 'PredictFun order placed');
|
|
1342
|
+
return {
|
|
1343
|
+
success: true,
|
|
1344
|
+
orderId: result.orderHash,
|
|
1345
|
+
status: 'open',
|
|
1346
|
+
};
|
|
1347
|
+
}
|
|
1348
|
+
catch (error) {
|
|
1349
|
+
logger_1.logger.error({ error }, 'Error placing PredictFun order');
|
|
1350
|
+
return {
|
|
1351
|
+
success: false,
|
|
1352
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
1353
|
+
};
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
async function cancelPredictFunOrder(config, orderHash) {
|
|
1357
|
+
try {
|
|
1358
|
+
// We need to figure out if it's negRisk/yieldBearing by fetching orders first
|
|
1359
|
+
const orders = await predictfun.getOpenOrders(config);
|
|
1360
|
+
const order = orders.find(o => o.orderHash === orderHash);
|
|
1361
|
+
if (!order) {
|
|
1362
|
+
logger_1.logger.warn({ orderHash }, 'Order not found for cancellation');
|
|
1363
|
+
return false;
|
|
1364
|
+
}
|
|
1365
|
+
const result = await predictfun.cancelOrders(config, [orderHash], { isNegRisk: order.isNegRisk, isYieldBearing: order.isYieldBearing });
|
|
1366
|
+
if (!result.success) {
|
|
1367
|
+
logger_1.logger.error({ orderHash, error: result.error }, 'Failed to cancel PredictFun order');
|
|
1368
|
+
return false;
|
|
1369
|
+
}
|
|
1370
|
+
logger_1.logger.info({ orderHash }, 'PredictFun order cancelled');
|
|
1371
|
+
return true;
|
|
1372
|
+
}
|
|
1373
|
+
catch (error) {
|
|
1374
|
+
logger_1.logger.error({ error, orderHash }, 'Error cancelling PredictFun order');
|
|
1375
|
+
return false;
|
|
1376
|
+
}
|
|
1377
|
+
}
|
|
1378
|
+
async function cancelAllPredictFunOrders(config) {
|
|
1379
|
+
try {
|
|
1380
|
+
const result = await predictfun.cancelAllOrders(config);
|
|
1381
|
+
return result.cancelled;
|
|
1382
|
+
}
|
|
1383
|
+
catch (error) {
|
|
1384
|
+
logger_1.logger.error({ error }, 'Error cancelling all PredictFun orders');
|
|
1385
|
+
return 0;
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
async function getPredictFunOpenOrders(config) {
|
|
1389
|
+
try {
|
|
1390
|
+
const orders = await predictfun.getOpenOrders(config);
|
|
1391
|
+
return orders.map((o) => ({
|
|
1392
|
+
orderId: o.orderHash,
|
|
1393
|
+
platform: 'predictfun',
|
|
1394
|
+
marketId: o.marketId,
|
|
1395
|
+
tokenId: o.orderHash, // Use hash as tokenId fallback
|
|
1396
|
+
side: o.side.toLowerCase(),
|
|
1397
|
+
price: parseFloat(o.price),
|
|
1398
|
+
originalSize: parseFloat(o.size),
|
|
1399
|
+
remainingSize: parseFloat(o.size) - parseFloat(o.filled),
|
|
1400
|
+
filledSize: parseFloat(o.filled),
|
|
1401
|
+
orderType: 'GTC',
|
|
1402
|
+
status: o.status.toLowerCase(),
|
|
1403
|
+
createdAt: new Date(o.createdAt),
|
|
1404
|
+
}));
|
|
1405
|
+
}
|
|
1406
|
+
catch (error) {
|
|
1407
|
+
logger_1.logger.error({ error }, 'Error fetching PredictFun orders');
|
|
1408
|
+
return [];
|
|
1409
|
+
}
|
|
1410
|
+
}
|
|
1411
|
+
/**
|
|
1412
|
+
* Fetch PredictFun orderbook for slippage calculation
|
|
1413
|
+
*/
|
|
1414
|
+
async function fetchPredictFunOrderbook(config, marketId) {
|
|
1415
|
+
try {
|
|
1416
|
+
const data = await predictfun.getOrderbook(config, marketId);
|
|
1417
|
+
if (!data)
|
|
1418
|
+
return null;
|
|
1419
|
+
const bids = (data.bids || [])
|
|
1420
|
+
.map(b => [parseFloat(b.price), parseFloat(b.size)])
|
|
1421
|
+
.filter(([price, size]) => !isNaN(price) && !isNaN(size))
|
|
1422
|
+
.sort((a, b) => b[0] - a[0]);
|
|
1423
|
+
const asks = (data.asks || [])
|
|
1424
|
+
.map(a => [parseFloat(a.price), parseFloat(a.size)])
|
|
1425
|
+
.filter(([price, size]) => !isNaN(price) && !isNaN(size))
|
|
1426
|
+
.sort((a, b) => a[0] - b[0]);
|
|
1427
|
+
const bestBid = bids[0]?.[0] ?? 0;
|
|
1428
|
+
const bestAsk = asks[0]?.[0] ?? 0.99;
|
|
1429
|
+
const midPrice = (bestBid + bestAsk) / 2;
|
|
1430
|
+
return { bids, asks, midPrice };
|
|
1431
|
+
}
|
|
1432
|
+
catch (error) {
|
|
1433
|
+
logger_1.logger.warn({ error, marketId }, 'Failed to fetch PredictFun orderbook');
|
|
1434
|
+
return null;
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
/**
|
|
1438
|
+
* Fetch Opinion orderbook for slippage calculation
|
|
1439
|
+
*/
|
|
1440
|
+
async function fetchOpinionOrderbook(tokenId) {
|
|
1441
|
+
try {
|
|
1442
|
+
const response = await fetch(`https://proxy.opinion.trade:8443/openapi/token/orderbook?tokenId=${encodeURIComponent(tokenId)}`);
|
|
1443
|
+
if (!response.ok)
|
|
1444
|
+
return null;
|
|
1445
|
+
const data = await response.json();
|
|
1446
|
+
const orderbook = data.orderbook || data;
|
|
1447
|
+
const bids = (orderbook.bids || [])
|
|
1448
|
+
.map(b => [parseFloat(b.price), parseFloat(b.size)])
|
|
1449
|
+
.filter(([price, size]) => !isNaN(price) && !isNaN(size))
|
|
1450
|
+
.sort((a, b) => b[0] - a[0]);
|
|
1451
|
+
const asks = (orderbook.asks || [])
|
|
1452
|
+
.map(a => [parseFloat(a.price), parseFloat(a.size)])
|
|
1453
|
+
.filter(([price, size]) => !isNaN(price) && !isNaN(size))
|
|
1454
|
+
.sort((a, b) => a[0] - b[0]);
|
|
1455
|
+
const bestBid = bids[0]?.[0] ?? 0;
|
|
1456
|
+
const bestAsk = asks[0]?.[0] ?? 0.99;
|
|
1457
|
+
const midPrice = (bestBid + bestAsk) / 2;
|
|
1458
|
+
return { bids, asks, midPrice };
|
|
1459
|
+
}
|
|
1460
|
+
catch (error) {
|
|
1461
|
+
logger_1.logger.warn({ error, tokenId }, 'Failed to fetch Opinion orderbook');
|
|
1462
|
+
return null;
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
// =============================================================================
|
|
1466
|
+
// POLYMARKET SETTLEMENT & APPROVAL
|
|
1467
|
+
// =============================================================================
|
|
1468
|
+
// USDC contract address on Polygon
|
|
1469
|
+
const POLY_USDC_ADDRESS = process.env.POLY_USDC_ADDRESS || '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174';
|
|
1470
|
+
// Conditional Token Framework address
|
|
1471
|
+
const POLY_CTF_ADDRESS = process.env.POLY_CTF_ADDRESS || '0x4D97DCd97eC945f40cF65F87097ACe5EA0476045';
|
|
1472
|
+
/**
|
|
1473
|
+
* Get pending settlements for resolved markets
|
|
1474
|
+
*/
|
|
1475
|
+
async function getPolymarketPendingSettlements(auth, funderAddress) {
|
|
1476
|
+
const address = funderAddress || auth.address;
|
|
1477
|
+
const url = `${POLY_CLOB_URL}/positions?address=${address}`;
|
|
1478
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)(auth, 'GET', url);
|
|
1479
|
+
try {
|
|
1480
|
+
const response = await fetch(url, { headers });
|
|
1481
|
+
if (!response.ok) {
|
|
1482
|
+
throw new Error(`HTTP ${response.status}`);
|
|
1483
|
+
}
|
|
1484
|
+
const positions = await response.json();
|
|
1485
|
+
// Filter to resolved positions with claimable amounts
|
|
1486
|
+
return positions
|
|
1487
|
+
.filter(p => p.resolved && parseFloat(p.claimable || '0') > 0)
|
|
1488
|
+
.map(p => ({
|
|
1489
|
+
marketId: p.market_id || p.condition_id || '',
|
|
1490
|
+
conditionId: p.condition_id || '',
|
|
1491
|
+
tokenId: p.asset_id || '',
|
|
1492
|
+
outcome: (p.outcome?.toLowerCase() || 'yes'),
|
|
1493
|
+
size: parseFloat(p.size || '0'),
|
|
1494
|
+
claimable: parseFloat(p.claimable || '0'),
|
|
1495
|
+
resolutionStatus: 'resolved',
|
|
1496
|
+
resolvedAt: undefined, // API doesn't return resolution time
|
|
1497
|
+
}));
|
|
1498
|
+
}
|
|
1499
|
+
catch (error) {
|
|
1500
|
+
logger_1.logger.error({ error, address }, 'Failed to fetch pending settlements');
|
|
1501
|
+
return [];
|
|
1502
|
+
}
|
|
1503
|
+
}
|
|
1504
|
+
/**
|
|
1505
|
+
* Approve USDC spending for CTF exchange (required before first trade)
|
|
1506
|
+
* This requires a transaction signing - returns the approval status
|
|
1507
|
+
*/
|
|
1508
|
+
async function approvePolymarketUSDC(privateKey, spender, amount = Number.MAX_SAFE_INTEGER) {
|
|
1509
|
+
try {
|
|
1510
|
+
const { Wallet, Contract, JsonRpcProvider, MaxUint256 } = await Promise.resolve().then(() => __importStar(require('ethers')));
|
|
1511
|
+
const rpcUrl = process.env.POLYGON_RPC_URL || 'https://polygon-rpc.com';
|
|
1512
|
+
const provider = new JsonRpcProvider(rpcUrl);
|
|
1513
|
+
const wallet = new Wallet(privateKey, provider);
|
|
1514
|
+
// USDC on Polygon
|
|
1515
|
+
const USDC_ADDRESS = '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174';
|
|
1516
|
+
const ERC20_ABI = ['function approve(address spender, uint256 amount) returns (bool)'];
|
|
1517
|
+
const usdc = new Contract(USDC_ADDRESS, ERC20_ABI, wallet);
|
|
1518
|
+
const tx = await usdc.approve(spender, MaxUint256);
|
|
1519
|
+
const receipt = await tx.wait();
|
|
1520
|
+
logger_1.logger.info({ txHash: receipt.hash, spender }, 'USDC approval confirmed');
|
|
1521
|
+
return { success: true, txHash: receipt.hash };
|
|
1522
|
+
}
|
|
1523
|
+
catch (error) {
|
|
1524
|
+
logger_1.logger.error({ error, spender }, 'USDC approval failed');
|
|
1525
|
+
return {
|
|
1526
|
+
success: false,
|
|
1527
|
+
error: error instanceof Error ? error.message : 'Approval failed',
|
|
1528
|
+
};
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
/**
|
|
1532
|
+
* Get current USDC allowance for trading
|
|
1533
|
+
*/
|
|
1534
|
+
async function getPolymarketUSDCAllowance(ownerAddress, spenderAddress) {
|
|
1535
|
+
try {
|
|
1536
|
+
// ERC20 allowance check via RPC
|
|
1537
|
+
// This is a read-only call that doesn't require signing
|
|
1538
|
+
const allowanceSelector = '0xdd62ed3e'; // allowance(address,address)
|
|
1539
|
+
const paddedOwner = ownerAddress.slice(2).toLowerCase().padStart(64, '0');
|
|
1540
|
+
const paddedSpender = spenderAddress.slice(2).toLowerCase().padStart(64, '0');
|
|
1541
|
+
const data = `${allowanceSelector}${paddedOwner}${paddedSpender}`;
|
|
1542
|
+
const rpcUrl = process.env.POLYGON_RPC_URL || 'https://polygon-rpc.com';
|
|
1543
|
+
const response = await fetch(rpcUrl, {
|
|
1544
|
+
method: 'POST',
|
|
1545
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1546
|
+
body: JSON.stringify({
|
|
1547
|
+
jsonrpc: '2.0',
|
|
1548
|
+
method: 'eth_call',
|
|
1549
|
+
params: [{ to: POLY_USDC_ADDRESS, data }, 'latest'],
|
|
1550
|
+
id: 1,
|
|
1551
|
+
}),
|
|
1552
|
+
});
|
|
1553
|
+
const result = await response.json();
|
|
1554
|
+
if (!result.result || result.result === '0x') {
|
|
1555
|
+
return 0;
|
|
1556
|
+
}
|
|
1557
|
+
// USDC has 6 decimals
|
|
1558
|
+
const allowanceWei = BigInt(result.result);
|
|
1559
|
+
return Number(allowanceWei) / 1e6;
|
|
1560
|
+
}
|
|
1561
|
+
catch (error) {
|
|
1562
|
+
logger_1.logger.warn({ error, ownerAddress }, 'Failed to fetch USDC allowance');
|
|
1563
|
+
return 0;
|
|
1564
|
+
}
|
|
1565
|
+
}
|
|
1566
|
+
/**
|
|
1567
|
+
* Batch fetch orderbooks for multiple tokens
|
|
1568
|
+
*/
|
|
1569
|
+
async function getPolymarketOrderbooksBatch(tokenIds) {
|
|
1570
|
+
const results = new Map();
|
|
1571
|
+
// Fetch in parallel with concurrency limit
|
|
1572
|
+
const BATCH_SIZE = 10;
|
|
1573
|
+
for (let i = 0; i < tokenIds.length; i += BATCH_SIZE) {
|
|
1574
|
+
const batch = tokenIds.slice(i, i + BATCH_SIZE);
|
|
1575
|
+
const promises = batch.map(async (tokenId) => {
|
|
1576
|
+
try {
|
|
1577
|
+
const response = await fetch(`${POLY_CLOB_URL}/book?token_id=${tokenId}`);
|
|
1578
|
+
if (!response.ok) {
|
|
1579
|
+
results.set(tokenId, null);
|
|
1580
|
+
return;
|
|
1581
|
+
}
|
|
1582
|
+
const data = await response.json();
|
|
1583
|
+
const bids = (data.bids || [])
|
|
1584
|
+
.map((b) => [parseFloat(b.price), parseFloat(b.size)])
|
|
1585
|
+
.sort((a, b) => b[0] - a[0]);
|
|
1586
|
+
const asks = (data.asks || [])
|
|
1587
|
+
.map((a) => [parseFloat(a.price), parseFloat(a.size)])
|
|
1588
|
+
.sort((a, b) => a[0] - b[0]);
|
|
1589
|
+
const bestBid = bids[0]?.[0] ?? 0;
|
|
1590
|
+
const bestAsk = asks[0]?.[0] ?? 0.99;
|
|
1591
|
+
const midPrice = (bestBid + bestAsk) / 2;
|
|
1592
|
+
results.set(tokenId, { bids, asks, midPrice });
|
|
1593
|
+
}
|
|
1594
|
+
catch {
|
|
1595
|
+
results.set(tokenId, null);
|
|
1596
|
+
}
|
|
1597
|
+
});
|
|
1598
|
+
await Promise.all(promises);
|
|
1599
|
+
}
|
|
1600
|
+
return results;
|
|
1601
|
+
}
|
|
1602
|
+
// =============================================================================
|
|
1603
|
+
// EXECUTION SERVICE
|
|
1604
|
+
// =============================================================================
|
|
1605
|
+
function createExecutionService(config) {
|
|
1606
|
+
const maxOrderSize = config.maxOrderSize || 1000; // Default $1000 max
|
|
1607
|
+
// ==========================================================================
|
|
1608
|
+
// REAL-TIME FILL TRACKING (Polymarket WebSocket)
|
|
1609
|
+
// ==========================================================================
|
|
1610
|
+
let userWs = null;
|
|
1611
|
+
const trackedFills = new Map();
|
|
1612
|
+
const trackedOrders = new Map();
|
|
1613
|
+
const fillCallbacks = new Set();
|
|
1614
|
+
const orderCallbacks = new Set();
|
|
1615
|
+
const fillWaiters = new Map();
|
|
1616
|
+
// Circuit breaker integration
|
|
1617
|
+
let circuitBreaker = null;
|
|
1618
|
+
function handleFillEvent(event) {
|
|
1619
|
+
const fill = {
|
|
1620
|
+
orderId: event.orderId,
|
|
1621
|
+
marketId: event.marketId,
|
|
1622
|
+
tokenId: event.tokenId,
|
|
1623
|
+
side: event.side.toLowerCase(),
|
|
1624
|
+
size: event.size,
|
|
1625
|
+
price: event.price,
|
|
1626
|
+
status: event.status,
|
|
1627
|
+
transactionHash: event.transactionHash,
|
|
1628
|
+
timestamp: event.timestamp,
|
|
1629
|
+
receivedAt: Date.now(),
|
|
1630
|
+
};
|
|
1631
|
+
// Update or insert (only if higher priority status)
|
|
1632
|
+
const existing = trackedFills.get(event.orderId);
|
|
1633
|
+
if (!existing || getStatusPriority(fill.status) > getStatusPriority(existing.status)) {
|
|
1634
|
+
trackedFills.set(event.orderId, fill);
|
|
1635
|
+
logger_1.logger.info({ fill }, 'Fill tracked via WebSocket');
|
|
1636
|
+
// Notify subscribers
|
|
1637
|
+
for (const callback of fillCallbacks) {
|
|
1638
|
+
try {
|
|
1639
|
+
callback(fill);
|
|
1640
|
+
}
|
|
1641
|
+
catch (err) {
|
|
1642
|
+
logger_1.logger.error({ err }, 'Fill callback error');
|
|
1643
|
+
}
|
|
1644
|
+
}
|
|
1645
|
+
// Resolve waiters if CONFIRMED or FAILED
|
|
1646
|
+
if (fill.status === 'CONFIRMED' || fill.status === 'FAILED') {
|
|
1647
|
+
const waiters = fillWaiters.get(event.orderId);
|
|
1648
|
+
if (waiters) {
|
|
1649
|
+
for (const resolve of waiters) {
|
|
1650
|
+
resolve(fill);
|
|
1651
|
+
}
|
|
1652
|
+
fillWaiters.delete(event.orderId);
|
|
1653
|
+
}
|
|
1654
|
+
}
|
|
1655
|
+
}
|
|
1656
|
+
}
|
|
1657
|
+
function handleOrderEvent(event) {
|
|
1658
|
+
const order = {
|
|
1659
|
+
orderId: event.orderId,
|
|
1660
|
+
marketId: event.marketId,
|
|
1661
|
+
tokenId: event.tokenId,
|
|
1662
|
+
type: event.type,
|
|
1663
|
+
side: event.side.toLowerCase(),
|
|
1664
|
+
price: event.price,
|
|
1665
|
+
originalSize: event.originalSize,
|
|
1666
|
+
sizeMatched: event.sizeMatched,
|
|
1667
|
+
timestamp: event.timestamp,
|
|
1668
|
+
receivedAt: Date.now(),
|
|
1669
|
+
};
|
|
1670
|
+
trackedOrders.set(event.orderId, order);
|
|
1671
|
+
logger_1.logger.info({ order }, 'Order event tracked via WebSocket');
|
|
1672
|
+
// Notify subscribers
|
|
1673
|
+
for (const callback of orderCallbacks) {
|
|
1674
|
+
try {
|
|
1675
|
+
callback(order);
|
|
1676
|
+
}
|
|
1677
|
+
catch (err) {
|
|
1678
|
+
logger_1.logger.error({ err }, 'Order callback error');
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1681
|
+
}
|
|
1682
|
+
function getStatusPriority(status) {
|
|
1683
|
+
switch (status) {
|
|
1684
|
+
case 'MATCHED': return 1;
|
|
1685
|
+
case 'MINED': return 2;
|
|
1686
|
+
case 'CONFIRMED': return 3;
|
|
1687
|
+
case 'FAILED': return 0;
|
|
1688
|
+
default: return -1;
|
|
1689
|
+
}
|
|
1690
|
+
}
|
|
1691
|
+
async function connectFillsWebSocket() {
|
|
1692
|
+
if (!config.polymarket) {
|
|
1693
|
+
throw new Error('Polymarket not configured');
|
|
1694
|
+
}
|
|
1695
|
+
if (userWs?.isConnected()) {
|
|
1696
|
+
return;
|
|
1697
|
+
}
|
|
1698
|
+
const userId = config.polymarket.funderAddress || config.polymarket.apiKey;
|
|
1699
|
+
userWs = (0, user_ws_1.createUserWebSocket)(userId, {
|
|
1700
|
+
privateKey: config.polymarket.privateKey || '',
|
|
1701
|
+
apiKey: config.polymarket.apiKey,
|
|
1702
|
+
apiSecret: config.polymarket.apiSecret,
|
|
1703
|
+
apiPassphrase: config.polymarket.apiPassphrase,
|
|
1704
|
+
funderAddress: config.polymarket.funderAddress || '',
|
|
1705
|
+
});
|
|
1706
|
+
userWs.on('fill', handleFillEvent);
|
|
1707
|
+
userWs.on('order', handleOrderEvent);
|
|
1708
|
+
userWs.on('error', (err) => {
|
|
1709
|
+
logger_1.logger.error({ err }, 'Fills WebSocket error');
|
|
1710
|
+
});
|
|
1711
|
+
await userWs.connect();
|
|
1712
|
+
logger_1.logger.info('Fills WebSocket connected - real-time order confirmations enabled');
|
|
1713
|
+
}
|
|
1714
|
+
function disconnectFillsWebSocket() {
|
|
1715
|
+
if (userWs) {
|
|
1716
|
+
userWs.disconnect();
|
|
1717
|
+
userWs = null;
|
|
1718
|
+
logger_1.logger.info('Fills WebSocket disconnected');
|
|
1719
|
+
}
|
|
1720
|
+
}
|
|
1721
|
+
// ==========================================================================
|
|
1722
|
+
// ORDER HEARTBEAT (Polymarket - orders cancelled if no heartbeat within 10s)
|
|
1723
|
+
// ==========================================================================
|
|
1724
|
+
let heartbeatId = null;
|
|
1725
|
+
let heartbeatInterval = null;
|
|
1726
|
+
const HEARTBEAT_INTERVAL_MS = 8000; // 8s to be safe (10s timeout)
|
|
1727
|
+
async function postHeartbeat(existingId) {
|
|
1728
|
+
if (!config.polymarket) {
|
|
1729
|
+
throw new Error('Polymarket not configured');
|
|
1730
|
+
}
|
|
1731
|
+
const url = `${POLY_CLOB_URL}/heartbeat`;
|
|
1732
|
+
const body = existingId ? { heartbeat_id: existingId } : {};
|
|
1733
|
+
const headers = (0, polymarket_auth_1.buildPolymarketHeadersForUrl)({
|
|
1734
|
+
address: config.polymarket.funderAddress || '',
|
|
1735
|
+
apiKey: config.polymarket.apiKey,
|
|
1736
|
+
apiSecret: config.polymarket.apiSecret,
|
|
1737
|
+
apiPassphrase: config.polymarket.apiPassphrase,
|
|
1738
|
+
}, 'POST', url);
|
|
1739
|
+
const response = await fetch(url, {
|
|
1740
|
+
method: 'POST',
|
|
1741
|
+
headers: {
|
|
1742
|
+
'Content-Type': 'application/json',
|
|
1743
|
+
...headers,
|
|
1744
|
+
},
|
|
1745
|
+
body: JSON.stringify(body),
|
|
1746
|
+
});
|
|
1747
|
+
if (!response.ok) {
|
|
1748
|
+
const text = await response.text();
|
|
1749
|
+
throw new Error(`Heartbeat failed: ${response.status} ${text}`);
|
|
1750
|
+
}
|
|
1751
|
+
const data = await response.json();
|
|
1752
|
+
return data.heartbeat_id || existingId || '';
|
|
1753
|
+
}
|
|
1754
|
+
async function startHeartbeat() {
|
|
1755
|
+
if (heartbeatInterval) {
|
|
1756
|
+
// Already running, just return current ID
|
|
1757
|
+
if (heartbeatId)
|
|
1758
|
+
return heartbeatId;
|
|
1759
|
+
}
|
|
1760
|
+
// Initial heartbeat
|
|
1761
|
+
heartbeatId = await postHeartbeat();
|
|
1762
|
+
logger_1.logger.info({ heartbeatId }, 'Polymarket heartbeat started');
|
|
1763
|
+
// Start recurring heartbeat
|
|
1764
|
+
heartbeatInterval = setInterval(async () => {
|
|
1765
|
+
try {
|
|
1766
|
+
heartbeatId = await postHeartbeat(heartbeatId || undefined);
|
|
1767
|
+
logger_1.logger.debug({ heartbeatId }, 'Heartbeat sent');
|
|
1768
|
+
}
|
|
1769
|
+
catch (err) {
|
|
1770
|
+
logger_1.logger.error({ err }, 'Heartbeat failed - orders may be cancelled');
|
|
1771
|
+
}
|
|
1772
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
1773
|
+
return heartbeatId;
|
|
1774
|
+
}
|
|
1775
|
+
async function sendHeartbeat(id) {
|
|
1776
|
+
heartbeatId = await postHeartbeat(id);
|
|
1777
|
+
return heartbeatId;
|
|
1778
|
+
}
|
|
1779
|
+
function stopHeartbeat() {
|
|
1780
|
+
if (heartbeatInterval) {
|
|
1781
|
+
clearInterval(heartbeatInterval);
|
|
1782
|
+
heartbeatInterval = null;
|
|
1783
|
+
}
|
|
1784
|
+
heartbeatId = null;
|
|
1785
|
+
logger_1.logger.info('Polymarket heartbeat stopped');
|
|
1786
|
+
}
|
|
1787
|
+
function isHeartbeatActive() {
|
|
1788
|
+
return heartbeatInterval !== null;
|
|
1789
|
+
}
|
|
1790
|
+
function waitForFill(orderId, timeoutMs = 60000) {
|
|
1791
|
+
// Check if already have a confirmed/failed fill
|
|
1792
|
+
const existing = trackedFills.get(orderId);
|
|
1793
|
+
if (existing && (existing.status === 'CONFIRMED' || existing.status === 'FAILED')) {
|
|
1794
|
+
return Promise.resolve(existing);
|
|
1795
|
+
}
|
|
1796
|
+
return new Promise((resolve) => {
|
|
1797
|
+
// Set up timeout
|
|
1798
|
+
const timeout = setTimeout(() => {
|
|
1799
|
+
const waiters = fillWaiters.get(orderId);
|
|
1800
|
+
if (waiters) {
|
|
1801
|
+
const idx = waiters.indexOf(resolve);
|
|
1802
|
+
if (idx !== -1)
|
|
1803
|
+
waiters.splice(idx, 1);
|
|
1804
|
+
if (waiters.length === 0)
|
|
1805
|
+
fillWaiters.delete(orderId);
|
|
1806
|
+
}
|
|
1807
|
+
resolve(null); // Timeout - return null
|
|
1808
|
+
}, timeoutMs);
|
|
1809
|
+
// Add to waiters
|
|
1810
|
+
const resolveWrapper = (fill) => {
|
|
1811
|
+
clearTimeout(timeout);
|
|
1812
|
+
resolve(fill);
|
|
1813
|
+
};
|
|
1814
|
+
if (!fillWaiters.has(orderId)) {
|
|
1815
|
+
fillWaiters.set(orderId, []);
|
|
1816
|
+
}
|
|
1817
|
+
fillWaiters.get(orderId).push(resolveWrapper);
|
|
1818
|
+
});
|
|
1819
|
+
}
|
|
1820
|
+
// ==========================================================================
|
|
1821
|
+
function validateOrder(request) {
|
|
1822
|
+
// Circuit breaker check - block orders when tripped
|
|
1823
|
+
if (circuitBreaker && !circuitBreaker.canTrade()) {
|
|
1824
|
+
const state = circuitBreaker.getState();
|
|
1825
|
+
return `Trading blocked by circuit breaker: ${state.tripReason || 'tripped'}. Reset at: ${state.resetAt?.toISOString() || 'manual reset required'}`;
|
|
1826
|
+
}
|
|
1827
|
+
const notional = request.price * request.size;
|
|
1828
|
+
if (notional > maxOrderSize) {
|
|
1829
|
+
return `Order size $${notional.toFixed(2)} exceeds max $${maxOrderSize}`;
|
|
1830
|
+
}
|
|
1831
|
+
if (request.price < 0.01 || request.price > 0.99) {
|
|
1832
|
+
return `Price ${request.price} out of range [0.01, 0.99]`;
|
|
1833
|
+
}
|
|
1834
|
+
if (request.size <= 0) {
|
|
1835
|
+
return `Invalid size: ${request.size}`;
|
|
1836
|
+
}
|
|
1837
|
+
return null;
|
|
1838
|
+
}
|
|
1839
|
+
/**
|
|
1840
|
+
* Record order result to circuit breaker (if enabled)
|
|
1841
|
+
* Note: P&L is calculated when position is closed, not on order placement
|
|
1842
|
+
*/
|
|
1843
|
+
function recordOrderToCircuitBreaker(result, sizeUsd) {
|
|
1844
|
+
if (!circuitBreaker)
|
|
1845
|
+
return;
|
|
1846
|
+
// Record as trade (P&L = 0 for now, actual P&L tracked on fills/closes)
|
|
1847
|
+
circuitBreaker.recordTrade({
|
|
1848
|
+
pnlUsd: 0, // P&L unknown at order time
|
|
1849
|
+
success: result.success,
|
|
1850
|
+
sizeUsd,
|
|
1851
|
+
error: result.error,
|
|
1852
|
+
});
|
|
1853
|
+
// Record error if order failed
|
|
1854
|
+
if (!result.success && result.error) {
|
|
1855
|
+
circuitBreaker.recordError(result.error);
|
|
1856
|
+
}
|
|
1857
|
+
}
|
|
1858
|
+
async function executeOrder(request) {
|
|
1859
|
+
// Validate
|
|
1860
|
+
const error = validateOrder(request);
|
|
1861
|
+
if (error) {
|
|
1862
|
+
return { success: false, error };
|
|
1863
|
+
}
|
|
1864
|
+
// Security shield pre-trade check (runs before dry-run so security is always enforced)
|
|
1865
|
+
if (request.destination) {
|
|
1866
|
+
try {
|
|
1867
|
+
const { getSecurityShield } = await Promise.resolve().then(() => __importStar(require('../security/shield.js')));
|
|
1868
|
+
const shield = getSecurityShield();
|
|
1869
|
+
const check = await shield.validateTx({
|
|
1870
|
+
destination: request.destination,
|
|
1871
|
+
amount: request.size,
|
|
1872
|
+
token: request.token,
|
|
1873
|
+
});
|
|
1874
|
+
if (!check.allowed) {
|
|
1875
|
+
return { success: false, error: `Security blocked: ${check.flags.join(', ')}` };
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
catch (err) {
|
|
1879
|
+
// Shield not loaded or RPC failure — log but don't block
|
|
1880
|
+
logger_1.logger.debug({ err }, 'Security shield check skipped');
|
|
1881
|
+
}
|
|
1882
|
+
}
|
|
1883
|
+
// Dry run mode
|
|
1884
|
+
if (config.dryRun) {
|
|
1885
|
+
logger_1.logger.info({ ...request, dryRun: true }, 'Dry run order');
|
|
1886
|
+
return {
|
|
1887
|
+
success: true,
|
|
1888
|
+
orderId: `dry_${(0, crypto_1.randomBytes)(8).toString('hex')}`,
|
|
1889
|
+
status: 'open',
|
|
1890
|
+
};
|
|
1891
|
+
}
|
|
1892
|
+
// Execute on appropriate platform
|
|
1893
|
+
if (request.platform === 'polymarket') {
|
|
1894
|
+
if (!config.polymarket) {
|
|
1895
|
+
return { success: false, error: 'Polymarket not configured' };
|
|
1896
|
+
}
|
|
1897
|
+
if (!request.tokenId) {
|
|
1898
|
+
return { success: false, error: 'tokenId required for Polymarket' };
|
|
1899
|
+
}
|
|
1900
|
+
const result = await placePolymarketOrder(config.polymarket, request.tokenId, request.side, request.price, request.size, request.orderType, request.negRisk, request.postOnly);
|
|
1901
|
+
// Auto-start heartbeat for GTC/GTD orders (orders that stay on the book)
|
|
1902
|
+
// Polymarket cancels orders if no heartbeat received within 10 seconds
|
|
1903
|
+
if (result.success && (request.orderType === 'GTC' || request.orderType === 'GTD')) {
|
|
1904
|
+
if (!isHeartbeatActive()) {
|
|
1905
|
+
try {
|
|
1906
|
+
await startHeartbeat();
|
|
1907
|
+
logger_1.logger.info('Heartbeat auto-started for GTC order');
|
|
1908
|
+
}
|
|
1909
|
+
catch (err) {
|
|
1910
|
+
logger_1.logger.warn({ err }, 'Failed to auto-start heartbeat (order placed but heartbeat not started)');
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
return result;
|
|
1915
|
+
}
|
|
1916
|
+
if (request.platform === 'kalshi') {
|
|
1917
|
+
if (!config.kalshi) {
|
|
1918
|
+
return { success: false, error: 'Kalshi not configured' };
|
|
1919
|
+
}
|
|
1920
|
+
const outcome = request.outcome?.toLowerCase() || 'yes';
|
|
1921
|
+
return placeKalshiOrder(config.kalshi, request.marketId, outcome, request.side, request.price, request.size, request.orderType, request.maxSlippage);
|
|
1922
|
+
}
|
|
1923
|
+
if (request.platform === 'opinion') {
|
|
1924
|
+
if (!config.opinion) {
|
|
1925
|
+
return { success: false, error: 'Opinion not configured' };
|
|
1926
|
+
}
|
|
1927
|
+
if (!request.tokenId) {
|
|
1928
|
+
return { success: false, error: 'tokenId required for Opinion' };
|
|
1929
|
+
}
|
|
1930
|
+
return placeOpinionOrder(config.opinion, request.tokenId, request.side, request.price, request.size, request.orderType);
|
|
1931
|
+
}
|
|
1932
|
+
if (request.platform === 'predictfun') {
|
|
1933
|
+
if (!config.predictfun) {
|
|
1934
|
+
return { success: false, error: 'PredictFun not configured' };
|
|
1935
|
+
}
|
|
1936
|
+
if (!request.tokenId) {
|
|
1937
|
+
return { success: false, error: 'tokenId required for PredictFun' };
|
|
1938
|
+
}
|
|
1939
|
+
return placePredictFunOrder(config.predictfun, request.tokenId, request.side, request.price, request.size, request.marketId);
|
|
1940
|
+
}
|
|
1941
|
+
return { success: false, error: `Unknown platform: ${request.platform}` };
|
|
1942
|
+
}
|
|
1943
|
+
const service = {
|
|
1944
|
+
async buyLimit(request) {
|
|
1945
|
+
const result = await executeOrder({ ...request, side: 'buy', orderType: request.orderType || 'GTC' });
|
|
1946
|
+
recordOrderToCircuitBreaker(result, request.price * request.size);
|
|
1947
|
+
return result;
|
|
1948
|
+
},
|
|
1949
|
+
async sellLimit(request) {
|
|
1950
|
+
const result = await executeOrder({ ...request, side: 'sell', orderType: request.orderType || 'GTC' });
|
|
1951
|
+
recordOrderToCircuitBreaker(result, request.price * request.size);
|
|
1952
|
+
return result;
|
|
1953
|
+
},
|
|
1954
|
+
async marketBuy(request) {
|
|
1955
|
+
// Market orders use FOK (Fill or Kill)
|
|
1956
|
+
// Price is set to max (0.99) to ensure fill
|
|
1957
|
+
const result = await executeOrder({ ...request, side: 'buy', price: 0.99, orderType: 'FOK' });
|
|
1958
|
+
recordOrderToCircuitBreaker(result, 0.99 * request.size);
|
|
1959
|
+
return result;
|
|
1960
|
+
},
|
|
1961
|
+
async marketSell(request) {
|
|
1962
|
+
// Price is set to min (0.01) to ensure fill
|
|
1963
|
+
const result = await executeOrder({ ...request, side: 'sell', price: 0.01, orderType: 'FOK' });
|
|
1964
|
+
recordOrderToCircuitBreaker(result, 0.01 * request.size);
|
|
1965
|
+
return result;
|
|
1966
|
+
},
|
|
1967
|
+
async makerBuy(request) {
|
|
1968
|
+
const result = await executeOrder({ ...request, side: 'buy', orderType: 'GTC', postOnly: true });
|
|
1969
|
+
recordOrderToCircuitBreaker(result, request.price * request.size);
|
|
1970
|
+
return result;
|
|
1971
|
+
},
|
|
1972
|
+
async makerSell(request) {
|
|
1973
|
+
const result = await executeOrder({ ...request, side: 'sell', orderType: 'GTC', postOnly: true });
|
|
1974
|
+
recordOrderToCircuitBreaker(result, request.price * request.size);
|
|
1975
|
+
return result;
|
|
1976
|
+
},
|
|
1977
|
+
async cancelOrder(platform, orderId) {
|
|
1978
|
+
if (config.dryRun) {
|
|
1979
|
+
logger_1.logger.info({ platform, orderId, dryRun: true }, 'Dry run cancel');
|
|
1980
|
+
return true;
|
|
1981
|
+
}
|
|
1982
|
+
if (platform === 'polymarket' && config.polymarket) {
|
|
1983
|
+
return cancelPolymarketOrder(config.polymarket, orderId);
|
|
1984
|
+
}
|
|
1985
|
+
if (platform === 'kalshi' && config.kalshi) {
|
|
1986
|
+
return cancelKalshiOrder(config.kalshi, orderId);
|
|
1987
|
+
}
|
|
1988
|
+
if (platform === 'opinion' && config.opinion) {
|
|
1989
|
+
return cancelOpinionOrder(config.opinion, orderId);
|
|
1990
|
+
}
|
|
1991
|
+
if (platform === 'predictfun' && config.predictfun) {
|
|
1992
|
+
return cancelPredictFunOrder(config.predictfun, orderId);
|
|
1993
|
+
}
|
|
1994
|
+
return false;
|
|
1995
|
+
},
|
|
1996
|
+
async cancelAllOrders(platform, marketId) {
|
|
1997
|
+
if (config.dryRun) {
|
|
1998
|
+
logger_1.logger.info({ platform, marketId, dryRun: true }, 'Dry run cancel all');
|
|
1999
|
+
return 0;
|
|
2000
|
+
}
|
|
2001
|
+
let count = 0;
|
|
2002
|
+
if ((!platform || platform === 'polymarket') && config.polymarket) {
|
|
2003
|
+
count += await cancelAllPolymarketOrders(config.polymarket, marketId);
|
|
2004
|
+
// Auto-stop heartbeat if all Polymarket orders cancelled (no market filter)
|
|
2005
|
+
// Heartbeat is only needed when there are open GTC/GTD orders
|
|
2006
|
+
if (!marketId && isHeartbeatActive()) {
|
|
2007
|
+
stopHeartbeat();
|
|
2008
|
+
logger_1.logger.info('Heartbeat auto-stopped after cancelling all orders');
|
|
2009
|
+
}
|
|
2010
|
+
}
|
|
2011
|
+
// Kalshi: fetch open orders, batch cancel matching ones
|
|
2012
|
+
if ((!platform || platform === 'kalshi') && config.kalshi) {
|
|
2013
|
+
const orders = await getKalshiOpenOrders(config.kalshi);
|
|
2014
|
+
const toCancel = orders
|
|
2015
|
+
.filter(o => !marketId || o.marketId === marketId)
|
|
2016
|
+
.map(o => o.orderId);
|
|
2017
|
+
if (toCancel.length > 0) {
|
|
2018
|
+
const results = await cancelKalshiOrdersBatch(config.kalshi, toCancel);
|
|
2019
|
+
count += results.filter(r => r.success).length;
|
|
2020
|
+
}
|
|
2021
|
+
}
|
|
2022
|
+
// Opinion: use SDK's cancelAllOrders (handles batch internally)
|
|
2023
|
+
if ((!platform || platform === 'opinion') && config.opinion) {
|
|
2024
|
+
count += await cancelAllOpinionOrders(config.opinion, marketId);
|
|
2025
|
+
}
|
|
2026
|
+
// PredictFun has bulk cancel support
|
|
2027
|
+
if ((!platform || platform === 'predictfun') && config.predictfun) {
|
|
2028
|
+
if (marketId) {
|
|
2029
|
+
// Filter by market if specified
|
|
2030
|
+
const orders = await getPredictFunOpenOrders(config.predictfun);
|
|
2031
|
+
for (const order of orders) {
|
|
2032
|
+
if (order.marketId === marketId) {
|
|
2033
|
+
if (await cancelPredictFunOrder(config.predictfun, order.orderId)) {
|
|
2034
|
+
count++;
|
|
2035
|
+
}
|
|
2036
|
+
}
|
|
2037
|
+
}
|
|
2038
|
+
}
|
|
2039
|
+
else {
|
|
2040
|
+
count += await cancelAllPredictFunOrders(config.predictfun);
|
|
2041
|
+
}
|
|
2042
|
+
}
|
|
2043
|
+
return count;
|
|
2044
|
+
},
|
|
2045
|
+
async getOpenOrders(platform) {
|
|
2046
|
+
const orders = [];
|
|
2047
|
+
if ((!platform || platform === 'polymarket') && config.polymarket) {
|
|
2048
|
+
const polyOrders = await getPolymarketOpenOrders(config.polymarket);
|
|
2049
|
+
orders.push(...polyOrders);
|
|
2050
|
+
}
|
|
2051
|
+
if ((!platform || platform === 'kalshi') && config.kalshi) {
|
|
2052
|
+
const kalshiOrders = await getKalshiOpenOrders(config.kalshi);
|
|
2053
|
+
orders.push(...kalshiOrders);
|
|
2054
|
+
}
|
|
2055
|
+
if ((!platform || platform === 'opinion') && config.opinion) {
|
|
2056
|
+
const opinionOrders = await getOpinionOpenOrders(config.opinion);
|
|
2057
|
+
orders.push(...opinionOrders);
|
|
2058
|
+
}
|
|
2059
|
+
if ((!platform || platform === 'predictfun') && config.predictfun) {
|
|
2060
|
+
const predictfunOrders = await getPredictFunOpenOrders(config.predictfun);
|
|
2061
|
+
orders.push(...predictfunOrders);
|
|
2062
|
+
}
|
|
2063
|
+
return orders;
|
|
2064
|
+
},
|
|
2065
|
+
async getOrder(platform, orderId) {
|
|
2066
|
+
const orders = await this.getOpenOrders(platform);
|
|
2067
|
+
return orders.find((o) => o.orderId === orderId) || null;
|
|
2068
|
+
},
|
|
2069
|
+
async estimateFill(request) {
|
|
2070
|
+
try {
|
|
2071
|
+
let orderbook = null;
|
|
2072
|
+
if (request.platform === 'polymarket' && request.tokenId) {
|
|
2073
|
+
orderbook = await fetchPolymarketOrderbook(request.tokenId);
|
|
2074
|
+
}
|
|
2075
|
+
else if (request.platform === 'kalshi') {
|
|
2076
|
+
orderbook = await fetchKalshiOrderbook(request.marketId);
|
|
2077
|
+
}
|
|
2078
|
+
else if (request.platform === 'opinion' && request.tokenId) {
|
|
2079
|
+
orderbook = await fetchOpinionOrderbook(request.tokenId);
|
|
2080
|
+
}
|
|
2081
|
+
else if (request.platform === 'predictfun' && config.predictfun) {
|
|
2082
|
+
orderbook = await fetchPredictFunOrderbook(config.predictfun, request.marketId);
|
|
2083
|
+
}
|
|
2084
|
+
if (!orderbook) {
|
|
2085
|
+
return { avgPrice: request.price, filledSize: request.size };
|
|
2086
|
+
}
|
|
2087
|
+
const orders = request.side === 'buy' ? orderbook.asks : orderbook.bids;
|
|
2088
|
+
const { avgFillPrice, totalFilled } = calculateFillFromOrderbook(orders, request.size, request.side);
|
|
2089
|
+
return {
|
|
2090
|
+
avgPrice: totalFilled > 0 ? avgFillPrice : request.price,
|
|
2091
|
+
filledSize: totalFilled,
|
|
2092
|
+
};
|
|
2093
|
+
}
|
|
2094
|
+
catch {
|
|
2095
|
+
return { avgPrice: request.price, filledSize: request.size };
|
|
2096
|
+
}
|
|
2097
|
+
},
|
|
2098
|
+
async protectedBuy(request, maxSlippageOverride) {
|
|
2099
|
+
const slippageConfig = {
|
|
2100
|
+
maxSlippage: 0.02, // 2% default
|
|
2101
|
+
checkOrderbook: true,
|
|
2102
|
+
autoCancel: true,
|
|
2103
|
+
useLimitOrders: true,
|
|
2104
|
+
limitPriceBuffer: 0.01,
|
|
2105
|
+
...config.slippageProtection,
|
|
2106
|
+
};
|
|
2107
|
+
const maxSlippage = maxSlippageOverride ?? request.maxSlippage ?? slippageConfig.maxSlippage;
|
|
2108
|
+
// Estimate slippage before executing
|
|
2109
|
+
const slippageEstimate = await this.estimateSlippage({ ...request, side: 'buy' });
|
|
2110
|
+
if (slippageEstimate.slippage > maxSlippage) {
|
|
2111
|
+
logger_1.logger.warn({ slippage: slippageEstimate.slippage, maxSlippage, request }, 'Slippage protection triggered - order rejected');
|
|
2112
|
+
return {
|
|
2113
|
+
success: false,
|
|
2114
|
+
error: `Slippage ${(slippageEstimate.slippage * 100).toFixed(2)}% exceeds max ${(maxSlippage * 100).toFixed(2)}%`,
|
|
2115
|
+
};
|
|
2116
|
+
}
|
|
2117
|
+
// Use limit order with buffer if enabled
|
|
2118
|
+
if (slippageConfig.useLimitOrders) {
|
|
2119
|
+
const limitPrice = Math.min(0.99, slippageEstimate.expectedPrice * (1 + slippageConfig.limitPriceBuffer));
|
|
2120
|
+
return executeOrder({
|
|
2121
|
+
...request,
|
|
2122
|
+
side: 'buy',
|
|
2123
|
+
price: limitPrice,
|
|
2124
|
+
orderType: 'GTC',
|
|
2125
|
+
});
|
|
2126
|
+
}
|
|
2127
|
+
return executeOrder({ ...request, side: 'buy', orderType: request.orderType || 'GTC' });
|
|
2128
|
+
},
|
|
2129
|
+
async protectedSell(request, maxSlippageOverride) {
|
|
2130
|
+
const slippageConfig = {
|
|
2131
|
+
maxSlippage: 0.02,
|
|
2132
|
+
checkOrderbook: true,
|
|
2133
|
+
autoCancel: true,
|
|
2134
|
+
useLimitOrders: true,
|
|
2135
|
+
limitPriceBuffer: 0.01,
|
|
2136
|
+
...config.slippageProtection,
|
|
2137
|
+
};
|
|
2138
|
+
const maxSlippage = maxSlippageOverride ?? request.maxSlippage ?? slippageConfig.maxSlippage;
|
|
2139
|
+
// Estimate slippage before executing
|
|
2140
|
+
const slippageEstimate = await this.estimateSlippage({ ...request, side: 'sell' });
|
|
2141
|
+
if (slippageEstimate.slippage > maxSlippage) {
|
|
2142
|
+
logger_1.logger.warn({ slippage: slippageEstimate.slippage, maxSlippage, request }, 'Slippage protection triggered - order rejected');
|
|
2143
|
+
return {
|
|
2144
|
+
success: false,
|
|
2145
|
+
error: `Slippage ${(slippageEstimate.slippage * 100).toFixed(2)}% exceeds max ${(maxSlippage * 100).toFixed(2)}%`,
|
|
2146
|
+
};
|
|
2147
|
+
}
|
|
2148
|
+
// Use limit order with buffer if enabled
|
|
2149
|
+
if (slippageConfig.useLimitOrders) {
|
|
2150
|
+
const limitPrice = Math.max(0.01, slippageEstimate.expectedPrice * (1 - slippageConfig.limitPriceBuffer));
|
|
2151
|
+
return executeOrder({
|
|
2152
|
+
...request,
|
|
2153
|
+
side: 'sell',
|
|
2154
|
+
price: limitPrice,
|
|
2155
|
+
orderType: 'GTC',
|
|
2156
|
+
});
|
|
2157
|
+
}
|
|
2158
|
+
return executeOrder({ ...request, side: 'sell', orderType: request.orderType || 'GTC' });
|
|
2159
|
+
},
|
|
2160
|
+
async estimateSlippage(request) {
|
|
2161
|
+
try {
|
|
2162
|
+
// Fetch orderbook based on platform
|
|
2163
|
+
let orderbook = null;
|
|
2164
|
+
if (request.platform === 'polymarket' && request.tokenId) {
|
|
2165
|
+
orderbook = await fetchPolymarketOrderbook(request.tokenId);
|
|
2166
|
+
}
|
|
2167
|
+
else if (request.platform === 'kalshi') {
|
|
2168
|
+
orderbook = await fetchKalshiOrderbook(request.marketId);
|
|
2169
|
+
}
|
|
2170
|
+
else if (request.platform === 'opinion' && request.tokenId) {
|
|
2171
|
+
orderbook = await fetchOpinionOrderbook(request.tokenId);
|
|
2172
|
+
}
|
|
2173
|
+
else if (request.platform === 'predictfun' && config.predictfun) {
|
|
2174
|
+
orderbook = await fetchPredictFunOrderbook(config.predictfun, request.marketId);
|
|
2175
|
+
}
|
|
2176
|
+
if (!orderbook || (orderbook.bids.length === 0 && orderbook.asks.length === 0)) {
|
|
2177
|
+
// Fallback to heuristic estimate if no orderbook
|
|
2178
|
+
const baseSlippage = 0.005;
|
|
2179
|
+
const sizeImpact = Math.min(0.05, request.size * 0.0001);
|
|
2180
|
+
const estimatedSlippage = baseSlippage + sizeImpact;
|
|
2181
|
+
return {
|
|
2182
|
+
slippage: estimatedSlippage,
|
|
2183
|
+
expectedPrice: request.side === 'buy'
|
|
2184
|
+
? request.price * (1 + estimatedSlippage)
|
|
2185
|
+
: request.price * (1 - estimatedSlippage),
|
|
2186
|
+
};
|
|
2187
|
+
}
|
|
2188
|
+
// Calculate average fill price by walking through orderbook
|
|
2189
|
+
const { avgFillPrice, totalFilled } = calculateFillFromOrderbook(request.side === 'buy' ? orderbook.asks : orderbook.bids, request.size, request.side);
|
|
2190
|
+
if (totalFilled < request.size * 0.5) {
|
|
2191
|
+
// Less than 50% can be filled - high slippage market
|
|
2192
|
+
logger_1.logger.warn({ request, totalFilled, requested: request.size }, 'Orderbook too thin - less than 50% fillable');
|
|
2193
|
+
}
|
|
2194
|
+
// Calculate slippage relative to mid price
|
|
2195
|
+
const midPrice = orderbook.midPrice || request.price;
|
|
2196
|
+
const slippage = request.side === 'buy'
|
|
2197
|
+
? (avgFillPrice - midPrice) / midPrice
|
|
2198
|
+
: (midPrice - avgFillPrice) / midPrice;
|
|
2199
|
+
return {
|
|
2200
|
+
slippage: Math.max(0, slippage),
|
|
2201
|
+
expectedPrice: avgFillPrice,
|
|
2202
|
+
};
|
|
2203
|
+
}
|
|
2204
|
+
catch (error) {
|
|
2205
|
+
logger_1.logger.warn({ error, request }, 'Failed to estimate slippage from orderbook');
|
|
2206
|
+
// Fallback to heuristic
|
|
2207
|
+
const baseSlippage = 0.005;
|
|
2208
|
+
const sizeImpact = Math.min(0.05, request.size * 0.0001);
|
|
2209
|
+
return {
|
|
2210
|
+
slippage: baseSlippage + sizeImpact,
|
|
2211
|
+
expectedPrice: request.side === 'buy'
|
|
2212
|
+
? request.price * (1 + baseSlippage + sizeImpact)
|
|
2213
|
+
: request.price * (1 - baseSlippage - sizeImpact),
|
|
2214
|
+
};
|
|
2215
|
+
}
|
|
2216
|
+
},
|
|
2217
|
+
async placeOrdersBatch(orders) {
|
|
2218
|
+
const polyOrders = orders.filter(o => o.platform === 'polymarket');
|
|
2219
|
+
const kalshiOrders = orders.filter(o => o.platform === 'kalshi');
|
|
2220
|
+
const opinionOrders = orders.filter(o => o.platform === 'opinion');
|
|
2221
|
+
const predictfunOrders = orders.filter(o => o.platform === 'predictfun');
|
|
2222
|
+
const otherOrders = orders.filter(o => o.platform !== 'opinion' && o.platform !== 'polymarket' && o.platform !== 'kalshi' && o.platform !== 'predictfun');
|
|
2223
|
+
const results = [];
|
|
2224
|
+
// Execute Polymarket batch if we have Polymarket orders and config
|
|
2225
|
+
if (polyOrders.length > 0 && config.polymarket) {
|
|
2226
|
+
try {
|
|
2227
|
+
const batchInput = polyOrders.map(o => ({
|
|
2228
|
+
tokenId: o.tokenId,
|
|
2229
|
+
side: o.side,
|
|
2230
|
+
price: o.price,
|
|
2231
|
+
size: o.size,
|
|
2232
|
+
negRisk: o.negRisk,
|
|
2233
|
+
postOnly: o.postOnly,
|
|
2234
|
+
}));
|
|
2235
|
+
const batchResults = await placePolymarketOrdersBatch(config.polymarket, batchInput);
|
|
2236
|
+
results.push(...batchResults);
|
|
2237
|
+
}
|
|
2238
|
+
catch (err) {
|
|
2239
|
+
results.push(...polyOrders.map(() => ({
|
|
2240
|
+
success: false,
|
|
2241
|
+
error: err instanceof Error ? err.message : 'Batch order failed',
|
|
2242
|
+
})));
|
|
2243
|
+
}
|
|
2244
|
+
}
|
|
2245
|
+
else if (polyOrders.length > 0) {
|
|
2246
|
+
results.push(...polyOrders.map(() => ({
|
|
2247
|
+
success: false,
|
|
2248
|
+
error: 'Polymarket trading not configured',
|
|
2249
|
+
})));
|
|
2250
|
+
}
|
|
2251
|
+
// Execute Kalshi batch if we have Kalshi orders and config
|
|
2252
|
+
if (kalshiOrders.length > 0 && config.kalshi) {
|
|
2253
|
+
try {
|
|
2254
|
+
const batchInput = kalshiOrders.map(o => ({
|
|
2255
|
+
ticker: o.marketId,
|
|
2256
|
+
side: o.outcome?.toLowerCase() || 'yes',
|
|
2257
|
+
action: o.side,
|
|
2258
|
+
price: o.price,
|
|
2259
|
+
count: o.size,
|
|
2260
|
+
}));
|
|
2261
|
+
const batchResults = await placeKalshiOrdersBatch(config.kalshi, batchInput);
|
|
2262
|
+
results.push(...batchResults);
|
|
2263
|
+
}
|
|
2264
|
+
catch (err) {
|
|
2265
|
+
results.push(...kalshiOrders.map(() => ({
|
|
2266
|
+
success: false,
|
|
2267
|
+
error: err instanceof Error ? err.message : 'Batch order failed',
|
|
2268
|
+
})));
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
else if (kalshiOrders.length > 0) {
|
|
2272
|
+
results.push(...kalshiOrders.map(() => ({
|
|
2273
|
+
success: false,
|
|
2274
|
+
error: 'Kalshi trading not configured',
|
|
2275
|
+
})));
|
|
2276
|
+
}
|
|
2277
|
+
// Execute Opinion batch if we have Opinion orders and config
|
|
2278
|
+
if (opinionOrders.length > 0 && config.opinion) {
|
|
2279
|
+
try {
|
|
2280
|
+
const batchInput = opinionOrders.map(o => ({
|
|
2281
|
+
marketId: parseInt(o.marketId, 10),
|
|
2282
|
+
tokenId: o.tokenId,
|
|
2283
|
+
side: o.side.toUpperCase(),
|
|
2284
|
+
price: o.price,
|
|
2285
|
+
amount: o.size,
|
|
2286
|
+
}));
|
|
2287
|
+
const batchResults = await placeOpinionOrdersBatch(config.opinion, batchInput);
|
|
2288
|
+
results.push(...batchResults.map(r => ({
|
|
2289
|
+
success: r.success,
|
|
2290
|
+
orderId: r.orderId,
|
|
2291
|
+
error: r.error,
|
|
2292
|
+
})));
|
|
2293
|
+
}
|
|
2294
|
+
catch (err) {
|
|
2295
|
+
// All Opinion orders failed
|
|
2296
|
+
results.push(...opinionOrders.map(() => ({
|
|
2297
|
+
success: false,
|
|
2298
|
+
error: err instanceof Error ? err.message : 'Batch order failed',
|
|
2299
|
+
})));
|
|
2300
|
+
}
|
|
2301
|
+
}
|
|
2302
|
+
else if (opinionOrders.length > 0) {
|
|
2303
|
+
// No Opinion config
|
|
2304
|
+
results.push(...opinionOrders.map(() => ({
|
|
2305
|
+
success: false,
|
|
2306
|
+
error: 'Opinion trading not configured',
|
|
2307
|
+
})));
|
|
2308
|
+
}
|
|
2309
|
+
// Execute PredictFun orders (no native batch API — sequential via SDK with EIP-712 signing)
|
|
2310
|
+
if (predictfunOrders.length > 0 && config.predictfun) {
|
|
2311
|
+
for (const order of predictfunOrders) {
|
|
2312
|
+
try {
|
|
2313
|
+
const result = await placePredictFunOrder(config.predictfun, order.tokenId, order.side, order.price, order.size, order.marketId);
|
|
2314
|
+
results.push(result);
|
|
2315
|
+
}
|
|
2316
|
+
catch (err) {
|
|
2317
|
+
results.push({
|
|
2318
|
+
success: false,
|
|
2319
|
+
error: err instanceof Error ? err.message : 'Order failed',
|
|
2320
|
+
});
|
|
2321
|
+
}
|
|
2322
|
+
}
|
|
2323
|
+
}
|
|
2324
|
+
else if (predictfunOrders.length > 0) {
|
|
2325
|
+
results.push(...predictfunOrders.map(() => ({
|
|
2326
|
+
success: false,
|
|
2327
|
+
error: 'PredictFun trading not configured',
|
|
2328
|
+
})));
|
|
2329
|
+
}
|
|
2330
|
+
// Execute other orders individually (fallback)
|
|
2331
|
+
for (const order of otherOrders) {
|
|
2332
|
+
try {
|
|
2333
|
+
const result = order.side === 'buy'
|
|
2334
|
+
? await this.buyLimit(order)
|
|
2335
|
+
: await this.sellLimit(order);
|
|
2336
|
+
results.push(result);
|
|
2337
|
+
}
|
|
2338
|
+
catch (err) {
|
|
2339
|
+
results.push({
|
|
2340
|
+
success: false,
|
|
2341
|
+
error: err instanceof Error ? err.message : 'Order failed',
|
|
2342
|
+
});
|
|
2343
|
+
}
|
|
2344
|
+
}
|
|
2345
|
+
return results;
|
|
2346
|
+
},
|
|
2347
|
+
async cancelOrdersBatch(platform, orderIds) {
|
|
2348
|
+
if (platform === 'polymarket' && config.polymarket) {
|
|
2349
|
+
try {
|
|
2350
|
+
return await cancelPolymarketOrdersBatch(config.polymarket, orderIds);
|
|
2351
|
+
}
|
|
2352
|
+
catch (err) {
|
|
2353
|
+
return orderIds.map(orderId => ({ orderId, success: false }));
|
|
2354
|
+
}
|
|
2355
|
+
}
|
|
2356
|
+
if (platform === 'kalshi' && config.kalshi) {
|
|
2357
|
+
try {
|
|
2358
|
+
return await cancelKalshiOrdersBatch(config.kalshi, orderIds);
|
|
2359
|
+
}
|
|
2360
|
+
catch (err) {
|
|
2361
|
+
return orderIds.map(orderId => ({ orderId, success: false }));
|
|
2362
|
+
}
|
|
2363
|
+
}
|
|
2364
|
+
if (platform === 'opinion' && config.opinion) {
|
|
2365
|
+
try {
|
|
2366
|
+
return await cancelOpinionOrdersBatch(config.opinion, orderIds);
|
|
2367
|
+
}
|
|
2368
|
+
catch (err) {
|
|
2369
|
+
return orderIds.map(orderId => ({
|
|
2370
|
+
orderId,
|
|
2371
|
+
success: false,
|
|
2372
|
+
}));
|
|
2373
|
+
}
|
|
2374
|
+
}
|
|
2375
|
+
if (platform === 'predictfun' && config.predictfun) {
|
|
2376
|
+
// PredictFun cancel requires isNegRisk/isYieldBearing — cancel individually via SDK
|
|
2377
|
+
const results = [];
|
|
2378
|
+
for (const orderId of orderIds) {
|
|
2379
|
+
const success = await cancelPredictFunOrder(config.predictfun, orderId);
|
|
2380
|
+
results.push({ orderId, success });
|
|
2381
|
+
}
|
|
2382
|
+
return results;
|
|
2383
|
+
}
|
|
2384
|
+
// Fallback: cancel individually
|
|
2385
|
+
const results = [];
|
|
2386
|
+
for (const orderId of orderIds) {
|
|
2387
|
+
try {
|
|
2388
|
+
const success = await this.cancelOrder(platform, orderId);
|
|
2389
|
+
results.push({ orderId, success });
|
|
2390
|
+
}
|
|
2391
|
+
catch {
|
|
2392
|
+
results.push({ orderId, success: false });
|
|
2393
|
+
}
|
|
2394
|
+
}
|
|
2395
|
+
return results;
|
|
2396
|
+
},
|
|
2397
|
+
// =========================================================================
|
|
2398
|
+
// REAL-TIME FILL TRACKING (Polymarket WebSocket)
|
|
2399
|
+
// =========================================================================
|
|
2400
|
+
async connectFillsWebSocket() {
|
|
2401
|
+
return connectFillsWebSocket();
|
|
2402
|
+
},
|
|
2403
|
+
disconnectFillsWebSocket() {
|
|
2404
|
+
disconnectFillsWebSocket();
|
|
2405
|
+
},
|
|
2406
|
+
isFillsWebSocketConnected() {
|
|
2407
|
+
return userWs?.isConnected() ?? false;
|
|
2408
|
+
},
|
|
2409
|
+
onFill(callback) {
|
|
2410
|
+
fillCallbacks.add(callback);
|
|
2411
|
+
return () => {
|
|
2412
|
+
fillCallbacks.delete(callback);
|
|
2413
|
+
};
|
|
2414
|
+
},
|
|
2415
|
+
onOrder(callback) {
|
|
2416
|
+
orderCallbacks.add(callback);
|
|
2417
|
+
return () => {
|
|
2418
|
+
orderCallbacks.delete(callback);
|
|
2419
|
+
};
|
|
2420
|
+
},
|
|
2421
|
+
getTrackedFills() {
|
|
2422
|
+
return Array.from(trackedFills.values());
|
|
2423
|
+
},
|
|
2424
|
+
getTrackedFill(orderId) {
|
|
2425
|
+
return trackedFills.get(orderId);
|
|
2426
|
+
},
|
|
2427
|
+
clearOldFills(maxAgeMs = 3600000) {
|
|
2428
|
+
const now = Date.now();
|
|
2429
|
+
let cleared = 0;
|
|
2430
|
+
for (const [orderId, fill] of trackedFills) {
|
|
2431
|
+
if (now - fill.receivedAt > maxAgeMs) {
|
|
2432
|
+
trackedFills.delete(orderId);
|
|
2433
|
+
cleared++;
|
|
2434
|
+
}
|
|
2435
|
+
}
|
|
2436
|
+
// Also clear old orders
|
|
2437
|
+
for (const [orderId, order] of trackedOrders) {
|
|
2438
|
+
if (now - order.receivedAt > maxAgeMs) {
|
|
2439
|
+
trackedOrders.delete(orderId);
|
|
2440
|
+
}
|
|
2441
|
+
}
|
|
2442
|
+
return cleared;
|
|
2443
|
+
},
|
|
2444
|
+
waitForFill(orderId, timeoutMs) {
|
|
2445
|
+
return waitForFill(orderId, timeoutMs);
|
|
2446
|
+
},
|
|
2447
|
+
// =========================================================================
|
|
2448
|
+
// POLYMARKET ORDER HEARTBEAT
|
|
2449
|
+
// =========================================================================
|
|
2450
|
+
async startHeartbeat() {
|
|
2451
|
+
return startHeartbeat();
|
|
2452
|
+
},
|
|
2453
|
+
async sendHeartbeat(id) {
|
|
2454
|
+
return sendHeartbeat(id);
|
|
2455
|
+
},
|
|
2456
|
+
stopHeartbeat() {
|
|
2457
|
+
stopHeartbeat();
|
|
2458
|
+
},
|
|
2459
|
+
isHeartbeatActive() {
|
|
2460
|
+
return isHeartbeatActive();
|
|
2461
|
+
},
|
|
2462
|
+
// =========================================================================
|
|
2463
|
+
// POLYMARKET SETTLEMENT
|
|
2464
|
+
// =========================================================================
|
|
2465
|
+
async getPendingSettlements() {
|
|
2466
|
+
if (!config.polymarket) {
|
|
2467
|
+
return [];
|
|
2468
|
+
}
|
|
2469
|
+
return getPolymarketPendingSettlements(config.polymarket, config.polymarket.funderAddress);
|
|
2470
|
+
},
|
|
2471
|
+
// =========================================================================
|
|
2472
|
+
// POLYMARKET COLLATERAL APPROVAL
|
|
2473
|
+
// =========================================================================
|
|
2474
|
+
async approveUSDC(amount) {
|
|
2475
|
+
if (!config.polymarket?.privateKey) {
|
|
2476
|
+
return {
|
|
2477
|
+
success: false,
|
|
2478
|
+
error: 'Polymarket private key not configured',
|
|
2479
|
+
};
|
|
2480
|
+
}
|
|
2481
|
+
// Approve for both CTF exchanges
|
|
2482
|
+
const spender = POLY_CTF_EXCHANGE;
|
|
2483
|
+
return approvePolymarketUSDC(config.polymarket.privateKey, spender, amount);
|
|
2484
|
+
},
|
|
2485
|
+
async getUSDCAllowance() {
|
|
2486
|
+
if (!config.polymarket) {
|
|
2487
|
+
return 0;
|
|
2488
|
+
}
|
|
2489
|
+
const owner = config.polymarket.funderAddress || config.polymarket.address;
|
|
2490
|
+
return getPolymarketUSDCAllowance(owner, POLY_CTF_EXCHANGE);
|
|
2491
|
+
},
|
|
2492
|
+
// =========================================================================
|
|
2493
|
+
// BATCH ORDERBOOK FETCHING
|
|
2494
|
+
// =========================================================================
|
|
2495
|
+
async getOrderbooksBatch(tokenIds) {
|
|
2496
|
+
return getPolymarketOrderbooksBatch(tokenIds);
|
|
2497
|
+
},
|
|
2498
|
+
// =========================================================================
|
|
2499
|
+
// CIRCUIT BREAKER INTEGRATION
|
|
2500
|
+
// =========================================================================
|
|
2501
|
+
setCircuitBreaker(breaker) {
|
|
2502
|
+
circuitBreaker = breaker;
|
|
2503
|
+
if (breaker) {
|
|
2504
|
+
logger_1.logger.info('Circuit breaker enabled for order validation');
|
|
2505
|
+
}
|
|
2506
|
+
else {
|
|
2507
|
+
logger_1.logger.info('Circuit breaker disabled');
|
|
2508
|
+
}
|
|
2509
|
+
},
|
|
2510
|
+
getCircuitBreakerState() {
|
|
2511
|
+
return circuitBreaker?.getState() ?? null;
|
|
2512
|
+
},
|
|
2513
|
+
};
|
|
2514
|
+
return service;
|
|
2515
|
+
}
|
|
2516
|
+
// Exchange addresses
|
|
2517
|
+
exports.POLYMARKET_EXCHANGES = {
|
|
2518
|
+
CTF: POLY_CTF_EXCHANGE,
|
|
2519
|
+
NEG_RISK_CTF: POLY_NEG_RISK_CTF_EXCHANGE,
|
|
2520
|
+
};
|
|
2521
|
+
// Re-export sub-modules
|
|
2522
|
+
__exportStar(require("./smart-router"), exports);
|
|
2523
|
+
__exportStar(require("./mev-protection"), exports);
|
|
2524
|
+
__exportStar(require("./circuit-breaker"), exports);
|
|
2525
|
+
__exportStar(require("./position-manager"), exports);
|
|
2526
|
+
__exportStar(require("./futures"), exports);
|
|
2527
|
+
__exportStar(require("./auto-redeem"), exports);
|
|
2528
|
+
__exportStar(require("./twap"), exports);
|
|
2529
|
+
__exportStar(require("./bracket-orders"), exports);
|
|
2530
|
+
__exportStar(require("./trigger-orders"), exports);
|
|
2531
|
+
__exportStar(require("./order-persistence"), exports);
|
|
2532
|
+
//# sourceMappingURL=index.js.map
|