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
package/dist/db/index.js
ADDED
|
@@ -0,0 +1,3382 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database - SQLite (sql.js WASM) for local persistence
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.initDatabase = initDatabase;
|
|
10
|
+
exports.createDatabase = createDatabase;
|
|
11
|
+
const sql_js_1 = __importDefault(require("sql.js"));
|
|
12
|
+
const path_1 = require("path");
|
|
13
|
+
const fs_1 = require("fs");
|
|
14
|
+
const logger_1 = require("../utils/logger");
|
|
15
|
+
const config_1 = require("../utils/config");
|
|
16
|
+
const DB_DIR = (0, config_1.resolveStateDir)();
|
|
17
|
+
const DB_FILE = (0, path_1.join)(DB_DIR, 'clodds.db');
|
|
18
|
+
const BACKUP_DIR = (0, path_1.join)(DB_DIR, 'backups');
|
|
19
|
+
let dbInstance = null;
|
|
20
|
+
let sqlJsDb = null;
|
|
21
|
+
let dbInitPromise = null;
|
|
22
|
+
let backupInterval = null;
|
|
23
|
+
async function initDatabase() {
|
|
24
|
+
if (dbInstance)
|
|
25
|
+
return dbInstance;
|
|
26
|
+
if (dbInitPromise)
|
|
27
|
+
return dbInitPromise;
|
|
28
|
+
dbInitPromise = (async () => {
|
|
29
|
+
// Ensure directory exists
|
|
30
|
+
if (!(0, fs_1.existsSync)(DB_DIR)) {
|
|
31
|
+
(0, fs_1.mkdirSync)(DB_DIR, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
logger_1.logger.info(`Opening database: ${DB_FILE}`);
|
|
34
|
+
// Initialize sql.js
|
|
35
|
+
const SQL = await (0, sql_js_1.default)();
|
|
36
|
+
// Load existing database or create new
|
|
37
|
+
if ((0, fs_1.existsSync)(DB_FILE)) {
|
|
38
|
+
const buffer = (0, fs_1.readFileSync)(DB_FILE);
|
|
39
|
+
sqlJsDb = new SQL.Database(buffer);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
sqlJsDb = new SQL.Database();
|
|
43
|
+
}
|
|
44
|
+
const db = sqlJsDb;
|
|
45
|
+
// Create tables
|
|
46
|
+
db.run(`
|
|
47
|
+
CREATE TABLE IF NOT EXISTS _schema_version (
|
|
48
|
+
version INTEGER NOT NULL,
|
|
49
|
+
applied_at INTEGER NOT NULL
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
-- Users table
|
|
53
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
54
|
+
id TEXT PRIMARY KEY,
|
|
55
|
+
platform TEXT NOT NULL,
|
|
56
|
+
platform_user_id TEXT NOT NULL,
|
|
57
|
+
username TEXT,
|
|
58
|
+
settings TEXT DEFAULT '{}',
|
|
59
|
+
created_at INTEGER NOT NULL,
|
|
60
|
+
last_active_at INTEGER NOT NULL,
|
|
61
|
+
UNIQUE(platform, platform_user_id)
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
-- Alerts table
|
|
65
|
+
CREATE TABLE IF NOT EXISTS alerts (
|
|
66
|
+
id TEXT PRIMARY KEY,
|
|
67
|
+
user_id TEXT NOT NULL,
|
|
68
|
+
type TEXT NOT NULL,
|
|
69
|
+
name TEXT,
|
|
70
|
+
market_id TEXT,
|
|
71
|
+
platform TEXT,
|
|
72
|
+
channel TEXT,
|
|
73
|
+
chat_id TEXT,
|
|
74
|
+
condition TEXT NOT NULL,
|
|
75
|
+
enabled INTEGER DEFAULT 1,
|
|
76
|
+
triggered INTEGER DEFAULT 0,
|
|
77
|
+
trigger_count INTEGER DEFAULT 0,
|
|
78
|
+
created_at INTEGER NOT NULL,
|
|
79
|
+
last_triggered_at INTEGER,
|
|
80
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
-- Positions table
|
|
84
|
+
CREATE TABLE IF NOT EXISTS positions (
|
|
85
|
+
id TEXT PRIMARY KEY,
|
|
86
|
+
user_id TEXT NOT NULL,
|
|
87
|
+
platform TEXT NOT NULL,
|
|
88
|
+
market_id TEXT NOT NULL,
|
|
89
|
+
market_question TEXT,
|
|
90
|
+
outcome TEXT NOT NULL,
|
|
91
|
+
outcome_id TEXT NOT NULL,
|
|
92
|
+
side TEXT NOT NULL,
|
|
93
|
+
shares REAL NOT NULL,
|
|
94
|
+
avg_price REAL NOT NULL,
|
|
95
|
+
current_price REAL,
|
|
96
|
+
opened_at INTEGER NOT NULL,
|
|
97
|
+
updated_at INTEGER NOT NULL,
|
|
98
|
+
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
99
|
+
UNIQUE(user_id, platform, market_id, outcome_id)
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
-- Portfolio P&L snapshots
|
|
103
|
+
CREATE TABLE IF NOT EXISTS portfolio_snapshots (
|
|
104
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
105
|
+
user_id TEXT NOT NULL,
|
|
106
|
+
total_value REAL NOT NULL,
|
|
107
|
+
total_pnl REAL NOT NULL,
|
|
108
|
+
total_pnl_pct REAL NOT NULL,
|
|
109
|
+
total_cost_basis REAL NOT NULL,
|
|
110
|
+
positions_count INTEGER NOT NULL,
|
|
111
|
+
by_platform TEXT,
|
|
112
|
+
created_at INTEGER NOT NULL,
|
|
113
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
-- Stop-loss triggers
|
|
117
|
+
CREATE TABLE IF NOT EXISTS stop_loss_triggers (
|
|
118
|
+
user_id TEXT NOT NULL,
|
|
119
|
+
platform TEXT NOT NULL,
|
|
120
|
+
outcome_id TEXT NOT NULL,
|
|
121
|
+
market_id TEXT,
|
|
122
|
+
status TEXT NOT NULL,
|
|
123
|
+
triggered_at INTEGER NOT NULL,
|
|
124
|
+
last_price REAL,
|
|
125
|
+
last_error TEXT,
|
|
126
|
+
cooldown_until INTEGER,
|
|
127
|
+
PRIMARY KEY (user_id, platform, outcome_id)
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
-- Market cache table
|
|
131
|
+
CREATE TABLE IF NOT EXISTS markets (
|
|
132
|
+
platform TEXT NOT NULL,
|
|
133
|
+
market_id TEXT NOT NULL,
|
|
134
|
+
data TEXT NOT NULL,
|
|
135
|
+
updated_at INTEGER NOT NULL,
|
|
136
|
+
PRIMARY KEY (platform, market_id)
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
-- Market index table (semantic search)
|
|
140
|
+
CREATE TABLE IF NOT EXISTS market_index (
|
|
141
|
+
platform TEXT NOT NULL,
|
|
142
|
+
market_id TEXT NOT NULL,
|
|
143
|
+
slug TEXT,
|
|
144
|
+
question TEXT NOT NULL,
|
|
145
|
+
description TEXT,
|
|
146
|
+
outcomes_json TEXT,
|
|
147
|
+
tags_json TEXT,
|
|
148
|
+
status TEXT,
|
|
149
|
+
url TEXT,
|
|
150
|
+
end_date INTEGER,
|
|
151
|
+
resolved INTEGER,
|
|
152
|
+
volume_24h REAL,
|
|
153
|
+
liquidity REAL,
|
|
154
|
+
open_interest REAL,
|
|
155
|
+
predictions INTEGER,
|
|
156
|
+
content_hash TEXT,
|
|
157
|
+
updated_at INTEGER NOT NULL,
|
|
158
|
+
raw_json TEXT,
|
|
159
|
+
PRIMARY KEY (platform, market_id)
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
CREATE INDEX IF NOT EXISTS idx_market_index_platform ON market_index(platform);
|
|
163
|
+
CREATE INDEX IF NOT EXISTS idx_market_index_updated ON market_index(updated_at);
|
|
164
|
+
CREATE INDEX IF NOT EXISTS idx_market_index_hash ON market_index(content_hash);
|
|
165
|
+
|
|
166
|
+
-- Market index embeddings (persistent vectors)
|
|
167
|
+
CREATE TABLE IF NOT EXISTS market_index_embeddings (
|
|
168
|
+
platform TEXT NOT NULL,
|
|
169
|
+
market_id TEXT NOT NULL,
|
|
170
|
+
content_hash TEXT NOT NULL,
|
|
171
|
+
vector TEXT NOT NULL,
|
|
172
|
+
updated_at INTEGER NOT NULL,
|
|
173
|
+
PRIMARY KEY (platform, market_id)
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
CREATE INDEX IF NOT EXISTS idx_market_index_embeddings_hash ON market_index_embeddings(content_hash);
|
|
177
|
+
|
|
178
|
+
-- Sessions table
|
|
179
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
180
|
+
id TEXT,
|
|
181
|
+
key TEXT PRIMARY KEY,
|
|
182
|
+
user_id TEXT,
|
|
183
|
+
channel TEXT NOT NULL,
|
|
184
|
+
chat_id TEXT NOT NULL,
|
|
185
|
+
chat_type TEXT NOT NULL,
|
|
186
|
+
context TEXT DEFAULT '{}',
|
|
187
|
+
created_at INTEGER NOT NULL,
|
|
188
|
+
updated_at INTEGER NOT NULL
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
-- Cron jobs table
|
|
192
|
+
CREATE TABLE IF NOT EXISTS cron_jobs (
|
|
193
|
+
id TEXT PRIMARY KEY,
|
|
194
|
+
data TEXT NOT NULL,
|
|
195
|
+
enabled INTEGER DEFAULT 1,
|
|
196
|
+
created_at INTEGER NOT NULL,
|
|
197
|
+
updated_at INTEGER NOT NULL
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
-- Trading Credentials table (per-user, encrypted)
|
|
201
|
+
CREATE TABLE IF NOT EXISTS trading_credentials (
|
|
202
|
+
user_id TEXT NOT NULL,
|
|
203
|
+
platform TEXT NOT NULL,
|
|
204
|
+
mode TEXT NOT NULL,
|
|
205
|
+
encrypted_data TEXT NOT NULL,
|
|
206
|
+
enabled INTEGER DEFAULT 1,
|
|
207
|
+
last_used_at INTEGER,
|
|
208
|
+
failed_attempts INTEGER DEFAULT 0,
|
|
209
|
+
cooldown_until INTEGER,
|
|
210
|
+
created_at INTEGER NOT NULL,
|
|
211
|
+
updated_at INTEGER NOT NULL,
|
|
212
|
+
PRIMARY KEY (user_id, platform),
|
|
213
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
-- Watched wallets table (for whale tracking)
|
|
217
|
+
CREATE TABLE IF NOT EXISTS watched_wallets (
|
|
218
|
+
user_id TEXT NOT NULL,
|
|
219
|
+
address TEXT NOT NULL,
|
|
220
|
+
platform TEXT NOT NULL DEFAULT 'polymarket',
|
|
221
|
+
nickname TEXT,
|
|
222
|
+
created_at TEXT NOT NULL,
|
|
223
|
+
PRIMARY KEY (user_id, address),
|
|
224
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
-- Auto-copy settings (for copy trading)
|
|
228
|
+
CREATE TABLE IF NOT EXISTS auto_copy_settings (
|
|
229
|
+
user_id TEXT NOT NULL,
|
|
230
|
+
target_address TEXT NOT NULL,
|
|
231
|
+
max_size REAL NOT NULL,
|
|
232
|
+
size_multiplier REAL NOT NULL DEFAULT 0.5,
|
|
233
|
+
min_confidence REAL NOT NULL DEFAULT 0.55,
|
|
234
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
235
|
+
created_at TEXT NOT NULL,
|
|
236
|
+
PRIMARY KEY (user_id, target_address),
|
|
237
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
-- Paper trading settings
|
|
241
|
+
CREATE TABLE IF NOT EXISTS paper_trading_settings (
|
|
242
|
+
user_id TEXT PRIMARY KEY,
|
|
243
|
+
enabled INTEGER NOT NULL DEFAULT 0,
|
|
244
|
+
balance REAL NOT NULL DEFAULT 10000,
|
|
245
|
+
starting_balance REAL NOT NULL DEFAULT 10000,
|
|
246
|
+
created_at TEXT NOT NULL,
|
|
247
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
-- Paper trading positions
|
|
251
|
+
CREATE TABLE IF NOT EXISTS paper_positions (
|
|
252
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
253
|
+
user_id TEXT NOT NULL,
|
|
254
|
+
market_id TEXT NOT NULL,
|
|
255
|
+
market_name TEXT,
|
|
256
|
+
side TEXT NOT NULL,
|
|
257
|
+
size REAL NOT NULL,
|
|
258
|
+
entry_price REAL NOT NULL,
|
|
259
|
+
created_at TEXT NOT NULL,
|
|
260
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
-- Paper trading trade history
|
|
264
|
+
CREATE TABLE IF NOT EXISTS paper_trades (
|
|
265
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
266
|
+
user_id TEXT NOT NULL,
|
|
267
|
+
market_id TEXT NOT NULL,
|
|
268
|
+
market_name TEXT,
|
|
269
|
+
side TEXT NOT NULL,
|
|
270
|
+
size REAL NOT NULL,
|
|
271
|
+
price REAL NOT NULL,
|
|
272
|
+
pnl REAL NOT NULL DEFAULT 0,
|
|
273
|
+
created_at TEXT NOT NULL,
|
|
274
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
-- Alert settings (for whale alerts, new market alerts, etc.)
|
|
278
|
+
CREATE TABLE IF NOT EXISTS alert_settings (
|
|
279
|
+
user_id TEXT NOT NULL,
|
|
280
|
+
type TEXT NOT NULL,
|
|
281
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
282
|
+
min_size REAL,
|
|
283
|
+
threshold REAL,
|
|
284
|
+
markets TEXT,
|
|
285
|
+
categories TEXT,
|
|
286
|
+
created_at TEXT NOT NULL,
|
|
287
|
+
PRIMARY KEY (user_id, type),
|
|
288
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
-- Pairing requests (pending DM access)
|
|
292
|
+
CREATE TABLE IF NOT EXISTS pairing_requests (
|
|
293
|
+
code TEXT PRIMARY KEY,
|
|
294
|
+
channel TEXT NOT NULL,
|
|
295
|
+
userId TEXT NOT NULL,
|
|
296
|
+
username TEXT,
|
|
297
|
+
createdAt TEXT NOT NULL,
|
|
298
|
+
expiresAt TEXT NOT NULL
|
|
299
|
+
);
|
|
300
|
+
|
|
301
|
+
-- Paired users (approved DM access)
|
|
302
|
+
CREATE TABLE IF NOT EXISTS paired_users (
|
|
303
|
+
channel TEXT NOT NULL,
|
|
304
|
+
userId TEXT NOT NULL,
|
|
305
|
+
username TEXT,
|
|
306
|
+
pairedAt TEXT NOT NULL,
|
|
307
|
+
pairedBy TEXT NOT NULL DEFAULT 'allowlist',
|
|
308
|
+
isOwner INTEGER NOT NULL DEFAULT 0,
|
|
309
|
+
PRIMARY KEY (channel, userId)
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
-- Hyperliquid trades table
|
|
313
|
+
CREATE TABLE IF NOT EXISTS hyperliquid_trades (
|
|
314
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
315
|
+
user_id TEXT NOT NULL,
|
|
316
|
+
trade_id TEXT,
|
|
317
|
+
order_id TEXT,
|
|
318
|
+
coin TEXT NOT NULL,
|
|
319
|
+
side TEXT NOT NULL,
|
|
320
|
+
direction TEXT,
|
|
321
|
+
size REAL NOT NULL,
|
|
322
|
+
price REAL NOT NULL,
|
|
323
|
+
fee REAL DEFAULT 0,
|
|
324
|
+
fee_token TEXT DEFAULT 'USDC',
|
|
325
|
+
closed_pnl REAL,
|
|
326
|
+
order_type TEXT,
|
|
327
|
+
is_maker INTEGER DEFAULT 0,
|
|
328
|
+
leverage INTEGER,
|
|
329
|
+
timestamp INTEGER NOT NULL,
|
|
330
|
+
created_at INTEGER NOT NULL,
|
|
331
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
CREATE INDEX IF NOT EXISTS idx_hl_trades_user ON hyperliquid_trades(user_id);
|
|
335
|
+
CREATE INDEX IF NOT EXISTS idx_hl_trades_coin ON hyperliquid_trades(coin);
|
|
336
|
+
CREATE INDEX IF NOT EXISTS idx_hl_trades_timestamp ON hyperliquid_trades(timestamp);
|
|
337
|
+
|
|
338
|
+
-- Hyperliquid positions history
|
|
339
|
+
CREATE TABLE IF NOT EXISTS hyperliquid_positions (
|
|
340
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
341
|
+
user_id TEXT NOT NULL,
|
|
342
|
+
coin TEXT NOT NULL,
|
|
343
|
+
side TEXT NOT NULL,
|
|
344
|
+
size REAL NOT NULL,
|
|
345
|
+
entry_price REAL NOT NULL,
|
|
346
|
+
mark_price REAL,
|
|
347
|
+
liquidation_price REAL,
|
|
348
|
+
unrealized_pnl REAL,
|
|
349
|
+
realized_pnl REAL DEFAULT 0,
|
|
350
|
+
leverage INTEGER,
|
|
351
|
+
margin_used REAL,
|
|
352
|
+
opened_at INTEGER NOT NULL,
|
|
353
|
+
closed_at INTEGER,
|
|
354
|
+
close_price REAL,
|
|
355
|
+
close_reason TEXT,
|
|
356
|
+
created_at INTEGER NOT NULL,
|
|
357
|
+
updated_at INTEGER NOT NULL,
|
|
358
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
CREATE INDEX IF NOT EXISTS idx_hl_positions_user ON hyperliquid_positions(user_id);
|
|
362
|
+
CREATE INDEX IF NOT EXISTS idx_hl_positions_coin ON hyperliquid_positions(coin);
|
|
363
|
+
CREATE INDEX IF NOT EXISTS idx_hl_positions_open ON hyperliquid_positions(closed_at);
|
|
364
|
+
|
|
365
|
+
-- Hyperliquid funding payments
|
|
366
|
+
CREATE TABLE IF NOT EXISTS hyperliquid_funding (
|
|
367
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
368
|
+
user_id TEXT NOT NULL,
|
|
369
|
+
coin TEXT NOT NULL,
|
|
370
|
+
funding_rate REAL NOT NULL,
|
|
371
|
+
payment REAL NOT NULL,
|
|
372
|
+
position_size REAL NOT NULL,
|
|
373
|
+
timestamp INTEGER NOT NULL,
|
|
374
|
+
created_at INTEGER NOT NULL,
|
|
375
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
CREATE INDEX IF NOT EXISTS idx_hl_funding_user ON hyperliquid_funding(user_id);
|
|
379
|
+
CREATE INDEX IF NOT EXISTS idx_hl_funding_coin ON hyperliquid_funding(coin);
|
|
380
|
+
CREATE INDEX IF NOT EXISTS idx_hl_funding_timestamp ON hyperliquid_funding(timestamp);
|
|
381
|
+
|
|
382
|
+
-- Binance Futures trades table
|
|
383
|
+
CREATE TABLE IF NOT EXISTS binance_futures_trades (
|
|
384
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
385
|
+
user_id TEXT NOT NULL,
|
|
386
|
+
trade_id TEXT,
|
|
387
|
+
order_id TEXT,
|
|
388
|
+
symbol TEXT NOT NULL,
|
|
389
|
+
side TEXT NOT NULL,
|
|
390
|
+
position_side TEXT,
|
|
391
|
+
size REAL NOT NULL,
|
|
392
|
+
price REAL NOT NULL,
|
|
393
|
+
commission REAL DEFAULT 0,
|
|
394
|
+
commission_asset TEXT DEFAULT 'USDT',
|
|
395
|
+
realized_pnl REAL,
|
|
396
|
+
order_type TEXT,
|
|
397
|
+
is_maker INTEGER DEFAULT 0,
|
|
398
|
+
leverage INTEGER,
|
|
399
|
+
timestamp INTEGER NOT NULL,
|
|
400
|
+
created_at INTEGER NOT NULL,
|
|
401
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
402
|
+
);
|
|
403
|
+
|
|
404
|
+
CREATE INDEX IF NOT EXISTS idx_binance_trades_user ON binance_futures_trades(user_id);
|
|
405
|
+
CREATE INDEX IF NOT EXISTS idx_binance_trades_symbol ON binance_futures_trades(symbol);
|
|
406
|
+
CREATE INDEX IF NOT EXISTS idx_binance_trades_timestamp ON binance_futures_trades(timestamp);
|
|
407
|
+
|
|
408
|
+
-- Binance Futures positions history
|
|
409
|
+
CREATE TABLE IF NOT EXISTS binance_futures_positions (
|
|
410
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
411
|
+
user_id TEXT NOT NULL,
|
|
412
|
+
symbol TEXT NOT NULL,
|
|
413
|
+
position_side TEXT NOT NULL,
|
|
414
|
+
size REAL NOT NULL,
|
|
415
|
+
entry_price REAL NOT NULL,
|
|
416
|
+
mark_price REAL,
|
|
417
|
+
liquidation_price REAL,
|
|
418
|
+
unrealized_pnl REAL,
|
|
419
|
+
realized_pnl REAL DEFAULT 0,
|
|
420
|
+
leverage INTEGER,
|
|
421
|
+
margin_type TEXT,
|
|
422
|
+
isolated_margin REAL,
|
|
423
|
+
opened_at INTEGER NOT NULL,
|
|
424
|
+
closed_at INTEGER,
|
|
425
|
+
close_price REAL,
|
|
426
|
+
close_reason TEXT,
|
|
427
|
+
created_at INTEGER NOT NULL,
|
|
428
|
+
updated_at INTEGER NOT NULL,
|
|
429
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
CREATE INDEX IF NOT EXISTS idx_binance_positions_user ON binance_futures_positions(user_id);
|
|
433
|
+
CREATE INDEX IF NOT EXISTS idx_binance_positions_symbol ON binance_futures_positions(symbol);
|
|
434
|
+
CREATE INDEX IF NOT EXISTS idx_binance_positions_open ON binance_futures_positions(closed_at);
|
|
435
|
+
|
|
436
|
+
-- Binance Futures funding payments
|
|
437
|
+
CREATE TABLE IF NOT EXISTS binance_futures_funding (
|
|
438
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
439
|
+
user_id TEXT NOT NULL,
|
|
440
|
+
symbol TEXT NOT NULL,
|
|
441
|
+
funding_rate REAL NOT NULL,
|
|
442
|
+
payment REAL NOT NULL,
|
|
443
|
+
position_size REAL NOT NULL,
|
|
444
|
+
timestamp INTEGER NOT NULL,
|
|
445
|
+
created_at INTEGER NOT NULL,
|
|
446
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
CREATE INDEX IF NOT EXISTS idx_binance_funding_user ON binance_futures_funding(user_id);
|
|
450
|
+
CREATE INDEX IF NOT EXISTS idx_binance_funding_symbol ON binance_futures_funding(symbol);
|
|
451
|
+
CREATE INDEX IF NOT EXISTS idx_binance_funding_timestamp ON binance_futures_funding(timestamp);
|
|
452
|
+
|
|
453
|
+
-- Bybit Futures trades table
|
|
454
|
+
CREATE TABLE IF NOT EXISTS bybit_futures_trades (
|
|
455
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
456
|
+
user_id TEXT NOT NULL,
|
|
457
|
+
trade_id TEXT,
|
|
458
|
+
order_id TEXT,
|
|
459
|
+
symbol TEXT NOT NULL,
|
|
460
|
+
side TEXT NOT NULL,
|
|
461
|
+
position_side TEXT,
|
|
462
|
+
size REAL NOT NULL,
|
|
463
|
+
price REAL NOT NULL,
|
|
464
|
+
commission REAL DEFAULT 0,
|
|
465
|
+
commission_asset TEXT DEFAULT 'USDT',
|
|
466
|
+
closed_pnl REAL,
|
|
467
|
+
order_type TEXT,
|
|
468
|
+
is_maker INTEGER DEFAULT 0,
|
|
469
|
+
leverage INTEGER,
|
|
470
|
+
timestamp INTEGER NOT NULL,
|
|
471
|
+
created_at INTEGER NOT NULL,
|
|
472
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
473
|
+
);
|
|
474
|
+
|
|
475
|
+
CREATE INDEX IF NOT EXISTS idx_bybit_trades_user ON bybit_futures_trades(user_id);
|
|
476
|
+
CREATE INDEX IF NOT EXISTS idx_bybit_trades_symbol ON bybit_futures_trades(symbol);
|
|
477
|
+
CREATE INDEX IF NOT EXISTS idx_bybit_trades_timestamp ON bybit_futures_trades(timestamp);
|
|
478
|
+
|
|
479
|
+
-- Bybit Futures positions history
|
|
480
|
+
CREATE TABLE IF NOT EXISTS bybit_futures_positions (
|
|
481
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
482
|
+
user_id TEXT NOT NULL,
|
|
483
|
+
symbol TEXT NOT NULL,
|
|
484
|
+
side TEXT NOT NULL,
|
|
485
|
+
size REAL NOT NULL,
|
|
486
|
+
entry_price REAL NOT NULL,
|
|
487
|
+
mark_price REAL,
|
|
488
|
+
liquidation_price REAL,
|
|
489
|
+
unrealized_pnl REAL,
|
|
490
|
+
cum_realised_pnl REAL DEFAULT 0,
|
|
491
|
+
leverage INTEGER,
|
|
492
|
+
trade_mode TEXT,
|
|
493
|
+
position_margin REAL,
|
|
494
|
+
opened_at INTEGER NOT NULL,
|
|
495
|
+
closed_at INTEGER,
|
|
496
|
+
close_price REAL,
|
|
497
|
+
close_reason TEXT,
|
|
498
|
+
created_at INTEGER NOT NULL,
|
|
499
|
+
updated_at INTEGER NOT NULL,
|
|
500
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
501
|
+
);
|
|
502
|
+
|
|
503
|
+
CREATE INDEX IF NOT EXISTS idx_bybit_positions_user ON bybit_futures_positions(user_id);
|
|
504
|
+
CREATE INDEX IF NOT EXISTS idx_bybit_positions_symbol ON bybit_futures_positions(symbol);
|
|
505
|
+
CREATE INDEX IF NOT EXISTS idx_bybit_positions_open ON bybit_futures_positions(closed_at);
|
|
506
|
+
|
|
507
|
+
-- Bybit Futures funding payments
|
|
508
|
+
CREATE TABLE IF NOT EXISTS bybit_futures_funding (
|
|
509
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
510
|
+
user_id TEXT NOT NULL,
|
|
511
|
+
symbol TEXT NOT NULL,
|
|
512
|
+
funding_rate REAL NOT NULL,
|
|
513
|
+
payment REAL NOT NULL,
|
|
514
|
+
position_size REAL NOT NULL,
|
|
515
|
+
timestamp INTEGER NOT NULL,
|
|
516
|
+
created_at INTEGER NOT NULL,
|
|
517
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
518
|
+
);
|
|
519
|
+
|
|
520
|
+
CREATE INDEX IF NOT EXISTS idx_bybit_funding_user ON bybit_futures_funding(user_id);
|
|
521
|
+
CREATE INDEX IF NOT EXISTS idx_bybit_funding_symbol ON bybit_futures_funding(symbol);
|
|
522
|
+
CREATE INDEX IF NOT EXISTS idx_bybit_funding_timestamp ON bybit_futures_funding(timestamp);
|
|
523
|
+
|
|
524
|
+
-- MEXC Futures trades table
|
|
525
|
+
CREATE TABLE IF NOT EXISTS mexc_futures_trades (
|
|
526
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
527
|
+
user_id TEXT NOT NULL,
|
|
528
|
+
trade_id TEXT,
|
|
529
|
+
order_id TEXT,
|
|
530
|
+
symbol TEXT NOT NULL,
|
|
531
|
+
side INTEGER NOT NULL,
|
|
532
|
+
vol REAL NOT NULL,
|
|
533
|
+
price REAL NOT NULL,
|
|
534
|
+
fee REAL DEFAULT 0,
|
|
535
|
+
fee_asset TEXT DEFAULT 'USDT',
|
|
536
|
+
realized_pnl REAL,
|
|
537
|
+
order_type INTEGER,
|
|
538
|
+
is_maker INTEGER DEFAULT 0,
|
|
539
|
+
leverage INTEGER,
|
|
540
|
+
timestamp INTEGER NOT NULL,
|
|
541
|
+
created_at INTEGER NOT NULL,
|
|
542
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
543
|
+
);
|
|
544
|
+
|
|
545
|
+
CREATE INDEX IF NOT EXISTS idx_mexc_trades_user ON mexc_futures_trades(user_id);
|
|
546
|
+
CREATE INDEX IF NOT EXISTS idx_mexc_trades_symbol ON mexc_futures_trades(symbol);
|
|
547
|
+
CREATE INDEX IF NOT EXISTS idx_mexc_trades_timestamp ON mexc_futures_trades(timestamp);
|
|
548
|
+
|
|
549
|
+
-- MEXC Futures positions history
|
|
550
|
+
CREATE TABLE IF NOT EXISTS mexc_futures_positions (
|
|
551
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
552
|
+
user_id TEXT NOT NULL,
|
|
553
|
+
symbol TEXT NOT NULL,
|
|
554
|
+
position_type INTEGER NOT NULL,
|
|
555
|
+
hold_vol REAL NOT NULL,
|
|
556
|
+
open_avg_price REAL NOT NULL,
|
|
557
|
+
mark_price REAL,
|
|
558
|
+
liquidation_price REAL,
|
|
559
|
+
unrealized_pnl REAL,
|
|
560
|
+
realized_pnl REAL DEFAULT 0,
|
|
561
|
+
leverage INTEGER,
|
|
562
|
+
margin_mode INTEGER,
|
|
563
|
+
position_margin REAL,
|
|
564
|
+
opened_at INTEGER NOT NULL,
|
|
565
|
+
closed_at INTEGER,
|
|
566
|
+
close_price REAL,
|
|
567
|
+
close_reason TEXT,
|
|
568
|
+
created_at INTEGER NOT NULL,
|
|
569
|
+
updated_at INTEGER NOT NULL,
|
|
570
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
571
|
+
);
|
|
572
|
+
|
|
573
|
+
CREATE INDEX IF NOT EXISTS idx_mexc_positions_user ON mexc_futures_positions(user_id);
|
|
574
|
+
CREATE INDEX IF NOT EXISTS idx_mexc_positions_symbol ON mexc_futures_positions(symbol);
|
|
575
|
+
CREATE INDEX IF NOT EXISTS idx_mexc_positions_open ON mexc_futures_positions(closed_at);
|
|
576
|
+
|
|
577
|
+
-- MEXC Futures funding payments
|
|
578
|
+
CREATE TABLE IF NOT EXISTS mexc_futures_funding (
|
|
579
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
580
|
+
user_id TEXT NOT NULL,
|
|
581
|
+
symbol TEXT NOT NULL,
|
|
582
|
+
funding_rate REAL NOT NULL,
|
|
583
|
+
payment REAL NOT NULL,
|
|
584
|
+
position_size REAL NOT NULL,
|
|
585
|
+
timestamp INTEGER NOT NULL,
|
|
586
|
+
created_at INTEGER NOT NULL,
|
|
587
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
588
|
+
);
|
|
589
|
+
|
|
590
|
+
CREATE INDEX IF NOT EXISTS idx_mexc_funding_user ON mexc_futures_funding(user_id);
|
|
591
|
+
CREATE INDEX IF NOT EXISTS idx_mexc_funding_symbol ON mexc_futures_funding(symbol);
|
|
592
|
+
CREATE INDEX IF NOT EXISTS idx_mexc_funding_timestamp ON mexc_futures_funding(timestamp);
|
|
593
|
+
|
|
594
|
+
-- Opinion.trade trades table
|
|
595
|
+
CREATE TABLE IF NOT EXISTS opinion_trades (
|
|
596
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
597
|
+
user_id TEXT NOT NULL,
|
|
598
|
+
order_id TEXT NOT NULL,
|
|
599
|
+
market_id TEXT NOT NULL,
|
|
600
|
+
token_id TEXT NOT NULL,
|
|
601
|
+
side TEXT NOT NULL,
|
|
602
|
+
price REAL NOT NULL,
|
|
603
|
+
size REAL NOT NULL,
|
|
604
|
+
order_type TEXT NOT NULL,
|
|
605
|
+
status TEXT DEFAULT 'open',
|
|
606
|
+
filled_size REAL DEFAULT 0,
|
|
607
|
+
avg_fill_price REAL,
|
|
608
|
+
fee REAL DEFAULT 0,
|
|
609
|
+
tx_hash TEXT,
|
|
610
|
+
timestamp INTEGER NOT NULL,
|
|
611
|
+
created_at INTEGER NOT NULL,
|
|
612
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
613
|
+
);
|
|
614
|
+
|
|
615
|
+
CREATE INDEX IF NOT EXISTS idx_opinion_trades_user ON opinion_trades(user_id);
|
|
616
|
+
CREATE INDEX IF NOT EXISTS idx_opinion_trades_market ON opinion_trades(market_id);
|
|
617
|
+
CREATE INDEX IF NOT EXISTS idx_opinion_trades_timestamp ON opinion_trades(timestamp);
|
|
618
|
+
|
|
619
|
+
-- Predict.fun trades table
|
|
620
|
+
CREATE TABLE IF NOT EXISTS predictfun_trades (
|
|
621
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
622
|
+
user_id TEXT NOT NULL,
|
|
623
|
+
order_hash TEXT NOT NULL,
|
|
624
|
+
market_id TEXT NOT NULL,
|
|
625
|
+
token_id TEXT NOT NULL,
|
|
626
|
+
side TEXT NOT NULL,
|
|
627
|
+
price REAL NOT NULL,
|
|
628
|
+
quantity REAL NOT NULL,
|
|
629
|
+
status TEXT DEFAULT 'open',
|
|
630
|
+
filled_quantity REAL DEFAULT 0,
|
|
631
|
+
avg_fill_price REAL,
|
|
632
|
+
fee REAL DEFAULT 0,
|
|
633
|
+
tx_hash TEXT,
|
|
634
|
+
is_neg_risk INTEGER DEFAULT 0,
|
|
635
|
+
is_yield_bearing INTEGER DEFAULT 1,
|
|
636
|
+
timestamp INTEGER NOT NULL,
|
|
637
|
+
created_at INTEGER NOT NULL,
|
|
638
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
639
|
+
);
|
|
640
|
+
|
|
641
|
+
CREATE INDEX IF NOT EXISTS idx_predictfun_trades_user ON predictfun_trades(user_id);
|
|
642
|
+
CREATE INDEX IF NOT EXISTS idx_predictfun_trades_market ON predictfun_trades(market_id);
|
|
643
|
+
CREATE INDEX IF NOT EXISTS idx_predictfun_trades_timestamp ON predictfun_trades(timestamp);
|
|
644
|
+
|
|
645
|
+
-- Polymarket trades table
|
|
646
|
+
CREATE TABLE IF NOT EXISTS polymarket_trades (
|
|
647
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
648
|
+
user_id TEXT NOT NULL,
|
|
649
|
+
order_id TEXT NOT NULL,
|
|
650
|
+
market_id TEXT NOT NULL,
|
|
651
|
+
token_id TEXT NOT NULL,
|
|
652
|
+
condition_id TEXT,
|
|
653
|
+
side TEXT NOT NULL,
|
|
654
|
+
price REAL NOT NULL,
|
|
655
|
+
size REAL NOT NULL,
|
|
656
|
+
order_type TEXT NOT NULL,
|
|
657
|
+
status TEXT DEFAULT 'open',
|
|
658
|
+
filled_size REAL DEFAULT 0,
|
|
659
|
+
avg_fill_price REAL,
|
|
660
|
+
fee REAL DEFAULT 0,
|
|
661
|
+
tx_hash TEXT,
|
|
662
|
+
timestamp INTEGER NOT NULL,
|
|
663
|
+
created_at INTEGER NOT NULL,
|
|
664
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
665
|
+
);
|
|
666
|
+
|
|
667
|
+
CREATE INDEX IF NOT EXISTS idx_polymarket_trades_user ON polymarket_trades(user_id);
|
|
668
|
+
CREATE INDEX IF NOT EXISTS idx_polymarket_trades_market ON polymarket_trades(market_id);
|
|
669
|
+
CREATE INDEX IF NOT EXISTS idx_polymarket_trades_timestamp ON polymarket_trades(timestamp);
|
|
670
|
+
|
|
671
|
+
-- Kalshi trades table
|
|
672
|
+
CREATE TABLE IF NOT EXISTS kalshi_trades (
|
|
673
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
674
|
+
user_id TEXT NOT NULL,
|
|
675
|
+
order_id TEXT NOT NULL,
|
|
676
|
+
market_id TEXT NOT NULL,
|
|
677
|
+
ticker TEXT NOT NULL,
|
|
678
|
+
side TEXT NOT NULL,
|
|
679
|
+
price REAL NOT NULL,
|
|
680
|
+
count INTEGER NOT NULL,
|
|
681
|
+
order_type TEXT NOT NULL,
|
|
682
|
+
status TEXT DEFAULT 'open',
|
|
683
|
+
filled_count INTEGER DEFAULT 0,
|
|
684
|
+
avg_fill_price REAL,
|
|
685
|
+
fee REAL DEFAULT 0,
|
|
686
|
+
action TEXT,
|
|
687
|
+
timestamp INTEGER NOT NULL,
|
|
688
|
+
created_at INTEGER NOT NULL,
|
|
689
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
690
|
+
);
|
|
691
|
+
|
|
692
|
+
CREATE INDEX IF NOT EXISTS idx_kalshi_trades_user ON kalshi_trades(user_id);
|
|
693
|
+
CREATE INDEX IF NOT EXISTS idx_kalshi_trades_market ON kalshi_trades(market_id);
|
|
694
|
+
CREATE INDEX IF NOT EXISTS idx_kalshi_trades_ticker ON kalshi_trades(ticker);
|
|
695
|
+
CREATE INDEX IF NOT EXISTS idx_kalshi_trades_timestamp ON kalshi_trades(timestamp);
|
|
696
|
+
|
|
697
|
+
-- Drift Protocol trades table
|
|
698
|
+
CREATE TABLE IF NOT EXISTS drift_trades (
|
|
699
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
700
|
+
user_id TEXT NOT NULL,
|
|
701
|
+
order_id TEXT,
|
|
702
|
+
market_index INTEGER NOT NULL,
|
|
703
|
+
market_type TEXT NOT NULL,
|
|
704
|
+
direction TEXT NOT NULL,
|
|
705
|
+
base_amount REAL NOT NULL,
|
|
706
|
+
quote_amount REAL,
|
|
707
|
+
price REAL,
|
|
708
|
+
order_type TEXT NOT NULL,
|
|
709
|
+
status TEXT DEFAULT 'open',
|
|
710
|
+
filled_amount REAL DEFAULT 0,
|
|
711
|
+
avg_fill_price REAL,
|
|
712
|
+
leverage REAL,
|
|
713
|
+
tx_sig TEXT,
|
|
714
|
+
timestamp INTEGER NOT NULL,
|
|
715
|
+
created_at INTEGER NOT NULL,
|
|
716
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
717
|
+
);
|
|
718
|
+
|
|
719
|
+
CREATE INDEX IF NOT EXISTS idx_drift_trades_user ON drift_trades(user_id);
|
|
720
|
+
CREATE INDEX IF NOT EXISTS idx_drift_trades_market ON drift_trades(market_index);
|
|
721
|
+
CREATE INDEX IF NOT EXISTS idx_drift_trades_timestamp ON drift_trades(timestamp);
|
|
722
|
+
|
|
723
|
+
-- Manifold Markets trades table
|
|
724
|
+
CREATE TABLE IF NOT EXISTS manifold_trades (
|
|
725
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
726
|
+
user_id TEXT NOT NULL,
|
|
727
|
+
bet_id TEXT NOT NULL,
|
|
728
|
+
contract_id TEXT NOT NULL,
|
|
729
|
+
outcome TEXT NOT NULL,
|
|
730
|
+
amount REAL NOT NULL,
|
|
731
|
+
shares REAL NOT NULL,
|
|
732
|
+
probability_before REAL,
|
|
733
|
+
probability_after REAL,
|
|
734
|
+
status TEXT DEFAULT 'filled',
|
|
735
|
+
fee REAL DEFAULT 0,
|
|
736
|
+
timestamp INTEGER NOT NULL,
|
|
737
|
+
created_at INTEGER NOT NULL,
|
|
738
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
739
|
+
);
|
|
740
|
+
|
|
741
|
+
CREATE INDEX IF NOT EXISTS idx_manifold_trades_user ON manifold_trades(user_id);
|
|
742
|
+
CREATE INDEX IF NOT EXISTS idx_manifold_trades_contract ON manifold_trades(contract_id);
|
|
743
|
+
CREATE INDEX IF NOT EXISTS idx_manifold_trades_timestamp ON manifold_trades(timestamp);
|
|
744
|
+
|
|
745
|
+
-- Solana DEX trades table (Jupiter, Raydium, Orca, Meteora)
|
|
746
|
+
CREATE TABLE IF NOT EXISTS solana_dex_trades (
|
|
747
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
748
|
+
user_id TEXT NOT NULL,
|
|
749
|
+
tx_sig TEXT NOT NULL,
|
|
750
|
+
dex TEXT NOT NULL,
|
|
751
|
+
input_mint TEXT NOT NULL,
|
|
752
|
+
output_mint TEXT NOT NULL,
|
|
753
|
+
input_amount REAL NOT NULL,
|
|
754
|
+
output_amount REAL NOT NULL,
|
|
755
|
+
input_symbol TEXT,
|
|
756
|
+
output_symbol TEXT,
|
|
757
|
+
price_impact REAL,
|
|
758
|
+
slippage REAL,
|
|
759
|
+
fee REAL DEFAULT 0,
|
|
760
|
+
route TEXT,
|
|
761
|
+
timestamp INTEGER NOT NULL,
|
|
762
|
+
created_at INTEGER NOT NULL,
|
|
763
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
764
|
+
);
|
|
765
|
+
|
|
766
|
+
CREATE INDEX IF NOT EXISTS idx_solana_dex_trades_user ON solana_dex_trades(user_id);
|
|
767
|
+
CREATE INDEX IF NOT EXISTS idx_solana_dex_trades_dex ON solana_dex_trades(dex);
|
|
768
|
+
CREATE INDEX IF NOT EXISTS idx_solana_dex_trades_timestamp ON solana_dex_trades(timestamp);
|
|
769
|
+
|
|
770
|
+
-- Jupiter swaps table (detailed route tracking)
|
|
771
|
+
CREATE TABLE IF NOT EXISTS jupiter_swaps (
|
|
772
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
773
|
+
user_id TEXT NOT NULL,
|
|
774
|
+
tx_sig TEXT NOT NULL UNIQUE,
|
|
775
|
+
input_mint TEXT NOT NULL,
|
|
776
|
+
output_mint TEXT NOT NULL,
|
|
777
|
+
input_amount TEXT NOT NULL,
|
|
778
|
+
output_amount TEXT NOT NULL,
|
|
779
|
+
input_symbol TEXT,
|
|
780
|
+
output_symbol TEXT,
|
|
781
|
+
price_impact_pct REAL,
|
|
782
|
+
slippage_bps INTEGER,
|
|
783
|
+
route_plan TEXT,
|
|
784
|
+
num_hops INTEGER,
|
|
785
|
+
priority_fee INTEGER,
|
|
786
|
+
timestamp INTEGER NOT NULL,
|
|
787
|
+
created_at INTEGER NOT NULL,
|
|
788
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
789
|
+
);
|
|
790
|
+
CREATE INDEX IF NOT EXISTS idx_jupiter_swaps_user ON jupiter_swaps(user_id);
|
|
791
|
+
CREATE INDEX IF NOT EXISTS idx_jupiter_swaps_timestamp ON jupiter_swaps(timestamp);
|
|
792
|
+
|
|
793
|
+
-- Raydium pools tracking
|
|
794
|
+
CREATE TABLE IF NOT EXISTS raydium_pools (
|
|
795
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
796
|
+
pool_id TEXT NOT NULL UNIQUE,
|
|
797
|
+
base_mint TEXT NOT NULL,
|
|
798
|
+
quote_mint TEXT NOT NULL,
|
|
799
|
+
base_symbol TEXT,
|
|
800
|
+
quote_symbol TEXT,
|
|
801
|
+
liquidity REAL,
|
|
802
|
+
volume_24h REAL,
|
|
803
|
+
fee_rate REAL,
|
|
804
|
+
version TEXT,
|
|
805
|
+
last_updated INTEGER NOT NULL
|
|
806
|
+
);
|
|
807
|
+
CREATE INDEX IF NOT EXISTS idx_raydium_pools_mints ON raydium_pools(base_mint, quote_mint);
|
|
808
|
+
|
|
809
|
+
-- Orca Whirlpool positions
|
|
810
|
+
CREATE TABLE IF NOT EXISTS orca_positions (
|
|
811
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
812
|
+
user_id TEXT NOT NULL,
|
|
813
|
+
position_address TEXT NOT NULL,
|
|
814
|
+
pool_address TEXT NOT NULL,
|
|
815
|
+
token_a_mint TEXT NOT NULL,
|
|
816
|
+
token_b_mint TEXT NOT NULL,
|
|
817
|
+
tick_lower INTEGER,
|
|
818
|
+
tick_upper INTEGER,
|
|
819
|
+
liquidity TEXT,
|
|
820
|
+
fee_owed_a TEXT,
|
|
821
|
+
fee_owed_b TEXT,
|
|
822
|
+
created_at INTEGER NOT NULL,
|
|
823
|
+
updated_at INTEGER NOT NULL,
|
|
824
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
825
|
+
);
|
|
826
|
+
CREATE INDEX IF NOT EXISTS idx_orca_positions_user ON orca_positions(user_id);
|
|
827
|
+
|
|
828
|
+
-- Meteora DLMM pools
|
|
829
|
+
CREATE TABLE IF NOT EXISTS meteora_pools (
|
|
830
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
831
|
+
pool_address TEXT NOT NULL UNIQUE,
|
|
832
|
+
token_x_mint TEXT NOT NULL,
|
|
833
|
+
token_y_mint TEXT NOT NULL,
|
|
834
|
+
token_x_symbol TEXT,
|
|
835
|
+
token_y_symbol TEXT,
|
|
836
|
+
bin_step INTEGER,
|
|
837
|
+
active_id INTEGER,
|
|
838
|
+
liquidity REAL,
|
|
839
|
+
fee_rate REAL,
|
|
840
|
+
last_updated INTEGER NOT NULL
|
|
841
|
+
);
|
|
842
|
+
CREATE INDEX IF NOT EXISTS idx_meteora_pools_mints ON meteora_pools(token_x_mint, token_y_mint);
|
|
843
|
+
|
|
844
|
+
-- Pump.fun tokens
|
|
845
|
+
CREATE TABLE IF NOT EXISTS pump_tokens (
|
|
846
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
847
|
+
mint TEXT NOT NULL UNIQUE,
|
|
848
|
+
name TEXT,
|
|
849
|
+
symbol TEXT,
|
|
850
|
+
creator TEXT,
|
|
851
|
+
bonding_curve TEXT,
|
|
852
|
+
market_cap REAL,
|
|
853
|
+
virtual_sol_reserves REAL,
|
|
854
|
+
virtual_token_reserves REAL,
|
|
855
|
+
total_supply TEXT,
|
|
856
|
+
holder_count INTEGER,
|
|
857
|
+
is_graduated INTEGER DEFAULT 0,
|
|
858
|
+
created_at INTEGER NOT NULL,
|
|
859
|
+
updated_at INTEGER NOT NULL
|
|
860
|
+
);
|
|
861
|
+
CREATE INDEX IF NOT EXISTS idx_pump_tokens_symbol ON pump_tokens(symbol);
|
|
862
|
+
CREATE INDEX IF NOT EXISTS idx_pump_tokens_market_cap ON pump_tokens(market_cap);
|
|
863
|
+
|
|
864
|
+
-- Drift trades (perpetuals)
|
|
865
|
+
CREATE TABLE IF NOT EXISTS drift_trades (
|
|
866
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
867
|
+
user_id TEXT NOT NULL,
|
|
868
|
+
tx_sig TEXT NOT NULL,
|
|
869
|
+
market_index INTEGER NOT NULL,
|
|
870
|
+
market_type TEXT NOT NULL,
|
|
871
|
+
order_id INTEGER,
|
|
872
|
+
direction TEXT NOT NULL,
|
|
873
|
+
base_asset_amount TEXT NOT NULL,
|
|
874
|
+
quote_asset_amount TEXT,
|
|
875
|
+
price TEXT,
|
|
876
|
+
fee TEXT,
|
|
877
|
+
pnl TEXT,
|
|
878
|
+
timestamp INTEGER NOT NULL,
|
|
879
|
+
created_at INTEGER NOT NULL,
|
|
880
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
881
|
+
);
|
|
882
|
+
CREATE INDEX IF NOT EXISTS idx_drift_trades_user ON drift_trades(user_id);
|
|
883
|
+
CREATE INDEX IF NOT EXISTS idx_drift_trades_market ON drift_trades(market_index);
|
|
884
|
+
CREATE INDEX IF NOT EXISTS idx_drift_trades_timestamp ON drift_trades(timestamp);
|
|
885
|
+
|
|
886
|
+
-- Drift positions
|
|
887
|
+
CREATE TABLE IF NOT EXISTS drift_positions (
|
|
888
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
889
|
+
user_id TEXT NOT NULL,
|
|
890
|
+
market_index INTEGER NOT NULL,
|
|
891
|
+
market_type TEXT NOT NULL,
|
|
892
|
+
base_asset_amount TEXT NOT NULL,
|
|
893
|
+
quote_asset_amount TEXT,
|
|
894
|
+
entry_price TEXT,
|
|
895
|
+
unrealized_pnl TEXT,
|
|
896
|
+
liquidation_price TEXT,
|
|
897
|
+
leverage REAL,
|
|
898
|
+
updated_at INTEGER NOT NULL,
|
|
899
|
+
UNIQUE(user_id, market_index, market_type),
|
|
900
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
901
|
+
);
|
|
902
|
+
CREATE INDEX IF NOT EXISTS idx_drift_positions_user ON drift_positions(user_id);
|
|
903
|
+
|
|
904
|
+
-- EVM swap trades table (Uniswap, Sushiswap, 1inch, etc.)
|
|
905
|
+
CREATE TABLE IF NOT EXISTS evm_swap_trades (
|
|
906
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
907
|
+
user_id TEXT NOT NULL,
|
|
908
|
+
tx_hash TEXT NOT NULL,
|
|
909
|
+
chain_id INTEGER NOT NULL,
|
|
910
|
+
dex TEXT NOT NULL,
|
|
911
|
+
token_in TEXT NOT NULL,
|
|
912
|
+
token_out TEXT NOT NULL,
|
|
913
|
+
amount_in REAL NOT NULL,
|
|
914
|
+
amount_out REAL NOT NULL,
|
|
915
|
+
token_in_symbol TEXT,
|
|
916
|
+
token_out_symbol TEXT,
|
|
917
|
+
price_impact REAL,
|
|
918
|
+
slippage REAL,
|
|
919
|
+
gas_used REAL,
|
|
920
|
+
gas_price REAL,
|
|
921
|
+
timestamp INTEGER NOT NULL,
|
|
922
|
+
created_at INTEGER NOT NULL,
|
|
923
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
924
|
+
);
|
|
925
|
+
|
|
926
|
+
CREATE INDEX IF NOT EXISTS idx_evm_swap_trades_user ON evm_swap_trades(user_id);
|
|
927
|
+
CREATE INDEX IF NOT EXISTS idx_evm_swap_trades_chain ON evm_swap_trades(chain_id);
|
|
928
|
+
CREATE INDEX IF NOT EXISTS idx_evm_swap_trades_dex ON evm_swap_trades(dex);
|
|
929
|
+
CREATE INDEX IF NOT EXISTS idx_evm_swap_trades_timestamp ON evm_swap_trades(timestamp);
|
|
930
|
+
|
|
931
|
+
-- Create indexes
|
|
932
|
+
CREATE INDEX IF NOT EXISTS idx_alerts_user ON alerts(user_id);
|
|
933
|
+
CREATE INDEX IF NOT EXISTS idx_alerts_active ON alerts(enabled, triggered);
|
|
934
|
+
CREATE INDEX IF NOT EXISTS idx_positions_user ON positions(user_id);
|
|
935
|
+
CREATE INDEX IF NOT EXISTS idx_portfolio_snapshots_user ON portfolio_snapshots(user_id);
|
|
936
|
+
CREATE INDEX IF NOT EXISTS idx_portfolio_snapshots_created_at ON portfolio_snapshots(created_at);
|
|
937
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_user ON sessions(user_id);
|
|
938
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_key ON sessions(key);
|
|
939
|
+
CREATE INDEX IF NOT EXISTS idx_credentials_user ON trading_credentials(user_id);
|
|
940
|
+
CREATE INDEX IF NOT EXISTS idx_credentials_user_platform ON trading_credentials(user_id, platform);
|
|
941
|
+
CREATE INDEX IF NOT EXISTS idx_markets_platform_market ON markets(platform, market_id);
|
|
942
|
+
CREATE INDEX IF NOT EXISTS idx_users_platform_userid ON users(platform, platform_user_id);
|
|
943
|
+
CREATE INDEX IF NOT EXISTS idx_watched_wallets_user ON watched_wallets(user_id);
|
|
944
|
+
CREATE INDEX IF NOT EXISTS idx_paper_positions_user ON paper_positions(user_id);
|
|
945
|
+
CREATE INDEX IF NOT EXISTS idx_paper_trades_user ON paper_trades(user_id);
|
|
946
|
+
`);
|
|
947
|
+
// Backfill new columns on existing databases
|
|
948
|
+
try {
|
|
949
|
+
db.run('ALTER TABLE market_index ADD COLUMN content_hash TEXT');
|
|
950
|
+
}
|
|
951
|
+
catch {
|
|
952
|
+
// Column already exists or table missing; ignore.
|
|
953
|
+
}
|
|
954
|
+
// Silently add columns if missing - errors mean column already exists
|
|
955
|
+
try {
|
|
956
|
+
db.run('ALTER TABLE market_index ADD COLUMN volume_24h REAL');
|
|
957
|
+
}
|
|
958
|
+
catch { /* Column exists */ }
|
|
959
|
+
try {
|
|
960
|
+
db.run('ALTER TABLE market_index ADD COLUMN liquidity REAL');
|
|
961
|
+
}
|
|
962
|
+
catch { /* Column exists */ }
|
|
963
|
+
try {
|
|
964
|
+
db.run('ALTER TABLE market_index ADD COLUMN open_interest REAL');
|
|
965
|
+
}
|
|
966
|
+
catch { /* Column exists */ }
|
|
967
|
+
try {
|
|
968
|
+
db.run('ALTER TABLE market_index ADD COLUMN predictions INTEGER');
|
|
969
|
+
}
|
|
970
|
+
catch { /* Column exists */ }
|
|
971
|
+
try {
|
|
972
|
+
db.run('ALTER TABLE sessions ADD COLUMN title TEXT');
|
|
973
|
+
}
|
|
974
|
+
catch { /* Column exists */ }
|
|
975
|
+
// Ensure embeddings table exists for older DBs
|
|
976
|
+
db.run(`
|
|
977
|
+
CREATE TABLE IF NOT EXISTS market_index_embeddings (
|
|
978
|
+
platform TEXT NOT NULL,
|
|
979
|
+
market_id TEXT NOT NULL,
|
|
980
|
+
content_hash TEXT NOT NULL,
|
|
981
|
+
vector TEXT NOT NULL,
|
|
982
|
+
updated_at INTEGER NOT NULL,
|
|
983
|
+
PRIMARY KEY (platform, market_id)
|
|
984
|
+
);
|
|
985
|
+
`);
|
|
986
|
+
db.run('CREATE INDEX IF NOT EXISTS idx_market_index_embeddings_hash ON market_index_embeddings(content_hash)');
|
|
987
|
+
// Save after schema creation
|
|
988
|
+
saveDb();
|
|
989
|
+
function saveDb() {
|
|
990
|
+
if (!sqlJsDb)
|
|
991
|
+
return;
|
|
992
|
+
const data = sqlJsDb.export();
|
|
993
|
+
const buffer = Buffer.from(data);
|
|
994
|
+
(0, fs_1.writeFileSync)(DB_FILE, buffer);
|
|
995
|
+
}
|
|
996
|
+
function getBackupConfig() {
|
|
997
|
+
const intervalMinutes = Number.parseInt(process.env.CLODDS_DB_BACKUP_INTERVAL_MINUTES || '60', 10);
|
|
998
|
+
const maxFiles = Number.parseInt(process.env.CLODDS_DB_BACKUP_MAX || '10', 10);
|
|
999
|
+
const intervalMs = Math.max(1, intervalMinutes) * 60 * 1000;
|
|
1000
|
+
return {
|
|
1001
|
+
enabled: intervalMinutes > 0 && maxFiles > 0,
|
|
1002
|
+
intervalMs,
|
|
1003
|
+
maxFiles,
|
|
1004
|
+
};
|
|
1005
|
+
}
|
|
1006
|
+
function ensureBackupDir() {
|
|
1007
|
+
if (!(0, fs_1.existsSync)(BACKUP_DIR)) {
|
|
1008
|
+
(0, fs_1.mkdirSync)(BACKUP_DIR, { recursive: true });
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
function listBackupFiles() {
|
|
1012
|
+
if (!(0, fs_1.existsSync)(BACKUP_DIR))
|
|
1013
|
+
return [];
|
|
1014
|
+
return (0, fs_1.readdirSync)(BACKUP_DIR)
|
|
1015
|
+
.filter((name) => name.endsWith('.db'))
|
|
1016
|
+
.map((name) => {
|
|
1017
|
+
const path = (0, path_1.join)(BACKUP_DIR, name);
|
|
1018
|
+
const stats = (0, fs_1.statSync)(path);
|
|
1019
|
+
return { name, path, mtimeMs: stats.mtimeMs };
|
|
1020
|
+
})
|
|
1021
|
+
.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
1022
|
+
}
|
|
1023
|
+
function pruneBackups(maxFiles) {
|
|
1024
|
+
const files = listBackupFiles();
|
|
1025
|
+
if (files.length <= maxFiles)
|
|
1026
|
+
return;
|
|
1027
|
+
const toDelete = files.slice(maxFiles);
|
|
1028
|
+
for (const file of toDelete) {
|
|
1029
|
+
try {
|
|
1030
|
+
(0, fs_1.unlinkSync)(file.path);
|
|
1031
|
+
}
|
|
1032
|
+
catch (error) {
|
|
1033
|
+
logger_1.logger.warn({ error, file: file.name }, 'Failed to delete old backup');
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
function createBackup() {
|
|
1038
|
+
if (!sqlJsDb)
|
|
1039
|
+
return;
|
|
1040
|
+
ensureBackupDir();
|
|
1041
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
1042
|
+
const filePath = (0, path_1.join)(BACKUP_DIR, `clodds-${timestamp}.db`);
|
|
1043
|
+
const data = sqlJsDb.export();
|
|
1044
|
+
(0, fs_1.writeFileSync)(filePath, Buffer.from(data));
|
|
1045
|
+
const { maxFiles } = getBackupConfig();
|
|
1046
|
+
pruneBackups(maxFiles);
|
|
1047
|
+
}
|
|
1048
|
+
// Helper to get single row
|
|
1049
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1050
|
+
function getOne(sql, params = []) {
|
|
1051
|
+
const stmt = db.prepare(sql);
|
|
1052
|
+
try {
|
|
1053
|
+
stmt.bind(params);
|
|
1054
|
+
if (stmt.step()) {
|
|
1055
|
+
const row = stmt.getAsObject();
|
|
1056
|
+
return row;
|
|
1057
|
+
}
|
|
1058
|
+
return undefined;
|
|
1059
|
+
}
|
|
1060
|
+
finally {
|
|
1061
|
+
stmt.free();
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
// Helper to get all rows
|
|
1065
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1066
|
+
function getAll(sql, params = []) {
|
|
1067
|
+
const stmt = db.prepare(sql);
|
|
1068
|
+
try {
|
|
1069
|
+
stmt.bind(params);
|
|
1070
|
+
const results = [];
|
|
1071
|
+
while (stmt.step()) {
|
|
1072
|
+
results.push(stmt.getAsObject());
|
|
1073
|
+
}
|
|
1074
|
+
return results;
|
|
1075
|
+
}
|
|
1076
|
+
finally {
|
|
1077
|
+
stmt.free();
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
// Helper to run statement
|
|
1081
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1082
|
+
function run(sql, params = []) {
|
|
1083
|
+
db.run(sql, params);
|
|
1084
|
+
saveDb();
|
|
1085
|
+
}
|
|
1086
|
+
// Helper to query multiple rows
|
|
1087
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1088
|
+
function query(sql, params = []) {
|
|
1089
|
+
const stmt = db.prepare(sql);
|
|
1090
|
+
try {
|
|
1091
|
+
stmt.bind(params);
|
|
1092
|
+
const results = [];
|
|
1093
|
+
while (stmt.step()) {
|
|
1094
|
+
results.push(stmt.getAsObject());
|
|
1095
|
+
}
|
|
1096
|
+
return results;
|
|
1097
|
+
}
|
|
1098
|
+
finally {
|
|
1099
|
+
stmt.free();
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
// Helper to parse row into typed object
|
|
1103
|
+
function parseUser(row) {
|
|
1104
|
+
if (!row)
|
|
1105
|
+
return undefined;
|
|
1106
|
+
return {
|
|
1107
|
+
id: row.id,
|
|
1108
|
+
platform: row.platform,
|
|
1109
|
+
platformUserId: row.platform_user_id,
|
|
1110
|
+
username: row.username,
|
|
1111
|
+
settings: JSON.parse(row.settings || '{}'),
|
|
1112
|
+
createdAt: new Date(row.created_at),
|
|
1113
|
+
lastActiveAt: new Date(row.last_active_at),
|
|
1114
|
+
};
|
|
1115
|
+
}
|
|
1116
|
+
function extractAccountIdFromSessionKey(key) {
|
|
1117
|
+
const parts = key.split(':');
|
|
1118
|
+
if (parts.length < 4)
|
|
1119
|
+
return undefined;
|
|
1120
|
+
const platform = parts[2];
|
|
1121
|
+
if (platform !== 'whatsapp')
|
|
1122
|
+
return undefined;
|
|
1123
|
+
const candidate = parts[3];
|
|
1124
|
+
if (candidate === 'group' || candidate === 'dm')
|
|
1125
|
+
return undefined;
|
|
1126
|
+
return candidate || undefined;
|
|
1127
|
+
}
|
|
1128
|
+
function parseSession(row) {
|
|
1129
|
+
if (!row)
|
|
1130
|
+
return undefined;
|
|
1131
|
+
let context;
|
|
1132
|
+
try {
|
|
1133
|
+
context = JSON.parse(row.context || '{}');
|
|
1134
|
+
}
|
|
1135
|
+
catch {
|
|
1136
|
+
context = {};
|
|
1137
|
+
}
|
|
1138
|
+
context.messageCount ??= 0;
|
|
1139
|
+
context.lastMarkets ??= [];
|
|
1140
|
+
context.preferences ??= {};
|
|
1141
|
+
context.conversationHistory ??= [];
|
|
1142
|
+
return {
|
|
1143
|
+
id: row.id,
|
|
1144
|
+
key: row.key,
|
|
1145
|
+
userId: row.user_id,
|
|
1146
|
+
channel: row.channel,
|
|
1147
|
+
accountId: extractAccountIdFromSessionKey(row.key),
|
|
1148
|
+
chatId: row.chat_id,
|
|
1149
|
+
chatType: row.chat_type,
|
|
1150
|
+
title: row.title || undefined,
|
|
1151
|
+
context,
|
|
1152
|
+
history: context.conversationHistory || [],
|
|
1153
|
+
lastActivity: row.last_activity ? new Date(row.last_activity) : new Date(row.updated_at),
|
|
1154
|
+
createdAt: new Date(row.created_at),
|
|
1155
|
+
updatedAt: new Date(row.updated_at),
|
|
1156
|
+
};
|
|
1157
|
+
}
|
|
1158
|
+
function parseAlert(row) {
|
|
1159
|
+
return {
|
|
1160
|
+
id: row.id,
|
|
1161
|
+
userId: row.user_id,
|
|
1162
|
+
type: row.type,
|
|
1163
|
+
name: row.name,
|
|
1164
|
+
marketId: row.market_id,
|
|
1165
|
+
platform: row.platform,
|
|
1166
|
+
channel: row.channel,
|
|
1167
|
+
chatId: row.chat_id,
|
|
1168
|
+
condition: JSON.parse(row.condition || '{}'),
|
|
1169
|
+
enabled: Boolean(row.enabled),
|
|
1170
|
+
triggered: Boolean(row.triggered),
|
|
1171
|
+
createdAt: new Date(row.created_at),
|
|
1172
|
+
lastTriggeredAt: row.last_triggered_at ? new Date(row.last_triggered_at) : undefined,
|
|
1173
|
+
};
|
|
1174
|
+
}
|
|
1175
|
+
function parsePosition(row) {
|
|
1176
|
+
const shares = row.shares;
|
|
1177
|
+
const avgPrice = row.avg_price;
|
|
1178
|
+
const currentPrice = row.current_price || avgPrice;
|
|
1179
|
+
const value = shares * currentPrice;
|
|
1180
|
+
const pnl = shares * (currentPrice - avgPrice);
|
|
1181
|
+
const pnlPct = avgPrice > 0 ? ((currentPrice - avgPrice) / avgPrice) * 100 : 0;
|
|
1182
|
+
return {
|
|
1183
|
+
id: row.id,
|
|
1184
|
+
platform: row.platform,
|
|
1185
|
+
marketId: row.market_id,
|
|
1186
|
+
marketQuestion: row.market_question,
|
|
1187
|
+
outcome: row.outcome,
|
|
1188
|
+
outcomeId: row.outcome_id,
|
|
1189
|
+
side: row.side,
|
|
1190
|
+
shares,
|
|
1191
|
+
avgPrice,
|
|
1192
|
+
currentPrice,
|
|
1193
|
+
pnl,
|
|
1194
|
+
pnlPct,
|
|
1195
|
+
value,
|
|
1196
|
+
openedAt: new Date(row.opened_at),
|
|
1197
|
+
};
|
|
1198
|
+
}
|
|
1199
|
+
function parsePortfolioSnapshot(row) {
|
|
1200
|
+
const byPlatformRaw = row.by_platform;
|
|
1201
|
+
let byPlatform = {};
|
|
1202
|
+
if (byPlatformRaw) {
|
|
1203
|
+
try {
|
|
1204
|
+
byPlatform = JSON.parse(byPlatformRaw);
|
|
1205
|
+
}
|
|
1206
|
+
catch {
|
|
1207
|
+
byPlatform = {};
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
return {
|
|
1211
|
+
userId: row.user_id,
|
|
1212
|
+
totalValue: Number(row.total_value || 0),
|
|
1213
|
+
totalPnl: Number(row.total_pnl || 0),
|
|
1214
|
+
totalPnlPct: Number(row.total_pnl_pct || 0),
|
|
1215
|
+
totalCostBasis: Number(row.total_cost_basis || 0),
|
|
1216
|
+
positionsCount: Number(row.positions_count || 0),
|
|
1217
|
+
byPlatform,
|
|
1218
|
+
createdAt: new Date(row.created_at),
|
|
1219
|
+
};
|
|
1220
|
+
}
|
|
1221
|
+
function parseTradingCredentials(row) {
|
|
1222
|
+
if (!row)
|
|
1223
|
+
return null;
|
|
1224
|
+
return {
|
|
1225
|
+
userId: row.user_id,
|
|
1226
|
+
platform: row.platform,
|
|
1227
|
+
mode: row.mode,
|
|
1228
|
+
encryptedData: row.encrypted_data,
|
|
1229
|
+
enabled: Boolean(row.enabled),
|
|
1230
|
+
lastUsedAt: row.last_used_at ? new Date(row.last_used_at) : undefined,
|
|
1231
|
+
failedAttempts: row.failed_attempts,
|
|
1232
|
+
cooldownUntil: row.cooldown_until ? new Date(row.cooldown_until) : undefined,
|
|
1233
|
+
createdAt: new Date(row.created_at),
|
|
1234
|
+
updatedAt: new Date(row.updated_at),
|
|
1235
|
+
};
|
|
1236
|
+
}
|
|
1237
|
+
const instance = {
|
|
1238
|
+
close() {
|
|
1239
|
+
saveDb();
|
|
1240
|
+
db.close();
|
|
1241
|
+
sqlJsDb = null;
|
|
1242
|
+
dbInstance = null;
|
|
1243
|
+
dbInitPromise = null;
|
|
1244
|
+
if (backupInterval) {
|
|
1245
|
+
clearInterval(backupInterval);
|
|
1246
|
+
backupInterval = null;
|
|
1247
|
+
}
|
|
1248
|
+
},
|
|
1249
|
+
save() {
|
|
1250
|
+
saveDb();
|
|
1251
|
+
},
|
|
1252
|
+
backupNow() {
|
|
1253
|
+
createBackup();
|
|
1254
|
+
},
|
|
1255
|
+
getVersion() {
|
|
1256
|
+
try {
|
|
1257
|
+
const row = getOne('SELECT version FROM _schema_version ORDER BY version DESC LIMIT 1');
|
|
1258
|
+
return row?.version ?? 0;
|
|
1259
|
+
}
|
|
1260
|
+
catch {
|
|
1261
|
+
return 0;
|
|
1262
|
+
}
|
|
1263
|
+
},
|
|
1264
|
+
setVersion(version) {
|
|
1265
|
+
run('CREATE TABLE IF NOT EXISTS _schema_version (version INTEGER NOT NULL, applied_at INTEGER NOT NULL)');
|
|
1266
|
+
run('INSERT INTO _schema_version (version, applied_at) VALUES (?, ?)', [version, Date.now()]);
|
|
1267
|
+
},
|
|
1268
|
+
// Users
|
|
1269
|
+
getUserByPlatformId(platform, platformUserId) {
|
|
1270
|
+
return parseUser(getOne('SELECT id, platform, platform_user_id, username, settings, created_at, last_active_at FROM users WHERE platform = ? AND platform_user_id = ?', [platform, platformUserId]));
|
|
1271
|
+
},
|
|
1272
|
+
getUser(userId) {
|
|
1273
|
+
return parseUser(getOne('SELECT id, platform, platform_user_id, username, settings, created_at, last_active_at FROM users WHERE id = ?', [userId]));
|
|
1274
|
+
},
|
|
1275
|
+
listUsers() {
|
|
1276
|
+
return getAll('SELECT id, platform, platform_user_id, username, settings, created_at, last_active_at FROM users')
|
|
1277
|
+
.map(parseUser)
|
|
1278
|
+
.filter((user) => Boolean(user));
|
|
1279
|
+
},
|
|
1280
|
+
createUser(user) {
|
|
1281
|
+
run('INSERT INTO users (id, platform, platform_user_id, username, settings, created_at, last_active_at) VALUES (?, ?, ?, ?, ?, ?, ?)', [
|
|
1282
|
+
user.id,
|
|
1283
|
+
user.platform,
|
|
1284
|
+
user.platformUserId,
|
|
1285
|
+
user.username ?? null,
|
|
1286
|
+
JSON.stringify(user.settings),
|
|
1287
|
+
user.createdAt.getTime(),
|
|
1288
|
+
user.lastActiveAt.getTime(),
|
|
1289
|
+
]);
|
|
1290
|
+
},
|
|
1291
|
+
updateUserActivity(userId) {
|
|
1292
|
+
run('UPDATE users SET last_active_at = ? WHERE id = ?', [Date.now(), userId]);
|
|
1293
|
+
},
|
|
1294
|
+
updateUserSettings(userId, settings) {
|
|
1295
|
+
const user = instance.getUser(userId);
|
|
1296
|
+
if (!user)
|
|
1297
|
+
return false;
|
|
1298
|
+
const next = { ...user.settings, ...settings };
|
|
1299
|
+
run('UPDATE users SET settings = ? WHERE id = ?', [JSON.stringify(next), userId]);
|
|
1300
|
+
return true;
|
|
1301
|
+
},
|
|
1302
|
+
updateUserSettingsByPlatform(platform, platformUserId, settings) {
|
|
1303
|
+
const user = instance.getUserByPlatformId(platform, platformUserId);
|
|
1304
|
+
if (!user)
|
|
1305
|
+
return false;
|
|
1306
|
+
return instance.updateUserSettings(user.id, settings);
|
|
1307
|
+
},
|
|
1308
|
+
// Sessions
|
|
1309
|
+
getSession(key) {
|
|
1310
|
+
return parseSession(getOne('SELECT id, key, user_id, channel, chat_id, chat_type, context, title, created_at, updated_at FROM sessions WHERE key = ?', [key]));
|
|
1311
|
+
},
|
|
1312
|
+
getLatestSessionForUser(userId) {
|
|
1313
|
+
const row = getOne('SELECT channel, chat_id, chat_type, updated_at FROM sessions WHERE user_id = ? ORDER BY updated_at DESC LIMIT 1', [userId]);
|
|
1314
|
+
if (!row)
|
|
1315
|
+
return undefined;
|
|
1316
|
+
return {
|
|
1317
|
+
channel: row.channel,
|
|
1318
|
+
chatId: row.chat_id,
|
|
1319
|
+
chatType: row.chat_type,
|
|
1320
|
+
updatedAt: new Date(row.updated_at),
|
|
1321
|
+
};
|
|
1322
|
+
},
|
|
1323
|
+
getLatestSessionForChat(platform, chatId) {
|
|
1324
|
+
return parseSession(getOne('SELECT id, key, user_id, channel, chat_id, chat_type, context, title, created_at, updated_at FROM sessions WHERE channel = ? AND chat_id = ? ORDER BY updated_at DESC LIMIT 1', [platform, chatId]));
|
|
1325
|
+
},
|
|
1326
|
+
createSession(session) {
|
|
1327
|
+
run('INSERT INTO sessions (id, key, user_id, channel, chat_id, chat_type, context, title, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [
|
|
1328
|
+
session.id,
|
|
1329
|
+
session.key,
|
|
1330
|
+
session.userId,
|
|
1331
|
+
session.channel,
|
|
1332
|
+
session.chatId,
|
|
1333
|
+
session.chatType,
|
|
1334
|
+
JSON.stringify(session.context),
|
|
1335
|
+
session.title || null,
|
|
1336
|
+
session.createdAt.getTime(),
|
|
1337
|
+
session.updatedAt.getTime(),
|
|
1338
|
+
]);
|
|
1339
|
+
},
|
|
1340
|
+
updateSession(session) {
|
|
1341
|
+
run('UPDATE sessions SET context = ?, title = ?, updated_at = ? WHERE key = ?', [
|
|
1342
|
+
JSON.stringify(session.context),
|
|
1343
|
+
session.title || null,
|
|
1344
|
+
session.updatedAt.getTime(),
|
|
1345
|
+
session.key,
|
|
1346
|
+
]);
|
|
1347
|
+
},
|
|
1348
|
+
deleteSession(key) {
|
|
1349
|
+
run('DELETE FROM sessions WHERE key = ?', [key]);
|
|
1350
|
+
},
|
|
1351
|
+
deleteSessionsBefore(cutoffMs) {
|
|
1352
|
+
const rows = getAll('SELECT key FROM sessions WHERE updated_at < ?', [cutoffMs]);
|
|
1353
|
+
if (rows.length === 0)
|
|
1354
|
+
return 0;
|
|
1355
|
+
run('DELETE FROM sessions WHERE updated_at < ?', [cutoffMs]);
|
|
1356
|
+
return rows.length;
|
|
1357
|
+
},
|
|
1358
|
+
getSessionById(id) {
|
|
1359
|
+
return parseSession(getOne('SELECT id, key, user_id, channel, chat_id, chat_type, context, title, created_at, updated_at FROM sessions WHERE id = ?', [id]));
|
|
1360
|
+
},
|
|
1361
|
+
listWebchatSessions(userId) {
|
|
1362
|
+
const rows = getAll('SELECT id, title, context, updated_at FROM sessions WHERE channel = ? AND user_id = ? ORDER BY updated_at DESC LIMIT 200', ['webchat', userId]);
|
|
1363
|
+
return rows.map(row => {
|
|
1364
|
+
let messageCount = 0;
|
|
1365
|
+
let lastMessage;
|
|
1366
|
+
try {
|
|
1367
|
+
const ctx = JSON.parse(row.context || '{}');
|
|
1368
|
+
const history = ctx.conversationHistory || [];
|
|
1369
|
+
messageCount = history.length;
|
|
1370
|
+
if (history.length > 0) {
|
|
1371
|
+
const last = history[history.length - 1];
|
|
1372
|
+
lastMessage = typeof last.content === 'string' ? last.content.slice(0, 100) : undefined;
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
catch { /* ignore */ }
|
|
1376
|
+
return {
|
|
1377
|
+
id: row.id,
|
|
1378
|
+
title: row.title || undefined,
|
|
1379
|
+
updatedAt: row.updated_at,
|
|
1380
|
+
messageCount,
|
|
1381
|
+
lastMessage,
|
|
1382
|
+
};
|
|
1383
|
+
});
|
|
1384
|
+
},
|
|
1385
|
+
updateSessionTitle(key, title) {
|
|
1386
|
+
run('UPDATE sessions SET title = ?, updated_at = ? WHERE key = ?', [title, Date.now(), key]);
|
|
1387
|
+
},
|
|
1388
|
+
// Cron jobs
|
|
1389
|
+
listCronJobs() {
|
|
1390
|
+
return getAll('SELECT id, data, enabled, created_at, updated_at FROM cron_jobs ORDER BY created_at ASC').map((row) => ({
|
|
1391
|
+
id: row.id,
|
|
1392
|
+
data: row.data,
|
|
1393
|
+
enabled: Boolean(row.enabled),
|
|
1394
|
+
createdAtMs: row.created_at,
|
|
1395
|
+
updatedAtMs: row.updated_at,
|
|
1396
|
+
}));
|
|
1397
|
+
},
|
|
1398
|
+
getCronJob(id) {
|
|
1399
|
+
const row = getOne('SELECT id, data, enabled, created_at, updated_at FROM cron_jobs WHERE id = ?', [id]);
|
|
1400
|
+
if (!row)
|
|
1401
|
+
return undefined;
|
|
1402
|
+
return {
|
|
1403
|
+
id: row.id,
|
|
1404
|
+
data: row.data,
|
|
1405
|
+
enabled: Boolean(row.enabled),
|
|
1406
|
+
createdAtMs: row.created_at,
|
|
1407
|
+
updatedAtMs: row.updated_at,
|
|
1408
|
+
};
|
|
1409
|
+
},
|
|
1410
|
+
upsertCronJob(record) {
|
|
1411
|
+
const existing = record.createdAtMs ? null : this.getCronJob(record.id);
|
|
1412
|
+
const createdAtMs = record.createdAtMs ?? existing?.createdAtMs ?? Date.now();
|
|
1413
|
+
const updatedAtMs = record.updatedAtMs ?? Date.now();
|
|
1414
|
+
run(`INSERT INTO cron_jobs (id, data, enabled, created_at, updated_at)
|
|
1415
|
+
VALUES (?, ?, ?, ?, ?)
|
|
1416
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
1417
|
+
data = excluded.data,
|
|
1418
|
+
enabled = excluded.enabled,
|
|
1419
|
+
updated_at = excluded.updated_at`, [record.id, record.data, record.enabled ? 1 : 0, createdAtMs, updatedAtMs]);
|
|
1420
|
+
},
|
|
1421
|
+
deleteCronJob(id) {
|
|
1422
|
+
run('DELETE FROM cron_jobs WHERE id = ?', [id]);
|
|
1423
|
+
},
|
|
1424
|
+
// Alerts
|
|
1425
|
+
getAlerts(userId) {
|
|
1426
|
+
return getAll('SELECT id, user_id, type, name, market_id, platform, channel, chat_id, condition, enabled, triggered, trigger_count, created_at, last_triggered_at FROM alerts WHERE user_id = ?', [userId]).map(parseAlert);
|
|
1427
|
+
},
|
|
1428
|
+
getActiveAlerts() {
|
|
1429
|
+
return getAll('SELECT id, user_id, type, name, market_id, platform, channel, chat_id, condition, enabled, triggered, trigger_count, created_at, last_triggered_at FROM alerts WHERE enabled = 1 AND triggered = 0').map(parseAlert);
|
|
1430
|
+
},
|
|
1431
|
+
createAlert(alert) {
|
|
1432
|
+
run('INSERT INTO alerts (id, user_id, type, name, market_id, platform, channel, chat_id, condition, enabled, triggered, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [
|
|
1433
|
+
alert.id,
|
|
1434
|
+
alert.userId,
|
|
1435
|
+
alert.type,
|
|
1436
|
+
alert.name || null,
|
|
1437
|
+
alert.marketId || null,
|
|
1438
|
+
alert.platform || null,
|
|
1439
|
+
alert.channel || null,
|
|
1440
|
+
alert.chatId || null,
|
|
1441
|
+
JSON.stringify(alert.condition),
|
|
1442
|
+
alert.enabled ? 1 : 0,
|
|
1443
|
+
alert.triggered ? 1 : 0,
|
|
1444
|
+
alert.createdAt.getTime(),
|
|
1445
|
+
]);
|
|
1446
|
+
},
|
|
1447
|
+
updateAlert(alert) {
|
|
1448
|
+
run('UPDATE alerts SET name = ?, condition = ?, enabled = ?, channel = ?, chat_id = ? WHERE id = ?', [
|
|
1449
|
+
alert.name || null,
|
|
1450
|
+
JSON.stringify(alert.condition),
|
|
1451
|
+
alert.enabled ? 1 : 0,
|
|
1452
|
+
alert.channel || null,
|
|
1453
|
+
alert.chatId || null,
|
|
1454
|
+
alert.id,
|
|
1455
|
+
]);
|
|
1456
|
+
},
|
|
1457
|
+
deleteAlert(alertId) {
|
|
1458
|
+
run('DELETE FROM alerts WHERE id = ?', [alertId]);
|
|
1459
|
+
},
|
|
1460
|
+
triggerAlert(alertId) {
|
|
1461
|
+
run('UPDATE alerts SET triggered = 1, trigger_count = trigger_count + 1, last_triggered_at = ? WHERE id = ?', [
|
|
1462
|
+
Date.now(),
|
|
1463
|
+
alertId,
|
|
1464
|
+
]);
|
|
1465
|
+
},
|
|
1466
|
+
// Positions
|
|
1467
|
+
getPositions(userId) {
|
|
1468
|
+
return getAll('SELECT id, user_id, platform, market_id, market_question, outcome, outcome_id, side, shares, avg_price, current_price, opened_at, updated_at FROM positions WHERE user_id = ?', [userId]).map(parsePosition);
|
|
1469
|
+
},
|
|
1470
|
+
listPositionsForPricing() {
|
|
1471
|
+
return getAll('SELECT id, user_id, platform, market_id, outcome_id, outcome FROM positions').map((row) => ({
|
|
1472
|
+
id: row.id,
|
|
1473
|
+
userId: row.user_id,
|
|
1474
|
+
platform: row.platform,
|
|
1475
|
+
marketId: row.market_id,
|
|
1476
|
+
outcomeId: row.outcome_id,
|
|
1477
|
+
outcome: row.outcome,
|
|
1478
|
+
}));
|
|
1479
|
+
},
|
|
1480
|
+
updatePositionPrice(positionId, currentPrice) {
|
|
1481
|
+
run('UPDATE positions SET current_price = ?, updated_at = ? WHERE id = ?', [currentPrice, Date.now(), positionId]);
|
|
1482
|
+
},
|
|
1483
|
+
upsertPosition(userId, position) {
|
|
1484
|
+
run(`INSERT INTO positions (id, user_id, platform, market_id, market_question, outcome, outcome_id, side, shares, avg_price, current_price, opened_at, updated_at)
|
|
1485
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1486
|
+
ON CONFLICT(user_id, platform, market_id, outcome_id) DO UPDATE SET
|
|
1487
|
+
shares = excluded.shares,
|
|
1488
|
+
avg_price = excluded.avg_price,
|
|
1489
|
+
current_price = excluded.current_price,
|
|
1490
|
+
updated_at = excluded.updated_at`, [
|
|
1491
|
+
position.id,
|
|
1492
|
+
userId,
|
|
1493
|
+
position.platform,
|
|
1494
|
+
position.marketId,
|
|
1495
|
+
position.marketQuestion,
|
|
1496
|
+
position.outcome,
|
|
1497
|
+
position.outcomeId,
|
|
1498
|
+
position.side,
|
|
1499
|
+
position.shares,
|
|
1500
|
+
position.avgPrice,
|
|
1501
|
+
position.currentPrice,
|
|
1502
|
+
position.openedAt.getTime(),
|
|
1503
|
+
Date.now(),
|
|
1504
|
+
]);
|
|
1505
|
+
},
|
|
1506
|
+
deletePosition(positionId) {
|
|
1507
|
+
run('DELETE FROM positions WHERE id = ?', [positionId]);
|
|
1508
|
+
},
|
|
1509
|
+
// Portfolio snapshots
|
|
1510
|
+
createPortfolioSnapshot(snapshot) {
|
|
1511
|
+
const createdAt = snapshot.createdAt?.getTime() ?? Date.now();
|
|
1512
|
+
run(`INSERT INTO portfolio_snapshots (user_id, total_value, total_pnl, total_pnl_pct, total_cost_basis, positions_count, by_platform, created_at)
|
|
1513
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
1514
|
+
snapshot.userId,
|
|
1515
|
+
snapshot.totalValue,
|
|
1516
|
+
snapshot.totalPnl,
|
|
1517
|
+
snapshot.totalPnlPct,
|
|
1518
|
+
snapshot.totalCostBasis,
|
|
1519
|
+
snapshot.positionsCount,
|
|
1520
|
+
snapshot.byPlatform ? JSON.stringify(snapshot.byPlatform) : null,
|
|
1521
|
+
createdAt,
|
|
1522
|
+
]);
|
|
1523
|
+
},
|
|
1524
|
+
getPortfolioSnapshots(userId, options = {}) {
|
|
1525
|
+
const sinceMs = options.sinceMs ?? 0;
|
|
1526
|
+
const limit = options.limit ?? 200;
|
|
1527
|
+
const order = options.order === 'asc' ? 'ASC' : 'DESC';
|
|
1528
|
+
const rows = getAll(`SELECT user_id, total_value, total_pnl, total_pnl_pct, total_cost_basis, positions_count, by_platform, created_at
|
|
1529
|
+
FROM portfolio_snapshots
|
|
1530
|
+
WHERE user_id = ? AND created_at >= ?
|
|
1531
|
+
ORDER BY created_at ${order}
|
|
1532
|
+
LIMIT ?`, [userId, sinceMs, limit]);
|
|
1533
|
+
return rows.map(parsePortfolioSnapshot);
|
|
1534
|
+
},
|
|
1535
|
+
deletePortfolioSnapshotsBefore(cutoffMs) {
|
|
1536
|
+
run('DELETE FROM portfolio_snapshots WHERE created_at < ?', [cutoffMs]);
|
|
1537
|
+
},
|
|
1538
|
+
// Stop-loss triggers
|
|
1539
|
+
getStopLossTrigger(userId, platform, outcomeId) {
|
|
1540
|
+
const row = getOne('SELECT user_id, platform, outcome_id, market_id, status, triggered_at, last_price, last_error, cooldown_until FROM stop_loss_triggers WHERE user_id = ? AND platform = ? AND outcome_id = ?', [userId, platform, outcomeId]);
|
|
1541
|
+
if (!row)
|
|
1542
|
+
return undefined;
|
|
1543
|
+
return {
|
|
1544
|
+
userId: row.user_id,
|
|
1545
|
+
platform: row.platform,
|
|
1546
|
+
outcomeId: row.outcome_id,
|
|
1547
|
+
marketId: row.market_id,
|
|
1548
|
+
status: row.status,
|
|
1549
|
+
triggeredAt: new Date(row.triggered_at),
|
|
1550
|
+
lastPrice: row.last_price ?? undefined,
|
|
1551
|
+
lastError: row.last_error ?? undefined,
|
|
1552
|
+
cooldownUntil: row.cooldown_until ? new Date(row.cooldown_until) : undefined,
|
|
1553
|
+
};
|
|
1554
|
+
},
|
|
1555
|
+
upsertStopLossTrigger(record) {
|
|
1556
|
+
run(`
|
|
1557
|
+
INSERT INTO stop_loss_triggers (user_id, platform, outcome_id, market_id, status, triggered_at, last_price, last_error, cooldown_until)
|
|
1558
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1559
|
+
ON CONFLICT(user_id, platform, outcome_id) DO UPDATE SET
|
|
1560
|
+
market_id = excluded.market_id,
|
|
1561
|
+
status = excluded.status,
|
|
1562
|
+
triggered_at = excluded.triggered_at,
|
|
1563
|
+
last_price = excluded.last_price,
|
|
1564
|
+
last_error = excluded.last_error,
|
|
1565
|
+
cooldown_until = excluded.cooldown_until
|
|
1566
|
+
`, [
|
|
1567
|
+
record.userId,
|
|
1568
|
+
record.platform,
|
|
1569
|
+
record.outcomeId,
|
|
1570
|
+
record.marketId ?? null,
|
|
1571
|
+
record.status,
|
|
1572
|
+
record.triggeredAt.getTime(),
|
|
1573
|
+
record.lastPrice ?? null,
|
|
1574
|
+
record.lastError ?? null,
|
|
1575
|
+
record.cooldownUntil ? record.cooldownUntil.getTime() : null,
|
|
1576
|
+
]);
|
|
1577
|
+
},
|
|
1578
|
+
deleteStopLossTrigger(userId, platform, outcomeId) {
|
|
1579
|
+
run('DELETE FROM stop_loss_triggers WHERE user_id = ? AND platform = ? AND outcome_id = ?', [
|
|
1580
|
+
userId,
|
|
1581
|
+
platform,
|
|
1582
|
+
outcomeId,
|
|
1583
|
+
]);
|
|
1584
|
+
},
|
|
1585
|
+
// Markets cache
|
|
1586
|
+
cacheMarket(market) {
|
|
1587
|
+
run('INSERT OR REPLACE INTO markets (platform, market_id, data, updated_at) VALUES (?, ?, ?, ?)', [
|
|
1588
|
+
market.platform,
|
|
1589
|
+
market.id,
|
|
1590
|
+
JSON.stringify(market),
|
|
1591
|
+
Date.now(),
|
|
1592
|
+
]);
|
|
1593
|
+
},
|
|
1594
|
+
getCachedMarket(platform, marketId, maxAgeMs) {
|
|
1595
|
+
const row = getOne('SELECT data, updated_at FROM markets WHERE platform = ? AND market_id = ?', [platform, marketId]);
|
|
1596
|
+
if (!row)
|
|
1597
|
+
return undefined;
|
|
1598
|
+
if (maxAgeMs && row.updated_at < Date.now() - maxAgeMs) {
|
|
1599
|
+
run('DELETE FROM markets WHERE platform = ? AND market_id = ?', [platform, marketId]);
|
|
1600
|
+
return undefined;
|
|
1601
|
+
}
|
|
1602
|
+
return JSON.parse(row.data);
|
|
1603
|
+
},
|
|
1604
|
+
pruneMarketCache(cutoffMs) {
|
|
1605
|
+
const rows = getAll('SELECT COUNT(*) as count FROM markets WHERE updated_at < ?', [cutoffMs]);
|
|
1606
|
+
const count = rows[0]?.count ?? 0;
|
|
1607
|
+
if (count > 0) {
|
|
1608
|
+
run('DELETE FROM markets WHERE updated_at < ?', [cutoffMs]);
|
|
1609
|
+
}
|
|
1610
|
+
return count;
|
|
1611
|
+
},
|
|
1612
|
+
// Market index
|
|
1613
|
+
upsertMarketIndex(entry) {
|
|
1614
|
+
run(`INSERT OR REPLACE INTO market_index (
|
|
1615
|
+
platform, market_id, slug, question, description, outcomes_json, tags_json,
|
|
1616
|
+
status, url, end_date, resolved, volume_24h, liquidity, open_interest, predictions,
|
|
1617
|
+
content_hash, updated_at, raw_json
|
|
1618
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
1619
|
+
entry.platform,
|
|
1620
|
+
entry.marketId,
|
|
1621
|
+
entry.slug || null,
|
|
1622
|
+
entry.question,
|
|
1623
|
+
entry.description || null,
|
|
1624
|
+
entry.outcomesJson || null,
|
|
1625
|
+
entry.tagsJson || null,
|
|
1626
|
+
entry.status || null,
|
|
1627
|
+
entry.url || null,
|
|
1628
|
+
entry.endDate ? entry.endDate.getTime() : null,
|
|
1629
|
+
entry.resolved ? 1 : 0,
|
|
1630
|
+
entry.volume24h ?? null,
|
|
1631
|
+
entry.liquidity ?? null,
|
|
1632
|
+
entry.openInterest ?? null,
|
|
1633
|
+
entry.predictions ?? null,
|
|
1634
|
+
entry.contentHash || null,
|
|
1635
|
+
entry.updatedAt.getTime(),
|
|
1636
|
+
entry.rawJson || null,
|
|
1637
|
+
]);
|
|
1638
|
+
},
|
|
1639
|
+
getMarketIndexHash(platform, marketId) {
|
|
1640
|
+
const row = getOne('SELECT content_hash FROM market_index WHERE platform = ? AND market_id = ?', [platform, marketId]);
|
|
1641
|
+
return row?.content_hash ?? null;
|
|
1642
|
+
},
|
|
1643
|
+
getMarketIndexEmbedding(platform, marketId) {
|
|
1644
|
+
const row = getOne('SELECT content_hash, vector FROM market_index_embeddings WHERE platform = ? AND market_id = ?', [platform, marketId]);
|
|
1645
|
+
if (!row)
|
|
1646
|
+
return null;
|
|
1647
|
+
try {
|
|
1648
|
+
const vector = JSON.parse(row.vector);
|
|
1649
|
+
return { contentHash: row.content_hash, vector };
|
|
1650
|
+
}
|
|
1651
|
+
catch {
|
|
1652
|
+
return null;
|
|
1653
|
+
}
|
|
1654
|
+
},
|
|
1655
|
+
upsertMarketIndexEmbedding(platform, marketId, contentHash, vector) {
|
|
1656
|
+
run(`INSERT OR REPLACE INTO market_index_embeddings (
|
|
1657
|
+
platform, market_id, content_hash, vector, updated_at
|
|
1658
|
+
) VALUES (?, ?, ?, ?, ?)`, [
|
|
1659
|
+
platform,
|
|
1660
|
+
marketId,
|
|
1661
|
+
contentHash,
|
|
1662
|
+
JSON.stringify(vector),
|
|
1663
|
+
Date.now(),
|
|
1664
|
+
]);
|
|
1665
|
+
},
|
|
1666
|
+
listMarketIndex(options = {}) {
|
|
1667
|
+
const params = [];
|
|
1668
|
+
const where = [];
|
|
1669
|
+
if (options.platform) {
|
|
1670
|
+
where.push('platform = ?');
|
|
1671
|
+
params.push(options.platform);
|
|
1672
|
+
}
|
|
1673
|
+
if (options.textQuery) {
|
|
1674
|
+
where.push('(question LIKE ? OR description LIKE ? OR tags_json LIKE ?)');
|
|
1675
|
+
const like = `%${options.textQuery}%`;
|
|
1676
|
+
params.push(like, like, like);
|
|
1677
|
+
}
|
|
1678
|
+
let sql = 'SELECT * FROM market_index';
|
|
1679
|
+
if (where.length > 0) {
|
|
1680
|
+
sql += ` WHERE ${where.join(' AND ')}`;
|
|
1681
|
+
}
|
|
1682
|
+
sql += ' ORDER BY updated_at DESC';
|
|
1683
|
+
if (options.limit) {
|
|
1684
|
+
sql += ' LIMIT ?';
|
|
1685
|
+
params.push(options.limit);
|
|
1686
|
+
}
|
|
1687
|
+
const rows = getAll(sql, params);
|
|
1688
|
+
return rows.map((row) => ({
|
|
1689
|
+
platform: row.platform,
|
|
1690
|
+
marketId: row.market_id,
|
|
1691
|
+
slug: row.slug ?? undefined,
|
|
1692
|
+
question: row.question,
|
|
1693
|
+
description: row.description ?? undefined,
|
|
1694
|
+
outcomesJson: row.outcomes_json ?? undefined,
|
|
1695
|
+
tagsJson: row.tags_json ?? undefined,
|
|
1696
|
+
status: row.status ?? undefined,
|
|
1697
|
+
url: row.url ?? undefined,
|
|
1698
|
+
endDate: row.end_date ? new Date(row.end_date) : undefined,
|
|
1699
|
+
resolved: Boolean(row.resolved),
|
|
1700
|
+
volume24h: row.volume_24h ?? undefined,
|
|
1701
|
+
liquidity: row.liquidity ?? undefined,
|
|
1702
|
+
openInterest: row.open_interest ?? undefined,
|
|
1703
|
+
predictions: row.predictions ?? undefined,
|
|
1704
|
+
contentHash: row.content_hash ?? undefined,
|
|
1705
|
+
updatedAt: new Date(row.updated_at),
|
|
1706
|
+
rawJson: row.raw_json ?? undefined,
|
|
1707
|
+
}));
|
|
1708
|
+
},
|
|
1709
|
+
countMarketIndex(platform) {
|
|
1710
|
+
if (platform) {
|
|
1711
|
+
const rows = getAll('SELECT COUNT(*) as count FROM market_index WHERE platform = ?', [platform]);
|
|
1712
|
+
return rows[0]?.count ?? 0;
|
|
1713
|
+
}
|
|
1714
|
+
const rows = getAll('SELECT COUNT(*) as count FROM market_index');
|
|
1715
|
+
return rows[0]?.count ?? 0;
|
|
1716
|
+
},
|
|
1717
|
+
pruneMarketIndex(cutoffMs, platform) {
|
|
1718
|
+
if (platform) {
|
|
1719
|
+
const rows = getAll('SELECT COUNT(*) as count FROM market_index WHERE platform = ? AND updated_at < ?', [platform, cutoffMs]);
|
|
1720
|
+
const count = rows[0]?.count ?? 0;
|
|
1721
|
+
if (count > 0) {
|
|
1722
|
+
run('DELETE FROM market_index WHERE platform = ? AND updated_at < ?', [platform, cutoffMs]);
|
|
1723
|
+
run('DELETE FROM market_index_embeddings WHERE platform = ? AND updated_at < ?', [platform, cutoffMs]);
|
|
1724
|
+
}
|
|
1725
|
+
return count;
|
|
1726
|
+
}
|
|
1727
|
+
const rows = getAll('SELECT COUNT(*) as count FROM market_index WHERE updated_at < ?', [cutoffMs]);
|
|
1728
|
+
const count = rows[0]?.count ?? 0;
|
|
1729
|
+
if (count > 0) {
|
|
1730
|
+
run('DELETE FROM market_index WHERE updated_at < ?', [cutoffMs]);
|
|
1731
|
+
run('DELETE FROM market_index_embeddings WHERE updated_at < ?', [cutoffMs]);
|
|
1732
|
+
}
|
|
1733
|
+
return count;
|
|
1734
|
+
},
|
|
1735
|
+
// Trading Credentials
|
|
1736
|
+
getTradingCredentials(userId, platform) {
|
|
1737
|
+
return parseTradingCredentials(getOne('SELECT user_id, platform, mode, encrypted_data, enabled, last_used_at, failed_attempts, cooldown_until, created_at, updated_at FROM trading_credentials WHERE user_id = ? AND platform = ?', [userId, platform]));
|
|
1738
|
+
},
|
|
1739
|
+
createTradingCredentials(creds) {
|
|
1740
|
+
run('INSERT INTO trading_credentials (user_id, platform, mode, encrypted_data, enabled, last_used_at, failed_attempts, cooldown_until, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [
|
|
1741
|
+
creds.userId,
|
|
1742
|
+
creds.platform,
|
|
1743
|
+
creds.mode,
|
|
1744
|
+
creds.encryptedData,
|
|
1745
|
+
creds.enabled ? 1 : 0,
|
|
1746
|
+
creds.lastUsedAt?.getTime() || null,
|
|
1747
|
+
creds.failedAttempts,
|
|
1748
|
+
creds.cooldownUntil?.getTime() || null,
|
|
1749
|
+
creds.createdAt.getTime(),
|
|
1750
|
+
creds.updatedAt.getTime(),
|
|
1751
|
+
]);
|
|
1752
|
+
},
|
|
1753
|
+
updateTradingCredentials(creds) {
|
|
1754
|
+
run('UPDATE trading_credentials SET encrypted_data = ?, enabled = ?, last_used_at = ?, failed_attempts = ?, cooldown_until = ?, updated_at = ? WHERE user_id = ? AND platform = ?', [
|
|
1755
|
+
creds.encryptedData,
|
|
1756
|
+
creds.enabled ? 1 : 0,
|
|
1757
|
+
creds.lastUsedAt?.getTime() || null,
|
|
1758
|
+
creds.failedAttempts,
|
|
1759
|
+
creds.cooldownUntil?.getTime() || null,
|
|
1760
|
+
creds.updatedAt.getTime(),
|
|
1761
|
+
creds.userId,
|
|
1762
|
+
creds.platform,
|
|
1763
|
+
]);
|
|
1764
|
+
},
|
|
1765
|
+
deleteTradingCredentials(userId, platform) {
|
|
1766
|
+
run('DELETE FROM trading_credentials WHERE user_id = ? AND platform = ?', [userId, platform]);
|
|
1767
|
+
},
|
|
1768
|
+
listUserTradingPlatforms(userId) {
|
|
1769
|
+
const rows = getAll('SELECT platform FROM trading_credentials WHERE user_id = ? AND enabled = 1', [userId]);
|
|
1770
|
+
return rows.map((r) => r.platform);
|
|
1771
|
+
},
|
|
1772
|
+
// Hyperliquid trades
|
|
1773
|
+
logHyperliquidTrade(trade) {
|
|
1774
|
+
run(`INSERT INTO hyperliquid_trades (
|
|
1775
|
+
user_id, trade_id, order_id, coin, side, direction, size, price,
|
|
1776
|
+
fee, fee_token, closed_pnl, order_type, is_maker, leverage, timestamp, created_at
|
|
1777
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
1778
|
+
trade.userId,
|
|
1779
|
+
trade.tradeId || null,
|
|
1780
|
+
trade.orderId || null,
|
|
1781
|
+
trade.coin,
|
|
1782
|
+
trade.side,
|
|
1783
|
+
trade.direction || null,
|
|
1784
|
+
trade.size,
|
|
1785
|
+
trade.price,
|
|
1786
|
+
trade.fee || 0,
|
|
1787
|
+
trade.feeToken || 'USDC',
|
|
1788
|
+
trade.closedPnl || null,
|
|
1789
|
+
trade.orderType || null,
|
|
1790
|
+
trade.isMaker ? 1 : 0,
|
|
1791
|
+
trade.leverage || null,
|
|
1792
|
+
trade.timestamp.getTime(),
|
|
1793
|
+
Date.now(),
|
|
1794
|
+
]);
|
|
1795
|
+
},
|
|
1796
|
+
getHyperliquidTrades(userId, options = {}) {
|
|
1797
|
+
const params = [userId];
|
|
1798
|
+
let sql = 'SELECT * FROM hyperliquid_trades WHERE user_id = ?';
|
|
1799
|
+
if (options.coin) {
|
|
1800
|
+
sql += ' AND coin = ?';
|
|
1801
|
+
params.push(options.coin);
|
|
1802
|
+
}
|
|
1803
|
+
if (options.since) {
|
|
1804
|
+
sql += ' AND timestamp >= ?';
|
|
1805
|
+
params.push(options.since);
|
|
1806
|
+
}
|
|
1807
|
+
sql += ' ORDER BY timestamp DESC';
|
|
1808
|
+
if (options.limit) {
|
|
1809
|
+
sql += ' LIMIT ?';
|
|
1810
|
+
params.push(options.limit);
|
|
1811
|
+
}
|
|
1812
|
+
const rows = getAll(sql, params);
|
|
1813
|
+
return rows.map((row) => ({
|
|
1814
|
+
id: row.id,
|
|
1815
|
+
userId: row.user_id,
|
|
1816
|
+
tradeId: row.trade_id,
|
|
1817
|
+
orderId: row.order_id,
|
|
1818
|
+
coin: row.coin,
|
|
1819
|
+
side: row.side,
|
|
1820
|
+
direction: row.direction,
|
|
1821
|
+
size: row.size,
|
|
1822
|
+
price: row.price,
|
|
1823
|
+
fee: row.fee,
|
|
1824
|
+
feeToken: row.fee_token,
|
|
1825
|
+
closedPnl: row.closed_pnl,
|
|
1826
|
+
orderType: row.order_type,
|
|
1827
|
+
isMaker: Boolean(row.is_maker),
|
|
1828
|
+
leverage: row.leverage,
|
|
1829
|
+
timestamp: new Date(row.timestamp),
|
|
1830
|
+
createdAt: new Date(row.created_at),
|
|
1831
|
+
}));
|
|
1832
|
+
},
|
|
1833
|
+
getHyperliquidStats(userId, options = {}) {
|
|
1834
|
+
const params = [userId];
|
|
1835
|
+
let whereClause = 'WHERE user_id = ?';
|
|
1836
|
+
if (options.coin) {
|
|
1837
|
+
whereClause += ' AND coin = ?';
|
|
1838
|
+
params.push(options.coin);
|
|
1839
|
+
}
|
|
1840
|
+
if (options.since) {
|
|
1841
|
+
whereClause += ' AND timestamp >= ?';
|
|
1842
|
+
params.push(options.since);
|
|
1843
|
+
}
|
|
1844
|
+
// Get aggregate stats
|
|
1845
|
+
const statsRow = getOne(`SELECT
|
|
1846
|
+
COUNT(*) as total_trades,
|
|
1847
|
+
COALESCE(SUM(size * price), 0) as total_volume,
|
|
1848
|
+
COALESCE(SUM(fee), 0) as total_fees,
|
|
1849
|
+
COALESCE(SUM(closed_pnl), 0) as total_pnl,
|
|
1850
|
+
COALESCE(SUM(CASE WHEN closed_pnl > 0 THEN 1 ELSE 0 END), 0) as win_count,
|
|
1851
|
+
COALESCE(SUM(CASE WHEN closed_pnl < 0 THEN 1 ELSE 0 END), 0) as loss_count,
|
|
1852
|
+
COALESCE(AVG(CASE WHEN closed_pnl > 0 THEN closed_pnl END), 0) as avg_win,
|
|
1853
|
+
COALESCE(AVG(CASE WHEN closed_pnl < 0 THEN closed_pnl END), 0) as avg_loss,
|
|
1854
|
+
COALESCE(MAX(closed_pnl), 0) as largest_win,
|
|
1855
|
+
COALESCE(MIN(closed_pnl), 0) as largest_loss
|
|
1856
|
+
FROM hyperliquid_trades ${whereClause}`, params);
|
|
1857
|
+
// Get stats by coin
|
|
1858
|
+
const coinRows = getAll(`SELECT
|
|
1859
|
+
coin,
|
|
1860
|
+
COUNT(*) as trades,
|
|
1861
|
+
COALESCE(SUM(size * price), 0) as volume,
|
|
1862
|
+
COALESCE(SUM(closed_pnl), 0) as pnl,
|
|
1863
|
+
COALESCE(SUM(fee), 0) as fees
|
|
1864
|
+
FROM hyperliquid_trades ${whereClause}
|
|
1865
|
+
GROUP BY coin`, params);
|
|
1866
|
+
const byCoin = {};
|
|
1867
|
+
for (const row of coinRows) {
|
|
1868
|
+
byCoin[row.coin] = {
|
|
1869
|
+
trades: row.trades,
|
|
1870
|
+
volume: row.volume,
|
|
1871
|
+
pnl: row.pnl,
|
|
1872
|
+
fees: row.fees,
|
|
1873
|
+
};
|
|
1874
|
+
}
|
|
1875
|
+
const totalWins = statsRow?.avg_win ? statsRow.avg_win * (statsRow?.win_count || 0) : 0;
|
|
1876
|
+
const totalLosses = statsRow?.avg_loss ? Math.abs(statsRow.avg_loss) * (statsRow?.loss_count || 0) : 0;
|
|
1877
|
+
const profitFactor = totalLosses > 0 ? totalWins / totalLosses : totalWins > 0 ? Infinity : 0;
|
|
1878
|
+
return {
|
|
1879
|
+
totalTrades: statsRow?.total_trades || 0,
|
|
1880
|
+
totalVolume: statsRow?.total_volume || 0,
|
|
1881
|
+
totalFees: statsRow?.total_fees || 0,
|
|
1882
|
+
totalPnl: statsRow?.total_pnl || 0,
|
|
1883
|
+
winCount: statsRow?.win_count || 0,
|
|
1884
|
+
lossCount: statsRow?.loss_count || 0,
|
|
1885
|
+
winRate: statsRow?.total_trades ? ((statsRow?.win_count || 0) / statsRow.total_trades) * 100 : 0,
|
|
1886
|
+
avgWin: statsRow?.avg_win || 0,
|
|
1887
|
+
avgLoss: statsRow?.avg_loss || 0,
|
|
1888
|
+
largestWin: statsRow?.largest_win || 0,
|
|
1889
|
+
largestLoss: statsRow?.largest_loss || 0,
|
|
1890
|
+
profitFactor,
|
|
1891
|
+
byCoin,
|
|
1892
|
+
};
|
|
1893
|
+
},
|
|
1894
|
+
// Hyperliquid positions
|
|
1895
|
+
upsertHyperliquidPosition(userId, position) {
|
|
1896
|
+
run(`INSERT INTO hyperliquid_positions (
|
|
1897
|
+
user_id, coin, side, size, entry_price, mark_price, liquidation_price,
|
|
1898
|
+
unrealized_pnl, realized_pnl, leverage, margin_used, opened_at, created_at, updated_at
|
|
1899
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1900
|
+
ON CONFLICT(user_id, coin) WHERE closed_at IS NULL DO UPDATE SET
|
|
1901
|
+
size = excluded.size,
|
|
1902
|
+
entry_price = excluded.entry_price,
|
|
1903
|
+
mark_price = excluded.mark_price,
|
|
1904
|
+
liquidation_price = excluded.liquidation_price,
|
|
1905
|
+
unrealized_pnl = excluded.unrealized_pnl,
|
|
1906
|
+
realized_pnl = excluded.realized_pnl,
|
|
1907
|
+
leverage = excluded.leverage,
|
|
1908
|
+
margin_used = excluded.margin_used,
|
|
1909
|
+
updated_at = excluded.updated_at`, [
|
|
1910
|
+
userId,
|
|
1911
|
+
position.coin,
|
|
1912
|
+
position.side,
|
|
1913
|
+
position.size,
|
|
1914
|
+
position.entryPrice,
|
|
1915
|
+
position.markPrice || null,
|
|
1916
|
+
position.liquidationPrice || null,
|
|
1917
|
+
position.unrealizedPnl || null,
|
|
1918
|
+
position.realizedPnl || 0,
|
|
1919
|
+
position.leverage || null,
|
|
1920
|
+
position.marginUsed || null,
|
|
1921
|
+
position.openedAt.getTime(),
|
|
1922
|
+
Date.now(),
|
|
1923
|
+
Date.now(),
|
|
1924
|
+
]);
|
|
1925
|
+
},
|
|
1926
|
+
getHyperliquidPositions(userId, options = {}) {
|
|
1927
|
+
const params = [userId];
|
|
1928
|
+
let sql = 'SELECT * FROM hyperliquid_positions WHERE user_id = ?';
|
|
1929
|
+
if (options.coin) {
|
|
1930
|
+
sql += ' AND coin = ?';
|
|
1931
|
+
params.push(options.coin);
|
|
1932
|
+
}
|
|
1933
|
+
if (options.openOnly) {
|
|
1934
|
+
sql += ' AND closed_at IS NULL';
|
|
1935
|
+
}
|
|
1936
|
+
sql += ' ORDER BY opened_at DESC';
|
|
1937
|
+
const rows = getAll(sql, params);
|
|
1938
|
+
return rows.map((row) => ({
|
|
1939
|
+
id: row.id,
|
|
1940
|
+
userId: row.user_id,
|
|
1941
|
+
coin: row.coin,
|
|
1942
|
+
side: row.side,
|
|
1943
|
+
size: row.size,
|
|
1944
|
+
entryPrice: row.entry_price,
|
|
1945
|
+
markPrice: row.mark_price,
|
|
1946
|
+
liquidationPrice: row.liquidation_price,
|
|
1947
|
+
unrealizedPnl: row.unrealized_pnl,
|
|
1948
|
+
realizedPnl: row.realized_pnl,
|
|
1949
|
+
leverage: row.leverage,
|
|
1950
|
+
marginUsed: row.margin_used,
|
|
1951
|
+
openedAt: new Date(row.opened_at),
|
|
1952
|
+
closedAt: row.closed_at ? new Date(row.closed_at) : undefined,
|
|
1953
|
+
closePrice: row.close_price,
|
|
1954
|
+
closeReason: row.close_reason,
|
|
1955
|
+
createdAt: new Date(row.created_at),
|
|
1956
|
+
updatedAt: new Date(row.updated_at),
|
|
1957
|
+
}));
|
|
1958
|
+
},
|
|
1959
|
+
closeHyperliquidPosition(userId, coin, closePrice, reason) {
|
|
1960
|
+
run(`UPDATE hyperliquid_positions
|
|
1961
|
+
SET closed_at = ?, close_price = ?, close_reason = ?, updated_at = ?
|
|
1962
|
+
WHERE user_id = ? AND coin = ? AND closed_at IS NULL`, [Date.now(), closePrice, reason || 'manual', Date.now(), userId, coin]);
|
|
1963
|
+
},
|
|
1964
|
+
// Hyperliquid funding
|
|
1965
|
+
logHyperliquidFunding(funding) {
|
|
1966
|
+
run(`INSERT INTO hyperliquid_funding (
|
|
1967
|
+
user_id, coin, funding_rate, payment, position_size, timestamp, created_at
|
|
1968
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
|
1969
|
+
funding.userId,
|
|
1970
|
+
funding.coin,
|
|
1971
|
+
funding.fundingRate,
|
|
1972
|
+
funding.payment,
|
|
1973
|
+
funding.positionSize,
|
|
1974
|
+
funding.timestamp.getTime(),
|
|
1975
|
+
Date.now(),
|
|
1976
|
+
]);
|
|
1977
|
+
},
|
|
1978
|
+
getHyperliquidFunding(userId, options = {}) {
|
|
1979
|
+
const params = [userId];
|
|
1980
|
+
let sql = 'SELECT * FROM hyperliquid_funding WHERE user_id = ?';
|
|
1981
|
+
if (options.coin) {
|
|
1982
|
+
sql += ' AND coin = ?';
|
|
1983
|
+
params.push(options.coin);
|
|
1984
|
+
}
|
|
1985
|
+
if (options.since) {
|
|
1986
|
+
sql += ' AND timestamp >= ?';
|
|
1987
|
+
params.push(options.since);
|
|
1988
|
+
}
|
|
1989
|
+
sql += ' ORDER BY timestamp DESC';
|
|
1990
|
+
if (options.limit) {
|
|
1991
|
+
sql += ' LIMIT ?';
|
|
1992
|
+
params.push(options.limit);
|
|
1993
|
+
}
|
|
1994
|
+
const rows = getAll(sql, params);
|
|
1995
|
+
return rows.map((row) => ({
|
|
1996
|
+
id: row.id,
|
|
1997
|
+
userId: row.user_id,
|
|
1998
|
+
coin: row.coin,
|
|
1999
|
+
fundingRate: row.funding_rate,
|
|
2000
|
+
payment: row.payment,
|
|
2001
|
+
positionSize: row.position_size,
|
|
2002
|
+
timestamp: new Date(row.timestamp),
|
|
2003
|
+
createdAt: new Date(row.created_at),
|
|
2004
|
+
}));
|
|
2005
|
+
},
|
|
2006
|
+
getHyperliquidFundingTotal(userId, options = {}) {
|
|
2007
|
+
const params = [userId];
|
|
2008
|
+
let whereClause = 'WHERE user_id = ?';
|
|
2009
|
+
if (options.coin) {
|
|
2010
|
+
whereClause += ' AND coin = ?';
|
|
2011
|
+
params.push(options.coin);
|
|
2012
|
+
}
|
|
2013
|
+
if (options.since) {
|
|
2014
|
+
whereClause += ' AND timestamp >= ?';
|
|
2015
|
+
params.push(options.since);
|
|
2016
|
+
}
|
|
2017
|
+
const row = getOne(`SELECT COALESCE(SUM(payment), 0) as total FROM hyperliquid_funding ${whereClause}`, params);
|
|
2018
|
+
return row?.total || 0;
|
|
2019
|
+
},
|
|
2020
|
+
// =========================================================================
|
|
2021
|
+
// BINANCE FUTURES
|
|
2022
|
+
// =========================================================================
|
|
2023
|
+
logBinanceFuturesTrade(trade) {
|
|
2024
|
+
run(`INSERT INTO binance_futures_trades (
|
|
2025
|
+
user_id, trade_id, order_id, symbol, side, position_side, size, price,
|
|
2026
|
+
commission, commission_asset, realized_pnl, order_type, is_maker, leverage, timestamp, created_at
|
|
2027
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
2028
|
+
trade.userId,
|
|
2029
|
+
trade.tradeId || null,
|
|
2030
|
+
trade.orderId || null,
|
|
2031
|
+
trade.symbol,
|
|
2032
|
+
trade.side,
|
|
2033
|
+
trade.positionSide || null,
|
|
2034
|
+
trade.size,
|
|
2035
|
+
trade.price,
|
|
2036
|
+
trade.commission || 0,
|
|
2037
|
+
trade.commissionAsset || 'USDT',
|
|
2038
|
+
trade.realizedPnl || null,
|
|
2039
|
+
trade.orderType || null,
|
|
2040
|
+
trade.isMaker ? 1 : 0,
|
|
2041
|
+
trade.leverage || null,
|
|
2042
|
+
trade.timestamp.getTime(),
|
|
2043
|
+
Date.now(),
|
|
2044
|
+
]);
|
|
2045
|
+
},
|
|
2046
|
+
getBinanceFuturesTrades(userId, options = {}) {
|
|
2047
|
+
const params = [userId];
|
|
2048
|
+
let sql = 'SELECT * FROM binance_futures_trades WHERE user_id = ?';
|
|
2049
|
+
if (options.symbol) {
|
|
2050
|
+
sql += ' AND symbol = ?';
|
|
2051
|
+
params.push(options.symbol);
|
|
2052
|
+
}
|
|
2053
|
+
if (options.since) {
|
|
2054
|
+
sql += ' AND timestamp >= ?';
|
|
2055
|
+
params.push(options.since);
|
|
2056
|
+
}
|
|
2057
|
+
sql += ' ORDER BY timestamp DESC';
|
|
2058
|
+
if (options.limit) {
|
|
2059
|
+
sql += ' LIMIT ?';
|
|
2060
|
+
params.push(options.limit);
|
|
2061
|
+
}
|
|
2062
|
+
const rows = getAll(sql, params);
|
|
2063
|
+
return rows.map((row) => ({
|
|
2064
|
+
id: row.id,
|
|
2065
|
+
userId: row.user_id,
|
|
2066
|
+
tradeId: row.trade_id,
|
|
2067
|
+
orderId: row.order_id,
|
|
2068
|
+
symbol: row.symbol,
|
|
2069
|
+
side: row.side,
|
|
2070
|
+
positionSide: row.position_side,
|
|
2071
|
+
size: row.size,
|
|
2072
|
+
price: row.price,
|
|
2073
|
+
commission: row.commission,
|
|
2074
|
+
commissionAsset: row.commission_asset,
|
|
2075
|
+
realizedPnl: row.realized_pnl,
|
|
2076
|
+
orderType: row.order_type,
|
|
2077
|
+
isMaker: row.is_maker === 1,
|
|
2078
|
+
leverage: row.leverage,
|
|
2079
|
+
timestamp: new Date(row.timestamp),
|
|
2080
|
+
createdAt: row.created_at ? new Date(row.created_at) : undefined,
|
|
2081
|
+
}));
|
|
2082
|
+
},
|
|
2083
|
+
getBinanceFuturesStats(userId, options = {}) {
|
|
2084
|
+
const params = [userId];
|
|
2085
|
+
let whereClause = 'WHERE user_id = ?';
|
|
2086
|
+
if (options.symbol) {
|
|
2087
|
+
whereClause += ' AND symbol = ?';
|
|
2088
|
+
params.push(options.symbol);
|
|
2089
|
+
}
|
|
2090
|
+
if (options.since) {
|
|
2091
|
+
whereClause += ' AND timestamp >= ?';
|
|
2092
|
+
params.push(options.since);
|
|
2093
|
+
}
|
|
2094
|
+
const statsRow = getOne(`SELECT
|
|
2095
|
+
COUNT(*) as total_trades,
|
|
2096
|
+
COALESCE(SUM(size * price), 0) as total_volume,
|
|
2097
|
+
COALESCE(SUM(commission), 0) as total_fees,
|
|
2098
|
+
COALESCE(SUM(realized_pnl), 0) as total_pnl,
|
|
2099
|
+
COUNT(CASE WHEN realized_pnl > 0 THEN 1 END) as win_count,
|
|
2100
|
+
COUNT(CASE WHEN realized_pnl < 0 THEN 1 END) as loss_count,
|
|
2101
|
+
COALESCE(AVG(CASE WHEN realized_pnl > 0 THEN realized_pnl END), 0) as avg_win,
|
|
2102
|
+
COALESCE(AVG(CASE WHEN realized_pnl < 0 THEN realized_pnl END), 0) as avg_loss,
|
|
2103
|
+
COALESCE(MAX(realized_pnl), 0) as largest_win,
|
|
2104
|
+
COALESCE(MIN(realized_pnl), 0) as largest_loss
|
|
2105
|
+
FROM binance_futures_trades ${whereClause}`, params);
|
|
2106
|
+
const bySymbolRows = getAll(`SELECT
|
|
2107
|
+
symbol,
|
|
2108
|
+
COUNT(*) as trades,
|
|
2109
|
+
COALESCE(SUM(size * price), 0) as volume,
|
|
2110
|
+
COALESCE(SUM(realized_pnl), 0) as pnl,
|
|
2111
|
+
COALESCE(SUM(commission), 0) as fees
|
|
2112
|
+
FROM binance_futures_trades ${whereClause}
|
|
2113
|
+
GROUP BY symbol`, params);
|
|
2114
|
+
const totalTrades = statsRow?.total_trades || 0;
|
|
2115
|
+
const winCount = statsRow?.win_count || 0;
|
|
2116
|
+
const lossCount = statsRow?.loss_count || 0;
|
|
2117
|
+
const totalWins = statsRow?.avg_win ? statsRow.avg_win * winCount : 0;
|
|
2118
|
+
const totalLosses = statsRow?.avg_loss ? Math.abs(statsRow.avg_loss) * lossCount : 0;
|
|
2119
|
+
return {
|
|
2120
|
+
totalTrades,
|
|
2121
|
+
totalVolume: statsRow?.total_volume || 0,
|
|
2122
|
+
totalFees: statsRow?.total_fees || 0,
|
|
2123
|
+
totalPnl: statsRow?.total_pnl || 0,
|
|
2124
|
+
winCount,
|
|
2125
|
+
lossCount,
|
|
2126
|
+
winRate: totalTrades > 0 ? (winCount / totalTrades) * 100 : 0,
|
|
2127
|
+
avgWin: statsRow?.avg_win || 0,
|
|
2128
|
+
avgLoss: statsRow?.avg_loss || 0,
|
|
2129
|
+
largestWin: statsRow?.largest_win || 0,
|
|
2130
|
+
largestLoss: statsRow?.largest_loss || 0,
|
|
2131
|
+
profitFactor: totalLosses > 0 ? totalWins / totalLosses : totalWins > 0 ? Infinity : 0,
|
|
2132
|
+
bySymbol: Object.fromEntries(bySymbolRows.map((r) => [r.symbol, { trades: r.trades, volume: r.volume, pnl: r.pnl, fees: r.fees }])),
|
|
2133
|
+
};
|
|
2134
|
+
},
|
|
2135
|
+
upsertBinanceFuturesPosition(userId, position) {
|
|
2136
|
+
run(`INSERT INTO binance_futures_positions (
|
|
2137
|
+
user_id, symbol, position_side, size, entry_price, mark_price, liquidation_price,
|
|
2138
|
+
unrealized_pnl, realized_pnl, leverage, margin_type, isolated_margin, opened_at, created_at, updated_at
|
|
2139
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
2140
|
+
ON CONFLICT(user_id, symbol) WHERE closed_at IS NULL DO UPDATE SET
|
|
2141
|
+
size = excluded.size,
|
|
2142
|
+
entry_price = excluded.entry_price,
|
|
2143
|
+
mark_price = excluded.mark_price,
|
|
2144
|
+
liquidation_price = excluded.liquidation_price,
|
|
2145
|
+
unrealized_pnl = excluded.unrealized_pnl,
|
|
2146
|
+
realized_pnl = excluded.realized_pnl,
|
|
2147
|
+
leverage = excluded.leverage,
|
|
2148
|
+
margin_type = excluded.margin_type,
|
|
2149
|
+
isolated_margin = excluded.isolated_margin,
|
|
2150
|
+
updated_at = excluded.updated_at`, [
|
|
2151
|
+
userId,
|
|
2152
|
+
position.symbol,
|
|
2153
|
+
position.positionSide,
|
|
2154
|
+
position.size,
|
|
2155
|
+
position.entryPrice,
|
|
2156
|
+
position.markPrice || null,
|
|
2157
|
+
position.liquidationPrice || null,
|
|
2158
|
+
position.unrealizedPnl || null,
|
|
2159
|
+
position.realizedPnl || 0,
|
|
2160
|
+
position.leverage || null,
|
|
2161
|
+
position.marginType || null,
|
|
2162
|
+
position.isolatedMargin || null,
|
|
2163
|
+
position.openedAt.getTime(),
|
|
2164
|
+
Date.now(),
|
|
2165
|
+
Date.now(),
|
|
2166
|
+
]);
|
|
2167
|
+
},
|
|
2168
|
+
getBinanceFuturesPositions(userId, options = {}) {
|
|
2169
|
+
const params = [userId];
|
|
2170
|
+
let sql = 'SELECT * FROM binance_futures_positions WHERE user_id = ?';
|
|
2171
|
+
if (options.symbol) {
|
|
2172
|
+
sql += ' AND symbol = ?';
|
|
2173
|
+
params.push(options.symbol);
|
|
2174
|
+
}
|
|
2175
|
+
if (options.openOnly) {
|
|
2176
|
+
sql += ' AND closed_at IS NULL';
|
|
2177
|
+
}
|
|
2178
|
+
sql += ' ORDER BY opened_at DESC';
|
|
2179
|
+
const rows = getAll(sql, params);
|
|
2180
|
+
return rows.map((row) => ({
|
|
2181
|
+
id: row.id,
|
|
2182
|
+
userId: row.user_id,
|
|
2183
|
+
symbol: row.symbol,
|
|
2184
|
+
positionSide: row.position_side,
|
|
2185
|
+
size: row.size,
|
|
2186
|
+
entryPrice: row.entry_price,
|
|
2187
|
+
markPrice: row.mark_price,
|
|
2188
|
+
liquidationPrice: row.liquidation_price,
|
|
2189
|
+
unrealizedPnl: row.unrealized_pnl,
|
|
2190
|
+
realizedPnl: row.realized_pnl,
|
|
2191
|
+
leverage: row.leverage,
|
|
2192
|
+
marginType: row.margin_type,
|
|
2193
|
+
isolatedMargin: row.isolated_margin,
|
|
2194
|
+
openedAt: new Date(row.opened_at),
|
|
2195
|
+
closedAt: row.closed_at ? new Date(row.closed_at) : undefined,
|
|
2196
|
+
closePrice: row.close_price,
|
|
2197
|
+
closeReason: row.close_reason,
|
|
2198
|
+
createdAt: row.created_at ? new Date(row.created_at) : undefined,
|
|
2199
|
+
updatedAt: row.updated_at ? new Date(row.updated_at) : undefined,
|
|
2200
|
+
}));
|
|
2201
|
+
},
|
|
2202
|
+
closeBinanceFuturesPosition(userId, symbol, closePrice, reason) {
|
|
2203
|
+
run(`UPDATE binance_futures_positions
|
|
2204
|
+
SET closed_at = ?, close_price = ?, close_reason = ?, updated_at = ?
|
|
2205
|
+
WHERE user_id = ? AND symbol = ? AND closed_at IS NULL`, [Date.now(), closePrice, reason || 'manual', Date.now(), userId, symbol]);
|
|
2206
|
+
},
|
|
2207
|
+
logBinanceFuturesFunding(funding) {
|
|
2208
|
+
run(`INSERT INTO binance_futures_funding (
|
|
2209
|
+
user_id, symbol, funding_rate, payment, position_size, timestamp, created_at
|
|
2210
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
|
2211
|
+
funding.userId,
|
|
2212
|
+
funding.symbol,
|
|
2213
|
+
funding.fundingRate,
|
|
2214
|
+
funding.payment,
|
|
2215
|
+
funding.positionSize,
|
|
2216
|
+
funding.timestamp.getTime(),
|
|
2217
|
+
Date.now(),
|
|
2218
|
+
]);
|
|
2219
|
+
},
|
|
2220
|
+
getBinanceFuturesFunding(userId, options = {}) {
|
|
2221
|
+
const params = [userId];
|
|
2222
|
+
let sql = 'SELECT * FROM binance_futures_funding WHERE user_id = ?';
|
|
2223
|
+
if (options.symbol) {
|
|
2224
|
+
sql += ' AND symbol = ?';
|
|
2225
|
+
params.push(options.symbol);
|
|
2226
|
+
}
|
|
2227
|
+
if (options.since) {
|
|
2228
|
+
sql += ' AND timestamp >= ?';
|
|
2229
|
+
params.push(options.since);
|
|
2230
|
+
}
|
|
2231
|
+
sql += ' ORDER BY timestamp DESC';
|
|
2232
|
+
if (options.limit) {
|
|
2233
|
+
sql += ' LIMIT ?';
|
|
2234
|
+
params.push(options.limit);
|
|
2235
|
+
}
|
|
2236
|
+
const rows = getAll(sql, params);
|
|
2237
|
+
return rows.map((row) => ({
|
|
2238
|
+
id: row.id,
|
|
2239
|
+
userId: row.user_id,
|
|
2240
|
+
symbol: row.symbol,
|
|
2241
|
+
fundingRate: row.funding_rate,
|
|
2242
|
+
payment: row.payment,
|
|
2243
|
+
positionSize: row.position_size,
|
|
2244
|
+
timestamp: new Date(row.timestamp),
|
|
2245
|
+
createdAt: row.created_at ? new Date(row.created_at) : undefined,
|
|
2246
|
+
}));
|
|
2247
|
+
},
|
|
2248
|
+
getBinanceFuturesFundingTotal(userId, options = {}) {
|
|
2249
|
+
const params = [userId];
|
|
2250
|
+
let whereClause = 'WHERE user_id = ?';
|
|
2251
|
+
if (options.symbol) {
|
|
2252
|
+
whereClause += ' AND symbol = ?';
|
|
2253
|
+
params.push(options.symbol);
|
|
2254
|
+
}
|
|
2255
|
+
if (options.since) {
|
|
2256
|
+
whereClause += ' AND timestamp >= ?';
|
|
2257
|
+
params.push(options.since);
|
|
2258
|
+
}
|
|
2259
|
+
const row = getOne(`SELECT COALESCE(SUM(payment), 0) as total FROM binance_futures_funding ${whereClause}`, params);
|
|
2260
|
+
return row?.total || 0;
|
|
2261
|
+
},
|
|
2262
|
+
// =========================================================================
|
|
2263
|
+
// BYBIT FUTURES
|
|
2264
|
+
// =========================================================================
|
|
2265
|
+
logBybitFuturesTrade(trade) {
|
|
2266
|
+
run(`INSERT INTO bybit_futures_trades (
|
|
2267
|
+
user_id, trade_id, order_id, symbol, side, position_side, size, price,
|
|
2268
|
+
commission, commission_asset, closed_pnl, order_type, is_maker, leverage, timestamp, created_at
|
|
2269
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
2270
|
+
trade.userId,
|
|
2271
|
+
trade.tradeId || null,
|
|
2272
|
+
trade.orderId || null,
|
|
2273
|
+
trade.symbol,
|
|
2274
|
+
trade.side,
|
|
2275
|
+
trade.positionSide || null,
|
|
2276
|
+
trade.size,
|
|
2277
|
+
trade.price,
|
|
2278
|
+
trade.commission || 0,
|
|
2279
|
+
trade.commissionAsset || 'USDT',
|
|
2280
|
+
trade.closedPnl || null,
|
|
2281
|
+
trade.orderType || null,
|
|
2282
|
+
trade.isMaker ? 1 : 0,
|
|
2283
|
+
trade.leverage || null,
|
|
2284
|
+
trade.timestamp.getTime(),
|
|
2285
|
+
Date.now(),
|
|
2286
|
+
]);
|
|
2287
|
+
},
|
|
2288
|
+
getBybitFuturesTrades(userId, options = {}) {
|
|
2289
|
+
const params = [userId];
|
|
2290
|
+
let sql = 'SELECT * FROM bybit_futures_trades WHERE user_id = ?';
|
|
2291
|
+
if (options.symbol) {
|
|
2292
|
+
sql += ' AND symbol = ?';
|
|
2293
|
+
params.push(options.symbol);
|
|
2294
|
+
}
|
|
2295
|
+
if (options.since) {
|
|
2296
|
+
sql += ' AND timestamp >= ?';
|
|
2297
|
+
params.push(options.since);
|
|
2298
|
+
}
|
|
2299
|
+
sql += ' ORDER BY timestamp DESC';
|
|
2300
|
+
if (options.limit) {
|
|
2301
|
+
sql += ' LIMIT ?';
|
|
2302
|
+
params.push(options.limit);
|
|
2303
|
+
}
|
|
2304
|
+
const rows = getAll(sql, params);
|
|
2305
|
+
return rows.map((row) => ({
|
|
2306
|
+
id: row.id,
|
|
2307
|
+
userId: row.user_id,
|
|
2308
|
+
tradeId: row.trade_id,
|
|
2309
|
+
orderId: row.order_id,
|
|
2310
|
+
symbol: row.symbol,
|
|
2311
|
+
side: row.side,
|
|
2312
|
+
positionSide: row.position_side,
|
|
2313
|
+
size: row.size,
|
|
2314
|
+
price: row.price,
|
|
2315
|
+
commission: row.commission,
|
|
2316
|
+
commissionAsset: row.commission_asset,
|
|
2317
|
+
closedPnl: row.closed_pnl,
|
|
2318
|
+
orderType: row.order_type,
|
|
2319
|
+
isMaker: row.is_maker === 1,
|
|
2320
|
+
leverage: row.leverage,
|
|
2321
|
+
timestamp: new Date(row.timestamp),
|
|
2322
|
+
createdAt: row.created_at ? new Date(row.created_at) : undefined,
|
|
2323
|
+
}));
|
|
2324
|
+
},
|
|
2325
|
+
getBybitFuturesStats(userId, options = {}) {
|
|
2326
|
+
const params = [userId];
|
|
2327
|
+
let whereClause = 'WHERE user_id = ?';
|
|
2328
|
+
if (options.symbol) {
|
|
2329
|
+
whereClause += ' AND symbol = ?';
|
|
2330
|
+
params.push(options.symbol);
|
|
2331
|
+
}
|
|
2332
|
+
if (options.since) {
|
|
2333
|
+
whereClause += ' AND timestamp >= ?';
|
|
2334
|
+
params.push(options.since);
|
|
2335
|
+
}
|
|
2336
|
+
const statsRow = getOne(`SELECT
|
|
2337
|
+
COUNT(*) as total_trades,
|
|
2338
|
+
COALESCE(SUM(size * price), 0) as total_volume,
|
|
2339
|
+
COALESCE(SUM(commission), 0) as total_fees,
|
|
2340
|
+
COALESCE(SUM(closed_pnl), 0) as total_pnl,
|
|
2341
|
+
COUNT(CASE WHEN closed_pnl > 0 THEN 1 END) as win_count,
|
|
2342
|
+
COUNT(CASE WHEN closed_pnl < 0 THEN 1 END) as loss_count,
|
|
2343
|
+
COALESCE(AVG(CASE WHEN closed_pnl > 0 THEN closed_pnl END), 0) as avg_win,
|
|
2344
|
+
COALESCE(AVG(CASE WHEN closed_pnl < 0 THEN closed_pnl END), 0) as avg_loss,
|
|
2345
|
+
COALESCE(MAX(closed_pnl), 0) as largest_win,
|
|
2346
|
+
COALESCE(MIN(closed_pnl), 0) as largest_loss
|
|
2347
|
+
FROM bybit_futures_trades ${whereClause}`, params);
|
|
2348
|
+
const bySymbolRows = getAll(`SELECT
|
|
2349
|
+
symbol,
|
|
2350
|
+
COUNT(*) as trades,
|
|
2351
|
+
COALESCE(SUM(size * price), 0) as volume,
|
|
2352
|
+
COALESCE(SUM(closed_pnl), 0) as pnl,
|
|
2353
|
+
COALESCE(SUM(commission), 0) as fees
|
|
2354
|
+
FROM bybit_futures_trades ${whereClause}
|
|
2355
|
+
GROUP BY symbol`, params);
|
|
2356
|
+
const totalTrades = statsRow?.total_trades || 0;
|
|
2357
|
+
const winCount = statsRow?.win_count || 0;
|
|
2358
|
+
const lossCount = statsRow?.loss_count || 0;
|
|
2359
|
+
const totalWins = statsRow?.avg_win ? statsRow.avg_win * winCount : 0;
|
|
2360
|
+
const totalLosses = statsRow?.avg_loss ? Math.abs(statsRow.avg_loss) * lossCount : 0;
|
|
2361
|
+
return {
|
|
2362
|
+
totalTrades,
|
|
2363
|
+
totalVolume: statsRow?.total_volume || 0,
|
|
2364
|
+
totalFees: statsRow?.total_fees || 0,
|
|
2365
|
+
totalPnl: statsRow?.total_pnl || 0,
|
|
2366
|
+
winCount,
|
|
2367
|
+
lossCount,
|
|
2368
|
+
winRate: totalTrades > 0 ? (winCount / totalTrades) * 100 : 0,
|
|
2369
|
+
avgWin: statsRow?.avg_win || 0,
|
|
2370
|
+
avgLoss: statsRow?.avg_loss || 0,
|
|
2371
|
+
largestWin: statsRow?.largest_win || 0,
|
|
2372
|
+
largestLoss: statsRow?.largest_loss || 0,
|
|
2373
|
+
profitFactor: totalLosses > 0 ? totalWins / totalLosses : totalWins > 0 ? Infinity : 0,
|
|
2374
|
+
bySymbol: Object.fromEntries(bySymbolRows.map((r) => [r.symbol, { trades: r.trades, volume: r.volume, pnl: r.pnl, fees: r.fees }])),
|
|
2375
|
+
};
|
|
2376
|
+
},
|
|
2377
|
+
upsertBybitFuturesPosition(userId, position) {
|
|
2378
|
+
run(`INSERT INTO bybit_futures_positions (
|
|
2379
|
+
user_id, symbol, side, size, entry_price, mark_price, liquidation_price,
|
|
2380
|
+
unrealized_pnl, cum_realised_pnl, leverage, trade_mode, position_margin, opened_at, created_at, updated_at
|
|
2381
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
2382
|
+
ON CONFLICT(user_id, symbol) WHERE closed_at IS NULL DO UPDATE SET
|
|
2383
|
+
size = excluded.size,
|
|
2384
|
+
entry_price = excluded.entry_price,
|
|
2385
|
+
mark_price = excluded.mark_price,
|
|
2386
|
+
liquidation_price = excluded.liquidation_price,
|
|
2387
|
+
unrealized_pnl = excluded.unrealized_pnl,
|
|
2388
|
+
cum_realised_pnl = excluded.cum_realised_pnl,
|
|
2389
|
+
leverage = excluded.leverage,
|
|
2390
|
+
trade_mode = excluded.trade_mode,
|
|
2391
|
+
position_margin = excluded.position_margin,
|
|
2392
|
+
updated_at = excluded.updated_at`, [
|
|
2393
|
+
userId,
|
|
2394
|
+
position.symbol,
|
|
2395
|
+
position.side,
|
|
2396
|
+
position.size,
|
|
2397
|
+
position.entryPrice,
|
|
2398
|
+
position.markPrice || null,
|
|
2399
|
+
position.liquidationPrice || null,
|
|
2400
|
+
position.unrealizedPnl || null,
|
|
2401
|
+
position.cumRealisedPnl || 0,
|
|
2402
|
+
position.leverage || null,
|
|
2403
|
+
position.tradeMode || null,
|
|
2404
|
+
position.positionMargin || null,
|
|
2405
|
+
position.openedAt.getTime(),
|
|
2406
|
+
Date.now(),
|
|
2407
|
+
Date.now(),
|
|
2408
|
+
]);
|
|
2409
|
+
},
|
|
2410
|
+
getBybitFuturesPositions(userId, options = {}) {
|
|
2411
|
+
const params = [userId];
|
|
2412
|
+
let sql = 'SELECT * FROM bybit_futures_positions WHERE user_id = ?';
|
|
2413
|
+
if (options.symbol) {
|
|
2414
|
+
sql += ' AND symbol = ?';
|
|
2415
|
+
params.push(options.symbol);
|
|
2416
|
+
}
|
|
2417
|
+
if (options.openOnly) {
|
|
2418
|
+
sql += ' AND closed_at IS NULL';
|
|
2419
|
+
}
|
|
2420
|
+
sql += ' ORDER BY opened_at DESC';
|
|
2421
|
+
const rows = getAll(sql, params);
|
|
2422
|
+
return rows.map((row) => ({
|
|
2423
|
+
id: row.id,
|
|
2424
|
+
userId: row.user_id,
|
|
2425
|
+
symbol: row.symbol,
|
|
2426
|
+
side: row.side,
|
|
2427
|
+
size: row.size,
|
|
2428
|
+
entryPrice: row.entry_price,
|
|
2429
|
+
markPrice: row.mark_price,
|
|
2430
|
+
liquidationPrice: row.liquidation_price,
|
|
2431
|
+
unrealizedPnl: row.unrealized_pnl,
|
|
2432
|
+
cumRealisedPnl: row.cum_realised_pnl,
|
|
2433
|
+
leverage: row.leverage,
|
|
2434
|
+
tradeMode: row.trade_mode,
|
|
2435
|
+
positionMargin: row.position_margin,
|
|
2436
|
+
openedAt: new Date(row.opened_at),
|
|
2437
|
+
closedAt: row.closed_at ? new Date(row.closed_at) : undefined,
|
|
2438
|
+
closePrice: row.close_price,
|
|
2439
|
+
closeReason: row.close_reason,
|
|
2440
|
+
createdAt: row.created_at ? new Date(row.created_at) : undefined,
|
|
2441
|
+
updatedAt: row.updated_at ? new Date(row.updated_at) : undefined,
|
|
2442
|
+
}));
|
|
2443
|
+
},
|
|
2444
|
+
closeBybitFuturesPosition(userId, symbol, closePrice, reason) {
|
|
2445
|
+
run(`UPDATE bybit_futures_positions
|
|
2446
|
+
SET closed_at = ?, close_price = ?, close_reason = ?, updated_at = ?
|
|
2447
|
+
WHERE user_id = ? AND symbol = ? AND closed_at IS NULL`, [Date.now(), closePrice, reason || 'manual', Date.now(), userId, symbol]);
|
|
2448
|
+
},
|
|
2449
|
+
logBybitFuturesFunding(funding) {
|
|
2450
|
+
run(`INSERT INTO bybit_futures_funding (
|
|
2451
|
+
user_id, symbol, funding_rate, payment, position_size, timestamp, created_at
|
|
2452
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
|
2453
|
+
funding.userId,
|
|
2454
|
+
funding.symbol,
|
|
2455
|
+
funding.fundingRate,
|
|
2456
|
+
funding.payment,
|
|
2457
|
+
funding.positionSize,
|
|
2458
|
+
funding.timestamp.getTime(),
|
|
2459
|
+
Date.now(),
|
|
2460
|
+
]);
|
|
2461
|
+
},
|
|
2462
|
+
getBybitFuturesFunding(userId, options = {}) {
|
|
2463
|
+
const params = [userId];
|
|
2464
|
+
let sql = 'SELECT * FROM bybit_futures_funding WHERE user_id = ?';
|
|
2465
|
+
if (options.symbol) {
|
|
2466
|
+
sql += ' AND symbol = ?';
|
|
2467
|
+
params.push(options.symbol);
|
|
2468
|
+
}
|
|
2469
|
+
if (options.since) {
|
|
2470
|
+
sql += ' AND timestamp >= ?';
|
|
2471
|
+
params.push(options.since);
|
|
2472
|
+
}
|
|
2473
|
+
sql += ' ORDER BY timestamp DESC';
|
|
2474
|
+
if (options.limit) {
|
|
2475
|
+
sql += ' LIMIT ?';
|
|
2476
|
+
params.push(options.limit);
|
|
2477
|
+
}
|
|
2478
|
+
const rows = getAll(sql, params);
|
|
2479
|
+
return rows.map((row) => ({
|
|
2480
|
+
id: row.id,
|
|
2481
|
+
userId: row.user_id,
|
|
2482
|
+
symbol: row.symbol,
|
|
2483
|
+
fundingRate: row.funding_rate,
|
|
2484
|
+
payment: row.payment,
|
|
2485
|
+
positionSize: row.position_size,
|
|
2486
|
+
timestamp: new Date(row.timestamp),
|
|
2487
|
+
createdAt: row.created_at ? new Date(row.created_at) : undefined,
|
|
2488
|
+
}));
|
|
2489
|
+
},
|
|
2490
|
+
getBybitFuturesFundingTotal(userId, options = {}) {
|
|
2491
|
+
const params = [userId];
|
|
2492
|
+
let whereClause = 'WHERE user_id = ?';
|
|
2493
|
+
if (options.symbol) {
|
|
2494
|
+
whereClause += ' AND symbol = ?';
|
|
2495
|
+
params.push(options.symbol);
|
|
2496
|
+
}
|
|
2497
|
+
if (options.since) {
|
|
2498
|
+
whereClause += ' AND timestamp >= ?';
|
|
2499
|
+
params.push(options.since);
|
|
2500
|
+
}
|
|
2501
|
+
const row = getOne(`SELECT COALESCE(SUM(payment), 0) as total FROM bybit_futures_funding ${whereClause}`, params);
|
|
2502
|
+
return row?.total || 0;
|
|
2503
|
+
},
|
|
2504
|
+
// =========================================================================
|
|
2505
|
+
// MEXC FUTURES
|
|
2506
|
+
// =========================================================================
|
|
2507
|
+
logMexcFuturesTrade(trade) {
|
|
2508
|
+
run(`INSERT INTO mexc_futures_trades (
|
|
2509
|
+
user_id, trade_id, order_id, symbol, side, vol, price,
|
|
2510
|
+
fee, fee_asset, realized_pnl, order_type, is_maker, leverage, timestamp, created_at
|
|
2511
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
2512
|
+
trade.userId,
|
|
2513
|
+
trade.tradeId || null,
|
|
2514
|
+
trade.orderId || null,
|
|
2515
|
+
trade.symbol,
|
|
2516
|
+
trade.side,
|
|
2517
|
+
trade.vol,
|
|
2518
|
+
trade.price,
|
|
2519
|
+
trade.fee || 0,
|
|
2520
|
+
trade.feeAsset || 'USDT',
|
|
2521
|
+
trade.realizedPnl || null,
|
|
2522
|
+
trade.orderType || null,
|
|
2523
|
+
trade.isMaker ? 1 : 0,
|
|
2524
|
+
trade.leverage || null,
|
|
2525
|
+
trade.timestamp.getTime(),
|
|
2526
|
+
Date.now(),
|
|
2527
|
+
]);
|
|
2528
|
+
},
|
|
2529
|
+
getMexcFuturesTrades(userId, options = {}) {
|
|
2530
|
+
const params = [userId];
|
|
2531
|
+
let sql = 'SELECT * FROM mexc_futures_trades WHERE user_id = ?';
|
|
2532
|
+
if (options.symbol) {
|
|
2533
|
+
sql += ' AND symbol = ?';
|
|
2534
|
+
params.push(options.symbol);
|
|
2535
|
+
}
|
|
2536
|
+
if (options.since) {
|
|
2537
|
+
sql += ' AND timestamp >= ?';
|
|
2538
|
+
params.push(options.since);
|
|
2539
|
+
}
|
|
2540
|
+
sql += ' ORDER BY timestamp DESC';
|
|
2541
|
+
if (options.limit) {
|
|
2542
|
+
sql += ' LIMIT ?';
|
|
2543
|
+
params.push(options.limit);
|
|
2544
|
+
}
|
|
2545
|
+
const rows = getAll(sql, params);
|
|
2546
|
+
return rows.map((row) => ({
|
|
2547
|
+
id: row.id,
|
|
2548
|
+
userId: row.user_id,
|
|
2549
|
+
tradeId: row.trade_id,
|
|
2550
|
+
orderId: row.order_id,
|
|
2551
|
+
symbol: row.symbol,
|
|
2552
|
+
side: row.side,
|
|
2553
|
+
vol: row.vol,
|
|
2554
|
+
price: row.price,
|
|
2555
|
+
fee: row.fee,
|
|
2556
|
+
feeAsset: row.fee_asset,
|
|
2557
|
+
realizedPnl: row.realized_pnl,
|
|
2558
|
+
orderType: row.order_type,
|
|
2559
|
+
isMaker: row.is_maker === 1,
|
|
2560
|
+
leverage: row.leverage,
|
|
2561
|
+
timestamp: new Date(row.timestamp),
|
|
2562
|
+
createdAt: row.created_at ? new Date(row.created_at) : undefined,
|
|
2563
|
+
}));
|
|
2564
|
+
},
|
|
2565
|
+
getMexcFuturesStats(userId, options = {}) {
|
|
2566
|
+
const params = [userId];
|
|
2567
|
+
let whereClause = 'WHERE user_id = ?';
|
|
2568
|
+
if (options.symbol) {
|
|
2569
|
+
whereClause += ' AND symbol = ?';
|
|
2570
|
+
params.push(options.symbol);
|
|
2571
|
+
}
|
|
2572
|
+
if (options.since) {
|
|
2573
|
+
whereClause += ' AND timestamp >= ?';
|
|
2574
|
+
params.push(options.since);
|
|
2575
|
+
}
|
|
2576
|
+
const statsRow = getOne(`SELECT
|
|
2577
|
+
COUNT(*) as total_trades,
|
|
2578
|
+
COALESCE(SUM(vol * price), 0) as total_volume,
|
|
2579
|
+
COALESCE(SUM(fee), 0) as total_fees,
|
|
2580
|
+
COALESCE(SUM(realized_pnl), 0) as total_pnl,
|
|
2581
|
+
COUNT(CASE WHEN realized_pnl > 0 THEN 1 END) as win_count,
|
|
2582
|
+
COUNT(CASE WHEN realized_pnl < 0 THEN 1 END) as loss_count,
|
|
2583
|
+
COALESCE(AVG(CASE WHEN realized_pnl > 0 THEN realized_pnl END), 0) as avg_win,
|
|
2584
|
+
COALESCE(AVG(CASE WHEN realized_pnl < 0 THEN realized_pnl END), 0) as avg_loss,
|
|
2585
|
+
COALESCE(MAX(realized_pnl), 0) as largest_win,
|
|
2586
|
+
COALESCE(MIN(realized_pnl), 0) as largest_loss
|
|
2587
|
+
FROM mexc_futures_trades ${whereClause}`, params);
|
|
2588
|
+
const bySymbolRows = getAll(`SELECT
|
|
2589
|
+
symbol,
|
|
2590
|
+
COUNT(*) as trades,
|
|
2591
|
+
COALESCE(SUM(vol * price), 0) as volume,
|
|
2592
|
+
COALESCE(SUM(realized_pnl), 0) as pnl,
|
|
2593
|
+
COALESCE(SUM(fee), 0) as fees
|
|
2594
|
+
FROM mexc_futures_trades ${whereClause}
|
|
2595
|
+
GROUP BY symbol`, params);
|
|
2596
|
+
const totalTrades = statsRow?.total_trades || 0;
|
|
2597
|
+
const winCount = statsRow?.win_count || 0;
|
|
2598
|
+
const lossCount = statsRow?.loss_count || 0;
|
|
2599
|
+
const totalWins = statsRow?.avg_win ? statsRow.avg_win * winCount : 0;
|
|
2600
|
+
const totalLosses = statsRow?.avg_loss ? Math.abs(statsRow.avg_loss) * lossCount : 0;
|
|
2601
|
+
return {
|
|
2602
|
+
totalTrades,
|
|
2603
|
+
totalVolume: statsRow?.total_volume || 0,
|
|
2604
|
+
totalFees: statsRow?.total_fees || 0,
|
|
2605
|
+
totalPnl: statsRow?.total_pnl || 0,
|
|
2606
|
+
winCount,
|
|
2607
|
+
lossCount,
|
|
2608
|
+
winRate: totalTrades > 0 ? (winCount / totalTrades) * 100 : 0,
|
|
2609
|
+
avgWin: statsRow?.avg_win || 0,
|
|
2610
|
+
avgLoss: statsRow?.avg_loss || 0,
|
|
2611
|
+
largestWin: statsRow?.largest_win || 0,
|
|
2612
|
+
largestLoss: statsRow?.largest_loss || 0,
|
|
2613
|
+
profitFactor: totalLosses > 0 ? totalWins / totalLosses : totalWins > 0 ? Infinity : 0,
|
|
2614
|
+
bySymbol: Object.fromEntries(bySymbolRows.map((r) => [r.symbol, { trades: r.trades, volume: r.volume, pnl: r.pnl, fees: r.fees }])),
|
|
2615
|
+
};
|
|
2616
|
+
},
|
|
2617
|
+
upsertMexcFuturesPosition(userId, position) {
|
|
2618
|
+
run(`INSERT INTO mexc_futures_positions (
|
|
2619
|
+
user_id, symbol, position_type, hold_vol, open_avg_price, mark_price, liquidation_price,
|
|
2620
|
+
unrealized_pnl, realized_pnl, leverage, margin_mode, position_margin, opened_at, created_at, updated_at
|
|
2621
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
2622
|
+
ON CONFLICT(user_id, symbol) WHERE closed_at IS NULL DO UPDATE SET
|
|
2623
|
+
hold_vol = excluded.hold_vol,
|
|
2624
|
+
open_avg_price = excluded.open_avg_price,
|
|
2625
|
+
mark_price = excluded.mark_price,
|
|
2626
|
+
liquidation_price = excluded.liquidation_price,
|
|
2627
|
+
unrealized_pnl = excluded.unrealized_pnl,
|
|
2628
|
+
realized_pnl = excluded.realized_pnl,
|
|
2629
|
+
leverage = excluded.leverage,
|
|
2630
|
+
margin_mode = excluded.margin_mode,
|
|
2631
|
+
position_margin = excluded.position_margin,
|
|
2632
|
+
updated_at = excluded.updated_at`, [
|
|
2633
|
+
userId,
|
|
2634
|
+
position.symbol,
|
|
2635
|
+
position.positionType,
|
|
2636
|
+
position.holdVol,
|
|
2637
|
+
position.openAvgPrice,
|
|
2638
|
+
position.markPrice || null,
|
|
2639
|
+
position.liquidationPrice || null,
|
|
2640
|
+
position.unrealizedPnl || null,
|
|
2641
|
+
position.realizedPnl || 0,
|
|
2642
|
+
position.leverage || null,
|
|
2643
|
+
position.marginMode || null,
|
|
2644
|
+
position.positionMargin || null,
|
|
2645
|
+
position.openedAt.getTime(),
|
|
2646
|
+
Date.now(),
|
|
2647
|
+
Date.now(),
|
|
2648
|
+
]);
|
|
2649
|
+
},
|
|
2650
|
+
getMexcFuturesPositions(userId, options = {}) {
|
|
2651
|
+
const params = [userId];
|
|
2652
|
+
let sql = 'SELECT * FROM mexc_futures_positions WHERE user_id = ?';
|
|
2653
|
+
if (options.symbol) {
|
|
2654
|
+
sql += ' AND symbol = ?';
|
|
2655
|
+
params.push(options.symbol);
|
|
2656
|
+
}
|
|
2657
|
+
if (options.openOnly) {
|
|
2658
|
+
sql += ' AND closed_at IS NULL';
|
|
2659
|
+
}
|
|
2660
|
+
sql += ' ORDER BY opened_at DESC';
|
|
2661
|
+
const rows = getAll(sql, params);
|
|
2662
|
+
return rows.map((row) => ({
|
|
2663
|
+
id: row.id,
|
|
2664
|
+
userId: row.user_id,
|
|
2665
|
+
symbol: row.symbol,
|
|
2666
|
+
positionType: row.position_type,
|
|
2667
|
+
holdVol: row.hold_vol,
|
|
2668
|
+
openAvgPrice: row.open_avg_price,
|
|
2669
|
+
markPrice: row.mark_price,
|
|
2670
|
+
liquidationPrice: row.liquidation_price,
|
|
2671
|
+
unrealizedPnl: row.unrealized_pnl,
|
|
2672
|
+
realizedPnl: row.realized_pnl,
|
|
2673
|
+
leverage: row.leverage,
|
|
2674
|
+
marginMode: row.margin_mode,
|
|
2675
|
+
positionMargin: row.position_margin,
|
|
2676
|
+
openedAt: new Date(row.opened_at),
|
|
2677
|
+
closedAt: row.closed_at ? new Date(row.closed_at) : undefined,
|
|
2678
|
+
closePrice: row.close_price,
|
|
2679
|
+
closeReason: row.close_reason,
|
|
2680
|
+
createdAt: row.created_at ? new Date(row.created_at) : undefined,
|
|
2681
|
+
updatedAt: row.updated_at ? new Date(row.updated_at) : undefined,
|
|
2682
|
+
}));
|
|
2683
|
+
},
|
|
2684
|
+
closeMexcFuturesPosition(userId, symbol, closePrice, reason) {
|
|
2685
|
+
run(`UPDATE mexc_futures_positions
|
|
2686
|
+
SET closed_at = ?, close_price = ?, close_reason = ?, updated_at = ?
|
|
2687
|
+
WHERE user_id = ? AND symbol = ? AND closed_at IS NULL`, [Date.now(), closePrice, reason || 'manual', Date.now(), userId, symbol]);
|
|
2688
|
+
},
|
|
2689
|
+
logMexcFuturesFunding(funding) {
|
|
2690
|
+
run(`INSERT INTO mexc_futures_funding (
|
|
2691
|
+
user_id, symbol, funding_rate, payment, position_size, timestamp, created_at
|
|
2692
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
|
2693
|
+
funding.userId,
|
|
2694
|
+
funding.symbol,
|
|
2695
|
+
funding.fundingRate,
|
|
2696
|
+
funding.payment,
|
|
2697
|
+
funding.positionSize,
|
|
2698
|
+
funding.timestamp.getTime(),
|
|
2699
|
+
Date.now(),
|
|
2700
|
+
]);
|
|
2701
|
+
},
|
|
2702
|
+
getMexcFuturesFunding(userId, options = {}) {
|
|
2703
|
+
const params = [userId];
|
|
2704
|
+
let sql = 'SELECT * FROM mexc_futures_funding WHERE user_id = ?';
|
|
2705
|
+
if (options.symbol) {
|
|
2706
|
+
sql += ' AND symbol = ?';
|
|
2707
|
+
params.push(options.symbol);
|
|
2708
|
+
}
|
|
2709
|
+
if (options.since) {
|
|
2710
|
+
sql += ' AND timestamp >= ?';
|
|
2711
|
+
params.push(options.since);
|
|
2712
|
+
}
|
|
2713
|
+
sql += ' ORDER BY timestamp DESC';
|
|
2714
|
+
if (options.limit) {
|
|
2715
|
+
sql += ' LIMIT ?';
|
|
2716
|
+
params.push(options.limit);
|
|
2717
|
+
}
|
|
2718
|
+
const rows = getAll(sql, params);
|
|
2719
|
+
return rows.map((row) => ({
|
|
2720
|
+
id: row.id,
|
|
2721
|
+
userId: row.user_id,
|
|
2722
|
+
symbol: row.symbol,
|
|
2723
|
+
fundingRate: row.funding_rate,
|
|
2724
|
+
payment: row.payment,
|
|
2725
|
+
positionSize: row.position_size,
|
|
2726
|
+
timestamp: new Date(row.timestamp),
|
|
2727
|
+
createdAt: row.created_at ? new Date(row.created_at) : undefined,
|
|
2728
|
+
}));
|
|
2729
|
+
},
|
|
2730
|
+
getMexcFuturesFundingTotal(userId, options = {}) {
|
|
2731
|
+
const params = [userId];
|
|
2732
|
+
let whereClause = 'WHERE user_id = ?';
|
|
2733
|
+
if (options.symbol) {
|
|
2734
|
+
whereClause += ' AND symbol = ?';
|
|
2735
|
+
params.push(options.symbol);
|
|
2736
|
+
}
|
|
2737
|
+
if (options.since) {
|
|
2738
|
+
whereClause += ' AND timestamp >= ?';
|
|
2739
|
+
params.push(options.since);
|
|
2740
|
+
}
|
|
2741
|
+
const row = getOne(`SELECT COALESCE(SUM(payment), 0) as total FROM mexc_futures_funding ${whereClause}`, params);
|
|
2742
|
+
return row?.total || 0;
|
|
2743
|
+
},
|
|
2744
|
+
// Opinion.trade trades
|
|
2745
|
+
logOpinionTrade(trade) {
|
|
2746
|
+
run(`INSERT INTO opinion_trades (
|
|
2747
|
+
user_id, order_id, market_id, token_id, side, price, size, order_type,
|
|
2748
|
+
status, filled_size, avg_fill_price, fee, tx_hash, timestamp, created_at
|
|
2749
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
2750
|
+
trade.oddsUserId,
|
|
2751
|
+
trade.orderId,
|
|
2752
|
+
trade.marketId,
|
|
2753
|
+
trade.tokenId,
|
|
2754
|
+
trade.side,
|
|
2755
|
+
trade.price,
|
|
2756
|
+
trade.size,
|
|
2757
|
+
trade.orderType,
|
|
2758
|
+
trade.status || 'open',
|
|
2759
|
+
trade.filledSize || 0,
|
|
2760
|
+
trade.avgFillPrice || trade.price,
|
|
2761
|
+
trade.fee || 0,
|
|
2762
|
+
trade.txHash || null,
|
|
2763
|
+
trade.timestamp.getTime(),
|
|
2764
|
+
Date.now(),
|
|
2765
|
+
]);
|
|
2766
|
+
},
|
|
2767
|
+
getOpinionTrades(userId, options = {}) {
|
|
2768
|
+
const params = [userId];
|
|
2769
|
+
let sql = 'SELECT * FROM opinion_trades WHERE user_id = ?';
|
|
2770
|
+
if (options.marketId) {
|
|
2771
|
+
sql += ' AND market_id = ?';
|
|
2772
|
+
params.push(options.marketId);
|
|
2773
|
+
}
|
|
2774
|
+
if (options.since) {
|
|
2775
|
+
sql += ' AND timestamp >= ?';
|
|
2776
|
+
params.push(options.since);
|
|
2777
|
+
}
|
|
2778
|
+
sql += ' ORDER BY timestamp DESC';
|
|
2779
|
+
if (options.limit) {
|
|
2780
|
+
sql += ' LIMIT ?';
|
|
2781
|
+
params.push(options.limit);
|
|
2782
|
+
}
|
|
2783
|
+
const rows = getAll(sql, params);
|
|
2784
|
+
return rows.map((row) => ({
|
|
2785
|
+
id: row.id,
|
|
2786
|
+
oddsUserId: row.user_id,
|
|
2787
|
+
orderId: row.order_id,
|
|
2788
|
+
marketId: row.market_id,
|
|
2789
|
+
tokenId: row.token_id,
|
|
2790
|
+
side: row.side,
|
|
2791
|
+
price: row.price,
|
|
2792
|
+
size: row.size,
|
|
2793
|
+
orderType: row.order_type,
|
|
2794
|
+
status: row.status,
|
|
2795
|
+
filledSize: row.filled_size,
|
|
2796
|
+
avgFillPrice: row.avg_fill_price,
|
|
2797
|
+
fee: row.fee,
|
|
2798
|
+
txHash: row.tx_hash,
|
|
2799
|
+
timestamp: new Date(row.timestamp),
|
|
2800
|
+
createdAt: new Date(row.created_at),
|
|
2801
|
+
}));
|
|
2802
|
+
},
|
|
2803
|
+
// Predict.fun trades
|
|
2804
|
+
logPredictFunTrade(trade) {
|
|
2805
|
+
run(`INSERT INTO predictfun_trades (
|
|
2806
|
+
user_id, order_hash, market_id, token_id, side, price, quantity,
|
|
2807
|
+
status, filled_quantity, avg_fill_price, fee, tx_hash,
|
|
2808
|
+
is_neg_risk, is_yield_bearing, timestamp, created_at
|
|
2809
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
2810
|
+
trade.oddsUserId,
|
|
2811
|
+
trade.orderHash,
|
|
2812
|
+
trade.marketId,
|
|
2813
|
+
trade.tokenId,
|
|
2814
|
+
trade.side,
|
|
2815
|
+
trade.price,
|
|
2816
|
+
trade.quantity,
|
|
2817
|
+
trade.status || 'open',
|
|
2818
|
+
trade.filledQuantity || 0,
|
|
2819
|
+
trade.avgFillPrice || trade.price,
|
|
2820
|
+
trade.fee || 0,
|
|
2821
|
+
trade.txHash || null,
|
|
2822
|
+
trade.isNegRisk ? 1 : 0,
|
|
2823
|
+
trade.isYieldBearing !== false ? 1 : 0,
|
|
2824
|
+
trade.timestamp.getTime(),
|
|
2825
|
+
Date.now(),
|
|
2826
|
+
]);
|
|
2827
|
+
},
|
|
2828
|
+
getPredictFunTrades(userId, options = {}) {
|
|
2829
|
+
const params = [userId];
|
|
2830
|
+
let sql = 'SELECT * FROM predictfun_trades WHERE user_id = ?';
|
|
2831
|
+
if (options.marketId) {
|
|
2832
|
+
sql += ' AND market_id = ?';
|
|
2833
|
+
params.push(options.marketId);
|
|
2834
|
+
}
|
|
2835
|
+
if (options.since) {
|
|
2836
|
+
sql += ' AND timestamp >= ?';
|
|
2837
|
+
params.push(options.since);
|
|
2838
|
+
}
|
|
2839
|
+
sql += ' ORDER BY timestamp DESC';
|
|
2840
|
+
if (options.limit) {
|
|
2841
|
+
sql += ' LIMIT ?';
|
|
2842
|
+
params.push(options.limit);
|
|
2843
|
+
}
|
|
2844
|
+
const rows = getAll(sql, params);
|
|
2845
|
+
return rows.map((row) => ({
|
|
2846
|
+
id: row.id,
|
|
2847
|
+
oddsUserId: row.user_id,
|
|
2848
|
+
orderHash: row.order_hash,
|
|
2849
|
+
marketId: row.market_id,
|
|
2850
|
+
tokenId: row.token_id,
|
|
2851
|
+
side: row.side,
|
|
2852
|
+
price: row.price,
|
|
2853
|
+
quantity: row.quantity,
|
|
2854
|
+
status: row.status,
|
|
2855
|
+
filledQuantity: row.filled_quantity,
|
|
2856
|
+
avgFillPrice: row.avg_fill_price,
|
|
2857
|
+
fee: row.fee,
|
|
2858
|
+
txHash: row.tx_hash,
|
|
2859
|
+
isNegRisk: row.is_neg_risk === 1,
|
|
2860
|
+
isYieldBearing: row.is_yield_bearing === 1,
|
|
2861
|
+
timestamp: new Date(row.timestamp),
|
|
2862
|
+
createdAt: new Date(row.created_at),
|
|
2863
|
+
}));
|
|
2864
|
+
},
|
|
2865
|
+
// Polymarket trades
|
|
2866
|
+
logPolymarketTrade(trade) {
|
|
2867
|
+
run(`INSERT INTO polymarket_trades (
|
|
2868
|
+
user_id, order_id, market_id, token_id, condition_id, side, price, size, order_type,
|
|
2869
|
+
status, filled_size, avg_fill_price, fee, tx_hash, timestamp, created_at
|
|
2870
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
2871
|
+
trade.oddsUserId,
|
|
2872
|
+
trade.orderId,
|
|
2873
|
+
trade.marketId,
|
|
2874
|
+
trade.tokenId,
|
|
2875
|
+
trade.conditionId || null,
|
|
2876
|
+
trade.side,
|
|
2877
|
+
trade.price,
|
|
2878
|
+
trade.size,
|
|
2879
|
+
trade.orderType,
|
|
2880
|
+
trade.status || 'open',
|
|
2881
|
+
trade.filledSize || 0,
|
|
2882
|
+
trade.avgFillPrice || trade.price,
|
|
2883
|
+
trade.fee || 0,
|
|
2884
|
+
trade.txHash || null,
|
|
2885
|
+
trade.timestamp.getTime(),
|
|
2886
|
+
Date.now(),
|
|
2887
|
+
]);
|
|
2888
|
+
},
|
|
2889
|
+
getPolymarketTrades(userId, options = {}) {
|
|
2890
|
+
const params = [userId];
|
|
2891
|
+
let sql = 'SELECT * FROM polymarket_trades WHERE user_id = ?';
|
|
2892
|
+
if (options.marketId) {
|
|
2893
|
+
sql += ' AND market_id = ?';
|
|
2894
|
+
params.push(options.marketId);
|
|
2895
|
+
}
|
|
2896
|
+
if (options.since) {
|
|
2897
|
+
sql += ' AND timestamp >= ?';
|
|
2898
|
+
params.push(options.since);
|
|
2899
|
+
}
|
|
2900
|
+
sql += ' ORDER BY timestamp DESC';
|
|
2901
|
+
if (options.limit) {
|
|
2902
|
+
sql += ' LIMIT ?';
|
|
2903
|
+
params.push(options.limit);
|
|
2904
|
+
}
|
|
2905
|
+
const rows = getAll(sql, params);
|
|
2906
|
+
return rows.map((row) => ({
|
|
2907
|
+
id: row.id,
|
|
2908
|
+
oddsUserId: row.user_id,
|
|
2909
|
+
orderId: row.order_id,
|
|
2910
|
+
marketId: row.market_id,
|
|
2911
|
+
tokenId: row.token_id,
|
|
2912
|
+
conditionId: row.condition_id,
|
|
2913
|
+
side: row.side,
|
|
2914
|
+
price: row.price,
|
|
2915
|
+
size: row.size,
|
|
2916
|
+
orderType: row.order_type,
|
|
2917
|
+
status: row.status,
|
|
2918
|
+
filledSize: row.filled_size,
|
|
2919
|
+
avgFillPrice: row.avg_fill_price,
|
|
2920
|
+
fee: row.fee,
|
|
2921
|
+
txHash: row.tx_hash,
|
|
2922
|
+
timestamp: new Date(row.timestamp),
|
|
2923
|
+
createdAt: new Date(row.created_at),
|
|
2924
|
+
}));
|
|
2925
|
+
},
|
|
2926
|
+
// Kalshi trades
|
|
2927
|
+
logKalshiTrade(trade) {
|
|
2928
|
+
run(`INSERT INTO kalshi_trades (
|
|
2929
|
+
user_id, order_id, market_id, ticker, side, price, count, order_type,
|
|
2930
|
+
status, filled_count, avg_fill_price, fee, action, timestamp, created_at
|
|
2931
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
2932
|
+
trade.oddsUserId,
|
|
2933
|
+
trade.orderId,
|
|
2934
|
+
trade.marketId,
|
|
2935
|
+
trade.ticker,
|
|
2936
|
+
trade.side,
|
|
2937
|
+
trade.price,
|
|
2938
|
+
trade.count,
|
|
2939
|
+
trade.orderType,
|
|
2940
|
+
trade.status || 'open',
|
|
2941
|
+
trade.filledCount || 0,
|
|
2942
|
+
trade.avgFillPrice || trade.price,
|
|
2943
|
+
trade.fee || 0,
|
|
2944
|
+
trade.action || null,
|
|
2945
|
+
trade.timestamp.getTime(),
|
|
2946
|
+
Date.now(),
|
|
2947
|
+
]);
|
|
2948
|
+
},
|
|
2949
|
+
getKalshiTrades(userId, options = {}) {
|
|
2950
|
+
const params = [userId];
|
|
2951
|
+
let sql = 'SELECT * FROM kalshi_trades WHERE user_id = ?';
|
|
2952
|
+
if (options.marketId) {
|
|
2953
|
+
sql += ' AND market_id = ?';
|
|
2954
|
+
params.push(options.marketId);
|
|
2955
|
+
}
|
|
2956
|
+
if (options.ticker) {
|
|
2957
|
+
sql += ' AND ticker = ?';
|
|
2958
|
+
params.push(options.ticker);
|
|
2959
|
+
}
|
|
2960
|
+
if (options.since) {
|
|
2961
|
+
sql += ' AND timestamp >= ?';
|
|
2962
|
+
params.push(options.since);
|
|
2963
|
+
}
|
|
2964
|
+
sql += ' ORDER BY timestamp DESC';
|
|
2965
|
+
if (options.limit) {
|
|
2966
|
+
sql += ' LIMIT ?';
|
|
2967
|
+
params.push(options.limit);
|
|
2968
|
+
}
|
|
2969
|
+
const rows = getAll(sql, params);
|
|
2970
|
+
return rows.map((row) => ({
|
|
2971
|
+
id: row.id,
|
|
2972
|
+
oddsUserId: row.user_id,
|
|
2973
|
+
orderId: row.order_id,
|
|
2974
|
+
marketId: row.market_id,
|
|
2975
|
+
ticker: row.ticker,
|
|
2976
|
+
side: row.side,
|
|
2977
|
+
price: row.price,
|
|
2978
|
+
count: row.count,
|
|
2979
|
+
orderType: row.order_type,
|
|
2980
|
+
status: row.status,
|
|
2981
|
+
filledCount: row.filled_count,
|
|
2982
|
+
avgFillPrice: row.avg_fill_price,
|
|
2983
|
+
fee: row.fee,
|
|
2984
|
+
action: row.action,
|
|
2985
|
+
timestamp: new Date(row.timestamp),
|
|
2986
|
+
createdAt: new Date(row.created_at),
|
|
2987
|
+
}));
|
|
2988
|
+
},
|
|
2989
|
+
// Drift trades
|
|
2990
|
+
logDriftTrade(trade) {
|
|
2991
|
+
run(`INSERT INTO drift_trades (
|
|
2992
|
+
user_id, order_id, market_index, market_type, direction, base_amount, quote_amount,
|
|
2993
|
+
price, order_type, status, filled_amount, avg_fill_price, leverage, tx_sig, timestamp, created_at
|
|
2994
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
2995
|
+
trade.oddsUserId,
|
|
2996
|
+
trade.orderId || null,
|
|
2997
|
+
trade.marketIndex,
|
|
2998
|
+
trade.marketType,
|
|
2999
|
+
trade.direction,
|
|
3000
|
+
trade.baseAmount,
|
|
3001
|
+
trade.quoteAmount || null,
|
|
3002
|
+
trade.price || null,
|
|
3003
|
+
trade.orderType,
|
|
3004
|
+
trade.status || 'open',
|
|
3005
|
+
trade.filledAmount || 0,
|
|
3006
|
+
trade.avgFillPrice || trade.price || null,
|
|
3007
|
+
trade.leverage || null,
|
|
3008
|
+
trade.txSig || null,
|
|
3009
|
+
trade.timestamp.getTime(),
|
|
3010
|
+
Date.now(),
|
|
3011
|
+
]);
|
|
3012
|
+
},
|
|
3013
|
+
getDriftTrades(userId, options = {}) {
|
|
3014
|
+
const params = [userId];
|
|
3015
|
+
let sql = 'SELECT * FROM drift_trades WHERE user_id = ?';
|
|
3016
|
+
if (options.marketIndex !== undefined) {
|
|
3017
|
+
sql += ' AND market_index = ?';
|
|
3018
|
+
params.push(options.marketIndex);
|
|
3019
|
+
}
|
|
3020
|
+
if (options.marketType) {
|
|
3021
|
+
sql += ' AND market_type = ?';
|
|
3022
|
+
params.push(options.marketType);
|
|
3023
|
+
}
|
|
3024
|
+
if (options.since) {
|
|
3025
|
+
sql += ' AND timestamp >= ?';
|
|
3026
|
+
params.push(options.since);
|
|
3027
|
+
}
|
|
3028
|
+
sql += ' ORDER BY timestamp DESC';
|
|
3029
|
+
if (options.limit) {
|
|
3030
|
+
sql += ' LIMIT ?';
|
|
3031
|
+
params.push(options.limit);
|
|
3032
|
+
}
|
|
3033
|
+
const rows = getAll(sql, params);
|
|
3034
|
+
return rows.map((row) => ({
|
|
3035
|
+
id: row.id,
|
|
3036
|
+
oddsUserId: row.user_id,
|
|
3037
|
+
orderId: row.order_id,
|
|
3038
|
+
marketIndex: row.market_index,
|
|
3039
|
+
marketType: row.market_type,
|
|
3040
|
+
direction: row.direction,
|
|
3041
|
+
baseAmount: row.base_amount,
|
|
3042
|
+
quoteAmount: row.quote_amount,
|
|
3043
|
+
price: row.price,
|
|
3044
|
+
orderType: row.order_type,
|
|
3045
|
+
status: row.status,
|
|
3046
|
+
filledAmount: row.filled_amount,
|
|
3047
|
+
avgFillPrice: row.avg_fill_price,
|
|
3048
|
+
leverage: row.leverage,
|
|
3049
|
+
txSig: row.tx_sig,
|
|
3050
|
+
timestamp: new Date(row.timestamp),
|
|
3051
|
+
createdAt: new Date(row.created_at),
|
|
3052
|
+
}));
|
|
3053
|
+
},
|
|
3054
|
+
// Manifold trades
|
|
3055
|
+
logManifoldTrade(trade) {
|
|
3056
|
+
run(`INSERT INTO manifold_trades (
|
|
3057
|
+
user_id, bet_id, contract_id, outcome, amount, shares,
|
|
3058
|
+
probability_before, probability_after, status, fee, timestamp, created_at
|
|
3059
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
3060
|
+
trade.oddsUserId,
|
|
3061
|
+
trade.betId,
|
|
3062
|
+
trade.contractId,
|
|
3063
|
+
trade.outcome,
|
|
3064
|
+
trade.amount,
|
|
3065
|
+
trade.shares,
|
|
3066
|
+
trade.probabilityBefore || null,
|
|
3067
|
+
trade.probabilityAfter || null,
|
|
3068
|
+
trade.status || 'filled',
|
|
3069
|
+
trade.fee || 0,
|
|
3070
|
+
trade.timestamp.getTime(),
|
|
3071
|
+
Date.now(),
|
|
3072
|
+
]);
|
|
3073
|
+
},
|
|
3074
|
+
getManifoldTrades(userId, options = {}) {
|
|
3075
|
+
const params = [userId];
|
|
3076
|
+
let sql = 'SELECT * FROM manifold_trades WHERE user_id = ?';
|
|
3077
|
+
if (options.contractId) {
|
|
3078
|
+
sql += ' AND contract_id = ?';
|
|
3079
|
+
params.push(options.contractId);
|
|
3080
|
+
}
|
|
3081
|
+
if (options.since) {
|
|
3082
|
+
sql += ' AND timestamp >= ?';
|
|
3083
|
+
params.push(options.since);
|
|
3084
|
+
}
|
|
3085
|
+
sql += ' ORDER BY timestamp DESC';
|
|
3086
|
+
if (options.limit) {
|
|
3087
|
+
sql += ' LIMIT ?';
|
|
3088
|
+
params.push(options.limit);
|
|
3089
|
+
}
|
|
3090
|
+
const rows = getAll(sql, params);
|
|
3091
|
+
return rows.map((row) => ({
|
|
3092
|
+
id: row.id,
|
|
3093
|
+
oddsUserId: row.user_id,
|
|
3094
|
+
betId: row.bet_id,
|
|
3095
|
+
contractId: row.contract_id,
|
|
3096
|
+
outcome: row.outcome,
|
|
3097
|
+
amount: row.amount,
|
|
3098
|
+
shares: row.shares,
|
|
3099
|
+
probabilityBefore: row.probability_before,
|
|
3100
|
+
probabilityAfter: row.probability_after,
|
|
3101
|
+
status: row.status,
|
|
3102
|
+
fee: row.fee,
|
|
3103
|
+
timestamp: new Date(row.timestamp),
|
|
3104
|
+
createdAt: new Date(row.created_at),
|
|
3105
|
+
}));
|
|
3106
|
+
},
|
|
3107
|
+
// Solana DEX trades
|
|
3108
|
+
logSolanaDexTrade(trade) {
|
|
3109
|
+
run(`INSERT INTO solana_dex_trades (
|
|
3110
|
+
user_id, tx_sig, dex, input_mint, output_mint, input_amount, output_amount,
|
|
3111
|
+
input_symbol, output_symbol, price_impact, slippage, fee, route, timestamp, created_at
|
|
3112
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
3113
|
+
trade.oddsUserId,
|
|
3114
|
+
trade.txSig,
|
|
3115
|
+
trade.dex,
|
|
3116
|
+
trade.inputMint,
|
|
3117
|
+
trade.outputMint,
|
|
3118
|
+
trade.inputAmount,
|
|
3119
|
+
trade.outputAmount,
|
|
3120
|
+
trade.inputSymbol || null,
|
|
3121
|
+
trade.outputSymbol || null,
|
|
3122
|
+
trade.priceImpact || null,
|
|
3123
|
+
trade.slippage || null,
|
|
3124
|
+
trade.fee || 0,
|
|
3125
|
+
trade.route || null,
|
|
3126
|
+
trade.timestamp.getTime(),
|
|
3127
|
+
Date.now(),
|
|
3128
|
+
]);
|
|
3129
|
+
},
|
|
3130
|
+
getSolanaDexTrades(userId, options = {}) {
|
|
3131
|
+
const params = [userId];
|
|
3132
|
+
let sql = 'SELECT * FROM solana_dex_trades WHERE user_id = ?';
|
|
3133
|
+
if (options.dex) {
|
|
3134
|
+
sql += ' AND dex = ?';
|
|
3135
|
+
params.push(options.dex);
|
|
3136
|
+
}
|
|
3137
|
+
if (options.since) {
|
|
3138
|
+
sql += ' AND timestamp >= ?';
|
|
3139
|
+
params.push(options.since);
|
|
3140
|
+
}
|
|
3141
|
+
sql += ' ORDER BY timestamp DESC';
|
|
3142
|
+
if (options.limit) {
|
|
3143
|
+
sql += ' LIMIT ?';
|
|
3144
|
+
params.push(options.limit);
|
|
3145
|
+
}
|
|
3146
|
+
const rows = getAll(sql, params);
|
|
3147
|
+
return rows.map((row) => ({
|
|
3148
|
+
id: row.id,
|
|
3149
|
+
oddsUserId: row.user_id,
|
|
3150
|
+
txSig: row.tx_sig,
|
|
3151
|
+
dex: row.dex,
|
|
3152
|
+
inputMint: row.input_mint,
|
|
3153
|
+
outputMint: row.output_mint,
|
|
3154
|
+
inputAmount: row.input_amount,
|
|
3155
|
+
outputAmount: row.output_amount,
|
|
3156
|
+
inputSymbol: row.input_symbol,
|
|
3157
|
+
outputSymbol: row.output_symbol,
|
|
3158
|
+
priceImpact: row.price_impact,
|
|
3159
|
+
slippage: row.slippage,
|
|
3160
|
+
fee: row.fee,
|
|
3161
|
+
route: row.route,
|
|
3162
|
+
timestamp: new Date(row.timestamp),
|
|
3163
|
+
createdAt: new Date(row.created_at),
|
|
3164
|
+
}));
|
|
3165
|
+
},
|
|
3166
|
+
// EVM swap trades
|
|
3167
|
+
logEvmSwapTrade(trade) {
|
|
3168
|
+
run(`INSERT INTO evm_swap_trades (
|
|
3169
|
+
user_id, tx_hash, chain_id, dex, token_in, token_out, amount_in, amount_out,
|
|
3170
|
+
token_in_symbol, token_out_symbol, price_impact, slippage, gas_used, gas_price, timestamp, created_at
|
|
3171
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
3172
|
+
trade.oddsUserId,
|
|
3173
|
+
trade.txHash,
|
|
3174
|
+
trade.chainId,
|
|
3175
|
+
trade.dex,
|
|
3176
|
+
trade.tokenIn,
|
|
3177
|
+
trade.tokenOut,
|
|
3178
|
+
trade.amountIn,
|
|
3179
|
+
trade.amountOut,
|
|
3180
|
+
trade.tokenInSymbol || null,
|
|
3181
|
+
trade.tokenOutSymbol || null,
|
|
3182
|
+
trade.priceImpact || null,
|
|
3183
|
+
trade.slippage || null,
|
|
3184
|
+
trade.gasUsed || null,
|
|
3185
|
+
trade.gasPrice || null,
|
|
3186
|
+
trade.timestamp.getTime(),
|
|
3187
|
+
Date.now(),
|
|
3188
|
+
]);
|
|
3189
|
+
},
|
|
3190
|
+
getEvmSwapTrades(userId, options = {}) {
|
|
3191
|
+
const params = [userId];
|
|
3192
|
+
let sql = 'SELECT * FROM evm_swap_trades WHERE user_id = ?';
|
|
3193
|
+
if (options.chainId !== undefined) {
|
|
3194
|
+
sql += ' AND chain_id = ?';
|
|
3195
|
+
params.push(options.chainId);
|
|
3196
|
+
}
|
|
3197
|
+
if (options.dex) {
|
|
3198
|
+
sql += ' AND dex = ?';
|
|
3199
|
+
params.push(options.dex);
|
|
3200
|
+
}
|
|
3201
|
+
if (options.since) {
|
|
3202
|
+
sql += ' AND timestamp >= ?';
|
|
3203
|
+
params.push(options.since);
|
|
3204
|
+
}
|
|
3205
|
+
sql += ' ORDER BY timestamp DESC';
|
|
3206
|
+
if (options.limit) {
|
|
3207
|
+
sql += ' LIMIT ?';
|
|
3208
|
+
params.push(options.limit);
|
|
3209
|
+
}
|
|
3210
|
+
const rows = getAll(sql, params);
|
|
3211
|
+
return rows.map((row) => ({
|
|
3212
|
+
id: row.id,
|
|
3213
|
+
oddsUserId: row.user_id,
|
|
3214
|
+
txHash: row.tx_hash,
|
|
3215
|
+
chainId: row.chain_id,
|
|
3216
|
+
dex: row.dex,
|
|
3217
|
+
tokenIn: row.token_in,
|
|
3218
|
+
tokenOut: row.token_out,
|
|
3219
|
+
amountIn: row.amount_in,
|
|
3220
|
+
amountOut: row.amount_out,
|
|
3221
|
+
tokenInSymbol: row.token_in_symbol,
|
|
3222
|
+
tokenOutSymbol: row.token_out_symbol,
|
|
3223
|
+
priceImpact: row.price_impact,
|
|
3224
|
+
slippage: row.slippage,
|
|
3225
|
+
gasUsed: row.gas_used,
|
|
3226
|
+
gasPrice: row.gas_price,
|
|
3227
|
+
timestamp: new Date(row.timestamp),
|
|
3228
|
+
createdAt: new Date(row.created_at),
|
|
3229
|
+
}));
|
|
3230
|
+
},
|
|
3231
|
+
// Jupiter swaps
|
|
3232
|
+
logJupiterSwap(swap) {
|
|
3233
|
+
run(`INSERT OR REPLACE INTO jupiter_swaps (
|
|
3234
|
+
user_id, tx_sig, input_mint, output_mint, input_amount, output_amount,
|
|
3235
|
+
input_symbol, output_symbol, price_impact_pct, slippage_bps, route_plan,
|
|
3236
|
+
num_hops, priority_fee, timestamp, created_at
|
|
3237
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
3238
|
+
swap.oddsUserId, swap.txSig, swap.inputMint, swap.outputMint,
|
|
3239
|
+
swap.inputAmount, swap.outputAmount, swap.inputSymbol || null,
|
|
3240
|
+
swap.outputSymbol || null, swap.priceImpactPct || null,
|
|
3241
|
+
swap.slippageBps || null, swap.routePlan || null, swap.numHops || null,
|
|
3242
|
+
swap.priorityFee || null, swap.timestamp.getTime(), Date.now(),
|
|
3243
|
+
]);
|
|
3244
|
+
},
|
|
3245
|
+
getJupiterSwaps(userId, limit = 50) {
|
|
3246
|
+
const rows = getAll('SELECT * FROM jupiter_swaps WHERE user_id = ? ORDER BY timestamp DESC LIMIT ?', [userId, limit]);
|
|
3247
|
+
return rows.map((r) => ({
|
|
3248
|
+
id: r.id,
|
|
3249
|
+
oddsUserId: r.user_id,
|
|
3250
|
+
txSig: r.tx_sig,
|
|
3251
|
+
inputMint: r.input_mint,
|
|
3252
|
+
outputMint: r.output_mint,
|
|
3253
|
+
inputAmount: r.input_amount,
|
|
3254
|
+
outputAmount: r.output_amount,
|
|
3255
|
+
inputSymbol: r.input_symbol,
|
|
3256
|
+
outputSymbol: r.output_symbol,
|
|
3257
|
+
priceImpactPct: r.price_impact_pct,
|
|
3258
|
+
slippageBps: r.slippage_bps,
|
|
3259
|
+
routePlan: r.route_plan,
|
|
3260
|
+
numHops: r.num_hops,
|
|
3261
|
+
priorityFee: r.priority_fee,
|
|
3262
|
+
timestamp: new Date(r.timestamp),
|
|
3263
|
+
createdAt: new Date(r.created_at),
|
|
3264
|
+
}));
|
|
3265
|
+
},
|
|
3266
|
+
// Drift positions
|
|
3267
|
+
upsertDriftPosition(position) {
|
|
3268
|
+
run(`INSERT OR REPLACE INTO drift_positions (
|
|
3269
|
+
user_id, market_index, market_type, base_asset_amount, quote_asset_amount,
|
|
3270
|
+
entry_price, unrealized_pnl, liquidation_price, leverage, updated_at
|
|
3271
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
3272
|
+
position.oddsUserId, position.marketIndex, position.marketType,
|
|
3273
|
+
position.baseAssetAmount, position.quoteAssetAmount || null,
|
|
3274
|
+
position.entryPrice || null, position.unrealizedPnl || null,
|
|
3275
|
+
position.liquidationPrice || null, position.leverage || null, Date.now(),
|
|
3276
|
+
]);
|
|
3277
|
+
},
|
|
3278
|
+
getDriftPositions(userId) {
|
|
3279
|
+
const rows = getAll('SELECT * FROM drift_positions WHERE user_id = ? ORDER BY market_index', [userId]);
|
|
3280
|
+
return rows.map((r) => ({
|
|
3281
|
+
id: r.id,
|
|
3282
|
+
oddsUserId: r.user_id,
|
|
3283
|
+
marketIndex: r.market_index,
|
|
3284
|
+
marketType: r.market_type,
|
|
3285
|
+
baseAssetAmount: r.base_asset_amount,
|
|
3286
|
+
quoteAssetAmount: r.quote_asset_amount,
|
|
3287
|
+
entryPrice: r.entry_price,
|
|
3288
|
+
unrealizedPnl: r.unrealized_pnl,
|
|
3289
|
+
liquidationPrice: r.liquidation_price,
|
|
3290
|
+
leverage: r.leverage,
|
|
3291
|
+
updatedAt: new Date(r.updated_at),
|
|
3292
|
+
}));
|
|
3293
|
+
},
|
|
3294
|
+
// Pump.fun tokens
|
|
3295
|
+
upsertPumpToken(token) {
|
|
3296
|
+
run(`INSERT OR REPLACE INTO pump_tokens (
|
|
3297
|
+
mint, name, symbol, creator, bonding_curve, market_cap,
|
|
3298
|
+
virtual_sol_reserves, virtual_token_reserves, total_supply,
|
|
3299
|
+
holder_count, is_graduated, created_at, updated_at
|
|
3300
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
3301
|
+
token.mint, token.name || null, token.symbol || null, token.creator || null,
|
|
3302
|
+
token.bondingCurve || null, token.marketCap || null,
|
|
3303
|
+
token.virtualSolReserves || null, token.virtualTokenReserves || null,
|
|
3304
|
+
token.totalSupply || null, token.holderCount || null,
|
|
3305
|
+
token.isGraduated ? 1 : 0, token.createdAt.getTime(), Date.now(),
|
|
3306
|
+
]);
|
|
3307
|
+
},
|
|
3308
|
+
getPumpToken(mint) {
|
|
3309
|
+
const row = getOne('SELECT * FROM pump_tokens WHERE mint = ?', [mint]);
|
|
3310
|
+
if (!row)
|
|
3311
|
+
return null;
|
|
3312
|
+
return {
|
|
3313
|
+
id: row.id,
|
|
3314
|
+
mint: row.mint,
|
|
3315
|
+
name: row.name,
|
|
3316
|
+
symbol: row.symbol,
|
|
3317
|
+
creator: row.creator,
|
|
3318
|
+
bondingCurve: row.bonding_curve,
|
|
3319
|
+
marketCap: row.market_cap,
|
|
3320
|
+
virtualSolReserves: row.virtual_sol_reserves,
|
|
3321
|
+
virtualTokenReserves: row.virtual_token_reserves,
|
|
3322
|
+
totalSupply: row.total_supply,
|
|
3323
|
+
holderCount: row.holder_count,
|
|
3324
|
+
isGraduated: row.is_graduated === 1,
|
|
3325
|
+
createdAt: new Date(row.created_at),
|
|
3326
|
+
updatedAt: new Date(row.updated_at),
|
|
3327
|
+
};
|
|
3328
|
+
},
|
|
3329
|
+
// Raw SQL access
|
|
3330
|
+
run,
|
|
3331
|
+
query,
|
|
3332
|
+
async withConnection(fn) {
|
|
3333
|
+
return fn(dbInstance);
|
|
3334
|
+
},
|
|
3335
|
+
};
|
|
3336
|
+
dbInstance = instance;
|
|
3337
|
+
const backupConfig = getBackupConfig();
|
|
3338
|
+
if (backupConfig.enabled && !backupInterval) {
|
|
3339
|
+
ensureBackupDir();
|
|
3340
|
+
backupInterval = setInterval(() => {
|
|
3341
|
+
try {
|
|
3342
|
+
createBackup();
|
|
3343
|
+
}
|
|
3344
|
+
catch (error) {
|
|
3345
|
+
logger_1.logger.warn({ error }, 'Database backup failed');
|
|
3346
|
+
}
|
|
3347
|
+
}, backupConfig.intervalMs);
|
|
3348
|
+
}
|
|
3349
|
+
return instance;
|
|
3350
|
+
})();
|
|
3351
|
+
return dbInitPromise;
|
|
3352
|
+
}
|
|
3353
|
+
// Sync wrapper for backwards compatibility
|
|
3354
|
+
function createDatabase() {
|
|
3355
|
+
// Return a proxy that initializes lazily
|
|
3356
|
+
let initialized = false;
|
|
3357
|
+
let db;
|
|
3358
|
+
const lazyInit = async () => {
|
|
3359
|
+
if (!initialized) {
|
|
3360
|
+
db = await initDatabase();
|
|
3361
|
+
initialized = true;
|
|
3362
|
+
}
|
|
3363
|
+
return db;
|
|
3364
|
+
};
|
|
3365
|
+
// Start initialization immediately
|
|
3366
|
+
const initPromise = lazyInit();
|
|
3367
|
+
// Return proxy that waits for initialization
|
|
3368
|
+
return new Proxy({}, {
|
|
3369
|
+
get(_target, prop) {
|
|
3370
|
+
if (prop === 'then')
|
|
3371
|
+
return undefined; // Not a promise
|
|
3372
|
+
return (...args) => {
|
|
3373
|
+
if (initialized && db) {
|
|
3374
|
+
return db[prop](...args);
|
|
3375
|
+
}
|
|
3376
|
+
// If not initialized yet, wait
|
|
3377
|
+
return initPromise.then((d) => d[prop](...args));
|
|
3378
|
+
};
|
|
3379
|
+
},
|
|
3380
|
+
});
|
|
3381
|
+
}
|
|
3382
|
+
//# sourceMappingURL=index.js.map
|